@pactor-app/chat 1.1.0 → 1.3.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.1.0",
3
+ "version": "1.3.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
- "@pactor-app/ui": "1.1.0",
53
- "@pactor-app/permission": "1.1.0",
54
- "@pactor-app/markdown": "1.1.0",
55
- "@pactor-app/core": "1.1.0",
56
- "@pactor-app/runtime": "1.1.0"
52
+ "@pactor-app/core": "1.3.0",
53
+ "@pactor-app/ui": "1.3.0",
54
+ "@pactor-app/permission": "1.3.0",
55
+ "@pactor-app/markdown": "1.3.0",
56
+ "@pactor-app/runtime": "1.3.0"
57
57
  },
58
58
  "peerDependencies": {
59
59
  "react": ">=18"
package/styles.css CHANGED
@@ -3,9 +3,13 @@
3
3
  *
4
4
  * 技术选型参考 DeepTutor web:语义 CSS 变量 + 语义 class,无 antd。
5
5
  *
6
- * 换肤契约(与 pactor-ui-radix 一致):
7
- * 1. 覆盖 CSS 变量(在本样式表之后注入 `--pactor-chat-primary: …;` 等);
6
+ * 换肤契约(与 @pactor-app/ui 一致):
7
+ * 1. `--pactor-chat-*` 颜色令牌的默认值经 `var(--语义令牌, <chat 默认>)`
8
+ * 桥接 pactor-ui 语义令牌(--background/--primary/…)——皮肤 CSS 覆盖
9
+ * 语义令牌时 chat 结构件自动跟随;也可直接覆盖 `--pactor-chat-*` 精调;
8
10
  * 2. 内置暗色:`<html data-pactor-theme="dark">`(或挂在任意祖先容器上);
11
+ * 不设置时跟随系统 prefers-color-scheme(三态:light / dark / 跟随系统)。
12
+ * 颜色令牌无需暗色覆盖块(语义令牌自动翻转),仅投影/遮罩有暗色覆盖;
9
13
  * 3. 直接覆盖 `.pactor-chat-*` class。
10
14
  *
11
15
  * 使用:import 'pactor-chat/styles.css';
@@ -21,21 +25,35 @@
21
25
  .pactor-chat-workspace,
22
26
  .pactor-chat-inspector,
23
27
  .pactor-chat-notice {
24
- --pactor-chat-bg: #f7f6f4;
25
- --pactor-chat-sidebar-bg: #efedea;
26
- --pactor-chat-fg: #1a1d26;
27
- --pactor-chat-muted: #f4f4f6;
28
- --pactor-chat-muted-fg: #6b7180;
29
- --pactor-chat-card: #ffffff;
30
- --pactor-chat-border: #e6e7eb;
31
- --pactor-chat-primary: #3c47dd;
32
- --pactor-chat-primary-fg: #ffffff;
33
- --pactor-chat-danger: #d4380d;
34
- --pactor-chat-danger-bg: #fff2f0;
35
- --pactor-chat-success: #389e0d;
36
- --pactor-chat-user-bubble-bg: #eef0fe;
37
- --pactor-chat-user-bubble-border: rgb(60 71 221 / 35%);
38
- --pactor-chat-code-bg: #f6f7f9;
28
+ /* 颜色令牌默认值桥接 pactor-ui 语义令牌(皮肤覆盖语义令牌时自动跟随),
29
+ 逗号后为 pactor-ui 缺席时的 chat 品牌默认 */
30
+ --pactor-chat-bg: var(--background, #f7f6f4);
31
+ --pactor-chat-sidebar-bg: var(--sidebar, #efedea);
32
+ --pactor-chat-fg: var(--foreground, #1a1d26);
33
+ --pactor-chat-muted: var(--muted, #f4f4f6);
34
+ --pactor-chat-muted-fg: var(--muted-foreground, #6b7180);
35
+ --pactor-chat-card: var(--card, #ffffff);
36
+ --pactor-chat-border: var(--border, #e6e7eb);
37
+ --pactor-chat-primary: var(--primary, #3c47dd);
38
+ --pactor-chat-primary-fg: var(--primary-foreground, #ffffff);
39
+ --pactor-chat-danger: var(--destructive, #d4380d);
40
+ --pactor-chat-danger-bg: color-mix(
41
+ in oklab,
42
+ var(--destructive, #d4380d) 8%,
43
+ var(--background, #fff)
44
+ );
45
+ --pactor-chat-success: var(--success, #389e0d);
46
+ --pactor-chat-user-bubble-bg: color-mix(
47
+ in oklab,
48
+ var(--primary, #3c47dd) 7%,
49
+ var(--background, #fff)
50
+ );
51
+ --pactor-chat-user-bubble-border: color-mix(
52
+ in oklab,
53
+ var(--primary, #3c47dd) 35%,
54
+ transparent
55
+ );
56
+ --pactor-chat-code-bg: var(--muted, #f6f7f9);
39
57
  /* 旧通用圆角令牌(保留兼容);新组件改用下方圆角阶梯 */
40
58
  --pactor-chat-radius: 12px;
41
59
  /* 圆角阶梯:sm 控件 / md 卡片 / lg 气泡 / xl composer */
@@ -68,13 +86,13 @@
68
86
  height: 100%;
69
87
  gap: 12px;
70
88
  color: var(--pactor-chat-fg);
71
- background: var(--pactor-chat-bg);
72
89
  font-size: 14px;
73
90
  line-height: 1.6;
74
91
  }
75
92
 
76
93
  /* 暗色皮肤:data-pactor-theme="dark"(html 或任意祖先容器)。
77
- 只覆盖令牌(颜色/投影),组件规则不区分主题。 */
94
+ 颜色令牌经 var() 桥接 pactor-ui 语义令牌,暗色自动翻转,无需覆盖;
95
+ 这里只保留投影与遮罩的暗色值(组件规则不区分主题)。 */
78
96
  [data-pactor-theme='dark'] .pactor-chat-view,
79
97
  [data-pactor-theme='dark'] .pactor-chat-layout,
80
98
  [data-pactor-theme='dark'] .pactor-chat-shell,
@@ -85,28 +103,27 @@
85
103
  .pactor-chat-shell[data-pactor-theme='dark'],
86
104
  .pactor-chat-workspace[data-pactor-theme='dark'],
87
105
  .pactor-chat-notice[data-pactor-theme='dark'] {
88
- --pactor-chat-bg: #14161c;
89
- --pactor-chat-sidebar-bg: #1b1e26;
90
- --pactor-chat-fg: #e4e6ee;
91
- --pactor-chat-muted: #1e2129;
92
- --pactor-chat-muted-fg: #8b90a0;
93
- --pactor-chat-card: #1a1d24;
94
- --pactor-chat-border: #2c3038;
95
- --pactor-chat-primary: #5b66f0;
96
- --pactor-chat-primary-fg: #ffffff;
97
- --pactor-chat-danger: #e8690c;
98
- --pactor-chat-danger-bg: #2b1d16;
99
- --pactor-chat-success: #49aa19;
100
- --pactor-chat-user-bubble-bg: #262a45;
101
- --pactor-chat-user-bubble-border: rgb(91 102 240 / 45%);
102
- --pactor-chat-code-bg: #1e2129;
103
106
  --pactor-chat-shadow-sm: 0 1px 2px rgb(0 0 0 / 35%);
104
107
  --pactor-chat-shadow-composer:
105
108
  0 1px 2px rgb(0 0 0 / 4%),
106
109
  0 12px 32px -10px rgb(0 0 0 / 55%);
107
110
  --pactor-chat-shell-scrim: rgb(0 0 0 / 55%);
108
- --pactor-chat-font-display: 'Songti SC', 'Noto Serif SC', Georgia,
109
- 'Times New Roman', serif;
111
+ }
112
+
113
+ /* 系统偏好暗色兜底:未显式设置 data-pactor-theme 时跟随系统
114
+ (与上方 [data-pactor-theme='dark'] 块一致——仅投影与遮罩) */
115
+ @media (prefers-color-scheme: dark) {
116
+ :root:not([data-pactor-theme='light']):not([data-pactor-theme='dark']) .pactor-chat-view,
117
+ :root:not([data-pactor-theme='light']):not([data-pactor-theme='dark']) .pactor-chat-layout,
118
+ :root:not([data-pactor-theme='light']):not([data-pactor-theme='dark']) .pactor-chat-shell,
119
+ :root:not([data-pactor-theme='light']):not([data-pactor-theme='dark']) .pactor-chat-workspace,
120
+ :root:not([data-pactor-theme='light']):not([data-pactor-theme='dark']) .pactor-chat-notice {
121
+ --pactor-chat-shadow-sm: 0 1px 2px rgb(0 0 0 / 35%);
122
+ --pactor-chat-shadow-composer:
123
+ 0 1px 2px rgb(0 0 0 / 4%),
124
+ 0 12px 32px -10px rgb(0 0 0 / 55%);
125
+ --pactor-chat-shell-scrim: rgb(0 0 0 / 55%);
126
+ }
110
127
  }
111
128
 
112
129
  /* ------------------------------------------------------------
@@ -183,7 +200,6 @@
183
200
  width: 100%;
184
201
  max-width: var(--pactor-chat-content-width);
185
202
  margin-inline: auto;
186
- background: var(--pactor-chat-bg);
187
203
  color: var(--pactor-chat-fg);
188
204
  font-size: 14px;
189
205
  line-height: 1.6;
@@ -314,6 +330,7 @@
314
330
  width: 100%;
315
331
  min-height: 0;
316
332
  overflow: hidden;
333
+ background: var(--pactor-chat-bg);
317
334
  }
318
335
 
319
336
  /* 面板打开时 host 内的直子:AppShell 填满剩余空间;workspace 只缩不伸,
@@ -620,7 +637,8 @@
620
637
 
621
638
 
622
639
  /* 消息滚动区:overflow-anchor none 配合 useChatAutoScroll(防浏览器
623
- 滚动锚定与贴底跟随互相拉扯);上下 mask 渐隐 + 6px 细滚动条 */
640
+ 滚动锚定与贴底跟随互相拉扯);上下 mask 渐隐 + 6px 细滚动条;
641
+ 顶部留 24px 内边距(与 mask 渐隐带同宽,首条消息不贴顶) */
624
642
  .pactor-chat-messages {
625
643
  position: relative;
626
644
  flex: 1;
@@ -630,7 +648,7 @@
630
648
  display: flex;
631
649
  flex-direction: column;
632
650
  gap: 16px;
633
- padding: 4px 2px;
651
+ padding: 24px 2px 4px;
634
652
  scrollbar-width: thin;
635
653
  scrollbar-color: var(--pactor-chat-border) transparent;
636
654
  -webkit-mask-image: linear-gradient(
@@ -1085,6 +1103,14 @@ button.pactor-chat-trace__header:hover,
1085
1103
  color: var(--pactor-chat-muted-fg);
1086
1104
  }
1087
1105
 
1106
+ /* 流式期间的纯文本正文(结束后回切 markdown 渲染) */
1107
+ .pactor-chat-thinking__text {
1108
+ white-space: pre-wrap;
1109
+ word-break: break-word;
1110
+ font-size: 13px;
1111
+ line-height: 1.6;
1112
+ }
1113
+
1088
1114
  .pactor-chat-thinking__body .pactor-markdown > :first-child {
1089
1115
  margin-top: 0;
1090
1116
  }