@springbrand/message-panel 0.1.3-alpha.0 → 0.1.3-alpha.2

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,559 @@
1
+ /* ============================================================================
2
+ * cloud-os 主题层 —— 从 cloudflare-os-main(packages/workshop-frontend/src/styles.css
3
+ * 与 ChatInterface.module.css)整段拷贝后做「作用域化」适配。
4
+ *
5
+ * 适配了什么、为什么:
6
+ * 1. 只有 kumo 命名空间的 token(--color-kumo-* / --text-color-kumo-*)进 @theme,
7
+ * 因为 Tailwind v4 只有见到 @theme 才会生成 bg-kumo-base / text-kumo-subtle
8
+ * 这类 utility。这些名字在 universal-agent-ui 里不存在,不会撞车。
9
+ * 2. 通用 token(字体、圆角、字号、缓动)一律**不进 @theme**,而是挂在
10
+ * .cloud-os-root 上。CSS 自定义属性会继承,所以 cloud-os 子树里的 rounded-lg
11
+ * 拿到的是 cloudflare-os 的 0.5rem,外层 ui 的 shadcn 主题(--radius:10px)
12
+ * 分毫不动。这是本文件唯一的「适配性改动」,其余是原样搬运。
13
+ * (注意:这段注释里不能出现连着的星号加斜杠 —— 会提前闭合注释,
14
+ * @theme 块就会被当成裸文本,kumo 的 utility 一个都生成不出来。踩过。)
15
+ * 3. 暗色不再挂 [data-mode="dark"] 全局,而是 .cloud-os-root[data-mode="dark"],
16
+ * 由 <CloudOsRoot> 组件自己打标记。
17
+ * 4. 原 ChatInterface.module.css 是 CSS Module;本包不接 CSS Module 构建,
18
+ * 统一改成 cos- 前缀的全局类名。
19
+ * ========================================================================== */
20
+
21
+ @theme {
22
+ /* ===== KUMO 语义色(浅色底本)===== */
23
+ --color-kumo-base: #fcfcfb;
24
+ --color-kumo-elevated: #f8f8f7;
25
+ --color-kumo-tint: #f3f3f1;
26
+ --color-kumo-overlay: #fbfbfa;
27
+ --color-kumo-recessed: #efeeec;
28
+ --color-kumo-control: #ffffff;
29
+ --color-kumo-contrast: #14110f;
30
+ --color-kumo-fill: #e8e7e4;
31
+ --color-kumo-fill-hover: #dededb;
32
+ --color-kumo-interact: #cac8c3;
33
+
34
+ --color-kumo-brand: #ff4801;
35
+ --color-kumo-brand-hover: #e03f00;
36
+ /* Kumo 基座里带的两个,cloudflare-os 只在暗色覆盖了 strong;浅色补上底本值。 */
37
+ --color-kumo-strong: #000000;
38
+ --color-kumo-inverse: #ffffff;
39
+
40
+ --color-kumo-line: #1411100f;
41
+ --color-kumo-ring: #cac8c3;
42
+
43
+ --color-kumo-bubble-user: #f1f0ee;
44
+
45
+ --color-kumo-info: oklch(62.3% 0.214 259.815);
46
+ --color-kumo-info-tint: oklch(90% 0.06 250);
47
+ --color-kumo-warning: oklch(79.5% 0.184 86.047);
48
+ --color-kumo-warning-tint: oklch(92% 0.08 85);
49
+ --color-kumo-danger: oklch(63.7% 0.237 25.331);
50
+ --color-kumo-danger-tint: oklch(92% 0.06 25);
51
+ --color-kumo-success: oklch(72.3% 0.219 149.579);
52
+ --color-kumo-success-tint: oklch(92% 0.08 150);
53
+
54
+ --color-kumo-tip-shadow: #14111014;
55
+ --color-kumo-tip-stroke: transparent;
56
+
57
+ /* 文本色 token(Tailwind v4 的 --text-color-* 命名空间 → text-kumo-* utility) */
58
+ --text-color-kumo-default: #1c1a18;
59
+ --text-color-kumo-default-hover: #100f0d;
60
+ --text-color-kumo-inverse: #ffffff;
61
+ --text-color-kumo-strong: #100f0d;
62
+ --text-color-kumo-subtle: oklch(52% 0.006 60);
63
+ --text-color-kumo-inactive: oklch(66% 0.005 60);
64
+ --text-color-kumo-brand: #ff4801;
65
+ --text-color-kumo-link: #ff4801;
66
+ --text-color-kumo-success: oklch(72.3% 0.219 149.579);
67
+ --text-color-kumo-danger: oklch(63.7% 0.237 25.331);
68
+ --text-color-kumo-warning: oklch(47.6% 0.114 61.907);
69
+
70
+ /* cloud-os 自有品牌档(和 kumo token 并用,避免和 shadcn 的 --accent 撞名) */
71
+ --color-cos-accent-100: #ff4801;
72
+ --color-cos-accent-200: #ff7038;
73
+ --color-cos-status-live: oklch(72.3% 0.219 149.579);
74
+ --color-cos-status-draft: oklch(68.1% 0.162 75.834);
75
+ --color-cos-status-building: oklch(62.3% 0.214 259.815);
76
+ }
77
+
78
+ /* ── 作用域根:通用 token 只在 cloud-os 子树内生效 ─────────────────────────── */
79
+ .cloud-os-root {
80
+ --font-sans:
81
+ "FT Kunst Grotesk", -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto",
82
+ "Helvetica Neue", sans-serif;
83
+ --font-mono: "Apercu Mono Pro", "SF Mono", Menlo, Monaco, Consolas, monospace;
84
+
85
+ /* cloudflare-os 把 Kumo 压小的字号还原成 Tailwind 默认档 */
86
+ --text-xs: 0.75rem;
87
+ --text-xs--line-height: 1rem;
88
+ --text-sm: 0.875rem;
89
+ --text-sm--line-height: 1.25rem;
90
+ --text-base: 1rem;
91
+ --text-base--line-height: 1.5rem;
92
+ --text-lg: 1.125rem;
93
+ --text-lg--line-height: 1.75rem;
94
+
95
+ --radius-sm: 0.25rem;
96
+ --radius-md: 0.375rem;
97
+ --radius-lg: 0.5rem;
98
+ --radius-xl: 0.75rem;
99
+ --radius-2xl: 1rem;
100
+
101
+ --spacing: 0.25rem;
102
+
103
+ --ease-in: cubic-bezier(0.4, 0, 1, 1);
104
+ --ease-out: cubic-bezier(0, 0, 0.2, 1);
105
+ --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
106
+ --ease-out-strong: cubic-bezier(0.23, 1, 0.32, 1);
107
+ --ease-in-out-strong: cubic-bezier(0.77, 0, 0.175, 1);
108
+ --ease-drawer: cubic-bezier(0.32, 0.72, 0, 1);
109
+ --default-transition-duration: 0.15s;
110
+ --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
111
+
112
+ --shadow-stack:
113
+ 1px 6px 6px 0 #fff3 inset, 0 0 0px 0 #ffffff59 inset, 0 4px 12px 0 #00000005,
114
+ 0 0 0px 0 #00000005, 0 2px 12px 0 #00000008;
115
+
116
+ --color-selection-bg: #ffe9e0;
117
+ --color-selection-text: #ff500a;
118
+
119
+ font-family: var(--font-sans);
120
+ background-color: var(--color-kumo-base);
121
+ color: var(--text-color-kumo-default);
122
+ -webkit-font-smoothing: antialiased;
123
+ }
124
+
125
+ /* ── 暗色:Seal 紫调深色盘(hue 285),不是中性黑 ──────────────────────────── */
126
+ .cloud-os-root[data-mode="dark"] {
127
+ --color-kumo-base: oklch(0.115 0.012 285);
128
+ --color-kumo-elevated: oklch(0.155 0.011 285);
129
+ --color-kumo-tint: oklch(0.225 0.025 285);
130
+ --color-kumo-overlay: oklch(0.155 0.011 285);
131
+ --color-kumo-recessed: oklch(0.1 0.012 285);
132
+ --color-kumo-control: oklch(0.155 0.011 285);
133
+ --color-kumo-contrast: var(--color-kumo-brand);
134
+ --color-kumo-strong: var(--color-kumo-brand-hover);
135
+ --color-kumo-inverse: #ffffff;
136
+ --color-kumo-fill: oklch(0.225 0.025 285);
137
+ --color-kumo-fill-hover: oklch(0.295 0.045 285);
138
+ --color-kumo-interact: oklch(0.34 0.022 285);
139
+ --color-kumo-line: oklch(0.34 0.022 285);
140
+ --color-kumo-ring: oklch(0.52 0.065 285);
141
+ --color-kumo-bubble-user: oklch(0.225 0.025 285);
142
+
143
+ --color-kumo-brand: #b84e00;
144
+ --color-kumo-brand-hover: #a54200;
145
+
146
+ --color-kumo-info: oklch(62.3% 0.214 259.815);
147
+ --color-kumo-info-tint: oklch(0.25 0.065 259.815);
148
+ --color-kumo-warning: oklch(55.5% 0.163 48.998);
149
+ --color-kumo-warning-tint: oklch(0.27 0.06 84.429);
150
+ --color-kumo-danger: oklch(50.5% 0.213 27.518);
151
+ --color-kumo-danger-tint: oklch(0.25 0.065 25.331);
152
+ --color-kumo-success: oklch(52.7% 0.154 150.069);
153
+ --color-kumo-success-tint: oklch(0.25 0.06 150.069);
154
+
155
+ --color-kumo-tip-shadow: #00000066;
156
+ --color-kumo-tip-stroke: oklch(0.34 0.022 285);
157
+
158
+ --text-color-kumo-default: oklch(0.92 0.01 285);
159
+ --text-color-kumo-default-hover: oklch(0.97 0.006 285);
160
+ --text-color-kumo-inverse: #ffffff;
161
+ --text-color-kumo-strong: oklch(0.92 0.01 285);
162
+ --text-color-kumo-subtle: oklch(0.66 0.02 285);
163
+ --text-color-kumo-inactive: oklch(0.58 0.025 285);
164
+ --text-color-kumo-brand: #ff8a5c;
165
+ --text-color-kumo-link: #ff8a5c;
166
+ --text-color-kumo-success: oklch(79.2% 0.209 151.711);
167
+ --text-color-kumo-danger: oklch(70.4% 0.191 22.216);
168
+ --text-color-kumo-warning: oklch(82.8% 0.189 84.429);
169
+
170
+ --color-cos-accent-100: #b84e00;
171
+ --color-cos-accent-200: #ff8a5c;
172
+ --color-cos-status-live: oklch(79.2% 0.209 151.711);
173
+ --color-cos-status-draft: oklch(82.8% 0.189 84.429);
174
+ --color-cos-status-building: oklch(74% 0.16 250);
175
+
176
+ --color-selection-bg: color-mix(in srgb, var(--color-kumo-brand) 28%, transparent);
177
+ --color-selection-text: oklch(0.97 0.006 285);
178
+
179
+ --shadow-stack:
180
+ 1px 6px 6px 0 #ffffff08 inset, 0 0 0 1px #ffffff05 inset,
181
+ 0 18px 40px 0 #00000033, 0 4px 12px 0 #0000002e;
182
+ }
183
+
184
+ .cloud-os-root ::selection {
185
+ background-color: var(--color-selection-bg);
186
+ color: var(--color-selection-text);
187
+ }
188
+
189
+ .cloud-os-root code {
190
+ font-family: var(--font-mono);
191
+ }
192
+
193
+ .cloud-os-root button:not(:disabled),
194
+ .cloud-os-root [role="button"]:not(:disabled) {
195
+ cursor: pointer;
196
+ }
197
+
198
+ /* ── themed-* 表面层(原样搬运)──────────────────────────────────────────── */
199
+ .themed-surface-inset {
200
+ box-shadow: inset 0 1px 0 color-mix(in srgb, var(--color-kumo-fill) 65%, transparent);
201
+ }
202
+
203
+ .themed-inset-outline {
204
+ box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--color-kumo-fill) 65%, transparent);
205
+ }
206
+
207
+ .themed-prompt-card-shadow {
208
+ box-shadow:
209
+ inset 0 1px 0 color-mix(in srgb, var(--color-kumo-fill) 75%, transparent),
210
+ 0 1px 2px rgba(20, 17, 16, 0.03),
211
+ 0 10px 28px -16px rgba(20, 17, 16, 0.12);
212
+ }
213
+
214
+ .themed-prompt-card-shadow:focus-within {
215
+ box-shadow:
216
+ inset 0 1px 0 color-mix(in srgb, var(--color-kumo-fill) 85%, transparent),
217
+ 0 1px 2px rgba(20, 17, 16, 0.04),
218
+ 0 14px 34px -14px rgba(20, 17, 16, 0.16);
219
+ }
220
+
221
+ .themed-user-bubble-shadow {
222
+ box-shadow:
223
+ 0 1px 1px rgba(82, 16, 0, 0.03),
224
+ inset 0 1px 0 color-mix(in srgb, var(--color-kumo-fill) 65%, transparent);
225
+ }
226
+
227
+ .themed-thumbnail-shadow {
228
+ box-shadow: 0 2px 14px rgba(20, 17, 16, 0.1);
229
+ }
230
+
231
+ .themed-floating-shadow {
232
+ box-shadow: 0 8px 20px rgba(82, 16, 0, 0.1);
233
+ }
234
+
235
+ .themed-floating-shadow-lg {
236
+ box-shadow: 0 14px 36px rgba(82, 16, 0, 0.1);
237
+ }
238
+
239
+ .themed-bottom-shadow {
240
+ box-shadow: 0 4px 10px -8px rgba(82, 16, 0, 0.1);
241
+ }
242
+
243
+ .themed-card-hover-shadow:hover {
244
+ box-shadow: 0 8px 20px -16px rgba(82, 16, 0, 0.12);
245
+ }
246
+
247
+ .themed-row-hover-shadow:hover {
248
+ box-shadow: 0 8px 20px -18px rgba(82, 16, 0, 0.28);
249
+ }
250
+
251
+ .cloud-os-root[data-mode="dark"] .themed-prompt-card-shadow {
252
+ box-shadow:
253
+ inset 0 1px 0 color-mix(in srgb, var(--color-kumo-fill-hover) 42%, transparent),
254
+ 0 1px 2px rgba(0, 0, 0, 0.24),
255
+ 0 10px 28px -16px rgba(0, 0, 0, 0.45);
256
+ }
257
+
258
+ .cloud-os-root[data-mode="dark"] .themed-prompt-card-shadow:focus-within {
259
+ box-shadow:
260
+ inset 0 1px 0 color-mix(in srgb, var(--color-kumo-fill-hover) 52%, transparent),
261
+ 0 1px 2px rgba(0, 0, 0, 0.28),
262
+ 0 14px 34px -14px rgba(0, 0, 0, 0.55);
263
+ }
264
+
265
+ .cloud-os-root[data-mode="dark"] .themed-surface-inset {
266
+ box-shadow: inset 0 1px 0 color-mix(in srgb, var(--color-kumo-line) 80%, transparent);
267
+ }
268
+
269
+ .cloud-os-root[data-mode="dark"] .themed-inset-outline {
270
+ box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--color-kumo-line) 80%, transparent);
271
+ }
272
+
273
+ .cloud-os-root[data-mode="dark"] .themed-user-bubble-shadow {
274
+ box-shadow:
275
+ 0 1px 1px rgba(0, 0, 0, 0.15),
276
+ inset 0 1px 0 color-mix(in srgb, var(--color-kumo-line) 80%, transparent);
277
+ }
278
+
279
+ .cloud-os-root[data-mode="dark"] .themed-thumbnail-shadow {
280
+ box-shadow: 0 2px 14px rgba(0, 0, 0, 0.34);
281
+ }
282
+
283
+ .cloud-os-root[data-mode="dark"] .themed-floating-shadow {
284
+ box-shadow: 0 8px 20px rgba(0, 0, 0, 0.32);
285
+ }
286
+
287
+ .cloud-os-root[data-mode="dark"] .themed-floating-shadow-lg,
288
+ [data-cloud-os-portal][data-mode="dark"] .themed-floating-shadow-lg {
289
+ box-shadow: 0 14px 36px rgba(0, 0, 0, 0.38);
290
+ }
291
+
292
+ .cloud-os-root[data-mode="dark"] .themed-bottom-shadow {
293
+ box-shadow: 0 4px 10px -8px rgba(0, 0, 0, 0.48);
294
+ }
295
+
296
+ .cloud-os-root[data-mode="dark"] .themed-card-hover-shadow:hover {
297
+ box-shadow: 0 8px 20px -16px rgba(0, 0, 0, 0.55);
298
+ }
299
+
300
+ .cloud-os-root[data-mode="dark"] .themed-row-hover-shadow:hover {
301
+ box-shadow: 0 8px 20px -18px rgba(0, 0, 0, 0.58);
302
+ }
303
+
304
+ /* Popover / Dropdown 通过 portal 挂到 body,拿不到 .cloud-os-root 的作用域变量,
305
+ 所以 portal 容器自己再带一份(见 primitives/portal.tsx)。 */
306
+ [data-cloud-os-portal] {
307
+ --font-sans:
308
+ "FT Kunst Grotesk", -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto",
309
+ "Helvetica Neue", sans-serif;
310
+ --font-mono: "Apercu Mono Pro", "SF Mono", Menlo, Monaco, Consolas, monospace;
311
+ --radius-sm: 0.25rem;
312
+ --radius-md: 0.375rem;
313
+ --radius-lg: 0.5rem;
314
+ --radius-xl: 0.75rem;
315
+ --radius-2xl: 1rem;
316
+ font-family: var(--font-sans);
317
+ }
318
+
319
+ [data-cloud-os-portal][data-mode="dark"] {
320
+ --color-kumo-base: oklch(0.115 0.012 285);
321
+ --color-kumo-elevated: oklch(0.155 0.011 285);
322
+ --color-kumo-tint: oklch(0.225 0.025 285);
323
+ --color-kumo-control: oklch(0.155 0.011 285);
324
+ --color-kumo-fill: oklch(0.225 0.025 285);
325
+ --color-kumo-line: oklch(0.34 0.022 285);
326
+ --color-kumo-brand: #b84e00;
327
+ --color-kumo-danger: oklch(50.5% 0.213 27.518);
328
+ --color-kumo-danger-tint: oklch(0.25 0.065 25.331);
329
+ --text-color-kumo-default: oklch(0.92 0.01 285);
330
+ --text-color-kumo-subtle: oklch(0.66 0.02 285);
331
+ --text-color-kumo-inactive: oklch(0.58 0.025 285);
332
+ --text-color-kumo-brand: #ff8a5c;
333
+ }
334
+
335
+ /* ── 滚动条(原 styles.css)──────────────────────────────────────────────── */
336
+ .cos-hide-scrollbar {
337
+ -ms-overflow-style: none;
338
+ scrollbar-width: none;
339
+ }
340
+ .cos-hide-scrollbar::-webkit-scrollbar {
341
+ display: none;
342
+ }
343
+
344
+ .cos-chat-panel {
345
+ scrollbar-width: thin;
346
+ scrollbar-color: var(--color-kumo-line) transparent;
347
+ }
348
+ .cos-chat-panel::-webkit-scrollbar {
349
+ width: 4px;
350
+ }
351
+ .cos-chat-panel::-webkit-scrollbar-thumb {
352
+ background: var(--color-kumo-line);
353
+ border-radius: 4px;
354
+ }
355
+ .cos-chat-panel::-webkit-scrollbar-track {
356
+ background: transparent;
357
+ }
358
+
359
+ /* ── 顶部推进条(isAgentActive)──────────────────────────────────────────── */
360
+ @keyframes cos-thinking {
361
+ 0% {
362
+ left: -33%;
363
+ }
364
+ 50% {
365
+ left: 100%;
366
+ }
367
+ 100% {
368
+ left: -33%;
369
+ }
370
+ }
371
+
372
+ .cos-progress-sweep {
373
+ animation: cos-thinking 1.5s ease-in-out infinite;
374
+ }
375
+
376
+ /* ============================================================================
377
+ * 以下整段来自 ChatInterface.module.css —— CSS Module 类名改成 cos- 全局前缀
378
+ * ========================================================================== */
379
+
380
+ /* ── Markdown 正文 ─────────────────────────────────────────────────────── */
381
+ .cos-markdown {
382
+ line-height: 1.6;
383
+ overflow-wrap: anywhere;
384
+ }
385
+ .cos-markdown p {
386
+ margin: 0.4em 0;
387
+ }
388
+ .cos-markdown p:first-child {
389
+ margin-top: 0;
390
+ }
391
+ .cos-markdown p:last-child {
392
+ margin-bottom: 0;
393
+ }
394
+
395
+ .cos-markdown h1,
396
+ .cos-markdown h2,
397
+ .cos-markdown h3,
398
+ .cos-markdown h4 {
399
+ margin: 0.9em 0 0.4em;
400
+ font-weight: 600;
401
+ color: var(--text-color-kumo-default);
402
+ }
403
+ .cos-markdown h1:first-child,
404
+ .cos-markdown h2:first-child,
405
+ .cos-markdown h3:first-child {
406
+ margin-top: 0;
407
+ }
408
+
409
+ .cos-markdown code {
410
+ background-color: var(--color-kumo-tint);
411
+ color: var(--color-kumo-brand);
412
+ padding: 0.15em 0.4em;
413
+ border-radius: 4px;
414
+ font-family: var(--font-mono, monospace);
415
+ font-size: 0.85em;
416
+ }
417
+
418
+ .cos-markdown pre {
419
+ background-color: var(--color-kumo-elevated);
420
+ border: 1px solid var(--color-kumo-line);
421
+ border-radius: 8px;
422
+ padding: 10px 12px;
423
+ overflow-x: auto;
424
+ margin: 0.5em 0;
425
+ }
426
+ .cos-markdown pre code {
427
+ background: none;
428
+ color: var(--text-color-kumo-default);
429
+ padding: 0;
430
+ font-size: 0.8em;
431
+ }
432
+
433
+ .cos-markdown ul,
434
+ .cos-markdown ol {
435
+ margin: 0.4em 0;
436
+ padding-left: 1.5em;
437
+ }
438
+ .cos-markdown ul {
439
+ list-style-type: disc;
440
+ }
441
+ .cos-markdown ol {
442
+ list-style-type: decimal;
443
+ }
444
+ .cos-markdown li {
445
+ margin: 0.2em 0;
446
+ }
447
+
448
+ .cos-markdown blockquote {
449
+ margin: 0.5em 0;
450
+ padding-left: 0.75em;
451
+ border-left: 2px solid var(--color-kumo-line);
452
+ color: var(--text-color-kumo-subtle);
453
+ }
454
+
455
+ .cos-markdown a {
456
+ color: var(--color-kumo-brand);
457
+ text-decoration: none;
458
+ }
459
+ .cos-markdown a:hover {
460
+ text-decoration: underline;
461
+ }
462
+
463
+ .cos-markdown hr {
464
+ border: none;
465
+ border-top: 1px solid var(--color-kumo-line);
466
+ margin: 0.8em 0;
467
+ }
468
+
469
+ .cos-markdown table {
470
+ border-collapse: collapse;
471
+ width: 100%;
472
+ margin: 0.5em 0;
473
+ font-size: 0.85em;
474
+ display: block;
475
+ max-width: 100%;
476
+ overflow-x: auto;
477
+ }
478
+ .cos-markdown th,
479
+ .cos-markdown td {
480
+ border: 1px solid var(--color-kumo-line);
481
+ padding: 0.4em 0.6em;
482
+ text-align: left;
483
+ }
484
+ .cos-markdown th {
485
+ background-color: var(--color-kumo-elevated);
486
+ font-weight: 600;
487
+ }
488
+ .cos-markdown img {
489
+ max-width: 100%;
490
+ height: auto;
491
+ }
492
+
493
+ /* ── 输入框容器(container query 决定「添加资源」标签是否显示)─────────────── */
494
+ .cos-chat-input-root {
495
+ container-type: inline-size;
496
+ }
497
+
498
+ .cos-attach-label {
499
+ display: inline;
500
+ }
501
+
502
+ @container (max-width: 460px) {
503
+ .cos-attach-label {
504
+ display: none;
505
+ }
506
+ }
507
+
508
+ /* ── 流式占位:Thinking 扫光 ──────────────────────────────────────────────── */
509
+ .cos-thinking-shimmer {
510
+ color: var(--text-color-kumo-inactive);
511
+ background: linear-gradient(
512
+ 90deg,
513
+ var(--text-color-kumo-inactive) 0%,
514
+ var(--text-color-kumo-subtle) 45%,
515
+ var(--text-color-kumo-inactive) 90%
516
+ );
517
+ background-size: 220% 100%;
518
+ background-clip: text;
519
+ -webkit-background-clip: text;
520
+ -webkit-text-fill-color: transparent;
521
+ animation: cos-thinking-shimmer 1.8s linear infinite;
522
+ }
523
+
524
+ @keyframes cos-thinking-shimmer {
525
+ from {
526
+ background-position: 140% 0;
527
+ }
528
+ to {
529
+ background-position: -80% 0;
530
+ }
531
+ }
532
+
533
+ @media (prefers-reduced-motion: reduce) {
534
+ .cos-thinking-shimmer {
535
+ animation: none;
536
+ background: none;
537
+ -webkit-text-fill-color: currentColor;
538
+ }
539
+ .cos-progress-sweep {
540
+ animation: none;
541
+ }
542
+ }
543
+
544
+ /* ── 观察类 markdown(行内、紧凑)────────────────────────────────────────── */
545
+ .cos-observation-markdown {
546
+ line-height: 1.5;
547
+ }
548
+ .cos-observation-markdown p {
549
+ margin: 0.2em 0;
550
+ display: inline;
551
+ }
552
+ .cos-observation-markdown code {
553
+ background-color: var(--color-kumo-tint);
554
+ color: var(--color-kumo-brand);
555
+ padding: 0.1em 0.3em;
556
+ border-radius: 3px;
557
+ font-family: var(--font-mono, monospace);
558
+ font-size: 0.85em;
559
+ }