@huanban/rulego-editor-react 1.0.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 +311 -0
- package/dist/components/ComponentSidebar.d.ts +77 -0
- package/dist/components/ComponentSidebar.d.ts.map +1 -0
- package/dist/components/ContextMenu.d.ts +102 -0
- package/dist/components/ContextMenu.d.ts.map +1 -0
- package/dist/components/DataViewDialog.d.ts +41 -0
- package/dist/components/DataViewDialog.d.ts.map +1 -0
- package/dist/components/DebugPanel.d.ts +92 -0
- package/dist/components/DebugPanel.d.ts.map +1 -0
- package/dist/components/EdgePropertyDrawer.d.ts +48 -0
- package/dist/components/EdgePropertyDrawer.d.ts.map +1 -0
- package/dist/components/EditorToolbar.d.ts +99 -0
- package/dist/components/EditorToolbar.d.ts.map +1 -0
- package/dist/components/ImportExportDialog.d.ts +45 -0
- package/dist/components/ImportExportDialog.d.ts.map +1 -0
- package/dist/components/MiniMap.d.ts +75 -0
- package/dist/components/MiniMap.d.ts.map +1 -0
- package/dist/components/NodePropertyDrawer.d.ts +83 -0
- package/dist/components/NodePropertyDrawer.d.ts.map +1 -0
- package/dist/components/RuleChainSettings.d.ts +74 -0
- package/dist/components/RuleChainSettings.d.ts.map +1 -0
- package/dist/components/RuleGoEditor.d.ts +168 -0
- package/dist/components/RuleGoEditor.d.ts.map +1 -0
- package/dist/components/SearchPanel.d.ts +52 -0
- package/dist/components/SearchPanel.d.ts.map +1 -0
- package/dist/components/ValidationPanel.d.ts +57 -0
- package/dist/components/ValidationPanel.d.ts.map +1 -0
- package/dist/components/WorkflowInfoPanel.d.ts +57 -0
- package/dist/components/WorkflowInfoPanel.d.ts.map +1 -0
- package/dist/components/WorkflowList.d.ts +91 -0
- package/dist/components/WorkflowList.d.ts.map +1 -0
- package/dist/hooks/useClipboard.d.ts +89 -0
- package/dist/hooks/useClipboard.d.ts.map +1 -0
- package/dist/hooks/useEditorCore.d.ts +102 -0
- package/dist/hooks/useEditorCore.d.ts.map +1 -0
- package/dist/hooks/useEditorI18n.d.ts +33 -0
- package/dist/hooks/useEditorI18n.d.ts.map +1 -0
- package/dist/hooks/useEditorTheme.d.ts +37 -0
- package/dist/hooks/useEditorTheme.d.ts.map +1 -0
- package/dist/hooks/useKeyboardShortcuts.d.ts +73 -0
- package/dist/hooks/useKeyboardShortcuts.d.ts.map +1 -0
- package/dist/index.cjs.js +2494 -0
- package/dist/index.cjs.js.map +1 -0
- package/dist/index.d.ts +104 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.esm.js +62356 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/style.css +1 -0
- package/package.json +69 -0
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file components/ValidationPanel.tsx
|
|
3
|
+
* @description 规则链验证面板 — React 实现
|
|
4
|
+
*
|
|
5
|
+
* 功能:
|
|
6
|
+
* - 显示验证结果(错误/警告/信息)
|
|
7
|
+
* - 按级别分组展示
|
|
8
|
+
* - 点击错误项高亮对应节点/边
|
|
9
|
+
* - 支持手动触发验证
|
|
10
|
+
* - 统计信息展示
|
|
11
|
+
* - 零 UI 框架依赖(纯 React + CSS)
|
|
12
|
+
*
|
|
13
|
+
* @see ValidationPanelProps — 面板参数
|
|
14
|
+
*/
|
|
15
|
+
import React from 'react';
|
|
16
|
+
/** 验证错误项 */
|
|
17
|
+
export interface ValidationItem {
|
|
18
|
+
/** 规则名称 */
|
|
19
|
+
rule: string;
|
|
20
|
+
/** 错误级别 */
|
|
21
|
+
level: 'error' | 'warning' | 'info';
|
|
22
|
+
/** 错误消息 */
|
|
23
|
+
message: string;
|
|
24
|
+
/** 关联的元素 ID */
|
|
25
|
+
elementId?: string;
|
|
26
|
+
/** 关联的元素类型 */
|
|
27
|
+
elementType?: 'node' | 'edge';
|
|
28
|
+
}
|
|
29
|
+
/** ValidationPanel Props */
|
|
30
|
+
export interface ValidationPanelProps {
|
|
31
|
+
/** 验证结果列表 */
|
|
32
|
+
items: ValidationItem[];
|
|
33
|
+
/** 是否验证通过 */
|
|
34
|
+
isValid?: boolean;
|
|
35
|
+
/** 是否可见 */
|
|
36
|
+
visible?: boolean;
|
|
37
|
+
/** 是否正在验证中 */
|
|
38
|
+
loading?: boolean;
|
|
39
|
+
/** 面板标题 */
|
|
40
|
+
title?: string;
|
|
41
|
+
/** 手动触发验证 */
|
|
42
|
+
onValidate?: () => void;
|
|
43
|
+
/** 点击验证项(跳转到对应元素) */
|
|
44
|
+
onItemClick?: (item: ValidationItem) => void;
|
|
45
|
+
/** 关闭面板 */
|
|
46
|
+
onClose?: () => void;
|
|
47
|
+
/** 清除验证结果 */
|
|
48
|
+
onClear?: () => void;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* ValidationPanel 组件
|
|
52
|
+
*
|
|
53
|
+
* 显示规则链校验结果,支持点击跳转到问题元素。
|
|
54
|
+
*/
|
|
55
|
+
declare const ValidationPanel: React.FC<ValidationPanelProps>;
|
|
56
|
+
export default ValidationPanel;
|
|
57
|
+
//# sourceMappingURL=ValidationPanel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ValidationPanel.d.ts","sourceRoot":"","sources":["../../src/components/ValidationPanel.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAA4B,MAAM,OAAO,CAAA;AAIhD,YAAY;AACZ,MAAM,WAAW,cAAc;IAC7B,WAAW;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW;IACX,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAA;IACnC,WAAW;IACX,OAAO,EAAE,MAAM,CAAA;IACf,eAAe;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,cAAc;IACd,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;CAC9B;AAED,4BAA4B;AAC5B,MAAM,WAAW,oBAAoB;IACnC,aAAa;IACb,KAAK,EAAE,cAAc,EAAE,CAAA;IACvB,aAAa;IACb,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,WAAW;IACX,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,cAAc;IACd,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,WAAW;IACX,KAAK,CAAC,EAAE,MAAM,CAAA;IAGd,aAAa;IACb,UAAU,CAAC,EAAE,MAAM,IAAI,CAAA;IACvB,qBAAqB;IACrB,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,CAAA;IAC5C,WAAW;IACX,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,aAAa;IACb,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;CACrB;AAWD;;;;GAIG;AACH,QAAA,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,oBAAoB,CAkInD,CAAA;AAID,eAAe,eAAe,CAAA"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file components/WorkflowInfoPanel.tsx
|
|
3
|
+
* @description 工作流信息面板组件 — 支持独立引用
|
|
4
|
+
*
|
|
5
|
+
* 六大替换能力:
|
|
6
|
+
* 1. 请求替换: fetcher prop 或 apiBase
|
|
7
|
+
* 2. CSS 替换: huanban_rulego_info__ 前缀 + CSS 变量
|
|
8
|
+
* 3. Slot 插槽: renderBaseInfo / renderVarsSecrets / renderIntegration / renderExtraTabs
|
|
9
|
+
* 4. 图标替换: icons prop
|
|
10
|
+
* 5. 主题切换: theme prop
|
|
11
|
+
* 6. 事件回调: onSave / onError / onRefresh
|
|
12
|
+
*
|
|
13
|
+
* Tab 页:
|
|
14
|
+
* - 基础信息(名称/描述/状态)
|
|
15
|
+
* - 变量与秘钥(key-value 编辑)
|
|
16
|
+
* - 应用集成(API/MCP 地址展示)
|
|
17
|
+
* - 自定义 Tab(通过 renderExtraTabs 扩展)
|
|
18
|
+
*
|
|
19
|
+
* @module @huanban/rulego-editor-react
|
|
20
|
+
*/
|
|
21
|
+
import React from 'react';
|
|
22
|
+
import type { WorkflowItem, WorkflowFetcher, WorkflowInfoIcons, WorkflowTheme, RuleChainAPIOptions } from '@huanban/rulego-editor-core';
|
|
23
|
+
/** 自定义 Tab 定义 */
|
|
24
|
+
export interface ExtraTab {
|
|
25
|
+
key: string;
|
|
26
|
+
label: React.ReactNode;
|
|
27
|
+
children: React.ReactNode;
|
|
28
|
+
}
|
|
29
|
+
export interface WorkflowInfoPanelProps {
|
|
30
|
+
apiBase?: string;
|
|
31
|
+
apiOptions?: Partial<RuleChainAPIOptions>;
|
|
32
|
+
fetcher?: WorkflowFetcher;
|
|
33
|
+
/** 当前工作流数据 */
|
|
34
|
+
workflow: WorkflowItem | null;
|
|
35
|
+
theme?: WorkflowTheme;
|
|
36
|
+
className?: string;
|
|
37
|
+
style?: React.CSSProperties;
|
|
38
|
+
icons?: Partial<WorkflowInfoIcons>;
|
|
39
|
+
/** 默认激活的 Tab,默认 'base' */
|
|
40
|
+
defaultTab?: string;
|
|
41
|
+
/** 替换基础信息面板 */
|
|
42
|
+
renderBaseInfo?: (workflow: WorkflowItem, defaultPanel: React.ReactNode) => React.ReactNode;
|
|
43
|
+
/** 替换变量/秘钥面板 */
|
|
44
|
+
renderVarsSecrets?: (workflow: WorkflowItem, defaultPanel: React.ReactNode) => React.ReactNode;
|
|
45
|
+
/** 替换集成面板 */
|
|
46
|
+
renderIntegration?: (workflow: WorkflowItem, apiBase: string, defaultPanel: React.ReactNode) => React.ReactNode;
|
|
47
|
+
/** 追加自定义 Tab */
|
|
48
|
+
renderExtraTabs?: (workflow: WorkflowItem) => ExtraTab[];
|
|
49
|
+
/** 保存成功 */
|
|
50
|
+
onSave?: (type: string) => void;
|
|
51
|
+
/** 出错 */
|
|
52
|
+
onError?: (error: Error) => void;
|
|
53
|
+
/** 请求刷新外部数据 */
|
|
54
|
+
onRefresh?: () => void;
|
|
55
|
+
}
|
|
56
|
+
export declare const WorkflowInfoPanel: React.FC<WorkflowInfoPanelProps>;
|
|
57
|
+
//# sourceMappingURL=WorkflowInfoPanel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkflowInfoPanel.d.ts","sourceRoot":"","sources":["../../src/components/WorkflowInfoPanel.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAmD,MAAM,OAAO,CAAA;AAEvE,OAAO,KAAK,EACV,YAAY,EACZ,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,mBAAmB,EACpB,MAAM,6BAA6B,CAAA;AAqBpC,iBAAiB;AACjB,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,KAAK,CAAC,SAAS,CAAA;IACtB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAC1B;AAMD,MAAM,WAAW,sBAAsB;IAErC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,UAAU,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAA;IACzC,OAAO,CAAC,EAAE,eAAe,CAAA;IACzB,cAAc;IACd,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAA;IAG7B,KAAK,CAAC,EAAE,aAAa,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAA;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAA;IAClC,0BAA0B;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAA;IAGnB,eAAe;IACf,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAE,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,CAAA;IAC3F,gBAAgB;IAChB,iBAAiB,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAE,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,CAAA;IAC9F,aAAa;IACb,iBAAiB,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,CAAA;IAC/G,gBAAgB;IAChB,eAAe,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,KAAK,QAAQ,EAAE,CAAA;IAGxD,WAAW;IACX,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAC/B,SAAS;IACT,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;IAChC,eAAe;IACf,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;CACvB;AA0DD,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAAE,CAAC,sBAAsB,CAgR9D,CAAA"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file components/WorkflowList.tsx
|
|
3
|
+
* @description 工作流列表组件 — 支持独立引用
|
|
4
|
+
*
|
|
5
|
+
* 六大替换能力:
|
|
6
|
+
* 1. 请求替换: fetcher prop(实现 WorkflowFetcher 接口)或 apiBase(用内置 fetch)
|
|
7
|
+
* 2. CSS 替换: 所有 class 用 huanban_rulego_list__ 前缀 + CSS 变量,可完全覆盖
|
|
8
|
+
* 3. Slot 插槽: renderHeader / renderActions / renderEmpty / renderCreateForm / renderRow
|
|
9
|
+
* 4. 图标替换: icons prop(传入自定义图标 ReactNode)
|
|
10
|
+
* 5. 主题切换: theme prop('light' | 'dark')
|
|
11
|
+
* 6. 事件回调: onDesign / onInfo / onViewLogs / onChange / onError / onCreateSuccess
|
|
12
|
+
*
|
|
13
|
+
* 使用方式:
|
|
14
|
+
* ```tsx
|
|
15
|
+
* // 最简用法(内置 fetch)
|
|
16
|
+
* <WorkflowList apiBase="http://127.0.0.1:9090/api/v1" />
|
|
17
|
+
*
|
|
18
|
+
* // 完整自定义
|
|
19
|
+
* <WorkflowList
|
|
20
|
+
* fetcher={myFetcher}
|
|
21
|
+
* icons={{ design: <EditOutlined /> }}
|
|
22
|
+
* theme="dark"
|
|
23
|
+
* renderActions={(wf, defaults) => <>{defaults}<MyBtn /></>}
|
|
24
|
+
* onDesign={(id) => navigate(`/editor/${id}`)}
|
|
25
|
+
* />
|
|
26
|
+
* ```
|
|
27
|
+
*
|
|
28
|
+
* @module @huanban/rulego-editor-react
|
|
29
|
+
*/
|
|
30
|
+
import React from 'react';
|
|
31
|
+
import type { WorkflowItem, WorkflowFetcher, WorkflowListIcons, WorkflowTheme, RuleChainAPIOptions } from '@huanban/rulego-editor-core';
|
|
32
|
+
/**
|
|
33
|
+
* WorkflowList 组件 Props
|
|
34
|
+
*/
|
|
35
|
+
export interface WorkflowListProps {
|
|
36
|
+
/** API 基础地址(用内置 RuleChainAPI) */
|
|
37
|
+
apiBase?: string;
|
|
38
|
+
/** API 配置(传给内置 RuleChainAPI 的完整配置) */
|
|
39
|
+
apiOptions?: Partial<RuleChainAPIOptions>;
|
|
40
|
+
/** 自定义请求适配器(传了就忽略 apiBase) */
|
|
41
|
+
fetcher?: WorkflowFetcher;
|
|
42
|
+
/** 每页条数,默认 10 */
|
|
43
|
+
pageSize?: number;
|
|
44
|
+
/** 主题 */
|
|
45
|
+
theme?: WorkflowTheme;
|
|
46
|
+
/** 额外 CSS 类名 */
|
|
47
|
+
className?: string;
|
|
48
|
+
/** 行内样式 */
|
|
49
|
+
style?: React.CSSProperties;
|
|
50
|
+
/** 自定义图标映射 */
|
|
51
|
+
icons?: Partial<WorkflowListIcons>;
|
|
52
|
+
/** 是否显示搜索框,默认 true */
|
|
53
|
+
showSearch?: boolean;
|
|
54
|
+
/** 是否显示新建按钮,默认 true */
|
|
55
|
+
showCreate?: boolean;
|
|
56
|
+
/** 是否显示刷新按钮,默认 true */
|
|
57
|
+
showRefresh?: boolean;
|
|
58
|
+
/** 替换标题栏区域 */
|
|
59
|
+
renderHeader?: (defaultHeader: React.ReactNode) => React.ReactNode;
|
|
60
|
+
/** 替换每行操作按钮 */
|
|
61
|
+
renderActions?: (workflow: WorkflowItem, defaultActions: React.ReactNode) => React.ReactNode;
|
|
62
|
+
/** 替换空状态 */
|
|
63
|
+
renderEmpty?: () => React.ReactNode;
|
|
64
|
+
/** 替换新建表单内容 */
|
|
65
|
+
renderCreateForm?: (defaultForm: React.ReactNode, handlers: {
|
|
66
|
+
close: () => void;
|
|
67
|
+
submit: (data: Record<string, unknown>) => void;
|
|
68
|
+
}) => React.ReactNode;
|
|
69
|
+
/** 替换行渲染 */
|
|
70
|
+
renderRow?: (workflow: WorkflowItem, index: number, defaultRow: React.ReactNode) => React.ReactNode;
|
|
71
|
+
/** 点击设计按钮 */
|
|
72
|
+
onDesign?: (chainId: string) => void;
|
|
73
|
+
/** 点击信息按钮 */
|
|
74
|
+
onInfo?: (workflow: WorkflowItem) => void;
|
|
75
|
+
/** 点击查看日志 */
|
|
76
|
+
onViewLogs?: (chainId: string) => void;
|
|
77
|
+
/** 列表数据变化(增删改后) */
|
|
78
|
+
onChange?: () => void;
|
|
79
|
+
/** 发生错误 */
|
|
80
|
+
onError?: (error: Error) => void;
|
|
81
|
+
/** 创建成功 */
|
|
82
|
+
onCreateSuccess?: (chainId: string) => void;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* 工作流列表组件
|
|
86
|
+
*
|
|
87
|
+
* @description 支持独立引用,所有功能在包里实现。
|
|
88
|
+
* CSS 类名前缀 huanban_rulego_list__,不会污染宿主项目。
|
|
89
|
+
*/
|
|
90
|
+
export declare const WorkflowList: React.FC<WorkflowListProps>;
|
|
91
|
+
//# sourceMappingURL=WorkflowList.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkflowList.d.ts","sourceRoot":"","sources":["../../src/components/WorkflowList.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAmD,MAAM,OAAO,CAAA;AAEvE,OAAO,KAAK,EACV,YAAY,EACZ,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,mBAAmB,EAEpB,MAAM,6BAA6B,CAAA;AAyBpC;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAGhC,iCAAiC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,sCAAsC;IACtC,UAAU,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAA;IACzC,8BAA8B;IAC9B,OAAO,CAAC,EAAE,eAAe,CAAA;IAIzB,iBAAiB;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS;IACT,KAAK,CAAC,EAAE,aAAa,CAAA;IACrB,gBAAgB;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,WAAW;IACX,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAA;IAC3B,cAAc;IACd,KAAK,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAA;IAClC,sBAAsB;IACtB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,uBAAuB;IACvB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,uBAAuB;IACvB,WAAW,CAAC,EAAE,OAAO,CAAA;IAIrB,cAAc;IACd,YAAY,CAAC,EAAE,CAAC,aAAa,EAAE,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,CAAA;IAClE,eAAe;IACf,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,EAAE,cAAc,EAAE,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,CAAA;IAC5F,YAAY;IACZ,WAAW,CAAC,EAAE,MAAM,KAAK,CAAC,SAAS,CAAA;IACnC,eAAe;IACf,gBAAgB,CAAC,EAAE,CACjB,WAAW,EAAE,KAAK,CAAC,SAAS,EAC5B,QAAQ,EAAE;QAAE,KAAK,EAAE,MAAM,IAAI,CAAC;QAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;KAAE,KAC7E,KAAK,CAAC,SAAS,CAAA;IACpB,YAAY;IACZ,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,CAAA;IAInG,aAAa;IACb,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IACpC,aAAa;IACb,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,KAAK,IAAI,CAAA;IACzC,aAAa;IACb,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IACtC,mBAAmB;IACnB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;IACrB,WAAW;IACX,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;IAChC,WAAW;IACX,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;CAC5C;AAMD;;;;;GAKG;AACH,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CA6XpD,CAAA"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file useClipboard.ts
|
|
3
|
+
* @description 规则链编辑器剪贴板管理 Hook
|
|
4
|
+
*
|
|
5
|
+
* 功能:
|
|
6
|
+
* - 复制节点(单个/多个)到内部剪贴板
|
|
7
|
+
* - 粘贴节点(自动偏移位置防重叠)
|
|
8
|
+
* - 剪切节点(复制 + 删除)
|
|
9
|
+
* - 全选节点
|
|
10
|
+
* - 支持 Ctrl/Cmd + C/V/X/A 快捷键
|
|
11
|
+
*
|
|
12
|
+
* 设计:
|
|
13
|
+
* - 使用内存剪贴板(不使用系统剪贴板,避免权限问题)
|
|
14
|
+
* - 粘贴时自动生成新 ID,避免 ID 冲突
|
|
15
|
+
* - 粘贴位置自动偏移 (30px, 30px)
|
|
16
|
+
*/
|
|
17
|
+
/** 剪贴板中的节点数据 */
|
|
18
|
+
export interface ClipboardNode {
|
|
19
|
+
/** 原始节点 ID */
|
|
20
|
+
originalId: string;
|
|
21
|
+
/** 节点类型 */
|
|
22
|
+
type: string;
|
|
23
|
+
/** 节点名称 */
|
|
24
|
+
name: string;
|
|
25
|
+
/** 节点位置 X */
|
|
26
|
+
x: number;
|
|
27
|
+
/** 节点位置 Y */
|
|
28
|
+
y: number;
|
|
29
|
+
/** 节点属性数据 */
|
|
30
|
+
properties: Record<string, unknown>;
|
|
31
|
+
/** 节点的完整配置快照 */
|
|
32
|
+
config?: Record<string, unknown>;
|
|
33
|
+
}
|
|
34
|
+
/** 剪贴板操作回调 */
|
|
35
|
+
export interface ClipboardCallbacks {
|
|
36
|
+
/** 获取当前选中的节点 */
|
|
37
|
+
getSelectedNodes?: () => ClipboardNode[];
|
|
38
|
+
/** 删除指定节点(剪切用) */
|
|
39
|
+
onDeleteNodes?: (nodeIds: string[]) => void;
|
|
40
|
+
/** 添加新节点(粘贴用) */
|
|
41
|
+
onAddNodes?: (nodes: ClipboardNode[]) => void;
|
|
42
|
+
/** 全选所有节点 */
|
|
43
|
+
onSelectAll?: () => void;
|
|
44
|
+
/** 通知消息 */
|
|
45
|
+
onNotify?: (type: 'success' | 'info', message: string) => void;
|
|
46
|
+
}
|
|
47
|
+
/** useClipboard 返回值 */
|
|
48
|
+
export interface ClipboardManager {
|
|
49
|
+
/** 复制选中节点 */
|
|
50
|
+
copy: () => void;
|
|
51
|
+
/** 剪切选中节点 */
|
|
52
|
+
cut: () => void;
|
|
53
|
+
/** 粘贴剪贴板节点 */
|
|
54
|
+
paste: () => void;
|
|
55
|
+
/** 全选 */
|
|
56
|
+
selectAll: () => void;
|
|
57
|
+
/** 剪贴板是否有内容 */
|
|
58
|
+
hasContent: boolean;
|
|
59
|
+
/** 剪贴板中节点数量 */
|
|
60
|
+
clipboardCount: number;
|
|
61
|
+
/** 清空剪贴板 */
|
|
62
|
+
clear: () => void;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* useClipboard Hook
|
|
66
|
+
*
|
|
67
|
+
* @description
|
|
68
|
+
* 管理编辑器的复制/剪切/粘贴/全选操作。
|
|
69
|
+
* 使用内存剪贴板存储节点数据,粘贴时自动生成新 ID 并偏移位置。
|
|
70
|
+
*
|
|
71
|
+
* @param callbacks - 操作回调
|
|
72
|
+
* @returns 剪贴板管理器
|
|
73
|
+
*
|
|
74
|
+
* @example
|
|
75
|
+
* ```tsx
|
|
76
|
+
* const clipboard = useClipboard({
|
|
77
|
+
* getSelectedNodes: () => selectedNodes,
|
|
78
|
+
* onDeleteNodes: (ids) => deleteNodes(ids),
|
|
79
|
+
* onAddNodes: (nodes) => addNodes(nodes),
|
|
80
|
+
* onSelectAll: () => selectAllNodes(),
|
|
81
|
+
* })
|
|
82
|
+
*
|
|
83
|
+
* // 在键盘事件中调用
|
|
84
|
+
* clipboard.copy()
|
|
85
|
+
* clipboard.paste()
|
|
86
|
+
* ```
|
|
87
|
+
*/
|
|
88
|
+
export declare function useClipboard(callbacks: ClipboardCallbacks): ClipboardManager;
|
|
89
|
+
//# sourceMappingURL=useClipboard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useClipboard.d.ts","sourceRoot":"","sources":["../../src/hooks/useClipboard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAQH,gBAAgB;AAChB,MAAM,WAAW,aAAa;IAC5B,cAAc;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,aAAa;IACb,CAAC,EAAE,MAAM,CAAA;IACT,aAAa;IACb,CAAC,EAAE,MAAM,CAAA;IACT,aAAa;IACb,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACnC,gBAAgB;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACjC;AAED,cAAc;AACd,MAAM,WAAW,kBAAkB;IACjC,gBAAgB;IAChB,gBAAgB,CAAC,EAAE,MAAM,aAAa,EAAE,CAAA;IACxC,kBAAkB;IAClB,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI,CAAA;IAC3C,iBAAiB;IACjB,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,IAAI,CAAA;IAC7C,aAAa;IACb,WAAW,CAAC,EAAE,MAAM,IAAI,CAAA;IACxB,WAAW;IACX,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;CAC/D;AAED,uBAAuB;AACvB,MAAM,WAAW,gBAAgB;IAC/B,aAAa;IACb,IAAI,EAAE,MAAM,IAAI,CAAA;IAChB,aAAa;IACb,GAAG,EAAE,MAAM,IAAI,CAAA;IACf,cAAc;IACd,KAAK,EAAE,MAAM,IAAI,CAAA;IACjB,SAAS;IACT,SAAS,EAAE,MAAM,IAAI,CAAA;IACrB,eAAe;IACf,UAAU,EAAE,OAAO,CAAA;IACnB,eAAe;IACf,cAAc,EAAE,MAAM,CAAA;IACtB,YAAY;IACZ,KAAK,EAAE,MAAM,IAAI,CAAA;CAClB;AAqBD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,kBAAkB,GAAG,gBAAgB,CA8F5E"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file hooks/useEditorCore.ts
|
|
3
|
+
* @description React Hook — 将 EditorCore 桥接到 React 状态系统
|
|
4
|
+
*
|
|
5
|
+
* 兼容性:
|
|
6
|
+
* - React 16.8+ (hooks 引入版本)
|
|
7
|
+
* - React 17.x
|
|
8
|
+
* - React 18.x / 19.x
|
|
9
|
+
* - Next.js Pages Router 和 App Router
|
|
10
|
+
*
|
|
11
|
+
* 设计决策:
|
|
12
|
+
* - 使用 useEffect + useState 而非 React 18 的 useSyncExternalStore,
|
|
13
|
+
* 以确保对 React 16.8+ 的兼容性
|
|
14
|
+
* - 对于 Next.js SSR, EditorCore 实例仅在 useEffect 中创建 (客户端)
|
|
15
|
+
*
|
|
16
|
+
* 使用方式:
|
|
17
|
+
* ```tsx
|
|
18
|
+
* import { useEditorCore } from '@huanban/rulego-editor-react'
|
|
19
|
+
*
|
|
20
|
+
* function MyEditor() {
|
|
21
|
+
* const {
|
|
22
|
+
* core,
|
|
23
|
+
* isReady,
|
|
24
|
+
* isDirty,
|
|
25
|
+
* selectedNode,
|
|
26
|
+
* componentGroups,
|
|
27
|
+
* on,
|
|
28
|
+
* loadData,
|
|
29
|
+
* } = useEditorCore({ url: 'http://127.0.0.1:9090' }) // 通过 url 参数传入实际地址
|
|
30
|
+
*
|
|
31
|
+
* return <div ref={canvasRef} />
|
|
32
|
+
* }
|
|
33
|
+
* ```
|
|
34
|
+
*
|
|
35
|
+
* Next.js 兼容用法:
|
|
36
|
+
* ```tsx
|
|
37
|
+
* // 在 Next.js 中, 使用动态导入避免 SSR 报错
|
|
38
|
+
* import dynamic from 'next/dynamic'
|
|
39
|
+
* const Editor = dynamic(() => import('./Editor'), { ssr: false })
|
|
40
|
+
* ```
|
|
41
|
+
*
|
|
42
|
+
* @see EditorCore — 编辑器核心引擎
|
|
43
|
+
*/
|
|
44
|
+
import { EditorCore } from '@huanban/rulego-editor-core';
|
|
45
|
+
import type { EditorOptions, EditorEventMap, EditorEventName, RuleChainData, RuleNodeConfig, RuleConnectionConfig, ComponentDefinition, ComponentGroup } from '@huanban/rulego-editor-core';
|
|
46
|
+
/**
|
|
47
|
+
* Hook 内部管理的状态
|
|
48
|
+
*/
|
|
49
|
+
interface EditorState {
|
|
50
|
+
/** 编辑器是否就绪 */
|
|
51
|
+
isReady: boolean;
|
|
52
|
+
/** 数据是否已修改 */
|
|
53
|
+
isDirty: boolean;
|
|
54
|
+
/** 是否正在加载 */
|
|
55
|
+
isLoading: boolean;
|
|
56
|
+
/** 当前选中的节点 */
|
|
57
|
+
selectedNode: RuleNodeConfig | null;
|
|
58
|
+
/** 当前选中的边 */
|
|
59
|
+
selectedEdge: RuleConnectionConfig | null;
|
|
60
|
+
/** 组件分组 */
|
|
61
|
+
componentGroups: ComponentGroup[];
|
|
62
|
+
/** 当前编辑的节点视图 */
|
|
63
|
+
currentNodeView: ComponentDefinition | null;
|
|
64
|
+
/** 当前编辑的节点模型 */
|
|
65
|
+
currentNodeModel: Record<string, unknown>;
|
|
66
|
+
/** 是否可撤销 */
|
|
67
|
+
canUndo: boolean;
|
|
68
|
+
/** 是否可重做 */
|
|
69
|
+
canRedo: boolean;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* useEditorCore 返回的 Hook 接口
|
|
73
|
+
*/
|
|
74
|
+
export interface UseEditorCoreReturn extends EditorState {
|
|
75
|
+
/** EditorCore 原始实例 */
|
|
76
|
+
core: EditorCore | null;
|
|
77
|
+
/** 加载规则链数据 */
|
|
78
|
+
loadData: (data: RuleChainData) => void;
|
|
79
|
+
/** 监听事件 (在组件卸载时自动清理) */
|
|
80
|
+
on: <E extends EditorEventName>(event: E, handler: (payload: EditorEventMap[E]) => void) => void;
|
|
81
|
+
/** 发送事件 */
|
|
82
|
+
emit: <E extends EditorEventName>(event: E, ...args: EditorEventMap[E] extends void ? [] : [EditorEventMap[E]]) => void;
|
|
83
|
+
/** 初始化 (传入 LogicFlow 实例) */
|
|
84
|
+
init: (lfInstance: unknown) => void;
|
|
85
|
+
/** 手动触发保存 */
|
|
86
|
+
save: () => void;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* React Hook — 创建和管理 EditorCore
|
|
90
|
+
*
|
|
91
|
+
* @param options - 编辑器选项 (仅在首次渲染时使用)
|
|
92
|
+
* @returns 编辑器状态和操作方法
|
|
93
|
+
*
|
|
94
|
+
* 内部原理:
|
|
95
|
+
* - 使用 useRef 持有 EditorCore 实例 (避免重复创建)
|
|
96
|
+
* - 使用 useState 维护状态 (确保 React 重渲染)
|
|
97
|
+
* - 使用 useEffect 进行状态订阅和清理
|
|
98
|
+
* - 避免使用 React 18 专有 API, 确保 16.8+ 兼容性
|
|
99
|
+
*/
|
|
100
|
+
export declare function useEditorCore(options?: Partial<EditorOptions>): UseEditorCoreReturn;
|
|
101
|
+
export {};
|
|
102
|
+
//# sourceMappingURL=useEditorCore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useEditorCore.d.ts","sourceRoot":"","sources":["../../src/hooks/useEditorCore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AACxD,OAAO,KAAK,EACV,aAAa,EACb,cAAc,EACd,eAAe,EACf,aAAa,EACb,cAAc,EACd,oBAAoB,EACpB,mBAAmB,EACnB,cAAc,EACf,MAAM,6BAA6B,CAAA;AAMpC;;GAEG;AACH,UAAU,WAAW;IACnB,cAAc;IACd,OAAO,EAAE,OAAO,CAAA;IAChB,cAAc;IACd,OAAO,EAAE,OAAO,CAAA;IAChB,aAAa;IACb,SAAS,EAAE,OAAO,CAAA;IAClB,cAAc;IACd,YAAY,EAAE,cAAc,GAAG,IAAI,CAAA;IACnC,aAAa;IACb,YAAY,EAAE,oBAAoB,GAAG,IAAI,CAAA;IACzC,WAAW;IACX,eAAe,EAAE,cAAc,EAAE,CAAA;IACjC,gBAAgB;IAChB,eAAe,EAAE,mBAAmB,GAAG,IAAI,CAAA;IAC3C,gBAAgB;IAChB,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACzC,YAAY;IACZ,OAAO,EAAE,OAAO,CAAA;IAChB,YAAY;IACZ,OAAO,EAAE,OAAO,CAAA;CACjB;AAoBD;;GAEG;AACH,MAAM,WAAW,mBAAoB,SAAQ,WAAW;IACtD,sBAAsB;IACtB,IAAI,EAAE,UAAU,GAAG,IAAI,CAAA;IACvB,cAAc;IACd,QAAQ,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,IAAI,CAAA;IACvC,wBAAwB;IACxB,EAAE,EAAE,CAAC,CAAC,SAAS,eAAe,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,KAAK,IAAI,KAAK,IAAI,CAAA;IAChG,WAAW;IACX,IAAI,EAAE,CAAC,CAAC,SAAS,eAAe,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,SAAS,IAAI,GAAG,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAA;IACvH,4BAA4B;IAC5B,IAAI,EAAE,CAAC,UAAU,EAAE,OAAO,KAAK,IAAI,CAAA;IACnC,aAAa;IACb,IAAI,EAAE,MAAM,IAAI,CAAA;CACjB;AAMD;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAC3B,OAAO,GAAE,OAAO,CAAC,aAAa,CAAM,GACnC,mBAAmB,CAmHrB"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file hooks/useEditorI18n.ts
|
|
3
|
+
* @description React Hook — 国际化
|
|
4
|
+
*
|
|
5
|
+
* 兼容 React 16.8+, 不使用 React 18 专有 API。
|
|
6
|
+
*
|
|
7
|
+
* 使用方式:
|
|
8
|
+
* ```tsx
|
|
9
|
+
* const { t, locale, setLocale } = useEditorI18n(core)
|
|
10
|
+
*
|
|
11
|
+
* return <button>{t('toolbar.save')}</button>
|
|
12
|
+
* ```
|
|
13
|
+
*/
|
|
14
|
+
import type { EditorCore } from '@huanban/rulego-editor-core';
|
|
15
|
+
/**
|
|
16
|
+
* useEditorI18n 返回类型
|
|
17
|
+
*/
|
|
18
|
+
export interface UseEditorI18nReturn {
|
|
19
|
+
/** 翻译函数 */
|
|
20
|
+
t: (key: string, params?: Record<string, string>) => string;
|
|
21
|
+
/** 当前语言 */
|
|
22
|
+
locale: string;
|
|
23
|
+
/** 切换语言 */
|
|
24
|
+
setLocale: (locale: string) => void;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* 国际化 Hook
|
|
28
|
+
*
|
|
29
|
+
* @param core - EditorCore 实例 (可空, SSR 安全)
|
|
30
|
+
* @returns 翻译函数和语言操作
|
|
31
|
+
*/
|
|
32
|
+
export declare function useEditorI18n(core: EditorCore | null): UseEditorI18nReturn;
|
|
33
|
+
//# sourceMappingURL=useEditorI18n.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useEditorI18n.d.ts","sourceRoot":"","sources":["../../src/hooks/useEditorI18n.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AAE7D;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,WAAW;IACX,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,MAAM,CAAA;IAC3D,WAAW;IACX,MAAM,EAAE,MAAM,CAAA;IACd,WAAW;IACX,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;CACpC;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,GAAG,mBAAmB,CA4B1E"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file hooks/useEditorTheme.ts
|
|
3
|
+
* @description React Hook — 主题管理
|
|
4
|
+
*
|
|
5
|
+
* 兼容 React 16.8+, 不使用 React 18 专有 API。
|
|
6
|
+
*
|
|
7
|
+
* 使用方式:
|
|
8
|
+
* ```tsx
|
|
9
|
+
* const { currentTheme, setTheme, themes } = useEditorTheme(core)
|
|
10
|
+
*
|
|
11
|
+
* return (
|
|
12
|
+
* <select value={currentTheme} onChange={e => setTheme(e.target.value)}>
|
|
13
|
+
* {themes.map(t => <option key={t}>{t}</option>)}
|
|
14
|
+
* </select>
|
|
15
|
+
* )
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
import type { EditorCore } from '@huanban/rulego-editor-core';
|
|
19
|
+
/**
|
|
20
|
+
* useEditorTheme 返回类型
|
|
21
|
+
*/
|
|
22
|
+
export interface UseEditorThemeReturn {
|
|
23
|
+
/** 当前主题名称 */
|
|
24
|
+
currentTheme: string;
|
|
25
|
+
/** 可用主题列表 */
|
|
26
|
+
themes: string[];
|
|
27
|
+
/** 切换主题 */
|
|
28
|
+
setTheme: (name: string) => void;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* 主题管理 Hook
|
|
32
|
+
*
|
|
33
|
+
* @param core - EditorCore 实例 (可空, SSR 安全)
|
|
34
|
+
* @returns 主题状态和操作
|
|
35
|
+
*/
|
|
36
|
+
export declare function useEditorTheme(core: EditorCore | null): UseEditorThemeReturn;
|
|
37
|
+
//# sourceMappingURL=useEditorTheme.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useEditorTheme.d.ts","sourceRoot":"","sources":["../../src/hooks/useEditorTheme.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AAE7D;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,aAAa;IACb,YAAY,EAAE,MAAM,CAAA;IACpB,aAAa;IACb,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,WAAW;IACX,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CACjC;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,GAAG,oBAAoB,CAuB5E"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/** 快捷键配置 */
|
|
2
|
+
export interface ShortcutConfig {
|
|
3
|
+
/** 按键(小写,如 's', 'z', 'delete', 'backspace') */
|
|
4
|
+
key: string;
|
|
5
|
+
/** 是否需要 Ctrl/Cmd(自动适配 Mac) */
|
|
6
|
+
ctrl?: boolean;
|
|
7
|
+
/** 是否需要 Shift */
|
|
8
|
+
shift?: boolean;
|
|
9
|
+
/** 是否需要 Alt/Option */
|
|
10
|
+
alt?: boolean;
|
|
11
|
+
/** 是否在 input/textarea 焦点时也生效(默认 false) */
|
|
12
|
+
enableInInput?: boolean;
|
|
13
|
+
/** 描述文本(用于帮助界面) */
|
|
14
|
+
description?: string;
|
|
15
|
+
/** 处理函数 */
|
|
16
|
+
handler: (e: KeyboardEvent) => void;
|
|
17
|
+
}
|
|
18
|
+
/** useKeyboardShortcuts 配置 */
|
|
19
|
+
export interface UseKeyboardShortcutsOptions {
|
|
20
|
+
/** 快捷键列表 */
|
|
21
|
+
shortcuts: ShortcutConfig[];
|
|
22
|
+
/** 是否启用(默认 true) */
|
|
23
|
+
enabled?: boolean;
|
|
24
|
+
/** 事件目标元素(默认 document) */
|
|
25
|
+
target?: HTMLElement | null;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* useKeyboardShortcuts — 键盘快捷键 Hook
|
|
29
|
+
*
|
|
30
|
+
* 自动处理 Mac/Windows 快捷键差异,支持组合键。
|
|
31
|
+
*
|
|
32
|
+
* @param options - 快捷键配置
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```tsx
|
|
36
|
+
* useKeyboardShortcuts({
|
|
37
|
+
* shortcuts: [
|
|
38
|
+
* { key: 's', ctrl: true, description: '保存', handler: () => save() },
|
|
39
|
+
* { key: 'z', ctrl: true, description: '撤销', handler: () => undo() },
|
|
40
|
+
* { key: 'z', ctrl: true, shift: true, description: '重做', handler: () => redo() },
|
|
41
|
+
* { key: 'delete', description: '删除', handler: () => deleteSelected() },
|
|
42
|
+
* ],
|
|
43
|
+
* })
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
export declare function useKeyboardShortcuts(options: UseKeyboardShortcutsOptions): void;
|
|
47
|
+
/**
|
|
48
|
+
* 获取快捷键显示文本
|
|
49
|
+
*
|
|
50
|
+
* @param config - 快捷键配置
|
|
51
|
+
* @returns 可读的快捷键文本(如 "⌘S" 或 "Ctrl+S")
|
|
52
|
+
*/
|
|
53
|
+
export declare function getShortcutLabel(config: ShortcutConfig): string;
|
|
54
|
+
/**
|
|
55
|
+
* 生成编辑器默认快捷键
|
|
56
|
+
*
|
|
57
|
+
* @param handlers - 操作回调
|
|
58
|
+
* @returns 快捷键配置列表
|
|
59
|
+
*/
|
|
60
|
+
export declare function getDefaultEditorShortcuts(handlers: {
|
|
61
|
+
onSave?: () => void;
|
|
62
|
+
onUndo?: () => void;
|
|
63
|
+
onRedo?: () => void;
|
|
64
|
+
onDelete?: () => void;
|
|
65
|
+
onCopy?: () => void;
|
|
66
|
+
onPaste?: () => void;
|
|
67
|
+
onSelectAll?: () => void;
|
|
68
|
+
onFitView?: () => void;
|
|
69
|
+
onZoomIn?: () => void;
|
|
70
|
+
onZoomOut?: () => void;
|
|
71
|
+
onEscape?: () => void;
|
|
72
|
+
}): ShortcutConfig[];
|
|
73
|
+
//# sourceMappingURL=useKeyboardShortcuts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useKeyboardShortcuts.d.ts","sourceRoot":"","sources":["../../src/hooks/useKeyboardShortcuts.ts"],"names":[],"mappings":"AAsBA,YAAY;AACZ,MAAM,WAAW,cAAc;IAC7B,+CAA+C;IAC/C,GAAG,EAAE,MAAM,CAAA;IACX,8BAA8B;IAC9B,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,iBAAiB;IACjB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,sBAAsB;IACtB,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,0CAA0C;IAC1C,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,mBAAmB;IACnB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW;IACX,OAAO,EAAE,CAAC,CAAC,EAAE,aAAa,KAAK,IAAI,CAAA;CACpC;AAED,8BAA8B;AAC9B,MAAM,WAAW,2BAA2B;IAC1C,YAAY;IACZ,SAAS,EAAE,cAAc,EAAE,CAAA;IAC3B,oBAAoB;IACpB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,0BAA0B;IAC1B,MAAM,CAAC,EAAE,WAAW,GAAG,IAAI,CAAA;CAC5B;AA0BD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,2BAA2B,GAAG,IAAI,CA6C/E;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAgB/D;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE;IAClD,MAAM,CAAC,EAAE,MAAM,IAAI,CAAA;IACnB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAA;IACnB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;IACrB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAA;IACnB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,IAAI,CAAA;IACxB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;IACtB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;IACtB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;CACtB,GAAG,cAAc,EAAE,CAgBnB"}
|