@floegence/floe-webapp-core 0.8.6 → 0.8.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (163) hide show
  1. package/dist/chat.css +1616 -0
  2. package/dist/components/chat/ChatContainer.d.ts +22 -0
  3. package/dist/components/chat/ChatProvider.d.ts +33 -0
  4. package/dist/components/chat/blocks/BlockRenderer.d.ts +8 -0
  5. package/dist/components/chat/blocks/ChecklistBlock.d.ts +9 -0
  6. package/dist/components/chat/blocks/CodeBlock.d.ts +8 -0
  7. package/dist/components/chat/blocks/CodeDiffBlock.d.ts +9 -0
  8. package/dist/components/chat/blocks/FileBlock.d.ts +9 -0
  9. package/dist/components/chat/blocks/ImageBlock.d.ts +7 -0
  10. package/dist/components/chat/blocks/MarkdownBlock.d.ts +6 -0
  11. package/dist/components/chat/blocks/MermaidBlock.d.ts +6 -0
  12. package/dist/components/chat/blocks/ShellBlock.d.ts +9 -0
  13. package/dist/components/chat/blocks/SvgBlock.d.ts +6 -0
  14. package/dist/components/chat/blocks/TextBlock.d.ts +6 -0
  15. package/dist/components/chat/blocks/ThinkingBlock.d.ts +7 -0
  16. package/dist/components/chat/blocks/ToolCallBlock.d.ts +9 -0
  17. package/dist/components/chat/blocks/index.d.ts +13 -0
  18. package/dist/components/chat/hooks/index.d.ts +5 -0
  19. package/dist/components/chat/hooks/useAttachments.d.ts +20 -0
  20. package/dist/components/chat/hooks/useAutoScroll.d.ts +17 -0
  21. package/dist/components/chat/hooks/useCodeHighlight.d.ts +21 -0
  22. package/dist/components/chat/hooks/useMermaid.d.ts +20 -0
  23. package/dist/components/chat/hooks/useVirtualList.d.ts +28 -0
  24. package/dist/components/chat/index.d.ts +9 -0
  25. package/dist/components/chat/input/AttachmentPreview.d.ts +8 -0
  26. package/dist/components/chat/input/ChatInput.d.ts +7 -0
  27. package/dist/components/chat/input/index.d.ts +2 -0
  28. package/dist/components/chat/message/MessageActions.d.ts +7 -0
  29. package/dist/components/chat/message/MessageAvatar.d.ts +8 -0
  30. package/dist/components/chat/message/MessageBubble.d.ts +7 -0
  31. package/dist/components/chat/message/MessageItem.d.ts +8 -0
  32. package/dist/components/chat/message/MessageMeta.d.ts +8 -0
  33. package/dist/components/chat/message/index.d.ts +5 -0
  34. package/dist/components/chat/message-list/SimpleMessageList.d.ts +9 -0
  35. package/dist/components/chat/message-list/VirtualMessageList.d.ts +5 -0
  36. package/dist/components/chat/message-list/index.d.ts +2 -0
  37. package/dist/components/chat/status/ConnectionStatus.d.ts +7 -0
  38. package/dist/components/chat/status/StreamingCursor.d.ts +5 -0
  39. package/dist/components/chat/status/WorkingIndicator.d.ts +6 -0
  40. package/dist/components/chat/status/index.d.ts +3 -0
  41. package/dist/components/chat/types.d.ts +181 -0
  42. package/dist/components/icons/index.d.ts +5 -0
  43. package/dist/components/index.d.ts +1 -0
  44. package/dist/floe.css +5 -3
  45. package/dist/index.js +329 -250
  46. package/dist/index10.js +2 -2
  47. package/dist/index100.js +11 -0
  48. package/dist/index101.js +64 -0
  49. package/dist/index102.js +8 -0
  50. package/dist/index103.js +14 -0
  51. package/dist/index104.js +29 -0
  52. package/dist/index105.js +35 -0
  53. package/dist/index106.js +94 -0
  54. package/dist/index107.js +30 -0
  55. package/dist/index108.js +49 -0
  56. package/dist/index109.js +17 -0
  57. package/dist/index11.js +4 -4
  58. package/dist/index110.js +38 -0
  59. package/dist/index111.js +67 -0
  60. package/dist/index112.js +87 -0
  61. package/dist/index113.js +17 -0
  62. package/dist/index114.js +2266 -0
  63. package/dist/index115.js +10 -0
  64. package/dist/index116.js +409 -0
  65. package/dist/index117.js +42 -0
  66. package/dist/index118.js +1125 -0
  67. package/dist/index119.js +33 -0
  68. package/dist/index12.js +5 -5
  69. package/dist/index120.js +134 -0
  70. package/dist/index13.js +2 -2
  71. package/dist/index14.js +4 -4
  72. package/dist/index15.js +4 -4
  73. package/dist/index16.js +4 -4
  74. package/dist/index17.js +3 -3
  75. package/dist/index18.js +5 -5
  76. package/dist/index19.js +2 -2
  77. package/dist/index2.js +6 -6
  78. package/dist/index20.js +1 -1
  79. package/dist/index21.js +1 -1
  80. package/dist/index22.js +3 -3
  81. package/dist/index23.js +2 -2
  82. package/dist/index24.js +2 -2
  83. package/dist/index25.js +1 -1
  84. package/dist/index26.js +4 -4
  85. package/dist/index27.js +1 -1
  86. package/dist/index28.js +2 -2
  87. package/dist/index29.js +3 -3
  88. package/dist/index3.js +2 -2
  89. package/dist/index30.js +3 -3
  90. package/dist/index31.js +1 -1
  91. package/dist/index32.js +1 -1
  92. package/dist/index33.js +1 -1
  93. package/dist/index34.js +206 -151
  94. package/dist/index4.js +1 -1
  95. package/dist/index40.js +1 -1
  96. package/dist/index41.js +2 -2
  97. package/dist/index42.js +2 -2
  98. package/dist/index43.js +64 -64
  99. package/dist/index44.js +2 -2
  100. package/dist/index45.js +2 -2
  101. package/dist/index46.js +1 -1
  102. package/dist/index47.js +1 -1
  103. package/dist/index49.js +87 -44
  104. package/dist/index5.js +3 -3
  105. package/dist/index50.js +294 -31
  106. package/dist/index51.js +9 -50
  107. package/dist/index52.js +122 -23
  108. package/dist/index53.js +80 -171
  109. package/dist/index54.js +48 -40
  110. package/dist/index55.js +42 -67
  111. package/dist/index56.js +42 -95
  112. package/dist/index57.js +33 -113
  113. package/dist/index58.js +47 -136
  114. package/dist/index59.js +278 -40
  115. package/dist/index6.js +2 -2
  116. package/dist/index60.js +9 -436
  117. package/dist/index61.js +58 -38
  118. package/dist/index62.js +77 -18
  119. package/dist/index63.js +172 -13
  120. package/dist/index64.js +122 -11
  121. package/dist/index65.js +18 -17
  122. package/dist/index66.js +117 -10
  123. package/dist/index67.js +23 -9
  124. package/dist/index68.js +30 -59
  125. package/dist/index69.js +29 -6
  126. package/dist/index7.js +2 -2
  127. package/dist/index70.js +28 -12
  128. package/dist/index71.js +121 -26
  129. package/dist/index72.js +74 -31
  130. package/dist/index73.js +63 -92
  131. package/dist/index74.js +9 -28
  132. package/dist/index75.js +9 -47
  133. package/dist/index76.js +46 -15
  134. package/dist/index77.js +101 -35
  135. package/dist/index78.js +70 -61
  136. package/dist/index79.js +70 -82
  137. package/dist/index8.js +2 -2
  138. package/dist/index80.js +33 -14
  139. package/dist/index81.js +85 -2252
  140. package/dist/index82.js +48 -7
  141. package/dist/index83.js +31 -399
  142. package/dist/index84.js +48 -38
  143. package/dist/index85.js +28 -0
  144. package/dist/index86.js +176 -0
  145. package/dist/index87.js +43 -0
  146. package/dist/index88.js +69 -0
  147. package/dist/index89.js +99 -0
  148. package/dist/index9.js +1 -1
  149. package/dist/index90.js +124 -0
  150. package/dist/index91.js +141 -0
  151. package/dist/index92.js +42 -0
  152. package/dist/index93.js +438 -0
  153. package/dist/index94.js +41 -0
  154. package/dist/index95.js +22 -0
  155. package/dist/index96.js +16 -0
  156. package/dist/index97.js +13 -0
  157. package/dist/index98.js +19 -0
  158. package/dist/index99.js +13 -0
  159. package/dist/styles.css +1 -1
  160. package/dist/tailwind.css +1 -0
  161. package/dist/themes/dark.css +24 -0
  162. package/dist/themes/light.css +24 -0
  163. package/package.json +5 -1
