@arronqzy/abuilder 1.1.20 → 1.1.22

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
@@ -36,9 +36,10 @@ createRoot(document.getElementById("root")!).render(<App />);
36
36
  | `initialZoom` | 初始画布缩放 | `1` |
37
37
  | `defaultTheme` | 编辑器主题 `"dark"` / `"light"` | `"dark"` |
38
38
  | `locale` | 界面语言 `"zh-CN"` / `"en-US"`;省略则按 localStorage / 浏览器语言 | — |
39
+ | `nameSpace` | 隔离 IndexedDB / 缓存;同一页面多个 App 传入不同值 | — |
39
40
  | `previewSearch` | 在线预览 URL 查询串;含 `?preview=online&projectId=...` 时进入预览 | `window.location.search` |
40
41
  | `preview` | `true` 为预览页,`false` 为编辑面板 | `false` |
41
- | `initialWorkspace` | 完整工作区数据;编辑模式加载到面板,预览模式直接渲染 | — |
42
+ | `initialWorkspace` | 完整工作区数据;空则首次渲染空白,不会自动打开 IndexedDB 记录 | — |
42
43
 
43
44
  ```tsx
44
45
  <App
@@ -67,12 +68,14 @@ createRoot(document.getElementById("root")!).render(<App />);
67
68
 
68
69
  ### 在线预览(URL)
69
70
 
70
- URL 带 `?preview=online&projectId=<工作区ID>` 时自动进入预览模式(从 IndexedDB 加载):
71
+ URL 带 `?preview=online&projectId=<工作区ID>` 时自动进入预览模式(从 IndexedDB 加载)。若编辑器传了 `nameSpace`,预览 URL 会带 `ns=`,预览页用同一命名空间读库:
71
72
 
72
73
  ```tsx
73
- <App previewSearch="?preview=online&projectId=xxx" />
74
+ <App previewSearch="?preview=online&projectId=xxx&ns=my-app" />
74
75
  ```
75
76
 
77
+ 同一页面挂多个编辑器时,给每个 App 不同的 `nameSpace`,工作区 / 蓝图库 / 预览缓存不会互相覆盖。不传或空字符串保持原来的全局库名。
78
+
76
79
  ### 外部持久化完整流程
77
80
 
78
81
  ```tsx
@@ -160,6 +163,42 @@ syncSub.unsubscribe();
160
163
 
161
164
  也可使用事件名字符串订阅,例如 `addEventSubscription("workspace:add", callback)`。
162
165
 
166
+ ### 校验 / 解析工作区数据
167
+
168
+ 把后端或文件里的 JSON 交给 `App` 之前:
169
+
170
+ - `validate*`:只回答能不能用,不改数据。
171
+ - `parseWorkspaceData`:校验通过后补齐 `id` / 时间戳 / 空字段,返回的 `value` 可直接作为 `initialWorkspace`。
172
+ - `createEmptyWorkspace`:构造一份形状正确的空工作区,不必自己猜字段。
173
+
174
+ ```ts
175
+ import {
176
+ validateViewData,
177
+ validateBlueprintData,
178
+ validateWorkspaceData,
179
+ parseWorkspaceData,
180
+ createEmptyWorkspace,
181
+ createWorkspaceProjectId,
182
+ } from "@arronqzy/abuilder";
183
+
184
+ validateViewData(workspace.panelState); // { ok: true } 或 { ok: false, error: "invalid-view-data" }
185
+ validateBlueprintData(workspace.blueprintDocument);
186
+ validateWorkspaceData(workspace); // 同时检查视图 + 蓝图,结果里带 `view` / `blueprint`
187
+
188
+ const parsed = parseWorkspaceData(jsonFromBackend);
189
+ if (parsed.ok && parsed.value) {
190
+ // <App initialWorkspace={parsed.value} />
191
+ }
192
+
193
+ const blank = createEmptyWorkspace({ name: "未命名", id: createWorkspaceProjectId() });
194
+ ```
195
+
196
+ 也可把完整工作区对象传给 `validateViewData` / `parseViewData`(读 `panelState`)和 `validateBlueprintData` / `parseBlueprintData`(读 `blueprintDocument`)。只校验视图或只校验蓝图时用这两套,不要用 `parseWorkspaceData`(它要求两边都合法)。
197
+
198
+ `initialWorkspace` 为空(不传 / `null`)时,编辑器首次渲染空画布和空蓝图,**不会**自动选中 IndexedDB 里的第一条工作区。侧栏仍可列出已保存项目,需用户手动打开。传入的工作区会按这份数据完整显示。
199
+
200
+ IndexedDB 的 list / get / put / delete **不对外导出**。那是编辑器自己的浏览器缓存,和宿主后端双写会打架。宿主应订阅 `workspace:add` / `workspace:sync` 写入自己的存储,再用 `parseWorkspaceData` + `initialWorkspace` 灌回来。同一页多个编辑器用 `nameSpace` 隔离这份缓存。
201
+
163
202
  ### 获取预览快照
