@tpitre/story-ui 4.3.0 → 4.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,1440 @@
1
+ /**
2
+ * StoryUIPanel CSS - ShadCN-Inspired Design
3
+ *
4
+ * A clean, minimal interface inspired by ShadCN UI and Google Gemini.
5
+ * Self-contained CSS with no external dependencies.
6
+ * Supports both light mode (default) and dark mode.
7
+ */
8
+
9
+ /* ============================================
10
+ CSS Custom Properties (ShadCN-style tokens)
11
+ ============================================ */
12
+ .sui-root {
13
+ /* Font System */
14
+ --font-sans: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
15
+ --font-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, Consolas, monospace;
16
+
17
+ /* Base Colors - Light Mode */
18
+ --background: 0 0% 100%;
19
+ --foreground: 240 10% 3.9%;
20
+ --card: 0 0% 100%;
21
+ --card-foreground: 240 10% 3.9%;
22
+ --popover: 0 0% 100%;
23
+ --popover-foreground: 240 10% 3.9%;
24
+ --primary: 240 5.9% 10%;
25
+ --primary-foreground: 0 0% 98%;
26
+ --secondary: 240 4.8% 95.9%;
27
+ --secondary-foreground: 240 5.9% 10%;
28
+ --muted: 240 4.8% 95.9%;
29
+ --muted-foreground: 240 3.8% 46.1%;
30
+ --accent: 240 4.8% 95.9%;
31
+ --accent-foreground: 240 5.9% 10%;
32
+ --destructive: 0 84.2% 60.2%;
33
+ --destructive-foreground: 0 0% 98%;
34
+ --border: 240 5.9% 90%;
35
+ --input: 240 5.9% 90%;
36
+ --ring: 240 5.9% 10%;
37
+
38
+ /* User Bubble - Light bluish-gray tint */
39
+ --user-bubble-bg: 210 35% 95%;
40
+ --user-bubble-fg: 240 10% 3.9%;
41
+ --user-bubble-border: 210 25% 88%;
42
+
43
+ /* AI Bubble - Pure white */
44
+ --ai-bubble-bg: 0 0% 100%;
45
+ --ai-bubble-fg: 240 10% 3.9%;
46
+ --ai-bubble-border: 0 0% 90%;
47
+
48
+ /* Semantic Colors */
49
+ --success: 142 76% 36%;
50
+ --success-foreground: 0 0% 100%;
51
+ --warning: 38 92% 50%;
52
+ --warning-foreground: 0 0% 0%;
53
+ --info: 221 83% 53%;
54
+ --info-foreground: 0 0% 100%;
55
+
56
+ /* Radius */
57
+ --radius-sm: 0.375rem;
58
+ --radius-md: 0.5rem;
59
+ --radius-lg: 0.75rem;
60
+ --radius-xl: 1rem;
61
+ --radius-2xl: 1.5rem;
62
+ --radius-full: 9999px;
63
+
64
+ /* Spacing */
65
+ --space-0: 0;
66
+ --space-1: 0.25rem;
67
+ --space-2: 0.5rem;
68
+ --space-3: 0.75rem;
69
+ --space-4: 1rem;
70
+ --space-5: 1.25rem;
71
+ --space-6: 1.5rem;
72
+ --space-8: 2rem;
73
+ --space-10: 2.5rem;
74
+ --space-12: 3rem;
75
+ --space-16: 4rem;
76
+
77
+ /* Shadows */
78
+ --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05);
79
+ --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
80
+ --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
81
+
82
+ /* Transitions */
83
+ --transition-fast: 150ms cubic-bezier(0.4, 0, 0.2, 1);
84
+ --transition-normal: 200ms cubic-bezier(0.4, 0, 0.2, 1);
85
+ --transition-slow: 300ms cubic-bezier(0.4, 0, 0.2, 1);
86
+
87
+ /* Layout */
88
+ --sidebar-width: 280px;
89
+ --header-height: 56px;
90
+ --input-height: 52px;
91
+ --max-chat-width: 768px;
92
+ }
93
+
94
+ /* Dark Mode - Using softer dark tones instead of pure black */
95
+ .sui-root.dark {
96
+ --background: 222 47% 11%;
97
+ --foreground: 210 40% 98%;
98
+ --card: 222 47% 11%;
99
+ --card-foreground: 210 40% 98%;
100
+ --popover: 222 47% 11%;
101
+ --popover-foreground: 210 40% 98%;
102
+ --primary: 210 40% 98%;
103
+ --primary-foreground: 222 47% 11%;
104
+ --secondary: 217 33% 17%;
105
+ --secondary-foreground: 210 40% 98%;
106
+ --muted: 217 33% 17%;
107
+ --muted-foreground: 215 20% 75%;
108
+ --accent: 217 33% 17%;
109
+ --accent-foreground: 210 40% 98%;
110
+ --destructive: 0 72% 51%;
111
+ --destructive-foreground: 0 0% 100%;
112
+ --border: 217 33% 22%;
113
+ --input: 217 33% 22%;
114
+ --ring: 213 94% 68%;
115
+
116
+ /* User Bubble - Light bluish-gray tint (same in dark mode for chat consistency) */
117
+ --user-bubble-bg: 210 35% 95%;
118
+ --user-bubble-fg: 240 10% 3.9%;
119
+ --user-bubble-border: 210 25% 88%;
120
+
121
+ /* AI Bubble - Pure white (same in dark mode for chat consistency) */
122
+ --ai-bubble-bg: 0 0% 100%;
123
+ --ai-bubble-fg: 240 10% 3.9%;
124
+ --ai-bubble-border: 0 0% 90%;
125
+
126
+ --success: 142 69% 58%;
127
+ --warning: 48 96% 53%;
128
+ --info: 217 91% 60%;
129
+ }
130
+
131
+ /* Dark mode fallback using system preference when .dark class not applied */
132
+ @media (prefers-color-scheme: dark) {
133
+ .sui-root:not(.light) {
134
+ --background: 222 47% 11%;
135
+ --foreground: 210 40% 98%;
136
+ --card: 222 47% 11%;
137
+ --card-foreground: 210 40% 98%;
138
+ --popover: 222 47% 11%;
139
+ --popover-foreground: 210 40% 98%;
140
+ --primary: 210 40% 98%;
141
+ --primary-foreground: 222 47% 11%;
142
+ --secondary: 217 33% 17%;
143
+ --secondary-foreground: 210 40% 98%;
144
+ --muted: 217 33% 17%;
145
+ --muted-foreground: 215 20% 75%;
146
+ --accent: 217 33% 17%;
147
+ --accent-foreground: 210 40% 98%;
148
+ --destructive: 0 72% 51%;
149
+ --destructive-foreground: 0 0% 100%;
150
+ --border: 217 33% 22%;
151
+ --input: 217 33% 22%;
152
+ --ring: 213 94% 68%;
153
+
154
+ /* User Bubble - Light bluish-gray tint (same in dark mode for chat consistency) */
155
+ --user-bubble-bg: 210 35% 95%;
156
+ --user-bubble-fg: 240 10% 3.9%;
157
+ --user-bubble-border: 210 25% 88%;
158
+
159
+ /* AI Bubble - Pure white (same in dark mode for chat consistency) */
160
+ --ai-bubble-bg: 0 0% 100%;
161
+ --ai-bubble-fg: 240 10% 3.9%;
162
+ --ai-bubble-border: 0 0% 90%;
163
+
164
+ --success: 142 69% 58%;
165
+ --warning: 48 96% 53%;
166
+ --info: 217 91% 60%;
167
+ }
168
+ }
169
+
170
+ /* ============================================
171
+ Base Reset
172
+ ============================================ */
173
+ .sui-root,
174
+ .sui-root *,
175
+ .sui-root *::before,
176
+ .sui-root *::after {
177
+ box-sizing: border-box;
178
+ margin: 0;
179
+ padding: 0;
180
+ }
181
+
182
+ .sui-root {
183
+ font-family: var(--font-sans);
184
+ font-size: 14px;
185
+ line-height: 1.5;
186
+ color: hsl(var(--foreground));
187
+ background-color: hsl(var(--background));
188
+ -webkit-font-smoothing: antialiased;
189
+ -moz-osx-font-smoothing: grayscale;
190
+ height: 100%;
191
+ width: 100%;
192
+ display: flex;
193
+ }
194
+
195
+ /* ============================================
196
+ Layout Structure
197
+ ============================================ */
198
+
199
+ /* Sidebar */
200
+ .sui-sidebar {
201
+ width: var(--sidebar-width);
202
+ background: hsl(var(--card));
203
+ border-right: 1px solid hsl(var(--border));
204
+ display: flex;
205
+ flex-direction: column;
206
+ flex-shrink: 0;
207
+ transition: width var(--transition-normal), opacity var(--transition-normal);
208
+ overflow: hidden;
209
+ }
210
+
211
+ .sui-sidebar.collapsed {
212
+ width: 56px;
213
+ border-right: 1px solid hsl(var(--border));
214
+ }
215
+
216
+ .sui-sidebar-header {
217
+ padding: var(--space-4);
218
+ border-bottom: 1px solid hsl(var(--border));
219
+ }
220
+
221
+ .sui-sidebar-content {
222
+ flex: 1;
223
+ display: flex;
224
+ flex-direction: column;
225
+ overflow: hidden;
226
+ padding: var(--space-3);
227
+ }
228
+
229
+ /* Sidebar chat list - flex grow to fill space */
230
+ .sui-sidebar-chats {
231
+ flex: 1;
232
+ overflow-y: auto;
233
+ margin-bottom: var(--space-4);
234
+ }
235
+
236
+ /* Context Menu */
237
+ .sui-context-menu {
238
+ position: absolute;
239
+ top: 100%;
240
+ right: 0;
241
+ z-index: 50;
242
+ min-width: 140px;
243
+ padding: var(--space-1);
244
+ background: hsl(var(--card));
245
+ border: 1px solid hsl(var(--border));
246
+ border-radius: var(--radius-md);
247
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
248
+ }
249
+
250
+ .sui-context-menu-item {
251
+ display: flex;
252
+ align-items: center;
253
+ gap: var(--space-2);
254
+ width: 100%;
255
+ padding: var(--space-2) var(--space-3);
256
+ border: none;
257
+ background: transparent;
258
+ color: hsl(var(--foreground));
259
+ font-size: 0.8125rem;
260
+ cursor: pointer;
261
+ border-radius: var(--radius-sm);
262
+ transition: all var(--transition-fast);
263
+ }
264
+
265
+ .sui-context-menu-item:hover {
266
+ background: hsl(var(--accent));
267
+ }
268
+
269
+ .sui-context-menu-item-danger {
270
+ color: hsl(var(--destructive));
271
+ }
272
+
273
+ .sui-context-menu-item-danger:hover {
274
+ background: hsl(var(--destructive) / 0.1);
275
+ }
276
+
277
+ /* Rename input */
278
+ .sui-chat-item-rename {
279
+ display: flex;
280
+ align-items: center;
281
+ gap: var(--space-2);
282
+ width: 100%;
283
+ }
284
+
285
+ .sui-rename-input {
286
+ flex: 1;
287
+ padding: var(--space-1) var(--space-2);
288
+ border: 1px solid hsl(var(--border));
289
+ border-radius: var(--radius-sm);
290
+ background: hsl(var(--background));
291
+ color: hsl(var(--foreground));
292
+ font-size: 0.875rem;
293
+ outline: none;
294
+ }
295
+
296
+ .sui-rename-input:focus {
297
+ border-color: hsl(var(--ring));
298
+ }
299
+
300
+ /* Main Content */
301
+ .sui-main {
302
+ flex: 1;
303
+ display: flex;
304
+ flex-direction: column;
305
+ min-width: 0;
306
+ position: relative;
307
+ background: hsl(var(--background));
308
+ }
309
+
310
+ /* Header */
311
+ .sui-header {
312
+ height: var(--header-height);
313
+ padding: 0 var(--space-6);
314
+ display: flex;
315
+ align-items: center;
316
+ justify-content: space-between;
317
+ border-bottom: 1px solid hsl(var(--border));
318
+ background: hsl(var(--background));
319
+ flex-shrink: 0;
320
+ }
321
+
322
+ .sui-header-left {
323
+ display: flex;
324
+ align-items: center;
325
+ gap: var(--space-4);
326
+ }
327
+
328
+ .sui-header-right {
329
+ display: flex;
330
+ align-items: center;
331
+ gap: var(--space-3);
332
+ }
333
+
334
+ .sui-header-title {
335
+ font-size: 1rem;
336
+ font-weight: 600;
337
+ color: hsl(var(--foreground));
338
+ }
339
+
340
+ .sui-header-subtitle {
341
+ font-size: 0.875rem;
342
+ color: hsl(var(--muted-foreground));
343
+ }
344
+
345
+ /* Chat Area */
346
+ .sui-chat-area {
347
+ flex: 1;
348
+ overflow-y: auto;
349
+ display: flex;
350
+ flex-direction: column;
351
+ align-items: center;
352
+ width: 100%;
353
+ }
354
+
355
+ .sui-chat-messages {
356
+ flex: 1;
357
+ max-width: var(--max-chat-width);
358
+ width: 100%;
359
+ padding: var(--space-6);
360
+ display: flex;
361
+ flex-direction: column;
362
+ gap: var(--space-4);
363
+ }
364
+
365
+ /* Input Area */
366
+ .sui-input-area {
367
+ padding: var(--space-4) var(--space-6) var(--space-6);
368
+ background: linear-gradient(transparent, hsl(var(--background)) 20%);
369
+ display: flex;
370
+ justify-content: center;
371
+ align-items: center;
372
+ }
373
+
374
+ .sui-input-container {
375
+ max-width: var(--max-chat-width);
376
+ margin: 0 auto;
377
+ width: 100%;
378
+ }
379
+
380
+ /* ============================================
381
+ Button Component (Storybook-inspired)
382
+ ============================================ */
383
+ .sui-button {
384
+ display: inline-flex;
385
+ align-items: center;
386
+ justify-content: center;
387
+ gap: var(--space-2);
388
+ white-space: nowrap;
389
+ font-size: 0.8125rem;
390
+ font-weight: 500;
391
+ transition: all var(--transition-fast);
392
+ cursor: pointer;
393
+ border: none;
394
+ background: none;
395
+ outline: none;
396
+ }
397
+
398
+ .sui-button:focus-visible {
399
+ outline: 2px solid hsl(var(--ring));
400
+ outline-offset: 2px;
401
+ }
402
+
403
+ .sui-button:disabled {
404
+ pointer-events: none;
405
+ opacity: 0.5;
406
+ }
407
+
408
+ /* Button Variants - Storybook-style */
409
+ .sui-button-default {
410
+ background: hsl(var(--secondary));
411
+ color: hsl(var(--secondary-foreground));
412
+ border: 1px solid hsl(var(--border));
413
+ border-radius: var(--radius-md);
414
+ height: 2rem;
415
+ padding: 0 var(--space-3);
416
+ }
417
+
418
+ .sui-button-default:hover {
419
+ background: hsl(var(--accent));
420
+ border-color: hsl(var(--muted-foreground) / 0.3);
421
+ }
422
+
423
+ .sui-button-secondary {
424
+ background: hsl(var(--secondary));
425
+ color: hsl(var(--secondary-foreground));
426
+ border: 1px solid hsl(var(--border));
427
+ border-radius: var(--radius-md);
428
+ height: 2rem;
429
+ padding: 0 var(--space-3);
430
+ }
431
+
432
+ .sui-button-secondary:hover {
433
+ background: hsl(var(--accent));
434
+ }
435
+
436
+ .sui-button-ghost {
437
+ color: hsl(var(--foreground));
438
+ border-radius: var(--radius-md);
439
+ height: 2rem;
440
+ padding: 0 var(--space-3);
441
+ }
442
+
443
+ .sui-button-ghost:hover {
444
+ background: hsl(var(--accent));
445
+ color: hsl(var(--accent-foreground));
446
+ }
447
+
448
+ .sui-button-outline {
449
+ border: 1px solid hsl(var(--border));
450
+ background: transparent;
451
+ color: hsl(var(--foreground));
452
+ border-radius: var(--radius-md);
453
+ height: 2rem;
454
+ padding: 0 var(--space-3);
455
+ }
456
+
457
+ .sui-button-outline:hover {
458
+ background: hsl(var(--accent));
459
+ color: hsl(var(--accent-foreground));
460
+ }
461
+
462
+ .sui-button-destructive {
463
+ background: hsl(var(--destructive));
464
+ color: hsl(var(--destructive-foreground));
465
+ border-radius: var(--radius-md);
466
+ height: 2rem;
467
+ padding: 0 var(--space-3);
468
+ }
469
+
470
+ .sui-button-destructive:hover {
471
+ background: hsl(var(--destructive) / 0.9);
472
+ }
473
+
474
+ /* Button Sizes */
475
+ .sui-button-sm {
476
+ height: 1.75rem;
477
+ padding: 0 var(--space-2);
478
+ font-size: 0.75rem;
479
+ }
480
+
481
+ .sui-button-lg {
482
+ height: 2.25rem;
483
+ padding: 0 var(--space-4);
484
+ }
485
+
486
+ .sui-button-icon {
487
+ width: 2rem;
488
+ height: 2rem;
489
+ padding: 0;
490
+ }
491
+
492
+ .sui-button-icon.sui-button-sm {
493
+ width: 1.75rem;
494
+ height: 1.75rem;
495
+ }
496
+
497
+ /* ============================================
498
+ ShadCN-Style Input Component
499
+ ============================================ */
500
+ .sui-input {
501
+ display: flex;
502
+ height: 2.5rem;
503
+ width: 100%;
504
+ border-radius: var(--radius-md);
505
+ border: 1px solid hsl(var(--input));
506
+ background: hsl(var(--background));
507
+ padding: 0 var(--space-3);
508
+ font-size: 0.875rem;
509
+ color: hsl(var(--foreground));
510
+ transition: all var(--transition-fast);
511
+ }
512
+
513
+ .sui-input::placeholder {
514
+ color: hsl(var(--muted-foreground));
515
+ }
516
+
517
+ .sui-input:focus {
518
+ outline: none;
519
+ border-color: hsl(var(--ring));
520
+ box-shadow: 0 0 0 2px hsl(var(--ring) / 0.2);
521
+ }
522
+
523
+ .sui-input:disabled {
524
+ cursor: not-allowed;
525
+ opacity: 0.5;
526
+ }
527
+
528
+ /* ============================================
529
+ ShadCN-Style Select Component
530
+ ============================================ */
531
+ .sui-select {
532
+ position: relative;
533
+ display: inline-block;
534
+ }
535
+
536
+ .sui-select-trigger {
537
+ display: inline-flex;
538
+ align-items: center;
539
+ justify-content: space-between;
540
+ gap: var(--space-2);
541
+ height: 2.25rem;
542
+ padding: 0 var(--space-3);
543
+ border-radius: var(--radius-md);
544
+ border: 1px solid hsl(var(--input));
545
+ background: hsl(var(--background));
546
+ font-size: 0.875rem;
547
+ color: hsl(var(--foreground));
548
+ cursor: pointer;
549
+ transition: all var(--transition-fast);
550
+ min-width: 120px;
551
+ }
552
+
553
+ .sui-select-trigger:hover {
554
+ background: hsl(var(--accent));
555
+ }
556
+
557
+ .sui-select-trigger:focus {
558
+ outline: none;
559
+ border-color: hsl(var(--ring));
560
+ box-shadow: 0 0 0 2px hsl(var(--ring) / 0.2);
561
+ }
562
+
563
+ .sui-select-native {
564
+ position: absolute;
565
+ inset: 0;
566
+ opacity: 0;
567
+ cursor: pointer;
568
+ width: 100%;
569
+ height: 100%;
570
+ }
571
+
572
+ .sui-select-icon {
573
+ width: 1rem;
574
+ height: 1rem;
575
+ color: hsl(var(--muted-foreground));
576
+ flex-shrink: 0;
577
+ }
578
+
579
+ /* ============================================
580
+ ShadCN-Style Badge Component
581
+ ============================================ */
582
+ .sui-badge {
583
+ display: inline-flex;
584
+ align-items: center;
585
+ gap: var(--space-1);
586
+ padding: 0.125rem var(--space-2);
587
+ border-radius: var(--radius-full);
588
+ font-size: 0.75rem;
589
+ font-weight: 500;
590
+ transition: all var(--transition-fast);
591
+ }
592
+
593
+ .sui-badge-default {
594
+ background: hsl(var(--primary));
595
+ color: hsl(var(--primary-foreground));
596
+ }
597
+
598
+ .sui-badge-secondary {
599
+ background: hsl(var(--secondary));
600
+ color: hsl(var(--secondary-foreground));
601
+ }
602
+
603
+ .sui-badge-success {
604
+ background: hsl(var(--success) / 0.15);
605
+ color: hsl(var(--success));
606
+ }
607
+
608
+ .sui-badge-destructive {
609
+ background: hsl(var(--destructive) / 0.15);
610
+ color: hsl(var(--destructive));
611
+ }
612
+
613
+ /* Dark mode: make destructive badge more visible */
614
+ .sui-root.dark .sui-badge-destructive {
615
+ background: hsl(0 72% 25% / 0.4);
616
+ color: hsl(0 85% 70%);
617
+ }
618
+
619
+ .sui-badge-outline {
620
+ border: 1px solid hsl(var(--border));
621
+ background: transparent;
622
+ color: hsl(var(--foreground));
623
+ }
624
+
625
+ /* Status dot inside badge */
626
+ .sui-badge-dot {
627
+ width: 6px;
628
+ height: 6px;
629
+ border-radius: 50%;
630
+ background: currentColor;
631
+ }
632
+
633
+ /* ============================================
634
+ ShadCN-Style Card Component
635
+ ============================================ */
636
+ .sui-card {
637
+ border-radius: var(--radius-lg);
638
+ border: 1px solid hsl(var(--border));
639
+ background: hsl(var(--card));
640
+ color: hsl(var(--card-foreground));
641
+ }
642
+
643
+ .sui-card-header {
644
+ display: flex;
645
+ flex-direction: column;
646
+ gap: var(--space-1);
647
+ padding: var(--space-6);
648
+ }
649
+
650
+ .sui-card-title {
651
+ font-size: 1.125rem;
652
+ font-weight: 600;
653
+ line-height: 1;
654
+ }
655
+
656
+ .sui-card-description {
657
+ font-size: 0.875rem;
658
+ color: hsl(var(--muted-foreground));
659
+ }
660
+
661
+ .sui-card-content {
662
+ padding: 0 var(--space-6) var(--space-6);
663
+ }
664
+
665
+ .sui-card-footer {
666
+ display: flex;
667
+ align-items: center;
668
+ padding: var(--space-6);
669
+ border-top: 1px solid hsl(var(--border));
670
+ }
671
+
672
+ /* ============================================
673
+ Chat Item (Sidebar) - Gemini-style
674
+ ============================================ */
675
+ .sui-chat-item {
676
+ display: flex;
677
+ align-items: center;
678
+ justify-content: space-between;
679
+ padding: var(--space-2) var(--space-3);
680
+ border-radius: var(--radius-md);
681
+ cursor: pointer;
682
+ transition: all var(--transition-fast);
683
+ color: hsl(var(--foreground));
684
+ position: relative;
685
+ }
686
+
687
+ .sui-chat-item:hover {
688
+ background: hsl(var(--accent));
689
+ }
690
+
691
+ .sui-chat-item.active {
692
+ background: hsl(var(--accent));
693
+ }
694
+
695
+ .sui-chat-item.menu-open {
696
+ background: hsl(var(--accent));
697
+ }
698
+
699
+ .sui-chat-item-title {
700
+ flex: 1;
701
+ font-size: 0.875rem;
702
+ font-weight: 400;
703
+ white-space: nowrap;
704
+ overflow: hidden;
705
+ text-overflow: ellipsis;
706
+ min-width: 0;
707
+ }
708
+
709
+ .sui-chat-item-actions {
710
+ position: relative;
711
+ display: flex;
712
+ align-items: center;
713
+ flex-shrink: 0;
714
+ }
715
+
716
+ .sui-chat-item-menu {
717
+ opacity: 0;
718
+ padding: var(--space-1);
719
+ border-radius: var(--radius-sm);
720
+ color: hsl(var(--muted-foreground));
721
+ transition: all var(--transition-fast);
722
+ }
723
+
724
+ .sui-chat-item:hover .sui-chat-item-menu,
725
+ .sui-chat-item.menu-open .sui-chat-item-menu {
726
+ opacity: 1;
727
+ }
728
+
729
+ .sui-chat-item-menu:hover {
730
+ background: hsl(var(--muted) / 0.5);
731
+ color: hsl(var(--foreground));
732
+ }
733
+
734
+ /* ============================================
735
+ Welcome State (Gemini-inspired)
736
+ ============================================ */
737
+ .sui-welcome {
738
+ flex: 1;
739
+ display: flex;
740
+ flex-direction: column;
741
+ align-items: center;
742
+ justify-content: center;
743
+ text-align: center;
744
+ padding: var(--space-8);
745
+ }
746
+
747
+ .sui-welcome-greeting {
748
+ font-size: 1.75rem;
749
+ font-weight: 600;
750
+ color: hsl(var(--foreground));
751
+ margin-bottom: var(--space-3);
752
+ line-height: 1.3;
753
+ }
754
+
755
+ /* Dark mode: ensure greeting is clearly visible - WCAG AA compliant */
756
+ .sui-root.dark .sui-welcome-greeting {
757
+ color: #ffffff;
758
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
759
+ }
760
+
761
+ .sui-welcome-subtitle {
762
+ font-size: 1rem;
763
+ color: hsl(var(--muted-foreground));
764
+ margin-bottom: var(--space-8);
765
+ max-width: 400px;
766
+ }
767
+
768
+ /* Dark mode: make subtitle more visible */
769
+ .sui-root.dark .sui-welcome-subtitle {
770
+ color: hsl(210 25% 80%);
771
+ }
772
+
773
+ .sui-welcome-chips {
774
+ display: flex;
775
+ flex-wrap: wrap;
776
+ gap: var(--space-3);
777
+ justify-content: center;
778
+ max-width: 600px;
779
+ }
780
+
781
+ /* ============================================
782
+ Suggestion Chips (Simple pill style)
783
+ ============================================ */
784
+ .sui-chip {
785
+ display: inline-flex;
786
+ align-items: center;
787
+ justify-content: center;
788
+ padding: 0.5rem 1rem;
789
+ background: hsl(var(--secondary));
790
+ border: 1px solid hsl(var(--border));
791
+ border-radius: var(--radius-full);
792
+ font-size: 0.875rem;
793
+ font-weight: 500;
794
+ line-height: 1;
795
+ color: hsl(var(--foreground));
796
+ cursor: pointer;
797
+ transition: all var(--transition-fast);
798
+ }
799
+
800
+ .sui-chip:hover {
801
+ background: hsl(var(--accent));
802
+ border-color: hsl(var(--muted-foreground) / 0.3);
803
+ }
804
+
805
+ .sui-chip:active {
806
+ transform: scale(0.98);
807
+ }
808
+
809
+ /* ============================================
810
+ Messages
811
+ ============================================ */
812
+ .sui-message {
813
+ animation: sui-fade-in var(--transition-normal);
814
+ }
815
+
816
+ @keyframes sui-fade-in {
817
+ from {
818
+ opacity: 0;
819
+ transform: translateY(8px);
820
+ }
821
+ to {
822
+ opacity: 1;
823
+ transform: translateY(0);
824
+ }
825
+ }
826
+
827
+ .sui-message-user {
828
+ display: flex;
829
+ justify-content: flex-end;
830
+ }
831
+
832
+ .sui-message-ai {
833
+ display: flex;
834
+ justify-content: flex-start;
835
+ }
836
+
837
+ /* Base bubble styles - shared between user and AI */
838
+ .sui-message-bubble {
839
+ max-width: 85%;
840
+ padding: var(--space-3) var(--space-4);
841
+ border-radius: var(--radius-2xl);
842
+ font-size: 0.9375rem !important;
843
+ line-height: 1.5 !important;
844
+ border: 1px solid hsl(var(--border));
845
+ }
846
+
847
+ /* User bubble - light bluish-gray */
848
+ .sui-message-user .sui-message-bubble {
849
+ background: hsl(var(--user-bubble-bg));
850
+ color: hsl(var(--user-bubble-fg));
851
+ border-color: hsl(var(--user-bubble-border));
852
+ border-bottom-right-radius: var(--radius-sm);
853
+ }
854
+
855
+ /* AI bubble - pure white */
856
+ .sui-message-ai .sui-message-bubble {
857
+ background: hsl(var(--ai-bubble-bg));
858
+ color: hsl(var(--ai-bubble-fg));
859
+ border-color: hsl(var(--ai-bubble-border));
860
+ border-bottom-left-radius: var(--radius-sm);
861
+ }
862
+
863
+ /*
864
+ * Markdown content styling
865
+ * Using .sui-message-bubble prefix for higher specificity (0,2,x)
866
+ * to beat Storybook's .css-xxx :where(p) selectors (0,1,x)
867
+ */
868
+ .sui-message-bubble .sui-markdown {
869
+ font-size: 0.9375rem;
870
+ line-height: 1.5;
871
+ font-family: var(--font-sans);
872
+ }
873
+
874
+ /* Paragraph styling - higher specificity beats Storybook */
875
+ .sui-message-bubble .sui-markdown p {
876
+ font-size: 0.9375rem;
877
+ line-height: 1.5;
878
+ margin: 0;
879
+ padding: 6px 0 4px 0;
880
+ }
881
+
882
+ .sui-message-bubble .sui-markdown p:first-child {
883
+ padding-top: 0;
884
+ }
885
+
886
+ .sui-message-bubble .sui-markdown p:last-child {
887
+ padding-bottom: 0;
888
+ }
889
+
890
+ .sui-message-bubble strong {
891
+ font-weight: 600;
892
+ }
893
+
894
+ .sui-message-bubble em {
895
+ font-style: italic;
896
+ }
897
+
898
+ /* Inline code styling */
899
+ .sui-message-bubble code {
900
+ font-family: var(--font-mono);
901
+ font-size: 0.875rem;
902
+ background: hsl(var(--muted) / 0.5);
903
+ padding: 0.1em 0.35em;
904
+ border-radius: var(--radius-sm);
905
+ }
906
+
907
+ .sui-message-ai .sui-message-bubble code {
908
+ background: hsl(var(--ai-bubble-border) / 0.5);
909
+ }
910
+
911
+ .sui-message-images {
912
+ display: flex;
913
+ gap: var(--space-2);
914
+ margin-top: var(--space-2);
915
+ flex-wrap: wrap;
916
+ }
917
+
918
+ .sui-message-image {
919
+ max-width: 200px;
920
+ max-height: 150px;
921
+ border-radius: var(--radius-lg);
922
+ object-fit: cover;
923
+ }
924
+
925
+ /* ============================================
926
+ Input Form (Gemini-style pill)
927
+ ============================================ */
928
+ .sui-input-form {
929
+ display: flex;
930
+ align-items: center;
931
+ gap: var(--space-2);
932
+ background: hsl(var(--card));
933
+ border: 1px solid hsl(var(--border));
934
+ border-radius: var(--radius-2xl);
935
+ padding: 8px;
936
+ min-height: 56px;
937
+ transition: all var(--transition-fast);
938
+ }
939
+
940
+ .sui-input-form:focus-within {
941
+ border-color: hsl(var(--ring));
942
+ box-shadow: 0 0 0 2px hsl(var(--ring) / 0.2);
943
+ }
944
+
945
+ .sui-input-form-upload {
946
+ width: 40px;
947
+ height: 40px;
948
+ border-radius: var(--radius-full);
949
+ display: flex;
950
+ align-items: center;
951
+ justify-content: center;
952
+ color: hsl(var(--muted-foreground));
953
+ flex-shrink: 0;
954
+ border: 1px solid hsl(var(--border) / 0.5);
955
+ background: none;
956
+ cursor: pointer;
957
+ transition: all var(--transition-fast);
958
+ }
959
+
960
+ .sui-input-form-upload:hover:not(:disabled) {
961
+ background: hsl(var(--accent));
962
+ color: hsl(var(--foreground));
963
+ }
964
+
965
+ .sui-input-form-upload:disabled {
966
+ opacity: 0.5;
967
+ cursor: not-allowed;
968
+ }
969
+
970
+ .sui-input-form-field {
971
+ flex: 1;
972
+ border: none;
973
+ background: transparent;
974
+ color: hsl(var(--foreground));
975
+ font-size: 0.9375rem;
976
+ padding: 0 var(--space-3);
977
+ height: 40px;
978
+ min-width: 0;
979
+ resize: none;
980
+ outline: none;
981
+ /* Input type="text" auto-centers text vertically */
982
+ }
983
+
984
+ .sui-input-form-field::placeholder {
985
+ color: hsl(var(--muted-foreground));
986
+ }
987
+
988
+ .sui-input-form-send {
989
+ width: 40px;
990
+ height: 40px;
991
+ border-radius: var(--radius-full);
992
+ display: flex;
993
+ align-items: center;
994
+ justify-content: center;
995
+ background: hsl(var(--primary));
996
+ color: hsl(var(--primary-foreground));
997
+ flex-shrink: 0;
998
+ border: none;
999
+ cursor: pointer;
1000
+ transition: all var(--transition-fast);
1001
+ }
1002
+
1003
+ .sui-input-form-send:hover:not(:disabled) {
1004
+ opacity: 0.9;
1005
+ transform: scale(1.05);
1006
+ }
1007
+
1008
+ .sui-input-form-send:disabled {
1009
+ background: hsl(var(--muted));
1010
+ color: hsl(var(--muted-foreground));
1011
+ cursor: not-allowed;
1012
+ transform: none;
1013
+ }
1014
+
1015
+ /* ============================================
1016
+ Image Previews
1017
+ ============================================ */
1018
+ .sui-image-previews {
1019
+ display: flex;
1020
+ align-items: center;
1021
+ gap: var(--space-2);
1022
+ padding: var(--space-2) var(--space-3);
1023
+ margin-bottom: var(--space-2);
1024
+ flex-wrap: wrap;
1025
+ }
1026
+
1027
+ .sui-image-preview-label {
1028
+ display: flex;
1029
+ align-items: center;
1030
+ gap: var(--space-1);
1031
+ font-size: 0.8125rem;
1032
+ color: hsl(var(--muted-foreground));
1033
+ }
1034
+
1035
+ .sui-image-preview-item {
1036
+ position: relative;
1037
+ }
1038
+
1039
+ .sui-image-preview-thumb {
1040
+ width: 48px;
1041
+ height: 48px;
1042
+ object-fit: cover;
1043
+ border-radius: var(--radius-md);
1044
+ border: 1px solid hsl(var(--border));
1045
+ }
1046
+
1047
+ .sui-image-preview-remove {
1048
+ position: absolute;
1049
+ top: -6px;
1050
+ right: -6px;
1051
+ width: 18px;
1052
+ height: 18px;
1053
+ border-radius: var(--radius-full);
1054
+ background: hsl(var(--destructive));
1055
+ color: hsl(var(--destructive-foreground));
1056
+ display: flex;
1057
+ align-items: center;
1058
+ justify-content: center;
1059
+ font-size: 10px;
1060
+ border: none;
1061
+ cursor: pointer;
1062
+ }
1063
+
1064
+ /* ============================================
1065
+ Progress Indicator
1066
+ ============================================ */
1067
+ .sui-progress {
1068
+ background: hsl(var(--muted));
1069
+ border-radius: var(--radius-2xl);
1070
+ padding: var(--space-4);
1071
+ }
1072
+
1073
+ .sui-progress-header {
1074
+ display: flex;
1075
+ align-items: center;
1076
+ justify-content: space-between;
1077
+ margin-bottom: var(--space-2);
1078
+ }
1079
+
1080
+ .sui-progress-label {
1081
+ font-weight: 500;
1082
+ font-size: 0.875rem;
1083
+ color: hsl(var(--foreground));
1084
+ }
1085
+
1086
+ .sui-progress-step {
1087
+ font-size: 0.75rem;
1088
+ color: hsl(var(--muted-foreground));
1089
+ }
1090
+
1091
+ .sui-progress-bar {
1092
+ height: 4px;
1093
+ background: hsl(var(--secondary));
1094
+ border-radius: var(--radius-full);
1095
+ overflow: hidden;
1096
+ }
1097
+
1098
+ .sui-progress-fill {
1099
+ height: 100%;
1100
+ background: linear-gradient(90deg, hsl(var(--info)), hsl(285 70% 50%));
1101
+ border-radius: var(--radius-full);
1102
+ transition: width var(--transition-normal);
1103
+ }
1104
+
1105
+ .sui-progress-retry {
1106
+ margin-top: var(--space-2);
1107
+ padding: var(--space-1) var(--space-2);
1108
+ background: hsl(var(--warning) / 0.15);
1109
+ color: hsl(var(--warning));
1110
+ border-radius: var(--radius-md);
1111
+ font-size: 0.75rem;
1112
+ display: inline-block;
1113
+ }
1114
+
1115
+ /* ============================================
1116
+ Drop Overlay
1117
+ ============================================ */
1118
+ .sui-drop-overlay {
1119
+ position: absolute;
1120
+ inset: 0;
1121
+ background: hsl(var(--info) / 0.1);
1122
+ border: 2px dashed hsl(var(--info));
1123
+ border-radius: var(--radius-lg);
1124
+ display: flex;
1125
+ align-items: center;
1126
+ justify-content: center;
1127
+ z-index: 100;
1128
+ backdrop-filter: blur(4px);
1129
+ }
1130
+
1131
+ .sui-drop-overlay-text {
1132
+ display: flex;
1133
+ flex-direction: column;
1134
+ align-items: center;
1135
+ gap: var(--space-2);
1136
+ color: hsl(var(--info));
1137
+ font-weight: 500;
1138
+ }
1139
+
1140
+ /* ============================================
1141
+ Error Message
1142
+ ============================================ */
1143
+ .sui-error {
1144
+ background: hsl(var(--destructive) / 0.15);
1145
+ color: hsl(var(--destructive));
1146
+ padding: var(--space-3) var(--space-4);
1147
+ border-radius: var(--radius-lg);
1148
+ font-size: 0.875rem;
1149
+ }
1150
+
1151
+ /* ============================================
1152
+ Completion Card - shares bubble styling with message bubbles
1153
+ ============================================ */
1154
+ .sui-completion {
1155
+ max-width: 85%;
1156
+ padding: var(--space-3) var(--space-4);
1157
+ border-radius: var(--radius-2xl);
1158
+ border-bottom-left-radius: var(--radius-sm);
1159
+ font-size: 0.9375rem;
1160
+ line-height: 1.6;
1161
+ border: 1px solid hsl(var(--border));
1162
+ background: hsl(var(--card));
1163
+ color: hsl(var(--foreground));
1164
+ }
1165
+
1166
+ .sui-completion-header {
1167
+ display: flex;
1168
+ align-items: center;
1169
+ gap: var(--space-2);
1170
+ font-weight: 500;
1171
+ color: hsl(var(--success));
1172
+ }
1173
+
1174
+ .sui-completion-components {
1175
+ display: flex;
1176
+ flex-wrap: wrap;
1177
+ gap: var(--space-1);
1178
+ margin-top: var(--space-2);
1179
+ }
1180
+
1181
+ .sui-completion-tag {
1182
+ padding: 0.125rem var(--space-2);
1183
+ background: hsl(var(--info) / 0.15);
1184
+ color: hsl(var(--info));
1185
+ border-radius: var(--radius-full);
1186
+ font-size: 0.75rem;
1187
+ font-family: var(--font-mono);
1188
+ }
1189
+
1190
+ .sui-completion-metrics {
1191
+ display: flex;
1192
+ gap: var(--space-4);
1193
+ margin-top: var(--space-3);
1194
+ font-size: 0.8125rem;
1195
+ color: hsl(var(--muted-foreground));
1196
+ }
1197
+
1198
+ /* ============================================
1199
+ Checkbox
1200
+ ============================================ */
1201
+ .sui-checkbox {
1202
+ width: 1rem;
1203
+ height: 1rem;
1204
+ accent-color: hsl(var(--primary));
1205
+ cursor: pointer;
1206
+ }
1207
+
1208
+ /* ============================================
1209
+ Loading Animation
1210
+ ============================================ */
1211
+ .sui-loading::after {
1212
+ content: '';
1213
+ animation: sui-dots 1.5s infinite;
1214
+ }
1215
+
1216
+ @keyframes sui-dots {
1217
+ 0%, 20% { content: '.'; }
1218
+ 40% { content: '..'; }
1219
+ 60%, 100% { content: '...'; }
1220
+ }
1221
+
1222
+ /* ============================================
1223
+ Markdown Content
1224
+ ============================================ */
1225
+ .sui-markdown strong {
1226
+ font-weight: 600;
1227
+ }
1228
+
1229
+ .sui-markdown em {
1230
+ font-style: italic;
1231
+ }
1232
+
1233
+ .sui-markdown code {
1234
+ font-family: var(--font-mono);
1235
+ font-size: 0.875em;
1236
+ background: hsl(var(--muted));
1237
+ padding: 0.125em 0.375em;
1238
+ border-radius: var(--radius-sm);
1239
+ }
1240
+
1241
+ .sui-markdown p {
1242
+ margin-bottom: var(--space-3);
1243
+ line-height: 1.6;
1244
+ }
1245
+
1246
+ .sui-markdown p:last-child {
1247
+ margin-bottom: 0;
1248
+ }
1249
+
1250
+ /* Headings */
1251
+ .sui-markdown h1,
1252
+ .sui-markdown h2,
1253
+ .sui-markdown h3,
1254
+ .sui-markdown h4,
1255
+ .sui-markdown h5,
1256
+ .sui-markdown h6 {
1257
+ font-weight: 600;
1258
+ margin-top: var(--space-4);
1259
+ margin-bottom: var(--space-3);
1260
+ line-height: 1.3;
1261
+ }
1262
+
1263
+ .sui-markdown h1:first-child,
1264
+ .sui-markdown h2:first-child,
1265
+ .sui-markdown h3:first-child {
1266
+ margin-top: 0;
1267
+ }
1268
+
1269
+ .sui-markdown h1 { font-size: 1.5em; }
1270
+ .sui-markdown h2 { font-size: 1.25em; }
1271
+ .sui-markdown h3 { font-size: 1.125em; }
1272
+ .sui-markdown h4 { font-size: 1em; }
1273
+
1274
+ /* Lists */
1275
+ .sui-markdown ul,
1276
+ .sui-markdown ol {
1277
+ margin-bottom: var(--space-3);
1278
+ padding-left: var(--space-5);
1279
+ line-height: 1.6;
1280
+ }
1281
+
1282
+ .sui-markdown ul {
1283
+ list-style-type: disc;
1284
+ }
1285
+
1286
+ .sui-markdown ol {
1287
+ list-style-type: decimal;
1288
+ }
1289
+
1290
+ .sui-markdown li {
1291
+ margin-bottom: var(--space-2);
1292
+ line-height: 1.6;
1293
+ }
1294
+
1295
+ .sui-markdown li:last-child {
1296
+ margin-bottom: 0;
1297
+ }
1298
+
1299
+ .sui-markdown li > ul,
1300
+ .sui-markdown li > ol {
1301
+ margin-top: var(--space-2);
1302
+ margin-bottom: 0;
1303
+ }
1304
+
1305
+ /* Code blocks */
1306
+ .sui-markdown pre {
1307
+ background: hsl(var(--muted));
1308
+ border: 1px solid hsl(var(--border));
1309
+ border-radius: var(--radius-md);
1310
+ padding: var(--space-3);
1311
+ margin-bottom: var(--space-3);
1312
+ overflow-x: auto;
1313
+ font-family: var(--font-mono);
1314
+ font-size: 0.875em;
1315
+ line-height: 1.5;
1316
+ }
1317
+
1318
+ .sui-markdown pre code {
1319
+ background: none;
1320
+ padding: 0;
1321
+ border-radius: 0;
1322
+ }
1323
+
1324
+ /* Blockquotes */
1325
+ .sui-markdown blockquote {
1326
+ border-left: 3px solid hsl(var(--primary));
1327
+ padding-left: var(--space-4);
1328
+ margin-left: 0;
1329
+ margin-bottom: var(--space-3);
1330
+ color: hsl(var(--muted-foreground));
1331
+ font-style: italic;
1332
+ }
1333
+
1334
+ /* Tables */
1335
+ .sui-markdown table {
1336
+ width: 100%;
1337
+ border-collapse: collapse;
1338
+ margin-bottom: var(--space-3);
1339
+ font-size: 0.875em;
1340
+ }
1341
+
1342
+ .sui-markdown th,
1343
+ .sui-markdown td {
1344
+ border: 1px solid hsl(var(--border));
1345
+ padding: var(--space-2) var(--space-3);
1346
+ text-align: left;
1347
+ }
1348
+
1349
+ .sui-markdown th {
1350
+ background: hsl(var(--muted));
1351
+ font-weight: 600;
1352
+ }
1353
+
1354
+ /* Horizontal rule */
1355
+ .sui-markdown hr {
1356
+ border: none;
1357
+ border-top: 1px solid hsl(var(--border));
1358
+ margin: var(--space-4) 0;
1359
+ }
1360
+
1361
+ /* Links */
1362
+ .sui-markdown a {
1363
+ color: hsl(var(--primary));
1364
+ text-decoration: underline;
1365
+ text-underline-offset: 2px;
1366
+ }
1367
+
1368
+ .sui-markdown a:hover {
1369
+ opacity: 0.8;
1370
+ }
1371
+
1372
+ /* Inline status icons */
1373
+ .sui-icon-inline {
1374
+ display: inline-flex;
1375
+ align-items: center;
1376
+ justify-content: center;
1377
+ vertical-align: middle;
1378
+ margin-right: 0.25rem;
1379
+ }
1380
+
1381
+ .sui-icon-success {
1382
+ color: hsl(var(--success));
1383
+ }
1384
+
1385
+ .sui-icon-error {
1386
+ color: hsl(var(--destructive));
1387
+ }
1388
+
1389
+ .sui-icon-tip {
1390
+ color: hsl(var(--warning));
1391
+ }
1392
+
1393
+ /* Dark mode: make warning/tip icon more visible */
1394
+ .sui-root.dark .sui-icon-tip {
1395
+ color: hsl(48 96% 65%);
1396
+ }
1397
+
1398
+ .sui-icon-wrench {
1399
+ color: hsl(var(--info));
1400
+ }
1401
+
1402
+ /* ============================================
1403
+ Scrollbar Styling
1404
+ ============================================ */
1405
+ .sui-root ::-webkit-scrollbar {
1406
+ width: 8px;
1407
+ height: 8px;
1408
+ }
1409
+
1410
+ .sui-root ::-webkit-scrollbar-track {
1411
+ background: transparent;
1412
+ }
1413
+
1414
+ .sui-root ::-webkit-scrollbar-thumb {
1415
+ background: hsl(var(--muted-foreground) / 0.3);
1416
+ border-radius: var(--radius-full);
1417
+ }
1418
+
1419
+ .sui-root ::-webkit-scrollbar-thumb:hover {
1420
+ background: hsl(var(--muted-foreground) / 0.5);
1421
+ }
1422
+
1423
+ /* ============================================
1424
+ Utility Classes
1425
+ ============================================ */
1426
+ .sui-sr-only {
1427
+ position: absolute;
1428
+ width: 1px;
1429
+ height: 1px;
1430
+ padding: 0;
1431
+ margin: -1px;
1432
+ overflow: hidden;
1433
+ clip: rect(0, 0, 0, 0);
1434
+ white-space: nowrap;
1435
+ border: 0;
1436
+ }
1437
+
1438
+ .sui-hidden {
1439
+ display: none;
1440
+ }