@pactor-app/chat 1.0.0 → 1.2.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pactor-app/chat",
3
- "version": "1.0.0",
3
+ "version": "1.2.0",
4
4
  "description": "Pactor chat: AI message rendering protocol (message model, streaming reducer, safe registry, capability action) and chat runtime view (ChatView / MessageBubble / PartRenderer / Composer / chat layout)",
5
5
  "keywords": [
6
6
  "pactor",
@@ -49,11 +49,11 @@
49
49
  "access": "public"
50
50
  },
51
51
  "dependencies": {
52
- "lucide-react": "^1.31.0",
53
- "@pactor-app/markdown": "1.0.0",
54
- "@pactor-app/runtime": "1.0.0",
55
- "@pactor-app/permission": "1.0.0",
56
- "@pactor-app/core": "1.0.0"
52
+ "@pactor-app/core": "1.2.0",
53
+ "@pactor-app/markdown": "1.2.0",
54
+ "@pactor-app/permission": "1.2.0",
55
+ "@pactor-app/runtime": "1.2.0",
56
+ "@pactor-app/ui": "1.2.0"
57
57
  },
58
58
  "peerDependencies": {
59
59
  "react": ">=18"
@@ -65,8 +65,7 @@
65
65
  "@types/react-dom": "^19.2.4",
66
66
  "jsdom": "^30.0.1",
67
67
  "react": "^19.2.8",
68
- "react-dom": "^19.2.8",
69
- "@pactor-app/ui": "1.0.0"
68
+ "react-dom": "^19.2.8"
70
69
  },
71
70
  "scripts": {
72
71
  "build": "tsup",
package/styles.css CHANGED
@@ -68,7 +68,6 @@
68
68
  height: 100%;
69
69
  gap: 12px;
70
70
  color: var(--pactor-chat-fg);
71
- background: var(--pactor-chat-bg);
72
71
  font-size: 14px;
73
72
  line-height: 1.6;
74
73
  }
@@ -109,6 +108,37 @@
109
108
  'Times New Roman', serif;
110
109
  }
111
110
 
111
+ /* ------------------------------------------------------------
112
+ * chrome DSL 渲染层(spec: chat-chrome-dsl / chrome 令牌映射):
113
+ * DSL 渲染的 chrome 子树(宿主 @pactor-app/ui 组件消费 shadcn
114
+ * 语义令牌)统一包在本容器内,把 --pactor-chat-* 映射为 shadcn
115
+ * 语义令牌——--pactor-chat-* 仍为皮肤唯一配置入口,暗色经上方
116
+ * [data-pactor-theme='dark'] 覆盖链自动生效。
117
+ * display:contents 使容器不参与布局;自定义属性沿 DOM 树继承,
118
+ * 不受 display:contents 影响。
119
+ * ------------------------------------------------------------ */
120
+ .pactor-chat-chrome {
121
+ display: contents;
122
+ --background: var(--pactor-chat-bg);
123
+ --foreground: var(--pactor-chat-fg);
124
+ --card: var(--pactor-chat-card);
125
+ --card-foreground: var(--pactor-chat-fg);
126
+ --popover: var(--pactor-chat-card);
127
+ --popover-foreground: var(--pactor-chat-fg);
128
+ --primary: var(--pactor-chat-primary);
129
+ --primary-foreground: var(--pactor-chat-primary-fg);
130
+ --secondary: var(--pactor-chat-muted);
131
+ --secondary-foreground: var(--pactor-chat-fg);
132
+ --muted: var(--pactor-chat-muted);
133
+ --muted-foreground: var(--pactor-chat-muted-fg);
134
+ --accent: var(--pactor-chat-muted);
135
+ --accent-foreground: var(--pactor-chat-fg);
136
+ --destructive: var(--pactor-chat-danger);
137
+ --border: var(--pactor-chat-border);
138
+ --input: var(--pactor-chat-border);
139
+ --ring: var(--pactor-chat-primary);
140
+ }
141
+
112
142
  /* ============================================================
113
143
  * 2. 布局(chat 布局 + 消息区)
114
144
  * ============================================================ */
@@ -152,7 +182,6 @@
152
182
  width: 100%;
153
183
  max-width: var(--pactor-chat-content-width);
154
184
  margin-inline: auto;
155
- background: var(--pactor-chat-bg);
156
185
  color: var(--pactor-chat-fg);
157
186
  font-size: 14px;
158
187
  line-height: 1.6;
