@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 +111 -0
- package/dist/index.cjs +58 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +17 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.js +45 -0
- package/dist/index.js.map +1 -0
- package/dist/styles.css +6871 -0
- package/package.json +59 -0
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"]}
|
package/dist/index.d.cts
ADDED
|
@@ -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.d.ts
ADDED
|
@@ -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"]}
|