@tpitre/story-ui 4.4.1 → 4.5.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.
@@ -1,1440 +0,0 @@
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
- }