@@ -186,194 +215,87 @@
186
215
  }
187
216
 
188
217
  /* ------------------------------------------------------------
189
- * AppShell(spec: chat-app-shell):侧栏 + 主区外壳。
190
- * 桌面(≥768px)flex 同行;移动端(<768px)侧栏退出文档流
191
- * 变为覆盖抽屉,布局切换全部由媒体查询表达,JS 只管开合。
192
- /* AppShell(spec: chat-app-shell):侧栏 + 主区外壳。
193
- * 桌面(≥768px)flex 同行;移动端(<768px)侧栏退出文档流
194
- * 变为覆盖抽屉,布局切换全部由媒体查询表达,JS 只管开合。
195
- * 高度填满父容器(height: 100%):嵌入任意定高容器即正确;
196
- * 父级无定高时退化为内容高度。standalone 顶层挂载时宿主
197
- * 容器定高(如 100dvh)属宿主职责(嵌入契约)。
218
+ * AppShell(spec: chat-app-shell / chat-on-ui-sidebar):外壳结构与
219
+ * 交互由 ui Sidebar 承担(data-slot 结构),chat 侧仅做令牌映射与
220
+ * 尺寸对齐——--pactor-chat-* 仍为皮肤唯一配置入口,暗色经覆盖链
221
+ * 自动生效。高度填满父容器(AppShell 传入 h-full min-h-0)。
198
222
  * ------------------------------------------------------------ */
199
223
 
200
224
  .pactor-chat-shell {
201
- display: flex;
202
- height: 100%;
203
225
  overflow: hidden;
204
226
  background: var(--pactor-chat-bg);
205
227
  color: var(--pactor-chat-fg);
206
228
  font-size: 14px;
207
229
  line-height: 1.6;
208
- }
209
-
210
- /* 桌面:侧栏为固定宽度 flex 列;背景独立令牌(决策 D5:比工作区
211
- * 暖白灰深一档),暗色经令牌覆盖自动生效 */
212
- .pactor-chat-shell__sidebar {
230
+ /* ui Sidebar 消费的 sidebar 系列语义令牌 → chat 令牌(映射手法与
231
+ .pactor-chat-chrome 一致) */
232
+ --sidebar: var(--pactor-chat-sidebar-bg);
233
+ --sidebar-foreground: var(--pactor-chat-fg);
234
+ --sidebar-border: var(--pactor-chat-border);
235
+ --sidebar-accent: var(--pactor-chat-muted);
236
+ --sidebar-accent-foreground: var(--pactor-chat-fg);
237
+ --sidebar-primary: var(--pactor-chat-primary);
238
+ --sidebar-primary-foreground: var(--pactor-chat-primary-fg);
239
+ --sidebar-ring: var(--pactor-chat-primary);
240
+ }
241
+
242
+ /* 侧栏宽度对齐令牌(覆盖 ui 的 w-60;icon rail 64px 与历史一致) */
243
+ .pactor-chat-shell [data-slot='sidebar'] {
213
244
  width: var(--pactor-chat-sidebar-width);
214
- flex-shrink: 0;
215
- border-right: 1px solid var(--pactor-chat-border);
216
- background: var(--pactor-chat-sidebar-bg);
217
245
  }
218
246
 
