@arronqzy/abuilder 1.1.38 → 1.1.40

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 CHANGED
@@ -4,7 +4,7 @@ React 一站式编辑器。安装后渲染 `<App />`,就是完整的 Abuilder
4
4
 
5
5
  ![安装后直接得到的编辑器](https://github.com/qianzhuoyao/APanel5/raw/v5/docs/guide-assets/live-zh/01-overview.png)
6
6
 
7
- 当前版本见本包 `package.json`(设置菜单「关于」里显示的就是这个版本号)。本包 **1.1.38** 起提供本地工作区清理接口(`listWorkspaceProjects` / `deleteWorkspaceProject` / `clearWorkspaceProjects`);**1.1.37** 起配套 chroma.js 主题配色、全系统国际化修复与问号图标式字段说明;**1.1.36** 起配套蓝图 Soft UI 节点样式;**1.1.35** 起配套接口集合、`{system?...}` 模版、JSON 节点错误高亮。完整中文手册见仓库 `docs/Abuilder使用文档与功能说明.docx`(适用版本表写在文首)。
7
+ 当前版本见本包 `package.json`(设置菜单「关于」里显示的就是这个版本号)。本包 **1.1.40** 起补齐宿主侧完整 CRUD(put / 命令式打开 / 事件 nameSpace / Vue 预览截图);**1.1.39** 起补齐本地数据接口(蓝图库、执行日志、接口集合的读取与清理,`clearAbuilderStorage` 一次清空,`workspace:delete` 事件);**1.1.38** 起提供本地工作区清理接口(`listWorkspaceProjects` / `deleteWorkspaceProject` / `clearWorkspaceProjects`);**1.1.37** 起配套 chroma.js 主题配色、全系统国际化修复与问号图标式字段说明;**1.1.36** 起配套蓝图 Soft UI 节点样式;**1.1.35** 起配套接口集合、`{system?...}` 模版、JSON 节点错误高亮。完整中文手册见仓库 `docs/Abuilder使用文档与功能说明.docx`(适用版本表写在文首)。
8
8
 
9
9
  ## 安装
10
10
 
@@ -64,7 +64,8 @@ createRoot(document.getElementById("root")!).render(<App locale="zh-CN" />);
64
64
  | `nameSpace` | 隔离 IndexedDB;同一页多个 App 必须不同 | — |
65
65
  | `previewSearch` | 预览 URL 查询串 | `window.location.search` |
66
66
  | `preview` | `true` 只渲染预览页 | `false` |
67
- | `initialWorkspace` | 完整工作区。不传则空白画布,**不会**自动打开 IndexedDB 里已有项目 | — |
67
+ | `initialWorkspace` | 完整工作区。不传则空白画布,**不会**自动打开 IndexedDB 里已有项目。传入且带 `id` 时,会默认同步写入 IndexedDB(本地已有更新的记录不会被旧数据覆盖),以便预览与「同步」可用 | — |
68
+ | `workspaceId` | 按 IndexedDB id 打开(不 remount)。与 `initialWorkspace` 同时存在时:首次优先完整记录;之后 id 变化从 IndexedDB 打开 | — |
68
69
 
69
70
  ```tsx
70
71
  <App
@@ -95,10 +96,11 @@ URL 带 `?preview=online&projectId=<id>` 时进入预览,从 IndexedDB 读。
95
96
 
96
97
  ## 把工作区交给自己的后端
97
98
 
98
- IndexedDB 是编辑器自己的浏览器缓存,**不导出** list / get / put / delete。宿主应:
99
+ IndexedDB 是编辑器自己的浏览器缓存。宿主仍应以自己的后端为准:
99
100
 
100
- 1. 订阅创建和同步事件,把回调里的完整对象写到自己的存储。
101
- 2. 下次打开时校验 JSON,再交给 `initialWorkspace`。
101
+ 1. 订阅创建和同步事件(`workspace:add` / `workspace:sync`),把回调里的完整对象写到自己的存储。
102
+ 2. 下次打开时校验 JSON,再交给 `initialWorkspace`;编辑器会把这份工作区默认同步进 IndexedDB,之后「同步 / 预览」不会因本地缺记录报错。
103
+ 3. 需要清理本地副本时,用导出的 `listWorkspaceProjects` / `deleteWorkspaceProject` / `clearWorkspaceProjects` / `clearAbuilderStorage`,不要直接操作 IndexedDB。
102
104
 
103
105
  ```tsx
104
106
  import { useEffect, useState } from "react";
@@ -139,8 +141,13 @@ function HostApp() {
139
141
  |------|------|----------|
140
142
  | `workspace:add` | `AbuilderEvents.workspaceAdd` | 创建工作区成功 |
141
143
  | `workspace:sync` | `AbuilderEvents.workspaceSync` | 同步工作区成功 |
144
+ | `workspace:delete` | `AbuilderEvents.workspaceDelete` | 删除工作区(界面删除,或调用 `deleteWorkspaceProject` / `clearWorkspaceProjects`) |
145
+ | `blueprint-library:changed` | `AbuilderEvents.blueprintLibraryChanged` | 蓝图库 put / delete / clear |
146
+ | `api-collection:upload-start` | `AbuilderEvents.apiCollectionUploadStart` | 开始上传接口集合 |
147
+ | `api-collection:upload-success` | `AbuilderEvents.apiCollectionUploadSuccess` | 上传接口集合成功 |
148
+ | `api-collection:changed` | `AbuilderEvents.apiCollectionChanged` | 接口集合 put / delete / clear |
142
149
 
143
- 回调参数是完整 `WorkspaceData`(即 `WorkspaceProjectRecord`):
150
+ `workspace:add` / `workspace:sync` 的回调是 `WorkspaceData & { nameSpace }`:
144
151
 
145
152
  | 字段 | 说明 |
146
153
  |------|------|
@@ -152,8 +159,9 @@ function HostApp() {
152
159
  | `blueprintMeta` | 蓝图名称、备注 |
153
160
  | `productName` | 产物名称 |
154
161
  | `titleIconDataUrl` | 标题图标(可选) |
162
+ | `nameSpace` | 所属命名空间;默认库为 `null` |
155
163
 
156
- 也可以用字符串:`addEventSubscription("workspace:add", callback)`。
164
+ 同页多个 App 时,用第三个参数过滤:`addEventSubscription(AbuilderEvents.workspaceSync, cb, { nameSpace: "my-app" })`。
157
165
 
158
166
  ## 校验和空工作区
159
167
 
@@ -184,29 +192,67 @@ createEmptyWorkspace({ name: "未命名", id: createWorkspaceProjectId() });
184
192
 
185
193
  `initialWorkspace` 为空时,首次是空画布和空蓝图。侧栏仍可列出已保存项目,但要用户手动打开。
186
194
 
187
- ## 清理浏览器里保存的工作区
195
+ ## 本地数据完整 CRUD
188
196
 
189
- 「创建工作区 / 同步」会把整份工作区写进浏览器 IndexedDB。如果工作区以后端为准,可以定期清理本地副本,避免越积越多:
197
+ 编辑器把四类数据存进 IndexedDB,按 `nameSpace` 隔离。公开 API 覆盖读写删清:
198
+
199
+ | 数据 | Create / Update | Read | Delete |
200
+ |------|-----------------|------|--------|
201
+ | 工作区 | `putWorkspaceProject` / `upsertWorkspaceProject`(可选 `emitEvent: "add"\|"sync"`);或 UI 创建/同步 | `listWorkspaceProjects` / `getWorkspaceProject` | `deleteWorkspaceProject` / `clearWorkspaceProjects` |
202
+ | 蓝图库 | `putBlueprintLibraryRecord` | `listBlueprintLibrary` / `getBlueprintLibraryRecord` | `deleteBlueprintLibraryRecord` / `clearBlueprintLibrary` |
203
+ | 执行日志 | `putExecutionRunRecord` | `listExecutionRunRecords` / `getExecutionRunRecord` | `deleteExecutionRunRecord` / `clearAllExecutionRunRecords` / `purge*` / `trim*` |
204
+ | 接口集合 | `putApiCollection` / `upsertApiCollectionFromJson` | `listApiCollectionRecords` | `deleteApiCollection` / `clearApiCollections` |
190
205
 
191
206
  ```ts
192
207
  import {
208
+ putWorkspaceProject,
193
209
  listWorkspaceProjects,
194
210
  deleteWorkspaceProject,
195
- clearWorkspaceProjects,
211
+ clearAbuilderStorage,
212
+ putBlueprintLibraryRecord,
213
+ putApiCollection,
196
214
  } from "@arronqzy/abuilder";
197
215
 
198
- const items = await listWorkspaceProjects(nameSpace); // [{ id, name, createdAt, updatedAt }],按更新时间倒序
199
- await deleteWorkspaceProject(items[0].id, nameSpace);
200
- const removed = await clearWorkspaceProjects(nameSpace); // 返回删除数量
216
+ // 不挂载编辑器也能预热 IndexedDB(例如后台同步后端数据)
217
+ await putWorkspaceProject(parsedWorkspace, nameSpace);
218
+ // 需要顺带通知宿主后端时:
219
+ await putWorkspaceProject(parsedWorkspace, nameSpace, { emitEvent: "sync" });
220
+
221
+ const result = await clearAbuilderStorage(nameSpace);
201
222
  ```
202
223
 
203
- - `nameSpace` 要和 `<App nameSpace>` 一致;省略时操作默认库。
204
- - 删除后,同页和其他标签页里已挂载的编辑器会自动刷新「已保存工作区」列表;若删掉的是当前打开的工作区,编辑器内容保留,但不再关联该记录。
205
- - 只清理工作区,不动蓝图库、执行日志、接口集合。
224
+ - 所有存储函数的 `nameSpace` 要和 `<App nameSpace>` 一致;省略时操作默认库。
225
+ - `clearAbuilderStorage` 不动主题、字号、执行日志保留策略等偏好设置。
226
+ - 写入 / 删除工作区或蓝图库后,已挂载编辑器会自动刷新列表。
227
+
228
+ ## 命令式打开 / 保存(不 remount)
229
+
230
+ 挂载编辑器后,可用模块函数或 `ref`:
231
+
232
+ ```tsx
233
+ import { useRef } from "react";
234
+ import {
235
+ App,
236
+ openWorkspace,
237
+ getCurrentWorkspace,
238
+ syncWorkspace,
239
+ type AbuilderViewHandle,
240
+ } from "@arronqzy/abuilder";
241
+
242
+ const ref = useRef<AbuilderViewHandle>(null);
243
+
244
+ <App ref={ref} nameSpace="my-app" workspaceId={selectedId} />;
245
+
246
+ await openWorkspace(selectedId, "my-app"); // 或 ref.current.openWorkspace(selectedId)
247
+ await syncWorkspace("my-app"); // 把当前编辑内容写入 IndexedDB + 发 workspace:sync
248
+ const draft = getCurrentWorkspace("my-app"); // 导出当前脏状态;无 active 时为 null
249
+ ```
250
+
251
+ 同页多个实例时务必传同一个 `nameSpace`。
206
252
 
207
253
  ## 预览缩略图
208
254
 
209
- 画布已经渲染且有内容时:
255
+ 画布已经渲染且有内容时(React / Vue 均支持):
210
256
 
211
257
  ```ts
212
258
  import { getPreviewSnapshot } from "@arronqzy/abuilder";
@@ -226,8 +272,6 @@ const thumbnail = await getPreviewSnapshot({
226
272
  | `quality` | JPEG 0–1 | `0.92` |
227
273
  | `backgroundColor` | 背景色 | `"#ffffff"` |
228
274
 
229
- Vue 包没有这个函数。
230
-
231
275
  ## 还导出什么
232
276
 
233
277
  一般宿主只用 `App`。需要拆开时:
@@ -241,10 +285,12 @@ import {
241
285
  getPreviewSnapshot,
242
286
  parseWorkspaceData,
243
287
  createEmptyWorkspace,
288
+ openWorkspace,
289
+ getCurrentWorkspace,
244
290
  } from "@arronqzy/abuilder";
245
291
  ```
246
292
 
247
- 类型:`WorkspaceData`、`WorkspaceProjectRecord`、`WorkspaceProjectListItem`、`AbuilderEventName`、`GetPreviewSnapshotOptions`、`ParseCheckResult`、`WorkspaceParseCheckResult`。
293
+ 类型:`AbuilderViewHandle`、`WorkspaceData`、`WorkspaceProjectRecord`、`WorkspaceProjectListItem`、`WorkspaceDeleteEventPayload`、`AbuilderStorageClearResult`、`BlueprintLibraryListItem`、`BlueprintLibraryRecord`、`ExecutionRunRecord`、`ExecutionLogSettings`、`ApiCollectionRecord`、`UpsertApiCollectionInput`、`AbuilderEventName`、`GetPreviewSnapshotOptions`、`ParseCheckResult`、`WorkspaceParseCheckResult`。
248
294
 
249
295
  ## 本仓库里怎么预览
250
296
 
package/dist/index.cjs CHANGED
@@ -10,7 +10,7 @@ var jsxRuntime = require('react/jsx-runtime');
10
10
  // package.json
11
11
  var package_default = {
12
12
  name: "@arronqzy/abuilder",
13
- version: "1.1.38"};
13
+ version: "1.1.40"};
14
14
 
15
15
  // src/version.ts
16
16
  var ABUILDER_PACKAGE_NAME = package_default.name;
@@ -30,7 +30,7 @@ function PreviewShell({ children }) {
30
30
  }
31
31
  );
32
32
  }
