@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
@@ -0,0 +1,59 @@
1
+ /**
2
+ * InsertPanel - 工具栏下方的插入浮层
3
+ *
4
+ * 挂在 document.body 上并用 fixed 定位:工具栏那一层链路上任何一处 overflow 都会把浮层裁掉。
5
+ */
6
+ import type { Editor } from '@tiptap/core';
7
+ import type { I18nManager } from '../core/I18nManager';
8
+ import type { MediaRuntime } from './MediaRuntime';
9
+ export type InsertPanelMode = 'image' | 'attachment';
10
+ export interface InsertPanelOptions {
11
+ editor: Editor;
12
+ runtime: MediaRuntime;
13
+ i18n?: I18nManager;
14
+ /** 开合时把控制权交回工具栏:按钮的 active 与 aria-expanded 由它维护 */
15
+ onOpenChange?: (mode: InsertPanelMode | null) => void;
16
+ }
17
+ export declare class InsertPanel {
18
+ private editor;
19
+ private runtime;
20
+ private i18n?;
21
+ private onOpenChange?;
22
+ private unsubscribeLanguage?;
23
+ private element;
24
+ private mode;
25
+ private stopAutoUpdate;
26
+ private detachDismiss;
27
+ private labelled;
28
+ constructor(options: InsertPanelOptions);
29
+ get openMode(): InsertPanelMode | null;
30
+ /**
31
+ * 同一个按钮再点一次是关闭;换按钮则直接把浮层挪过去
32
+ */
33
+ toggle(anchor: HTMLElement, mode: InsertPanelMode): void;
34
+ close(): void;
35
+ destroy(): void;
36
+ private t;
37
+ /**
38
+ * 登记一处随语言重画的文案:input 画到 placeholder,其他画成文字
39
+ */
40
+ private label;
41
+ private applyLabels;
42
+ private applyLabel;
43
+ private build;
44
+ /**
45
+ * 主题变量写在 .atri-editor 上,浮层挂在 body 上够不着,只能把主题类复制一份
46
+ */
47
+ private applyTheme;
48
+ /**
49
+ * 外链图片当场就插,不进上传队列:地址本来就是可用的
50
+ */
51
+ private insertFromUrl;
52
+ private upload;
53
+ private position;
54
+ /**
55
+ * 点外面与 Escape 关闭;锚点按钮交给 toggle,否则关了又立刻被这次点击重开
56
+ */
57
+ private listenForDismiss;
58
+ }
59
+ //# sourceMappingURL=InsertPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InsertPanel.d.ts","sourceRoot":"","sources":["../../src/media/InsertPanel.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,YAAY,CAAC;AAErD,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,YAAY,CAAC;IACtB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,mDAAmD;IACnD,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI,KAAK,IAAI,CAAC;CACvD;AAmBD,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,IAAI,CAAC,CAAc;IAC3B,OAAO,CAAC,YAAY,CAAC,CAAyC;IAC9D,OAAO,CAAC,mBAAmB,CAAC,CAAa;IAEzC,OAAO,CAAC,OAAO,CAA+B;IAC9C,OAAO,CAAC,IAAI,CAAgC;IAC5C,OAAO,CAAC,cAAc,CAA6B;IACnD,OAAO,CAAC,aAAa,CAA6B;IAClD,OAAO,CAAC,QAAQ,CAAyB;IAEzC,YAAY,OAAO,EAAE,kBAAkB,EAOtC;IAED,IAAI,QAAQ,IAAI,eAAe,GAAG,IAAI,CAErC;IAED;;OAEG;IACH,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,eAAe,GAAG,IAAI,CAYvD;IAED,KAAK,IAAI,IAAI,CAYZ;IAED,OAAO,IAAI,IAAI,CAId;IAED,OAAO,CAAC,CAAC;IAMT;;OAEG;IACH,OAAO,CAAC,KAAK;IAKb,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,KAAK;IAqFb;;OAEG;IACH,OAAO,CAAC,UAAU;IAQlB;;OAEG;IACH,OAAO,CAAC,aAAa;IAerB,OAAO,CAAC,MAAM;YAOA,QAAQ;IA2BtB;;OAEG;IACH,OAAO,CAAC,gBAAgB;CAqBzB"}
@@ -0,0 +1,113 @@
1
+ /**
2
+ * MediaRuntime - 上传队列与节点瞬时态
3
+ *
4
+ * 生命周期比 CoreEditor 长:registerNodeView 会重建编辑器,进行中的上传不能跟着丢,
5
+ * 所以它由 AtriEditor 持有一个实例,每次重建通过 bind() 换绑到新的 Editor。
6
+ */
7
+ import type { Editor } from '@tiptap/core';
8
+ import type { AtriMediaConfig, MediaKind } from '../types';
9
+ /** 节点瞬时态,写进 data-atri-upload-status */
10
+ export type MediaStatus = 'uploading' | 'error';
11
+ /** 队列快照,供状态条这类外部展示消费 */
12
+ export interface MediaState {
13
+ uploading: number;
14
+ /** 失败且内容还只存在于本地预览里的,丢了就是真丢了 */
15
+ failed: number;
16
+ /** 失败后已按配置内联成 data URL 的图片:不必再传也不该丢 */
17
+ inline: number;
18
+ /** 按文件体积加权的整体进度,无进行中任务时为 0 */
19
+ percent: number;
20
+ }
21
+ export interface HandleFilesOptions {
22
+ /** 缺省时按 MIME 分流到图片与附件 */
23
+ kind?: MediaKind;
24
+ /** 落点位置(拖放用);省略时插在当前选区 */
25
+ pos?: number;
26
+ }
27
+ export declare class MediaRuntime {
28
+ private config;
29
+ private uploader;
30
+ private editor;
31
+ private tasks;
32
+ private listeners;
33
+ private sequence;
34
+ constructor(config?: AtriMediaConfig);
35
+ /**
36
+ * 换绑到新的 Editor 实例,并把瞬时态补回重建后的文档
37
+ */
38
+ bind(editor: Editor): void;
39
+ /**
40
+ * 处理一批文件:校验 → 插节点 → 上传 → 回写
41
+ * kind 缺省时按 MIME 分流;MediaKind 与节点名一一对应,直接当 type 用
42
+ */
43
+ handleFiles(files: File[] | FileList, options?: HandleFilesOptions): Promise<void>;
44
+ /**
45
+ * 该类型的文件白名单,已归一成 <input accept> 能用的写法
46
+ * 面板与校验共用同一份配置,免得选得到却传不了
47
+ */
48
+ acceptFor(kind: MediaKind): string | undefined;
49
+ /**
50
+ * 重试所有失败的上传,卡片原地回到上传中
51
+ * 失败后已内联成 data URL 的图片也在其中:换到服务端地址前它一直算"失败"
52
+ */
53
+ retryFailed(): Promise<void>;
54
+ /**
55
+ * 文档里是否还有"现在就保存会丢内容"的文件:上传中与失败都算,
56
+ * 因为它们的 src 还指着本地预览地址(blob:),刷新即失效
57
+ *
58
+ * 失败后已按配置内联成 data URL 的图片不计入——内容已经安全落进文档,
59
+ * 服务端地址只是可选的优化,别让一个一直失败的上传把保存永久卡住
60
+ */
61
+ hasPendingUploads(): boolean;
62
+ getState(): MediaState;
63
+ subscribe(listener: (state: MediaState) => void): () => void;
64
+ destroy(): void;
65
+ /**
66
+ * 无上传通道:图片按配置退化成 base64 内联,附件没有合理退路
67
+ * 先把文件都读完再一起插,顺序才与选文件时一致
68
+ */
69
+ private inlineImages;
70
+ private createTask;
71
+ /**
72
+ * 带本地预览的节点内容;上传完这些地址就被服务端地址换掉
73
+ */
74
+ private nodeSpec;
75
+ /**
76
+ * 一批节点走一次事务:逐个插的话每插一个"那个位置"的含义就变一次,顺序会乱;
77
+ * 顺带让一次多文件拖放只需撤销一步
78
+ * pos 为拖放落点,省略时落在当前选区(选中的媒体节点不被顶掉)
79
+ */
80
+ private insertContents;
81
+ private startUpload;
82
+ /**
83
+ * 上传失败后把图片读成 data URL,原位换掉 src
84
+ *
85
+ * 是 patch 而不是插新节点:位置与"撤销一步回到插入前"这两条语义都靠它才不碎。
86
+ * error 态留着——重试按钮还在,网络恢复后能把 data URL 换成服务端地址
87
+ */
88
+ private inlineAfterFailure;
89
+ private applyResult;
90
+ private updateProgress;
91
+ /**
92
+ * 写进节点的那份状态;附件卡片额外带百分比
93
+ */
94
+ private stateAttrs;
95
+ private patch;
96
+ /**
97
+ * 编辑器重建后 uploadId 不在 HTML 里,靠本地预览地址把瞬时态补回文档
98
+ */
99
+ private restoreTransientState;
100
+ /**
101
+ * 丢掉文档里已经没有对应节点的任务,中止其请求
102
+ */
103
+ private prune;
104
+ private findPosition;
105
+ private taskByPreviewUrl;
106
+ /**
107
+ * 摘掉任务并回收预览地址;是否 abort 由调用方决定
108
+ */
109
+ private dropTask;
110
+ private reject;
111
+ private emit;
112
+ }
113
+ //# sourceMappingURL=MediaRuntime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MediaRuntime.d.ts","sourceRoot":"","sources":["../../src/media/MediaRuntime.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAW,MAAM,EAAE,MAAM,cAAc,CAAC;AAEpD,OAAO,KAAK,EACV,eAAe,EACf,SAAS,EAIV,MAAM,UAAU,CAAC;AAKlB,uCAAuC;AACvC,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,OAAO,CAAC;AAEhD,wBAAwB;AACxB,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,+BAA+B;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,uCAAuC;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,8BAA8B;IAC9B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,yBAAyB;IACzB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,0BAA0B;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAgCD,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,KAAK,CAAqC;IAClD,OAAO,CAAC,SAAS,CAA+C;IAChE,OAAO,CAAC,QAAQ,CAAK;IAErB,YAAY,MAAM,GAAE,eAAoB,EAGvC;IAED;;OAEG;IACH,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CASzB;IAED;;;OAGG;IACG,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,QAAQ,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAsC3F;IAED;;;OAGG;IACH,SAAS,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,SAAS,CAI7C;IAED;;;OAGG;IACH,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAM3B;IAED;;;;;;OAMG;IACH,iBAAiB,IAAI,OAAO,CAE3B;IAED,QAAQ,IAAI,UAAU,CAerB;IAED,SAAS,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,GAAG,MAAM,IAAI,CAM3D;IAED,OAAO,IAAI,IAAI,CAQd;IAED;;;OAGG;YACW,YAAY;IAoB1B,OAAO,CAAC,UAAU;IAelB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAyBhB;;;;OAIG;IACH,OAAO,CAAC,cAAc;YAWR,WAAW;IA4CzB;;;;;OAKG;YACW,kBAAkB;IAsBhC,OAAO,CAAC,WAAW;IAuBnB,OAAO,CAAC,cAAc;IActB;;OAEG;IACH,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,KAAK;IAiCb;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA2B7B;;OAEG;IACH,OAAO,CAAC,KAAK;IAmBb,OAAO,CAAC,YAAY;IAcpB,OAAO,CAAC,gBAAgB;IAQxB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAOhB,OAAO,CAAC,MAAM;IAUd,OAAO,CAAC,IAAI;CAKb"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * MediaStatusStrip - 上传队列状态条
3
+ *
4
+ * 卡片与图片上没有一处文字状态(那都由样式表靠 data 属性表达),
5
+ * "上传中 2 个""1 个失败""重试"这些要读得懂的话都集中在这里,本地化只发生在这一处。
6
+ */
7
+ import type { I18nManager } from '../core/I18nManager';
8
+ import type { MediaRuntime } from './MediaRuntime';
9
+ export declare class MediaStatusStrip {
10
+ private labels;
11
+ private element;
12
+ private text;
13
+ private retry;
14
+ private unsubscribe?;
15
+ private unsubscribeLanguage?;
16
+ constructor(runtime: MediaRuntime, container: HTMLElement, i18n?: I18nManager);
17
+ destroy(): void;
18
+ private render;
19
+ }
20
+ //# sourceMappingURL=MediaStatusStrip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MediaStatusStrip.d.ts","sourceRoot":"","sources":["../../src/media/MediaStatusStrip.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAc,MAAM,gBAAgB,CAAC;AAS/D,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,IAAI,CAAkB;IAC9B,OAAO,CAAC,KAAK,CAAoB;IACjC,OAAO,CAAC,WAAW,CAAC,CAAa;IACjC,OAAO,CAAC,mBAAmB,CAAC,CAAa;IAEzC,YAAY,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,CAAC,EAAE,WAAW,EAoC5E;IAED,OAAO,IAAI,IAAI,CAId;IAED,OAAO,CAAC,MAAM;CAwBf"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Uploader - 上传通道
3
+ *
4
+ * 两条路:用户给 handler 就完全接管;给 endpoint 就走内置 XHR。
5
+ * 选 XHR 而不是 fetch,是因为 fetch 没有可移植的上传进度事件(xhr.upload.onprogress)。
6
+ */
7
+ import type { AtriUploadConfig, UploadContext, UploadHandler, UploadResult } from '../types';
8
+ export interface Uploader {
9
+ upload(file: File, context: UploadContext): Promise<UploadResult>;
10
+ }
11
+ export declare function createUploader(upload?: AtriUploadConfig | UploadHandler): Uploader | null;
12
+ //# sourceMappingURL=Uploader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Uploader.d.ts","sourceRoot":"","sources":["../../src/media/Uploader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAE7F,MAAM,WAAW,QAAQ;IACvB,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;CACnE;AAkFD,wBAAgB,cAAc,CAAC,MAAM,CAAC,EAAE,gBAAgB,GAAG,aAAa,GAAG,QAAQ,GAAG,IAAI,CAUzF"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * 文件策略:大小展示与类型白名单
3
+ */
4
+ /**
5
+ * 字节数 → 人类可读标签,1024 进制
6
+ * B 之外的单位保留一位小数,整数值去掉多余的 .0
7
+ */
8
+ export declare function formatFileSize(bytes: number): string;
9
+ /**
10
+ * 人类可读标签 → 字节数
11
+ * 与 formatFileSize 成对使用;标签只有一位小数精度,因此还原值是近似值
12
+ */
13
+ export declare function parseFileSize(label?: string | null): number | undefined;
14
+ /** 单个文件默认上限:10MB */
15
+ export declare const DEFAULT_MAX_FILE_SIZE: number;
16
+ /** 一次投放/选择的默认文件数上限 */
17
+ export declare const DEFAULT_MAX_FILES = 10;
18
+ /** accept 支持的三种写法:`.pdf`、`image/*`、`image/png` */
19
+ export declare function matchesAccept(file: File, accept?: string | string[]): boolean;
20
+ /** 把配置的 accept 归一成 <input accept> 需要的逗号串:选择器与校验得是同一份白名单 */
21
+ export declare function acceptAttribute(accept?: string | string[]): string | undefined;
22
+ export type FileValidation = {
23
+ ok: true;
24
+ } | {
25
+ ok: false;
26
+ reason: 'too-large' | 'unsupported-type';
27
+ };
28
+ export declare function validateFile(file: File, options: {
29
+ accept?: string | string[];
30
+ maxFileSize?: number;
31
+ }): FileValidation;
32
+ /** 拖放与粘贴进来的文件按 MIME 分流到图片还是附件 */
33
+ export declare function isImageFile(file: File): boolean;
34
+ //# sourceMappingURL=file-policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-policy.d.ts","sourceRoot":"","sources":["../../src/media/file-policy.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAapD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,SAAS,CAUvE;AAED,oBAAoB;AACpB,eAAO,MAAM,qBAAqB,QAAwB,CAAC;AAE3D,sBAAsB;AACtB,eAAO,MAAM,iBAAiB,KAAK,CAAC;AAEpC,kDAAkD;AAClD,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,CAiB7E;AAED,2DAA2D;AAC3D,wBAAgB,eAAe,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,MAAM,GAAG,SAAS,CAO9E;AAED,MAAM,MAAM,cAAc,GAAG;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,WAAW,GAAG,kBAAkB,CAAA;CAAE,CAAC;AAEpG,wBAAgB,YAAY,CAC1B,IAAI,EAAE,IAAI,EACV,OAAO,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5D,cAAc,CAOhB;AAED,iCAAiC;AACjC,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAE/C"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * 媒体节点的插入落点
3
+ */
4
+ import { type Selection } from '@tiptap/pm/state';
5
+ /**
6
+ * 插完一个 atom 媒体节点,它会处于选中态;插入命令替换的是整个选区,
7
+ * 于是空文档里连插两张图只剩一张。选中的正是媒体节点时,把落点挪到它后面。
8
+ */
9
+ export declare function mediaInsertTarget(selection: Selection): number | {
10
+ from: number;
11
+ to: number;
12
+ };
13
+ //# sourceMappingURL=insert-position.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"insert-position.d.ts","sourceRoot":"","sources":["../../src/media/insert-position.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAiB,KAAK,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAEjE;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAW7F"}