219
- /* 框架模式(提供 brand / sidebarFooter 时):品牌行 + 滚动区 + 底部区
220
- * 的 flex 列;未提供时侧栏直挂调用方内容(零渲染承诺) */
221
- .pactor-chat-shell__sidebar--framed {
222
- display: flex;
223
- flex-direction: column;
247
+ .pactor-chat-shell [data-slot='sidebar'][data-collapsed] {
248
+ width: 64px;
224
249
  }
225
250
 
226
- /* 桌面品牌行(决策 D3):brand 左对齐,折叠钮在右 */
227
- .pactor-chat-shell__sidebar-header {
228
- display: flex;
229
- align-items: center;
230
- justify-content: space-between;
231
- gap: 8px;
232
- flex-shrink: 0;
233
- padding: 12px 12px 4px;
234
- }
235
-
236
- .pactor-chat-shell__brand {
237
- flex: 1;
238
- min-width: 0;
239
- display: flex;
240
- align-items: center;
241
- gap: 8px;
251
+ /* 移动端顶栏高度与遮罩色对齐令牌 */
252
+ .pactor-chat-shell [data-slot='sidebar-topbar'] {
253
+ height: var(--pactor-chat-shell-topbar-height);
242
254
  }
243
255
 
244
- /* 侧栏滚动区:菜单(height:100% + 自有 overflow)之外的任意内容
245
- * 也可滚动;底部区固定不随滚动 */
246
- .pactor-chat-shell__sidebar-body {
247
- flex: 1;
248
- min-height: 0;
249
- overflow-y: auto;
256
+ .pactor-chat-shell [data-slot='sidebar-scrim'] {
257
+ background: var(--pactor-chat-shell-scrim);
250
258
  }
251
259
 
252
- .pactor-chat-shell__sidebar-footer {
253
- flex-shrink: 0;
254
- padding: 12px;
255
- border-top: 1px solid var(--pactor-chat-border);
260
+ /* 桌面折叠(icon rail,决策 D3):fallback 手写菜单降级为仅图标
261
+ * (DSL 路径的 ui Menu 经 useSidebarDrawer().collapsed 自感知,
262
+ * data-collapsed 仅在桌面折叠时出现,无需媒体查询) */
263
+ .pactor-chat-shell [data-slot='sidebar'][data-collapsed] .pactor-chat-menu {
264
+ padding-inline: 8px;
256
265
  }
257
266
 
258
- /* 桌面折叠(icon rail,决策 D3):收窄为图标栏——菜单只显图标,
259
- * label / badge / dot / 分组标题 / 底部区 / 品牌文案隐藏(图标以
260
- * title 属性兜底可访问名,见 ChatSidebarMenu)。仅桌面生效:移动端
261
- * 抽屉语义不受影响 */
262
- @media (min-width: 768px) {
263
- .pactor-chat-shell__sidebar--collapsed {
264
- width: 64px;
265
- }
266
-
267
- .pactor-chat-shell__sidebar--collapsed .pactor-chat-shell__sidebar-header {
268
- justify-content: center;
269
- padding-inline: 8px;
270
- }
271
-
272
- .pactor-chat-shell__sidebar--collapsed .pactor-chat-shell__brand {
273
- display: none;
274
- }
275
-
276
- .pactor-chat-shell__sidebar--collapsed .pactor-chat-menu {
277
- padding-inline: 8px;
278
- }
279
-
280
- .pactor-chat-shell__sidebar--collapsed .pactor-chat-menu__item {
281
- justify-content: center;
282
- padding-inline: 0;
283
- }
284
-
285
- .pactor-chat-shell__sidebar--collapsed .pactor-chat-menu__label,
286
- .pactor-chat-shell__sidebar--collapsed .pactor-chat-menu__badge,
287
- .pactor-chat-shell__sidebar--collapsed .pactor-chat-menu__dot,
288
- .pactor-chat-shell__sidebar--collapsed .pactor-chat-menu__group,
289
- .pactor-chat-shell__sidebar--collapsed .pactor-chat-shell__sidebar-footer {
290
- display: none;
291
- }
292
- }
293
-
294
- .pactor-chat-shell__main {
295
- flex: 1;
296
- min-width: 0;
297
- display: flex;
298
- flex-direction: column;
299
- overflow: hidden;
267
+ .pactor-chat-shell [data-slot='sidebar'][data-collapsed] .pactor-chat-menu__item {
268
+ justify-content: center;
269
+ padding-inline: 0;
300
270
  }
301
271
 
302
- /* 移动端顶栏:菜单按钮 + brand 插槽;桌面隐藏 */
303
- .pactor-chat-shell__topbar {
272
+ .pactor-chat-shell [data-slot='sidebar'][data-collapsed] .pactor-chat-menu__label,
273
+ .pactor-chat-shell [data-slot='sidebar'][data-collapsed] .pactor-chat-menu__badge,
274
+ .pactor-chat-shell [data-slot='sidebar'][data-collapsed] .pactor-chat-menu__dot,
275
+ .pactor-chat-shell [data-slot='sidebar'][data-collapsed] .pactor-chat-menu__group {
304
276
  display: none;
305
- align-items: center;
306
- gap: 4px;
307
- height: var(--pactor-chat-shell-topbar-height);
308
- flex-shrink: 0;
309
- padding: 0 8px;
310
- border-bottom: 1px solid var(--pactor-chat-border);
311
277
  }
312
278
 
313
- .pactor-chat-shell__menu svg {
314
- width: 18px;
315
- height: 18px;
316
- }
279
+ /* 对话列在 shell content 内的间距(content 区 padding 承担)与
280
+ * 面板打开时的贴右处理见下方 :has 规则 */
317
281
 
318
- .pactor-chat-shell__content {
319
- flex: 1;
320
- min-height: 0;
282
+ /* shell 主内容区:列布局 + 内边距(ui Sidebar 的 sidebar-content 仅
283
+ min-w-0 flex-1,对话列间距由这里承担) */
284
+ .pactor-chat-shell [data-slot='sidebar-content'] {
321
285
  display: flex;
322
286
  flex-direction: column;
323
287
  overflow: hidden;
324
288
  padding: 12px 16px 16px;
325
289
  }
326
290
 
327
- /* 对话列在 shell content 内的间距(content 区 padding 承担)与
328
- * 面板打开时的贴右处理见下方 :has 规则 */
329
-
330
291
  /* 产出物面板打开(spec: chat-artifact-panel):面板贴容器右缘——
331
292
  * 内容区右/上/下 padding 归零,面板 border-left 作分隔线 */
332
- .pactor-chat-shell__content:has(> .pactor-chat-inspector-host) {
293
+ .pactor-chat-shell [data-slot='sidebar-content']:has(> .pactor-chat-inspector-host) {
333
294
  padding-top: 0;
334
295
  padding-right: 0;
335
296
  padding-bottom: 0;
336
297
  }
337
298
 
338
- /* 抽屉遮罩:仅打开时渲染;桌面隐藏 */
339
- .pactor-chat-shell__scrim {
340
- display: none;
341
- position: fixed;
342
- inset: 0;
343
- z-index: 40;
344
- background: var(--pactor-chat-shell-scrim);
345
- }
346
-
347
- @media (max-width: 767px) {
348
- .pactor-chat-shell__sidebar {
349
- position: fixed;
350
- top: 0;
351
- bottom: 0;
352
- left: 0;
353
- z-index: 50;
354
- box-shadow: var(--pactor-chat-shadow-composer);
355
- transform: translateX(-100%);
356
- transition: transform 0.2s ease-out;
357
- }
358
-
359
- /* 移动端品牌维持顶栏现状(决策 D3):抽屉内不重复渲染品牌行 */
360
- .pactor-chat-shell__sidebar-header {
361
- display: none;
362
- }
363
-
364
- .pactor-chat-shell__sidebar[data-open='true'] {
365
- transform: translateX(0);
366
- }
367
-
368
- .pactor-chat-shell__scrim {
369
- display: block;
370
- }
371
-
372
- .pactor-chat-shell__topbar {
373
- display: flex;
374
- }
375
- }
376
-
377
299
  /* ------------------------------------------------------------
378
300
  * ArtifactPanel(spec: chat-artifact-panel,设计决策 D2):
379
301
  * 产出物预览面板。桌面(≥768px)为工作区右侧固定宽栏(flex 同行,
@@ -390,6 +312,7 @@
390
312
  width: 100%;
391
313
  min-height: 0;
392
314
  overflow: hidden;
315
+ background: var(--pactor-chat-bg);
393
316
  }
394
317
 
395
318
  /* 面板打开时 host 内的直子:AppShell 填满剩余空间;workspace 只缩不伸,
@@ -431,15 +354,6 @@
431
354
  touch-action: none;
432
355
  }
433
356
 
434
- .pactor-chat-inspector__resize:hover,
435
- .pactor-chat-inspector__resize:active {
436
- background: color-mix(
437
- in oklab,
438
- var(--pactor-chat-primary) 35%,
439
- transparent
440
- );
441
- }
442
-
443
357
  .pactor-chat-inspector__header {
444
358
  display: flex;
445
359
  align-items: center;
@@ -576,6 +490,10 @@
576
490
 
577
491
  .pactor-chat-artifact-card__open {
578
492
  flex-shrink: 0;
493
+ display: inline-flex;
494
+ align-items: center;
495
+ gap: 4px;
496
+ white-space: nowrap;
579
497
  padding: 4px 10px;
580
498
  border: 1px solid var(--pactor-chat-border);
581
499
  border-radius: var(--pactor-chat-radius-sm);
@@ -654,17 +572,6 @@
654
572
  align-items: center;
655
573
  }
656
574
 
657
- /* 未知图标名的占位圆点(不抛错的受控降级) */
658
- .pactor-chat-menu__icon-placeholder {
659
- width: 6px;
660
- height: 6px;
661
- margin: 0 4px;
662
- flex-shrink: 0;
663
- border-radius: 50%;
664
- background: var(--pactor-chat-muted-fg);
665
- opacity: 0.5;
666
- }
667
-
668
575
  .pactor-chat-menu__label {
669
576
  flex: 1;
670
577
  min-width: 0;
@@ -712,7 +619,8 @@
712
619
 
713
620
 
714
621
  /* 消息滚动区:overflow-anchor none 配合 useChatAutoScroll(防浏览器
715
- 滚动锚定与贴底跟随互相拉扯);上下 mask 渐隐 + 6px 细滚动条 */
622
+ 滚动锚定与贴底跟随互相拉扯);上下 mask 渐隐 + 6px 细滚动条;
623
+ 顶部留 24px 内边距(与 mask 渐隐带同宽,首条消息不贴顶) */
716
624
  .pactor-chat-messages {
717
625
  position: relative;
718
626
  flex: 1;
@@ -722,7 +630,7 @@
722
630
  display: flex;
723
631
  flex-direction: column;
724
632
  gap: 16px;
725
- padding: 4px 2px;
633
+ padding: 24px 2px 4px;
726
634
  scrollbar-width: thin;
727
635
  scrollbar-color: var(--pactor-chat-border) transparent;
728
636
  -webkit-mask-image: linear-gradient(
@@ -759,6 +667,21 @@
759
667
  background: var(--pactor-chat-muted-fg);
760
668
  }
761
669
 
670
+ /* Composer 承载坞(空态居中组与钉底位共用):padding-bottom 为钉底态
671
+ * 与页面底部留出空白;composerBottom 槽(未提供不渲染)居中弱提示 */
672
+ .pactor-chat-view__composer-dock {
673
+ width: 100%;
674
+ padding-bottom: 12px;
675
+ }
676
+
677
+ .pactor-chat-view__composer-bottom {
678
+ margin-top: 8px;
679
+ text-align: center;
680
+ color: var(--pactor-chat-muted-fg);
681
+ font-size: 12px;
682
+ line-height: 1.5;
683
+ }
684
+
762
685
  /* ============================================================
763
686
  * 3. 空状态(spec: chat-empty-state)
764
687
  * ============================================================ */
@@ -1105,7 +1028,7 @@ button.pactor-chat-trace__header:hover,
1105
1028
  display: flex;
1106
1029
  flex-direction: column;
1107
1030
  gap: 2px;
1108
- margin-left: 4px;
1031
+ /* margin-left: 4px; */
1109
1032
  }
1110
1033
 
1111
1034
  .pactor-chat-trace__entry-title {
@@ -1460,6 +1383,53 @@ button.pactor-chat-trace__header:hover,
1460
1383
  flex: 1;
1461
1384
  }
1462
1385
 
1386
+ /* Composer footer 槽(spec: chat-composer-slots / Composer footer 槽):
1387
+ 工具栏下方的自定义区域,结构与 ChatInput footer 一致(border-t 分隔) */
1388
+ .pactor-chat-composer__footer {
1389
+ display: flex;
1390
+ align-items: center;
1391
+ flex-wrap: wrap;
1392
+ gap: 6px;
1393
+ margin: 0 -14px -12px;
1394
+ padding: 8px 12px 0;
1395
+ border-top: 1px solid var(--pactor-chat-border);
1396
+ }
1397
+
1398
+ /* ------------------------------------------------------------
1399
+ * Composer DSL 呈现路径(spec: chat-composer-on-chatinput):
1400
+ * 盒模型让位 ChatInput 容器(边框 / 圆角 / 阴影 / 内边距由
1401
+ * ChatInput 承担,经 pactor-chat-chrome 令牌映射着色),本容器
1402
+ * 只保留布局与拖放态;focus 高亮由 ChatInput 自身 focus-within
1403
+ * ring 承担,避免双层描边。
1404
+ * ------------------------------------------------------------ */
1405
+ .pactor-chat-composer--dsl {
1406
+ padding: 0;
1407
+ border-color: transparent;
1408
+ background: transparent;
1409
+ box-shadow: none;
1410
+ }
1411
+
1412
+ .pactor-chat-composer--dsl:focus-within {
1413
+ border-color: transparent;
1414
+ }
1415
+
1416
+ .pactor-chat-composer--dsl.pactor-chat-composer--dragover {
1417
+ border-color: var(--pactor-chat-primary);
1418
+ border-radius: var(--pactor-chat-radius-xl);
1419
+ }
1420
+
1421
+ /* 输入高度下限 / 上限(与 ChatInput textarea 的 min-h-[60px] 一致;
1422
+ 自适应由 field-sizing-content 承担,超上限内部滚动) */
1423
+ .pactor-chat-composer--dsl [data-slot='chat-input'] textarea {
1424
+ min-height: 60px;
1425
+ max-height: 200px;
1426
+ }
1427
+
1428
+ /* header 槽空态(无附件无 chips)时收起包装,避免多余上间距 */
1429
+ .pactor-chat-composer--dsl [data-slot='chat-input'] > .px-3.pt-3:empty {
1430
+ display: none;
1431
+ }
1432
+
1463
1433
  /* ------------------------------------------------------------
1464
1434
  * 内建锚定弹层 AnchoredPopover(chat-builtin-features 设计决策 D3):
1465
1435
  * position: fixed,top/bottom/left 由 JS 按锚点计算(上方优先、
@@ -1558,28 +1528,70 @@ button.pactor-chat-trace__header:hover,
1558
1528
  font-size: 12.5px;
1559
1529
  }
1560
1530
 
1561
- /* 内建模型 chip(Composer 工具栏右端,toolbarEnd 槽内容之前) */
1531
+ /* 内建模型 chip(Composer 工具栏右端,toolbarEnd 槽内容之前):
1532
+ 无边框 ghost 形态(边框在工具栏里显脏),hover 以浅底反馈 */
1562
1533
  .pactor-chat-model-chip {
1563
1534
  display: inline-flex;
1564
1535
  align-items: center;
1565
1536
  gap: 4px;
1566
1537
  padding: 4px 10px;
1567
- border: 1px solid var(--pactor-chat-border);
1538
+ border: 1px solid transparent;
1568
1539
  border-radius: 999px;
1569
- background: var(--pactor-chat-card);
1540
+ background: transparent;
1570
1541
  color: var(--pactor-chat-muted-fg);
1571
1542
  font-size: 12.5px;
1572
1543
  cursor: pointer;
1573
1544
  transition:
1574
- border-color 0.15s ease,
1545
+ background-color 0.15s ease,
1575
1546
  color 0.15s ease;
1576
1547
  }
1577
1548
 
1578
1549
  .pactor-chat-model-chip:hover {
1579
- border-color: var(--pactor-chat-primary);
1550
+ background: var(--pactor-chat-muted);
1580
1551
  color: var(--pactor-chat-fg);
1581
1552
  }
1582
1553
 
1554
+ /* ModelSelect DSL 路径(spec: chat-on-ui-components):ui Select
1555
+ 收敛到工具栏节奏(触发器尺寸与 chip 相当,颜色经 chrome 令牌映射);
1556
+ 触发器同为无边框 ghost 形态(覆盖 shadcn Select 的表单边框/阴影),
1557
+ 与 fallback chip 视觉一致 */
1558
+ .pactor-chat-model-select {
1559
+ width: auto;
1560
+ min-width: 112px;
1561
+ font-size: 12.5px;
1562
+ }
1563
+
1564
+ .pactor-chat-model-select [data-slot='select-trigger'] {
1565
+ height: auto;
1566
+ gap: 4px;
1567
+ padding: 4px 10px;
1568
+ border-color: transparent;
1569
+ border-radius: 999px;
1570
+ box-shadow: none;
1571
+ color: var(--pactor-chat-muted-fg);
1572
+ font-size: 12.5px;
1573
+ transition:
1574
+ background-color 0.15s ease,
1575
+ color 0.15s ease;
1576
+ }
1577
+
1578
+ .pactor-chat-model-select [data-slot='select-trigger']:hover {
1579
+ background: var(--pactor-chat-muted);
1580
+ color: var(--pactor-chat-fg);
1581
+ }
1582
+
1583
+ /* 实心图标(spec: chat-icon-convergence):停止钮方形等需 fill 的
1584
+ 图标(ui Icon 走描边体系,fill 经 CSS 覆盖 lucide svg 的 fill=none) */
1585
+ .pactor-chat-icon-fill {
1586
+ fill: currentColor;
1587
+ }
1588
+
1589
+ /* ArtifactPanel 标题栏 DSL 路径(spec: chat-on-ui-components):
1590
+ chrome 容器 display:contents,DSL Flex 占满标题行 */
1591
+ .pactor-chat-inspector__header-dsl {
1592
+ width: 100%;
1593
+ }
1594
+
1583
1595
  .pactor-chat-model-chip__label {
1584
1596
  max-width: 160px;
1585
1597
  overflow: hidden;