164
203
 
165
204
  ```ts
@@ -181,7 +220,7 @@ const thumbnail = await getPreviewSnapshot({
181
220
  | `quality` | JPEG 质量 0–1 | `0.92` |
182
221
  | `backgroundColor` | 背景色 | `"#ffffff"` |
183
222
 
184
- 需在 `App` / `ReactViewPanel` 或在线预览页已渲染且画布有内容时调用。
223
+ 需在 `App` / `ReactViewPanel` 或在线预览页已渲染且画布有内容时调用。Vue 包 `@arronqzy/abuilder-vue` **没有**对等实现,不要从那边找同名导出。
185
224
 
186
225
  ### 高级导出
187
226
 
@@ -194,6 +233,9 @@ import {
194
233
  addEventSubscription,
195
234
  AbuilderEvents,
196
235
  getPreviewSnapshot,
236
+ parseWorkspaceData,
237
+ createEmptyWorkspace,
238
+ createWorkspaceProjectId,
197
239
  } from "@arronqzy/abuilder";
198
240
 
199
241
  import type {
@@ -201,6 +243,8 @@ import type {
201
243
  WorkspaceProjectRecord,
202
244
  AbuilderEventName,
203
245
  GetPreviewSnapshotOptions,
246
+ ParseCheckResult,
247
+ WorkspaceParseCheckResult,
204
248
  } from "@arronqzy/abuilder";
205
249
  ```
206
250
 
package/dist/index.cjs CHANGED
@@ -28,7 +28,8 @@ function App({
28
28
  locale = null,
29
29
  previewSearch,
30
30
  preview = false,
31
- initialWorkspace = null
31
+ initialWorkspace = null,
32
+ nameSpace = null
32
33
  }) {
33
34
  const [localeState, setLocaleState] = react.useState(locale);
34
35
  const effectiveLocale = locale ?? localeState;
@@ -44,7 +45,8 @@ function App({
44
45
  workspace: initialWorkspace,
45
46
  projectId: initialWorkspace?.id,
46
47
  locale: effectiveLocale,
47
- onLocaleChange: setLocaleState
48
+ onLocaleChange: setLocaleState,
49
+ nameSpace
48
50
  }
49
51
  ) });
50
52
  }
@@ -55,7 +57,8 @@ function App({
55
57
  projectId: previewParams.projectId,
56
58
  previewInstanceId: previewParams.previewInstanceId,
57
59
  locale: effectiveLocale,
58
- onLocaleChange: setLocaleState
60
+ onLocaleChange: setLocaleState,
61
+ nameSpace: previewParams.nameSpace ?? nameSpace
59
62
  }
60
63
  ) });
61
64
  }
@@ -66,7 +69,8 @@ function App({
66
69
  initialZoom,
67
70
  initialWorkspace,
68
71
  locale: effectiveLocale,
69
- onLocaleChange: setLocaleState
72
+ onLocaleChange: setLocaleState,
73
+ nameSpace
70
74
  }
71
75
  ) });
72
76
  }
@@ -91,14 +95,46 @@ Object.defineProperty(exports, "addEventSubscription", {
91
95
  enumerable: true,
92
96
  get: function () { return reactView.addEventSubscription; }
93
97
  });
