@hgt-weprotalk/mira-client 0.1.8 → 0.1.9

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.dev.md CHANGED
@@ -1,194 +1,194 @@
1
- # mira-client(内部开发说明)
2
-
3
- > **仓库维护者请看本文档。** npm 包页面与 GitHub 首页默认展示 [`README.md`](./README.md)(对外接入说明)。
4
-
5
- Mira 用户侧 **Chat Widget(聊天挂件)** 前端工程。
6
-
7
- 本仓库用 **React 19 + Vite 8 + TypeScript** 搭建开发基座,用于本地预览与联调;**生产交付物**通过 npm 包 `@hgt-weprotalk/mira-client` 发布,宿主(Next.js 独立站)按场景选择三种接入方式之一。
8
-
9
- 需求文档见 [docs/mira-v1/](./docs/mira-v1/README.md)。
10
-
11
- | 层级 | 说明 |
12
- |------|------|
13
- | **npm 交付物** | `@hgt-weprotalk/mira-client` — React 库 + Embed 静态资源(`dist/` 仅发布 npm,不进 GitHub) |
14
- | **基座(Demo Shell)** | `Layout`、`pages/`、`index.html` / `use-cases*.html` — 仅开发预览,非生产交付 |
15
- | **服务层** | `src/services/` — Java Agent API、Zendesk、反馈、转人工等适配 |
16
-
17
- ## 架构概览
18
-
19
- ```
20
- ┌──────────────────────────────────────────────────────────┐
21
- │ Demo Shell(本地预览) │
22
- │ 首页:React 组件直接挂载 ChatWidget(= 方式 1 生产接入) │
23
- │ 用例A / 用例B:模拟独立站 script / iframe 接入 │
24
- └──────────────────────────────────────────────────────────┘
25
-
26
- ┌──────────────────────────────────────────────────────────┐
27
- │ Chat Widget │
28
- │ ChatWidget → useHandoff / useChat → chatApi │
29
- │ ↓ │
30
- │ agentAdapter ←→ /client/agentChat/* (SSE + REST) │
31
- │ zendesk/* ←→ Smooch Web Messenger(转人工) │
32
- └──────────────────────────────────────────────────────────┘
33
- ```
34
-
35
- **分层原则**:UI / Hook 只依赖 `services/` 门面(如 `chatApi`),切换后端时改 adapter 与导出入口即可,Widget UI 无需改动。
36
-
37
- ## 宿主接入(三种方式)
38
-
39
- 安装 npm 包:
40
-
41
- ```bash
42
- pnpm add @hgt-weprotalk/mira-client
43
- ```
44
-
45
- | # | 方式 | 适用 | 说明 |
46
- |---|------|------|------|
47
- | **1** | **React 组件** | Next.js App Router(**推荐**) | `import { ChatWidget } from "@hgt-weprotalk/mira-client"`,与本地 Home 页一致 |
48
- | **2** | **Script Embed(用例 A)** | launcher 弹窗、非 React 页 | 同步 `dist/embed/` → `public/embed/`,加载 `chat-widget.js` + `mira-chat-host.js` |
49
- | **3** | **Inline iframe(用例 B)** | 宿主自控布局(抽屉/侧栏) | 自行放置 `<iframe src="/embed/frame.html?...">` + host bridge |
50
-
51
- 详细文档:[20-npm包发布与三种接入方式](./docs/mira-v1/chat-widget/20-npm包发布与三种接入方式.md) · [19-宿主SDK接口](./docs/mira-v1/chat-widget/19-宿主SDK接口.md)(Embed 模式 SDK)
52
-
53
- ### 方式 1 — React 组件(Next.js 推荐)
54
-
55
- 参考 `src/reference/nextjs/MiraChatLauncher.tsx`(Valerion 独立站真实接入):
56
-
57
- ```tsx
58
- "use client";
59
-
60
- import { ChatWidget, type Locale } from "@hgt-weprotalk/mira-client";
61
- import "@hgt-weprotalk/mira-client/style.css";
62
-
63
- export function MiraChat({ site = "en" }: { site?: string }) {
64
- return (
65
- <ChatWidget
66
- agentName="after_sales_assistant"
67
- site={site}
68
- apiBaseUrl={process.env.NEXT_PUBLIC_AGENT_API_BASE ?? "/prod-api"}
69
- locale={"en-US" satisfies Locale}
70
- />
71
- );
72
- }
73
- ```
74
-
75
- ### 方式 2 — Script Embed(用例 A:launcher 弹窗)
76
-
77
- npm 安装后,将 embed 资源同步至 `public/embed/`(推荐 postinstall,见 [20 文档 §1.2](./docs/mira-v1/chat-widget/20-npm包发布与三种接入方式.md#12-方式-2--script-embed用例-alauncher-弹窗)),然后:
78
-
79
- ```html
80
- <script
81
- src="/embed/chat-widget.js"
82
- data-agent-name="after_sales_assistant"
83
- data-site="en"
84
- defer
85
- ></script>
86
- <script src="/embed/mira-chat-host.js" defer></script>
87
- ```
88
-
89
- 用例 A 采用**分离渲染**:宿主页 `chat-widget.js` 负责右下角 launcher 按钮,iframe 内仅渲染聊天面板(`panelOnly`)。本地演示:[use-cases.html](./use-cases.html)
90
-
91
- ### 方式 3 — Inline iframe(用例 B)
92
-
93
- ```html
94
- <iframe
95
- id="mira-chat-inline-frame"
96
- src="/embed/frame.html?agentName=after_sales_assistant&site=en&parentOrigin={ORIGIN}&layout=inline"
97
- style="width: 100%; height: 100%; min-height: 700px; border: 0"
98
- allow="clipboard-write"
99
- ></iframe>
100
- <script src="/embed/mira-chat-host.js" defer></script>
101
- ```
102
-
103
- 本地演示:[use-cases-b.html](./use-cases-b.html)
104
-
105
- ### `window.MiraChat` SDK(方式 2 / 3)
106
-
107
- | 方法 | 说明 |
108
- |------|------|
109
- | `bindUser({ loginUserId, userNickname? })` | 登录后绑定 visitor 历史(`POST /bindUser`) |
110
- | `setContext({ loginUserId?, userNickname?, product? })` | 传递用户 / 商品上下文 |
111
- | `open()` / `close()` | 打开 / 关闭聊天容器 |
112
- | `on("ready" \| "navigate" \| "error", handler)` | 监听 iframe 事件 |
113
-
114
- 方式 1 直接使用 `setMiraChatUser` / `bindMiraChatUser` 等 import,无需 `window.MiraChat`。
115
-
116
- ## 目录结构
117
-
118
- ```
119
- mira-client/
120
- ├── README.md # npm / GitHub 首页(对外)
121
- ├── README.dev.md # 本文件(内部)
122
- ├── index.html # 首页基座(方式 1 预览)
123
- ├── use-cases.html # 用例A:launcher 弹窗(方式 2)
124
- ├── use-cases-b.html # 用例B:inline iframe(方式 3)
125
- ├── vite.config.ts # 开发基座 + /agent-api 代理
126
- ├── vite.lib.config.ts # npm 库构建
127
- ├── vite.embed*.config.ts # embed 脚本构建
128
- │
129
- ├── src/
130
- │ ├── index.ts # ★ npm 包公共入口
131
- │ ├── components/chat-widget/ # ★ Widget UI 源码
132
- │ ├── embed/ # launcher / host-bridge / frame 源码
133
- │ ├── reference/nextjs/ # Next.js 宿主接入参考
134
- │ ├── hooks/ # useChat、useHandoff、useZendesk
135
- │ ├── services/ # chat、zendesk、feedback、handoff
136
- │ └── pages/ # Home、UseCases、UseCasesB(基座)
137
- │
138
- ├── dist/ # 构建产物(.gitignore,npm publish 时上传)
139
- └── docs/mira-v1/ # 需求与接口文档
140
- ```
141
-
142
- ## 配置与环境变量
143
-
144
- **重要**:npm 包与 embed 交付物**不依赖**宿主项目的 `.env`。生产环境由独立站通过 **React props**(方式 1)或 **script `data-*` / iframe URL 参数**(方式 2/3)传入运行时配置;本仓库 `.env` **仅用于本地 Demo Shell 开发联调**。
145
-
146
- ### 开发 vs 生产
147
-
148
- | 配置项 | 本地开发(`.env`) | 生产(宿主传参) |
149
- |--------|-------------------|------------------|
150
- | Agent 名称 | `VITE_AGENT_NAME` | `agentName` prop 或 `data-agent-name` / URL `agentName` |
151
- | 站点 | `VITE_AGENT_SITE` | `site` prop 或 `data-site` / URL `site` |
152
- | Agent API 前缀 | `VITE_AGENT_API_BASE` | `apiBaseUrl` prop 或 `data-api-base-url` / URL `apiBaseUrl` |
153
- | 代理到 Java 后端 | `VITE_AGENT_API_TARGET`(仅 Vite dev) | **不适用** — 由宿主自行处理 |
154
-
155
- ### 本地开发 `.env`(示例)
156
-
157
- ```env
158
- VITE_AGENT_NAME=after_sales_assistant
159
- VITE_AGENT_SITE=en
160
- VITE_AGENT_API_BASE=/agent-api
161
- VITE_AGENT_API_TARGET=http://localhost:8080
162
- ```
163
-
164
- ### 生产:后端请求由宿主负责
165
-
166
- Widget 内所有 Agent API 请求发往 **`{apiBaseUrl}/client/agentChat/*`**。**如何连到 Java C 端 API 完全由独立站决定**(同域名反代 / BFF / 绝对路径等)。
167
-
168
- ## 常用命令
169
-
170
- ```bash
171
- npm install # 安装依赖
172
- npm run dev # 启动开发服务器
173
- npm run build # 类型检查 + 库构建 + embed 构建
174
- npm run build:lib # 仅 React 库
175
- npm run build:embed # 仅 embed 脚本
176
- npm run typecheck # TypeScript 检查
177
- npm run lint # oxlint
178
- npm run test:chat-handoff # 转人工 Playwright 冒烟
179
- ```
180
-
181
- **发版(维护者):**
182
-
183
- ```bash
184
- node scripts/release-version.mjs # bump → npm publish → tag → push
185
- ```
186
-
187
- **用例页本地验证**:先 `npm run build:embed`,再 `npm run dev`,访问 `/use-cases.html` 或 `/use-cases-b.html`。
188
-
189
- ## 生产部署注意
190
-
191
- - 宿主通过 `pnpm add @hgt-weprotalk/mira-client@x.y.z` 安装;`dist/` 在 npm 包内,不在 GitHub 仓库。
192
- - Next.js 推荐 **方式 1**(React 组件),接入与本地 Home 页一致。
193
- - 方式 2/3 需 postinstall 将 `node_modules/@hgt-weprotalk/mira-client/dist/embed/` 同步至 `public/embed/`。
194
- - `agentName`、`site`、`apiBaseUrl` 由宿主在接入时传参,**不要在生产依赖本仓库 `.env`**。
1
+ # mira-client(内部开发说明)
2
+
3
+ > **仓库维护者请看本文档。** npm 包页面与 GitHub 首页默认展示 [`README.md`](./README.md)(对外接入说明)。
4
+
5
+ Mira 用户侧 **Chat Widget(聊天挂件)** 前端工程。
6
+
7
+ 本仓库用 **React 19 + Vite 8 + TypeScript** 搭建开发基座,用于本地预览与联调;**生产交付物**通过 npm 包 `@hgt-weprotalk/mira-client` 发布,宿主(Next.js 独立站)按场景选择三种接入方式之一。
8
+
9
+ 需求文档见 [docs/mira-v1/](./docs/mira-v1/README.md)。
10
+
11
+ | 层级 | 说明 |
12
+ |------|------|
13
+ | **npm 交付物** | `@hgt-weprotalk/mira-client` — React 库 + Embed 静态资源(`dist/` 仅发布 npm,不进 GitHub) |
14
+ | **基座(Demo Shell)** | `Layout`、`pages/`、`index.html` / `use-cases*.html` — 仅开发预览,非生产交付 |
15
+ | **服务层** | `src/services/` — Java Agent API、Zendesk、反馈、转人工等适配 |
16
+
17
+ ## 架构概览
18
+
19
+ ```
20
+ ┌──────────────────────────────────────────────────────────┐
21
+ │ Demo Shell(本地预览) │
22
+ │ 首页:React 组件直接挂载 ChatWidget(= 方式 1 生产接入) │
23
+ │ 用例A / 用例B:模拟独立站 script / iframe 接入 │
24
+ └──────────────────────────────────────────────────────────┘
25
+
26
+ ┌──────────────────────────────────────────────────────────┐
27
+ │ Chat Widget │
28
+ │ ChatWidget → useHandoff / useChat → chatApi │
29
+ │ ↓ │
30
+ │ agentAdapter ←→ /client/agentChat/* (SSE + REST) │
31
+ │ zendesk/* ←→ Smooch Web Messenger(转人工) │
32
+ └──────────────────────────────────────────────────────────┘
33
+ ```
34
+
35
+ **分层原则**:UI / Hook 只依赖 `services/` 门面(如 `chatApi`),切换后端时改 adapter 与导出入口即可,Widget UI 无需改动。
36
+
37
+ ## 宿主接入(三种方式)
38
+
39
+ 安装 npm 包:
40
+
41
+ ```bash
42
+ pnpm add @hgt-weprotalk/mira-client
43
+ ```
44
+
45
+ | # | 方式 | 适用 | 说明 |
46
+ |---|------|------|------|
47
+ | **1** | **React 组件** | Next.js App Router(**推荐**) | `import { ChatWidget } from "@hgt-weprotalk/mira-client"`,与本地 Home 页一致 |
48
+ | **2** | **Script Embed(用例 A)** | launcher 弹窗、非 React 页 | 同步 `dist/embed/` → `public/embed/`,加载 `chat-widget.js` + `mira-chat-host.js` |
49
+ | **3** | **Inline iframe(用例 B)** | 宿主自控布局(抽屉/侧栏) | 自行放置 `<iframe src="/embed/frame.html?...">` + host bridge |
50
+
51
+ 详细文档:[20-npm包发布与三种接入方式](./docs/mira-v1/chat-widget/20-npm包发布与三种接入方式.md) · [19-宿主SDK接口](./docs/mira-v1/chat-widget/19-宿主SDK接口.md)(Embed 模式 SDK)
52
+
53
+ ### 方式 1 — React 组件(Next.js 推荐)
54
+
55
+ 参考 `src/reference/nextjs/MiraChatLauncher.tsx`(Valerion 独立站真实接入):
56
+
57
+ ```tsx
58
+ "use client";
59
+
60
+ import { ChatWidget, type Locale } from "@hgt-weprotalk/mira-client";
61
+ import "@hgt-weprotalk/mira-client/style.css";
62
+
63
+ export function MiraChat({ site = "en" }: { site?: string }) {
64
+ return (
65
+ <ChatWidget
66
+ agentName="after_sales_assistant"
67
+ site={site}
68
+ apiBaseUrl={process.env.NEXT_PUBLIC_AGENT_API_BASE ?? "/prod-api"}
69
+ locale={"en-US" satisfies Locale}
70
+ />
71
+ );
72
+ }
73
+ ```
74
+
75
+ ### 方式 2 — Script Embed(用例 A:launcher 弹窗)
76
+
77
+ npm 安装后,将 embed 资源同步至 `public/embed/`(推荐 postinstall,见 [20 文档 §1.2](./docs/mira-v1/chat-widget/20-npm包发布与三种接入方式.md#12-方式-2--script-embed用例-alauncher-弹窗)),然后:
78
+
79
+ ```html
80
+ <script
81
+ src="/embed/chat-widget.js"
82
+ data-agent-name="after_sales_assistant"
83
+ data-site="en"
84
+ defer
85
+ ></script>
86
+ <script src="/embed/mira-chat-host.js" defer></script>
87
+ ```
88
+
89
+ 用例 A 采用**分离渲染**:宿主页 `chat-widget.js` 负责右下角 launcher 按钮,iframe 内仅渲染聊天面板(`panelOnly`)。本地演示:[use-cases.html](./use-cases.html)
90
+
91
+ ### 方式 3 — Inline iframe(用例 B)
92
+
93
+ ```html
94
+ <iframe
95
+ id="mira-chat-inline-frame"
96
+ src="/embed/frame.html?agentName=after_sales_assistant&site=en&parentOrigin={ORIGIN}&layout=inline"
97
+ style="width: 100%; height: 100%; min-height: 700px; border: 0"
98
+ allow="clipboard-write"
99
+ ></iframe>
100
+ <script src="/embed/mira-chat-host.js" defer></script>
101
+ ```
102
+
103
+ 本地演示:[use-cases-b.html](./use-cases-b.html)
104
+
105
+ ### `window.MiraChat` SDK(方式 2 / 3)
106
+
107
+ | 方法 | 说明 |
108
+ |------|------|
109
+ | `bindUser({ loginUserId, userNickname? })` | 登录后绑定 visitor 历史(`POST /bindUser`) |
110
+ | `setContext({ loginUserId?, userNickname?, product? })` | 传递用户 / 商品上下文 |
111
+ | `open()` / `close()` | 打开 / 关闭聊天容器 |
112
+ | `on("ready" \| "navigate" \| "error", handler)` | 监听 iframe 事件 |
113
+
114
+ 方式 1 直接使用 `setMiraChatUser` / `bindMiraChatUser` 等 import,无需 `window.MiraChat`。
115
+
116
+ ## 目录结构
117
+
118
+ ```
119
+ mira-client/
120
+ ├── README.md # npm / GitHub 首页(对外)
121
+ ├── README.dev.md # 本文件(内部)
122
+ ├── index.html # 首页基座(方式 1 预览)
123
+ ├── use-cases.html # 用例A:launcher 弹窗(方式 2)
124
+ ├── use-cases-b.html # 用例B:inline iframe(方式 3)
125
+ ├── vite.config.ts # 开发基座 + /agent-api 代理
126
+ ├── vite.lib.config.ts # npm 库构建
127
+ ├── vite.embed*.config.ts # embed 脚本构建
128
+ │
129
+ ├── src/
130
+ │ ├── index.ts # ★ npm 包公共入口
131
+ │ ├── components/chat-widget/ # ★ Widget UI 源码
132
+ │ ├── embed/ # launcher / host-bridge / frame 源码
133
+ │ ├── reference/nextjs/ # Next.js 宿主接入参考
134
+ │ ├── hooks/ # useChat、useHandoff、useZendesk
135
+ │ ├── services/ # chat、zendesk、feedback、handoff
136
+ │ └── pages/ # Home、UseCases、UseCasesB(基座)
137
+ │
138
+ ├── dist/ # 构建产物(.gitignore,npm publish 时上传)
139
+ └── docs/mira-v1/ # 需求与接口文档
140
+ ```
141
+
142
+ ## 配置与环境变量
143
+
144
+ **重要**:npm 包与 embed 交付物**不依赖**宿主项目的 `.env`。生产环境由独立站通过 **React props**(方式 1)或 **script `data-*` / iframe URL 参数**(方式 2/3)传入运行时配置;本仓库 `.env` **仅用于本地 Demo Shell 开发联调**。
145
+
146
+ ### 开发 vs 生产
147
+
148
+ | 配置项 | 本地开发(`.env`) | 生产(宿主传参) |
149
+ |--------|-------------------|------------------|
150
+ | Agent 名称 | `VITE_AGENT_NAME` | `agentName` prop 或 `data-agent-name` / URL `agentName` |
151
+ | 站点 | `VITE_AGENT_SITE` | `site` prop 或 `data-site` / URL `site` |
152
+ | Agent API 前缀 | `VITE_AGENT_API_BASE` | `apiBaseUrl` prop 或 `data-api-base-url` / URL `apiBaseUrl` |
153
+ | 代理到 Java 后端 | `VITE_AGENT_API_TARGET`(仅 Vite dev) | **不适用** — 由宿主自行处理 |
154
+
155
+ ### 本地开发 `.env`(示例)
156
+
157
+ ```env
158
+ VITE_AGENT_NAME=after_sales_assistant
159
+ VITE_AGENT_SITE=en
160
+ VITE_AGENT_API_BASE=/agent-api
161
+ VITE_AGENT_API_TARGET=http://localhost:8080
162
+ ```
163
+
164
+ ### 生产:后端请求由宿主负责
165
+
166
+ Widget 内所有 Agent API 请求发往 **`{apiBaseUrl}/client/agentChat/*`**。**如何连到 Java C 端 API 完全由独立站决定**(同域名反代 / BFF / 绝对路径等)。
167
+
168
+ ## 常用命令
169
+
170
+ ```bash
171
+ npm install # 安装依赖
172
+ npm run dev # 启动开发服务器
173
+ npm run build # 类型检查 + 库构建 + embed 构建
174
+ npm run build:lib # 仅 React 库
175
+ npm run build:embed # 仅 embed 脚本
176
+ npm run typecheck # TypeScript 检查
177
+ npm run lint # oxlint
178
+ npm run test:chat-handoff # 转人工 Playwright 冒烟
179
+ ```
180
+
181
+ **发版(维护者):**
182
+
183
+ ```bash
184
+ node scripts/release-version.mjs # bump → npm publish → tag → push
185
+ ```
186
+
187
+ **用例页本地验证**:先 `npm run build:embed`,再 `npm run dev`,访问 `/use-cases.html` 或 `/use-cases-b.html`。
188
+
189
+ ## 生产部署注意
190
+
191
+ - 宿主通过 `pnpm add @hgt-weprotalk/mira-client@x.y.z` 安装;`dist/` 在 npm 包内,不在 GitHub 仓库。
192
+ - Next.js 推荐 **方式 1**(React 组件),接入与本地 Home 页一致。
193
+ - 方式 2/3 需 postinstall 将 `node_modules/@hgt-weprotalk/mira-client/dist/embed/` 同步至 `public/embed/`。
194
+ - `agentName`、`site`、`apiBaseUrl` 由宿主在接入时传参,**不要在生产依赖本仓库 `.env`**。
@@ -1 +1 @@
1
- {"version":3,"file":"ChatWidget.d.ts","sourceRoot":"","sources":["../../../src/components/chat-widget/ChatWidget.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAyB,KAAK,MAAM,EAAE,MAAM,YAAY,CAAC;AAIhE,OAAO,mBAAmB,CAAC;AAG3B,UAAU,eAAe;IACvB,qCAAqC;IACrC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,8CAA8C;IAC9C,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,0CAA0C;IAC1C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,2BAA2B;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wFAAwF;IACxF,mDAAmD;IACnD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4EAA4E;IAC5E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sEAAsE;IACtE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAqLD,yDAAyD;AACzD,QAAA,MAAM,UAAU,GAAI,8EAQjB,eAAe,gCA8MjB,CAAC;AAEF,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"ChatWidget.d.ts","sourceRoot":"","sources":["../../../src/components/chat-widget/ChatWidget.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAyB,KAAK,MAAM,EAAE,MAAM,YAAY,CAAC;AAIhE,OAAO,mBAAmB,CAAC;AAK3B,UAAU,eAAe;IACvB,qCAAqC;IACrC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,8CAA8C;IAC9C,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,0CAA0C;IAC1C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,2BAA2B;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wFAAwF;IACxF,mDAAmD;IACnD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4EAA4E;IAC5E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sEAAsE;IACtE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAqLD,yDAAyD;AACzD,QAAA,MAAM,UAAU,GAAI,8EAQjB,eAAe,gCA6NjB,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Chat Widget 布局 token(桌面 / 移动端)。
3
+ * 后续可由 Agent config API 返回 overrides,经 applyChatWidgetLayoutCssVars 写入 DOM。
4
+ */
5
+ export declare const CHAT_WIDGET_LAYOUT: {
6
+ readonly panelWidthPx: 520;
7
+ readonly panelHeightPx: 740;
8
+ readonly panelViewportTopInsetPx: 16;
9
+ /** React 直挂:widget bottom(20) + launcher(64) + gap(8) */
10
+ readonly panelLauncherReservedBlockPx: 92;
11
+ readonly assistantBubbleMaxWidthPx: 445;
12
+ readonly assistantBodyMaxWidthPx: 415;
13
+ readonly mobileBreakpointPx: 680;
14
+ readonly mobilePanelHorizontalInsetPx: 16;
15
+ readonly mobilePanelVerticalReservedPx: 84;
16
+ readonly mobileAssistantBubbleMaxWidth: "98%";
17
+ readonly mobileAssistantBodyMaxWidth: "calc(100vw - 44px)";
18
+ };
19
+ /** Embed launcher:button bottom + height + gap(与 embedDialogTokens 对齐) */
20
+ export declare const EMBED_PANEL_LAUNCHER_RESERVED_BLOCK_PX: 92;
21
+ export type ChatWidgetLayoutOverrides = Partial<{
22
+ panelWidthPx: number;
23
+ panelHeightPx: number;
24
+ assistantBubbleMaxWidthPx: number;
25
+ assistantBodyMaxWidthPx: number;
26
+ }>;
27
+ /** 将布局 overrides 转为可在 .chat_widget 或 :root 上设置的 CSS 变量 */
28
+ export declare const layoutOverridesToCssProperties: (overrides: ChatWidgetLayoutOverrides) => Record<string, string>;
29
+ /** 写入布局 CSS 变量(供后续 config API 调用) */
30
+ export declare const applyChatWidgetLayoutCssVars: (element: HTMLElement, overrides?: ChatWidgetLayoutOverrides) => void;
31
+ //# sourceMappingURL=layoutTokens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layoutTokens.d.ts","sourceRoot":"","sources":["../../../src/components/chat-widget/layoutTokens.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,kBAAkB;;;;IAI7B,yDAAyD;;;;;;;;;CASjD,CAAC;AAEX,0EAA0E;AAC1E,eAAO,MAAM,sCAAsC,IACF,CAAC;AAElD,MAAM,MAAM,yBAAyB,GAAG,OAAO,CAAC;IAC9C,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,yBAAyB,EAAE,MAAM,CAAC;IAClC,uBAAuB,EAAE,MAAM,CAAC;CACjC,CAAC,CAAC;AAIH,0DAA0D;AAC1D,eAAO,MAAM,8BAA8B,GACzC,WAAW,yBAAyB,KACnC,MAAM,CAAC,MAAM,EAAE,MAAM,CA0BvB,CAAC;AAEF,qCAAqC;AACrC,eAAO,MAAM,4BAA4B,GACvC,SAAS,WAAW,EACpB,YAAY,yBAAyB,KACpC,IAUF,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { type RefObject } from "react";
2
+ /**
3
+ * 桌面端:根据 launcher 在视口中的位置动态收紧面板 max-height,
4
+ * 避免 chat_panel 上沿超出可视区域(launcher 较靠上时)。
5
+ */
6
+ export declare const useChatPanelViewportClamp: (widgetRef: RefObject<HTMLElement | null>, enabled: boolean, isPanelVisible: boolean) => void;
7
+ //# sourceMappingURL=useChatPanelViewportClamp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useChatPanelViewportClamp.d.ts","sourceRoot":"","sources":["../../../src/components/chat-widget/useChatPanelViewportClamp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAKxD;;;GAGG;AACH,eAAO,MAAM,yBAAyB,GACpC,WAAW,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,EACxC,SAAS,OAAO,EAChB,gBAAgB,OAAO,KACtB,IAoDF,CAAC"}
@@ -1,4 +1,5 @@
1
1
  /** Chat Widget 嵌入脚本运行时配置(由 <script> data 属性注入) */
2
+ import type { ChatWidgetLayoutOverrides } from "../components/chat-widget/layoutTokens";
2
3
  export interface HostUserInfo {
3
4
  loginUserId: string;
4
5
  name: string;
@@ -14,6 +15,8 @@ export interface ChatWidgetRuntimeConfig {
14
15
  userNickname?: string;
15
16
  hostUser?: HostUserInfo;
16
17
  productContext?: Record<string, unknown>;
18
+ /** 预留:Agent config API 返回的面板 / 气泡尺寸 overrides */
19
+ layout?: ChatWidgetLayoutOverrides;
17
20
  }
18
21
  /** 合并更新运行时配置(嵌入脚本 data 属性注入时调用) */
19
22
  export declare const setChatWidgetRuntimeConfig: (config: ChatWidgetRuntimeConfig) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/config/runtime.ts"],"names":[],"mappings":"AAAA,kDAAkD;AAClD,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,uBAAuB;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC1C;AAID,mCAAmC;AACnC,eAAO,MAAM,0BAA0B,GACrC,QAAQ,uBAAuB,KAC9B,IAEF,CAAC;AAEF,8BAA8B;AAC9B,eAAO,MAAM,0BAA0B,QAAO,uBAC/B,CAAC"}
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/config/runtime.ts"],"names":[],"mappings":"AAAA,kDAAkD;AAClD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,wCAAwC,CAAC;AAExF,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,uBAAuB;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,iDAAiD;IACjD,MAAM,CAAC,EAAE,yBAAyB,CAAC;CACpC;AAID,mCAAmC;AACnC,eAAO,MAAM,0BAA0B,GACrC,QAAQ,uBAAuB,KAC9B,IAEF,CAAC;AAEF,8BAA8B;AAC9B,eAAO,MAAM,0BAA0B,QAAO,uBAC/B,CAAC"}