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