98
+ Object.defineProperty(exports, "createEmptyWorkspace", {
99
+ enumerable: true,
100
+ get: function () { return reactView.createEmptyWorkspace; }
101
+ });
102
+ Object.defineProperty(exports, "createWorkspaceProjectId", {
103
+ enumerable: true,
104
+ get: function () { return reactView.createWorkspaceProjectId; }
105
+ });
94
106
  Object.defineProperty(exports, "getPreviewSnapshot", {
95
107
  enumerable: true,
96
108
  get: function () { return reactView.getPreviewSnapshot; }
97
109
  });
110
+ Object.defineProperty(exports, "parseBlueprintData", {
111
+ enumerable: true,
112
+ get: function () { return reactView.parseBlueprintData; }
113
+ });
98
114
  Object.defineProperty(exports, "parseOnlinePreviewSearchParams", {
99
115
  enumerable: true,
100
116
  get: function () { return reactView.parseOnlinePreviewSearchParams; }
101
117
  });
118
+ Object.defineProperty(exports, "parseViewData", {
119
+ enumerable: true,
120
+ get: function () { return reactView.parseViewData; }
121
+ });
122
+ Object.defineProperty(exports, "parseWorkspaceData", {
123
+ enumerable: true,
124
+ get: function () { return reactView.parseWorkspaceData; }
125
+ });
126
+ Object.defineProperty(exports, "validateBlueprintData", {
127
+ enumerable: true,
128
+ get: function () { return reactView.validateBlueprintData; }
129
+ });
130
+ Object.defineProperty(exports, "validateViewData", {
131
+ enumerable: true,
132
+ get: function () { return reactView.validateViewData; }
133
+ });
134
+ Object.defineProperty(exports, "validateWorkspaceData", {
135
+ enumerable: true,
136
+ get: function () { return reactView.validateWorkspaceData; }
137
+ });
102
138
  exports.App = App;
103
139
  //# sourceMappingURL=index.cjs.map
