@huanban/rulego-editor-core 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.
Files changed (102) hide show
  1. package/README.md +211 -0
  2. package/dist/api/RuleChainAPI.d.ts +163 -0
  3. package/dist/api/RuleChainAPI.d.ts.map +1 -0
  4. package/dist/api/index.d.ts +15 -0
  5. package/dist/api/index.d.ts.map +1 -0
  6. package/dist/api/types.d.ts +244 -0
  7. package/dist/api/types.d.ts.map +1 -0
  8. package/dist/core/ComponentRegistry.d.ts +141 -0
  9. package/dist/core/ComponentRegistry.d.ts.map +1 -0
  10. package/dist/core/DataAdapter.d.ts +129 -0
  11. package/dist/core/DataAdapter.d.ts.map +1 -0
  12. package/dist/core/EditorCore.d.ts +251 -0
  13. package/dist/core/EditorCore.d.ts.map +1 -0
  14. package/dist/core/EventBus.d.ts +101 -0
  15. package/dist/core/EventBus.d.ts.map +1 -0
  16. package/dist/core/HistoryManager.d.ts +166 -0
  17. package/dist/core/HistoryManager.d.ts.map +1 -0
  18. package/dist/core/I18nManager.d.ts +130 -0
  19. package/dist/core/I18nManager.d.ts.map +1 -0
  20. package/dist/core/StateStore.d.ts +160 -0
  21. package/dist/core/StateStore.d.ts.map +1 -0
  22. package/dist/core/ThemeManager.d.ts +175 -0
  23. package/dist/core/ThemeManager.d.ts.map +1 -0
  24. package/dist/core/ValidationEngine.d.ts +139 -0
  25. package/dist/core/ValidationEngine.d.ts.map +1 -0
  26. package/dist/core/index.d.ts +30 -0
  27. package/dist/core/index.d.ts.map +1 -0
  28. package/dist/defaults/components.d.ts +30 -0
  29. package/dist/defaults/components.d.ts.map +1 -0
  30. package/dist/defaults/index.d.ts +18 -0
  31. package/dist/defaults/index.d.ts.map +1 -0
  32. package/dist/defaults/locale-en-US.d.ts +26 -0
  33. package/dist/defaults/locale-en-US.d.ts.map +1 -0
  34. package/dist/defaults/locale-zh-CN.d.ts +41 -0
  35. package/dist/defaults/locale-zh-CN.d.ts.map +1 -0
  36. package/dist/iconRegistry.d.ts +17 -0
  37. package/dist/iconRegistry.d.ts.map +1 -0
  38. package/dist/index.cjs.js +2490 -0
  39. package/dist/index.cjs.js.map +1 -0
  40. package/dist/index.d.ts +49 -0
  41. package/dist/index.d.ts.map +1 -0
  42. package/dist/index.esm.js +59608 -0
  43. package/dist/index.esm.js.map +1 -0
  44. package/dist/index.umd.js +2490 -0
  45. package/dist/index.umd.js.map +1 -0
  46. package/dist/standalone/HuanbanRulegoEditor.d.ts +392 -0
  47. package/dist/standalone/HuanbanRulegoEditor.d.ts.map +1 -0
  48. package/dist/standalone/code-editor.d.ts +95 -0
  49. package/dist/standalone/code-editor.d.ts.map +1 -0
  50. package/dist/standalone/custom-nodes.d.ts +26 -0
  51. package/dist/standalone/custom-nodes.d.ts.map +1 -0
  52. package/dist/standalone/editor-chain-info.d.ts +46 -0
  53. package/dist/standalone/editor-chain-info.d.ts.map +1 -0
  54. package/dist/standalone/editor-context-menu.d.ts +21 -0
  55. package/dist/standalone/editor-context-menu.d.ts.map +1 -0
  56. package/dist/standalone/editor-debug-ws.d.ts +170 -0
  57. package/dist/standalone/editor-debug-ws.d.ts.map +1 -0
  58. package/dist/standalone/editor-dialogs.d.ts +73 -0
  59. package/dist/standalone/editor-dialogs.d.ts.map +1 -0
  60. package/dist/standalone/editor-events.d.ts +28 -0
  61. package/dist/standalone/editor-events.d.ts.map +1 -0
  62. package/dist/standalone/editor-property-drawers.d.ts +78 -0
  63. package/dist/standalone/editor-property-drawers.d.ts.map +1 -0
  64. package/dist/standalone/editor-route-settings.d.ts +49 -0
  65. package/dist/standalone/editor-route-settings.d.ts.map +1 -0
  66. package/dist/standalone/editor-sidebar.d.ts +19 -0
  67. package/dist/standalone/editor-sidebar.d.ts.map +1 -0
  68. package/dist/standalone/editor-styles.d.ts +12 -0
  69. package/dist/standalone/editor-styles.d.ts.map +1 -0
  70. package/dist/standalone/editor-toolbar.d.ts +89 -0
  71. package/dist/standalone/editor-toolbar.d.ts.map +1 -0
  72. package/dist/standalone/group-node.d.ts +52 -0
  73. package/dist/standalone/group-node.d.ts.map +1 -0
  74. package/dist/standalone/icon-utils.d.ts +19 -0
  75. package/dist/standalone/icon-utils.d.ts.map +1 -0
  76. package/dist/standalone/index.d.ts +9 -0
  77. package/dist/standalone/index.d.ts.map +1 -0
  78. package/dist/standalone/logger.d.ts +35 -0
  79. package/dist/standalone/logger.d.ts.map +1 -0
  80. package/dist/standalone/node-definitions.d.ts +74 -0
  81. package/dist/standalone/node-definitions.d.ts.map +1 -0
  82. package/dist/standalone/node-views-data.d.ts +21 -0
  83. package/dist/standalone/node-views-data.d.ts.map +1 -0
  84. package/dist/standalone/themes.d.ts +54 -0
  85. package/dist/standalone/themes.d.ts.map +1 -0
  86. package/dist/types/component.d.ts +120 -0
  87. package/dist/types/component.d.ts.map +1 -0
  88. package/dist/types/editor.d.ts +246 -0
  89. package/dist/types/editor.d.ts.map +1 -0
  90. package/dist/types/events.d.ts +199 -0
  91. package/dist/types/events.d.ts.map +1 -0
  92. package/dist/types/index.d.ts +12 -0
  93. package/dist/types/index.d.ts.map +1 -0
  94. package/dist/types/rule-chain.d.ts +141 -0
  95. package/dist/types/rule-chain.d.ts.map +1 -0
  96. package/dist/utils/helpers.d.ts +100 -0
  97. package/dist/utils/helpers.d.ts.map +1 -0
  98. package/dist/utils/index.d.ts +6 -0
  99. package/dist/utils/index.d.ts.map +1 -0
  100. package/dist/utils/pinyin-search.d.ts +60 -0
  101. package/dist/utils/pinyin-search.d.ts.map +1 -0
  102. package/package.json +70 -0
