@arronqzy/abuilder 1.1.39 → 1.1.41

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.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`(适用版本表写在文首)。
7
+ 当前版本见本包 `package.json`(设置菜单「关于」里显示的就是这个版本号)。本包 **1.1.41** 起配套 Soft UI 面板打磨、缩放恒定选框线宽与接口集合弹窗体验;**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,9 +141,13 @@ function HostApp() {
139
141
  |------|------|----------|
140
142
  | `workspace:add` | `AbuilderEvents.workspaceAdd` | 创建工作区成功 |
141
143
  | `workspace:sync` | `AbuilderEvents.workspaceSync` | 同步工作区成功 |
142
- | `workspace:delete` | `AbuilderEvents.workspaceDelete` | 删除工作区(界面删除,或调用 `deleteWorkspaceProject` / `clearWorkspaceProjects`),参数 `{ ids, nameSpace }` |
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 |
143
149
 
144
- `workspace:add` / `workspace:sync` 的回调参数是完整 `WorkspaceData`(即 `WorkspaceProjectRecord`):
150
+ `workspace:add` / `workspace:sync` 的回调是 `WorkspaceData & { nameSpace }`:
145
151
 
146
152
  | 字段 | 说明 |
147
153
  |------|------|
@@ -153,8 +159,9 @@ function HostApp() {
153
159
  | `blueprintMeta` | 蓝图名称、备注 |
154
160
  | `productName` | 产物名称 |
155
161
  | `titleIconDataUrl` | 标题图标(可选) |
162
+ | `nameSpace` | 所属命名空间;默认库为 `null` |
156
163
 
157
- 也可以用字符串:`addEventSubscription("workspace:add", callback)`。
164
+ 同页多个 App 时,用第三个参数过滤:`addEventSubscription(AbuilderEvents.workspaceSync, cb, { nameSpace: "my-app" })`。
158
165
 
159
166
  ## 校验和空工作区
160
167
 
@@ -185,42 +192,67 @@ createEmptyWorkspace({ name: "未命名", id: createWorkspaceProjectId() });
185
192
 
186
193
  `initialWorkspace` 为空时,首次是空画布和空蓝图。侧栏仍可列出已保存项目,但要用户手动打开。
187
194
 
188
- ## 清理浏览器里的本地数据
195
+ ## 本地数据完整 CRUD
189
196
 
190
- 编辑器会把四类数据存进浏览器 IndexedDB,并按 `nameSpace` 隔离。如果这些数据以后端为准,可以定期清理本地副本,避免越积越多。
197
+ 编辑器把四类数据存进 IndexedDB,按 `nameSpace` 隔离。公开 API 覆盖读写删清:
191
198
 
192
- | 数据 | 列出 / 读取 | 删除单条 | 清空 |
193
- |------|-------------|----------|------|
194
- | 工作区 | `listWorkspaceProjects` / `getWorkspaceProject` | `deleteWorkspaceProject` | `clearWorkspaceProjects` |
195
- | 蓝图库 | `listBlueprintLibrary` / `getBlueprintLibraryRecord` | `deleteBlueprintLibraryRecord` | `clearBlueprintLibrary` |
196
- | 蓝图执行日志 | `listExecutionRunRecords` / `getExecutionRunRecord` | `deleteExecutionRunRecord` | `clearAllExecutionRunRecords` |
197
- | 接口集合 | `listApiCollectionRecords` | `deleteApiCollection` | `clearApiCollections` |
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` |
198
205
 
199
206
  ```ts
200
207
  import {
208
+ putWorkspaceProject,
201
209
  listWorkspaceProjects,
202
210
  deleteWorkspaceProject,
203
- clearWorkspaceProjects,
204
211
  clearAbuilderStorage,
212
+ putBlueprintLibraryRecord,
213
+ putApiCollection,
205
214
  } from "@arronqzy/abuilder";
206
215
 
207
- const items = await listWorkspaceProjects(nameSpace); // [{ id, name, createdAt, updatedAt }],按更新时间倒序
208
- await deleteWorkspaceProject(items[0].id, nameSpace);
209
- const removed = await clearWorkspaceProjects(nameSpace); // 返回删除数量
216
+ // 不挂载编辑器也能预热 IndexedDB(例如后台同步后端数据)
217
+ await putWorkspaceProject(parsedWorkspace, nameSpace);
218
+ // 需要顺带通知宿主后端时:
219
+ await putWorkspaceProject(parsedWorkspace, nameSpace, { emitEvent: "sync" });
210
220
 
211
- // 一次清空四类数据,返回 { workspaces, blueprints, executionRuns, apiCollections } 各自的删除数量
212
221
  const result = await clearAbuilderStorage(nameSpace);
213
222
  ```
214
223
 
