@atri-editor/core 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.
Files changed (85) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +42 -0
  3. package/dist/AtriEditor.d.ts +192 -0
  4. package/dist/AtriEditor.d.ts.map +1 -0
  5. package/dist/AtriEditorElement.d.ts +84 -0
  6. package/dist/AtriEditorElement.d.ts.map +1 -0
  7. package/dist/ai/AICommandMenu.d.ts +59 -0
  8. package/dist/ai/AICommandMenu.d.ts.map +1 -0
  9. package/dist/ai/AIInterceptor.d.ts +39 -0
  10. package/dist/ai/AIInterceptor.d.ts.map +1 -0
  11. package/dist/ai/AIService.d.ts +42 -0
  12. package/dist/ai/AIService.d.ts.map +1 -0
  13. package/dist/ai/index.d.ts +5 -0
  14. package/dist/ai/index.d.ts.map +1 -0
  15. package/dist/core/CoreEditor.d.ts +100 -0
  16. package/dist/core/CoreEditor.d.ts.map +1 -0
  17. package/dist/core/ExtensionManager.d.ts +47 -0
  18. package/dist/core/ExtensionManager.d.ts.map +1 -0
  19. package/dist/core/I18nManager.d.ts +21 -0
  20. package/dist/core/I18nManager.d.ts.map +1 -0
  21. package/dist/core/MarkdownService.d.ts +42 -0
  22. package/dist/core/MarkdownService.d.ts.map +1 -0
  23. package/dist/core/ThemeManager.d.ts +30 -0
  24. package/dist/core/ThemeManager.d.ts.map +1 -0
  25. package/dist/core/ToolbarManager.d.ts +69 -0
  26. package/dist/core/ToolbarManager.d.ts.map +1 -0
  27. package/dist/core/bubble-toolbar.d.ts +38 -0
  28. package/dist/core/bubble-toolbar.d.ts.map +1 -0
  29. package/dist/core/icons.d.ts +6 -0
  30. package/dist/core/icons.d.ts.map +1 -0
  31. package/dist/core/index.d.ts +9 -0
  32. package/dist/core/index.d.ts.map +1 -0
  33. package/dist/extensions/AtriImage.d.ts +2 -0
  34. package/dist/extensions/AtriImage.d.ts.map +1 -0
  35. package/dist/extensions/Attachment.d.ts +24 -0
  36. package/dist/extensions/Attachment.d.ts.map +1 -0
  37. package/dist/extensions/AttachmentLink.d.ts +19 -0
  38. package/dist/extensions/AttachmentLink.d.ts.map +1 -0
  39. package/dist/extensions/MediaFiles.d.ts +13 -0
  40. package/dist/extensions/MediaFiles.d.ts.map +1 -0
  41. package/dist/extensions/attachment-attrs.d.ts +29 -0
  42. package/dist/extensions/attachment-attrs.d.ts.map +1 -0
  43. package/dist/extensions/media.d.ts +10 -0
  44. package/dist/extensions/media.d.ts.map +1 -0
  45. package/dist/index.d.ts +23 -0
  46. package/dist/index.d.ts.map +1 -0
  47. package/dist/index.js +3489 -0
  48. package/dist/index.js.map +1 -0
  49. package/dist/media/InsertPanel.d.ts +59 -0
  50. package/dist/media/InsertPanel.d.ts.map +1 -0
  51. package/dist/media/MediaRuntime.d.ts +113 -0
  52. package/dist/media/MediaRuntime.d.ts.map +1 -0
  53. package/dist/media/MediaStatusStrip.d.ts +20 -0
  54. package/dist/media/MediaStatusStrip.d.ts.map +1 -0
  55. package/dist/media/Uploader.d.ts +12 -0
  56. package/dist/media/Uploader.d.ts.map +1 -0
  57. package/dist/media/file-policy.d.ts +34 -0
  58. package/dist/media/file-policy.d.ts.map +1 -0
  59. package/dist/media/insert-position.d.ts +13 -0
  60. package/dist/media/insert-position.d.ts.map +1 -0
  61. package/dist/style.css +578 -0
  62. package/dist/types/ai.d.ts +76 -0
  63. package/dist/types/ai.d.ts.map +1 -0
  64. package/dist/types/editor.d.ts +140 -0
  65. package/dist/types/editor.d.ts.map +1 -0
  66. package/dist/types/events.d.ts +26 -0
  67. package/dist/types/events.d.ts.map +1 -0
  68. package/dist/types/extension.d.ts +61 -0
  69. package/dist/types/extension.d.ts.map +1 -0
  70. package/dist/types/index.d.ts +7 -0
  71. package/dist/types/index.d.ts.map +1 -0
  72. package/dist/types/markdown.d.ts +29 -0
  73. package/dist/types/markdown.d.ts.map +1 -0
  74. package/dist/types/media.d.ts +149 -0
  75. package/dist/types/media.d.ts.map +1 -0
  76. package/dist/utils/dom.d.ts +16 -0
  77. package/dist/utils/dom.d.ts.map +1 -0
  78. package/dist/utils/index.d.ts +4 -0
  79. package/dist/utils/index.d.ts.map +1 -0
  80. package/dist/utils/markdown.d.ts +14 -0
  81. package/dist/utils/markdown.d.ts.map +1 -0
  82. package/dist/utils/selection.d.ts +17 -0
  83. package/dist/utils/selection.d.ts.map +1 -0
  84. package/package.json +63 -0
  85. package/styles.d.ts +6 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 CherishDreams
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,42 @@
1
+ # @atri-editor/core
2
+
3
+ 基于 Tiptap v3 的框架无关富文本编辑器:Web Component、Markdown 双向转换、图片与附件上传管线、可插拔 AI 集成、中英文 i18n 与亮/暗主题。
4
+
5
+ 完整文档见仓库根 README 与 `demos/`(vanilla / vue / react 三个示例)。
6
+
7
+ ## 安装
8
+
9
+ ```bash
10
+ pnpm add @atri-editor/core
11
+ ```
12
+
13
+ ## 使用
14
+
15
+ ```typescript
16
+ import { AtriEditor } from '@atri-editor/core';
17
+ import '@atri-editor/core/styles'; // 样式需显式引入
18
+
19
+ const editor = new AtriEditor({
20
+ element: '#editor',
21
+ placeholder: '开始输入...',
22
+ content: '<p>Hello World!</p>',
23
+ });
24
+
25
+ editor.getMarkdown(); // HTML ⇄ Markdown 双向
26
+ ```
27
+
28
+ 也可以直接用自定义元素(导入包即自动注册):
29
+
30
+ ```html
31
+ <atri-editor theme="light" placeholder="开始输入..."></atri-editor>
32
+ ```
33
+
34
+ ## 说明
35
+
36
+ - ESM-only(与上游 Tiptap v3 一致),需要现代打包器;Node 端 import 安全,编辑功能只在浏览器生效。
37
+ - `@tiptap/*`、`@floating-ui/dom`、`i18next` 为运行时依赖,由本包的 `dependencies` 声明。
38
+ - 当前版本尚未发布到 npm registry;以 workspace 或 `pnpm pack` 产物形式消费。
39
+
40
+ ## License
41
+
42
+ MIT
@@ -0,0 +1,192 @@
1
+ /**
2
+ * AtriEditor - 编辑器主类
3
+ */
4
+ import type { Editor } from '@tiptap/core';
5
+ import type { AtriEditorOptions, IAtriEditor, InsertAttachmentOptions, InsertImageOptions, MediaKind, SetContentOptions, AtriAIConfig, AtriNodeViewConfig } from './types';
6
+ import { ThemeManager } from './core/ThemeManager';
7
+ import { I18nManager } from './core/I18nManager';
8
+ import { ExtensionManager } from './core/ExtensionManager';
9
+ import { AIService } from './ai/AIService';
10
+ export declare class AtriEditor implements IAtriEditor {
11
+ private coreEditor;
12
+ private markdownService;
13
+ private themeManager;
14
+ private i18nManager;
15
+ private extensionManager;
16
+ private toolbarManager;
17
+ private aiService;
18
+ private aiMenuManager;
19
+ private mediaRuntime;
20
+ private mediaStatus;
21
+ /** 重建后待恢复的选区,新视图就绪时应用 */
22
+ private pendingViewState;
23
+ /**
24
+ * 浮动工具栏容器:BubbleMenu 显示时把它塞进编辑区、隐藏时直接摘掉,
25
+ * 所以引用必须握在门面手里,重建编辑器后才能拿同一个元素再挂回去
26
+ */
27
+ private bubbleElement;
28
+ private container;
29
+ private options;
30
+ constructor(options: AtriEditorOptions);
31
+ /** 开了 bubble 才建元素,且故意不插进文档:挂载与定位全归 BubbleMenu 插件管 */
32
+ private ensureBubbleElement;
33
+ private onEditorCreated;
34
+ private initAI;
35
+ /**
36
+ * 重新创建编辑器(用于动态注册 NodeView 后更新 schema)
37
+ * 会整体替换编辑器视图,因此内容与选区都要手动恢复
38
+ */
39
+ private recreateEditor;
40
+ /**
41
+ * 获取 Tiptap Editor 实例
42
+ */
43
+ get editor(): Editor;
44
+ /**
45
+ * 获取 HTML 内容
46
+ */
47
+ getHTML(): string;
48
+ /**
49
+ * 获取 JSON 内容
50
+ */
51
+ getJSON(): object;
52
+ /**
53
+ * 获取 Markdown 内容
54
+ */
55
+ getMarkdown(): string;
56
+ /**
57
+ * 设置内容
58
+ */
59
+ setContent(content: string | object, options?: SetContentOptions): void;
60
+ /**
61
+ * 设置 Markdown 内容
62
+ */
63
+ setMarkdown(content: string): void;
64
+ /**
65
+ * 整体替换内容后收拢选区:替换前若是全选(Ctrl+A),ProseMirror 会把它映射成
66
+ * 覆盖整篇新文档的 AllSelection——下一个字或下一次插入就把整篇吞掉,
67
+ * 而"设置内容"之后用户的预期是安全的光标态,不是"再输入即全删"
68
+ */
69
+ private collapseSelectionAfterReplace;
70
+ /**
71
+ * 清空内容
72
+ */
73
+ clearContent(): void;
74
+ /**
75
+ * 是否为空
76
+ */
77
+ isEmpty(): boolean;
78
+ /**
79
+ * Markdown 转 HTML
80
+ */
81
+ markdownToHTML(markdown: string): string;
82
+ /**
83
+ * HTML 转 Markdown
84
+ */
85
+ htmlToMarkdown(html: string): string;
86
+ /**
87
+ * Markdown 转 JSON
88
+ */
89
+ markdownToJSON(markdown: string): object;
90
+ /**
91
+ * 获取选中文本
92
+ */
93
+ getSelectedText(): string;
94
+ /**
95
+ * 插入内容
96
+ */
97
+ insertContent(content: string): void;
98
+ /**
99
+ * 在选区处插入图片
100
+ */
101
+ insertImage(options: InsertImageOptions): void;
102
+ /**
103
+ * 在选区处插入附件(形态由 options.display 或 media.attachment.display 决定)
104
+ */
105
+ insertAttachment(options: InsertAttachmentOptions): void;
106
+ /**
107
+ * 走上传管线插入本地文件
108
+ * kind 缺省时按 MIME 分流;promise 在这批文件全部落定(成功或失败)后 resolve
109
+ */
110
+ uploadFiles(files: File[] | FileList, kind?: MediaKind): Promise<void>;
111
+ /**
112
+ * 是否有文件还没落到服务端(上传中与失败都算)
113
+ * 此时保存会把本地预览地址写进内容,接入方应据此提示或阻断
114
+ */
115
+ hasPendingUploads(): boolean;
116
+ /**
117
+ * 重试所有失败的上传,卡片原地回到上传中
118
+ */
119
+ retryFailedUploads(): Promise<void>;
120
+ /**
121
+ * 设置占位符
122
+ */
123
+ setPlaceholder(placeholder: string): void;
124
+ /**
125
+ * 设置可编辑状态
126
+ */
127
+ setEditable(editable: boolean): void;
128
+ /**
129
+ * 是否可编辑
130
+ */
131
+ isEditable(): boolean;
132
+ /**
133
+ * 聚焦
134
+ */
135
+ focus(): void;
136
+ /**
137
+ * 失焦
138
+ */
139
+ blur(): void;
140
+ /**
141
+ * 获取 AI 服务
142
+ */
143
+ get ai(): AIService | null;
144
+ /**
145
+ * 获取主题管理器
146
+ */
147
+ get theme(): ThemeManager;
148
+ /**
149
+ * 获取国际化管理器
150
+ */
151
+ get i18n(): I18nManager;
152
+ /**
153
+ * 获取扩展管理器
154
+ */
155
+ get extensions(): ExtensionManager;
156
+ /**
157
+ * 设置主题
158
+ */
159
+ setTheme(theme: 'light' | 'dark' | string): void;
160
+ /**
161
+ * 切换主题
162
+ */
163
+ toggleTheme(): void;
164
+ /**
165
+ * 切换语言
166
+ */
167
+ setLanguage(lang: string): Promise<void>;
168
+ /**
169
+ * 更新 AI 配置
170
+ */
171
+ updateAIConfig(config: Partial<AtriAIConfig>): void;
172
+ /**
173
+ * 注册自定义 NodeView 组件
174
+ * 注意:编辑器已创建时,每次调用都会重建一次编辑器以更新 schema;
175
+ * 连续注册多个组件请改用 registerNodeViews,只需重建一次
176
+ */
177
+ registerNodeView(config: AtriNodeViewConfig): void;
178
+ /**
179
+ * 批量注册 NodeView
180
+ * 注意:如果编辑器已创建,会重新创建编辑器以更新 schema
181
+ */
182
+ registerNodeViews(configs: AtriNodeViewConfig[]): void;
183
+ /**
184
+ * 获取所有已注册的 NodeView
185
+ */
186
+ getNodeViews(): Map<string, AtriNodeViewConfig>;
187
+ /**
188
+ * 销毁编辑器
189
+ */
190
+ destroy(): void;
191
+ }
192
+ //# sourceMappingURL=AtriEditor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AtriEditor.d.ts","sourceRoot":"","sources":["../src/AtriEditor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * AtriEditorElement - Web Component 封装
3
+ */
4
+ import { AtriEditor } from './AtriEditor';
5
+ import type { AtriEditorOptions, InsertAttachmentOptions, InsertImageOptions, MediaKind } from './types';
6
+ /**
7
+ * SSR / 纯 Node 安全基类:类声明会在模块加载时求值 extends 后的表达式,
8
+ * 直接 `extends HTMLElement` 会让无 DOM 的环境(Next/Nuxt 服务端、vitest node 池)
9
+ * import 即抛 "HTMLElement is not defined"。自定义元素只有在浏览器才真正生效,
10
+ * 这里回退到空基类,注册仍由 registerAtriElement 里的 customElements 守卫把关。
11
+ */
12
+ declare const AtriEditorBase: typeof HTMLElement;
13
+ /**
14
+ * 注册 Web Component
15
+ */
16
+ export declare function registerAtriElement(): void;
17
+ /**
18
+ * AtriEditor Web Component
19
+ */
20
+ export declare class AtriEditorElement extends AtriEditorBase {
21
+ private editor;
22
+ private _options;
23
+ static get observedAttributes(): string[];
24
+ constructor();
25
+ connectedCallback(): void;
26
+ disconnectedCallback(): void;
27
+ attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void;
28
+ /**
29
+ * 设置编辑器选项(在 connectedCallback 之前调用)
30
+ */
31
+ setOptions(options: Partial<AtriEditorOptions>): void;
32
+ private initEditor;
33
+ private destroyEditor;
34
+ /**
35
+ * 获取编辑器实例
36
+ */
37
+ getEditor(): AtriEditor | null;
38
+ /**
39
+ * 获取 HTML 内容
40
+ */
41
+ getHTML(): string;
42
+ /**
43
+ * 获取 JSON 内容
44
+ */
45
+ getJSON(): object | null;
46
+ /**
47
+ * 获取 Markdown 内容
48
+ */
49
+ getMarkdown(): string;
50
+ /**
51
+ * 设置内容
52
+ */
53
+ setContent(content: string | object, format?: 'html' | 'json' | 'markdown'): void;
54
+ /**
55
+ * 清空内容
56
+ */
57
+ clearContent(): void;
58
+ /**
59
+ * 在选区处插入图片
60
+ */
61
+ insertImage(options: InsertImageOptions): void;
62
+ /**
63
+ * 在选区处插入附件卡片
64
+ */
65
+ insertAttachment(options: InsertAttachmentOptions): void;
66
+ /**
67
+ * 走上传管线插入本地文件
68
+ */
69
+ uploadFiles(files: File[] | FileList, kind?: MediaKind): Promise<void>;
70
+ /**
71
+ * 重试所有失败的上传
72
+ */
73
+ retryFailedUploads(): Promise<void>;
74
+ /**
75
+ * 是否有文件还没落到服务端(上传中与失败都算),保存前可据此提示
76
+ */
77
+ hasPendingUploads(): boolean;
78
+ /**
79
+ * 聚焦
80
+ */
81
+ focus(): void;
82
+ }
83
+ export {};
84
+ //# sourceMappingURL=AtriEditorElement.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AtriEditorElement.d.ts","sourceRoot":"","sources":["../src/AtriEditorElement.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,KAAK,EACV,iBAAiB,EACjB,uBAAuB,EACvB,kBAAkB,EAClB,SAAS,EACV,MAAM,SAAS,CAAC;AAIjB;;;;;GAKG;AACH,QAAA,MAAM,cAAc,EAAE,OAAO,WACmE,CAAC;AAEjG;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAS1C;AAED;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,cAAc;IACnD,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,QAAQ,CAAkC;IAElD,MAAM,KAAK,kBAAkB,IAAI,MAAM,EAAE,CAExC;IAED,cAEC;IAED,iBAAiB,IAAI,IAAI,CAExB;IAED,oBAAoB,IAAI,IAAI,CAE3B;IAED,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAyB7F;IAED;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,IAAI,CAEpD;IAED,OAAO,CAAC,UAAU;IA2ClB,OAAO,CAAC,aAAa;IAOrB;;OAEG;IACH,SAAS,IAAI,UAAU,GAAG,IAAI,CAE7B;IAED;;OAEG;IACH,OAAO,IAAI,MAAM,CAEhB;IAED;;OAEG;IACH,OAAO,IAAI,MAAM,GAAG,IAAI,CAEvB;IAED;;OAEG;IACH,WAAW,IAAI,MAAM,CAEpB;IAED;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,IAAI,CAEhF;IAED;;OAEG;IACH,YAAY,IAAI,IAAI,CAEnB;IAED;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI,CAE7C;IAED;;OAEG;IACH,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,IAAI,CAEvD;IAED;;OAEG;IACG,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,QAAQ,EAAE,IAAI,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAE3E;IAED;;OAEG;IACG,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAExC;IAED;;OAEG;IACH,iBAAiB,IAAI,OAAO,CAE3B;IAED;;OAEG;IACH,KAAK,IAAI,IAAI,CAEZ;CACF"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * AICommandMenu - AI 命令菜单(使用 Floating UI)
3
+ */
4
+ import type { Editor } from '@tiptap/core';
5
+ import type { AtriAIFunction } from '../types';
6
+ export interface AICommandMenuOptions {
7
+ /** AI 功能列表 */
8
+ functions: AtriAIFunction[];
9
+ /** 触发字符(默认 /) */
10
+ triggerChar?: string;
11
+ /** 选择回调 */
12
+ onSelect?: (func: AtriAIFunction) => void;
13
+ }
14
+ /**
15
+ * AI 命令菜单管理器
16
+ * 提供 / 触发 AI 命令菜单功能
17
+ */
18
+ export declare class AICommandMenuManager {
19
+ private editor;
20
+ private functions;
21
+ private menuElement;
22
+ private isVisible;
23
+ private selectedIndex;
24
+ private triggerChar;
25
+ private onSelect?;
26
+ private detachKeyListener?;
27
+ constructor(editor: Editor, functions: AtriAIFunction[], triggerChar?: string, onSelect?: (func: AtriAIFunction) => void);
28
+ /**
29
+ * 让键盘导航可达
30
+ * 监听挂在 document 捕获阶段:ProseMirror 在 view.dom 上已有 keymap,
31
+ * 若等它先处理,Enter 会被用来拆段而不是选中菜单项
32
+ */
33
+ private setupMenuKeyListener;
34
+ private setupKeyboardListener;
35
+ private getLastTypedChar;
36
+ /**
37
+ * 显示菜单
38
+ */
39
+ show(): void;
40
+ /**
41
+ * 隐藏菜单
42
+ */
43
+ hide(): void;
44
+ private createMenuElement;
45
+ private positionMenu;
46
+ private selectItem;
47
+ private highlightItem;
48
+ private updateHighlight;
49
+ private deleteTriggerChar;
50
+ /**
51
+ * 处理键盘事件
52
+ */
53
+ handleKeyDown(event: KeyboardEvent): boolean;
54
+ /**
55
+ * 销毁
56
+ */
57
+ destroy(): void;
58
+ }
59
+ //# sourceMappingURL=AICommandMenu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AICommandMenu.d.ts","sourceRoot":"","sources":["../../src/ai/AICommandMenu.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/C,MAAM,WAAW,oBAAoB;IACnC,cAAc;IACd,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,iBAAiB;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW;IACX,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;CAC3C;AAED;;;GAGG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAmB;IACpC,OAAO,CAAC,WAAW,CAA+B;IAClD,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAC,CAAiC;IAClD,OAAO,CAAC,iBAAiB,CAAC,CAAa;IAEvC,YACE,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,cAAc,EAAE,EAC3B,WAAW,GAAE,MAAY,EACzB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,EAQ1C;IAED;;;;OAIG;IACH,OAAO,CAAC,oBAAoB;IAW5B,OAAO,CAAC,qBAAqB;IAY7B,OAAO,CAAC,gBAAgB;IAMxB;;OAEG;IACH,IAAI,IAAI,IAAI,CAMX;IAED;;OAEG;IACH,IAAI,IAAI,IAAI,CAOX;IAED,OAAO,CAAC,iBAAiB;YAwCX,YAAY;IAkC1B,OAAO,CAAC,UAAU;IAUlB,OAAO,CAAC,aAAa;IAKrB,OAAO,CAAC,eAAe;IAYvB,OAAO,CAAC,iBAAiB;IAUzB;;OAEG;IACH,aAAa,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CA6B3C;IAED;;OAEG;IACH,OAAO,IAAI,IAAI,CAId;CACF"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * AIInterceptor - AI 拦截器链执行
3
+ */
4
+ import type { AIRequestContext, AIResponse, AtriAIInterceptors } from '../types';
5
+ import type { MarkdownService } from '../core/MarkdownService';
6
+ export declare class AIInterceptor {
7
+ private interceptors;
8
+ private markdownService;
9
+ private autoTranslateMarkdown;
10
+ constructor(interceptors?: AtriAIInterceptors, markdownService?: MarkdownService | null, autoTranslateMarkdown?: boolean);
11
+ /**
12
+ * 执行 beforePost 拦截器
13
+ * @returns 处理后的 context,返回 false 表示取消请求
14
+ */
15
+ runBeforePost(context: AIRequestContext): Promise<AIRequestContext | false>;
16
+ /**
17
+ * 执行 afterPost 拦截器
18
+ */
19
+ runAfterPost(response: AIResponse, context: AIRequestContext): Promise<AIResponse>;
20
+ /**
21
+ * 执行 beforeRender 拦截器
22
+ */
23
+ runBeforeRender(content: string, context: AIRequestContext): Promise<string>;
24
+ /**
25
+ * 执行 autoTranslateMarkdownToHTML
26
+ * 在 beforeRender 之后执行,自动将 Markdown 转为 HTML
27
+ */
28
+ runAutoTranslateMarkdown(content: string, response: AIResponse): Promise<string>;
29
+ /**
30
+ * 执行 afterRender 回调
31
+ */
32
+ runAfterRender(content: string, context: AIRequestContext): Promise<void>;
33
+ /**
34
+ * 完整执行拦截器链
35
+ * 流程: beforePost -> requestEndpoint -> afterPost -> beforeRender -> autoTranslateMarkdown -> insert -> afterRender
36
+ */
37
+ executeChain(context: AIRequestContext, requestEndpoint: (ctx: AIRequestContext) => Promise<AIResponse>, insertCallback: (content: string) => void): Promise<void>;
38
+ }
39
+ //# sourceMappingURL=AIInterceptor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AIInterceptor.d.ts","sourceRoot":"","sources":["../../src/ai/AIInterceptor.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AACjF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE/D,qBAAa,aAAa;IACxB,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,eAAe,CAAyB;IAChD,OAAO,CAAC,qBAAqB,CAAU;IAEvC,YACE,YAAY,GAAE,kBAAuB,EACrC,eAAe,GAAE,eAAe,GAAG,IAAW,EAC9C,qBAAqB,GAAE,OAAc,EAKtC;IAED;;;OAGG;IACG,aAAa,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,GAAG,KAAK,CAAC,CAMhF;IAED;;OAEG;IACG,YAAY,CAAC,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,UAAU,CAAC,CAKvF;IAED;;OAEG;IACG,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAKjF;IAED;;;OAGG;IACG,wBAAwB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAiBrF;IAED;;OAEG;IACG,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAK9E;IAED;;;OAGG;IACG,YAAY,CAChB,OAAO,EAAE,gBAAgB,EACzB,eAAe,EAAE,CAAC,GAAG,EAAE,gBAAgB,KAAK,OAAO,CAAC,UAAU,CAAC,EAC/D,cAAc,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GACxC,OAAO,CAAC,IAAI,CAAC,CAwBf;CACF"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * AIService - AI 功能调度服务
3
+ */
4
+ import type { Editor } from '@tiptap/core';
5
+ import type { AtriAIConfig, AtriAIFunction } from '../types';
6
+ import { MarkdownService } from '../core/MarkdownService';
7
+ export declare class AIService {
8
+ private editor;
9
+ private config;
10
+ private interceptor;
11
+ private markdownService;
12
+ constructor(editor: Editor, config: AtriAIConfig, markdownService?: MarkdownService | null);
13
+ /**
14
+ * 获取所有 AI 功能
15
+ */
16
+ getFunctions(): AtriAIFunction[];
17
+ /**
18
+ * 根据 ID 获取 AI 功能
19
+ */
20
+ getFunction(id: string): AtriAIFunction | undefined;
21
+ /**
22
+ * 构建请求上下文
23
+ */
24
+ private buildContext;
25
+ /**
26
+ * 执行 AI 功能
27
+ */
28
+ execute(functionId: string): Promise<void>;
29
+ /**
30
+ * 插入内容到编辑器
31
+ */
32
+ private insertContent;
33
+ /**
34
+ * 更新配置
35
+ */
36
+ updateConfig(config: Partial<AtriAIConfig>): void;
37
+ /**
38
+ * 设置 Markdown 服务
39
+ */
40
+ setMarkdownService(service: MarkdownService): void;
41
+ }
42
+ //# sourceMappingURL=AIService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AIService.d.ts","sourceRoot":"","sources":["../../src/ai/AIService.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAoB,MAAM,UAAU,CAAC;AAE/E,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAG1D,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,WAAW,CAAgB;IACnC,OAAO,CAAC,eAAe,CAAgC;IAEvD,YACE,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,YAAY,EACpB,eAAe,GAAE,eAAe,GAAG,IAAW,EAa/C;IAED;;OAEG;IACH,YAAY,IAAI,cAAc,EAAE,CAE/B;IAED;;OAEG;IACH,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAElD;IAED;;OAEG;IACH,OAAO,CAAC,YAAY;IAgCpB;;OAEG;IACG,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiB/C;IAED;;OAEG;IACH,OAAO,CAAC,aAAa;IA6BrB;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,IAAI,CAOhD;IAED;;OAEG;IACH,kBAAkB,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI,CAOjD;CACF"}
@@ -0,0 +1,5 @@
1
+ export { AIService } from './AIService';
2
+ export { AIInterceptor } from './AIInterceptor';
3
+ export { AICommandMenuManager } from './AICommandMenu';
4
+ export type { AICommandMenuOptions } from './AICommandMenu';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ai/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,YAAY,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,100 @@
1
+ /**
2
+ * CoreEditor - Tiptap v3 编辑器封装
3
+ */
4
+ import { Editor, type EditorOptions } from '@tiptap/core';
5
+ import { MediaRuntime } from '../media/MediaRuntime';
6
+ import type { AtriMarkdownConfig, AtriMediaConfig } from '../types';
7
+ export interface CoreEditorConfig {
8
+ element: HTMLElement;
9
+ content?: string | object;
10
+ contentFormat?: 'html' | 'json' | 'markdown';
11
+ editable?: boolean;
12
+ placeholder?: string;
13
+ extensions?: EditorOptions['extensions'];
14
+ markdown?: AtriMarkdownConfig;
15
+ /** 媒体(图片 / 附件)配置,false 时不注册任何媒体节点 */
16
+ media?: AtriMediaConfig | false;
17
+ /**
18
+ * 复用外部的上传运行时
19
+ * AtriEditor 重建编辑器时会把同一个实例传进来,进行中的上传才不会丢
20
+ */
21
+ mediaRuntime?: MediaRuntime;
22
+ /**
23
+ * 选区浮动工具栏的挂载元素:给了就注册 BubbleMenu,不给就不注册
24
+ * 元素由门面持有 —— 插件隐藏时会把它从文档里摘掉,显示时再 append 回来
25
+ */
26
+ bubbleElement?: HTMLElement | null;
27
+ onCreate?: () => void;
28
+ onUpdate?: () => void;
29
+ onFocus?: () => void;
30
+ onBlur?: () => void;
31
+ onDestroy?: () => void;
32
+ }
33
+ export declare class CoreEditor {
34
+ private editor;
35
+ private config;
36
+ /** 占位符文本:由 Placeholder 扩展以函数形式每次读取,改值即可生效 */
37
+ private placeholderText;
38
+ private mediaRuntime;
39
+ constructor(config: CoreEditorConfig);
40
+ private createEditor;
41
+ /**
42
+ * 获取上传运行时;media 为 false 时为 null
43
+ */
44
+ getMediaRuntime(): MediaRuntime | null;
45
+ /**
46
+ * 获取 Tiptap Editor 实例
47
+ */
48
+ getEditor(): Editor;
49
+ /**
50
+ * 获取 HTML 内容
51
+ */
52
+ getHTML(): string;
53
+ /**
54
+ * 获取 JSON 内容
55
+ */
56
+ getJSON(): object;
57
+ /**
58
+ * 设置内容
59
+ */
60
+ setContent(content: string | object, emitUpdate?: boolean): void;
61
+ /**
62
+ * 清空内容
63
+ */
64
+ clearContent(): void;
65
+ /**
66
+ * 是否为空
67
+ */
68
+ isEmpty(): boolean;
69
+ /**
70
+ * 设置可编辑状态
71
+ */
72
+ setEditable(editable: boolean): void;
73
+ /**
74
+ * 是否可编辑
75
+ */
76
+ isEditable(): boolean;
77
+ /**
78
+ * 聚焦
79
+ */
80
+ focus(): void;
81
+ /**
82
+ * 失焦
83
+ */
84
+ blur(): void;
85
+ /**
86
+ * 插入内容
87
+ */
88
+ insertContent(content: string): void;
89
+ /**
90
+ * 设置占位符
91
+ * 占位符写在节点装饰上,只在状态重算时重新取值,因此派发一个空事务刷新视图;
92
+ * 空事务不改动文档,Tiptap 不会据此触发 update
93
+ */
94
+ setPlaceholder(placeholder: string): void;
95
+ /**
96
+ * 销毁编辑器
97
+ */
98
+ destroy(): void;
99
+ }
100
+ //# sourceMappingURL=CoreEditor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CoreEditor.d.ts","sourceRoot":"","sources":["../../src/core/CoreEditor.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,MAAM,EAAgB,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAOxE,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEpE,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,WAAW,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC;IAC7C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC;IACzC,QAAQ,CAAC,EAAE,kBAAkB,CAAC;IAC9B,qCAAqC;IACrC,KAAK,CAAC,EAAE,eAAe,GAAG,KAAK,CAAC;IAChC;;;OAGG;IACH,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B;;;OAGG;IACH,aAAa,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;CACxB;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAmB;IACjC,6CAA6C;IAC7C,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,YAAY,CAAsB;IAE1C,YAAY,MAAM,EAAE,gBAAgB,EAMnC;IAED,OAAO,CAAC,YAAY;IA2GpB;;OAEG;IACH,eAAe,IAAI,YAAY,GAAG,IAAI,CAErC;IAED;;OAEG;IACH,SAAS,IAAI,MAAM,CAElB;IAED;;OAEG;IACH,OAAO,IAAI,MAAM,CAUhB;IAED;;OAEG;IACH,OAAO,IAAI,MAAM,CAEhB;IAED;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,UAAU,UAAO,GAAG,IAAI,CAE5D;IAED;;OAEG;IACH,YAAY,IAAI,IAAI,CAEnB;IAED;;OAEG;IACH,OAAO,IAAI,OAAO,CAEjB;IAED;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAEnC;IAED;;OAEG;IACH,UAAU,IAAI,OAAO,CAEpB;IAED;;OAEG;IACH,KAAK,IAAI,IAAI,CAEZ;IAED;;OAEG;IACH,IAAI,IAAI,IAAI,CAEX;IAED;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEnC;IAED;;;;OAIG;IACH,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAGxC;IAED;;OAEG;IACH,OAAO,IAAI,IAAI,CAEd;CACF"}
@@ -0,0 +1,47 @@
1
+ import type { AnyExtension } from '@tiptap/core';
2
+ import type { AtriExtensionMeta, AtriNodeViewConfig } from '../types';
3
+ export declare class ExtensionManager {
4
+ private extensions;
5
+ private nodeViews;
6
+ /**
7
+ * 注册扩展
8
+ */
9
+ register(extension: AnyExtension, _meta?: AtriExtensionMeta): void;
10
+ /**
11
+ * 批量注册扩展
12
+ */
13
+ registerAll(extensions: AnyExtension[]): void;
14
+ /**
15
+ * 注册自定义 NodeView
16
+ */
17
+ registerNodeView(config: AtriNodeViewConfig): void;
18
+ /**
19
+ * 批量注册 NodeView
20
+ */
21
+ registerNodeViews(configs: AtriNodeViewConfig[]): void;
22
+ /**
23
+ * 获取扩展
24
+ */
25
+ get(name: string): AnyExtension | undefined;
26
+ /**
27
+ * 卸载扩展
28
+ */
29
+ unregister(name: string): boolean;
30
+ /**
31
+ * 获取所有扩展
32
+ */
33
+ getAll(): AnyExtension[];
34
+ /**
35
+ * 获取所有已注册的 NodeView
36
+ */
37
+ getNodeViews(): Map<string, AtriNodeViewConfig>;
38
+ /**
39
+ * 是否已注册
40
+ */
41
+ has(name: string): boolean;
42
+ /**
43
+ * 清空所有扩展
44
+ */
45
+ clear(): void;
46
+ }
47
+ //# sourceMappingURL=ExtensionManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExtensionManager.d.ts","sourceRoot":"","sources":["../../src/core/ExtensionManager.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAEtE,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,UAAU,CAAwC;IAC1D,OAAO,CAAC,SAAS,CAA8C;IAE/D;;OAEG;IACH,QAAQ,CAAC,SAAS,EAAE,YAAY,EAAE,KAAK,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAMjE;IAED;;OAEG;IACH,WAAW,CAAC,UAAU,EAAE,YAAY,EAAE,GAAG,IAAI,CAE5C;IAED;;OAEG;IACH,gBAAgB,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI,CA6CjD;IAED;;OAEG;IACH,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,EAAE,GAAG,IAAI,CAErD;IAED;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAE1C;IAED;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGhC;IAED;;OAEG;IACH,MAAM,IAAI,YAAY,EAAE,CAEvB;IAED;;OAEG;IACH,YAAY,IAAI,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAE9C;IAED;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEzB;IAED;;OAEG;IACH,KAAK,IAAI,IAAI,CAGZ;CACF"}