104
140
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/App.tsx"],"names":["jsx","useState","useMemo","parseOnlinePreviewSearchParams","ReactViewOnlinePreview","ThemeProvider","ReactViewPanel"],"mappings":";;;;;;;;AAoCA,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;AACrB,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;AAAA;AAAA,KAEpB,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;AAAA;AAAA,KAEpB,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;AAAA;AAAA,GAEpB,EAAA,CAAA;AAEJ","file":"index.cjs","sourcesContent":["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\";\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 */\n initialWorkspace?: WorkspaceProjectRecord | 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}: 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 />\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 />\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 />\n </ThemeProvider>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/App.tsx"],"names":["jsx","useState","useMemo","parseOnlinePreviewSearchParams","ReactViewOnlinePreview","ThemeProvider","ReactViewPanel"],"mappings":";;;;;;;;AA2CA,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;AAAA;AAAA,GAEJ,EAAA,CAAA;AAEJ","file":"index.cjs","sourcesContent":["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\";\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 />\n </ThemeProvider>\n );\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -2,7 +2,7 @@ import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import { Locale } from '@arronqzy/i18n';
3
3
  export { Locale } from '@arronqzy/i18n';
4
4
  import { WorkspaceProjectRecord } from '@arronqzy/react-view';
5
- export { AbuilderEventName, AbuilderEventPayloadMap, AbuilderEvents, GetPreviewSnapshotOptions, I18nProvider, ReactViewOnlinePreview, ReactViewPanel, ReactViewPanelProps, WorkspaceAddEventPayload, WorkspaceData, WorkspaceProjectRecord, WorkspaceSyncEventPayload, addEventSubscription, getPreviewSnapshot, parseOnlinePreviewSearchParams } from '@arronqzy/react-view';
5
+ export { AbuilderEventName, AbuilderEventPayloadMap, AbuilderEvents, GetPreviewSnapshotOptions, I18nProvider, ParseCheckResult, ReactViewOnlinePreview, ReactViewPanel, ReactViewPanelProps, WorkspaceAddEventPayload, WorkspaceData, WorkspaceParseCheckResult, WorkspaceProjectRecord, WorkspaceSyncEventPayload, addEventSubscription, createEmptyWorkspace, createWorkspaceProjectId, getPreviewSnapshot, parseBlueprintData, parseOnlinePreviewSearchParams, parseViewData, parseWorkspaceData, validateBlueprintData, validateViewData, validateWorkspaceData } from '@arronqzy/react-view';
6
6
 
7
7
  type AbuilderAppProps = {
8
8
  className?: string;
@@ -25,10 +25,17 @@ type AbuilderAppProps = {
25
25
  preview?: boolean;
26
26
  /**
27
27
  * 外部传入的完整工作区数据(面板 + 蓝图)。
28
- * 编辑模式:挂载后加载到面板;预览模式:直接渲染预览页。
28
+ * 编辑模式:挂载后按这份数据完整渲染;预览模式:直接渲染预览页。
29
+ * 省略或空:首次显示空画布 / 空蓝图,不会自动选中 IndexedDB 中的工作区。
29
30
  */
30
31
  initialWorkspace?: WorkspaceProjectRecord | null;
32
+ /**
33
+ * 隔离 IndexedDB / localStorage / BroadcastChannel。
34
+ * 同一页面挂多个 App 时传入不同值,避免工作区、蓝图库、预览缓存互相覆盖。
35
+ * 省略或空字符串保持历史全局库名。
36
+ */
37
+ nameSpace?: string | null;
31
38
  };
32
- declare function App({ className, initialZoom, defaultTheme, locale, previewSearch, preview, initialWorkspace, }: AbuilderAppProps): react_jsx_runtime.JSX.Element;
39
+ declare function App({ className, initialZoom, defaultTheme, locale, previewSearch, preview, initialWorkspace, nameSpace, }: AbuilderAppProps): react_jsx_runtime.JSX.Element;
33
40
 
34
41
  export { type AbuilderAppProps, App };
package/dist/index.d.ts CHANGED
@@ -2,7 +2,7 @@ import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import { Locale } from '@arronqzy/i18n';
3
3
  export { Locale } from '@arronqzy/i18n';
4
4
  import { WorkspaceProjectRecord } from '@arronqzy/react-view';
5
- export { AbuilderEventName, AbuilderEventPayloadMap, AbuilderEvents, GetPreviewSnapshotOptions, I18nProvider, ReactViewOnlinePreview, ReactViewPanel, ReactViewPanelProps, WorkspaceAddEventPayload, WorkspaceData, WorkspaceProjectRecord, WorkspaceSyncEventPayload, addEventSubscription, getPreviewSnapshot, parseOnlinePreviewSearchParams } from '@arronqzy/react-view';
5
+ export { AbuilderEventName, AbuilderEventPayloadMap, AbuilderEvents, GetPreviewSnapshotOptions, I18nProvider, ParseCheckResult, ReactViewOnlinePreview, ReactViewPanel, ReactViewPanelProps, WorkspaceAddEventPayload, WorkspaceData, WorkspaceParseCheckResult, WorkspaceProjectRecord, WorkspaceSyncEventPayload, addEventSubscription, createEmptyWorkspace, createWorkspaceProjectId, getPreviewSnapshot, parseBlueprintData, parseOnlinePreviewSearchParams, parseViewData, parseWorkspaceData, validateBlueprintData, validateViewData, validateWorkspaceData } from '@arronqzy/react-view';
6
6
 
7
7
  type AbuilderAppProps = {
8
8
  className?: string;
@@ -25,10 +25,17 @@ type AbuilderAppProps = {
25
25
  preview?: boolean;
26
26
  /**
27
27
  * 外部传入的完整工作区数据(面板 + 蓝图)。
28
- * 编辑模式:挂载后加载到面板;预览模式:直接渲染预览页。
28
+ * 编辑模式:挂载后按这份数据完整渲染;预览模式:直接渲染预览页。
29
+ * 省略或空:首次显示空画布 / 空蓝图,不会自动选中 IndexedDB 中的工作区。
29
30
  */
30
31
  initialWorkspace?: WorkspaceProjectRecord | null;
32
+ /**
33
+ * 隔离 IndexedDB / localStorage / BroadcastChannel。
34
+ * 同一页面挂多个 App 时传入不同值,避免工作区、蓝图库、预览缓存互相覆盖。
35
+ * 省略或空字符串保持历史全局库名。
36
+ */
37
+ nameSpace?: string | null;
31
38
  };
32
- declare function App({ className, initialZoom, defaultTheme, locale, previewSearch, preview, initialWorkspace, }: AbuilderAppProps): react_jsx_runtime.JSX.Element;
39
+ declare function App({ className, initialZoom, defaultTheme, locale, previewSearch, preview, initialWorkspace, nameSpace, }: AbuilderAppProps): react_jsx_runtime.JSX.Element;
33
40
 
34
41
  export { type AbuilderAppProps, App };
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { 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, getPreviewSnapshot, parseOnlinePreviewSearchParams } from '@arronqzy/react-view';
4
+ export { AbuilderEvents, I18nProvider, ReactViewOnlinePreview, ReactViewPanel, addEventSubscription, createEmptyWorkspace, createWorkspaceProjectId, getPreviewSnapshot, parseBlueprintData, parseOnlinePreviewSearchParams, parseViewData, parseWorkspaceData, validateBlueprintData, validateViewData, validateWorkspaceData } from '@arronqzy/react-view';
5
5
  import { jsx } from 'react/jsx-runtime';
6
6
 
7
7
  // src/App.tsx
@@ -27,7 +27,8 @@ function App({
27
27
  locale = null,
28
28
  previewSearch,
29
29
  preview = false,
30
- initialWorkspace = null
30
+ initialWorkspace = null,
31
+ nameSpace = null
31
32
  }) {
32
33
  const [localeState, setLocaleState] = useState(locale);
33
34
  const effectiveLocale = locale ?? localeState;
@@ -43,7 +44,8 @@ function App({
43
44
  workspace: initialWorkspace,
44
45
  projectId: initialWorkspace?.id,
45
46
  locale: effectiveLocale,
46
- onLocaleChange: setLocaleState
47
+ onLocaleChange: setLocaleState,
48
+ nameSpace
47
49
  }
48
50
  ) });
49
51
  }
@@ -54,7 +56,8 @@ function App({
54
56
  projectId: previewParams.projectId,
55
57
  previewInstanceId: previewParams.previewInstanceId,
56
58
  locale: effectiveLocale,
57
- onLocaleChange: setLocaleState
59
+ onLocaleChange: setLocaleState,
60
+ nameSpace: previewParams.nameSpace ?? nameSpace
58
61
  }
59
62
  ) });