215
- - 所有函数最后一个参数都是 `nameSpace`,要和 `<App nameSpace>` 一致;省略时操作默认库。
216
- - 清空函数返回删除数量。`clearAbuilderStorage` 不动主题、字号、执行日志保留策略等偏好设置。
217
- - 删除工作区或蓝图库后,同页和其他标签页里已挂载的编辑器会自动刷新列表;若删掉的是当前打开的工作区,编辑器内容保留,但不再关联该记录。删除工作区还会发出 `workspace:delete` 事件。
218
- - 执行日志还可以按策略清理:`purgeExecutionRunsOlderThan(cutoffMs, nameSpace)` 删除早于某时间的记录,`trimExecutionRunRecordsToMax(max, nameSpace)` 只保留最近 N 条。编辑器里设置的保留策略用 `readExecutionLogSettings` / `writeExecutionLogSettings` 读写。
219
- - 接口集合的 `deleteApiCollection` / `clearApiCollections` 会同时更新已挂载编辑器里的接口列表(仅限同一 `nameSpace`)。
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`。
220
252
 
221
253
  ## 预览缩略图
222
254
 
223
- 画布已经渲染且有内容时:
255
+ 画布已经渲染且有内容时(React / Vue 均支持):
224
256
 
225
257
  ```ts
226
258
  import { getPreviewSnapshot } from "@arronqzy/abuilder";
