@arronqzy/abuilder 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,111 @@
1
+ # @arronqzy/abuilder
2
+
3
+ Abuilder 可视化编辑器 npm 包。安装后在 React 应用中引入 `App` 即可渲染完整编辑器(含蓝图、工作区、在线预览)。
4
+
5
+ ## 安装
6
+
7
+ ```bash
8
+ npm install @arronqzy/abuilder react react-dom
9
+ # 或
10
+ pnpm add @arronqzy/abuilder react react-dom
11
+ ```
12
+
13
+ ## 使用
14
+
15
+ ```tsx
16
+ import { createRoot } from "react-dom/client";
17
+ import { App } from "@arronqzy/abuilder";
18
+ import "@arronqzy/abuilder/styles.css";
19
+
20
+ createRoot(document.getElementById("root")!).render(<App />);
21
+ ```
22
+
23
+ ### 可选配置
24
+
25
+ ```tsx
26
+ <App
27
+ className="h-screen"
28
+ defaultTheme="dark"
29
+ initialZoom={1}
30
+ />
31
+ ```
32
+
33
+ ### 在线预览
34
+
35
+ URL 带 `?preview=online&projectId=<工作区ID>` 时自动进入预览模式。也可手动传入:
36
+
37
+ ```tsx
38
+ <App previewSearch="?preview=online&projectId=xxx" />
39
+ ```
40
+
41
+ ## 高级导出
42
+
43
+ 除 `App` 外,也可直接使用底层组件:
44
+
45
+ ```tsx
46
+ import { ReactViewPanel, ReactViewOnlinePreview } from "@arronqzy/abuilder";
47
+ ```
48
+
49
+ ## 发布到 npm
50
+
51
+ ### 构建
52
+
53
+ ```bash
54
+ pnpm -C packages/ui run build:css
55
+ pnpm -C packages/react-view run build:css
56
+ pnpm -C packages/abuilder build
57
+ ```
58
+
59
+ ### 登录
60
+
61
+ ```bash
62
+ npm login
63
+ ```
64
+
65
+ 需有 `@arronqzy` scope 发布权限,且 npm 账号已开启 **2FA(双因素认证)**。
66
+
67
+ 若发布报 `403 ... Two-factor authentication ... is required`:
68
+
69
+ 1. 打开 [npm 账号安全设置](https://www.npmjs.com/settings/~/security)
70
+ 2. 开启 **Two-Factor Authentication**(建议选 *Authorization and writes*)
71
+ 3. 重新登录:`npm logout && npm login`(按提示输入 OTP)
72
+ 4. 再执行 publish
73
+
74
+ 也可使用 [Granular Access Token](https://www.npmjs.com/settings/~/tokens)(勾选 publish 权限),然后:
75
+
76
+ ```bash
77
+ npm config set //registry.npmjs.org/:_authToken=你的token
78
+ ```
79
+
80
+ ### 先发布依赖包
81
+
82
+ ```bash
83
+ pnpm --filter @arronqzy/blueprint-dsl publish --access public --no-git-checks
84
+ pnpm --filter @arronqzy/rx-store publish --access public --no-git-checks
85
+ pnpm --filter @arronqzy/ui publish --access public --no-git-checks
86
+ pnpm --filter @arronqzy/react-blueprint publish --access public --no-git-checks
87
+ pnpm --filter @arronqzy/react-view publish --access public --no-git-checks
88
+ ```
89
+
90
+ ### 发布 abuilder
91
+
92
+ 不要用 `pnpm -C packages/abuilder publish`(会触发 npm 参数错误)。
93
+
94
+ ```bash
95
+ pnpm --filter @arronqzy/abuilder publish --access public --no-git-checks
96
+ ```
97
+
98
+ ### 发布前自检
99
+
100
+ ```bash
101
+ cd packages/abuilder && pnpm pack
102
+ tar -tzf arronqzy-abuilder-*.tgz | grep styles.css
103
+ ```
104
+
105
+ 应能看到 `package/dist/styles.css`。
106
+
107
+ ## 宿主应用要求
108
+
109
+ - React 18+
110
+ - 构建工具需支持 CSS 导入(Vite / Webpack 5 等)
111
+ - 根节点容器建议 `height: 100%`(样式已包含 `#root` / `#app` 规则)
package/dist/index.cjs ADDED
@@ -0,0 +1,58 @@
1
+ 'use strict';
2
+
3
+ var react = require('react');
4
+ var ui = require('@arronqzy/ui');
5
+ var reactView = require('@arronqzy/react-view');
6
+ var jsxRuntime = require('react/jsx-runtime');
7
+
8
+ // src/App.tsx
9
+ function App({
10
+ className,
11
+ initialZoom,
12
+ defaultTheme = "dark",
13
+ previewSearch
14
+ }) {
15
+ const search = previewSearch ?? (typeof window !== "undefined" ? window.location.search : "");
16
+ const previewParams = react.useMemo(
17
+ () => reactView.parseOnlinePreviewSearchParams(search),
18
+ [search]
19
+ );
20
+ if (previewParams) {
21
+ if (typeof document !== "undefined") {
22
+ document.documentElement.classList.remove("dark");
23
+ document.documentElement.classList.add("light");
24
+ document.documentElement.dataset.theme = "light";
25
+ }
26
+ return /* @__PURE__ */ jsxRuntime.jsx(
27
+ "div",
28
+ {
29
+ className: "light min-h-[100vh] w-full bg-white text-gray-900",
30
+ "data-theme": "light",
31
+ children: /* @__PURE__ */ jsxRuntime.jsx(
32
+ reactView.ReactViewOnlinePreview,
33
+ {
34
+ projectId: previewParams.projectId,
35
+ previewInstanceId: previewParams.previewInstanceId
36
+ }
37
+ )
38
+ }
39
+ );
40
+ }
41
+ return /* @__PURE__ */ jsxRuntime.jsx(ui.ThemeProvider, { defaultTheme, enableSystem: false, children: /* @__PURE__ */ jsxRuntime.jsx(reactView.ReactViewPanel, { className, initialZoom }) });
42
+ }
43
+
44
+ Object.defineProperty(exports, "ReactViewOnlinePreview", {
45
+ enumerable: true,
46
+ get: function () { return reactView.ReactViewOnlinePreview; }
47
+ });
48
+ Object.defineProperty(exports, "ReactViewPanel", {
49
+ enumerable: true,
50
+ get: function () { return reactView.ReactViewPanel; }
51
+ });
52
+ Object.defineProperty(exports, "parseOnlinePreviewSearchParams", {
53
+ enumerable: true,
54
+ get: function () { return reactView.parseOnlinePreviewSearchParams; }
55
+ });
56
+ exports.App = App;
57
+ //# sourceMappingURL=index.cjs.map
58
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/App.tsx"],"names":["useMemo","parseOnlinePreviewSearchParams","jsx","ReactViewOnlinePreview","ThemeProvider","ReactViewPanel"],"mappings":";;;;;;;;AAoBO,SAAS,GAAI,CAAA;AAAA,EAClB,SAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAe,GAAA,MAAA;AAAA,EACf;AACF,CAAqB,EAAA;AACnB,EAAA,MAAM,SACJ,aACC,KAAA,OAAO,WAAW,WAAc,GAAA,MAAA,CAAO,SAAS,MAAS,GAAA,EAAA,CAAA;AAE5D,EAAA,MAAM,aAAgB,GAAAA,aAAA;AAAA,IACpB,MAAMC,yCAA+B,MAAM,CAAA;AAAA,IAC3C,CAAC,MAAM;AAAA,GACT;AAEA,EAAA,IAAI,aAAe,EAAA;AACjB,IAAI,IAAA,OAAO,aAAa,WAAa,EAAA;AACnC,MAAS,QAAA,CAAA,eAAA,CAAgB,SAAU,CAAA,MAAA,CAAO,MAAM,CAAA;AAChD,MAAS,QAAA,CAAA,eAAA,CAAgB,SAAU,CAAA,GAAA,CAAI,OAAO,CAAA;AAC9C,MAAS,QAAA,CAAA,eAAA,CAAgB,QAAQ,KAAQ,GAAA,OAAA;AAAA;AAG3C,IACE,uBAAAC,cAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAU,EAAA,mDAAA;AAAA,QACV,YAAW,EAAA,OAAA;AAAA,QAEX,QAAA,kBAAAA,cAAA;AAAA,UAACC,gCAAA;AAAA,UAAA;AAAA,YACC,WAAW,aAAc,CAAA,SAAA;AAAA,YACzB,mBAAmB,aAAc,CAAA;AAAA;AAAA;AACnC;AAAA,KACF;AAAA;AAIJ,EACE,uBAAAD,cAAA,CAACE,oBAAc,YAA4B,EAAA,YAAA,EAAc,OACvD,QAAC,kBAAAF,cAAA,CAAAG,wBAAA,EAAA,EAAe,SAAsB,EAAA,WAAA,EAA0B,CAClE,EAAA,CAAA;AAEJ","file":"index.cjs","sourcesContent":["import { useMemo } from \"react\";\nimport { ThemeProvider } from \"@arronqzy/ui\";\nimport {\n ReactViewOnlinePreview,\n ReactViewPanel,\n parseOnlinePreviewSearchParams,\n} from \"@arronqzy/react-view\";\n\nexport type AbuilderAppProps = {\n className?: string;\n initialZoom?: number;\n /** 编辑器默认主题 */\n defaultTheme?: \"dark\" | \"light\";\n /**\n * 在线预览模式的 URL 查询串。\n * 默认读取 `window.location.search`;含 `?preview=online&projectId=...` 时进入预览页。\n */\n previewSearch?: string;\n};\n\nexport function App({\n className,\n initialZoom,\n defaultTheme = \"dark\",\n previewSearch,\n}: AbuilderAppProps) {\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 (previewParams) {\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 <ReactViewOnlinePreview\n projectId={previewParams.projectId}\n previewInstanceId={previewParams.previewInstanceId}\n />\n </div>\n );\n }\n\n return (\n <ThemeProvider defaultTheme={defaultTheme} enableSystem={false}>\n <ReactViewPanel className={className} initialZoom={initialZoom} />\n </ThemeProvider>\n );\n}\n"]}
@@ -0,0 +1,17 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ export { ReactViewOnlinePreview, ReactViewPanel, ReactViewPanelProps, parseOnlinePreviewSearchParams } from '@arronqzy/react-view';
3
+
4
+ type AbuilderAppProps = {
5
+ className?: string;
6
+ initialZoom?: number;
7
+ /** 编辑器默认主题 */
8
+ defaultTheme?: "dark" | "light";
9
+ /**
10
+ * 在线预览模式的 URL 查询串。
11
+ * 默认读取 `window.location.search`;含 `?preview=online&projectId=...` 时进入预览页。
12
+ */
13
+ previewSearch?: string;
14
+ };
15
+ declare function App({ className, initialZoom, defaultTheme, previewSearch, }: AbuilderAppProps): react_jsx_runtime.JSX.Element;
16
+
17
+ export { type AbuilderAppProps, App };
@@ -0,0 +1,17 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ export { ReactViewOnlinePreview, ReactViewPanel, ReactViewPanelProps, parseOnlinePreviewSearchParams } from '@arronqzy/react-view';
3
+
4
+ type AbuilderAppProps = {
5
+ className?: string;
6
+ initialZoom?: number;
7
+ /** 编辑器默认主题 */
8
+ defaultTheme?: "dark" | "light";
9
+ /**
10
+ * 在线预览模式的 URL 查询串。
11
+ * 默认读取 `window.location.search`;含 `?preview=online&projectId=...` 时进入预览页。
12
+ */
13
+ previewSearch?: string;
14
+ };
15
+ declare function App({ className, initialZoom, defaultTheme, previewSearch, }: AbuilderAppProps): react_jsx_runtime.JSX.Element;
16
+
17
+ export { type AbuilderAppProps, App };
package/dist/index.js ADDED
@@ -0,0 +1,45 @@
1
+ import { useMemo } from 'react';
2
+ import { ThemeProvider } from '@arronqzy/ui';
3
+ import { parseOnlinePreviewSearchParams, ReactViewOnlinePreview, ReactViewPanel } from '@arronqzy/react-view';
4
+ export { ReactViewOnlinePreview, ReactViewPanel, parseOnlinePreviewSearchParams } from '@arronqzy/react-view';
5
+ import { jsx } from 'react/jsx-runtime';
6
+
7
+ // src/App.tsx
8
+ function App({
9
+ className,
10
+ initialZoom,
11
+ defaultTheme = "dark",
12
+ previewSearch
13
+ }) {
14
+ const search = previewSearch ?? (typeof window !== "undefined" ? window.location.search : "");
15
+ const previewParams = useMemo(
16
+ () => parseOnlinePreviewSearchParams(search),
17
+ [search]
18
+ );
19
+ if (previewParams) {
20
+ if (typeof document !== "undefined") {
21
+ document.documentElement.classList.remove("dark");
22
+ document.documentElement.classList.add("light");
23
+ document.documentElement.dataset.theme = "light";
24
+ }
25
+ return /* @__PURE__ */ jsx(
26
+ "div",
27
+ {
28
+ className: "light min-h-[100vh] w-full bg-white text-gray-900",
29
+ "data-theme": "light",
30
+ children: /* @__PURE__ */ jsx(
31
+ ReactViewOnlinePreview,
32
+ {
33
+ projectId: previewParams.projectId,
34
+ previewInstanceId: previewParams.previewInstanceId
35
+ }
36
+ )
37
+ }
38
+ );
39
+ }
40
+ return /* @__PURE__ */ jsx(ThemeProvider, { defaultTheme, enableSystem: false, children: /* @__PURE__ */ jsx(ReactViewPanel, { className, initialZoom }) });
41
+ }
42
+
43
+ export { App };
44
+ //# sourceMappingURL=index.js.map
45
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/App.tsx"],"names":[],"mappings":";;;;;;;AAoBO,SAAS,GAAI,CAAA;AAAA,EAClB,SAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAe,GAAA,MAAA;AAAA,EACf;AACF,CAAqB,EAAA;AACnB,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,aAAe,EAAA;AACjB,IAAI,IAAA,OAAO,aAAa,WAAa,EAAA;AACnC,MAAS,QAAA,CAAA,eAAA,CAAgB,SAAU,CAAA,MAAA,CAAO,MAAM,CAAA;AAChD,MAAS,QAAA,CAAA,eAAA,CAAgB,SAAU,CAAA,GAAA,CAAI,OAAO,CAAA;AAC9C,MAAS,QAAA,CAAA,eAAA,CAAgB,QAAQ,KAAQ,GAAA,OAAA;AAAA;AAG3C,IACE,uBAAA,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAU,EAAA,mDAAA;AAAA,QACV,YAAW,EAAA,OAAA;AAAA,QAEX,QAAA,kBAAA,GAAA;AAAA,UAAC,sBAAA;AAAA,UAAA;AAAA,YACC,WAAW,aAAc,CAAA,SAAA;AAAA,YACzB,mBAAmB,aAAc,CAAA;AAAA;AAAA;AACnC;AAAA,KACF;AAAA;AAIJ,EACE,uBAAA,GAAA,CAAC,iBAAc,YAA4B,EAAA,YAAA,EAAc,OACvD,QAAC,kBAAA,GAAA,CAAA,cAAA,EAAA,EAAe,SAAsB,EAAA,WAAA,EAA0B,CAClE,EAAA,CAAA;AAEJ","file":"index.js","sourcesContent":["import { useMemo } from \"react\";\nimport { ThemeProvider } from \"@arronqzy/ui\";\nimport {\n ReactViewOnlinePreview,\n ReactViewPanel,\n parseOnlinePreviewSearchParams,\n} from \"@arronqzy/react-view\";\n\nexport type AbuilderAppProps = {\n className?: string;\n initialZoom?: number;\n /** 编辑器默认主题 */\n defaultTheme?: \"dark\" | \"light\";\n /**\n * 在线预览模式的 URL 查询串。\n * 默认读取 `window.location.search`;含 `?preview=online&projectId=...` 时进入预览页。\n */\n previewSearch?: string;\n};\n\nexport function App({\n className,\n initialZoom,\n defaultTheme = \"dark\",\n previewSearch,\n}: AbuilderAppProps) {\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 (previewParams) {\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 <ReactViewOnlinePreview\n projectId={previewParams.projectId}\n previewInstanceId={previewParams.previewInstanceId}\n />\n </div>\n );\n }\n\n return (\n <ThemeProvider defaultTheme={defaultTheme} enableSystem={false}>\n <ReactViewPanel className={className} initialZoom={initialZoom} />\n </ThemeProvider>\n );\n}\n"]}