package/dist/chat.css ADDED
@@ -0,0 +1,1616 @@
1
+ /* ============================================
2
+ Chat Component Styles
3
+ ============================================
4
+
5
+ 样式系统设计原则:
6
+ 1. 所有样式放在 @layer components 中,确保在 Tailwind 层级系统中有明确的优先级
7
+ 2. 主题响应区域使用 CSS 变量(如 var(--foreground))
8
+ 3. 固定颜色区域(如代码块)使用硬编码颜色,并通过容器设置颜色隔离
9
+
10
+ 颜色隔离模式:
11
+ - 容器设置 background-color 和 color
12
+ - 子元素通过 color: inherit 继承容器颜色
13
+ - 这确保即使有全局样式,容器内的颜色也是一致的
14
+ */
15
+
16
+ @layer components {
17
+
18
+ /* ============================================
19
+ Container
20
+ ============================================ */
21
+
22
+ .chat-container {
23
+ display: flex;
24
+ flex-direction: column;
25
+ height: 100%;
26
+ background-color: var(--background);
27
+ }
28
+
29
+ .chat-header {
30
+ display: flex;
31
+ align-items: center;
32
+ justify-content: space-between;
33
+ padding: 0.75rem 1rem;
34
+ border-bottom: 1px solid var(--border);
35
+ background-color: var(--background);
36
+ }
37
+
38
+ .chat-header-title {
39
+ font-size: 1rem;
40
+ font-weight: 600;
41
+ color: var(--foreground);
42
+ }
43
+
44
+ .chat-container-messages {
45
+ flex: 1;
46
+ min-height: 0;
47
+ }
48
+
49
+ .chat-container-input {
50
+ border-top: 1px solid var(--border);
51
+ }
52
+
53
+ /* ============================================
54
+ Message List
55
+ ============================================ */
56
+
57
+ .chat-message-list-container {
58
+ position: relative;
59
+ height: 100%;
60
+ }
61
+
62
+ .chat-message-list-scroll {
63
+ height: 100%;
64
+ overflow-y: auto;
65
+ overflow-x: hidden;
66
+ scrollbar-width: thin;
67
+ }
68
+
69
+ .chat-message-list-inner {
70
+ width: 100%;
71
+ }
72
+
73
+ /* Simple (non-virtualized) message list */
74
+ .chat-message-list-simple {
75
+ display: flex;
76
+ flex-direction: column;
77
+ padding: 0.75rem 0;
78
+ }
79
+
80
+ .chat-message-list-item {
81
+ width: 100%;
82
+ padding: 0.75rem 1rem;
83
+ }
84
+
85
+ .chat-loading-more {
86
+ display: flex;
87
+ align-items: center;
88
+ justify-content: center;
89
+ gap: 0.5rem;
90
+ padding: 1rem;
91
+ font-size: 0.75rem;
92
+ color: var(--muted-foreground);
93
+ }
94
+
95
+ .chat-scroll-to-bottom-btn {
96
+ position: absolute;
97
+ bottom: 1rem;
98
+ right: 1rem;
99
+ padding: 0.5rem;
100
+ border-radius: 9999px;
101
+ background-color: var(--background);
102
+ border: 1px solid var(--border);
103
+ box-shadow: 0 2px 8px rgb(0 0 0 / 0.1);
104
+ cursor: pointer;
105
+ transition: all 150ms;
106
+ }
107
+
108
+ .chat-scroll-to-bottom-btn:hover {
109
+ background-color: var(--accent);
110
+ transform: translateY(-1px);
111
+ }
112
+
113
+ .chat-working-indicator-wrapper {
114
+ padding: 0.5rem 1rem;
115
+ }
116
+
117
+ /* ============================================
118
+ Message Item - Enhanced Visual Hierarchy
119
+ ============================================ */
120
+
121
+ .chat-message-item {
122
+ display: flex;
123
+ gap: 0.75rem;
124
+ max-width: 100%;
125
+ }
126
+
127
+ .chat-message-item-user {
128
+ flex-direction: row-reverse;
129
+ }
130
+
131
+ .chat-message-item-user .chat-message-content-wrapper {
132
+ align-items: flex-end;
133
+ }
134
+
135
+ .chat-message-content-wrapper {
136
+ display: flex;
137
+ flex-direction: column;
138
+ gap: 0.375rem;
139
+ max-width: 85%;
140
+ min-width: 0;
141
+ }
142
+
143
+ .chat-message-footer {
144
+ display: flex;
145
+ align-items: center;
146
+ gap: 0.5rem;
147
+ opacity: 0;
148
+ transition: opacity 150ms;
149
+ }
150
+
151
+ .chat-message-item:hover .chat-message-footer {
152
+ opacity: 1;
153
+ }
154
+
155
+ /* ============================================
156
+ Message Avatar - Refined
157
+ ============================================ */
158
+
159
+ .chat-message-avatar {
160
+ width: 2rem;
161
+ height: 2rem;
162
+ border-radius: 0.5rem;
163
+ display: flex;
164
+ align-items: center;
165
+ justify-content: center;
166
+ flex-shrink: 0;
167
+ font-size: 0.75rem;
168
+ font-weight: 600;
169
+ }
170
+
171
+ .chat-message-avatar-user {
172
+ background: linear-gradient(135deg, var(--primary) 0%, color-mix(in srgb, var(--primary) 80%, #000) 100%);
173
+ color: var(--primary-foreground);
174
+ }
175
+
176
+ .chat-message-avatar-assistant {
177
+ background: linear-gradient(135deg, var(--secondary) 0%, color-mix(in srgb, var(--secondary) 80%, #000) 100%);
178
+ color: var(--secondary-foreground);
179
+ border: 1px solid var(--border);
180
+ }
181
+
182
+ .chat-message-avatar-image {
183
+ width: 100%;
184
+ height: 100%;
185
+ border-radius: 0.5rem;
186
+ object-fit: cover;
187
+ }
188
+
189
+ .chat-message-avatar-fallback {
190
+ font-size: 0.625rem;
191
+ text-transform: uppercase;
192
+ letter-spacing: 0.05em;
193
+ }
194
+
195
+ /* ============================================
196
+ Message Bubble - Elegant Design
197
+ ============================================ */
198
+
199
+ .chat-message-bubble {
200
+ border-radius: 0.75rem;
201
+ font-size: 0.75rem;
202
+ line-height: 1.6;
203
+ overflow: hidden;
204
+ }
205
+
206
+ .chat-message-bubble-user {
207
+ background: linear-gradient(135deg, var(--primary) 0%, color-mix(in srgb, var(--primary) 85%, #000) 100%);
208
+ color: var(--primary-foreground);
209
+ padding: 0.75rem 1rem;
210
+ border-bottom-right-radius: 0.25rem;
211
+ }
212
+
213
+ .chat-message-bubble-assistant {
214
+ background-color: var(--card);
215
+ color: var(--card-foreground);
216
+ border: 1px solid var(--border);
217
+ padding: 0;
218
+ border-bottom-left-radius: 0.25rem;
219
+ }
220
+
221
+ /* Assistant bubble inner content needs padding per block */
222
+ .chat-message-bubble-assistant > * {
223
+ padding: 0.75rem 1rem;
224
+ }
225
+
226
+ .chat-message-bubble-assistant > *:not(:last-child) {
227
+ border-bottom: 1px solid color-mix(in srgb, var(--border) 50%, transparent);
228
+ }
229
+
230
+ .chat-message-bubble-error {
231
+ border-color: rgb(239 68 68 / 0.3);
232
+ background-color: rgb(239 68 68 / 0.05);
233
+ }
234
+
235
+ .chat-message-error {
236
+ display: flex;
237
+ align-items: center;
238
+ gap: 0.5rem;
239
+ margin-top: 0.5rem;
240
+ font-size: 0.75rem;
241
+ color: rgb(239 68 68);
242
+ }
243
+
244
+ /* ============================================
245
+ Message Meta & Actions
246
+ ============================================ */
247
+
248
+ .chat-message-meta {
249
+ display: flex;
250
+ align-items: center;
251
+ gap: 0.25rem;
252
+ font-size: 0.6875rem;
253
+ color: var(--muted-foreground);
254
+ }
255
+
256
+ .chat-message-actions {
257
+ display: flex;
258
+ align-items: center;
259
+ gap: 0.125rem;
260
+ }
261
+
262
+ .chat-message-action-btn {
263
+ padding: 0.25rem;
264
+ border-radius: 0.25rem;
265
+ color: var(--muted-foreground);
266
+ cursor: pointer;
267
+ transition: all 150ms;
268
+ border: none;
269
+ background: transparent;
270
+ }
271
+
272
+ .chat-message-action-btn:hover {
273
+ background-color: var(--accent);
274
+ color: var(--foreground);
275
+ }
276
+
277
+ /* ============================================
278
+ Text Block
279
+ ============================================ */
280
+
281
+ .chat-text-block {
282
+ font-size: 0.75rem;
283
+ line-height: 1.6;
284
+ white-space: pre-wrap;
285
+ word-break: break-word;
286
+ }
287
+
288
+ /* ============================================
289
+ Markdown Block - Rich Typography
290
+ ============================================ */
291
+
292
+ .chat-markdown-block {
293
+ font-size: 0.75rem;
294
+ line-height: 1.7;
295
+ }
296
+
297
+ .chat-markdown-block p {
298
+ margin-bottom: 0.75rem;
299
+ }
300
+
301
+ .chat-markdown-block p:last-child {
302
+ margin-bottom: 0;
303
+ }
304
+
305
+ .chat-markdown-block h1 {
306
+ font-size: 1rem;
307
+ font-weight: 700;
308
+ margin-top: 1.25rem;
309
+ margin-bottom: 0.625rem;
310
+ color: var(--foreground);
311
+ }
312
+
313
+ .chat-markdown-block h2 {
314
+ font-size: 0.875rem;
315
+ font-weight: 600;
316
+ margin-top: 1rem;
317
+ margin-bottom: 0.5rem;
318
+ color: var(--foreground);
319
+ }
320
+
321
+ .chat-markdown-block h3 {
322
+ font-size: 0.8125rem;
323
+ font-weight: 600;
324
+ margin-top: 0.875rem;
325
+ margin-bottom: 0.375rem;
326
+ color: var(--foreground);
327
+ }
328
+
329
+ .chat-markdown-block h1:first-child,
330
+ .chat-markdown-block h2:first-child,
331
+ .chat-markdown-block h3:first-child {
332
+ margin-top: 0;
333
+ }
334
+
335
+ .chat-markdown-block ul,
336
+ .chat-markdown-block ol {
337
+ padding-left: 1.25rem;
338
+ margin-bottom: 0.75rem;
339
+ }
340
+
341
+ .chat-markdown-block li {
342
+ margin-bottom: 0.375rem;
343
+ }
344
+
345
+ .chat-markdown-block li::marker {
346
+ color: var(--muted-foreground);
347
+ }
348
+
349
+ .chat-md-inline-code {
350
+ padding: 0.125rem 0.375rem;
351
+ border-radius: 0.25rem;
352
+ background-color: color-mix(in srgb, var(--muted) 70%, transparent);
353
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
354
+ font-size: 0.6875rem;
355
+ color: var(--primary);
356
+ }
357
+
358
+ /* Markdown 代码块 - 始终深色背景
359
+ 使用 pre.chat-md-code-block 选择器确保足够的特异性 */
360
+ pre.chat-md-code-block {
361
+ margin: 0.75rem 0;
362
+ border-radius: 0.5rem;
363
+ overflow: hidden;
364
+ background-color: #0d1117;
365
+ color: #e6edf3;
366
+ border: 1px solid #30363d;
367
+ }
368
+
369
+ pre.chat-md-code-block * {
370
+ color: inherit;
371
+ }
372
+
373
+ pre.chat-md-code-block code {
374
+ display: block;
375
+ padding: 0.875rem 1rem;
376
+ font-size: 0.6875rem;
377
+ line-height: 1.5;
378
+ overflow-x: auto;
379
+ color: #e6edf3;
380
+ background-color: transparent;
381
+ }
382
+
383
+ .chat-md-link {
384
+ color: var(--primary);
385
+ text-decoration: none;
386
+ border-bottom: 1px solid color-mix(in srgb, var(--primary) 30%, transparent);
387
+ transition: border-color 150ms;
388
+ }
389
+
390
+ .chat-md-link:hover {
391
+ border-bottom-color: var(--primary);
392
+ }
393
+
394
+ .chat-md-image {
395
+ max-width: 100%;
396
+ border-radius: 0.5rem;
397
+ margin-top: 0.5rem;
398
+ }
399
+
400
+ .chat-md-blockquote {
401
+ border-left: 3px solid var(--primary);
402
+ padding-left: 1rem;
403
+ margin: 0.75rem 0;
404
+ color: var(--muted-foreground);
405
+ font-style: italic;
406
+ background-color: color-mix(in srgb, var(--muted) 30%, transparent);
407
+ padding: 0.75rem 1rem;
408
+ border-radius: 0 0.375rem 0.375rem 0;
409
+ }
410
+
411
+ .chat-markdown-block table {
412
+ width: 100%;
413
+ border-collapse: collapse;
414
+ font-size: 0.6875rem;
415
+ margin: 0.75rem 0;
416
+ }
417
+
418
+ .chat-markdown-block th,
419
+ .chat-markdown-block td {
420
+ border: 1px solid var(--border);
421
+ padding: 0.5rem 0.75rem;
422
+ text-align: left;
423
+ }
424
+
425
+ .chat-markdown-block th {
426
+ background-color: var(--muted);
427
+ font-weight: 600;
428
+ }
429
+
430
+ .chat-markdown-block tr:nth-child(even) td {
431
+ background-color: color-mix(in srgb, var(--muted) 30%, transparent);
432
+ }
433
+
434
+ /* ============================================
435
+ Code Block - Professional Look
436
+ ============================================ */
437
+
438
+ /* Code Block - 始终深色背景 */
439
+ .chat-code-block {
440
+ border-radius: 0.5rem;
441
+ overflow: hidden;
442
+ border: 1px solid #30363d;
443
+ margin: 0.5rem 0;
444
+ background-color: #0d1117;
445
+ color: #e6edf3;
446
+ }
447
+
448
+ .chat-code-block * {
449
+ color: inherit;
450
+ }
451
+
452
+ .chat-code-header {
453
+ display: flex;
454
+ align-items: center;
455
+ justify-content: space-between;
456
+ padding: 0.5rem 0.875rem;
457
+ background-color: #161b22;
458
+ border-bottom: 1px solid #30363d;
459
+ }
460
+
461
+ .chat-code-info {
462
+ display: flex;
463
+ align-items: center;
464
+ gap: 0.5rem;
465
+ }
466
+
467
+ .chat-code-filename {
468
+ font-size: 0.75rem;
469
+ font-weight: 500;
470
+ color: #e6edf3;
471
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
472
+ }
473
+
474
+ .chat-code-language {
475
+ font-size: 0.6875rem;
476
+ color: #8b949e;
477
+ text-transform: uppercase;
478
+ letter-spacing: 0.05em;
479
+ }
480
+
481
+ .chat-code-copy-btn {
482
+ padding: 0.375rem;
483
+ border-radius: 0.375rem;
484
+ color: #8b949e;
485
+ cursor: pointer;
486
+ transition: all 150ms;
487
+ border: none;
488
+ background: transparent;
489
+ }
490
+
491
+ .chat-code-copy-btn:hover {
492
+ background-color: #30363d;
493
+ color: #e6edf3;
494
+ }
495
+
496
+ .chat-code-content {
497
+ overflow-x: auto;
498
+ color: #e6edf3;
499
+ background-color: #0d1117;
500
+ }
501
+
502
+ .chat-code-content pre {
503
+ margin: 0 !important;
504
+ padding: 0.875rem 1rem !important;
505
+ background: transparent !important;
506
+ color: #e6edf3 !important;
507
+ }
508
+
509
+ .chat-code-content code {
510
+ font-size: 0.6875rem;
511
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
512
+ line-height: 1.5;
513
+ color: #e6edf3;
514
+ }
515
+
516
+ .chat-code-content code * {
517
+ color: inherit;
518
+ }
519
+
520
+ .chat-code-pre {
521
+ padding: 0.875rem 1rem;
522
+ background-color: #0d1117;
523
+ font-size: 0.6875rem;
524
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
525
+ overflow-x: auto;
526
+ color: #e6edf3;
527
+ }
528
+
529
+ /* ============================================
530
+ Code Diff Block - Clear Visual Diff
531
+ 始终深色背景
532
+ ============================================ */
533
+
534
+ .chat-code-diff-block {
535
+ border-radius: 0.5rem;
536
+ overflow: hidden;
537
+ border: 1px solid #30363d;
538
+ margin: 0.5rem 0;
539
+ background-color: #0d1117;
540
+ color: #e6edf3;
541
+ }
542
+
543
+ .chat-code-diff-block * {
544
+ color: inherit;
545
+ }
546
+
547
+ .chat-code-diff-header {
548
+ display: flex;
549
+ align-items: center;
550
+ justify-content: space-between;
551
+ padding: 0.5rem 0.875rem;
552
+ background-color: #161b22;
553
+ border-bottom: 1px solid #30363d;
554
+ }
555
+
556
+ .chat-code-diff-info {
557
+ display: flex;
558
+ align-items: center;
559
+ gap: 1rem;
560
+ }
561
+
562
+ .chat-code-diff-filename {
563
+ font-size: 0.75rem;
564
+ font-weight: 500;
565
+ color: #e6edf3;
566
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
567
+ }
568
+
569
+ .chat-code-diff-stats {
570
+ font-size: 0.75rem;
571
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
572
+ color: #e6edf3;
573
+ }
574
+
575
+ .chat-code-diff-stats span {
576
+ color: inherit;
577
+ }
578
+
579
+ .chat-code-diff-actions {
580
+ display: flex;
581
+ align-items: center;
582
+ gap: 0.5rem;
583
+ }
584
+
585
+ .chat-code-diff-view-toggle {
586
+ display: flex;
587
+ border-radius: 0.375rem;
588
+ overflow: hidden;
589
+ border: 1px solid #30363d;
590
+ }
591
+
592
+ .chat-code-diff-view-btn {
593
+ padding: 0.25rem 0.625rem;
594
+ font-size: 0.6875rem;
595
+ cursor: pointer;
596
+ border: none;
597
+ background: transparent;
598
+ color: #8b949e;
599
+ transition: all 150ms;
600
+ }
601
+
602
+ .chat-code-diff-view-btn:hover {
603
+ background-color: #30363d;
604
+ color: #e6edf3;
605
+ }
606
+
607
+ .chat-code-diff-view-btn.active {
608
+ background-color: #30363d;
609
+ color: #e6edf3;
610
+ }
611
+
612
+ .chat-code-diff-content {
613
+ overflow-x: auto;
614
+ font-size: 0.6875rem;
615
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
616
+ line-height: 1.5;
617
+ color: #e6edf3;
618
+ background-color: #0d1117;
619
+ }
620
+
621
+ .chat-diff-unified,
622
+ .chat-diff-split {
623
+ min-width: 100%;
624
+ color: #e6edf3;
625
+ }
626
+
627
+ .chat-diff-split {
628
+ display: flex;
629
+ }
630
+
631
+ .chat-diff-split-side {
632
+ flex: 1;
633
+ border-right: 1px solid #30363d;
634
+ }
635
+
636
+ .chat-diff-split-side:last-child {
637
+ border-right: none;
638
+ }
639
+
640
+ .chat-diff-line {
641
+ display: flex;
642
+ color: #e6edf3;
643
+ background-color: #0d1117;
644
+ }
645
+
646
+ .chat-diff-line span {
647
+ color: inherit;
648
+ }
649
+
650
+ .chat-diff-line-number {
651
+ width: 3rem;
652
+ padding: 0 0.5rem;
653
+ text-align: right;
654
+ color: #6e7681;
655
+ background-color: #161b22;
656
+ user-select: none;
657
+ flex-shrink: 0;
658
+ }
659
+
660
+ .chat-diff-line-sign {
661
+ width: 1.5rem;
662
+ text-align: center;
663
+ user-select: none;
664
+ flex-shrink: 0;
665
+ color: #6e7681;
666
+ }
667
+
668
+ .chat-diff-line-content {
669
+ flex: 1;
670
+ padding: 0 0.75rem;
671
+ white-space: pre;
672
+ color: #e6edf3;
673
+ }
674
+
675
+ .chat-diff-line-added {
676
+ background-color: rgba(46, 160, 67, 0.15);
677
+ }
678
+
679
+ .chat-diff-line-added .chat-diff-line-sign {
680
+ color: #3fb950;
681
+ }
682
+
683
+ .chat-diff-line-added .chat-diff-line-number {
684
+ background-color: rgba(46, 160, 67, 0.2);
685
+ }
686
+
687
+ .chat-diff-line-added .chat-diff-line-content {
688
+ color: #e6edf3;
689
+ }
690
+
691
+ .chat-diff-line-removed {
692
+ background-color: rgba(248, 81, 73, 0.15);
693
+ }
694
+
695
+ .chat-diff-line-removed .chat-diff-line-sign {
696
+ color: #f85149;
697
+ }
698
+
699
+ .chat-diff-line-removed .chat-diff-line-number {
700
+ background-color: rgba(248, 81, 73, 0.2);
701
+ }
702
+
703
+ .chat-diff-line-removed .chat-diff-line-content {
704
+ color: #e6edf3;
705
+ }
706
+
707
+ .chat-diff-line-removed .chat-diff-line-number {
708
+ background-color: rgba(248, 81, 73, 0.2);
709
+ }
710
+
711
+ .chat-diff-line-empty {
712
+ background-color: #161b22;
713
+ }
714
+
715
+ /* ============================================
716
+ Shell Block - Terminal Style
717
+ ============================================ */
718
+
719
+ /* Shell Block - 始终深色背景 */
720
+ .chat-shell-block {
721
+ margin: 0.5rem 0;
722
+ border-radius: 0.5rem;
723
+ overflow: hidden;
724
+ border: 1px solid #30363d;
725
+ background-color: #0d1117;
726
+ color: #e6edf3;
727
+ }
728
+
729
+ .chat-shell-block * {
730
+ color: inherit;
731
+ }
732
+
733
+ .chat-shell-command {
734
+ display: flex;
735
+ align-items: center;
736
+ gap: 0.5rem;
737
+ padding: 0.625rem 0.875rem;
738
+ border-bottom: 1px solid #30363d;
739
+ background-color: #161b22;
740
+ }
741
+
742
+ .chat-shell-prompt {
743
+ color: #58a6ff;
744
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
745
+ font-size: 0.6875rem;
746
+ font-weight: 500;
747
+ }
748
+
749
+ .chat-shell-command-text {
750
+ flex: 1;
751
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
752
+ font-size: 0.6875rem;
753
+ color: #e6edf3;
754
+ }
755
+
756
+ .chat-shell-running {
757
+ margin-left: 0.5rem;
758
+ }
759
+
760
+ .chat-shell-output {
761
+ padding: 0.75rem 0.875rem;
762
+ font-size: 0.75rem;
763
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
764
+ overflow-x: auto;
765
+ max-height: 16rem;
766
+ overflow-y: auto;
767
+ line-height: 1.5;
768
+ }
769
+
770
+ .chat-shell-output pre {
771
+ margin: 0;
772
+ white-space: pre-wrap;
773
+ }
774
+
775
+ .chat-shell-output-error {
776
+ color: #f85149;
777
+ }
778
+
779
+ .chat-shell-exit-code {
780
+ padding: 0.375rem 0.875rem;
781
+ font-size: 0.6875rem;
782
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
783
+ border-top: 1px solid #30363d;
784
+ background-color: #161b22;
785
+ }
786
+
787
+ .chat-shell-exit-success {
788
+ color: #3fb950;
789
+ }
790
+
791
+ .chat-shell-exit-error {
792
+ color: #f85149;
793
+ }
794
+
795
+ /* ============================================
796
+ Mermaid Block
797
+ ============================================ */
798
+
799
+ .chat-mermaid-block {
800
+ margin: 0.5rem 0;
801
+ padding: 1.25rem;
802
+ border-radius: 0.5rem;
803
+ background-color: color-mix(in srgb, var(--card) 50%, var(--background));
804
+ border: 1px solid var(--border);
805
+ overflow-x: auto;
806
+ }
807
+
808
+ .chat-mermaid-loading,
809
+ .chat-mermaid-error {
810
+ display: flex;
811
+ align-items: center;
812
+ gap: 0.5rem;
813
+ font-size: 0.6875rem;
814
+ color: var(--muted-foreground);
815
+ }
816
+
817
+ .chat-mermaid-error {
818
+ color: rgb(239 68 68);
819
+ }
820
+
821
+ .chat-mermaid-content {
822
+ display: flex;
823
+ justify-content: center;
824
+ }
825
+
826
+ .chat-mermaid-content svg {
827
+ max-width: 100%;
828
+ height: auto;
829
+ }
830
+
831
+ .chat-mermaid-clickable {
832
+ cursor: pointer;
833
+ transition: transform 150ms, opacity 150ms;
834
+ }
835
+
836
+ .chat-mermaid-clickable:hover {
837
+ transform: scale(1.01);
838
+ opacity: 0.9;
839
+ }
840
+
841
+ /* Mermaid diagram in preview dialog */
842
+ .chat-mermaid-dialog-svg {
843
+ display: flex;
844
+ align-items: center;
845
+ justify-content: center;
846
+ transition: transform 100ms ease-out;
847
+ user-select: none;
848
+ }
849
+
850
+ .chat-mermaid-dialog-svg svg {
851
+ max-width: 90vw;
852
+ max-height: 85vh;
853
+ }
854
+
855
+ /* ============================================
856
+ Checklist Block - Interactive Design
857
+ ============================================ */
858
+
859
+ .chat-checklist-block {
860
+ margin: 0.5rem 0;
861
+ }
862
+
863
+ .chat-checklist {
864
+ list-style: none;
865
+ padding: 0;
866
+ margin: 0;
867
+ }
868
+
869
+ .chat-checklist-item {
870
+ display: flex;
871
+ align-items: flex-start;
872
+ padding: 0.5rem 0;
873
+ border-bottom: 1px solid color-mix(in srgb, var(--border) 50%, transparent);
874
+ }
875
+
876
+ .chat-checklist-item:last-child {
877
+ border-bottom: none;
878
+ }
879
+
880
+ .chat-checklist-label {
881
+ display: flex;
882
+ align-items: center;
883
+ gap: 0.75rem;
884
+ cursor: pointer;
885
+ width: 100%;
886
+ }
887
+
888
+ .chat-checklist-checkbox {
889
+ width: 1.125rem;
890
+ height: 1.125rem;
891
+ border-radius: 0.25rem;
892
+ border: 2px solid var(--border);
893
+ flex-shrink: 0;
894
+ cursor: pointer;
895
+ accent-color: var(--primary);
896
+ }
897
+
898
+ .chat-checklist-checkbox:checked {
899
+ background-color: var(--primary);
900
+ border-color: var(--primary);
901
+ }
902
+
903
+ .chat-checklist-text {
904
+ font-size: 0.75rem;
905
+ line-height: 1.4;
906
+ }
907
+
908
+ .chat-checklist-text-checked {
909
+ text-decoration: line-through;
910
+ color: var(--muted-foreground);
911
+ }
912
+
913
+ /* ============================================
914
+ Thinking Block - Subtle Animation
915
+ ============================================ */
916
+
917
+ .chat-thinking-block {
918
+ margin: 0.5rem 0;
919
+ padding: 0.75rem 1rem;
920
+ border-radius: 0.5rem;
921
+ background-color: color-mix(in srgb, var(--muted) 30%, transparent);
922
+ border: 1px solid var(--border);
923
+ border-left: 3px solid var(--primary);
924
+ }
925
+
926
+ .chat-thinking-header {
927
+ display: flex;
928
+ align-items: center;
929
+ gap: 0.5rem;
930
+ font-size: 0.6875rem;
931
+ color: var(--muted-foreground);
932
+ }
933
+
934
+ .chat-thinking-icon {
935
+ animation: spin 1s linear infinite;
936
+ }
937
+
938
+ .chat-thinking-duration {
939
+ margin-left: auto;
940
+ font-size: 0.6875rem;
941
+ color: var(--muted-foreground);
942
+ }
943
+
944
+ .chat-thinking-content {
945
+ margin-top: 0.5rem;
946
+ font-size: 0.6875rem;
947
+ color: var(--muted-foreground);
948
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
949
+ white-space: pre-wrap;
950
+ font-style: italic;
951
+ }
952
+
953
+ /* ============================================
954
+ Tool Call Block - Collapsible Design
955
+ ============================================ */
956
+
957
+ .chat-tool-call-block {
958
+ margin: 0.5rem 0;
959
+ border-radius: 0.5rem;
960
+ border: 1px solid var(--border);
961
+ overflow: hidden;
962
+ background-color: var(--card);
963
+ }
964
+
965
+ .chat-tool-call-header {
966
+ display: flex;
967
+ align-items: center;
968
+ gap: 0.5rem;
969
+ padding: 0.625rem 0.875rem;
970
+ background-color: color-mix(in srgb, var(--muted) 50%, transparent);
971
+ cursor: pointer;
972
+ transition: background-color 150ms;
973
+ }
974
+
975
+ .chat-tool-call-header:hover {
976
+ background-color: color-mix(in srgb, var(--muted) 70%, transparent);
977
+ }
978
+
979
+ .chat-tool-collapse-btn {
980
+ padding: 0.125rem;
981
+ border-radius: 0.25rem;
982
+ color: var(--muted-foreground);
983
+ cursor: pointer;
984
+ border: none;
985
+ background: transparent;
986
+ transition: transform 150ms;
987
+ }
988
+
989
+ .chat-tool-collapse-btn:hover {
990
+ background-color: var(--accent);
991
+ }
992
+
993
+ .chat-tool-status-icon {
994
+ flex-shrink: 0;
995
+ }
996
+
997
+ .chat-tool-name {
998
+ font-size: 0.6875rem;
999
+ font-weight: 600;
1000
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
1001
+ }
1002
+
1003
+ .chat-tool-summary {
1004
+ margin-left: auto;
1005
+ font-size: 0.6875rem;
1006
+ color: var(--muted-foreground);
1007
+ overflow: hidden;
1008
+ text-overflow: ellipsis;
1009
+ white-space: nowrap;
1010
+ max-width: 200px;
1011
+ }
1012
+
1013
+ .chat-tool-call-body {
1014
+ border-top: 1px solid var(--border);
1015
+ }
1016
+
1017
+ .chat-tool-section {
1018
+ padding: 0.75rem 0.875rem;
1019
+ border-bottom: 1px solid var(--border);
1020
+ }
1021
+
1022
+ .chat-tool-section:last-child {
1023
+ border-bottom: none;
1024
+ }
1025
+
1026
+ .chat-tool-section-label {
1027
+ font-size: 0.6875rem;
1028
+ font-weight: 600;
1029
+ color: var(--muted-foreground);
1030
+ margin-bottom: 0.5rem;
1031
+ text-transform: uppercase;
1032
+ letter-spacing: 0.05em;
1033
+ }
1034
+
1035
+ .chat-tool-args,
1036
+ .chat-tool-result {
1037
+ font-size: 0.75rem;
1038
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
1039
+ background-color: color-mix(in srgb, var(--muted) 30%, transparent);
1040
+ border-radius: 0.375rem;
1041
+ padding: 0.625rem 0.75rem;
1042
+ overflow-x: auto;
1043
+ max-height: 12rem;
1044
+ overflow-y: auto;
1045
+ white-space: pre-wrap;
1046
+ line-height: 1.5;
1047
+ }
1048
+
1049
+ .chat-tool-error-section {
1050
+ background-color: rgb(239 68 68 / 0.05);
1051
+ }
1052
+
1053
+ .chat-tool-error {
1054
+ font-size: 0.6875rem;
1055
+ color: rgb(239 68 68);
1056
+ }
1057
+
1058
+ .chat-tool-children {
1059
+ padding: 0.75rem 0.875rem;
1060
+ border-top: 1px solid var(--border);
1061
+ background-color: color-mix(in srgb, var(--muted) 20%, transparent);
1062
+ }
1063
+
1064
+ /* ============================================
1065
+ Image Block
1066
+ ============================================ */
1067
+
1068
+ .chat-image-block {
1069
+ position: relative;
1070
+ border-radius: 0.5rem;
1071
+ overflow: hidden;
1072
+ margin: 0.5rem 0;
1073
+ max-width: 24rem;
1074
+ }
1075
+
1076
+ .chat-image {
1077
+ width: 100%;
1078
+ height: auto;
1079
+ cursor: pointer;
1080
+ transition: transform 150ms, opacity 150ms;
1081
+ }
1082
+
1083
+ .chat-image:hover {
1084
+ transform: scale(1.02);
1085
+ opacity: 0.95;
1086
+ }
1087
+
1088
+ .chat-image-loading,
1089
+ .chat-image-error {
1090
+ display: flex;
1091
+ flex-direction: column;
1092
+ align-items: center;
1093
+ justify-content: center;
1094
+ gap: 0.5rem;
1095
+ padding: 2rem;
1096
+ color: var(--muted-foreground);
1097
+ background-color: var(--muted);
1098
+ border-radius: 0.5rem;
1099
+ }
1100
+
1101
+ /* Image Preview Dialog */
1102
+ .chat-image-dialog-backdrop {
1103
+ position: fixed;
1104
+ inset: 0;
1105
+ z-index: 50;
1106
+ background-color: rgba(0, 0, 0, 0.9);
1107
+ cursor: pointer;
1108
+ }
1109
+
1110
+ .chat-image-dialog {
1111
+ position: fixed;
1112
+ inset: 0;
1113
+ z-index: 51;
1114
+ display: flex;
1115
+ flex-direction: column;
1116
+ pointer-events: none;
1117
+ }
1118
+
1119
+ .chat-image-dialog-toolbar {
1120
+ position: absolute;
1121
+ top: 1rem;
1122
+ left: 50%;
1123
+ transform: translateX(-50%);
1124
+ z-index: 52;
1125
+ display: flex;
1126
+ align-items: center;
1127
+ gap: 0.25rem;
1128
+ padding: 0.5rem;
1129
+ background-color: rgba(0, 0, 0, 0.7);
1130
+ border-radius: 0.5rem;
1131
+ backdrop-filter: blur(8px);
1132
+ pointer-events: auto;
1133
+ }
1134
+
1135
+ .chat-image-dialog-btn {
1136
+ display: flex;
1137
+ align-items: center;
1138
+ justify-content: center;
1139
+ width: 2.25rem;
1140
+ height: 2.25rem;
1141
+ border-radius: 0.375rem;
1142
+ border: none;
1143
+ background: transparent;
1144
+ color: #e5e5e5;
1145
+ cursor: pointer;
1146
+ transition: background-color 150ms;
1147
+ }
1148
+
1149
+ .chat-image-dialog-btn:hover {
1150
+ background-color: rgba(255, 255, 255, 0.1);
1151
+ }
1152
+
1153
+ .chat-image-dialog-scale {
1154
+ min-width: 3.5rem;
1155
+ text-align: center;
1156
+ font-size: 0.75rem;
1157
+ font-weight: 500;
1158
+ color: #e5e5e5;
1159
+ font-variant-numeric: tabular-nums;
1160
+ }
1161
+
1162
+ .chat-image-dialog-separator {
1163
+ width: 1px;
1164
+ height: 1.5rem;
1165
+ margin: 0 0.25rem;
1166
+ background-color: rgba(255, 255, 255, 0.2);
1167
+ }
1168
+
1169
+ .chat-image-dialog-content {
1170
+ flex: 1;
1171
+ display: flex;
1172
+ align-items: center;
1173
+ justify-content: center;
1174
+ overflow: hidden;
1175
+ pointer-events: auto;
1176
+ }
1177
+
1178
+ .chat-image-dialog-img {
1179
+ max-width: 90vw;
1180
+ max-height: 85vh;
1181
+ object-fit: contain;
1182
+ transition: transform 100ms ease-out;
1183
+ user-select: none;
1184
+ }
1185
+
1186
+ .chat-image-dialog-hint {
1187
+ position: absolute;
1188
+ bottom: 1rem;
1189
+ left: 50%;
1190
+ transform: translateX(-50%);
1191
+ padding: 0.5rem 1rem;
1192
+ background-color: rgba(0, 0, 0, 0.7);
1193
+ border-radius: 0.375rem;
1194
+ font-size: 0.6875rem;
1195
+ color: #a3a3a3;
1196
+ backdrop-filter: blur(8px);
1197
+ pointer-events: none;
1198
+ }
1199
+
1200
+ /* ============================================
1201
+ SVG Block
1202
+ ============================================ */
1203
+
1204
+ .chat-svg-block {
1205
+ margin: 0.5rem 0;
1206
+ overflow-x: auto;
1207
+ }
1208
+
1209
+ .chat-svg-block svg {
1210
+ max-width: 100%;
1211
+ height: auto;
1212
+ }
1213
+
1214
+ /* ============================================
1215
+ File Block
1216
+ ============================================ */
1217
+
1218
+ .chat-file-block {
1219
+ display: flex;
1220
+ align-items: center;
1221
+ gap: 0.75rem;
1222
+ padding: 0.75rem;
1223
+ margin: 0.5rem 0;
1224
+ border-radius: 0.5rem;
1225
+ border: 1px solid var(--border);
1226
+ background-color: var(--card);
1227
+ cursor: pointer;
1228
+ transition: all 150ms;
1229
+ }
1230
+
1231
+ .chat-file-block:hover {
1232
+ background-color: var(--accent);
1233
+ border-color: color-mix(in srgb, var(--border) 80%, var(--primary));
1234
+ }
1235
+
1236
+ .chat-file-icon {
1237
+ font-size: 1.5rem;
1238
+ }
1239
+
1240
+ .chat-file-info {
1241
+ flex: 1;
1242
+ min-width: 0;
1243
+ }
1244
+
1245
+ .chat-file-name {
1246
+ font-size: 0.6875rem;
1247
+ font-weight: 500;
1248
+ overflow: hidden;
1249
+ text-overflow: ellipsis;
1250
+ white-space: nowrap;
1251
+ }
1252
+
1253
+ .chat-file-meta {
1254
+ font-size: 0.6875rem;
1255
+ color: var(--muted-foreground);
1256
+ }
1257
+
1258
+ .chat-file-download {
1259
+ color: var(--muted-foreground);
1260
+ }
1261
+
1262
+ /* ============================================
1263
+ Working Indicator
1264
+ ============================================ */
1265
+
1266
+ .chat-working-indicator {
1267
+ display: flex;
1268
+ align-items: center;
1269
+ gap: 0.5rem;
1270
+ font-size: 0.6875rem;
1271
+ color: var(--muted-foreground);
1272
+ }
1273
+
1274
+ .chat-working-dots {
1275
+ display: flex;
1276
+ gap: 0.25rem;
1277
+ }
1278
+
1279
+ .chat-working-dot {
1280
+ width: 0.375rem;
1281
+ height: 0.375rem;
1282
+ border-radius: 9999px;
1283
+ background-color: var(--primary);
1284
+ animation: bounce 1s infinite;
1285
+ }
1286
+
1287
+ .chat-working-dot:nth-child(1) {
1288
+ animation-delay: 0ms;
1289
+ }
1290
+
1291
+ .chat-working-dot:nth-child(2) {
1292
+ animation-delay: 150ms;
1293
+ }
1294
+
1295
+ .chat-working-dot:nth-child(3) {
1296
+ animation-delay: 300ms;
1297
+ }
1298
+
1299
+ /* ============================================
1300
+ Chat Input - Clean Design
1301
+ ============================================ */
1302
+
1303
+ .chat-input-container {
1304
+ position: relative;
1305
+ padding: 0.75rem 1rem;
1306
+ background-color: var(--background);
1307
+ }
1308
+
1309
+ .chat-input-container-focused {
1310
+ box-shadow: inset 0 1px 0 var(--primary);
1311
+ }
1312
+
1313
+ .chat-input-container-dragging {
1314
+ box-shadow: inset 0 0 0 2px var(--primary);
1315
+ }
1316
+
1317
+ .chat-input-drop-overlay {
1318
+ position: absolute;
1319
+ inset: 0;
1320
+ z-index: 10;
1321
+ display: flex;
1322
+ flex-direction: column;
1323
+ align-items: center;
1324
+ justify-content: center;
1325
+ gap: 0.5rem;
1326
+ background-color: color-mix(in srgb, var(--primary) 10%, transparent);
1327
+ border: 2px dashed var(--primary);
1328
+ border-radius: 0.5rem;
1329
+ color: var(--primary);
1330
+ font-weight: 500;
1331
+ }
1332
+
1333
+ .chat-input-row {
1334
+ display: flex;
1335
+ align-items: flex-end;
1336
+ gap: 0.5rem;
1337
+ }
1338
+
1339
+ .chat-input-attachment-btn {
1340
+ padding: 0.5rem;
1341
+ border-radius: 0.5rem;
1342
+ color: var(--muted-foreground);
1343
+ cursor: pointer;
1344
+ border: none;
1345
+ background: transparent;
1346
+ transition: all 150ms;
1347
+ }
1348
+
1349
+ .chat-input-attachment-btn:hover {
1350
+ background-color: var(--accent);
1351
+ color: var(--foreground);
1352
+ }
1353
+
1354
+ .chat-input-textarea {
1355
+ flex: 1;
1356
+ resize: none;
1357
+ background: transparent;
1358
+ font-size: 0.75rem;
1359
+ color: var(--foreground);
1360
+ border: none;
1361
+ outline: none;
1362
+ min-height: 36px;
1363
+ max-height: 200px;
1364
+ padding: 0.5rem 0;
1365
+ line-height: 1.5;
1366
+ }
1367
+
1368
+ .chat-input-textarea::placeholder {
1369
+ color: var(--muted-foreground);
1370
+ }
1371
+
1372
+ .chat-input-send-btn {
1373
+ padding: 0.5rem;
1374
+ border-radius: 0.5rem;
1375
+ color: var(--muted-foreground);
1376
+ cursor: pointer;
1377
+ border: none;
1378
+ background: transparent;
1379
+ transition: all 150ms;
1380
+ }
1381
+
1382
+ .chat-input-send-btn-active {
1383
+ background: linear-gradient(135deg, var(--primary) 0%, color-mix(in srgb, var(--primary) 85%, #000) 100%);
1384
+ color: var(--primary-foreground);
1385
+ }
1386
+
1387
+ .chat-input-send-btn-active:hover {
1388
+ transform: scale(1.05);
1389
+ }
1390
+
1391
+ .chat-input-send-btn:disabled {
1392
+ opacity: 0.5;
1393
+ cursor: not-allowed;
1394
+ }
1395
+
1396
+ /* ============================================
1397
+ Attachment Preview
1398
+ ============================================ */
1399
+
1400
+ .chat-attachment-preview {
1401
+ display: flex;
1402
+ flex-wrap: wrap;
1403
+ gap: 0.5rem;
1404
+ margin-bottom: 0.5rem;
1405
+ }
1406
+
1407
+ .chat-attachment-item {
1408
+ position: relative;
1409
+ display: flex;
1410
+ align-items: center;
1411
+ gap: 0.5rem;
1412
+ padding: 0.5rem;
1413
+ border-radius: 0.5rem;
1414
+ background-color: var(--card);
1415
+ border: 1px solid var(--border);
1416
+ max-width: 200px;
1417
+ }
1418
+
1419
+ .chat-attachment-item-error {
1420
+ border-color: rgb(239 68 68 / 0.5);
1421
+ background-color: rgb(239 68 68 / 0.05);
1422
+ }
1423
+
1424
+ .chat-attachment-image {
1425
+ width: 3rem;
1426
+ height: 3rem;
1427
+ border-radius: 0.25rem;
1428
+ object-fit: cover;
1429
+ }
1430
+
1431
+ .chat-attachment-file-icon {
1432
+ width: 3rem;
1433
+ height: 3rem;
1434
+ display: flex;
1435
+ align-items: center;
1436
+ justify-content: center;
1437
+ background-color: var(--muted);
1438
+ border-radius: 0.25rem;
1439
+ color: var(--muted-foreground);
1440
+ }
1441
+
1442
+ .chat-attachment-info {
1443
+ flex: 1;
1444
+ min-width: 0;
1445
+ }
1446
+
1447
+ .chat-attachment-name {
1448
+ font-size: 0.75rem;
1449
+ font-weight: 500;
1450
+ overflow: hidden;
1451
+ text-overflow: ellipsis;
1452
+ white-space: nowrap;
1453
+ }
1454
+
1455
+ .chat-attachment-size {
1456
+ font-size: 0.6875rem;
1457
+ color: var(--muted-foreground);
1458
+ }
1459
+
1460
+ .chat-attachment-progress {
1461
+ position: absolute;
1462
+ bottom: 0;
1463
+ left: 0;
1464
+ right: 0;
1465
+ height: 0.1875rem;
1466
+ background-color: var(--muted);
1467
+ border-bottom-left-radius: 0.5rem;
1468
+ border-bottom-right-radius: 0.5rem;
1469
+ overflow: hidden;
1470
+ }
1471
+
1472
+ .chat-attachment-progress-bar {
1473
+ height: 100%;
1474
+ background-color: var(--primary);
1475
+ transition: width 150ms;
1476
+ }
1477
+
1478
+ .chat-attachment-error {
1479
+ color: rgb(239 68 68);
1480
+ }
1481
+
1482
+ .chat-attachment-remove-btn {
1483
+ position: absolute;
1484
+ top: -0.375rem;
1485
+ right: -0.375rem;
1486
+ padding: 0.125rem;
1487
+ border-radius: 9999px;
1488
+ background-color: var(--muted);
1489
+ border: 1px solid var(--border);
1490
+ cursor: pointer;
1491
+ color: var(--muted-foreground);
1492
+ transition: all 150ms;
1493
+ }
1494
+
1495
+ .chat-attachment-remove-btn:hover {
1496
+ background-color: rgb(239 68 68);
1497
+ border-color: rgb(239 68 68);
1498
+ color: white;
1499
+ }
1500
+
1501
+ /* ============================================
1502
+ Connection Status
1503
+ ============================================ */
1504
+
1505
+ .chat-connection-status {
1506
+ display: flex;
1507
+ align-items: center;
1508
+ gap: 0.5rem;
1509
+ font-size: 0.6875rem;
1510
+ }
1511
+
1512
+ .chat-connection-dot {
1513
+ width: 0.5rem;
1514
+ height: 0.5rem;
1515
+ border-radius: 9999px;
1516
+ background-color: currentColor;
1517
+ }
1518
+
1519
+ /* ============================================
1520
+ Animations
1521
+ ============================================ */
1522
+
1523
+ @keyframes spin {
1524
+ from {
1525
+ transform: rotate(0deg);
1526
+ }
1527
+ to {
1528
+ transform: rotate(360deg);
1529
+ }
1530
+ }
1531
+
1532
+ @keyframes bounce {
1533
+ 0%, 100% {
1534
+ transform: translateY(0);
1535
+ }
1536
+ 50% {
1537
+ transform: translateY(-4px);
1538
+ }
1539
+ }
1540
+
1541
+ @keyframes pulse {
1542
+ 0%, 100% {
1543
+ opacity: 1;
1544
+ }
1545
+ 50% {
1546
+ opacity: 0.5;
1547
+ }
1548
+ }
1549
+
1550
+ /* ============================================
1551
+ Scrollbar Styling
1552
+ ============================================ */
1553
+
1554
+ .chat-message-list-scroll::-webkit-scrollbar {
1555
+ width: 6px;
1556
+ }
1557
+
1558
+ .chat-message-list-scroll::-webkit-scrollbar-track {
1559
+ background: transparent;
1560
+ }
1561
+
1562
+ .chat-message-list-scroll::-webkit-scrollbar-thumb {
1563
+ background: var(--muted);
1564
+ border-radius: 3px;
1565
+ }
1566
+
1567
+ .chat-message-list-scroll::-webkit-scrollbar-thumb:hover {
1568
+ background: var(--muted-foreground);
1569
+ }
1570
+
1571
+ /* ============================================
1572
+ Text Selection Styles (文字选中效果)
1573
+ ============================================
1574
+
1575
+ 设计原则:
1576
+ 1. 组件层样式不使用 @layer,确保能覆盖 floe.css 中 @layer base 的全局样式
1577
+ 2. 代码块使用硬编码颜色,因为代码块有固定的深色背景 (#0d1117)
1578
+ 3. 用户消息使用主题变量,因为背景色随主题变化
1579
+
1580
+ 颜色方案:
1581
+ - 代码块选中:亮蓝色背景 (#57a5ff) + 深色文字 (#0d1117)
1582
+ - 浅色主题用户消息:金黄色背景 + 黑色文字(因为气泡是深蓝黑色背景)
1583
+ - 深色主题用户消息:深蓝色背景 + 白色文字(因为气泡是近白色背景)
1584
+ */
1585
+
1586
+ /* 默认选中效果(继承主题变量) */
1587
+ .chat-container ::selection {
1588
+ background-color: var(--selection-bg);
1589
+ color: var(--selection-fg);
1590
+ }
1591
+
1592
+ /* 代码块选中效果
1593
+ 代码块始终是深色背景 (#0d1117),所以使用固定的亮色选中效果
1594
+ 使用硬编码颜色确保在任何情况下都可见 */
1595
+ .chat-code-block ::selection,
1596
+ .chat-code-block *::selection,
1597
+ .chat-code-diff-block ::selection,
1598
+ .chat-code-diff-block *::selection,
1599
+ pre.chat-md-code-block ::selection,
1600
+ pre.chat-md-code-block *::selection,
1601
+ .chat-shell-block ::selection,
1602
+ .chat-shell-block *::selection {
1603
+ background-color: #57a5ff;
1604
+ color: #0d1117;
1605
+ }
1606
+
1607
+ /* 用户消息气泡选中效果
1608
+ 背景色随主题变化(浅色主题是深色背景,深色主题是浅色背景)
1609
+ 所以选中效果也需要随主题变化 */
1610
+ .chat-message-bubble-user ::selection,
1611
+ .chat-message-bubble-user *::selection {
1612
+ background-color: var(--selection-on-primary-bg);
1613
+ color: var(--selection-on-primary-fg);
1614
+ }
1615
+
1616
+ } /* End of @layer components */