@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/README.md +3 -2
- package/dist/index.cjs +1468 -592
- package/dist/index.d.cts +111 -23
- package/dist/index.d.ts +111 -23
- package/dist/index.js +1441 -596
- package/package.json +7 -8
- package/styles.css +192 -180
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pactor-app/chat",
|
|
3
|
-
"version": "1.
|
|
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
|
-
"
|
|
53
|
-
"@pactor-app/markdown": "1.
|
|
54
|
-
"@pactor-app/
|
|
55
|
-
"@pactor-app/
|
|
56
|
-
"@pactor-app/
|
|
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
|
-
*
|
|
191
|
-
*
|
|
192
|
-
|
|
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
|
-
|
|
211
|
-
|
|
212
|
-
|
|
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
|
-
|
|
220
|
-
|
|
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
|
-
/*
|
|
227
|
-
.pactor-chat-
|
|
228
|
-
|
|
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
|
-
|
|
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
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
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
|
-
|
|
259
|
-
|
|
260
|
-
|
|
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
|
-
|
|
303
|
-
.pactor-chat-
|
|
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
|
-
|
|
314
|
-
|
|
315
|
-
height: 18px;
|
|
316
|
-
}
|
|
279
|
+
/* 对话列在 shell content 内的间距(content 区 padding 承担)与
|
|
280
|
+
* 面板打开时的贴右处理见下方 :has 规则 */
|
|
317
281
|
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
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-
|
|
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:
|
|
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
|
|
1538
|
+
border: 1px solid transparent;
|
|
1568
1539
|
border-radius: 999px;
|
|
1569
|
-
background:
|
|
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
|
-
|
|
1545
|
+
background-color 0.15s ease,
|
|
1575
1546
|
color 0.15s ease;
|
|
1576
1547
|
}
|
|
1577
1548
|
|
|
1578
1549
|
.pactor-chat-model-chip:hover {
|
|
1579
|
-
|
|
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;
|