60
63
  }
@@ -65,7 +68,8 @@ function App({
65
68
  initialZoom,
66
69
  initialWorkspace,
67
70
  locale: effectiveLocale,
68
- onLocaleChange: setLocaleState
71
+ onLocaleChange: setLocaleState,
72
+ nameSpace
69
73
  }
70
74
  ) });
71
75
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/App.tsx"],"names":[],"mappings":";;;;;;;AAoCA,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;AACrB,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;AAAA;AAAA,KAEpB,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;AAAA;AAAA,KAEpB,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;AAAA;AAAA,GAEpB,EAAA,CAAA;AAEJ","file":"index.js","sourcesContent":["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\";\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 */\n initialWorkspace?: WorkspaceProjectRecord | 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}: 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 />\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 />\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 />\n </ThemeProvider>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/App.tsx"],"names":[],"mappings":";;;;;;;AA2CA,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;AAAA;AAAA,GAEJ,EAAA,CAAA;AAEJ","file":"index.js","sourcesContent":["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\";\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 />\n </ThemeProvider>\n );\n}\n"]}
package/dist/styles.css CHANGED
@@ -3832,6 +3832,10 @@ video {
3832
3832
  inset: 0px;
3833
3833
  }
3834
3834
 
3835
+ .inset-1\.5 {
3836
+ inset: 0.375rem;
3837
+ }
3838
+
3835
3839
  .inset-2 {
3836
3840
  inset: 0.5rem;
3837
3841
  }