@@ -0,0 +1,166 @@
1
+ /**
2
+ * @file HistoryManager.ts
3
+ * @description 基于 Command 模式的撤销/重做系统
4
+ *
5
+ * 实现完整的 Undo/Redo 功能,核心概念:
6
+ * - Command: 封装一个可执行和可撤销的操作
7
+ * - UndoStack: 记录已执行的命令
8
+ * - RedoStack: 记录已撤销的命令
9
+ * - BatchCommand: 将多个命令组合为一个原子操作
10
+ *
11
+ * 原版编辑器通过 LogicFlow 的 history:change 事件维护 undos/redos 数组,
12
+ * 这里改为独立的 HistoryManager 以支持更细粒度的操作控制。
13
+ */
14
+ /**
15
+ * 命令接口
16
+ * 每个可撤销的操作都实现此接口
17
+ */
18
+ export interface Command {
19
+ /** 执行操作 */
20
+ execute(): void;
21
+ /** 撤销操作 */
22
+ undo(): void;
23
+ /** 操作描述 (用于调试和 UI 提示) */
24
+ description: string;
25
+ }
26
+ /**
27
+ * 历史记录变更回调
28
+ */
29
+ type HistoryChangeCallback = (state: {
30
+ canUndo: boolean;
31
+ canRedo: boolean;
32
+ undoCount: number;
33
+ redoCount: number;
34
+ }) => void;
35
+ /**
36
+ * 撤销/重做管理器
37
+ *
38
+ * @example
39
+ * ```typescript
40
+ * const history = new HistoryManager({ maxHistory: 50 })
41
+ *
42
+ * // 监听变更
43
+ * history.onChange((state) => {
44
+ * updateUndoButton(state.canUndo)
45
+ * updateRedoButton(state.canRedo)
46
+ * })
47
+ *
48
+ * // 执行命令
49
+ * history.execute(new AddNodeCommand(editor, nodeData))
50
+ *
51
+ * // 撤销
52
+ * history.undo()
53
+ *
54
+ * // 重做
55
+ * history.redo()
56
+ * ```
57
+ */
58
+ export declare class HistoryManager {
59
+ /** 撤销栈 (最近执行的命令在顶部) */
60
+ private undoStack;
61
+ /** 重做栈 (最近撤销的命令在顶部) */
62
+ private redoStack;
63
+ /** 最大历史记录数 */
64
+ private maxHistory;
65
+ /** 变更回调列表 */
66
+ private changeCallbacks;
67
+ /** 是否暂停记录 (批量操作时使用) */
68
+ private paused;
69
+ /**
70
+ * 创建历史管理器
71
+ *
72
+ * @param options - 配置选项
73
+ * @param options.maxHistory - 最大历史记录数 (默认: 50)
74
+ */
75
+ constructor(options?: {
76
+ maxHistory?: number;
77
+ });
78
+ /**
79
+ * 执行一个命令并记录到撤销栈
80
+ *
81
+ * 执行新命令后会清空重做栈 (与所有编辑器的标准行为一致)
82
+ *
83
+ * @param command - 要执行的命令
84
+ */
85
+ execute(command: Command): void;
86
+ /**
87
+ * 撤销最近的命令
88
+ *
89
+ * @returns 是否成功撤销
90
+ */
91
+ undo(): boolean;
92
+ /**
93
+ * 重做最近撤销的命令
94
+ *
95
+ * @returns 是否成功重做
96
+ */
97
+ redo(): boolean;
98
+ /**
99
+ * 是否可以撤销
100
+ */
101
+ canUndo(): boolean;
102
+ /**
103
+ * 是否可以重做
104
+ */
105
+ canRedo(): boolean;
106
+ /**
107
+ * 获取撤销栈中的命令描述列表 (用于调试/UI显示)
108
+ */
109
+ getUndoDescriptions(): string[];
110
+ /**
111
+ * 获取重做栈中的命令描述列表
112
+ */
113
+ getRedoDescriptions(): string[];
114
+ /**
115
+ * 批量执行多个命令 (作为一个原子操作记录)
116
+ *
117
+ * 在批量执行期间暂停单独记录, 执行完成后创建 BatchCommand 统一记录
118
+ *
119
+ * @param commands - 要执行的命令列表
120
+ * @param description - 批量操作描述
121
+ */
122
+ executeBatch(commands: Command[], description: string): void;
123
+ /**
124
+ * 监听历史记录变更
125
+ *
126
+ * @param callback - 变更回调
127
+ * @returns 取消监听的函数
128
+ */
129
+ onChange(callback: HistoryChangeCallback): () => void;
130
+ /**
131
+ * 清空所有历史记录
132
+ */
133
+ clear(): void;
134
+ /**
135
+ * 暂停历史记录 (执行一些不需要撤销的操作时)
136
+ */
137
+ pause(): void;
138
+ /**
139
+ * 恢复历史记录
140
+ */
141
+ resume(): void;
142
+ /**
143
+ * 销毁管理器
144
+ */
145
+ destroy(): void;
146
+ /**
147
+ * 通知所有监听器状态变更
148
+ */
149
+ private notifyChange;
150
+ }
151
+ /**
152
+ * 批量命令 - 将多个命令组合为一个原子操作
153
+ */
154
+ export declare class BatchCommand implements Command {
155
+ /** 子命令列表 */
156
+ private commands;
157
+ /** 批量操作描述 */
158
+ description: string;
159
+ constructor(commands: Command[], description: string);
160
+ /** 按顺序执行所有子命令 */
161
+ execute(): void;
162
+ /** 按逆序撤销所有子命令 */
163
+ undo(): void;
164
+ }
165
+ export {};
166
+ //# sourceMappingURL=HistoryManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HistoryManager.d.ts","sourceRoot":"","sources":["../../src/core/HistoryManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH;;;GAGG;AACH,MAAM,WAAW,OAAO;IACtB,WAAW;IACX,OAAO,IAAI,IAAI,CAAA;IACf,WAAW;IACX,IAAI,IAAI,IAAI,CAAA;IACZ,yBAAyB;IACzB,WAAW,EAAE,MAAM,CAAA;CACpB;AAMD;;GAEG;AACH,KAAK,qBAAqB,GAAG,CAAC,KAAK,EAAE;IACnC,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,OAAO,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;CAClB,KAAK,IAAI,CAAA;AAEV;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,cAAc;IACzB,uBAAuB;IACvB,OAAO,CAAC,SAAS,CAAgB;IACjC,uBAAuB;IACvB,OAAO,CAAC,SAAS,CAAgB;IACjC,cAAc;IACd,OAAO,CAAC,UAAU,CAAQ;IAC1B,aAAa;IACb,OAAO,CAAC,eAAe,CAAwC;IAC/D,uBAAuB;IACvB,OAAO,CAAC,MAAM,CAAQ;IAEtB;;;;;OAKG;gBACS,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE;IAI7C;;;;;;OAMG;IACH,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAsB/B;;;;OAIG;IACH,IAAI,IAAI,OAAO;IAiBf;;;;OAIG;IACH,IAAI,IAAI,OAAO;IAiBf;;OAEG;IACH,OAAO,IAAI,OAAO;IAIlB;;OAEG;IACH,OAAO,IAAI,OAAO;IAIlB;;OAEG;IACH,mBAAmB,IAAI,MAAM,EAAE;IAI/B;;OAEG;IACH,mBAAmB,IAAI,MAAM,EAAE;IAI/B;;;;;;;OAOG;IACH,YAAY,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI;IAK5D;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,EAAE,qBAAqB,GAAG,MAAM,IAAI;IAOrD;;OAEG;IACH,KAAK,IAAI,IAAI;IAMb;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,MAAM,IAAI,IAAI;IAId;;OAEG;IACH,OAAO,IAAI,IAAI;IAMf;;OAEG;IACH,OAAO,CAAC,YAAY;CAerB;AAMD;;GAEG;AACH,qBAAa,YAAa,YAAW,OAAO;IAC1C,YAAY;IACZ,OAAO,CAAC,QAAQ,CAAW;IAC3B,aAAa;IACb,WAAW,EAAE,MAAM,CAAA;gBAEP,QAAQ,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,MAAM;IAKpD,iBAAiB;IACjB,OAAO,IAAI,IAAI;IAIf,iBAAiB;IACjB,IAAI,IAAI,IAAI;CAGb"}
@@ -0,0 +1,130 @@
1
+ /**
2
+ * @file I18nManager.ts
3
+ * @description 国际化管理器 — 多语言支持
4
+ *
5
+ * 轻量级的 i18n 实现, 基于嵌套对象路径查找。
6
+ * 支持:
7
+ * - 多语言包注册
8
+ * - 动态切换语言
9
+ * - 路径式 key 查找 (如 'sidebar.search', 'category.filter')
10
+ * - 变量插值 (如 'hello {{name}}')
11
+ * - 回退语言 (找不到翻译时用回退语言)
12
+ *
13
+ * 框架适配层可以将其桥接到 vue-i18n 或 react-intl 等框架级方案。
14
+ */
15
+ /**
16
+ * 语言包类型 (支持嵌套)
17
+ */
18
+ export type LocaleMessages = Record<string, string | Record<string, unknown>>;
19
+ /**
20
+ * 语言变更回调
21
+ */
22
+ type LocaleChangeCallback = (locale: string) => void;
23
+ /**
24
+ * 国际化管理器
25
+ *
26
+ * @example
27
+ * ```typescript
28
+ * const i18n = new I18nManager({ locale: 'zh-CN', fallback: 'en-US' })
29
+ *
30
+ * // 注册语言包
31
+ * i18n.register('zh-CN', {
32
+ * sidebar: {
33
+ * search: '搜索组件...',
34
+ * title: '组件列表',
35
+ * },
36
+ * category: {
37
+ * filter: '过滤器',
38
+ * transform: '转换器',
39
+ * }
40
+ * })
41
+ *
42
+ * // 翻译
43
+ * i18n.t('sidebar.search') // => '搜索组件...'
44
+ * i18n.t('category.filter') // => '过滤器'
45
+ *
46
+ * // 变量插值
47
+ * i18n.t('hello', { name: 'World' }) // => 'Hello World'
48
+ * ```
49
+ */
50
+ export declare class I18nManager {
51
+ /** 当前语言 */
52
+ private locale;
53
+ /** 回退语言 */
54
+ private fallback;
55
+ /** 已注册的语言包: locale => messages */
56
+ private messages;
57
+ /** 语言变更回调 */
58
+ private changeCallbacks;
59
+ /**
60
+ * 创建国际化管理器
61
+ *
62
+ * @param options - 配置选项
63
+ */
64
+ constructor(options?: {
65
+ locale?: string;
66
+ fallback?: string;
67
+ });
68
+ /**
69
+ * 注册语言包
70
+ *
71
+ * @param locale - 语言标识 (如 zh-CN, en-US)
72
+ * @param messages - 语言包内容 (支持嵌套对象)
73
+ * @param merge - 是否与已有语言包合并 (默认: true)
74
+ */
75
+ register(locale: string, messages: LocaleMessages, merge?: boolean): void;
76
+ /**
77
+ * 获取翻译文本
78
+ *
79
+ * @param key - 翻译 key (支持点分路径, 如 'sidebar.search')
80
+ * @param params - 插值变量
81
+ * @returns 翻译后的文本, 找不到返回 key 本身
82
+ */
83
+ t(key: string, params?: Record<string, string | number>): string;
84
+ /**
85
+ * 切换语言
86
+ *
87
+ * @param locale - 目标语言
88
+ */
89
+ setLocale(locale: string): void;
90
+ /**
91
+ * 获取当前语言
92
+ */
93
+ getLocale(): string;
94
+ /**
95
+ * 获取所有已注册的语言列表
96
+ */
97
+ getAvailableLocales(): string[];
98
+ /**
99
+ * 监听语言变更
100
+ *
101
+ * @param callback - 变更回调
102
+ * @returns 取消监听函数
103
+ */
104
+ onLocaleChange(callback: LocaleChangeCallback): () => void;
105
+ /**
106
+ * 检查是否存在某个 key 的翻译
107
+ *
108
+ * @param key - 翻译 key
109
+ * @param locale - 指定语言 (默认: 当前语言)
110
+ */
111
+ has(key: string, locale?: string): boolean;
112
+ /**
113
+ * 销毁
114
+ */
115
+ destroy(): void;
116
+ /**
117
+ * 从语言包中按路径查找翻译
118
+ */
119
+ private lookup;
120
+ /**
121
+ * 变量插值: 将 {{key}} 替换为对应值
122
+ */
123
+ private interpolate;
124
+ /**
125
+ * 深合并两个对象
126
+ */
127
+ private deepMerge;
128
+ }
129
+ export {};
130
+ //# sourceMappingURL=I18nManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"I18nManager.d.ts","sourceRoot":"","sources":["../../src/core/I18nManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;AAE7E;;GAEG;AACH,KAAK,oBAAoB,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;AAEpD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBAAa,WAAW;IACtB,WAAW;IACX,OAAO,CAAC,MAAM,CAAQ;IACtB,WAAW;IACX,OAAO,CAAC,QAAQ,CAAQ;IACxB,kCAAkC;IAClC,OAAO,CAAC,QAAQ,CAAyC;IACzD,aAAa;IACb,OAAO,CAAC,eAAe,CAAuC;IAE9D;;;;OAIG;gBACS,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE;IAK5D;;;;;;OAMG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,KAAK,UAAO,GAAG,IAAI;IAStE;;;;;;OAMG;IACH,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,GAAG,MAAM;IAsBhE;;;;OAIG;IACH,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAa/B;;OAEG;IACH,SAAS,IAAI,MAAM;IAInB;;OAEG;IACH,mBAAmB,IAAI,MAAM,EAAE;IAI/B;;;;;OAKG;IACH,cAAc,CAAC,QAAQ,EAAE,oBAAoB,GAAG,MAAM,IAAI;IAO1D;;;;;OAKG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO;IAI1C;;OAEG;IACH,OAAO,IAAI,IAAI;IASf;;OAEG;IACH,OAAO,CAAC,MAAM;IAiBd;;OAEG;IACH,OAAO,CAAC,WAAW;IASnB;;OAEG;IACH,OAAO,CAAC,SAAS;CA4BlB"}
@@ -0,0 +1,160 @@
1
+ /**
2
+ * @file StateStore.ts
3
+ * @description 框架无关的响应式状态容器
4
+ *
5
+ * 设计灵感来自 zustand/vanilla 和 nanostores。
6
+ * 提供发布-订阅模式的状态管理,支持:
7
+ * - 部分状态更新 (partial update)
8
+ * - 选择性订阅 (selector subscription, 只在特定字段变化时通知)
9
+ * - 快照获取 (get snapshot)
10
+ * - 自动清理 (unsubscribe 返回值模式)
11
+ *
12
+ * 各框架适配器可以包装为:
13
+ * - Vue: ref()/watch() 响应式
14
+ * - React: useSyncExternalStore() hook
15
+ * - 原生 JS: 直接 subscribe 回调
16
+ *
17
+ * @example
18
+ * ```typescript
19
+ * const store = new StateStore<EditorState>(initialState)
20
+ *
21
+ * // 订阅全部状态变化
22
+ * const unsubscribe = store.subscribe((state, prevState) => {
23
+ * console.log('状态变更:', state)
24
+ * })
25
+ *
26
+ * // 选择性订阅
27
+ * const nodeSelector = store.select(s => s.selectedNode)
28
+ * nodeSelector.subscribe((node) => {
29
+ * console.log('选中节点变化:', node)
30
+ * })
31
+ *
32
+ * // 更新状态
33
+ * store.setState({ selectedNode: someNode })
34
+ *
35
+ * // 函数式更新
36
+ * store.setState(prev => ({ isDirty: !prev.isDirty }))
37
+ * ```
38
+ */
39
+ /**
40
+ * 状态变更监听器类型
41
+ * @param state - 新状态
42
+ * @param prevState - 旧状态
43
+ */
44
+ type StateListener<T> = (state: T, prevState: T) => void;
45
+ /**
46
+ * 选择器返回的订阅句柄
47
+ */
48
+ interface SelectorHandle<S> {
49
+ /** 获取当前选中值 */
50
+ get: () => S;
51
+ /** 订阅选中值的变化 */
52
+ subscribe: (listener: (value: S, prevValue: S) => void) => () => void;
53
+ }
54
+ /**
55
+ * 框架无关的响应式状态容器
56
+ *
57
+ * @typeParam T - 状态对象的类型
58
+ */
59
+ export declare class StateStore<T extends Record<string, unknown>> {
60
+ /** 当前状态 (内部可变) */
61
+ private state;
62
+ /** 全量订阅的监听器集合 */
63
+ private listeners;
64
+ /** 状态变更版本号 (用于 React useSyncExternalStore 等对比场景) */
65
+ private version;
66
+ /**
67
+ * 创建状态容器
68
+ * @param initialState - 初始状态对象
69
+ */
70
+ constructor(initialState: T);
71
+ /**
72
+ * 获取当前状态的只读快照
73
+ *
74
+ * 注意: 返回的是浅冻结对象,不应直接修改属性。
75
+ * 修改状态只能通过 setState 方法。
76
+ *
77
+ * @returns 当前状态的只读引用
78
+ */
79
+ getState(): Readonly<T>;
80
+ /**
81
+ * 获取当前版本号
82
+ * 每次 setState 调用版本号 +1,用于变更检测
83
+ *
84
+ * @returns 版本号
85
+ */
86
+ getVersion(): number;
87
+ /**
88
+ * 更新状态 (支持部分更新和函数式更新)
89
+ *
90
+ * 部分更新: 传入一个 Partial<T> 对象,自动与现有状态合并
91
+ * 函数式更新: 传入一个函数,接收当前状态,返回需要更新的部分
92
+ *
93
+ * @param partial - 部分状态对象或更新函数
94
+ *
95
+ * @example
96
+ * ```typescript
97
+ * // 对象方式
98
+ * store.setState({ selectedNode: node, isDirty: true })
99
+ *
100
+ * // 函数方式 (适合依赖当前状态的更新)
101
+ * store.setState(prev => ({
102
+ * nodeCount: prev.nodeCount + 1
103
+ * }))
104
+ * ```
105
+ */
106
+ setState(partial: Partial<T> | ((prev: T) => Partial<T>)): void;
107
+ /**
108
+ * 批量更新状态 (只触发一次通知)
109
+ *
110
+ * 适用于需要同时修改多个状态但只想触发一次更新的场景
111
+ *
112
+ * @param updater - 更新函数,可多次调用 setState
113
+ */
114
+ batch(updater: () => void): void;
115
+ /**
116
+ * 订阅状态变化
117
+ *
118
+ * @param listener - 状态变更回调函数
119
+ * @returns 取消订阅函数 (调用后停止接收通知)
120
+ */
121
+ subscribe(listener: StateListener<T>): () => void;
122
+ /**
123
+ * 选择性订阅 (只关注特定字段的变化)
124
+ *
125
+ * 通过 selector 函数提取状态的一个切片。
126
+ * 只有当该切片发生变化时才触发通知,减少不必要的 UI 更新。
127
+ *
128
+ * 使用浅比较 (===) 进行变更检测,
129
+ * 如果 selector 返回引用类型,需注意引用是否真正发生了变化。
130
+ *
131
+ * @param selector - 状态选择器函数
132
+ * @returns 包含 get 和 subscribe 的句柄
133
+ *
134
+ * @example
135
+ * ```typescript
136
+ * const nodeHandle = store.select(s => s.selectedNode)
137
+ *
138
+ * // 获取当前值
139
+ * console.log(nodeHandle.get())
140
+ *
141
+ * // 只在 selectedNode 变化时收到通知
142
+ * nodeHandle.subscribe((node, prevNode) => {
143
+ * console.log('节点变化:', prevNode, '->', node)
144
+ * })
145
+ * ```
146
+ */
147
+ select<S>(selector: (state: T) => S): SelectorHandle<S>;
148
+ /**
149
+ * 重置状态为指定值 (全量替换)
150
+ *
151
+ * @param newState - 新的完整状态
152
+ */
153
+ reset(newState: T): void;
154
+ /**
155
+ * 销毁状态容器,清除所有监听器
156
+ */
157
+ destroy(): void;
158
+ }
159
+ export {};
160
+ //# sourceMappingURL=StateStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StateStore.d.ts","sourceRoot":"","sources":["../../src/core/StateStore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAEH;;;;GAIG;AACH,KAAK,aAAa,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,KAAK,IAAI,CAAA;AAExD;;GAEG;AACH,UAAU,cAAc,CAAC,CAAC;IACxB,cAAc;IACd,GAAG,EAAE,MAAM,CAAC,CAAA;IACZ,eAAe;IACf,SAAS,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,KAAK,IAAI,KAAK,MAAM,IAAI,CAAA;CACtE;AAED;;;;GAIG;AACH,qBAAa,UAAU,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACvD,kBAAkB;IAClB,OAAO,CAAC,KAAK,CAAG;IAChB,iBAAiB;IACjB,OAAO,CAAC,SAAS,CAAmC;IACpD,oDAAoD;IACpD,OAAO,CAAC,OAAO,CAAI;IAEnB;;;OAGG;gBACS,YAAY,EAAE,CAAC;IAK3B;;;;;;;OAOG;IACH,QAAQ,IAAI,QAAQ,CAAC,CAAC,CAAC;IAIvB;;;;;OAKG;IACH,UAAU,IAAI,MAAM;IAIpB;;;;;;;;;;;;;;;;;;OAkBG;IACH,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;IAkB/D;;;;;;OAMG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,IAAI,GAAG,IAAI;IAuBhC;;;;;OAKG;IACH,SAAS,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI;IAOjD;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC;IAmBvD;;;;OAIG;IACH,KAAK,CAAC,QAAQ,EAAE,CAAC,GAAG,IAAI;IAaxB;;OAEG;IACH,OAAO,IAAI,IAAI;CAGhB"}
@@ -0,0 +1,175 @@
1
+ /**
2
+ * @file core/ThemeManager.ts
3
+ * @description 主题管理器 — 支持多主题动态切换
4
+ *
5
+ * 基于 CSS 自定义属性 (CSS Variables) 实现运行时主题切换,
6
+ * 无需重新加载页面或重新编译样式。
7
+ *
8
+ * 核心设计:
9
+ * - 所有样式值都通过 CSS 变量定义 (如 --rg-bg-primary)
10
+ * - 切换主题 = 批量更新 CSS 变量值
11
+ * - 支持自定义主题注册 (只需提供变量映射)
12
+ * - 自动检测系统深色模式偏好
13
+ *
14
+ * 内置主题:
15
+ * - light: 明亮主题 (默认) — 清爽专业
16
+ * - dark: 暗色主题 — 护眼模式
17
+ * - blue: 蓝色主题 — 科技感
18
+ *
19
+ * 使用方式:
20
+ * ```typescript
21
+ * import { ThemeManager } from '@huanban/rulego-editor-core'
22
+ *
23
+ * const theme = new ThemeManager()
24
+ *
25
+ * // 切换到暗色主题
26
+ * theme.setTheme('dark')
27
+ *
28
+ * // 注册自定义主题
29
+ * theme.register('ocean', {
30
+ * '--rg-bg-primary': '#0a192f',
31
+ * '--rg-text-primary': '#ccd6f6',
32
+ * // ...更多变量
33
+ * })
34
+ *
35
+ * // 跟随系统主题
36
+ * theme.followSystem()
37
+ *
38
+ * // 监听主题变更
39
+ * theme.onChange((themeName) => {
40
+ * console.log('主题切换为:', themeName)
41
+ * })
42
+ * ```
43
+ *
44
+ * CSS 变量命名规范:
45
+ * - --rg-bg-* : 背景色
46
+ * - --rg-text-* : 文字色
47
+ * - --rg-border-*: 边框色
48
+ * - --rg-shadow-*: 阴影
49
+ * - --rg-node-* : 节点专用 (按分类)
50
+ * - --rg-edge-* : 连接线专用
51
+ * - --rg-ui-* : UI 组件 (按钮、面板等)
52
+ *
53
+ * @see styles/variables.css 完整的 CSS 变量列表
54
+ */
55
+ /**
56
+ * 主题变量映射
57
+ * key: CSS 变量名 (如 '--rg-bg-primary')
58
+ * value: 对应的值 (如 '#ffffff')
59
+ */
60
+ export type ThemeVariables = Record<string, string>;
61
+ /**
62
+ * 主题定义
63
+ */
64
+ export interface ThemeDefinition {
65
+ /** 主题名称 */
66
+ name: string;
67
+ /** 显示标签 */
68
+ label: string;
69
+ /** 是否为暗色主题 (影响 data-theme 属性) */
70
+ isDark: boolean;
71
+ /** CSS 变量映射 */
72
+ variables: ThemeVariables;
73
+ }
74
+ /** 主题变更回调 */
75
+ type ThemeChangeCallback = (themeName: string, isDark: boolean) => void;
76
+ /**
77
+ * 主题管理器
78
+ *
79
+ * 通过修改容器元素的 CSS 自定义属性实现主题切换。
80
+ * 每套主题定义一组 CSS 变量值, 切换时批量更新。
81
+ */
82
+ export declare class ThemeManager {
83
+ /** 已注册的主题 */
84
+ private themes;
85
+ /** 当前主题名 */
86
+ private currentTheme;
87
+ /** CSS 变量挂载的目标元素 (默认: document.documentElement) */
88
+ private targetElement;
89
+ /** 变更回调 */
90
+ private changeCallbacks;
91
+ /** 系统主题监听器 */
92
+ private systemThemeQuery;
93
+ /** 系统主题监听处理函数 */
94
+ private systemThemeHandler;
95
+ constructor();
96
+ /**
97
+ * 注册主题
98
+ *
99
+ * @param theme - 主题定义
100
+ * @param overwrite - 是否覆盖已有同名主题 (默认: true)
101
+ */
102
+ register(theme: ThemeDefinition, overwrite?: boolean): void;
103
+ /**
104
+ * 切换主题
105
+ *
106
+ * @param name - 主题名称
107
+ * @param container - CSS 变量挂载的容器元素 (可选, 默认 document.documentElement)
108
+ */
109
+ setTheme(name: string, container?: HTMLElement): void;
110
+ /**
111
+ * 获取当前主题名称
112
+ */
113
+ getTheme(): string;
114
+ /**
115
+ * 获取当前主题定义
116
+ */
117
+ getThemeDefinition(): ThemeDefinition | undefined;
118
+ /**
119
+ * 获取所有可用主题
120
+ */
121
+ getAvailableThemes(): Array<{
122
+ name: string;
123
+ label: string;
124
+ isDark: boolean;
125
+ }>;
126
+ /**
127
+ * 跟随系统主题 (自动检测深色/浅色模式)
128
+ *
129
+ * - 系统为深色模式 → 使用 'dark' 主题
130
+ * - 系统为浅色模式 → 使用 'light' 主题
131
+ *
132
+ * @param darkTheme - 深色模式使用的主题名 (默认: 'dark')
133
+ * @param lightTheme - 浅色模式使用的主题名 (默认: 'light')
134
+ */
135
+ followSystem(darkTheme?: string, lightTheme?: string): void;
136
+ /**
137
+ * 停止跟随系统主题
138
+ */
139
+ unfollowSystem(): void;
140
+ /**
141
+ * 监听主题变更
142
+ *
143
+ * @param callback - 变更回调 (themeName, isDark)
144
+ * @returns 取消监听函数
145
+ */
146
+ onChange(callback: ThemeChangeCallback): () => void;
147
+ /**
148
+ * 销毁主题管理器
149
+ */
150
+ destroy(): void;
151
+ }
152
+ /**
153
+ * 基础 CSS 变量列表 (所有主题共用的变量名)
154
+ * 每套主题只需要覆盖这些变量的值
155
+ */
156
+ /**
157
+ * 🌤 明亮主题 (默认)
158
+ * 设计风格: 清爽、专业、高对比度
159
+ * 适合: 日间使用、正式场合、打印
160
+ */
161
+ export declare const THEME_LIGHT: ThemeDefinition;
162
+ /**
163
+ * 🌙 暗色主题
164
+ * 设计风格: 深邃、护眼、高级感
165
+ * 适合: 夜间使用、长时间工作
166
+ */
167
+ export declare const THEME_DARK: ThemeDefinition;
168
+ /**
169
+ * 🔵 蓝色科技主题
170
+ * 设计风格: 科技感、IoT 风格、专业
171
+ * 适合: 物联网控制台、监控场景、技术演示
172
+ */
173
+ export declare const THEME_BLUE: ThemeDefinition;
174
+ export {};
175
+ //# sourceMappingURL=ThemeManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ThemeManager.d.ts","sourceRoot":"","sources":["../../src/core/ThemeManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqDG;AAMH;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAEnD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,WAAW;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW;IACX,KAAK,EAAE,MAAM,CAAA;IACb,iCAAiC;IACjC,MAAM,EAAE,OAAO,CAAA;IACf,eAAe;IACf,SAAS,EAAE,cAAc,CAAA;CAC1B;AAED,aAAa;AACb,KAAK,mBAAmB,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,KAAK,IAAI,CAAA;AAMvE;;;;;GAKG;AACH,qBAAa,YAAY;IACvB,aAAa;IACb,OAAO,CAAC,MAAM,CAA0C;IACxD,YAAY;IACZ,OAAO,CAAC,YAAY,CAAU;IAC9B,mDAAmD;IACnD,OAAO,CAAC,aAAa,CAA2B;IAChD,WAAW;IACX,OAAO,CAAC,eAAe,CAAsC;IAC7D,cAAc;IACd,OAAO,CAAC,gBAAgB,CAA8B;IACtD,iBAAiB;IACjB,OAAO,CAAC,kBAAkB,CAAkD;;IAS5E;;;;;OAKG;IACH,QAAQ,CAAC,KAAK,EAAE,eAAe,EAAE,SAAS,UAAO,GAAG,IAAI;IAQxD;;;;;OAKG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,WAAW,GAAG,IAAI;IAoCrD;;OAEG;IACH,QAAQ,IAAI,MAAM;IAIlB;;OAEG;IACH,kBAAkB,IAAI,eAAe,GAAG,SAAS;IAIjD;;OAEG;IACH,kBAAkB,IAAI,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC;IAQ7E;;;;;;;;OAQG;IACH,YAAY,CAAC,SAAS,SAAS,EAAE,UAAU,SAAU,GAAG,IAAI;IAqB5D;;OAEG;IACH,cAAc,IAAI,IAAI;IAQtB;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,GAAG,MAAM,IAAI;IAOnD;;OAEG;IACH,OAAO,IAAI,IAAI;CAKhB;AAMD;;;GAGG;AAEH;;;;GAIG;AACH,eAAO,MAAM,WAAW,EAAE,eA0IzB,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,UAAU,EAAE,eA0IxB,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,UAAU,EAAE,eA0IxB,CAAA"}