@@ -240,8 +272,6 @@ const thumbnail = await getPreviewSnapshot({
240
272
  | `quality` | JPEG 0–1 | `0.92` |
241
273
  | `backgroundColor` | 背景色 | `"#ffffff"` |
242
274
 
243
- Vue 包没有这个函数。
244
-
245
275
  ## 还导出什么
246
276
 
247
277
  一般宿主只用 `App`。需要拆开时:
@@ -255,10 +285,12 @@ import {
255
285
  getPreviewSnapshot,
256
286
  parseWorkspaceData,
257
287
  createEmptyWorkspace,
288
+ openWorkspace,
289
+ getCurrentWorkspace,
258
290
  } from "@arronqzy/abuilder";
259
291
  ```
260
292
 
261
- 类型:`WorkspaceData`、`WorkspaceProjectRecord`、`WorkspaceProjectListItem`、`WorkspaceDeleteEventPayload`、`AbuilderStorageClearResult`、`BlueprintLibraryListItem`、`BlueprintLibraryRecord`、`ExecutionRunRecord`、`ExecutionLogSettings`、`ApiCollectionRecord`、`AbuilderEventName`、`GetPreviewSnapshotOptions`、`ParseCheckResult`、`WorkspaceParseCheckResult`。
293
+ 类型:`AbuilderViewHandle`、`WorkspaceData`、`WorkspaceProjectRecord`、`WorkspaceProjectListItem`、`WorkspaceDeleteEventPayload`、`AbuilderStorageClearResult`、`BlueprintLibraryListItem`、`BlueprintLibraryRecord`、`ExecutionRunRecord`、`ExecutionLogSettings`、`ApiCollectionRecord`、`UpsertApiCollectionInput`、`AbuilderEventName`、`GetPreviewSnapshotOptions`、`ParseCheckResult`、`WorkspaceParseCheckResult`。
262
294
 
263
295
  ## 本仓库里怎么预览
264
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.39"};
13
+ version: "1.1.41"};
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,
@@ -130,6 +133,10 @@ Object.defineProperty(exports, "createEmptyWorkspace", {
130
133
  enumerable: true,
131
134
  get: function () { return reactView.createEmptyWorkspace; }
132
135
  });
136
+ Object.defineProperty(exports, "createWorkspace", {
137
+ enumerable: true,
138
+ get: function () { return reactView.createWorkspace; }
139
+ });
133
140
  Object.defineProperty(exports, "createWorkspaceProjectId", {
134
141
  enumerable: true,
135
142
  get: function () { return reactView.createWorkspaceProjectId; }
@@ -154,6 +161,10 @@ Object.defineProperty(exports, "getBlueprintLibraryRecord", {
154
161
  enumerable: true,
155
162
  get: function () { return reactView.getBlueprintLibraryRecord; }
156
163
  });
164
+ Object.defineProperty(exports, "getCurrentWorkspace", {
165
+ enumerable: true,
166
+ get: function () { return reactView.getCurrentWorkspace; }
167
+ });
157
168
  Object.defineProperty(exports, "getExecutionRunRecord", {
158
169
  enumerable: true,
159
170
  get: function () { return reactView.getExecutionRunRecord; }
@@ -182,6 +193,10 @@ Object.defineProperty(exports, "listWorkspaceProjects", {
182
193
  enumerable: true,
183
194
  get: function () { return reactView.listWorkspaceProjects; }
184
195
  });
196
+ Object.defineProperty(exports, "openWorkspace", {
197
+ enumerable: true,
198
+ get: function () { return reactView.openWorkspace; }
199
+ });
185
200
  Object.defineProperty(exports, "parseBlueprintData", {
186
201
  enumerable: true,
187
202
  get: function () { return reactView.parseBlueprintData; }
@@ -202,14 +217,46 @@ Object.defineProperty(exports, "purgeExecutionRunsOlderThan", {
202
217
  enumerable: true,
203
218
  get: function () { return reactView.purgeExecutionRunsOlderThan; }
204
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
+ });
205
236
  Object.defineProperty(exports, "readExecutionLogSettings", {
206
237
  enumerable: true,
207
238
  get: function () { return reactView.readExecutionLogSettings; }
208
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
+ });
209
248
  Object.defineProperty(exports, "trimExecutionRunRecordsToMax", {
210
249
  enumerable: true,
211
250
  get: function () { return reactView.trimExecutionRunRecordsToMax; }
212
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
+ });
213
260
  Object.defineProperty(exports, "validateBlueprintData", {
214
261
  enumerable: true,
215
262
  get: function () { return reactView.validateBlueprintData; }
@@ -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.39\",\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.41\",\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, AbuilderStorageClearResult, ApiCollectionRecord, ApiCollectionUploadStartEventPayload, ApiCollectionUploadSuccessEventPayload, BlueprintLibraryListItem, BlueprintLibraryRecord, ExecutionLogSettings, ExecutionRunRecord, GetPreviewSnapshotOptions, I18nProvider, ParseCheckResult, ReactViewOnlinePreview, ReactViewPanel, ReactViewPanelProps, WorkspaceAddEventPayload, WorkspaceData, WorkspaceDeleteEventPayload, WorkspaceParseCheckResult, WorkspaceProjectListItem, WorkspaceProjectRecord, WorkspaceSyncEventPayload, addEventSubscription, clearAbuilderStorage, clearAllExecutionRunRecords, clearApiCollections, clearBlueprintLibrary, clearWorkspaceProjects, createEmptyWorkspace, createWorkspaceProjectId, deleteApiCollection, deleteBlueprintLibraryRecord, deleteExecutionRunRecord, deleteWorkspaceProject, getBlueprintLibraryRecord, getExecutionRunRecord, getPreviewSnapshot, getWorkspaceProject, listApiCollectionRecords, listBlueprintLibrary, listExecutionRunRecords, listWorkspaceProjects, parseBlueprintData, parseOnlinePreviewSearchParams, parseViewData, parseWorkspaceData, purgeExecutionRunsOlderThan, readExecutionLogSettings, trimExecutionRunRecordsToMax, validateBlueprintData, validateViewData, validateWorkspaceData, writeExecutionLogSettings } 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, AbuilderStorageClearResult, ApiCollectionRecord, ApiCollectionUploadStartEventPayload, ApiCollectionUploadSuccessEventPayload, BlueprintLibraryListItem, BlueprintLibraryRecord, ExecutionLogSettings, ExecutionRunRecord, GetPreviewSnapshotOptions, I18nProvider, ParseCheckResult, ReactViewOnlinePreview, ReactViewPanel, ReactViewPanelProps, WorkspaceAddEventPayload, WorkspaceData, WorkspaceDeleteEventPayload, WorkspaceParseCheckResult, WorkspaceProjectListItem, WorkspaceProjectRecord, WorkspaceSyncEventPayload, addEventSubscription, clearAbuilderStorage, clearAllExecutionRunRecords, clearApiCollections, clearBlueprintLibrary, clearWorkspaceProjects, createEmptyWorkspace, createWorkspaceProjectId, deleteApiCollection, deleteBlueprintLibraryRecord, deleteExecutionRunRecord, deleteWorkspaceProject, getBlueprintLibraryRecord, getExecutionRunRecord, getPreviewSnapshot, getWorkspaceProject, listApiCollectionRecords, listBlueprintLibrary, listExecutionRunRecords, listWorkspaceProjects, parseBlueprintData, parseOnlinePreviewSearchParams, parseViewData, parseWorkspaceData, purgeExecutionRunsOlderThan, readExecutionLogSettings, trimExecutionRunRecordsToMax, validateBlueprintData, validateViewData, validateWorkspaceData, writeExecutionLogSettings } 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, clearAbuilderStorage, clearAllExecutionRunRecords, clearApiCollections, clearBlueprintLibrary, clearWorkspaceProjects, createEmptyWorkspace, createWorkspaceProjectId, deleteApiCollection, deleteBlueprintLibraryRecord, deleteExecutionRunRecord, deleteWorkspaceProject, getBlueprintLibraryRecord, getExecutionRunRecord, getPreviewSnapshot, getWorkspaceProject, listApiCollectionRecords, listBlueprintLibrary, listExecutionRunRecords, listWorkspaceProjects, parseBlueprintData, parseOnlinePreviewSearchParams, parseViewData, parseWorkspaceData, purgeExecutionRunsOlderThan, readExecutionLogSettings, trimExecutionRunRecordsToMax, validateBlueprintData, validateViewData, validateWorkspaceData, writeExecutionLogSettings } 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.39"};
12
+ version: "1.1.41"};
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.39\",\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.41\",\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"]}