@atri-editor/core 0.2.0 → 0.4.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/CHANGELOG.md +175 -0
- package/README.md +1 -1
- package/dist/AtriEditor.d.ts +11 -1
- package/dist/AtriEditor.d.ts.map +1 -1
- package/dist/AtriEditorElement.d.ts +14 -1
- package/dist/AtriEditorElement.d.ts.map +1 -1
- package/dist/ai/AICommandMenu.d.ts +1 -0
- package/dist/ai/AICommandMenu.d.ts.map +1 -1
- package/dist/ai/AIInterceptor.d.ts.map +1 -1
- package/dist/ai/AIService.d.ts.map +1 -1
- package/dist/core/CoreEditor.d.ts +14 -3
- package/dist/core/CoreEditor.d.ts.map +1 -1
- package/dist/core/I18nManager.d.ts +25 -0
- package/dist/core/I18nManager.d.ts.map +1 -1
- package/dist/core/LinkPanel.d.ts +74 -0
- package/dist/core/LinkPanel.d.ts.map +1 -0
- package/dist/core/StyleOptionPanel.d.ts +73 -0
- package/dist/core/StyleOptionPanel.d.ts.map +1 -0
- package/dist/core/TableGridPanel.d.ts +1 -0
- package/dist/core/TableGridPanel.d.ts.map +1 -1
- package/dist/core/TableMenu.d.ts +68 -0
- package/dist/core/TableMenu.d.ts.map +1 -0
- package/dist/core/ThemeManager.d.ts.map +1 -1
- package/dist/core/ToolbarManager.d.ts +58 -3
- package/dist/core/ToolbarManager.d.ts.map +1 -1
- package/dist/core/ToolbarMenuPanel.d.ts +58 -0
- package/dist/core/ToolbarMenuPanel.d.ts.map +1 -0
- package/dist/core/bubble-toolbar.d.ts +8 -2
- package/dist/core/bubble-toolbar.d.ts.map +1 -1
- package/dist/core/floating-panel.d.ts +24 -1
- package/dist/core/floating-panel.d.ts.map +1 -1
- package/dist/core/icons.d.ts.map +1 -1
- package/dist/core/style-presets.d.ts +47 -0
- package/dist/core/style-presets.d.ts.map +1 -0
- package/dist/extensions/Attachment.d.ts.map +1 -1
- package/dist/extensions/AttachmentLink.d.ts.map +1 -1
- package/dist/extensions/attachment-attrs.d.ts.map +1 -1
- package/dist/extensions/formatting.d.ts +24 -0
- package/dist/extensions/formatting.d.ts.map +1 -0
- package/dist/extensions/markdown-inline-html.d.ts +73 -0
- package/dist/extensions/markdown-inline-html.d.ts.map +1 -0
- package/dist/extensions/table.d.ts +23 -0
- package/dist/extensions/table.d.ts.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2025 -188
- package/dist/index.js.map +1 -1
- package/dist/media/InsertPanel.d.ts +1 -0
- package/dist/media/InsertPanel.d.ts.map +1 -1
- package/dist/media/MediaRuntime.d.ts +13 -0
- package/dist/media/MediaRuntime.d.ts.map +1 -1
- package/dist/media/MediaStatusStrip.d.ts.map +1 -1
- package/dist/media/Uploader.d.ts.map +1 -1
- package/dist/style.css +311 -4
- package/dist/types/ai.d.ts +5 -0
- package/dist/types/ai.d.ts.map +1 -1
- package/dist/types/editor.d.ts +49 -3
- package/dist/types/editor.d.ts.map +1 -1
- package/dist/types/markdown.d.ts +14 -0
- package/dist/types/markdown.d.ts.map +1 -1
- package/dist/types/media.d.ts +5 -0
- package/dist/types/media.d.ts.map +1 -1
- package/dist/utils/escape.d.ts +30 -0
- package/dist/utils/escape.d.ts.map +1 -0
- package/dist/utils/formatting.d.ts +18 -0
- package/dist/utils/formatting.d.ts.map +1 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/markdown.d.ts +5 -3
- package/dist/utils/markdown.d.ts.map +1 -1
- package/dist/utils/safe-call.d.ts +15 -0
- package/dist/utils/safe-call.d.ts.map +1 -0
- package/dist/utils/table.d.ts +11 -4
- package/dist/utils/table.d.ts.map +1 -1
- package/dist/utils/url.d.ts +20 -0
- package/dist/utils/url.d.ts.map +1 -0
- package/package.json +7 -1
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TableMenu - 光标落在表格里时浮出的上下文操作菜单
|
|
3
|
+
*
|
|
4
|
+
* 与工具栏浮层(InsertPanel / TableGridPanel)同一套外观,但触发方式不同:它没有锚点按钮,
|
|
5
|
+
* 靠选区进入表格自动浮出,所以定位锚是「当前单元格的 DOM 盒子」,量不到再退回光标坐标
|
|
6
|
+
* (AICommandMenu 的虚拟锚点写法)。
|
|
7
|
+
*
|
|
8
|
+
* 行列增删合并这些命令由 prosemirror-tables 提供,此前只有命令没有入口,
|
|
9
|
+
* 表格因此是"插得出来、改不动"的半成品。
|
|
10
|
+
*/
|
|
11
|
+
import type { Editor } from '@tiptap/core';
|
|
12
|
+
import { type I18nManager } from './I18nManager';
|
|
13
|
+
export interface TableMenuOptions {
|
|
14
|
+
editor: Editor;
|
|
15
|
+
/**
|
|
16
|
+
* 编辑器根容器(.atri-editor):只用来复制主题类
|
|
17
|
+
*
|
|
18
|
+
* 不取 editor.view.dom:那个视图是迟到且会被销毁的,而这个容器由门面创建,生命周期一致
|
|
19
|
+
*/
|
|
20
|
+
root: HTMLElement;
|
|
21
|
+
i18n?: I18nManager;
|
|
22
|
+
}
|
|
23
|
+
export declare class TableMenu {
|
|
24
|
+
private editor;
|
|
25
|
+
private root;
|
|
26
|
+
private i18n?;
|
|
27
|
+
private items;
|
|
28
|
+
private unsubscribeLanguage?;
|
|
29
|
+
private element;
|
|
30
|
+
private detachEscape;
|
|
31
|
+
private detachTheme;
|
|
32
|
+
/** Escape 收起后不再自动浮出,直到光标离开表格(否则下一次状态更新立刻又把它拉出来) */
|
|
33
|
+
private dismissed;
|
|
34
|
+
constructor(options: TableMenuOptions);
|
|
35
|
+
get isOpen(): boolean;
|
|
36
|
+
destroy(): void;
|
|
37
|
+
private t;
|
|
38
|
+
/**
|
|
39
|
+
* 按当前选区决定浮出还是收起。光标在表格里是唯一条件——
|
|
40
|
+
* 空选区、单元格内选一段字、框选多个单元格都算
|
|
41
|
+
*
|
|
42
|
+
* 听的是 update 而不是 transaction:setEditable 只发 update(造一个空事务),
|
|
43
|
+
* 切只读时若不跟着重判,菜单会留在只读的表格上
|
|
44
|
+
*/
|
|
45
|
+
private sync;
|
|
46
|
+
/** 点到编辑器外面就收起来:菜单没有"关了还要在"的理由,焦点回来时 sync 会重新浮出 */
|
|
47
|
+
private onBlur;
|
|
48
|
+
private onScroll;
|
|
49
|
+
private dismiss;
|
|
50
|
+
private show;
|
|
51
|
+
private hide;
|
|
52
|
+
/**
|
|
53
|
+
* Escape 收起菜单。这里不用 floating-panel 的 listenPanelDismiss:那一套还管外点关闭,
|
|
54
|
+
* 而点外面多半仍落在同一个单元格里,关了立刻被下一次状态更新重新浮出,只会闪
|
|
55
|
+
*/
|
|
56
|
+
private listenEscape;
|
|
57
|
+
private build;
|
|
58
|
+
private applyLabels;
|
|
59
|
+
private updateStates;
|
|
60
|
+
/**
|
|
61
|
+
* 当前单元格的虚拟锚点;量不到返回 null,调用方保持面板可见但不改坐标
|
|
62
|
+
*
|
|
63
|
+
* 优先锚在单元格盒子上(菜单跟着格子走,比跟着光标稳),拿不到盒子才退回光标坐标
|
|
64
|
+
*/
|
|
65
|
+
private anchor;
|
|
66
|
+
private position;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=TableMenu.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TableMenu.d.ts","sourceRoot":"","sources":["../../src/core/TableMenu.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAI3C,OAAO,EAAuB,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAGtE,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,CAAC,EAAE,WAAW,CAAC;CACpB;AAoID,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,IAAI,CAAc;IAC1B,OAAO,CAAC,IAAI,CAAC,CAAc;IAC3B,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,mBAAmB,CAAC,CAAa;IAEzC,OAAO,CAAC,OAAO,CAA+B;IAC9C,OAAO,CAAC,YAAY,CAA2B;IAC/C,OAAO,CAAC,WAAW,CAA2B;IAC9C,mDAAmD;IACnD,OAAO,CAAC,SAAS,CAAS;IAE1B,YAAY,OAAO,EAAE,gBAAgB,EAepC;IAED,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,OAAO,IAAI,IAAI,CASd;IAED,OAAO,CAAC,CAAC;IAIT;;;;;;OAMG;IACH,OAAO,CAAC,IAAI,CAeV;IAEF,kDAAkD;IAClD,OAAO,CAAC,MAAM,CAEZ;IAEF,OAAO,CAAC,QAAQ,CAEd;IAEF,OAAO,CAAC,OAAO,CAGb;IAEF,OAAO,CAAC,IAAI;IAMZ,OAAO,CAAC,IAAI;IAUZ;;;OAGG;IACH,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,KAAK;IAuCb,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,YAAY;IAYpB;;;;OAIG;IACH,OAAO,CAAC,MAAM;YA4BA,QAAQ;CAwBvB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ThemeManager.d.ts","sourceRoot":"","sources":["../../src/core/ThemeManager.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,kCAAkC;AAClC,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"ThemeManager.d.ts","sourceRoot":"","sources":["../../src/core/ThemeManager.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,kCAAkC;AAClC,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAKzD,qBAAa,YAAY;IACvB,OAAO,CAAC,SAAS,CAAc;IAC/B,OAAO,CAAC,YAAY,CAAY;IAEhC,YAAY,SAAS,EAAE,WAAW,EAAE,KAAK,GAAE,SAAmB,EAI7D;IAED;;OAEG;IACH,OAAO,CAAC,UAAU;IAiBlB;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAG/B;IAED;;OAEG;IACH,WAAW,IAAI,IAAI,CASlB;CACF"}
|
|
@@ -5,7 +5,8 @@
|
|
|
5
5
|
import { type Editor } from '@tiptap/core';
|
|
6
6
|
import type { ToolbarConfig } from '../types';
|
|
7
7
|
import type { MediaRuntime } from '../media/MediaRuntime';
|
|
8
|
-
import type
|
|
8
|
+
import { type I18nManager } from './I18nManager';
|
|
9
|
+
import type { LinkPanel } from './LinkPanel';
|
|
9
10
|
/**
|
|
10
11
|
* 工具栏管理器
|
|
11
12
|
*/
|
|
@@ -15,7 +16,10 @@ export declare class ToolbarManager {
|
|
|
15
16
|
private i18n?;
|
|
16
17
|
private config?;
|
|
17
18
|
private mediaRuntime;
|
|
19
|
+
/** 链接浮层由门面持有:编辑态点击链接也要能打开它,跟工具栏渲染不渲染无关 */
|
|
20
|
+
private linkPanel;
|
|
18
21
|
private unsubscribeLanguage?;
|
|
22
|
+
private unsubscribeEditor?;
|
|
19
23
|
/** 同一个项可能同时渲染在顶栏与浮动工具栏里,所以一个 id 对应一组按钮 */
|
|
20
24
|
private buttons;
|
|
21
25
|
/** 按 id 记的覆盖文案:顶栏与浮层共用一份,改一处两处一起改,这是有意的 */
|
|
@@ -24,7 +28,11 @@ export declare class ToolbarManager {
|
|
|
24
28
|
private createdElements;
|
|
25
29
|
private panel;
|
|
26
30
|
private tablePanel;
|
|
27
|
-
|
|
31
|
+
/** 颜色 / 字号 / 字体四个入口共用一个面板实例:同时只会开一个 */
|
|
32
|
+
private stylePanel;
|
|
33
|
+
/** 下拉菜单同理,所有 children 菜单共用一个实例 */
|
|
34
|
+
private menuPanel;
|
|
35
|
+
constructor(editor: Editor, container: HTMLElement, config?: ToolbarConfig, i18n?: I18nManager, mediaRuntime?: MediaRuntime | null, linkPanel?: LinkPanel | null);
|
|
28
36
|
/**
|
|
29
37
|
* 把浮动工具栏的按钮渲染进给定的元素
|
|
30
38
|
*
|
|
@@ -43,6 +51,38 @@ export declare class ToolbarManager {
|
|
|
43
51
|
private get gridPanel();
|
|
44
52
|
/** 内置表格真可用才摆按钮:table:false 未注册、或被用户同名扩展顶掉都不摆(判定见 canInsertTable) */
|
|
45
53
|
private get tableExtensionRegistered();
|
|
54
|
+
/** 格式面板按需创建:没点开过就不该有一个实例挂在编辑器上 */
|
|
55
|
+
private get styleOptionPanel();
|
|
56
|
+
private tOr;
|
|
57
|
+
/** 下拉菜单面板按需创建:没点开过就不该有一个实例挂在编辑器上 */
|
|
58
|
+
private get menu();
|
|
59
|
+
/**
|
|
60
|
+
* 把一个项做成下拉触发器。
|
|
61
|
+
* 子项走的仍是同一张 itemDefs 表,所以它们和顶栏项一样受能力门控——
|
|
62
|
+
* 表格被顶掉时 insertTable 就不会出现在菜单里,而不是摆一行按了没反应的
|
|
63
|
+
*/
|
|
64
|
+
private menuItem;
|
|
65
|
+
/** 当前命中的子项:触发器的图标与提示都跟着它走,用户不必点开就知道现在的级别 */
|
|
66
|
+
private activeChild;
|
|
67
|
+
/** 子项词条 key;没有映射的(宿主的自定义项)退回定义里的兜底文案 */
|
|
68
|
+
private rowLabel;
|
|
69
|
+
/**
|
|
70
|
+
* 菜单里带浮层的子项一律不收:子项被点中后菜单就关了,
|
|
71
|
+
* 而面板要锚在触发器上——锚一个即将从文档里消失的行没有意义。
|
|
72
|
+
* 这与 attachBubbleToolbar 拒绝浮层项是同一条理由。
|
|
73
|
+
*/
|
|
74
|
+
private menuSpec;
|
|
75
|
+
/**
|
|
76
|
+
* 面板文案在这里现取,不在建项时算好存下来:
|
|
77
|
+
* 语言切换后重开面板要拿到新词条,而项定义只在建栏时求值一次
|
|
78
|
+
*/
|
|
79
|
+
private styleSpec;
|
|
80
|
+
/**
|
|
81
|
+
* 空串是"清除"而不是"设成空值":设成空串会留下一个属性为空串的 mark,
|
|
82
|
+
* 而 textStyle 的 renderHTML 对空值照样会吐出一个 `<span style="">`,
|
|
83
|
+
* 那种节点既看不见又会在往返里产噪音(见 extensions/formatting.ts 的发出侧)
|
|
84
|
+
*/
|
|
85
|
+
private applyStyle;
|
|
46
86
|
/**
|
|
47
87
|
* 创建工具栏 DOM - 直接将按钮插入 container
|
|
48
88
|
*/
|
|
@@ -66,8 +106,23 @@ export declare class ToolbarManager {
|
|
|
66
106
|
private bindEditorEvents;
|
|
67
107
|
/**
|
|
68
108
|
* 更新所有按钮状态
|
|
109
|
+
*
|
|
110
|
+
* 公开是因为浮层开合不改文档,等不到 transaction:挂在门面上的浮层(链接)
|
|
111
|
+
* 由门面在开合时叫一次,挂在这里的浮层则在 onOpenChange 里叫
|
|
112
|
+
*/
|
|
113
|
+
updateButtonStates(): void;
|
|
114
|
+
/**
|
|
115
|
+
* 一项当前该显示的文字。下拉触发器跟着命中的子项走(现在是三级标题就写「标题 3」),
|
|
116
|
+
* 宿主显式写的 tooltip 优先级最高。
|
|
117
|
+
* 抽出来是因为图标与提示必须由同一份判定得出:只换其中一个就会出现
|
|
118
|
+
* "按钮画着 H3、悬停写标题"这种一半新一半旧的界面
|
|
119
|
+
*/
|
|
120
|
+
private itemTitle;
|
|
121
|
+
/**
|
|
122
|
+
* 下拉触发器的图标与提示跟着当前值走:现在是二级标题就显示 H2,
|
|
123
|
+
* 一个都不匹配才退回通用图标。只有菜单项会走到这里,不是每次刷新对所有按钮都做一遍
|
|
69
124
|
*/
|
|
70
|
-
private
|
|
125
|
+
private refreshMenuTrigger;
|
|
71
126
|
/**
|
|
72
127
|
* 销毁工具栏
|
|
73
128
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToolbarManager.d.ts","sourceRoot":"","sources":["../../src/core/ToolbarManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAmB,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAe,MAAM,UAAU,CAAC;AAE3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"ToolbarManager.d.ts","sourceRoot":"","sources":["../../src/core/ToolbarManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAmB,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAe,MAAM,UAAU,CAAC;AAE3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D,OAAO,EAAU,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AA2F7C;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,SAAS,CAAc;IAC/B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,IAAI,CAAC,CAAc;IAC3B,OAAO,CAAC,MAAM,CAAC,CAAgB;IAC/B,OAAO,CAAC,YAAY,CAAsB;IAC1C,0CAA0C;IAC1C,OAAO,CAAC,SAAS,CAAmB;IACpC,OAAO,CAAC,mBAAmB,CAAC,CAAa;IACzC,OAAO,CAAC,iBAAiB,CAAC,CAAa;IACvC,0CAA0C;IAC1C,OAAO,CAAC,OAAO,CAAkD;IACjE,2CAA2C;IAC3C,OAAO,CAAC,cAAc,CAAkC;IACxD,OAAO,CAAC,QAAQ,CAA8B;IAC9C,OAAO,CAAC,eAAe,CAAqB;IAC5C,OAAO,CAAC,KAAK,CAA4B;IACzC,OAAO,CAAC,UAAU,CAA+B;IACjD,uCAAuC;IACvC,OAAO,CAAC,UAAU,CAAiC;IACnD,kCAAkC;IAClC,OAAO,CAAC,SAAS,CAAiC;IAElD,YACE,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,WAAW,EACtB,MAAM,CAAC,EAAE,aAAa,EACtB,IAAI,CAAC,EAAE,WAAW,EAClB,YAAY,CAAC,EAAE,YAAY,GAAG,IAAI,EAClC,SAAS,CAAC,EAAE,SAAS,GAAG,IAAI,EAa7B;IAED;;;;;OAKG;IACH,mBAAmB,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAoC9C;IAED;;OAEG;IACH,OAAO,KAAK,WAAW,GAUtB;IAED,OAAO,CAAC,UAAU;IAIlB;;OAEG;IACH,OAAO,KAAK,SAAS,GASpB;IAED,oEAAoE;IACpE,OAAO,KAAK,wBAAwB,GAEnC;IAED,kCAAkC;IAClC,OAAO,KAAK,gBAAgB,GAQ3B;IAED,OAAO,CAAC,GAAG;IAIX,oCAAoC;IACpC,OAAO,KAAK,IAAI,GAOf;IAED;;;;OAIG;IACH,OAAO,CAAC,QAAQ;IAmBhB,4CAA4C;IAC5C,OAAO,CAAC,WAAW;IAUnB,wCAAwC;IACxC,OAAO,CAAC,QAAQ;IAKhB;;;;OAIG;IACH,OAAO,CAAC,QAAQ;IA8BhB;;;OAGG;IACH,OAAO,CAAC,SAAS;IAwBjB;;;;OAIG;IACH,OAAO,CAAC,UAAU;IA2BlB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA2DxB;;OAEG;IACH,OAAO,CAAC,WAAW;IA2CnB,OAAO,CAAC,YAAY;IAsDpB;;OAEG;IACH,OAAO,CAAC,aAAa;IAerB;;OAEG;IACH,OAAO,CAAC,eAAe;IAyZvB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAiBxB;;;;;OAKG;IACH,kBAAkB,IAAI,IAAI,CAmBzB;IAED;;;;;OAKG;IACH,OAAO,CAAC,SAAS;IAcjB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAS1B;;OAEG;IACH,OAAO,IAAI,IAAI,CAmBd;CACF"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ToolbarMenuPanel - 工具栏项的下拉菜单(ToolbarItem.children 的落地)
|
|
3
|
+
*
|
|
4
|
+
* 与 StyleOptionPanel 是同一类东西的两个特例,所以结构上有八成相似
|
|
5
|
+
* (锚定、外点与 Escape 关闭、主题跟随、方向键走完列表、共用实例时按 key 归属按下态)。
|
|
6
|
+
* 没有在这里合并成一个带 mode 开关的类,是跟本仓库自己的先例走:
|
|
7
|
+
* 浮层公共底盘是在第三份出现时才抽出去的(见提交 2764ef6),两份先并存。
|
|
8
|
+
* 第三份浮层出现时一起抽,比现在为了少 60 行而给两边都加条件分支更划算。
|
|
9
|
+
*/
|
|
10
|
+
import type { Editor } from '@tiptap/core';
|
|
11
|
+
/** 菜单里的一行。active / disabled 在打开那一刻算好——开着菜单时选区不会变,
|
|
12
|
+
* 因为点进正文的那一下 pointerdown 就已经把菜单关掉了 */
|
|
13
|
+
export interface ToolbarMenuItemRow {
|
|
14
|
+
id: string;
|
|
15
|
+
label: string;
|
|
16
|
+
active: boolean;
|
|
17
|
+
disabled: boolean;
|
|
18
|
+
run: () => void;
|
|
19
|
+
}
|
|
20
|
+
export interface ToolbarMenuSpec {
|
|
21
|
+
/** 触发这一菜单的工具栏项 id,按下态只归它 */
|
|
22
|
+
key: string;
|
|
23
|
+
/** 面板的无障碍名字 */
|
|
24
|
+
label: string;
|
|
25
|
+
rows: ToolbarMenuItemRow[];
|
|
26
|
+
}
|
|
27
|
+
export interface ToolbarMenuPanelOptions {
|
|
28
|
+
editor: Editor;
|
|
29
|
+
/** 开合时把控制权交回工具栏:按钮的 active 与 aria-expanded 由它维护 */
|
|
30
|
+
onOpenChange?: (open: boolean) => void;
|
|
31
|
+
}
|
|
32
|
+
export declare class ToolbarMenuPanel {
|
|
33
|
+
private editor;
|
|
34
|
+
private onOpenChange?;
|
|
35
|
+
private element;
|
|
36
|
+
private floating;
|
|
37
|
+
private detachDismiss;
|
|
38
|
+
private detachTheme;
|
|
39
|
+
private anchor;
|
|
40
|
+
private currentKey;
|
|
41
|
+
private rows;
|
|
42
|
+
constructor(options: ToolbarMenuPanelOptions);
|
|
43
|
+
get isOpen(): boolean;
|
|
44
|
+
get openKey(): string | null;
|
|
45
|
+
toggle(anchor: HTMLElement, spec: ToolbarMenuSpec): void;
|
|
46
|
+
close(): void;
|
|
47
|
+
destroy(): void;
|
|
48
|
+
private open;
|
|
49
|
+
/**
|
|
50
|
+
* 主题类要从编辑器根上取,而这里只拿得到一个锚在工具栏上的按钮:
|
|
51
|
+
* 沿 DOM 往上找 .atri-editor 比让调用方再多传一个参数省事,且工具栏就在那个根里面
|
|
52
|
+
*/
|
|
53
|
+
private editorViewDom;
|
|
54
|
+
private build;
|
|
55
|
+
private makeRow;
|
|
56
|
+
private onKeyDown;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=ToolbarMenuPanel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ToolbarMenuPanel.d.ts","sourceRoot":"","sources":["../../src/core/ToolbarMenuPanel.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAQ3C;uCACuC;AACvC,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,GAAG,EAAE,MAAM,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,4BAA4B;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,eAAe;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,kBAAkB,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,mDAAmD;IACnD,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CACxC;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,YAAY,CAAC,CAA0B;IAE/C,OAAO,CAAC,OAAO,CAA+B;IAC9C,OAAO,CAAC,QAAQ,CAA8B;IAC9C,OAAO,CAAC,aAAa,CAA6B;IAClD,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,IAAI,CAA2B;IAEvC,YAAY,OAAO,EAAE,uBAAuB,EAG3C;IAED,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,IAAI,OAAO,IAAI,MAAM,GAAG,IAAI,CAE3B;IAED,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,eAAe,GAAG,IAAI,CAQvD;IAED,KAAK,IAAI,IAAI,CAcZ;IAED,OAAO,IAAI,IAAI,CAEd;IAED,OAAO,CAAC,IAAI;IAaZ;;;OAGG;IACH,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,KAAK;IAab,OAAO,CAAC,OAAO;IA0Bf,OAAO,CAAC,SAAS;CAiBlB"}
|
|
@@ -8,8 +8,14 @@ import { type Editor } from '@tiptap/core';
|
|
|
8
8
|
import type { EditorState } from '@tiptap/pm/state';
|
|
9
9
|
/** 浮层的作用对象:一段文字,还是一个整节点 */
|
|
10
10
|
export type BubbleGroup = 'text' | 'node';
|
|
11
|
-
/**
|
|
12
|
-
|
|
11
|
+
/**
|
|
12
|
+
* 文字组只放行内格式:块级与列表留在顶栏,浮层短到不遮住所选的字。
|
|
13
|
+
*
|
|
14
|
+
* 只收纯开关——带浮层的选择面板进不了这里(按钮随浮层一起被摘出文档,面板无处可锚,
|
|
15
|
+
* 见 ToolbarManager.attachBubbleToolbar 的告警)。所以是"高亮"这个开关而不是"挑高亮色"。
|
|
16
|
+
* 项 id 必须与 mark 名同形,allowsBubbleMark 就是拿它去查 schema 的。
|
|
17
|
+
*/
|
|
18
|
+
export declare const BUBBLE_TEXT_ITEMS: readonly ['bold', 'italic', 'underline', 'strike', 'code', 'highlight', 'subscript', 'superscript'];
|
|
13
19
|
/** 节点组换一批:附件能切形态,图片与附件都能删 */
|
|
14
20
|
export declare const BUBBLE_NODE_ITEMS: readonly ['attachmentDisplay', 'delete'];
|
|
15
21
|
/** 选中这些节点才有可施加的操作,别的整节点选择(将来的 atom 之类)什么都不浮 */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bubble-toolbar.d.ts","sourceRoot":"","sources":["../../src/core/bubble-toolbar.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAmB,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,2BAA2B;AAC3B,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,CAAC;AAE1C
|
|
1
|
+
{"version":3,"file":"bubble-toolbar.d.ts","sourceRoot":"","sources":["../../src/core/bubble-toolbar.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAmB,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,2BAA2B;AAC3B,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,CAAC;AAE1C;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,YAC5B,MAAM,EACN,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,MAAM,EACN,WAAW,EACX,WAAW,EACX,aAAa,CACL,CAAC;AAEX,6BAA6B;AAC7B,eAAO,MAAM,iBAAiB,YAAI,mBAAmB,EAAE,QAAQ,CAAU,CAAC;AAE1E,+CAA+C;AAC/C,eAAO,MAAM,uBAAuB,YAAI,OAAO,EAAE,YAAY,EAAE,gBAAgB,CAAU,CAAC;AAE1F;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI,CAInE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,WAAW,GAAG,WAAW,GAAG,IAAI,CAGrE;AAiBD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,WAAW,CAAC;IACrB,KAAK,EAAE,WAAW,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACZ,GAAG,OAAO,CAoBV"}
|
|
@@ -1,7 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* floating-panel - 工具栏浮层的公共底盘
|
|
3
|
+
*
|
|
4
|
+
* 浮层统一挂 document.body + fixed 定位:工具栏链路任何一处 overflow 都会裁掉子元素。
|
|
5
|
+
* InsertPanel / TableGridPanel / LinkPanel / TableMenu / 格式选择面板共用这里的
|
|
6
|
+
* 定位、外点与 Escape 关闭、主题类跟随三段。
|
|
7
|
+
*/
|
|
8
|
+
import { flip, offset, shift } from '@floating-ui/dom';
|
|
1
9
|
export interface FloatingPanel {
|
|
2
10
|
/** 停止位置跟随;重复调用无副作用 */
|
|
3
11
|
stop: () => void;
|
|
4
12
|
}
|
|
13
|
+
/**
|
|
14
|
+
* 浮层共用的三段中间件:溢出翻转 + 贴边收拢。
|
|
15
|
+
*
|
|
16
|
+
* 各处只有 placement 不同(工具栏向下、表格菜单贴着单元格向上),
|
|
17
|
+
* 这三个参数此前被抄成 offset(6)/offset(6)/offset(8)、shift(8)/shift(8)/shift(),
|
|
18
|
+
* 差的那 2px 没人说得清是有意还是漏改
|
|
19
|
+
*/
|
|
20
|
+
export declare function panelMiddleware(): ReturnType<typeof offset | typeof flip | typeof shift>[];
|
|
21
|
+
/** 落位:浮层统一 fixed,坐标是 computePosition 给的视口值 */
|
|
22
|
+
export declare function placePanel(panel: HTMLElement, x: number, y: number): void;
|
|
5
23
|
/**
|
|
6
24
|
* 把面板锚定到 trigger 下方并持续跟随。
|
|
7
25
|
* isCurrent 用于在异步计算间隙确认面板还没被关掉/换掉——关掉的实例不该再写样式
|
|
@@ -15,6 +33,11 @@ export declare function listenPanelDismiss(trigger: HTMLElement, panel: HTMLElem
|
|
|
15
33
|
/**
|
|
16
34
|
* 主题变量写在 .atri-editor 上,浮层挂在 body 上够不着,只能把主题类复制一份。
|
|
17
35
|
* 面板此刻往往还没入 DOM,closest 搜不到编辑器根,所以源元素必须由编辑器侧给(如 view.dom)
|
|
36
|
+
*
|
|
37
|
+
* 只复制一次是不够的:ThemeManager 换主题只动容器上的 class,已经打开的浮层无从得知,
|
|
38
|
+
* 于是"开着面板切主题"会得到一个浅色面板配深色正文。这里改成持续跟随:
|
|
39
|
+
* 观察者盯的是容器自己的 class(面板自己的改动不会触发它,没有回环),
|
|
40
|
+
* 返回的 disposer 由面板在关闭与销毁时调用。
|
|
18
41
|
*/
|
|
19
|
-
export declare function
|
|
42
|
+
export declare function followThemeClasses(source: Element | null, panel: HTMLElement): () => void;
|
|
20
43
|
//# sourceMappingURL=floating-panel.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"floating-panel.d.ts","sourceRoot":"","sources":["../../src/core/floating-panel.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"floating-panel.d.ts","sourceRoot":"","sources":["../../src/core/floating-panel.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAA+B,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAEpF,MAAM,WAAW,aAAa;IAC5B,sBAAsB;IACtB,IAAI,EAAE,MAAM,IAAI,CAAC;CAClB;AAOD;;;;;;GAMG;AACH,wBAAgB,eAAe,IAAI,UAAU,CAAC,OAAO,MAAM,GAAG,OAAO,IAAI,GAAG,OAAO,KAAK,CAAC,EAAE,CAE1F;AAED,8CAA8C;AAC9C,wBAAgB,UAAU,CAAC,KAAK,EAAE,WAAW,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAIzE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,WAAW,EACpB,KAAK,EAAE,WAAW,EAClB,SAAS,EAAE,MAAM,OAAO,GACvB,aAAa,CA8Bf;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,WAAW,EACpB,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE,MAAM,IAAI,GAClB,MAAM,IAAI,CAoBZ;AAcD;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,EAAE,KAAK,EAAE,WAAW,GAAG,MAAM,IAAI,CAQzF"}
|
package/dist/core/icons.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"icons.d.ts","sourceRoot":"","sources":["../../src/core/icons.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"icons.d.ts","sourceRoot":"","sources":["../../src/core/icons.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAyIxC,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 格式选择面板的内置预设(色板 / 字号 / 字体)
|
|
3
|
+
*
|
|
4
|
+
* 先给固定默认值,不做成配置项:本轮要解决的是"开箱看不见这些能力",让宿主换一套品牌
|
|
5
|
+
* 色板是独立需求,向后兼容地加 `formatting.colors` 即可;现在预留一份没人读的配置
|
|
6
|
+
* 只会多一处要同步的文档。
|
|
7
|
+
*
|
|
8
|
+
* 这里的文字一律**不写中文词条**:色块与字号本来就没有名字,用 CSS 值自己当无障碍标签
|
|
9
|
+
* (`rgb(24, 144, 255)` 比"蓝"更准确,也不需要同步两份);只有字体族的通用名需要翻译,
|
|
10
|
+
* 那几条走 i18n key 写在 label 字段上,由面板取词。工具栏 40 项文案收成单源那次
|
|
11
|
+
* (见提交 20c6a5a)说的就是"抄一份兜底字面量等于给漂移留位置",这里不重犯。
|
|
12
|
+
*/
|
|
13
|
+
/** 面板的一行 */
|
|
14
|
+
export interface StyleOption {
|
|
15
|
+
/** 写进 mark 属性的值 */
|
|
16
|
+
value: string;
|
|
17
|
+
/**
|
|
18
|
+
* 行内文字。颜色与字号直接用 CSS 值;
|
|
19
|
+
* 需要翻译的行由面板按 i18nKey 取词,取不到才回落到这里
|
|
20
|
+
*/
|
|
21
|
+
label: string;
|
|
22
|
+
/** 填了就用这个 CSS 值画色块,代替文字预览 */
|
|
23
|
+
swatch?: string;
|
|
24
|
+
/** 行文字的 font-family 预览样式 */
|
|
25
|
+
preview?: string;
|
|
26
|
+
/** 需要翻译的行指向的词条 key */
|
|
27
|
+
i18nKey?: string;
|
|
28
|
+
/** 这一行是"清除该属性"而不是设置某个值 */
|
|
29
|
+
isClear?: boolean;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* 文字色:前 9 个对齐包内既有的 Ant 系主题色,后 3 个补常用正文色。
|
|
33
|
+
* 不放纯黑纯白——正文本来就不是"黑",而白字在亮色主题下等于隐形。
|
|
34
|
+
*/
|
|
35
|
+
export declare const TEXT_COLORS: StyleOption[];
|
|
36
|
+
/**
|
|
37
|
+
* 高亮色一律偏浅:深底配黑字刺眼,深底配白字则把"高亮"变成"遮挡"。
|
|
38
|
+
* 值写成 rgb() 与 TEXT_COLORS 同形,避免同一份导出里混着 #hex 与 rgb() 两种写法。
|
|
39
|
+
*/
|
|
40
|
+
export declare const HIGHLIGHT_COLORS: StyleOption[];
|
|
41
|
+
export declare const FONT_SIZES: StyleOption[];
|
|
42
|
+
/**
|
|
43
|
+
* 字体族。前三项按用途选,中文栈必须自己列——只写 sans-serif 时中文会落到系统默认宋体上,
|
|
44
|
+
* 与英文部分的观感差一截。后三项按名字选,装了才有用,没装就退回系统默认,不报错。
|
|
45
|
+
*/
|
|
46
|
+
export declare const FONT_FAMILIES: StyleOption[];
|
|
47
|
+
//# sourceMappingURL=style-presets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"style-presets.d.ts","sourceRoot":"","sources":["../../src/core/style-presets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,YAAY;AACZ,MAAM,WAAW,WAAW;IAC1B,mBAAmB;IACnB,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAC;IACd,6BAA6B;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4BAA4B;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sBAAsB;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0BAA0B;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE,WAAW,EAaqB,CAAC;AAE3D;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,WAAW,EASgB,CAAC;AAE3D,eAAO,MAAM,UAAU,EAAE,WAAW,EAWO,CAAC;AAE5C;;;GAGG;AACH,eAAO,MAAM,aAAa,EAAE,WAAW,EAuBtC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Attachment.d.ts","sourceRoot":"","sources":["../../src/extensions/Attachment.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,IAAI,EAAmB,MAAM,cAAc,CAAC;AASrD,OAAO,KAAK,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"Attachment.d.ts","sourceRoot":"","sources":["../../src/extensions/Attachment.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,IAAI,EAAmB,MAAM,cAAc,CAAC;AASrD,OAAO,KAAK,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAC;AAY/E,OAAO,QAAQ,cAAc,CAAC;IAC5B,UAAU,QAAQ,CAAC,UAAU;QAC3B,UAAU,EAAE;YACV,mBAAmB;YACnB,aAAa,EAAE,CAAC,OAAO,EAAE,uBAAuB,KAAK,UAAU,CAAC;YAChE,gCAAgC;YAChC,oBAAoB,EAAE,CAAC,OAAO,EAAE;gBAAE,OAAO,EAAE,qBAAqB,CAAA;aAAE,KAAK,UAAU,CAAC;YAClF,wBAAwB;YACxB,uBAAuB,EAAE,MAAM,UAAU,CAAC;SAC3C,CAAC;KACH;CACF;AAqED,eAAO,MAAM,UAAU,gBAkKrB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AttachmentLink.d.ts","sourceRoot":"","sources":["../../src/extensions/AttachmentLink.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,IAAI,EAAmB,MAAM,cAAc,CAAC;AACrD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"AttachmentLink.d.ts","sourceRoot":"","sources":["../../src/extensions/AttachmentLink.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,IAAI,EAAmB,MAAM,cAAc,CAAC;AACrD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAC;AAUxD,OAAO,QAAQ,cAAc,CAAC;IAC5B,UAAU,QAAQ,CAAC,UAAU;QAC3B,cAAc,EAAE;YACd,qBAAqB;YACrB,iBAAiB,EAAE,CAAC,OAAO,EAAE,uBAAuB,KAAK,UAAU,CAAC;SACrE,CAAC;KACH;CACF;AAED,eAAO,MAAM,cAAc,gBAgEzB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attachment-attrs.d.ts","sourceRoot":"","sources":["../../src/extensions/attachment-attrs.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAiB,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"attachment-attrs.d.ts","sourceRoot":"","sources":["../../src/extensions/attachment-attrs.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAiB,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAC;AAIxD,oBAAoB;AACpB,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED;gCACgC;AAChC,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAiBvF;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,YAAY,EACnB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAgCT;AAED,sDAAsD;AACtD,wBAAgB,QAAQ,CACtB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,GACxC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAExB;AAED,+CAA+C;AAC/C,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAOzF;AAED,oBAAoB;AACpB,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,GAAG,MAAM,CAQnE;AAED,wBAAgB,oBAAoB,IAAI,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAiDhE"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 基础格式扩展装配(文字颜色 / 背景色 / 字号 / 字体 / 高亮 / 上下标)
|
|
3
|
+
*
|
|
4
|
+
* 这些 mark 在 Tiptap 里都是零运行时依赖的小包,代价全在" Markdown 往返"这一侧:
|
|
5
|
+
* 上游除 Highlight 的 `==x==` 之外一个 renderMarkdown 都没给,序列化器对没钩子的 mark
|
|
6
|
+
* 是静默丢弃。所以本文件的主体不是注册扩展,而是给它们补发与补收,详见 markdown-inline-html.ts。
|
|
7
|
+
*
|
|
8
|
+
* 行高(LineHeight)刻意不装:上游它是 span 级属性,挂在选中的文字片段上,
|
|
9
|
+
* 而用户心里的行高是段落属性——span 级改一下几乎看不出变化,还不如不给这个按钮。
|
|
10
|
+
* 它和颜色同属一个 textStyle mark,将来要给就走同一条 attrsToStyleCss 路径加一项即可。
|
|
11
|
+
*/
|
|
12
|
+
import { type EditorOptions } from '@tiptap/core';
|
|
13
|
+
export interface AtriFormattingOptions {
|
|
14
|
+
/** 'drop' 时不挂发出侧的钩子,颜色类样式导出 Markdown 即丢失(入向仍会解析) */
|
|
15
|
+
inlineStyles?: 'html' | 'drop';
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* 构造基础格式扩展。
|
|
19
|
+
*
|
|
20
|
+
* 三个 Reader 与 inlineStyles 无关,'drop' 只关掉发出侧:粘贴与外来 .md 里的
|
|
21
|
+
* `<span style>` 仍然应该解析成 mark,否则关掉一个导出偏好会连带把导入能力也削掉。
|
|
22
|
+
*/
|
|
23
|
+
export declare function createFormattingExtensions(options?: AtriFormattingOptions): NonNullable<EditorOptions['extensions']>;
|
|
24
|
+
//# sourceMappingURL=formatting.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatting.d.ts","sourceRoot":"","sources":["../../src/extensions/formatting.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAa,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AA8G7D,MAAM,WAAW,qBAAqB;IACpC,oDAAoD;IACpD,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAChC;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,GAAE,qBAA0B,GAClC,WAAW,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,CAgB1C"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 内联 HTML 片段的 Markdown 双向支持
|
|
3
|
+
*
|
|
4
|
+
* Markdown 没有"颜色 / 字号 / 上下标"的表示法,上游对这些 mark 一个 renderMarkdown 钩子
|
|
5
|
+
* 都没给,于是 @tiptap/markdown 会把它们**静默丢掉**(MarkdownManager 的 getMarkOpening
|
|
6
|
+
* 在没有钩子时返回空串),正文原样输出、样式无痕消失。这里给它们补上钩子,落点是内联 HTML。
|
|
7
|
+
*
|
|
8
|
+
* 为什么必须自己写 tokenizer、而不能只挂 renderMarkdown 让 marked 的通用 html token 接回去:
|
|
9
|
+
* 实测那样做 `<span style="…">**b**</span>` 里的 `**b**` 会回来成字面文本——因为
|
|
10
|
+
* parseHTMLToken 走的是 generateJSON,即 **HTML 解析而不是 Markdown 解析**,
|
|
11
|
+
* 片段内部的语法永远不会被重新分词。后果不只是丢格式:正文里的反斜杠每导出一次翻一倍,
|
|
12
|
+
* getMarkdown → setMarkdown → getMarkdown 不幂等,对内容编辑器是最不能接受的一类缺陷。
|
|
13
|
+
* 所以内层必须显式重新分词——用 tokenizer 收到的第三个参数 lexer.inlineTokens,
|
|
14
|
+
* 它的类型注释就写着"useful while tokenizing child tokens"。
|
|
15
|
+
*/
|
|
16
|
+
import type { MarkdownLexerConfiguration, MarkdownParseHelpers, MarkdownToken } from '@tiptap/core';
|
|
17
|
+
/** 从 style 属性里认出来的属性名 → mark 属性名 */
|
|
18
|
+
export type StyleProp = 'color' | 'backgroundColor' | 'fontSize' | 'fontFamily';
|
|
19
|
+
/** `style="color: red; font-size: 20px"` → { color: 'red', fontSize: '20px' } */
|
|
20
|
+
export declare function styleAttrToAttrs(styleText: string): Partial<Record<StyleProp, string>>;
|
|
21
|
+
/** mark 属性 → style 字符串;一个都没有时返回空串,调用方据此不发标签 */
|
|
22
|
+
export declare function attrsToStyleCss(attrs?: Record<string, unknown>): string;
|
|
23
|
+
export interface InlineHtmlToken extends MarkdownToken {
|
|
24
|
+
/** 开始标签与它之间的原始文本,如 ` style="color: red"` */
|
|
25
|
+
openAttrs?: string;
|
|
26
|
+
/** 内层已重新分词的结果,由 tokenize 通过官方 lexer.inlineTokens 产出 */
|
|
27
|
+
tokens?: MarkdownToken[];
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* 一个内联标签的 tokenizer + parseMarkdown。
|
|
31
|
+
*
|
|
32
|
+
* 只负责"读进来"这一侧;发出去那一侧(renderMarkdown)必须挂在 mark 自己身上,
|
|
33
|
+
* 因为序列化器是按 mark 类型去查钩子的。
|
|
34
|
+
*/
|
|
35
|
+
export declare function makeInlineHtmlReader(options: {
|
|
36
|
+
/** marked 的 token 名,同时是 markdownTokenName */
|
|
37
|
+
tokenName: string;
|
|
38
|
+
/** 起始标签匹配片段,需自带捕获组给出标签名与内层文本 */
|
|
39
|
+
pattern: RegExp;
|
|
40
|
+
/** 快速定位用,避免每次都对整段源码跑正则 */
|
|
41
|
+
begins: string[];
|
|
42
|
+
/** token → { markName, attrs };返回 null 表示这个 token 不该产出 mark */
|
|
43
|
+
resolve: (token: InlineHtmlToken) => {
|
|
44
|
+
markName: string;
|
|
45
|
+
attrs: Record<string, string>;
|
|
46
|
+
} | null;
|
|
47
|
+
}): {
|
|
48
|
+
markdownTokenName: string;
|
|
49
|
+
markdownTokenizer: {
|
|
50
|
+
name: string;
|
|
51
|
+
level: 'inline';
|
|
52
|
+
start: (src: string) => number;
|
|
53
|
+
tokenize: (src: string, _tokens: MarkdownToken[], lexer: MarkdownLexerConfiguration) => {
|
|
54
|
+
type: string;
|
|
55
|
+
raw: string;
|
|
56
|
+
text: string;
|
|
57
|
+
openAttrs: string;
|
|
58
|
+
tokens: MarkdownToken[];
|
|
59
|
+
} | undefined;
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* token.tokens 已经是分好词的内层,直接 parseInline。
|
|
63
|
+
*
|
|
64
|
+
* resolve 认不出属性时(`<span class="x">` 这种)照样解析内层、只是不套 mark——
|
|
65
|
+
* 把整个 token 丢给 parseInline 会让里面的文字一起消失。
|
|
66
|
+
*/
|
|
67
|
+
parseMarkdown: (token: InlineHtmlToken, helpers: MarkdownParseHelpers) => import("@tiptap/core").JSONContent[] | {
|
|
68
|
+
mark: string;
|
|
69
|
+
content: import("@tiptap/core").JSONContent[];
|
|
70
|
+
attrs?: any;
|
|
71
|
+
};
|
|
72
|
+
};
|
|
73
|
+
//# sourceMappingURL=markdown-inline-html.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown-inline-html.d.ts","sourceRoot":"","sources":["../../src/extensions/markdown-inline-html.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EAAE,0BAA0B,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAEpG,oCAAoC;AACpC,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,iBAAiB,GAAG,UAAU,GAAG,YAAY,CAAC;AAyBhF,iFAAiF;AACjF,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAWtF;AAED,+CAA+C;AAC/C,wBAAgB,eAAe,CAAC,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,MAAM,CAO3E;AAED,MAAM,WAAW,eAAgB,SAAQ,aAAa;IACpD,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uDAAuD;IACvD,MAAM,CAAC,EAAE,aAAa,EAAE,CAAC;CAC1B;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE;IAC5C,6CAA6C;IAC7C,SAAS,EAAE,MAAM,CAAC;IAClB,gCAAgC;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,0BAA0B;IAC1B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,+DAA+D;IAC/D,OAAO,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,GAAG,IAAI,CAAC;CACjG;IAIG,iBAAiB;IAEjB,iBAAiB;QACf,IAAI;QACJ,KAAK,EAAE,QAAQ;QACf,KAAK,QAAQ,MAAM;QAQnB,QAAQ,QAAQ,MAAM,WAAW,aAAa,EAAE,SAAS,0BAA0B;;;;;;;;IAerF;;;;;OAKG;IACH,aAAa,UAAU,eAAe,WAAW,oBAAoB;;;;;EAMxE"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 表格扩展装配
|
|
3
|
+
*
|
|
4
|
+
* 增量只有一处:列宽拖拽默认打开。单元格对齐不必动 schema —— extension-table 的单元格
|
|
5
|
+
* 自带 align 属性(解析 style="text-align: …",Markdown 的 pipe table 分隔行也对到它,
|
|
6
|
+
* 双向都通),缺的只是按得动的按钮,那是操作菜单的事。
|
|
7
|
+
*/
|
|
8
|
+
import type { EditorOptions } from '@tiptap/core';
|
|
9
|
+
import type { AtriTableConfig } from '../types';
|
|
10
|
+
/**
|
|
11
|
+
* 补上默认值,供扩展装配与操作菜单共用:两处必须看到同一个配置,
|
|
12
|
+
* 否则会出现"菜单浮得出来,节点却没注册"这种按了没反应的组合
|
|
13
|
+
*
|
|
14
|
+
* 只归一化 true / undefined / 对象三种写法,false(不注册表格)由调用方先行拦掉
|
|
15
|
+
*/
|
|
16
|
+
export declare function resolveTableConfig(table?: boolean | AtriTableConfig): Required<AtriTableConfig>;
|
|
17
|
+
/**
|
|
18
|
+
* 构造表格扩展
|
|
19
|
+
*
|
|
20
|
+
* 四件套在这里集中,调用方不必知道 resizable 落在那一个扩展上
|
|
21
|
+
*/
|
|
22
|
+
export declare function createTableExtensions(table?: AtriTableConfig): NonNullable<EditorOptions['extensions']>;
|
|
23
|
+
//# sourceMappingURL=table.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../../src/extensions/table.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAQhD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,eAAe,GAAG,QAAQ,CAAC,eAAe,CAAC,CAE/F;AAcD;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,CAAC,EAAE,eAAe,GACtB,WAAW,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,CAI1C"}
|
package/dist/index.d.ts
CHANGED
|
@@ -14,6 +14,8 @@ export type { CoreEditorConfig, ThemeType } from './core';
|
|
|
14
14
|
export { AtriImage } from './extensions/AtriImage';
|
|
15
15
|
export { Attachment } from './extensions/Attachment';
|
|
16
16
|
export { createMediaExtensions } from './extensions/media';
|
|
17
|
+
export { createFormattingExtensions } from './extensions/formatting';
|
|
18
|
+
export type { AtriFormattingOptions } from './extensions/formatting';
|
|
17
19
|
export { MediaRuntime } from './media/MediaRuntime';
|
|
18
20
|
export type { MediaState, MediaStatus } from './media/MediaRuntime';
|
|
19
21
|
export { AIService, AIInterceptor, AICommandMenuManager } from './ai';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAG7E,cAAc,SAAS,CAAC;AAGxB,OAAO,EACL,UAAU,EACV,eAAe,EACf,YAAY,EACZ,WAAW,EACX,gBAAgB,EAChB,cAAc,GACf,MAAM,QAAQ,CAAC;AAEhB,YAAY,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAG1D,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGpE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,MAAM,CAAC;AAEtE,YAAY,EAAE,oBAAoB,EAAE,MAAM,MAAM,CAAC;AAGjD,OAAO,EACL,cAAc,EACd,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,SAAS,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAG7E,cAAc,SAAS,CAAC;AAGxB,OAAO,EACL,UAAU,EACV,eAAe,EACf,YAAY,EACZ,WAAW,EACX,gBAAgB,EAChB,cAAc,GACf,MAAM,QAAQ,CAAC;AAEhB,YAAY,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAG1D,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AACrE,YAAY,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGpE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,MAAM,CAAC;AAEtE,YAAY,EAAE,oBAAoB,EAAE,MAAM,MAAM,CAAC;AAGjD,OAAO,EACL,cAAc,EACd,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,SAAS,CAAC"}
|