33
- function App({
33
+ var App = react.forwardRef(function App2({
34
34
  className,
35
35
  initialZoom,
36
36
  defaultTheme = "dark",
@@ -38,8 +38,9 @@ function App({
38
38
  previewSearch,
39
39
  preview = false,
40
40
  initialWorkspace = null,
41
+ workspaceId = null,
41
42
  nameSpace = null
42
- }) {
43
+ }, ref) {
43
44
  const [localeState, setLocaleState] = react.useState(locale);
44
45
  const effectiveLocale = locale ?? localeState;
45
46
  const search = previewSearch ?? (typeof window !== "undefined" ? window.location.search : "");
@@ -74,9 +75,11 @@ function App({
74
75
  return /* @__PURE__ */ jsxRuntime.jsx(ui.ThemeProvider, { defaultTheme, enableSystem: false, children: /* @__PURE__ */ jsxRuntime.jsx(
75
76
  reactView.ReactViewPanel,
76
77
  {
78
+ ref,
77
79
  className,
78
80
  initialZoom,
79
81
  initialWorkspace,
82
+ workspaceId,
80
83
  locale: effectiveLocale,
81
84
  onLocaleChange: setLocaleState,
82
85
  nameSpace,
@@ -84,7 +87,7 @@ function App({
84
87
  packageVersion: ABUILDER_VERSION
85
88
  }
86
89
  ) });
87
- }
90
+ });
88
91
 
89
92
  Object.defineProperty(exports, "AbuilderEvents", {
90
93
  enumerable: true,
@@ -106,6 +109,22 @@ Object.defineProperty(exports, "addEventSubscription", {
106
109
  enumerable: true,
107
110
  get: function () { return reactView.addEventSubscription; }
108
111
  });
112
+ Object.defineProperty(exports, "clearAbuilderStorage", {
113
+ enumerable: true,
114
+ get: function () { return reactView.clearAbuilderStorage; }
115
+ });
116
+ Object.defineProperty(exports, "clearAllExecutionRunRecords", {
117
+ enumerable: true,
118
+ get: function () { return reactView.clearAllExecutionRunRecords; }
119
+ });
120
+ Object.defineProperty(exports, "clearApiCollections", {
121
+ enumerable: true,
122
+ get: function () { return reactView.clearApiCollections; }
123
+ });
124
+ Object.defineProperty(exports, "clearBlueprintLibrary", {
125
+ enumerable: true,
126
+ get: function () { return reactView.clearBlueprintLibrary; }
127
+ });
109
128
  Object.defineProperty(exports, "clearWorkspaceProjects", {
110
129
  enumerable: true,
111
130
  get: function () { return reactView.clearWorkspaceProjects; }
@@ -114,22 +133,70 @@ Object.defineProperty(exports, "createEmptyWorkspace", {
114
133
  enumerable: true,
115
134
  get: function () { return reactView.createEmptyWorkspace; }
116
135
  });
136
+ Object.defineProperty(exports, "createWorkspace", {
137
+ enumerable: true,
138
+ get: function () { return reactView.createWorkspace; }
139
+ });
117
140
  Object.defineProperty(exports, "createWorkspaceProjectId", {
118
141
  enumerable: true,
119
142
  get: function () { return reactView.createWorkspaceProjectId; }
120
143
  });
144
+ Object.defineProperty(exports, "deleteApiCollection", {
145
+ enumerable: true,
146
+ get: function () { return reactView.deleteApiCollection; }
147
+ });
148
+ Object.defineProperty(exports, "deleteBlueprintLibraryRecord", {
149
+ enumerable: true,
150
+ get: function () { return reactView.deleteBlueprintLibraryRecord; }
151
+ });
152
+ Object.defineProperty(exports, "deleteExecutionRunRecord", {
153
+ enumerable: true,
154
+ get: function () { return reactView.deleteExecutionRunRecord; }
155
+ });
121
156
  Object.defineProperty(exports, "deleteWorkspaceProject", {
122
157
  enumerable: true,
123
158
  get: function () { return reactView.deleteWorkspaceProject; }
124
159
  });
160
+ Object.defineProperty(exports, "getBlueprintLibraryRecord", {
161
+ enumerable: true,
162
+ get: function () { return reactView.getBlueprintLibraryRecord; }
163
+ });
164
+ Object.defineProperty(exports, "getCurrentWorkspace", {
165
+ enumerable: true,
166
+ get: function () { return reactView.getCurrentWorkspace; }
167
+ });
168
+ Object.defineProperty(exports, "getExecutionRunRecord", {
169
+ enumerable: true,
170
+ get: function () { return reactView.getExecutionRunRecord; }
171
+ });
125
172
  Object.defineProperty(exports, "getPreviewSnapshot", {
126
173
  enumerable: true,
127
174
  get: function () { return reactView.getPreviewSnapshot; }
128
175
  });
176
+ Object.defineProperty(exports, "getWorkspaceProject", {
177
+ enumerable: true,
178
+ get: function () { return reactView.getWorkspaceProject; }
179
+ });
180
+ Object.defineProperty(exports, "listApiCollectionRecords", {
181
+ enumerable: true,
182
+ get: function () { return reactView.listApiCollectionRecords; }
183
+ });
184
+ Object.defineProperty(exports, "listBlueprintLibrary", {
185
+ enumerable: true,
186
+ get: function () { return reactView.listBlueprintLibrary; }
187
+ });
188
+ Object.defineProperty(exports, "listExecutionRunRecords", {
189
+ enumerable: true,
190
+ get: function () { return reactView.listExecutionRunRecords; }
191
+ });
129
192
  Object.defineProperty(exports, "listWorkspaceProjects", {
130
193
  enumerable: true,
131
194
  get: function () { return reactView.listWorkspaceProjects; }
132
195
  });
196
+ Object.defineProperty(exports, "openWorkspace", {
197
+ enumerable: true,
198
+ get: function () { return reactView.openWorkspace; }
199
+ });
133
200
  Object.defineProperty(exports, "parseBlueprintData", {
134
201
  enumerable: true,
135
202
  get: function () { return reactView.parseBlueprintData; }
@@ -146,6 +213,50 @@ Object.defineProperty(exports, "parseWorkspaceData", {
146
213
  enumerable: true,
147
214
  get: function () { return reactView.parseWorkspaceData; }
148
215
  });
216
+ Object.defineProperty(exports, "purgeExecutionRunsOlderThan", {
217
+ enumerable: true,
218
+ get: function () { return reactView.purgeExecutionRunsOlderThan; }
219
+ });
220
+ Object.defineProperty(exports, "putApiCollection", {
221
+ enumerable: true,
222
+ get: function () { return reactView.putApiCollection; }
223
+ });
224
+ Object.defineProperty(exports, "putBlueprintLibraryRecord", {
225
+ enumerable: true,
226
+ get: function () { return reactView.putBlueprintLibraryRecord; }
227
+ });
228
+ Object.defineProperty(exports, "putExecutionRunRecord", {
229
+ enumerable: true,
230
+ get: function () { return reactView.putExecutionRunRecord; }
231
+ });
232
+ Object.defineProperty(exports, "putWorkspaceProject", {
233
+ enumerable: true,
234
+ get: function () { return reactView.putWorkspaceProject; }
235
+ });
236
+ Object.defineProperty(exports, "readExecutionLogSettings", {
237
+ enumerable: true,
238
+ get: function () { return reactView.readExecutionLogSettings; }
239
+ });
240
+ Object.defineProperty(exports, "saveWorkspace", {
241
+ enumerable: true,
242
+ get: function () { return reactView.saveWorkspace; }
243
+ });
244
+ Object.defineProperty(exports, "syncWorkspace", {
245
+ enumerable: true,
246
+ get: function () { return reactView.syncWorkspace; }
247
+ });
248
+ Object.defineProperty(exports, "trimExecutionRunRecordsToMax", {
249
+ enumerable: true,
250
+ get: function () { return reactView.trimExecutionRunRecordsToMax; }
251
+ });
252
+ Object.defineProperty(exports, "upsertApiCollectionFromJson", {
253
+ enumerable: true,
254
+ get: function () { return reactView.upsertApiCollectionFromJson; }
255
+ });
256
+ Object.defineProperty(exports, "upsertWorkspaceProject", {
257
+ enumerable: true,
258
+ get: function () { return reactView.upsertWorkspaceProject; }
259
+ });
149
260
  Object.defineProperty(exports, "validateBlueprintData", {
150
261
  enumerable: true,
151
262
  get: function () { return reactView.validateBlueprintData; }
@@ -158,6 +269,10 @@ Object.defineProperty(exports, "validateWorkspaceData", {
158
269
  enumerable: true,
159
270
  get: function () { return reactView.validateWorkspaceData; }
160
271
  });
272
+ Object.defineProperty(exports, "writeExecutionLogSettings", {
273
+ enumerable: true,
274
+ get: function () { return reactView.writeExecutionLogSettings; }
275
+ });
161
276
  exports.ABUILDER_PACKAGE_NAME = ABUILDER_PACKAGE_NAME;
162
277
  exports.ABUILDER_VERSION = ABUILDER_VERSION;
163
278
  exports.App = App;
@@ -1 +1 @@
1
- {"version":3,"sources":["../package.json","../src/version.ts","../src/App.tsx"],"names":["jsx","useState","useMemo","parseOnlinePreviewSearchParams","ReactViewOnlinePreview","ThemeProvider","ReactViewPanel"],"mappings":";;;;;;;;;;AAAA,IAAA,eAAA,GAAA;AAAA,EACE,IAAQ,EAAA,oBAAA;AAAA,EACR,OAAW,EAAA,QAiEb,CAAA;;;AChEO,IAAM,wBAAwB,eAAY,CAAA;AAC1C,IAAM,mBAAmB,eAAY,CAAA;ACwC5C,SAAS,YAAA,CAAa,EAAE,QAAA,EAAqC,EAAA;AAC3D,EAAI,IAAA,OAAO,aAAa,WAAa,EAAA;AACnC,IAAS,QAAA,CAAA,eAAA,CAAgB,SAAU,CAAA,MAAA,CAAO,MAAM,CAAA;AAChD,IAAS,QAAA,CAAA,eAAA,CAAgB,SAAU,CAAA,GAAA,CAAI,OAAO,CAAA;AAC9C,IAAS,QAAA,CAAA,eAAA,CAAgB,QAAQ,KAAQ,GAAA,OAAA;AAAA;AAG3C,EACE,uBAAAA,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAU,EAAA,mDAAA;AAAA,MACV,YAAW,EAAA,OAAA;AAAA,MAEV;AAAA;AAAA,GACH;AAEJ;AAEO,SAAS,GAAI,CAAA;AAAA,EAClB,SAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAe,GAAA,MAAA;AAAA,EACf,MAAS,GAAA,IAAA;AAAA,EACT,aAAA;AAAA,EACA,OAAU,GAAA,KAAA;AAAA,EACV,gBAAmB,GAAA,IAAA;AAAA,EACnB,SAAY,GAAA;AACd,CAAqB,EAAA;AACnB,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIC,eAAwB,MAAM,CAAA;AACpE,EAAA,MAAM,kBAAkB,MAAU,IAAA,WAAA;AAElC,EAAA,MAAM,SACJ,aACC,KAAA,OAAO,WAAW,WAAc,GAAA,MAAA,CAAO,SAAS,MAAS,GAAA,EAAA,CAAA;AAE5D,EAAA,MAAM,aAAgB,GAAAC,aAAA;AAAA,IACpB,MAAMC,yCAA+B,MAAM,CAAA;AAAA,IAC3C,CAAC,MAAM;AAAA,GACT;AAEA,EAAA,IAAI,OAAS,EAAA;AACX,IAAA,sCACG,YACC,EAAA,EAAA,QAAA,kBAAAH,cAAA;AAAA,MAACI,gCAAA;AAAA,MAAA;AAAA,QACC,SAAW,EAAA,gBAAA;AAAA,QACX,WAAW,gBAAkB,EAAA,EAAA;AAAA,QAC7B,MAAQ,EAAA,eAAA;AAAA,QACR,cAAgB,EAAA,cAAA;AAAA,QAChB;AAAA;AAAA,KAEJ,EAAA,CAAA;AAAA;AAIJ,EAAA,IAAI,aAAe,EAAA;AACjB,IAAA,sCACG,YACC,EAAA,EAAA,QAAA,kBAAAJ,cAAA;AAAA,MAACI,gCAAA;AAAA,MAAA;AAAA,QACC,WAAW,aAAc,CAAA,SAAA;AAAA,QACzB,mBAAmB,aAAc,CAAA,iBAAA;AAAA,QACjC,MAAQ,EAAA,eAAA;AAAA,QACR,cAAgB,EAAA,cAAA;AAAA,QAChB,SAAA,EAAW,cAAc,SAAa,IAAA;AAAA;AAAA,KAE1C,EAAA,CAAA;AAAA;AAIJ,EAAA,uBACGJ,cAAA,CAAAK,gBAAA,EAAA,EAAc,YAA4B,EAAA,YAAA,EAAc,KACvD,EAAA,QAAA,kBAAAL,cAAA;AAAA,IAACM,wBAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,WAAA;AAAA,MACA,gBAAA;AAAA,MACA,MAAQ,EAAA,eAAA;AAAA,MACR,cAAgB,EAAA,cAAA;AAAA,MAChB,SAAA;AAAA,MACA,WAAa,EAAA,qBAAA;AAAA,MACb,cAAgB,EAAA;AAAA;AAAA,GAEpB,EAAA,CAAA;AAEJ","file":"index.cjs","sourcesContent":["{\n \"name\": \"@arronqzy/abuilder\",\n \"version\": \"1.1.38\",\n \"description\": \"Abuilder 可视化编辑器 — 安装后即可通过 <App /> 渲染完整应用\",\n \"license\": \"MIT\",\n \"type\": \"module\",\n \"sideEffects\": [\n \"*.css\"\n ],\n \"files\": [\n \"dist\",\n \"README.md\"\n ],\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/index.cjs\"\n },\n \"./styles.css\": \"./dist/styles.css\",\n \"./vite\": {\n \"types\": \"./dist/vite.d.ts\",\n \"import\": \"./dist/vite.js\",\n \"require\": \"./dist/vite.cjs\",\n \"default\": \"./dist/vite.js\"\n }\n },\n \"scripts\": {\n \"lint\": \"eslint \\\"src/**/*.{ts,tsx}\\\"\",\n \"typecheck\": \"tsc -p tsconfig.json --noEmit --skipLibCheck\",\n \"build:css\": \"node ./scripts/build-css.mjs\",\n \"build:js\": \"tsup && cp src/vite.d.ts dist/vite.d.ts && cp src/vite.d.ts dist/vite.d.cts\",\n \"build\": \"pnpm run build:js && pnpm run build:css\",\n \"prepublishOnly\": \"pnpm run build\",\n \"dev\": \"tsup --watch\"\n },\n \"dependencies\": {\n \"@arronqzy/blueprint-dsl\": \"workspace:*\",\n \"@arronqzy/i18n\": \"workspace:*\",\n \"@arronqzy/react-blueprint\": \"workspace:*\",\n \"@arronqzy/react-view\": \"workspace:*\",\n \"@arronqzy/rx-store\": \"workspace:*\",\n \"@arronqzy/ui\": \"workspace:*\",\n \"@arronqzy/webllm-assistant\": \"workspace:*\"\n },\n \"peerDependencies\": {\n \"react\": \">=18\",\n \"react-dom\": \">=18\"\n },\n \"devDependencies\": {\n \"@arronqzy/eslint-config\": \"workspace:*\",\n \"@arronqzy/typescript-config\": \"workspace:*\",\n \"@types/react\": \"^19.0.1\",\n \"@types/react-dom\": \"^19.0.2\",\n \"@xyflow/react\": \"^12.9.3\",\n \"eslint\": \"^8.57.0\",\n \"postcss\": \"^8.4.49\",\n \"postcss-import\": \"^16.1.0\",\n \"tsup\": \"^8.4.0\",\n \"typescript\": \"^5.5.4\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n }\n}\n","import packageJson from \"../package.json\";\n\n/** 与 packages/abuilder/package.json 的 name / version 保持同步(构建时从 JSON 读入)。 */\nexport const ABUILDER_PACKAGE_NAME = packageJson.name;\nexport const ABUILDER_VERSION = packageJson.version;\n","import { useMemo, useState, type ReactNode } from \"react\";\nimport { ThemeProvider } from \"@arronqzy/ui\";\nimport type { Locale } from \"@arronqzy/i18n\";\nimport {\n ReactViewOnlinePreview,\n ReactViewPanel,\n parseOnlinePreviewSearchParams,\n} from \"@arronqzy/react-view\";\nimport type { WorkspaceProjectRecord } from \"@arronqzy/react-view\";\nimport { ABUILDER_PACKAGE_NAME, ABUILDER_VERSION } from \"./version\";\n\nexport type AbuilderAppProps = {\n className?: string;\n initialZoom?: number;\n /** 编辑器默认主题 */\n defaultTheme?: \"dark\" | \"light\";\n /**\n * 界面语言。省略时按 localStorage → 浏览器语言 → zh-CN 解析。\n */\n locale?: Locale | null;\n /**\n * 在线预览模式的 URL 查询串。\n * 默认读取 `window.location.search`;含 `?preview=online&projectId=...` 时进入预览页。\n */\n previewSearch?: string;\n /**\n * 是否为预览模式。`true` 时根据 `initialWorkspace` 直接渲染预览页;`false` 为编辑面板。\n * @default false\n */\n preview?: boolean;\n /**\n * 外部传入的完整工作区数据(面板 + 蓝图)。\n * 编辑模式:挂载后按这份数据完整渲染;预览模式:直接渲染预览页。\n * 省略或空:首次显示空画布 / 空蓝图,不会自动选中 IndexedDB 中的工作区。\n */\n initialWorkspace?: WorkspaceProjectRecord | null;\n /**\n * 隔离 IndexedDB / localStorage / BroadcastChannel。\n * 同一页面挂多个 App 时传入不同值,避免工作区、蓝图库、预览缓存互相覆盖。\n * 省略或空字符串保持历史全局库名。\n */\n nameSpace?: string | null;\n};\n\nfunction PreviewShell({ children }: { children: ReactNode }) {\n if (typeof document !== \"undefined\") {\n document.documentElement.classList.remove(\"dark\");\n document.documentElement.classList.add(\"light\");\n document.documentElement.dataset.theme = \"light\";\n }\n\n return (\n <div\n className=\"light min-h-[100vh] w-full bg-white text-gray-900\"\n data-theme=\"light\"\n >\n {children}\n </div>\n );\n}\n\nexport function App({\n className,\n initialZoom,\n defaultTheme = \"dark\",\n locale = null,\n previewSearch,\n preview = false,\n initialWorkspace = null,\n nameSpace = null,\n}: AbuilderAppProps) {\n const [localeState, setLocaleState] = useState<Locale | null>(locale);\n const effectiveLocale = locale ?? localeState;\n\n const search =\n previewSearch ??\n (typeof window !== \"undefined\" ? window.location.search : \"\");\n\n const previewParams = useMemo(\n () => parseOnlinePreviewSearchParams(search),\n [search]\n );\n\n if (preview) {\n return (\n <PreviewShell>\n <ReactViewOnlinePreview\n workspace={initialWorkspace}\n projectId={initialWorkspace?.id}\n locale={effectiveLocale}\n onLocaleChange={setLocaleState}\n nameSpace={nameSpace}\n />\n </PreviewShell>\n );\n }\n\n if (previewParams) {\n return (\n <PreviewShell>\n <ReactViewOnlinePreview\n projectId={previewParams.projectId}\n previewInstanceId={previewParams.previewInstanceId}\n locale={effectiveLocale}\n onLocaleChange={setLocaleState}\n nameSpace={previewParams.nameSpace ?? nameSpace}\n />\n </PreviewShell>\n );\n }\n\n return (\n <ThemeProvider defaultTheme={defaultTheme} enableSystem={false}>\n <ReactViewPanel\n className={className}\n initialZoom={initialZoom}\n initialWorkspace={initialWorkspace}\n locale={effectiveLocale}\n onLocaleChange={setLocaleState}\n nameSpace={nameSpace}\n packageName={ABUILDER_PACKAGE_NAME}\n packageVersion={ABUILDER_VERSION}\n />\n </ThemeProvider>\n );\n}\n"]}
1
+ {"version":3,"sources":["../package.json","../src/version.ts","../src/App.tsx"],"names":["jsx","forwardRef","App","useState","useMemo","parseOnlinePreviewSearchParams","ReactViewOnlinePreview","ThemeProvider","ReactViewPanel"],"mappings":";;;;;;;;;;AAAA,IAAA,eAAA,GAAA;AAAA,EACE,IAAQ,EAAA,oBAAA;AAAA,EACR,OAAW,EAAA,QAiEb,CAAA;;;AChEO,IAAM,wBAAwB,eAAY,CAAA;AAC1C,IAAM,mBAAmB,eAAY,CAAA;AC8C5C,SAAS,YAAA,CAAa,EAAE,QAAA,EAAqC,EAAA;AAC3D,EAAI,IAAA,OAAO,aAAa,WAAa,EAAA;AACnC,IAAS,QAAA,CAAA,eAAA,CAAgB,SAAU,CAAA,MAAA,CAAO,MAAM,CAAA;AAChD,IAAS,QAAA,CAAA,eAAA,CAAgB,SAAU,CAAA,GAAA,CAAI,OAAO,CAAA;AAC9C,IAAS,QAAA,CAAA,eAAA,CAAgB,QAAQ,KAAQ,GAAA,OAAA;AAAA;AAG3C,EACE,uBAAAA,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAU,EAAA,mDAAA;AAAA,MACV,YAAW,EAAA,OAAA;AAAA,MAEV;AAAA;AAAA,GACH;AAEJ;AAEa,IAAA,GAAA,GAAMC,gBAAiD,CAAA,SAASC,IAC3E,CAAA;AAAA,EACE,SAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAe,GAAA,MAAA;AAAA,EACf,MAAS,GAAA,IAAA;AAAA,EACT,aAAA;AAAA,EACA,OAAU,GAAA,KAAA;AAAA,EACV,gBAAmB,GAAA,IAAA;AAAA,EACnB,WAAc,GAAA,IAAA;AAAA,EACd,SAAY,GAAA;AACd,CAAA,EACA,GACA,EAAA;AACA,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIC,eAAwB,MAAM,CAAA;AACpE,EAAA,MAAM,kBAAkB,MAAU,IAAA,WAAA;AAElC,EAAA,MAAM,SACJ,aACC,KAAA,OAAO,WAAW,WAAc,GAAA,MAAA,CAAO,SAAS,MAAS,GAAA,EAAA,CAAA;AAE5D,EAAA,MAAM,aAAgB,GAAAC,aAAA;AAAA,IACpB,MAAMC,yCAA+B,MAAM,CAAA;AAAA,IAC3C,CAAC,MAAM;AAAA,GACT;AAEA,EAAA,IAAI,OAAS,EAAA;AACX,IAAA,sCACG,YACC,EAAA,EAAA,QAAA,kBAAAL,cAAA;AAAA,MAACM,gCAAA;AAAA,MAAA;AAAA,QACC,SAAW,EAAA,gBAAA;AAAA,QACX,WAAW,gBAAkB,EAAA,EAAA;AAAA,QAC7B,MAAQ,EAAA,eAAA;AAAA,QACR,cAAgB,EAAA,cAAA;AAAA,QAChB;AAAA;AAAA,KAEJ,EAAA,CAAA;AAAA;AAIJ,EAAA,IAAI,aAAe,EAAA;AACjB,IAAA,sCACG,YACC,EAAA,EAAA,QAAA,kBAAAN,cAAA;AAAA,MAACM,gCAAA;AAAA,MAAA;AAAA,QACC,WAAW,aAAc,CAAA,SAAA;AAAA,QACzB,mBAAmB,aAAc,CAAA,iBAAA;AAAA,QACjC,MAAQ,EAAA,eAAA;AAAA,QACR,cAAgB,EAAA,cAAA;AAAA,QAChB,SAAA,EAAW,cAAc,SAAa,IAAA;AAAA;AAAA,KAE1C,EAAA,CAAA;AAAA;AAIJ,EAAA,uBACGN,cAAA,CAAAO,gBAAA,EAAA,EAAc,YAA4B,EAAA,YAAA,EAAc,KACvD,EAAA,QAAA,kBAAAP,cAAA;AAAA,IAACQ,wBAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,SAAA;AAAA,MACA,WAAA;AAAA,MACA,gBAAA;AAAA,MACA,WAAA;AAAA,MACA,MAAQ,EAAA,eAAA;AAAA,MACR,cAAgB,EAAA,cAAA;AAAA,MAChB,SAAA;AAAA,MACA,WAAa,EAAA,qBAAA;AAAA,MACb,cAAgB,EAAA;AAAA;AAAA,GAEpB,EAAA,CAAA;AAEJ,CAAC","file":"index.cjs","sourcesContent":["{\n \"name\": \"@arronqzy/abuilder\",\n \"version\": \"1.1.40\",\n \"description\": \"Abuilder 可视化编辑器 — 安装后即可通过 <App /> 渲染完整应用\",\n \"license\": \"MIT\",\n \"type\": \"module\",\n \"sideEffects\": [\n \"*.css\"\n ],\n \"files\": [\n \"dist\",\n \"README.md\"\n ],\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/index.cjs\"\n },\n \"./styles.css\": \"./dist/styles.css\",\n \"./vite\": {\n \"types\": \"./dist/vite.d.ts\",\n \"import\": \"./dist/vite.js\",\n \"require\": \"./dist/vite.cjs\",\n \"default\": \"./dist/vite.js\"\n }\n },\n \"scripts\": {\n \"lint\": \"eslint \\\"src/**/*.{ts,tsx}\\\"\",\n \"typecheck\": \"tsc -p tsconfig.json --noEmit --skipLibCheck\",\n \"build:css\": \"node ./scripts/build-css.mjs\",\n \"build:js\": \"tsup && cp src/vite.d.ts dist/vite.d.ts && cp src/vite.d.ts dist/vite.d.cts\",\n \"build\": \"pnpm run build:js && pnpm run build:css\",\n \"prepublishOnly\": \"pnpm run build\",\n \"dev\": \"tsup --watch\"\n },\n \"dependencies\": {\n \"@arronqzy/blueprint-dsl\": \"workspace:*\",\n \"@arronqzy/i18n\": \"workspace:*\",\n \"@arronqzy/react-blueprint\": \"workspace:*\",\n \"@arronqzy/react-view\": \"workspace:*\",\n \"@arronqzy/rx-store\": \"workspace:*\",\n \"@arronqzy/ui\": \"workspace:*\",\n \"@arronqzy/webllm-assistant\": \"workspace:*\"\n },\n \"peerDependencies\": {\n \"react\": \">=18\",\n \"react-dom\": \">=18\"\n },\n \"devDependencies\": {\n \"@arronqzy/eslint-config\": \"workspace:*\",\n \"@arronqzy/typescript-config\": \"workspace:*\",\n \"@types/react\": \"^19.0.1\",\n \"@types/react-dom\": \"^19.0.2\",\n \"@xyflow/react\": \"^12.9.3\",\n \"eslint\": \"^8.57.0\",\n \"postcss\": \"^8.4.49\",\n \"postcss-import\": \"^16.1.0\",\n \"tsup\": \"^8.4.0\",\n \"typescript\": \"^5.5.4\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n }\n}\n","import packageJson from \"../package.json\";\n\n/** 与 packages/abuilder/package.json 的 name / version 保持同步(构建时从 JSON 读入)。 */\nexport const ABUILDER_PACKAGE_NAME = packageJson.name;\nexport const ABUILDER_VERSION = packageJson.version;\n","import { forwardRef, useMemo, useState, type ReactNode } from \"react\";\nimport { ThemeProvider } from \"@arronqzy/ui\";\nimport type { Locale } from \"@arronqzy/i18n\";\nimport {\n ReactViewOnlinePreview,\n ReactViewPanel,\n parseOnlinePreviewSearchParams,\n type AbuilderViewHandle,\n} from \"@arronqzy/react-view\";\nimport type { WorkspaceProjectRecord } from \"@arronqzy/react-view\";\nimport { ABUILDER_PACKAGE_NAME, ABUILDER_VERSION } from \"./version\";\n\nexport type AbuilderAppProps = {\n className?: string;\n initialZoom?: number;\n /** 编辑器默认主题 */\n defaultTheme?: \"dark\" | \"light\";\n /**\n * 界面语言。省略时按 localStorage → 浏览器语言 → zh-CN 解析。\n */\n locale?: Locale | null;\n /**\n * 在线预览模式的 URL 查询串。\n * 默认读取 `window.location.search`;含 `?preview=online&projectId=...` 时进入预览页。\n */\n previewSearch?: string;\n /**\n * 是否为预览模式。`true` 时根据 `initialWorkspace` 直接渲染预览页;`false` 为编辑面板。\n * @default false\n */\n preview?: boolean;\n /**\n * 外部传入的完整工作区数据(面板 + 蓝图)。\n * 编辑模式:挂载后按这份数据完整渲染;预览模式:直接渲染预览页。\n * 省略或空:首次显示空画布 / 空蓝图,不会自动选中 IndexedDB 中的工作区。\n */\n initialWorkspace?: WorkspaceProjectRecord | null;\n /**\n * 按 IndexedDB id 打开工作区(不 remount)。\n * 与 `initialWorkspace` 同时存在时:首次优先完整记录;之后 id 变化从 IndexedDB 打开。\n */\n workspaceId?: string | null;\n /**\n * 隔离 IndexedDB / localStorage / BroadcastChannel。\n * 同一页面挂多个 App 时传入不同值,避免工作区、蓝图库、预览缓存互相覆盖。\n * 省略或空字符串保持历史全局库名。\n */\n nameSpace?: string | null;\n};\n\nfunction PreviewShell({ children }: { children: ReactNode }) {\n if (typeof document !== \"undefined\") {\n document.documentElement.classList.remove(\"dark\");\n document.documentElement.classList.add(\"light\");\n document.documentElement.dataset.theme = \"light\";\n }\n\n return (\n <div\n className=\"light min-h-[100vh] w-full bg-white text-gray-900\"\n data-theme=\"light\"\n >\n {children}\n </div>\n );\n}\n\nexport const App = forwardRef<AbuilderViewHandle, AbuilderAppProps>(function App(\n {\n className,\n initialZoom,\n defaultTheme = \"dark\",\n locale = null,\n previewSearch,\n preview = false,\n initialWorkspace = null,\n workspaceId = null,\n nameSpace = null,\n },\n ref\n) {\n const [localeState, setLocaleState] = useState<Locale | null>(locale);\n const effectiveLocale = locale ?? localeState;\n\n const search =\n previewSearch ??\n (typeof window !== \"undefined\" ? window.location.search : \"\");\n\n const previewParams = useMemo(\n () => parseOnlinePreviewSearchParams(search),\n [search]\n );\n\n if (preview) {\n return (\n <PreviewShell>\n <ReactViewOnlinePreview\n workspace={initialWorkspace}\n projectId={initialWorkspace?.id}\n locale={effectiveLocale}\n onLocaleChange={setLocaleState}\n nameSpace={nameSpace}\n />\n </PreviewShell>\n );\n }\n\n if (previewParams) {\n return (\n <PreviewShell>\n <ReactViewOnlinePreview\n projectId={previewParams.projectId}\n previewInstanceId={previewParams.previewInstanceId}\n locale={effectiveLocale}\n onLocaleChange={setLocaleState}\n nameSpace={previewParams.nameSpace ?? nameSpace}\n />\n </PreviewShell>\n );\n }\n\n return (\n <ThemeProvider defaultTheme={defaultTheme} enableSystem={false}>\n <ReactViewPanel\n ref={ref}\n className={className}\n initialZoom={initialZoom}\n initialWorkspace={initialWorkspace}\n workspaceId={workspaceId}\n locale={effectiveLocale}\n onLocaleChange={setLocaleState}\n nameSpace={nameSpace}\n packageName={ABUILDER_PACKAGE_NAME}\n packageVersion={ABUILDER_VERSION}\n />\n </ThemeProvider>\n );\n});\n"]}
package/dist/index.d.cts CHANGED
@@ -1,8 +1,8 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
1
+ import * as react from 'react';
2
2
  import { Locale } from '@arronqzy/i18n';
3
3
  export { Locale } from '@arronqzy/i18n';
4
- import { WorkspaceProjectRecord } from '@arronqzy/react-view';
5
- export { AbuilderEventName, AbuilderEventPayloadMap, AbuilderEvents, ApiCollectionUploadStartEventPayload, ApiCollectionUploadSuccessEventPayload, GetPreviewSnapshotOptions, I18nProvider, ParseCheckResult, ReactViewOnlinePreview, ReactViewPanel, ReactViewPanelProps, WorkspaceAddEventPayload, WorkspaceData, WorkspaceParseCheckResult, WorkspaceProjectListItem, WorkspaceProjectRecord, WorkspaceSyncEventPayload, addEventSubscription, clearWorkspaceProjects, createEmptyWorkspace, createWorkspaceProjectId, deleteWorkspaceProject, getPreviewSnapshot, listWorkspaceProjects, parseBlueprintData, parseOnlinePreviewSearchParams, parseViewData, parseWorkspaceData, validateBlueprintData, validateViewData, validateWorkspaceData } from '@arronqzy/react-view';
4
+ import { WorkspaceProjectRecord, AbuilderViewHandle } from '@arronqzy/react-view';
5
+ export { AbuilderEventName, AbuilderEventPayloadMap, AbuilderEvents, AbuilderStorageClearResult, AbuilderViewHandle, AddEventSubscriptionOptions, ApiCollectionChangedEventPayload, ApiCollectionRecord, ApiCollectionUploadStartEventPayload, ApiCollectionUploadSuccessEventPayload, BlueprintLibraryChangedEventPayload, BlueprintLibraryListItem, BlueprintLibraryRecord, ExecutionLogSettings, ExecutionRunRecord, GetPreviewSnapshotOptions, I18nProvider, ParseCheckResult, PutWorkspaceProjectOptions, ReactViewOnlinePreview, ReactViewPanel, ReactViewPanelProps, UpsertApiCollectionInput, UpsertApiCollectionResult, WorkspaceAddEventPayload, WorkspaceData, WorkspaceDeleteEventPayload, WorkspaceParseCheckResult, WorkspaceProjectListItem, WorkspaceProjectRecord, WorkspaceSyncEventPayload, addEventSubscription, clearAbuilderStorage, clearAllExecutionRunRecords, clearApiCollections, clearBlueprintLibrary, clearWorkspaceProjects, createEmptyWorkspace, createWorkspace, createWorkspaceProjectId, deleteApiCollection, deleteBlueprintLibraryRecord, deleteExecutionRunRecord, deleteWorkspaceProject, getBlueprintLibraryRecord, getCurrentWorkspace, getExecutionRunRecord, getPreviewSnapshot, getWorkspaceProject, listApiCollectionRecords, listBlueprintLibrary, listExecutionRunRecords, listWorkspaceProjects, openWorkspace, parseBlueprintData, parseOnlinePreviewSearchParams, parseViewData, parseWorkspaceData, purgeExecutionRunsOlderThan, putApiCollection, putBlueprintLibraryRecord, putExecutionRunRecord, putWorkspaceProject, readExecutionLogSettings, saveWorkspace, syncWorkspace, trimExecutionRunRecordsToMax, upsertApiCollectionFromJson, upsertWorkspaceProject, validateBlueprintData, validateViewData, validateWorkspaceData, writeExecutionLogSettings } from '@arronqzy/react-view';
6
6
 
7
7
  type AbuilderAppProps = {
8
8
  className?: string;
@@ -29,6 +29,11 @@ type AbuilderAppProps = {
29
29
  * 省略或空:首次显示空画布 / 空蓝图,不会自动选中 IndexedDB 中的工作区。
30
30
  */
31
31
  initialWorkspace?: WorkspaceProjectRecord | null;
32
+ /**
33
+ * 按 IndexedDB id 打开工作区(不 remount)。
34
+ * 与 `initialWorkspace` 同时存在时:首次优先完整记录;之后 id 变化从 IndexedDB 打开。
35
+ */
36
+ workspaceId?: string | null;
32
37
  /**
33
38
  * 隔离 IndexedDB / localStorage / BroadcastChannel。
34
39
  * 同一页面挂多个 App 时传入不同值,避免工作区、蓝图库、预览缓存互相覆盖。
@@ -36,7 +41,7 @@ type AbuilderAppProps = {
36
41
  */
37
42
  nameSpace?: string | null;
38
43
  };
39
- declare function App({ className, initialZoom, defaultTheme, locale, previewSearch, preview, initialWorkspace, nameSpace, }: AbuilderAppProps): react_jsx_runtime.JSX.Element;
44
+ declare const App: react.ForwardRefExoticComponent<AbuilderAppProps & react.RefAttributes<AbuilderViewHandle>>;
40
45
 
41
46
  /** 与 packages/abuilder/package.json 的 name / version 保持同步(构建时从 JSON 读入)。 */
42
47
  declare const ABUILDER_PACKAGE_NAME: string;
package/dist/index.d.ts CHANGED
@@ -1,8 +1,8 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
1
+ import * as react from 'react';
2
2
  import { Locale } from '@arronqzy/i18n';
3
3
  export { Locale } from '@arronqzy/i18n';
4
- import { WorkspaceProjectRecord } from '@arronqzy/react-view';
5
- export { AbuilderEventName, AbuilderEventPayloadMap, AbuilderEvents, ApiCollectionUploadStartEventPayload, ApiCollectionUploadSuccessEventPayload, GetPreviewSnapshotOptions, I18nProvider, ParseCheckResult, ReactViewOnlinePreview, ReactViewPanel, ReactViewPanelProps, WorkspaceAddEventPayload, WorkspaceData, WorkspaceParseCheckResult, WorkspaceProjectListItem, WorkspaceProjectRecord, WorkspaceSyncEventPayload, addEventSubscription, clearWorkspaceProjects, createEmptyWorkspace, createWorkspaceProjectId, deleteWorkspaceProject, getPreviewSnapshot, listWorkspaceProjects, parseBlueprintData, parseOnlinePreviewSearchParams, parseViewData, parseWorkspaceData, validateBlueprintData, validateViewData, validateWorkspaceData } from '@arronqzy/react-view';
4
+ import { WorkspaceProjectRecord, AbuilderViewHandle } from '@arronqzy/react-view';
5
+ export { AbuilderEventName, AbuilderEventPayloadMap, AbuilderEvents, AbuilderStorageClearResult, AbuilderViewHandle, AddEventSubscriptionOptions, ApiCollectionChangedEventPayload, ApiCollectionRecord, ApiCollectionUploadStartEventPayload, ApiCollectionUploadSuccessEventPayload, BlueprintLibraryChangedEventPayload, BlueprintLibraryListItem, BlueprintLibraryRecord, ExecutionLogSettings, ExecutionRunRecord, GetPreviewSnapshotOptions, I18nProvider, ParseCheckResult, PutWorkspaceProjectOptions, ReactViewOnlinePreview, ReactViewPanel, ReactViewPanelProps, UpsertApiCollectionInput, UpsertApiCollectionResult, WorkspaceAddEventPayload, WorkspaceData, WorkspaceDeleteEventPayload, WorkspaceParseCheckResult, WorkspaceProjectListItem, WorkspaceProjectRecord, WorkspaceSyncEventPayload, addEventSubscription, clearAbuilderStorage, clearAllExecutionRunRecords, clearApiCollections, clearBlueprintLibrary, clearWorkspaceProjects, createEmptyWorkspace, createWorkspace, createWorkspaceProjectId, deleteApiCollection, deleteBlueprintLibraryRecord, deleteExecutionRunRecord, deleteWorkspaceProject, getBlueprintLibraryRecord, getCurrentWorkspace, getExecutionRunRecord, getPreviewSnapshot, getWorkspaceProject, listApiCollectionRecords, listBlueprintLibrary, listExecutionRunRecords, listWorkspaceProjects, openWorkspace, parseBlueprintData, parseOnlinePreviewSearchParams, parseViewData, parseWorkspaceData, purgeExecutionRunsOlderThan, putApiCollection, putBlueprintLibraryRecord, putExecutionRunRecord, putWorkspaceProject, readExecutionLogSettings, saveWorkspace, syncWorkspace, trimExecutionRunRecordsToMax, upsertApiCollectionFromJson, upsertWorkspaceProject, validateBlueprintData, validateViewData, validateWorkspaceData, writeExecutionLogSettings } from '@arronqzy/react-view';
6
6
 
7
7
  type AbuilderAppProps = {
8
8
  className?: string;
@@ -29,6 +29,11 @@ type AbuilderAppProps = {
29
29
  * 省略或空:首次显示空画布 / 空蓝图,不会自动选中 IndexedDB 中的工作区。
30
30
  */
31
31
  initialWorkspace?: WorkspaceProjectRecord | null;
32
+ /**
33
+ * 按 IndexedDB id 打开工作区(不 remount)。
34
+ * 与 `initialWorkspace` 同时存在时:首次优先完整记录;之后 id 变化从 IndexedDB 打开。
35
+ */
36
+ workspaceId?: string | null;
32
37
  /**
33
38
  * 隔离 IndexedDB / localStorage / BroadcastChannel。
34
39
  * 同一页面挂多个 App 时传入不同值,避免工作区、蓝图库、预览缓存互相覆盖。
@@ -36,7 +41,7 @@ type AbuilderAppProps = {
36
41
  */
37
42
  nameSpace?: string | null;
38
43
  };
39
- declare function App({ className, initialZoom, defaultTheme, locale, previewSearch, preview, initialWorkspace, nameSpace, }: AbuilderAppProps): react_jsx_runtime.JSX.Element;
44
+ declare const App: react.ForwardRefExoticComponent<AbuilderAppProps & react.RefAttributes<AbuilderViewHandle>>;
40
45
 
41
46
  /** 与 packages/abuilder/package.json 的 name / version 保持同步(构建时从 JSON 读入)。 */
42
47
  declare const ABUILDER_PACKAGE_NAME: string;
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
- import { useState, useMemo } from 'react';
1
+ import { forwardRef, useState, useMemo } from 'react';
2
2
  import { ThemeProvider } from '@arronqzy/ui';
3
3
  import { parseOnlinePreviewSearchParams, ReactViewOnlinePreview, ReactViewPanel } from '@arronqzy/react-view';
4
- export { AbuilderEvents, I18nProvider, ReactViewOnlinePreview, ReactViewPanel, addEventSubscription, clearWorkspaceProjects, createEmptyWorkspace, createWorkspaceProjectId, deleteWorkspaceProject, getPreviewSnapshot, listWorkspaceProjects, parseBlueprintData, parseOnlinePreviewSearchParams, parseViewData, parseWorkspaceData, validateBlueprintData, validateViewData, validateWorkspaceData } from '@arronqzy/react-view';
4
+ export { AbuilderEvents, I18nProvider, ReactViewOnlinePreview, ReactViewPanel, addEventSubscription, clearAbuilderStorage, clearAllExecutionRunRecords, clearApiCollections, clearBlueprintLibrary, clearWorkspaceProjects, createEmptyWorkspace, createWorkspace, createWorkspaceProjectId, deleteApiCollection, deleteBlueprintLibraryRecord, deleteExecutionRunRecord, deleteWorkspaceProject, getBlueprintLibraryRecord, getCurrentWorkspace, getExecutionRunRecord, getPreviewSnapshot, getWorkspaceProject, listApiCollectionRecords, listBlueprintLibrary, listExecutionRunRecords, listWorkspaceProjects, openWorkspace, parseBlueprintData, parseOnlinePreviewSearchParams, parseViewData, parseWorkspaceData, purgeExecutionRunsOlderThan, putApiCollection, putBlueprintLibraryRecord, putExecutionRunRecord, putWorkspaceProject, readExecutionLogSettings, saveWorkspace, syncWorkspace, trimExecutionRunRecordsToMax, upsertApiCollectionFromJson, upsertWorkspaceProject, validateBlueprintData, validateViewData, validateWorkspaceData, writeExecutionLogSettings } from '@arronqzy/react-view';
5
5
  import { jsx } from 'react/jsx-runtime';
6
6
 
7
7
  // src/App.tsx
@@ -9,7 +9,7 @@ import { jsx } from 'react/jsx-runtime';
9
9
  // package.json
10
10
  var package_default = {
11
11
  name: "@arronqzy/abuilder",
12
- version: "1.1.38"};
12
+ version: "1.1.40"};
13
13
 
14
14
  // src/version.ts
15
15
  var ABUILDER_PACKAGE_NAME = package_default.name;
@@ -29,7 +29,7 @@ function PreviewShell({ children }) {
29
29
  }
30
30
  );
31
31
  }
32
- function App({
32
+ var App = forwardRef(function App2({
33
33
  className,
34
34
  initialZoom,
35
35
  defaultTheme = "dark",
@@ -37,8 +37,9 @@ function App({
37
37
  previewSearch,
38
38
  preview = false,
39
39
  initialWorkspace = null,
40
+ workspaceId = null,
40
41
  nameSpace = null
41
- }) {
42
+ }, ref) {
42
43
  const [localeState, setLocaleState] = useState(locale);
43
44
  const effectiveLocale = locale ?? localeState;
44
45
  const search = previewSearch ?? (typeof window !== "undefined" ? window.location.search : "");
@@ -73,9 +74,11 @@ function App({
73
74
  return /* @__PURE__ */ jsx(ThemeProvider, { defaultTheme, enableSystem: false, children: /* @__PURE__ */ jsx(
74
75
  ReactViewPanel,
75
76
  {
77
+ ref,
76
78
  className,
77
79
  initialZoom,
78
80
  initialWorkspace,
81
+ workspaceId,
79
82
  locale: effectiveLocale,
80
83
  onLocaleChange: setLocaleState,
81
84
  nameSpace,
@@ -83,7 +86,7 @@ function App({
83
86
  packageVersion: ABUILDER_VERSION
84
87
  }
85
88
  ) });
86
- }
89
+ });
87
90
 
88
91
  export { ABUILDER_PACKAGE_NAME, ABUILDER_VERSION, App };
89
92
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../package.json","../src/version.ts","../src/App.tsx"],"names":[],"mappings":";;;;;;;;;AAAA,IAAA,eAAA,GAAA;AAAA,EACE,IAAQ,EAAA,oBAAA;AAAA,EACR,OAAW,EAAA,QAiEb,CAAA;;;AChEO,IAAM,wBAAwB,eAAY,CAAA;AAC1C,IAAM,mBAAmB,eAAY,CAAA;ACwC5C,SAAS,YAAA,CAAa,EAAE,QAAA,EAAqC,EAAA;AAC3D,EAAI,IAAA,OAAO,aAAa,WAAa,EAAA;AACnC,IAAS,QAAA,CAAA,eAAA,CAAgB,SAAU,CAAA,MAAA,CAAO,MAAM,CAAA;AAChD,IAAS,QAAA,CAAA,eAAA,CAAgB,SAAU,CAAA,GAAA,CAAI,OAAO,CAAA;AAC9C,IAAS,QAAA,CAAA,eAAA,CAAgB,QAAQ,KAAQ,GAAA,OAAA;AAAA;AAG3C,EACE,uBAAA,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAU,EAAA,mDAAA;AAAA,MACV,YAAW,EAAA,OAAA;AAAA,MAEV;AAAA;AAAA,GACH;AAEJ;AAEO,SAAS,GAAI,CAAA;AAAA,EAClB,SAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAe,GAAA,MAAA;AAAA,EACf,MAAS,GAAA,IAAA;AAAA,EACT,aAAA;AAAA,EACA,OAAU,GAAA,KAAA;AAAA,EACV,gBAAmB,GAAA,IAAA;AAAA,EACnB,SAAY,GAAA;AACd,CAAqB,EAAA;AACnB,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAwB,MAAM,CAAA;AACpE,EAAA,MAAM,kBAAkB,MAAU,IAAA,WAAA;AAElC,EAAA,MAAM,SACJ,aACC,KAAA,OAAO,WAAW,WAAc,GAAA,MAAA,CAAO,SAAS,MAAS,GAAA,EAAA,CAAA;AAE5D,EAAA,MAAM,aAAgB,GAAA,OAAA;AAAA,IACpB,MAAM,+BAA+B,MAAM,CAAA;AAAA,IAC3C,CAAC,MAAM;AAAA,GACT;AAEA,EAAA,IAAI,OAAS,EAAA;AACX,IAAA,2BACG,YACC,EAAA,EAAA,QAAA,kBAAA,GAAA;AAAA,MAAC,sBAAA;AAAA,MAAA;AAAA,QACC,SAAW,EAAA,gBAAA;AAAA,QACX,WAAW,gBAAkB,EAAA,EAAA;AAAA,QAC7B,MAAQ,EAAA,eAAA;AAAA,QACR,cAAgB,EAAA,cAAA;AAAA,QAChB;AAAA;AAAA,KAEJ,EAAA,CAAA;AAAA;AAIJ,EAAA,IAAI,aAAe,EAAA;AACjB,IAAA,2BACG,YACC,EAAA,EAAA,QAAA,kBAAA,GAAA;AAAA,MAAC,sBAAA;AAAA,MAAA;AAAA,QACC,WAAW,aAAc,CAAA,SAAA;AAAA,QACzB,mBAAmB,aAAc,CAAA,iBAAA;AAAA,QACjC,MAAQ,EAAA,eAAA;AAAA,QACR,cAAgB,EAAA,cAAA;AAAA,QAChB,SAAA,EAAW,cAAc,SAAa,IAAA;AAAA;AAAA,KAE1C,EAAA,CAAA;AAAA;AAIJ,EAAA,uBACG,GAAA,CAAA,aAAA,EAAA,EAAc,YAA4B,EAAA,YAAA,EAAc,KACvD,EAAA,QAAA,kBAAA,GAAA;AAAA,IAAC,cAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,WAAA;AAAA,MACA,gBAAA;AAAA,MACA,MAAQ,EAAA,eAAA;AAAA,MACR,cAAgB,EAAA,cAAA;AAAA,MAChB,SAAA;AAAA,MACA,WAAa,EAAA,qBAAA;AAAA,MACb,cAAgB,EAAA;AAAA;AAAA,GAEpB,EAAA,CAAA;AAEJ","file":"index.js","sourcesContent":["{\n \"name\": \"@arronqzy/abuilder\",\n \"version\": \"1.1.38\",\n \"description\": \"Abuilder 可视化编辑器 — 安装后即可通过 <App /> 渲染完整应用\",\n \"license\": \"MIT\",\n \"type\": \"module\",\n \"sideEffects\": [\n \"*.css\"\n ],\n \"files\": [\n \"dist\",\n \"README.md\"\n ],\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/index.cjs\"\n },\n \"./styles.css\": \"./dist/styles.css\",\n \"./vite\": {\n \"types\": \"./dist/vite.d.ts\",\n \"import\": \"./dist/vite.js\",\n \"require\": \"./dist/vite.cjs\",\n \"default\": \"./dist/vite.js\"\n }\n },\n \"scripts\": {\n \"lint\": \"eslint \\\"src/**/*.{ts,tsx}\\\"\",\n \"typecheck\": \"tsc -p tsconfig.json --noEmit --skipLibCheck\",\n \"build:css\": \"node ./scripts/build-css.mjs\",\n \"build:js\": \"tsup && cp src/vite.d.ts dist/vite.d.ts && cp src/vite.d.ts dist/vite.d.cts\",\n \"build\": \"pnpm run build:js && pnpm run build:css\",\n \"prepublishOnly\": \"pnpm run build\",\n \"dev\": \"tsup --watch\"\n },\n \"dependencies\": {\n \"@arronqzy/blueprint-dsl\": \"workspace:*\",\n \"@arronqzy/i18n\": \"workspace:*\",\n \"@arronqzy/react-blueprint\": \"workspace:*\",\n \"@arronqzy/react-view\": \"workspace:*\",\n \"@arronqzy/rx-store\": \"workspace:*\",\n \"@arronqzy/ui\": \"workspace:*\",\n \"@arronqzy/webllm-assistant\": \"workspace:*\"\n },\n \"peerDependencies\": {\n \"react\": \">=18\",\n \"react-dom\": \">=18\"\n },\n \"devDependencies\": {\n \"@arronqzy/eslint-config\": \"workspace:*\",\n \"@arronqzy/typescript-config\": \"workspace:*\",\n \"@types/react\": \"^19.0.1\",\n \"@types/react-dom\": \"^19.0.2\",\n \"@xyflow/react\": \"^12.9.3\",\n \"eslint\": \"^8.57.0\",\n \"postcss\": \"^8.4.49\",\n \"postcss-import\": \"^16.1.0\",\n \"tsup\": \"^8.4.0\",\n \"typescript\": \"^5.5.4\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n }\n}\n","import packageJson from \"../package.json\";\n\n/** 与 packages/abuilder/package.json 的 name / version 保持同步(构建时从 JSON 读入)。 */\nexport const ABUILDER_PACKAGE_NAME = packageJson.name;\nexport const ABUILDER_VERSION = packageJson.version;\n","import { useMemo, useState, type ReactNode } from \"react\";\nimport { ThemeProvider } from \"@arronqzy/ui\";\nimport type { Locale } from \"@arronqzy/i18n\";\nimport {\n ReactViewOnlinePreview,\n ReactViewPanel,\n parseOnlinePreviewSearchParams,\n} from \"@arronqzy/react-view\";\nimport type { WorkspaceProjectRecord } from \"@arronqzy/react-view\";\nimport { ABUILDER_PACKAGE_NAME, ABUILDER_VERSION } from \"./version\";\n\nexport type AbuilderAppProps = {\n className?: string;\n initialZoom?: number;\n /** 编辑器默认主题 */\n defaultTheme?: \"dark\" | \"light\";\n /**\n * 界面语言。省略时按 localStorage → 浏览器语言 → zh-CN 解析。\n */\n locale?: Locale | null;\n /**\n * 在线预览模式的 URL 查询串。\n * 默认读取 `window.location.search`;含 `?preview=online&projectId=...` 时进入预览页。\n */\n previewSearch?: string;\n /**\n * 是否为预览模式。`true` 时根据 `initialWorkspace` 直接渲染预览页;`false` 为编辑面板。\n * @default false\n */\n preview?: boolean;\n /**\n * 外部传入的完整工作区数据(面板 + 蓝图)。\n * 编辑模式:挂载后按这份数据完整渲染;预览模式:直接渲染预览页。\n * 省略或空:首次显示空画布 / 空蓝图,不会自动选中 IndexedDB 中的工作区。\n */\n initialWorkspace?: WorkspaceProjectRecord | null;\n /**\n * 隔离 IndexedDB / localStorage / BroadcastChannel。\n * 同一页面挂多个 App 时传入不同值,避免工作区、蓝图库、预览缓存互相覆盖。\n * 省略或空字符串保持历史全局库名。\n */\n nameSpace?: string | null;\n};\n\nfunction PreviewShell({ children }: { children: ReactNode }) {\n if (typeof document !== \"undefined\") {\n document.documentElement.classList.remove(\"dark\");\n document.documentElement.classList.add(\"light\");\n document.documentElement.dataset.theme = \"light\";\n }\n\n return (\n <div\n className=\"light min-h-[100vh] w-full bg-white text-gray-900\"\n data-theme=\"light\"\n >\n {children}\n </div>\n );\n}\n\nexport function App({\n className,\n initialZoom,\n defaultTheme = \"dark\",\n locale = null,\n previewSearch,\n preview = false,\n initialWorkspace = null,\n nameSpace = null,\n}: AbuilderAppProps) {\n const [localeState, setLocaleState] = useState<Locale | null>(locale);\n const effectiveLocale = locale ?? localeState;\n\n const search =\n previewSearch ??\n (typeof window !== \"undefined\" ? window.location.search : \"\");\n\n const previewParams = useMemo(\n () => parseOnlinePreviewSearchParams(search),\n [search]\n );\n\n if (preview) {\n return (\n <PreviewShell>\n <ReactViewOnlinePreview\n workspace={initialWorkspace}\n projectId={initialWorkspace?.id}\n locale={effectiveLocale}\n onLocaleChange={setLocaleState}\n nameSpace={nameSpace}\n />\n </PreviewShell>\n );\n }\n\n if (previewParams) {\n return (\n <PreviewShell>\n <ReactViewOnlinePreview\n projectId={previewParams.projectId}\n previewInstanceId={previewParams.previewInstanceId}\n locale={effectiveLocale}\n onLocaleChange={setLocaleState}\n nameSpace={previewParams.nameSpace ?? nameSpace}\n />\n </PreviewShell>\n );\n }\n\n return (\n <ThemeProvider defaultTheme={defaultTheme} enableSystem={false}>\n <ReactViewPanel\n className={className}\n initialZoom={initialZoom}\n initialWorkspace={initialWorkspace}\n locale={effectiveLocale}\n onLocaleChange={setLocaleState}\n nameSpace={nameSpace}\n packageName={ABUILDER_PACKAGE_NAME}\n packageVersion={ABUILDER_VERSION}\n />\n </ThemeProvider>\n );\n}\n"]}
1
+ {"version":3,"sources":["../package.json","../src/version.ts","../src/App.tsx"],"names":["App"],"mappings":";;;;;;;;;AAAA,IAAA,eAAA,GAAA;AAAA,EACE,IAAQ,EAAA,oBAAA;AAAA,EACR,OAAW,EAAA,QAiEb,CAAA;;;AChEO,IAAM,wBAAwB,eAAY,CAAA;AAC1C,IAAM,mBAAmB,eAAY,CAAA;AC8C5C,SAAS,YAAA,CAAa,EAAE,QAAA,EAAqC,EAAA;AAC3D,EAAI,IAAA,OAAO,aAAa,WAAa,EAAA;AACnC,IAAS,QAAA,CAAA,eAAA,CAAgB,SAAU,CAAA,MAAA,CAAO,MAAM,CAAA;AAChD,IAAS,QAAA,CAAA,eAAA,CAAgB,SAAU,CAAA,GAAA,CAAI,OAAO,CAAA;AAC9C,IAAS,QAAA,CAAA,eAAA,CAAgB,QAAQ,KAAQ,GAAA,OAAA;AAAA;AAG3C,EACE,uBAAA,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAU,EAAA,mDAAA;AAAA,MACV,YAAW,EAAA,OAAA;AAAA,MAEV;AAAA;AAAA,GACH;AAEJ;AAEa,IAAA,GAAA,GAAM,UAAiD,CAAA,SAASA,IAC3E,CAAA;AAAA,EACE,SAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAe,GAAA,MAAA;AAAA,EACf,MAAS,GAAA,IAAA;AAAA,EACT,aAAA;AAAA,EACA,OAAU,GAAA,KAAA;AAAA,EACV,gBAAmB,GAAA,IAAA;AAAA,EACnB,WAAc,GAAA,IAAA;AAAA,EACd,SAAY,GAAA;AACd,CAAA,EACA,GACA,EAAA;AACA,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAwB,MAAM,CAAA;AACpE,EAAA,MAAM,kBAAkB,MAAU,IAAA,WAAA;AAElC,EAAA,MAAM,SACJ,aACC,KAAA,OAAO,WAAW,WAAc,GAAA,MAAA,CAAO,SAAS,MAAS,GAAA,EAAA,CAAA;AAE5D,EAAA,MAAM,aAAgB,GAAA,OAAA;AAAA,IACpB,MAAM,+BAA+B,MAAM,CAAA;AAAA,IAC3C,CAAC,MAAM;AAAA,GACT;AAEA,EAAA,IAAI,OAAS,EAAA;AACX,IAAA,2BACG,YACC,EAAA,EAAA,QAAA,kBAAA,GAAA;AAAA,MAAC,sBAAA;AAAA,MAAA;AAAA,QACC,SAAW,EAAA,gBAAA;AAAA,QACX,WAAW,gBAAkB,EAAA,EAAA;AAAA,QAC7B,MAAQ,EAAA,eAAA;AAAA,QACR,cAAgB,EAAA,cAAA;AAAA,QAChB;AAAA;AAAA,KAEJ,EAAA,CAAA;AAAA;AAIJ,EAAA,IAAI,aAAe,EAAA;AACjB,IAAA,2BACG,YACC,EAAA,EAAA,QAAA,kBAAA,GAAA;AAAA,MAAC,sBAAA;AAAA,MAAA;AAAA,QACC,WAAW,aAAc,CAAA,SAAA;AAAA,QACzB,mBAAmB,aAAc,CAAA,iBAAA;AAAA,QACjC,MAAQ,EAAA,eAAA;AAAA,QACR,cAAgB,EAAA,cAAA;AAAA,QAChB,SAAA,EAAW,cAAc,SAAa,IAAA;AAAA;AAAA,KAE1C,EAAA,CAAA;AAAA;AAIJ,EAAA,uBACG,GAAA,CAAA,aAAA,EAAA,EAAc,YAA4B,EAAA,YAAA,EAAc,KACvD,EAAA,QAAA,kBAAA,GAAA;AAAA,IAAC,cAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,SAAA;AAAA,MACA,WAAA;AAAA,MACA,gBAAA;AAAA,MACA,WAAA;AAAA,MACA,MAAQ,EAAA,eAAA;AAAA,MACR,cAAgB,EAAA,cAAA;AAAA,MAChB,SAAA;AAAA,MACA,WAAa,EAAA,qBAAA;AAAA,MACb,cAAgB,EAAA;AAAA;AAAA,GAEpB,EAAA,CAAA;AAEJ,CAAC","file":"index.js","sourcesContent":["{\n \"name\": \"@arronqzy/abuilder\",\n \"version\": \"1.1.40\",\n \"description\": \"Abuilder 可视化编辑器 — 安装后即可通过 <App /> 渲染完整应用\",\n \"license\": \"MIT\",\n \"type\": \"module\",\n \"sideEffects\": [\n \"*.css\"\n ],\n \"files\": [\n \"dist\",\n \"README.md\"\n ],\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/index.cjs\"\n },\n \"./styles.css\": \"./dist/styles.css\",\n \"./vite\": {\n \"types\": \"./dist/vite.d.ts\",\n \"import\": \"./dist/vite.js\",\n \"require\": \"./dist/vite.cjs\",\n \"default\": \"./dist/vite.js\"\n }\n },\n \"scripts\": {\n \"lint\": \"eslint \\\"src/**/*.{ts,tsx}\\\"\",\n \"typecheck\": \"tsc -p tsconfig.json --noEmit --skipLibCheck\",\n \"build:css\": \"node ./scripts/build-css.mjs\",\n \"build:js\": \"tsup && cp src/vite.d.ts dist/vite.d.ts && cp src/vite.d.ts dist/vite.d.cts\",\n \"build\": \"pnpm run build:js && pnpm run build:css\",\n \"prepublishOnly\": \"pnpm run build\",\n \"dev\": \"tsup --watch\"\n },\n \"dependencies\": {\n \"@arronqzy/blueprint-dsl\": \"workspace:*\",\n \"@arronqzy/i18n\": \"workspace:*\",\n \"@arronqzy/react-blueprint\": \"workspace:*\",\n \"@arronqzy/react-view\": \"workspace:*\",\n \"@arronqzy/rx-store\": \"workspace:*\",\n \"@arronqzy/ui\": \"workspace:*\",\n \"@arronqzy/webllm-assistant\": \"workspace:*\"\n },\n \"peerDependencies\": {\n \"react\": \">=18\",\n \"react-dom\": \">=18\"\n },\n \"devDependencies\": {\n \"@arronqzy/eslint-config\": \"workspace:*\",\n \"@arronqzy/typescript-config\": \"workspace:*\",\n \"@types/react\": \"^19.0.1\",\n \"@types/react-dom\": \"^19.0.2\",\n \"@xyflow/react\": \"^12.9.3\",\n \"eslint\": \"^8.57.0\",\n \"postcss\": \"^8.4.49\",\n \"postcss-import\": \"^16.1.0\",\n \"tsup\": \"^8.4.0\",\n \"typescript\": \"^5.5.4\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n }\n}\n","import packageJson from \"../package.json\";\n\n/** 与 packages/abuilder/package.json 的 name / version 保持同步(构建时从 JSON 读入)。 */\nexport const ABUILDER_PACKAGE_NAME = packageJson.name;\nexport const ABUILDER_VERSION = packageJson.version;\n","import { forwardRef, useMemo, useState, type ReactNode } from \"react\";\nimport { ThemeProvider } from \"@arronqzy/ui\";\nimport type { Locale } from \"@arronqzy/i18n\";\nimport {\n ReactViewOnlinePreview,\n ReactViewPanel,\n parseOnlinePreviewSearchParams,\n type AbuilderViewHandle,\n} from \"@arronqzy/react-view\";\nimport type { WorkspaceProjectRecord } from \"@arronqzy/react-view\";\nimport { ABUILDER_PACKAGE_NAME, ABUILDER_VERSION } from \"./version\";\n\nexport type AbuilderAppProps = {\n className?: string;\n initialZoom?: number;\n /** 编辑器默认主题 */\n defaultTheme?: \"dark\" | \"light\";\n /**\n * 界面语言。省略时按 localStorage → 浏览器语言 → zh-CN 解析。\n */\n locale?: Locale | null;\n /**\n * 在线预览模式的 URL 查询串。\n * 默认读取 `window.location.search`;含 `?preview=online&projectId=...` 时进入预览页。\n */\n previewSearch?: string;\n /**\n * 是否为预览模式。`true` 时根据 `initialWorkspace` 直接渲染预览页;`false` 为编辑面板。\n * @default false\n */\n preview?: boolean;\n /**\n * 外部传入的完整工作区数据(面板 + 蓝图)。\n * 编辑模式:挂载后按这份数据完整渲染;预览模式:直接渲染预览页。\n * 省略或空:首次显示空画布 / 空蓝图,不会自动选中 IndexedDB 中的工作区。\n */\n initialWorkspace?: WorkspaceProjectRecord | null;\n /**\n * 按 IndexedDB id 打开工作区(不 remount)。\n * 与 `initialWorkspace` 同时存在时:首次优先完整记录;之后 id 变化从 IndexedDB 打开。\n */\n workspaceId?: string | null;\n /**\n * 隔离 IndexedDB / localStorage / BroadcastChannel。\n * 同一页面挂多个 App 时传入不同值,避免工作区、蓝图库、预览缓存互相覆盖。\n * 省略或空字符串保持历史全局库名。\n */\n nameSpace?: string | null;\n};\n\nfunction PreviewShell({ children }: { children: ReactNode }) {\n if (typeof document !== \"undefined\") {\n document.documentElement.classList.remove(\"dark\");\n document.documentElement.classList.add(\"light\");\n document.documentElement.dataset.theme = \"light\";\n }\n\n return (\n <div\n className=\"light min-h-[100vh] w-full bg-white text-gray-900\"\n data-theme=\"light\"\n >\n {children}\n </div>\n );\n}\n\nexport const App = forwardRef<AbuilderViewHandle, AbuilderAppProps>(function App(\n {\n className,\n initialZoom,\n defaultTheme = \"dark\",\n locale = null,\n previewSearch,\n preview = false,\n initialWorkspace = null,\n workspaceId = null,\n nameSpace = null,\n },\n ref\n) {\n const [localeState, setLocaleState] = useState<Locale | null>(locale);\n const effectiveLocale = locale ?? localeState;\n\n const search =\n previewSearch ??\n (typeof window !== \"undefined\" ? window.location.search : \"\");\n\n const previewParams = useMemo(\n () => parseOnlinePreviewSearchParams(search),\n [search]\n );\n\n if (preview) {\n return (\n <PreviewShell>\n <ReactViewOnlinePreview\n workspace={initialWorkspace}\n projectId={initialWorkspace?.id}\n locale={effectiveLocale}\n onLocaleChange={setLocaleState}\n nameSpace={nameSpace}\n />\n </PreviewShell>\n );\n }\n\n if (previewParams) {\n return (\n <PreviewShell>\n <ReactViewOnlinePreview\n projectId={previewParams.projectId}\n previewInstanceId={previewParams.previewInstanceId}\n locale={effectiveLocale}\n onLocaleChange={setLocaleState}\n nameSpace={previewParams.nameSpace ?? nameSpace}\n />\n </PreviewShell>\n );\n }\n\n return (\n <ThemeProvider defaultTheme={defaultTheme} enableSystem={false}>\n <ReactViewPanel\n ref={ref}\n className={className}\n initialZoom={initialZoom}\n initialWorkspace={initialWorkspace}\n workspaceId={workspaceId}\n locale={effectiveLocale}\n onLocaleChange={setLocaleState}\n nameSpace={nameSpace}\n packageName={ABUILDER_PACKAGE_NAME}\n packageVersion={ABUILDER_VERSION}\n />\n </ThemeProvider>\n );\n});\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arronqzy/abuilder",
3
- "version": "1.1.38",
3
+ "version": "1.1.40",
4
4
  "description": "Abuilder 可视化编辑器 — 安装后即可通过 <App /> 渲染完整应用",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -29,13 +29,13 @@
29
29
  }
30
30
  },
31
31
  "dependencies": {
32
- "@arronqzy/react-blueprint": "1.0.22",
33
- "@arronqzy/react-view": "1.0.37",
34
- "@arronqzy/rx-store": "1.0.8",
35
32
  "@arronqzy/blueprint-dsl": "1.0.17",
33
+ "@arronqzy/react-blueprint": "1.0.24",
34
+ "@arronqzy/rx-store": "1.0.8",
35
+ "@arronqzy/i18n": "0.1.17",
36
36
  "@arronqzy/ui": "1.0.10",
37
- "@arronqzy/webllm-assistant": "0.1.16",
38
- "@arronqzy/i18n": "0.1.17"
37
+ "@arronqzy/react-view": "1.0.39",
38
+ "@arronqzy/webllm-assistant": "0.1.16"
39
39
  },
40
40
  "peerDependencies": {
41
41
  "react": ">=18",