@@ -3861,6 +3865,10 @@ video {
3861
3865
  left: 0.125rem;
3862
3866
  }
3863
3867
 
3868
+ .left-1 {
3869
+ left: 0.25rem;
3870
+ }
3871
+
3864
3872
  .left-1\/2 {
3865
3873
  left: 50%;
3866
3874
  }
@@ -3869,6 +3877,10 @@ video {
3869
3877
  left: 0.5rem;
3870
3878
  }
3871
3879
 
3880
+ .left-6 {
3881
+ left: 1.5rem;
3882
+ }
3883
+
3872
3884
  .left-\[var\(--rv-ruler-size\)\] {
3873
3885
  left: var(--rv-ruler-size);
3874
3886
  }
@@ -3893,10 +3905,18 @@ video {
3893
3905
  top: 0.125rem;
3894
3906
  }
3895
3907
 
3908
+ .top-1 {
3909
+ top: 0.25rem;
3910
+ }
3911
+
3896
3912
  .top-2 {
3897
3913
  top: 0.5rem;
3898
3914
  }
3899
3915
 
3916
+ .top-4 {
3917
+ top: 1rem;
3918
+ }
3919
+
3900
3920
  .top-\[calc\(100\%\+6px\)\] {
3901
3921
  top: calc(100% + 6px);
3902
3922
  }
@@ -4729,6 +4749,10 @@ video {
4729
4749
  border-radius: 1rem;
4730
4750
  }
4731
4751
 
4752
+ .rounded-\[2px\] {
4753
+ border-radius: 2px;
4754
+ }
4755
+
4732
4756
  .rounded-full {
4733
4757
  border-radius: 9999px;
4734
4758
  }
@@ -4749,6 +4773,15 @@ video {
4749
4773
  border-radius: 0.75rem;
4750
4774
  }
4751
4775
 
4776
+ .rounded-l {
4777
+ border-top-left-radius: 0.25rem;
4778
+ border-bottom-left-radius: 0.25rem;
4779
+ }
4780
+
4781
+ .rounded-tl {
4782
+ border-top-left-radius: 0.25rem;
4783
+ }
4784
+
4752
4785
  .border {
4753
4786
  border-width: 1px;
4754
4787
  }
@@ -5106,10 +5139,22 @@ video {
5106
5139
  background-color: hsl(var(--primary) / 0.15);
5107
5140
  }
5108
5141
 
5142
+ .bg-primary\/30 {
5143
+ background-color: hsl(var(--primary) / 0.3);
5144
+ }
5145
+
5109
5146
  .bg-primary\/35 {
5110
5147
  background-color: hsl(var(--primary) / 0.35);
5111
5148
  }
5112
5149
 
5150
+ .bg-primary\/40 {
5151
+ background-color: hsl(var(--primary) / 0.4);
5152
+ }
5153
+
5154
+ .bg-primary\/45 {
5155
+ background-color: hsl(var(--primary) / 0.45);
5156
+ }
5157
+
5113
5158
  .bg-primary\/5 {
5114
5159
  background-color: hsl(var(--primary) / 0.05);
5115
5160
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arronqzy/abuilder",
3
- "version": "1.1.20",
3
+ "version": "1.1.22",
4
4
  "description": "Abuilder 可视化编辑器 — 安装后即可通过 <App /> 渲染完整应用",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -23,10 +23,10 @@
23
23
  "./styles.css": "./dist/styles.css"
24
24
  },
25
25
  "dependencies": {
26
- "@arronqzy/blueprint-dsl": "1.0.9",
27
- "@arronqzy/i18n": "0.1.7",
28
- "@arronqzy/react-blueprint": "1.0.11",
29
- "@arronqzy/react-view": "1.0.20",
26
+ "@arronqzy/blueprint-dsl": "1.0.11",
27
+ "@arronqzy/i18n": "0.1.8",
28
+ "@arronqzy/react-blueprint": "1.0.13",
29
+ "@arronqzy/react-view": "1.0.22",
30
30
  "@arronqzy/rx-store": "1.0.5",
31
31
  "@arronqzy/ui": "1.0.6"
32
32
  },