@milkdown/plugin-tooltip 6.2.0 → 6.3.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/lib/button-manager/calc-button-pos.d.ts.map +1 -1
- package/lib/button-manager/create-tooltip.d.ts +2 -2
- package/lib/button-manager/create-tooltip.d.ts.map +1 -1
- package/lib/button-manager/filter-button.d.ts +2 -2
- package/lib/button-manager/filter-button.d.ts.map +1 -1
- package/lib/button-manager/index.d.ts +2 -2
- package/lib/button-manager/index.d.ts.map +1 -1
- package/lib/button-manager/no-active.d.ts +2 -2
- package/lib/button-manager/no-active.d.ts.map +1 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.es.js +139 -229
- package/lib/index.es.js.map +1 -1
- package/lib/item.d.ts +7 -11
- package/lib/item.d.ts.map +1 -1
- package/lib/selection-marks-tooltip.d.ts +3 -3
- package/lib/selection-marks-tooltip.d.ts.map +1 -1
- package/lib/utility/index.d.ts +0 -1
- package/lib/utility/index.d.ts.map +1 -1
- package/lib/utility/prosemirror.d.ts +2 -2
- package/lib/utility/prosemirror.d.ts.map +1 -1
- package/package.json +7 -6
- package/src/button-manager/calc-button-pos.ts +2 -1
- package/src/button-manager/create-tooltip.ts +3 -3
- package/src/button-manager/filter-button.ts +4 -4
- package/src/button-manager/index.ts +10 -15
- package/src/button-manager/no-active.ts +2 -2
- package/src/index.ts +2 -8
- package/src/item.ts +36 -49
- package/src/selection-marks-tooltip.ts +2 -2
- package/src/utility/index.ts +0 -1
- package/lib/utility/toggle.d.ts +0 -6
- package/lib/utility/toggle.d.ts.map +0 -1
- package/src/utility/toggle.ts +0 -21
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"calc-button-pos.d.ts","sourceRoot":"","sources":["../../src/button-manager/calc-button-pos.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"calc-button-pos.d.ts","sourceRoot":"","sources":["../../src/button-manager/calc-button-pos.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,eAAO,MAAM,aAAa,YAAa,WAAW,QAAQ,UAAU,YAAY,OAAO,SAkBtF,CAAC"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import type { EditorView } from '@milkdown/prose/view';
|
|
2
2
|
import type { Utils } from '@milkdown/utils';
|
|
3
|
-
import type {
|
|
3
|
+
import type { ButtonList } from '../item';
|
|
4
4
|
declare type Tooltip = {
|
|
5
5
|
dom: HTMLDivElement;
|
|
6
6
|
render: (editorView: EditorView) => void;
|
|
7
7
|
};
|
|
8
|
-
export declare const createTooltip: (buttonMap:
|
|
8
|
+
export declare const createTooltip: (buttonMap: ButtonList, utils: Utils, className: string) => Tooltip;
|
|
9
9
|
export {};
|
|
10
10
|
//# sourceMappingURL=create-tooltip.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-tooltip.d.ts","sourceRoot":"","sources":["../../src/button-manager/create-tooltip.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAE7C,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"create-tooltip.d.ts","sourceRoot":"","sources":["../../src/button-manager/create-tooltip.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAE7C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAG1C,aAAK,OAAO,GAAG;IACX,GAAG,EAAE,cAAc,CAAC;IACpB,MAAM,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;CAC5C,CAAC;AAEF,eAAO,MAAM,aAAa,iCAAkC,KAAK,aAAa,MAAM,KAAG,OAqBtF,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { EditorView } from '@milkdown/prose/view';
|
|
2
|
-
import {
|
|
3
|
-
export declare const filterButton: (
|
|
2
|
+
import { ButtonList } from '../item';
|
|
3
|
+
export declare const filterButton: (buttons: ButtonList, view: EditorView) => boolean;
|
|
4
4
|
//# sourceMappingURL=filter-button.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filter-button.d.ts","sourceRoot":"","sources":["../../src/button-manager/filter-button.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"filter-button.d.ts","sourceRoot":"","sources":["../../src/button-manager/filter-button.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAGrC,eAAO,MAAM,YAAY,8BAA+B,UAAU,YAqBjE,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { EditorView } from '@milkdown/prose/view';
|
|
2
2
|
import type { Utils } from '@milkdown/utils';
|
|
3
|
-
import type {
|
|
4
|
-
export declare const createButtonManager: (
|
|
3
|
+
import type { ButtonList } from '../item';
|
|
4
|
+
export declare const createButtonManager: (buttons: ButtonList, utils: Utils, bottom: boolean, containerClassName: string) => {
|
|
5
5
|
destroy: () => void;
|
|
6
6
|
hide: () => void;
|
|
7
7
|
update: (editorView: EditorView) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/button-manager/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAE7C,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/button-manager/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAE7C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAK1C,eAAO,MAAM,mBAAmB,+BAAgC,KAAK,UAAU,OAAO,sBAAsB,MAAM;;;yBAwBrF,UAAU;;CAUtC,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { EditorView } from '@milkdown/prose/view';
|
|
2
|
-
import {
|
|
3
|
-
export declare const noActive: (buttonMap:
|
|
2
|
+
import { ButtonList } from '../item';
|
|
3
|
+
export declare const noActive: (buttonMap: ButtonList, view: EditorView) => boolean;
|
|
4
4
|
//# sourceMappingURL=no-active.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"no-active.d.ts","sourceRoot":"","sources":["../../src/button-manager/no-active.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"no-active.d.ts","sourceRoot":"","sources":["../../src/button-manager/no-active.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,eAAO,MAAM,QAAQ,gCAAiC,UAAU,YAI/D,CAAC"}
|
package/lib/index.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import { PluginKey } from '@milkdown/prose/state';
|
|
|
2
2
|
import { AtomList } from '@milkdown/utils';
|
|
3
3
|
import { TooltipOptions } from './item';
|
|
4
4
|
export declare const key: PluginKey<any>;
|
|
5
|
+
export * from './item';
|
|
5
6
|
export declare const tooltipPlugin: import("@milkdown/utils").WithExtend<string, TooltipOptions, import("@milkdown/utils").TypeMapping<string, string>, import("@milkdown/utils").PluginRest<string, string>>;
|
|
6
7
|
export declare const tooltip: AtomList<import("@milkdown/utils").Metadata<import("@milkdown/utils").GetPlugin<string, TooltipOptions>> & import("@milkdown/core").MilkdownPlugin>;
|
|
7
8
|
//# sourceMappingURL=index.d.ts.map
|
package/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAU,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAA0B,MAAM,iBAAiB,CAAC;AAEnE,OAAO,EAAa,cAAc,EAAE,MAAM,QAAQ,CAAC;AAGnD,eAAO,MAAM,GAAG,gBAAoC,CAAC;AACrD,cAAc,QAAQ,CAAC;AAEvB,eAAO,MAAM,aAAa,2KA+BxB,CAAC;AAEH,eAAO,MAAM,OAAO,qJAAqC,CAAC"}
|
package/lib/index.es.js
CHANGED
|
@@ -1,135 +1,90 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
const isTextAndNotHasMark = (editorState, mark) => !isTextSelection(editorState) || isInCodeFence(editorState) || hasMark(editorState, mark);
|
|
40
|
-
const createToggleIcon = (ctx, iconName, key2, mark, disableForMark) => {
|
|
41
|
-
var _a;
|
|
42
|
-
return {
|
|
43
|
-
$: (_a = ctx.get(themeManagerCtx).get(ThemeIcon, iconName)) == null ? void 0 : _a.dom,
|
|
44
|
-
command: () => ctx.get(commandsCtx).call(key2),
|
|
45
|
-
active: (view) => hasMark(view.state, mark),
|
|
46
|
-
disable: (view) => isTextAndNotHasMark(view.state, disableForMark),
|
|
47
|
-
enable: (view) => !!mark && !!view.state.schema.marks[mark.name]
|
|
1
|
+
import { TextSelection as m, PluginKey as p, Plugin as T } from "@milkdown/prose/state";
|
|
2
|
+
import { createPlugin as v, AtomList as $ } from "@milkdown/utils";
|
|
3
|
+
import { schemaCtx as y, themeManagerCtx as b, ThemeIcon as k, commandsCtx as L, ThemeSize as f, ThemeBorder as P, ThemeShadow as E, ThemeColor as B } from "@milkdown/core";
|
|
4
|
+
import { findParentNode as C, calculateTextPosition as M } from "@milkdown/prose";
|
|
5
|
+
import { missingRootElement as _ } from "@milkdown/exception";
|
|
6
|
+
const h = (t, e) => {
|
|
7
|
+
if (!e)
|
|
8
|
+
return !1;
|
|
9
|
+
const { from: o, to: s } = t.selection;
|
|
10
|
+
return t.doc.rangeHasMark(o, o === s ? s + 1 : s, e);
|
|
11
|
+
}, x = (t) => {
|
|
12
|
+
const { selection: e } = t;
|
|
13
|
+
return e instanceof m ? !!t.doc.textBetween(e.from, e.to) : !1;
|
|
14
|
+
}, A = (t) => Boolean(C((e) => !!e.type.spec.code)(t.selection)), H = (t, e) => !x(t) || A(t) || h(t, e), u = (t, e, o, s) => ({
|
|
15
|
+
icon: t,
|
|
16
|
+
onClick: e,
|
|
17
|
+
isHidden: () => (n) => H(n.state, s),
|
|
18
|
+
isActive: () => (n) => h(n.state, o),
|
|
19
|
+
canAddToDOM: () => (n) => !!o && !!n.state.schema.marks[o.name]
|
|
20
|
+
}), I = (t) => {
|
|
21
|
+
const e = t.get(y).marks;
|
|
22
|
+
return [
|
|
23
|
+
u("bold", "ToggleBold", e.strong, e.code_inline),
|
|
24
|
+
u("italic", "ToggleItalic", e.em, e.code_inline),
|
|
25
|
+
u("strikeThrough", "ToggleStrikeThrough", e.strike_through, e.code_inline),
|
|
26
|
+
u("code", "ToggleInlineCode", e.code_inline, e.link),
|
|
27
|
+
u("link", "ToggleLink", e.link, e.code_inline)
|
|
28
|
+
];
|
|
29
|
+
}, O = (t, e = I) => {
|
|
30
|
+
const o = ({ icon: s, onClick: n, isHidden: i, isActive: r, canAddToDOM: c }) => {
|
|
31
|
+
var l;
|
|
32
|
+
return {
|
|
33
|
+
$: typeof s == "function" ? s(t) : (l = t.get(b).get(k, s)) == null ? void 0 : l.dom,
|
|
34
|
+
command: typeof n == "string" ? () => t.get(L).call(n) : n(t),
|
|
35
|
+
disable: i(t),
|
|
36
|
+
active: r(t),
|
|
37
|
+
enable: c(t)
|
|
38
|
+
};
|
|
48
39
|
};
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
};
|
|
59
|
-
};
|
|
60
|
-
const buttonMap = (schema, ctx, items) => {
|
|
61
|
-
const { marks } = schema;
|
|
62
|
-
const ButtonItems = Array();
|
|
63
|
-
if (typeof items !== "undefined") {
|
|
64
|
-
items.forEach((item) => {
|
|
65
|
-
ButtonItems.push(Buttonize(item, ctx));
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
|
-
return __spreadValues({
|
|
69
|
-
[0]: createToggleIcon(ctx, "bold", "ToggleBold", marks["strong"], marks["code_inline"]),
|
|
70
|
-
[1]: createToggleIcon(ctx, "italic", "ToggleItalic", marks["em"], marks["code_inline"]),
|
|
71
|
-
[2]: createToggleIcon(ctx, "strikeThrough", "ToggleStrikeThrough", marks["strike_through"], marks["code_inline"]),
|
|
72
|
-
[3]: createToggleIcon(ctx, "code", "ToggleInlineCode", marks["code_inline"], marks["link"]),
|
|
73
|
-
[4]: createToggleIcon(ctx, "link", "ToggleLink", marks["link"], marks["code_inline"])
|
|
74
|
-
}, ButtonItems);
|
|
75
|
-
};
|
|
76
|
-
const calcButtonPos = (buttons, view, isBottom) => {
|
|
77
|
-
buttons.classList.remove("hide");
|
|
78
|
-
calculateTextPosition(view, buttons, (start, end, target, parent) => {
|
|
79
|
-
const $editor = buttons.parentElement;
|
|
80
|
-
if (!$editor) {
|
|
81
|
-
throw new Error();
|
|
82
|
-
}
|
|
83
|
-
const selectionWidth = end.left - start.left;
|
|
84
|
-
let left = start.left - parent.left - (target.width - selectionWidth) / 2;
|
|
85
|
-
let top = start.top - parent.top - target.height - 14 + $editor.scrollTop;
|
|
86
|
-
if (left < 0)
|
|
87
|
-
left = 0;
|
|
88
|
-
if (start.top - parent.top < target.height || isBottom && parent.bottom - start.bottom > target.height) {
|
|
89
|
-
top = start.bottom - parent.top + 14 + $editor.scrollTop;
|
|
90
|
-
}
|
|
91
|
-
return [top, left];
|
|
40
|
+
return e(t).map(o);
|
|
41
|
+
}, D = (t, e, o) => {
|
|
42
|
+
t.classList.remove("hide"), M(e, t, (s, n, i, r) => {
|
|
43
|
+
const c = t.parentElement;
|
|
44
|
+
if (!c)
|
|
45
|
+
throw _();
|
|
46
|
+
const l = n.left - s.left;
|
|
47
|
+
let a = s.left - r.left - (i.width - l) / 2, d = s.top - r.top - i.height - 14 + c.scrollTop;
|
|
48
|
+
return a < 0 && (a = 0), (s.top - r.top < i.height || o && r.bottom - s.bottom > i.height) && (d = s.bottom - r.top + 14 + c.scrollTop), [d, a];
|
|
92
49
|
});
|
|
93
|
-
}
|
|
94
|
-
const
|
|
95
|
-
|
|
96
|
-
const lineWidth = themeManager.get(ThemeSize, "lineWidth");
|
|
97
|
-
return css`
|
|
50
|
+
}, q = (t, { css: e }) => {
|
|
51
|
+
const o = (n, i = 1) => t.get(B, [n, i]), s = t.get(f, "lineWidth");
|
|
52
|
+
return e`
|
|
98
53
|
display: inline-flex;
|
|
99
54
|
cursor: pointer;
|
|
100
55
|
justify-content: space-evenly;
|
|
101
56
|
position: absolute;
|
|
102
|
-
border-radius: ${
|
|
57
|
+
border-radius: ${t.get(f, "radius")};
|
|
103
58
|
z-index: 2;
|
|
104
59
|
|
|
105
|
-
${
|
|
106
|
-
${
|
|
60
|
+
${t.get(P, void 0)}
|
|
61
|
+
${t.get(E, void 0)}
|
|
107
62
|
|
|
108
63
|
overflow: hidden;
|
|
109
|
-
background: ${
|
|
64
|
+
background: ${o("surface")};
|
|
110
65
|
|
|
111
66
|
.icon {
|
|
112
67
|
position: relative;
|
|
113
|
-
color: ${
|
|
68
|
+
color: ${o("solid", 0.87)};
|
|
114
69
|
|
|
115
70
|
width: 2em;
|
|
116
71
|
line-height: 2em;
|
|
117
72
|
text-align: center;
|
|
118
73
|
transition: all 0.4s ease-in-out;
|
|
119
74
|
&:hover {
|
|
120
|
-
background-color: ${
|
|
75
|
+
background-color: ${o("secondary", 0.12)};
|
|
121
76
|
}
|
|
122
77
|
&.active {
|
|
123
|
-
color: ${
|
|
78
|
+
color: ${o("primary")};
|
|
124
79
|
}
|
|
125
80
|
&:not(:last-child)::after {
|
|
126
81
|
content: '';
|
|
127
82
|
position: absolute;
|
|
128
83
|
top: 0;
|
|
129
|
-
right: calc(-0.5 * ${
|
|
130
|
-
width: ${
|
|
84
|
+
right: calc(-0.5 * ${s});
|
|
85
|
+
width: ${s};
|
|
131
86
|
bottom: 0;
|
|
132
|
-
background: ${
|
|
87
|
+
background: ${o("line")};
|
|
133
88
|
}
|
|
134
89
|
}
|
|
135
90
|
&.hide,
|
|
@@ -137,148 +92,103 @@ const injectStyle = (themeManager, { css }) => {
|
|
|
137
92
|
display: none;
|
|
138
93
|
}
|
|
139
94
|
`;
|
|
140
|
-
}
|
|
141
|
-
const
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
return {
|
|
151
|
-
dom: div,
|
|
152
|
-
render: (editorView) => {
|
|
153
|
-
var _a;
|
|
154
|
-
Object.values(buttonMap2).filter((item) => item.enable(editorView) && item.$ != null).forEach(({ $ }) => div.appendChild($));
|
|
155
|
-
(_a = editorView.dom.parentNode) == null ? void 0 : _a.appendChild(div);
|
|
95
|
+
}, w = (t, e, o) => {
|
|
96
|
+
const s = document.createElement("div");
|
|
97
|
+
return e.themeManager.onFlush(() => {
|
|
98
|
+
const n = e.getStyle((i) => q(e.themeManager, i)) || "";
|
|
99
|
+
n && s.classList.add(n);
|
|
100
|
+
}), s.classList.add(e.getClassName({}, o)), {
|
|
101
|
+
dom: s,
|
|
102
|
+
render: (n) => {
|
|
103
|
+
var i;
|
|
104
|
+
t.filter((r) => r.enable(n) && r.$ != null).forEach(({ $: r }) => s.appendChild(r)), (i = n.dom.parentNode) == null || i.appendChild(s);
|
|
156
105
|
}
|
|
157
106
|
};
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
const
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
}
|
|
176
|
-
item.$.classList.remove("active");
|
|
177
|
-
});
|
|
178
|
-
return noActive(buttonMap2, view);
|
|
179
|
-
};
|
|
180
|
-
const createButtonManager = (buttonMap2, utils, bottom, containerClassName) => {
|
|
181
|
-
const { dom: buttons, render } = createTooltip(buttonMap2, utils, containerClassName);
|
|
182
|
-
const onClick = (e) => {
|
|
183
|
-
const target = Object.values(buttonMap2).find(({ $ }) => e.target instanceof Element && $.contains(e.target));
|
|
184
|
-
if (!target)
|
|
185
|
-
return;
|
|
186
|
-
e.stopPropagation();
|
|
187
|
-
e.preventDefault();
|
|
188
|
-
target.command();
|
|
189
|
-
};
|
|
190
|
-
const hide = () => {
|
|
191
|
-
buttons.classList.add("hide");
|
|
107
|
+
}, N = (t, e) => Object.values(t).filter((o) => o.enable(e) && o.$ != null).every(({ $: o }) => o.classList.contains("hide")), W = (t, e) => (t.filter((o) => o.enable(e) && o.$ != null).forEach((o) => {
|
|
108
|
+
var i;
|
|
109
|
+
if ((i = o.disable) == null ? void 0 : i.call(o, e)) {
|
|
110
|
+
o.$.classList.add("hide");
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
if (o.$.classList.remove("hide"), o.active(e)) {
|
|
114
|
+
o.$.classList.add("active");
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
o.$.classList.remove("active");
|
|
118
|
+
}), N(t, e)), g = (t, e, o, s) => {
|
|
119
|
+
const { dom: n, render: i } = w(t, e, s), r = (l) => {
|
|
120
|
+
const a = t.find(({ $: d }) => l.target instanceof Element && d.contains(l.target));
|
|
121
|
+
!a || (l.stopPropagation(), l.preventDefault(), a.command());
|
|
122
|
+
}, c = () => {
|
|
123
|
+
n.classList.add("hide");
|
|
192
124
|
};
|
|
193
|
-
|
|
194
|
-
return {
|
|
125
|
+
return n.addEventListener("mousedown", r), {
|
|
195
126
|
destroy: () => {
|
|
196
|
-
|
|
197
|
-
buttons.remove();
|
|
127
|
+
n.removeEventListener("mousedown", r), n.remove();
|
|
198
128
|
},
|
|
199
|
-
hide,
|
|
200
|
-
update: (
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
hide();
|
|
129
|
+
hide: c,
|
|
130
|
+
update: (l) => {
|
|
131
|
+
if (W(t, l)) {
|
|
132
|
+
c();
|
|
204
133
|
return;
|
|
205
134
|
}
|
|
206
|
-
|
|
135
|
+
D(n, l, o);
|
|
207
136
|
},
|
|
208
|
-
render
|
|
137
|
+
render: i
|
|
209
138
|
};
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
const { state } = view;
|
|
219
|
-
if (!view.editable || shouldHide) {
|
|
220
|
-
hide();
|
|
139
|
+
}, j = (t, e, o, s) => {
|
|
140
|
+
let n = g(t, e, o, s), i = !1;
|
|
141
|
+
const r = () => {
|
|
142
|
+
n.hide();
|
|
143
|
+
}, c = (l, a) => {
|
|
144
|
+
const { state: d } = l;
|
|
145
|
+
if (!l.editable || i) {
|
|
146
|
+
r();
|
|
221
147
|
return;
|
|
222
148
|
}
|
|
223
|
-
|
|
224
|
-
if (isEqualSelection)
|
|
225
|
-
return;
|
|
226
|
-
buttonManager.update(view);
|
|
149
|
+
(a == null ? void 0 : a.doc.eq(d.doc)) && a.selection.eq(d.selection) || n.update(l);
|
|
227
150
|
};
|
|
228
151
|
return {
|
|
229
|
-
recreate: (
|
|
230
|
-
|
|
231
|
-
buttonManager.render(editorView);
|
|
232
|
-
update(editorView);
|
|
152
|
+
recreate: (l) => {
|
|
153
|
+
n = g(t, e, o, s), n.render(l), c(l);
|
|
233
154
|
},
|
|
234
|
-
update,
|
|
155
|
+
update: c,
|
|
235
156
|
destroy: () => {
|
|
236
|
-
|
|
157
|
+
n.destroy();
|
|
237
158
|
},
|
|
238
|
-
render: (
|
|
239
|
-
|
|
240
|
-
update(editorView);
|
|
159
|
+
render: (l) => {
|
|
160
|
+
n.render(l), c(l);
|
|
241
161
|
},
|
|
242
|
-
setHide: (
|
|
243
|
-
|
|
162
|
+
setHide: (l) => {
|
|
163
|
+
i = l;
|
|
244
164
|
}
|
|
245
165
|
};
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
props: {
|
|
258
|
-
handleClick: (view) => {
|
|
259
|
-
manager.setHide(false);
|
|
260
|
-
manager.update(view);
|
|
261
|
-
return false;
|
|
262
|
-
},
|
|
263
|
-
handleDOMEvents: {
|
|
264
|
-
mousedown: () => {
|
|
265
|
-
manager.setHide(false);
|
|
266
|
-
return false;
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
},
|
|
270
|
-
view: (editorView) => {
|
|
271
|
-
manager.recreate(editorView);
|
|
272
|
-
return {
|
|
273
|
-
update: manager.update,
|
|
274
|
-
destroy: manager.destroy
|
|
275
|
-
};
|
|
166
|
+
}, z = new p("MILKDOWN_TOOLTIP"), F = v((t, e) => ({
|
|
167
|
+
id: "tooltip",
|
|
168
|
+
prosePlugins: (o, s) => {
|
|
169
|
+
var r;
|
|
170
|
+
const n = j(O(s, e == null ? void 0 : e.items), t, (r = e == null ? void 0 : e.bottom) != null ? r : !1, "tooltip");
|
|
171
|
+
return [new T({
|
|
172
|
+
key: z,
|
|
173
|
+
props: {
|
|
174
|
+
handleClick: (c) => (n.setHide(!1), n.update(c), !1),
|
|
175
|
+
handleDOMEvents: {
|
|
176
|
+
mousedown: () => (n.setHide(!1), !1)
|
|
276
177
|
}
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
})
|
|
282
|
-
|
|
283
|
-
|
|
178
|
+
},
|
|
179
|
+
view: (c) => (n.recreate(c), {
|
|
180
|
+
update: n.update,
|
|
181
|
+
destroy: n.destroy
|
|
182
|
+
})
|
|
183
|
+
})];
|
|
184
|
+
}
|
|
185
|
+
})), U = $.create([F()]);
|
|
186
|
+
export {
|
|
187
|
+
O as buttonMap,
|
|
188
|
+
u as createToggleIcon,
|
|
189
|
+
I as defaultButtons,
|
|
190
|
+
z as key,
|
|
191
|
+
U as tooltip,
|
|
192
|
+
F as tooltipPlugin
|
|
193
|
+
};
|
|
284
194
|
//# sourceMappingURL=index.es.js.map
|
package/lib/index.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.es.js","sources":["../src/utility/prosemirror.ts","../src/utility/toggle.ts","../src/item.ts","../src/button-manager/calc-button-pos.ts","../src/button-manager/style.ts","../src/button-manager/create-tooltip.ts","../src/button-manager/no-active.ts","../src/button-manager/filter-button.ts","../src/button-manager/index.ts","../src/selection-marks-tooltip.ts","../src/index.ts"],"sourcesContent":["/* Copyright 2021, Milkdown by Mirone. */\nimport { findParentNode } from '@milkdown/prose';\nimport { MarkType, Node, NodeType } from '@milkdown/prose/model';\nimport { EditorState, TextSelection } from '@milkdown/prose/state';\n\nexport type Position = {\n start: number;\n end: number;\n};\n\nexport const hasMark = (editorState: EditorState, type?: MarkType): boolean => {\n if (!type) {\n return false;\n }\n const { from, to } = editorState.selection;\n\n return editorState.doc.rangeHasMark(from, from === to ? to + 1 : to, type);\n};\n\nexport const isTextSelection = (editorState: EditorState): boolean => {\n const { selection } = editorState;\n if (selection instanceof TextSelection) {\n const text = editorState.doc.textBetween(selection.from, selection.to);\n\n if (!text) return false;\n\n return true;\n }\n return false;\n};\n\nexport const isInCodeFence = (editorState: EditorState): boolean =>\n Boolean(findParentNode((node) => !!node.type.spec.code)(editorState.selection));\n\nexport const isTextAndNotHasMark = (editorState: EditorState, mark?: MarkType): boolean =>\n !isTextSelection(editorState) || isInCodeFence(editorState) || hasMark(editorState, mark);\n\nexport const equalNodeType = (nodeType: NodeType, node: Node) => {\n return (Array.isArray(nodeType) && nodeType.indexOf(node.type) > -1) || node.type === nodeType;\n};\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { commandsCtx, Ctx, ThemeIcon, themeManagerCtx } from '@milkdown/core';\nimport type { Icon } from '@milkdown/design-system';\nimport type { MarkType } from '@milkdown/prose/model';\n\nimport type { ButtonItem } from '../item';\nimport { hasMark, isTextAndNotHasMark } from './prosemirror';\n\nexport const createToggleIcon = (\n ctx: Ctx,\n iconName: Icon,\n key: string,\n mark: MarkType | undefined,\n disableForMark: MarkType | undefined,\n): ButtonItem => ({\n $: ctx.get(themeManagerCtx).get(ThemeIcon, iconName)?.dom as HTMLElement,\n command: () => ctx.get(commandsCtx).call(key),\n active: (view) => hasMark(view.state, mark),\n disable: (view) => isTextAndNotHasMark(view.state, disableForMark),\n enable: (view) => !!mark && !!view.state.schema.marks[mark.name],\n});\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { commandsCtx, Ctx, ThemeIcon, themeManagerCtx } from '@milkdown/core';\nimport type { Icon } from '@milkdown/design-system';\nimport { Schema } from '@milkdown/prose/model';\nimport { EditorView } from '@milkdown/prose/view';\n\nimport { createToggleIcon } from './utility';\n\nexport type Pred = (view: EditorView) => boolean;\nexport type Updater = (view: EditorView, $: HTMLElement) => void;\nexport type Event2Command = (e: Event) => void;\n\nexport type OnClick = (ctx: Ctx) => void;\n\nexport type Item = {\n icon: Icon | ((ctx: Ctx) => HTMLElement);\n\n onClick: string | ((ctx: Ctx) => () => void);\n\n isHidden: (ctx: Ctx) => Pred;\n\n isActive: (ctx: Ctx) => Pred;\n};\n\nexport type ButtonItem = {\n $: HTMLElement;\n command: () => void;\n active: Pred;\n disable?: Pred;\n enable: Pred;\n};\n\nconst Buttonize = ({ icon, onClick, isHidden, isActive }: Item, ctx: Ctx): ButtonItem => ({\n $: typeof icon === 'function' ? icon(ctx) : (ctx.get(themeManagerCtx).get(ThemeIcon, icon)?.dom as HTMLElement),\n command: typeof onClick === 'string' ? () => ctx.get(commandsCtx).call(onClick) : onClick(ctx),\n disable: isHidden(ctx),\n active: isActive(ctx),\n enable: (view: EditorView) => !isHidden(ctx)(view),\n});\n\nexport enum ButtonAction {\n ToggleBold,\n ToggleItalic,\n ToggleStrike,\n ToggleCode,\n ToggleLink,\n}\n\nexport type ButtonMap = Record<ButtonAction, ButtonItem>;\n\nexport type TooltipOptions = {\n bottom: boolean;\n items: Array<Item> | undefined;\n};\n\nexport const buttonMap = (schema: Schema, ctx: Ctx, items: Array<Item> | undefined): ButtonMap => {\n const { marks } = schema;\n const ButtonItems = Array<ButtonItem>();\n if (typeof items !== 'undefined') {\n (items as Array<Item>).forEach((item) => {\n ButtonItems.push(Buttonize(item, ctx));\n });\n }\n return {\n [ButtonAction.ToggleBold]: createToggleIcon(ctx, 'bold', 'ToggleBold', marks['strong'], marks['code_inline']),\n [ButtonAction.ToggleItalic]: createToggleIcon(ctx, 'italic', 'ToggleItalic', marks['em'], marks['code_inline']),\n [ButtonAction.ToggleStrike]: createToggleIcon(\n ctx,\n 'strikeThrough',\n 'ToggleStrikeThrough',\n marks['strike_through'],\n marks['code_inline'],\n ),\n [ButtonAction.ToggleCode]: createToggleIcon(\n ctx,\n 'code',\n 'ToggleInlineCode',\n marks['code_inline'],\n marks['link'],\n ),\n [ButtonAction.ToggleLink]: createToggleIcon(ctx, 'link', 'ToggleLink', marks['link'], marks['code_inline']),\n ...ButtonItems,\n };\n};\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { calculateTextPosition } from '@milkdown/prose';\nimport { EditorView } from '@milkdown/prose/view';\n\nexport const calcButtonPos = (buttons: HTMLElement, view: EditorView, isBottom: boolean) => {\n buttons.classList.remove('hide');\n calculateTextPosition(view, buttons, (start, end, target, parent) => {\n const $editor = buttons.parentElement;\n if (!$editor) {\n throw new Error();\n }\n const selectionWidth = end.left - start.left;\n let left = start.left - parent.left - (target.width - selectionWidth) / 2;\n let top = start.top - parent.top - target.height - 14 + $editor.scrollTop;\n\n if (left < 0) left = 0;\n\n if (start.top - parent.top < target.height || (isBottom && parent.bottom - start.bottom > target.height)) {\n top = start.bottom - parent.top + 14 + $editor.scrollTop;\n }\n return [top, left];\n });\n};\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { Color, Emotion, ThemeBorder, ThemeColor, ThemeManager, ThemeShadow, ThemeSize } from '@milkdown/core';\n\nexport const injectStyle = (themeManager: ThemeManager, { css }: Emotion) => {\n const palette = (color: Color, opacity = 1) => themeManager.get(ThemeColor, [color, opacity]);\n const lineWidth = themeManager.get(ThemeSize, 'lineWidth');\n return css`\n display: inline-flex;\n cursor: pointer;\n justify-content: space-evenly;\n position: absolute;\n border-radius: ${themeManager.get(ThemeSize, 'radius')};\n z-index: 2;\n\n ${themeManager.get(ThemeBorder, undefined)}\n ${themeManager.get(ThemeShadow, undefined)}\n\n overflow: hidden;\n background: ${palette('surface')};\n\n .icon {\n position: relative;\n color: ${palette('solid', 0.87)};\n\n width: 2em;\n line-height: 2em;\n text-align: center;\n transition: all 0.4s ease-in-out;\n &:hover {\n background-color: ${palette('secondary', 0.12)};\n }\n &.active {\n color: ${palette('primary')};\n }\n &:not(:last-child)::after {\n content: '';\n position: absolute;\n top: 0;\n right: calc(-0.5 * ${lineWidth});\n width: ${lineWidth};\n bottom: 0;\n background: ${palette('line')};\n }\n }\n &.hide,\n .hide {\n display: none;\n }\n `;\n};\n","/* Copyright 2021, Milkdown by Mirone. */\nimport type { EditorView } from '@milkdown/prose/view';\nimport type { Utils } from '@milkdown/utils';\n\nimport type { ButtonMap } from '../item';\nimport { injectStyle } from './style';\n\ntype Tooltip = {\n dom: HTMLDivElement;\n render: (editorView: EditorView) => void;\n};\n\nexport const createTooltip = (buttonMap: ButtonMap, utils: Utils, className: string): Tooltip => {\n const div = document.createElement('div');\n utils.themeManager.onFlush(() => {\n const style = utils.getStyle((emotion) => injectStyle(utils.themeManager, emotion)) || '';\n if (style) {\n div.classList.add(style);\n }\n });\n\n div.classList.add(utils.getClassName({}, className));\n\n return {\n dom: div,\n render: (editorView: EditorView) => {\n Object.values(buttonMap)\n .filter((item) => item.enable(editorView) && item.$ != null)\n .forEach(({ $ }) => div.appendChild($));\n\n editorView.dom.parentNode?.appendChild(div);\n },\n };\n};\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { EditorView } from '@milkdown/prose/view';\n\nimport { ButtonMap } from '../item';\n\nexport const noActive = (buttonMap: ButtonMap, view: EditorView) => {\n return Object.values(buttonMap)\n .filter((item) => item.enable(view) && item.$ != null)\n .every(({ $ }) => $.classList.contains('hide'));\n};\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { EditorView } from '@milkdown/prose/view';\n\nimport { ButtonMap } from '../item';\nimport { noActive } from './no-active';\n\nexport const filterButton = (buttonMap: ButtonMap, view: EditorView) => {\n Object.values(buttonMap)\n .filter((item) => item.enable(view) && item.$ != null)\n .forEach((item) => {\n const disable = item.disable?.(view);\n if (disable) {\n item.$.classList.add('hide');\n return;\n }\n\n item.$.classList.remove('hide');\n\n const active = item.active(view);\n if (active) {\n item.$.classList.add('active');\n return;\n }\n item.$.classList.remove('active');\n });\n\n return noActive(buttonMap, view);\n};\n","/* Copyright 2021, Milkdown by Mirone. */\nimport type { EditorView } from '@milkdown/prose/view';\nimport type { Utils } from '@milkdown/utils';\n\nimport type { ButtonMap } from '../item';\nimport { calcButtonPos } from './calc-button-pos';\nimport { createTooltip } from './create-tooltip';\nimport { filterButton } from './filter-button';\n\nexport const createButtonManager = (\n buttonMap: ButtonMap,\n utils: Utils,\n bottom: boolean,\n containerClassName: string,\n) => {\n const { dom: buttons, render } = createTooltip(buttonMap, utils, containerClassName);\n\n const onClick = (e: Event) => {\n const target = Object.values(buttonMap).find(({ $ }) => e.target instanceof Element && $.contains(e.target));\n if (!target) return;\n\n e.stopPropagation();\n e.preventDefault();\n target.command();\n };\n\n const hide = () => {\n buttons.classList.add('hide');\n };\n\n buttons.addEventListener('mousedown', onClick);\n\n return {\n destroy: () => {\n buttons.removeEventListener('mousedown', onClick);\n buttons.remove();\n },\n hide,\n update: (editorView: EditorView) => {\n const noActive = filterButton(buttonMap, editorView);\n if (noActive) {\n hide();\n return;\n }\n calcButtonPos(buttons, editorView, bottom);\n },\n render,\n };\n};\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { EditorState } from '@milkdown/prose/state';\nimport type { EditorView } from '@milkdown/prose/view';\nimport { Utils } from '@milkdown/utils';\n\nimport { createButtonManager } from './button-manager';\nimport type { ButtonMap } from './item';\n\nexport const createPlugin = (buttonMap: ButtonMap, utils: Utils, bottom: boolean, containerClassName: string) => {\n let buttonManager = createButtonManager(buttonMap, utils, bottom, containerClassName);\n let shouldHide = false;\n\n const hide = () => {\n buttonManager.hide();\n };\n\n const update = (view: EditorView, prevState?: EditorState) => {\n const { state } = view;\n\n if (!view.editable || shouldHide) {\n hide();\n return;\n }\n\n const isEqualSelection = prevState?.doc.eq(state.doc) && prevState.selection.eq(state.selection);\n if (isEqualSelection) return;\n\n buttonManager.update(view);\n };\n\n return {\n recreate: (editorView: EditorView) => {\n buttonManager = createButtonManager(buttonMap, utils, bottom, containerClassName);\n buttonManager.render(editorView);\n update(editorView);\n },\n update,\n destroy: () => {\n buttonManager.destroy();\n },\n render: (editorView: EditorView) => {\n buttonManager.render(editorView);\n update(editorView);\n },\n setHide: (isTyping: boolean) => {\n shouldHide = isTyping;\n },\n };\n};\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { schemaCtx } from '@milkdown/core';\nimport { Plugin, PluginKey } from '@milkdown/prose/state';\nimport { AtomList, createPlugin as create } from '@milkdown/utils';\n\nimport { buttonMap, TooltipOptions } from './item';\nimport { createPlugin } from './selection-marks-tooltip';\n\nexport const key = new PluginKey('MILKDOWN_TOOLTIP');\n\nexport const tooltipPlugin = create<string, TooltipOptions>((utils, options) => {\n return {\n id: 'tooltip',\n prosePlugins: (_, ctx) => {\n const schema = ctx.get(schemaCtx);\n const manager = createPlugin(\n buttonMap(schema, ctx, options?.items),\n utils,\n options?.bottom ?? false,\n 'tooltip',\n );\n const plugin = new Plugin({\n key,\n props: {\n handleClick: (view) => {\n manager.setHide(false);\n manager.update(view);\n return false;\n },\n handleDOMEvents: {\n mousedown: () => {\n manager.setHide(false);\n return false;\n },\n },\n },\n view: (editorView) => {\n manager.recreate(editorView);\n return {\n update: manager.update,\n destroy: manager.destroy,\n };\n },\n });\n return [plugin];\n },\n };\n});\n\nexport const tooltip = AtomList.create([tooltipPlugin()]);\n"],"names":["create"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.es.js","sources":["../src/utility/prosemirror.ts","../src/item.ts","../src/button-manager/calc-button-pos.ts","../src/button-manager/style.ts","../src/button-manager/create-tooltip.ts","../src/button-manager/no-active.ts","../src/button-manager/filter-button.ts","../src/button-manager/index.ts","../src/selection-marks-tooltip.ts","../src/index.ts"],"sourcesContent":["/* Copyright 2021, Milkdown by Mirone. */\nimport { findParentNode } from '@milkdown/prose';\nimport { MarkType, Node, NodeType } from '@milkdown/prose/model';\nimport { EditorState, TextSelection } from '@milkdown/prose/state';\n\nexport type Position = {\n start: number;\n end: number;\n};\n\nexport const hasMark = (editorState: EditorState, type?: MarkType): boolean => {\n if (!type) {\n return false;\n }\n const { from, to } = editorState.selection;\n\n return editorState.doc.rangeHasMark(from, from === to ? to + 1 : to, type);\n};\n\nexport const isTextSelection = (editorState: EditorState): boolean => {\n const { selection } = editorState;\n if (selection instanceof TextSelection) {\n const text = editorState.doc.textBetween(selection.from, selection.to);\n\n if (!text) return false;\n\n return true;\n }\n return false;\n};\n\nexport const isInCodeFence = (editorState: EditorState): boolean =>\n Boolean(findParentNode((node) => !!node.type.spec.code)(editorState.selection));\n\nexport const isTextAndNotHasMark = (editorState: EditorState, mark?: MarkType): boolean =>\n !isTextSelection(editorState) || isInCodeFence(editorState) || hasMark(editorState, mark);\n\nexport const equalNodeType = (nodeType: NodeType, node: Node) => {\n return (Array.isArray(nodeType) && nodeType.indexOf(node.type) > -1) || node.type === nodeType;\n};\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { commandsCtx, Ctx, schemaCtx, ThemeIcon, themeManagerCtx } from '@milkdown/core';\nimport type { Icon } from '@milkdown/design-system';\nimport type { MarkType } from '@milkdown/prose/model';\nimport { EditorView } from '@milkdown/prose/view';\n\nimport { hasMark, isTextAndNotHasMark } from './utility';\n\nexport type Pred = (view: EditorView) => boolean;\nexport type Updater = (view: EditorView, $: HTMLElement) => void;\nexport type Event2Command = (e: Event) => void;\n\nexport type OnClick = (ctx: Ctx) => void;\n\nexport type Item = {\n icon: Icon | ((ctx: Ctx) => HTMLElement);\n onClick: string | ((ctx: Ctx) => () => void);\n isHidden: (ctx: Ctx) => Pred;\n isActive: (ctx: Ctx) => Pred;\n canAddToDOM: (ctx: Ctx) => Pred;\n};\n\nexport type ButtonItem = {\n $: HTMLElement;\n command: () => void;\n active: Pred;\n disable?: Pred;\n enable: Pred;\n};\n\nexport const createToggleIcon = (\n icon: Icon,\n onClick: string,\n mark: MarkType | undefined,\n disableForMark: MarkType | undefined,\n): Item => ({\n icon,\n onClick,\n isHidden: () => (view: EditorView) => isTextAndNotHasMark(view.state, disableForMark),\n isActive: () => (view: EditorView) => hasMark(view.state, mark),\n canAddToDOM: () => (view: EditorView) => !!mark && !!view.state.schema.marks[mark.name],\n});\n\nexport const defaultButtons = (ctx: Ctx) => {\n const marks = ctx.get(schemaCtx).marks;\n return [\n createToggleIcon('bold', 'ToggleBold', marks['strong'], marks['code_inline']),\n createToggleIcon('italic', 'ToggleItalic', marks['em'], marks['code_inline']),\n createToggleIcon('strikeThrough', 'ToggleStrikeThrough', marks['strike_through'], marks['code_inline']),\n createToggleIcon('code', 'ToggleInlineCode', marks['code_inline'], marks['link']),\n createToggleIcon('link', 'ToggleLink', marks['link'], marks['code_inline']),\n ];\n};\n\nexport type ButtonList = ButtonItem[];\n\nexport type TooltipOptions = {\n bottom: boolean;\n items: (ctx: Ctx) => Array<Item>;\n};\n\nexport const buttonMap = (ctx: Ctx, items: (ctx: Ctx) => Array<Item> = defaultButtons): ButtonList => {\n const toButton = ({ icon, onClick, isHidden, isActive, canAddToDOM }: Item): ButtonItem => ({\n $: typeof icon === 'function' ? icon(ctx) : (ctx.get(themeManagerCtx).get(ThemeIcon, icon)?.dom as HTMLElement),\n command: typeof onClick === 'string' ? () => ctx.get(commandsCtx).call(onClick) : onClick(ctx),\n disable: isHidden(ctx),\n active: isActive(ctx),\n enable: canAddToDOM(ctx),\n });\n return items(ctx).map(toButton);\n};\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { missingRootElement } from '@milkdown/exception';\nimport { calculateTextPosition } from '@milkdown/prose';\nimport { EditorView } from '@milkdown/prose/view';\n\nexport const calcButtonPos = (buttons: HTMLElement, view: EditorView, isBottom: boolean) => {\n buttons.classList.remove('hide');\n calculateTextPosition(view, buttons, (start, end, target, parent) => {\n const $editor = buttons.parentElement;\n if (!$editor) {\n throw missingRootElement();\n }\n const selectionWidth = end.left - start.left;\n let left = start.left - parent.left - (target.width - selectionWidth) / 2;\n let top = start.top - parent.top - target.height - 14 + $editor.scrollTop;\n\n if (left < 0) left = 0;\n\n if (start.top - parent.top < target.height || (isBottom && parent.bottom - start.bottom > target.height)) {\n top = start.bottom - parent.top + 14 + $editor.scrollTop;\n }\n return [top, left];\n });\n};\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { Color, Emotion, ThemeBorder, ThemeColor, ThemeManager, ThemeShadow, ThemeSize } from '@milkdown/core';\n\nexport const injectStyle = (themeManager: ThemeManager, { css }: Emotion) => {\n const palette = (color: Color, opacity = 1) => themeManager.get(ThemeColor, [color, opacity]);\n const lineWidth = themeManager.get(ThemeSize, 'lineWidth');\n return css`\n display: inline-flex;\n cursor: pointer;\n justify-content: space-evenly;\n position: absolute;\n border-radius: ${themeManager.get(ThemeSize, 'radius')};\n z-index: 2;\n\n ${themeManager.get(ThemeBorder, undefined)}\n ${themeManager.get(ThemeShadow, undefined)}\n\n overflow: hidden;\n background: ${palette('surface')};\n\n .icon {\n position: relative;\n color: ${palette('solid', 0.87)};\n\n width: 2em;\n line-height: 2em;\n text-align: center;\n transition: all 0.4s ease-in-out;\n &:hover {\n background-color: ${palette('secondary', 0.12)};\n }\n &.active {\n color: ${palette('primary')};\n }\n &:not(:last-child)::after {\n content: '';\n position: absolute;\n top: 0;\n right: calc(-0.5 * ${lineWidth});\n width: ${lineWidth};\n bottom: 0;\n background: ${palette('line')};\n }\n }\n &.hide,\n .hide {\n display: none;\n }\n `;\n};\n","/* Copyright 2021, Milkdown by Mirone. */\nimport type { EditorView } from '@milkdown/prose/view';\nimport type { Utils } from '@milkdown/utils';\n\nimport type { ButtonList } from '../item';\nimport { injectStyle } from './style';\n\ntype Tooltip = {\n dom: HTMLDivElement;\n render: (editorView: EditorView) => void;\n};\n\nexport const createTooltip = (buttonMap: ButtonList, utils: Utils, className: string): Tooltip => {\n const div = document.createElement('div');\n utils.themeManager.onFlush(() => {\n const style = utils.getStyle((emotion) => injectStyle(utils.themeManager, emotion)) || '';\n if (style) {\n div.classList.add(style);\n }\n });\n\n div.classList.add(utils.getClassName({}, className));\n\n return {\n dom: div,\n render: (editorView: EditorView) => {\n buttonMap\n .filter((item) => item.enable(editorView) && item.$ != null)\n .forEach(({ $ }) => div.appendChild($));\n\n editorView.dom.parentNode?.appendChild(div);\n },\n };\n};\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { EditorView } from '@milkdown/prose/view';\n\nimport { ButtonList } from '../item';\n\nexport const noActive = (buttonMap: ButtonList, view: EditorView) => {\n return Object.values(buttonMap)\n .filter((item) => item.enable(view) && item.$ != null)\n .every(({ $ }) => $.classList.contains('hide'));\n};\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { EditorView } from '@milkdown/prose/view';\n\nimport { ButtonList } from '../item';\nimport { noActive } from './no-active';\n\nexport const filterButton = (buttons: ButtonList, view: EditorView) => {\n buttons\n .filter((item) => item.enable(view) && item.$ != null)\n .forEach((item) => {\n const disable = item.disable?.(view);\n if (disable) {\n item.$.classList.add('hide');\n return;\n }\n\n item.$.classList.remove('hide');\n\n const active = item.active(view);\n if (active) {\n item.$.classList.add('active');\n return;\n }\n item.$.classList.remove('active');\n });\n\n return noActive(buttons, view);\n};\n","/* Copyright 2021, Milkdown by Mirone. */\nimport type { EditorView } from '@milkdown/prose/view';\nimport type { Utils } from '@milkdown/utils';\n\nimport type { ButtonList } from '../item';\nimport { calcButtonPos } from './calc-button-pos';\nimport { createTooltip } from './create-tooltip';\nimport { filterButton } from './filter-button';\n\nexport const createButtonManager = (buttons: ButtonList, utils: Utils, bottom: boolean, containerClassName: string) => {\n const { dom: buttonDOM, render } = createTooltip(buttons, utils, containerClassName);\n\n const onClick = (e: Event) => {\n const target = buttons.find(({ $ }) => e.target instanceof Element && $.contains(e.target));\n if (!target) return;\n\n e.stopPropagation();\n e.preventDefault();\n target.command();\n };\n\n const hide = () => {\n buttonDOM.classList.add('hide');\n };\n\n buttonDOM.addEventListener('mousedown', onClick);\n\n return {\n destroy: () => {\n buttonDOM.removeEventListener('mousedown', onClick);\n buttonDOM.remove();\n },\n hide,\n update: (editorView: EditorView) => {\n const noActive = filterButton(buttons, editorView);\n if (noActive) {\n hide();\n return;\n }\n calcButtonPos(buttonDOM, editorView, bottom);\n },\n render,\n };\n};\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { EditorState } from '@milkdown/prose/state';\nimport type { EditorView } from '@milkdown/prose/view';\nimport { Utils } from '@milkdown/utils';\n\nimport { createButtonManager } from './button-manager';\nimport type { ButtonList } from './item';\n\nexport const createPlugin = (buttonMap: ButtonList, utils: Utils, bottom: boolean, containerClassName: string) => {\n let buttonManager = createButtonManager(buttonMap, utils, bottom, containerClassName);\n let shouldHide = false;\n\n const hide = () => {\n buttonManager.hide();\n };\n\n const update = (view: EditorView, prevState?: EditorState) => {\n const { state } = view;\n\n if (!view.editable || shouldHide) {\n hide();\n return;\n }\n\n const isEqualSelection = prevState?.doc.eq(state.doc) && prevState.selection.eq(state.selection);\n if (isEqualSelection) return;\n\n buttonManager.update(view);\n };\n\n return {\n recreate: (editorView: EditorView) => {\n buttonManager = createButtonManager(buttonMap, utils, bottom, containerClassName);\n buttonManager.render(editorView);\n update(editorView);\n },\n update,\n destroy: () => {\n buttonManager.destroy();\n },\n render: (editorView: EditorView) => {\n buttonManager.render(editorView);\n update(editorView);\n },\n setHide: (isTyping: boolean) => {\n shouldHide = isTyping;\n },\n };\n};\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { Plugin, PluginKey } from '@milkdown/prose/state';\nimport { AtomList, createPlugin as create } from '@milkdown/utils';\n\nimport { buttonMap, TooltipOptions } from './item';\nimport { createPlugin } from './selection-marks-tooltip';\n\nexport const key = new PluginKey('MILKDOWN_TOOLTIP');\nexport * from './item';\n\nexport const tooltipPlugin = create<string, TooltipOptions>((utils, options) => {\n return {\n id: 'tooltip',\n prosePlugins: (_, ctx) => {\n const manager = createPlugin(buttonMap(ctx, options?.items), utils, options?.bottom ?? false, 'tooltip');\n const plugin = new Plugin({\n key,\n props: {\n handleClick: (view) => {\n manager.setHide(false);\n manager.update(view);\n return false;\n },\n handleDOMEvents: {\n mousedown: () => {\n manager.setHide(false);\n return false;\n },\n },\n },\n view: (editorView) => {\n manager.recreate(editorView);\n return {\n update: manager.update,\n destroy: manager.destroy,\n };\n },\n });\n return [plugin];\n },\n };\n});\n\nexport const tooltip = AtomList.create([tooltipPlugin()]);\n"],"names":["create"],"mappings":"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"}
|
package/lib/item.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Ctx } from '@milkdown/core';
|
|
2
2
|
import type { Icon } from '@milkdown/design-system';
|
|
3
|
-
import {
|
|
3
|
+
import type { MarkType } from '@milkdown/prose/model';
|
|
4
4
|
import { EditorView } from '@milkdown/prose/view';
|
|
5
5
|
export declare type Pred = (view: EditorView) => boolean;
|
|
6
6
|
export declare type Updater = (view: EditorView, $: HTMLElement) => void;
|
|
@@ -11,6 +11,7 @@ export declare type Item = {
|
|
|
11
11
|
onClick: string | ((ctx: Ctx) => () => void);
|
|
12
12
|
isHidden: (ctx: Ctx) => Pred;
|
|
13
13
|
isActive: (ctx: Ctx) => Pred;
|
|
14
|
+
canAddToDOM: (ctx: Ctx) => Pred;
|
|
14
15
|
};
|
|
15
16
|
export declare type ButtonItem = {
|
|
16
17
|
$: HTMLElement;
|
|
@@ -19,17 +20,12 @@ export declare type ButtonItem = {
|
|
|
19
20
|
disable?: Pred;
|
|
20
21
|
enable: Pred;
|
|
21
22
|
};
|
|
22
|
-
export declare
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
ToggleStrike = 2,
|
|
26
|
-
ToggleCode = 3,
|
|
27
|
-
ToggleLink = 4
|
|
28
|
-
}
|
|
29
|
-
export declare type ButtonMap = Record<ButtonAction, ButtonItem>;
|
|
23
|
+
export declare const createToggleIcon: (icon: Icon, onClick: string, mark: MarkType | undefined, disableForMark: MarkType | undefined) => Item;
|
|
24
|
+
export declare const defaultButtons: (ctx: Ctx) => Item[];
|
|
25
|
+
export declare type ButtonList = ButtonItem[];
|
|
30
26
|
export declare type TooltipOptions = {
|
|
31
27
|
bottom: boolean;
|
|
32
|
-
items: Array<Item
|
|
28
|
+
items: (ctx: Ctx) => Array<Item>;
|
|
33
29
|
};
|
|
34
|
-
export declare const buttonMap: (
|
|
30
|
+
export declare const buttonMap: (ctx: Ctx, items?: (ctx: Ctx) => Array<Item>) => ButtonList;
|
|
35
31
|
//# sourceMappingURL=item.d.ts.map
|
package/lib/item.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"item.d.ts","sourceRoot":"","sources":["../src/item.ts"],"names":[],"mappings":"AACA,OAAO,EAAe,GAAG,
|
|
1
|
+
{"version":3,"file":"item.d.ts","sourceRoot":"","sources":["../src/item.ts"],"names":[],"mappings":"AACA,OAAO,EAAe,GAAG,EAAyC,MAAM,gBAAgB,CAAC;AACzF,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAIlD,oBAAY,IAAI,GAAG,CAAC,IAAI,EAAE,UAAU,KAAK,OAAO,CAAC;AACjD,oBAAY,OAAO,GAAG,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,WAAW,KAAK,IAAI,CAAC;AACjE,oBAAY,aAAa,GAAG,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC;AAE/C,oBAAY,OAAO,GAAG,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,CAAC;AAEzC,oBAAY,IAAI,GAAG;IACf,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,KAAK,WAAW,CAAC,CAAC;IACzC,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,KAAK,MAAM,IAAI,CAAC,CAAC;IAC7C,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,CAAC;IAC7B,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,CAAC;IAC7B,WAAW,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,CAAC;CACnC,CAAC;AAEF,oBAAY,UAAU,GAAG;IACrB,CAAC,EAAE,WAAW,CAAC;IACf,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,EAAE,IAAI,CAAC;IACb,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,MAAM,EAAE,IAAI,CAAC;CAChB,CAAC;AAEF,eAAO,MAAM,gBAAgB,SACnB,IAAI,WACD,MAAM,QACT,QAAQ,GAAG,SAAS,kBACV,QAAQ,GAAG,SAAS,KACrC,IAMD,CAAC;AAEH,eAAO,MAAM,cAAc,QAAS,GAAG,WAStC,CAAC;AAEF,oBAAY,UAAU,GAAG,UAAU,EAAE,CAAC;AAEtC,oBAAY,cAAc,GAAG;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC;CACpC,CAAC;AAEF,eAAO,MAAM,SAAS,QAAS,GAAG,gBAAe,GAAG,KAAK,MAAM,IAAI,CAAC,eASnE,CAAC"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { EditorState } from '@milkdown/prose/state';
|
|
2
2
|
import type { EditorView } from '@milkdown/prose/view';
|
|
3
3
|
import { Utils } from '@milkdown/utils';
|
|
4
|
-
import type {
|
|
5
|
-
export declare const createPlugin: (buttonMap:
|
|
4
|
+
import type { ButtonList } from './item';
|
|
5
|
+
export declare const createPlugin: (buttonMap: ButtonList, utils: Utils, bottom: boolean, containerClassName: string) => {
|
|
6
6
|
recreate: (editorView: EditorView) => void;
|
|
7
|
-
update: (view: EditorView, prevState?: EditorState
|
|
7
|
+
update: (view: EditorView, prevState?: EditorState) => void;
|
|
8
8
|
destroy: () => void;
|
|
9
9
|
render: (editorView: EditorView) => void;
|
|
10
10
|
setHide: (isTyping: boolean) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selection-marks-tooltip.d.ts","sourceRoot":"","sources":["../src/selection-marks-tooltip.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAGxC,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"selection-marks-tooltip.d.ts","sourceRoot":"","sources":["../src/selection-marks-tooltip.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAGxC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEzC,eAAO,MAAM,YAAY,iCAAkC,KAAK,UAAU,OAAO,sBAAsB,MAAM;2BAuB9E,UAAU;mBAff,UAAU,cAAc,WAAW;;yBAwBhC,UAAU;wBAIX,OAAO;CAIlC,CAAC"}
|
package/lib/utility/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utility/index.ts"],"names":[],"mappings":"AACA,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utility/index.ts"],"names":[],"mappings":"AACA,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC"}
|
|
@@ -4,9 +4,9 @@ export declare type Position = {
|
|
|
4
4
|
start: number;
|
|
5
5
|
end: number;
|
|
6
6
|
};
|
|
7
|
-
export declare const hasMark: (editorState: EditorState, type?: MarkType
|
|
7
|
+
export declare const hasMark: (editorState: EditorState, type?: MarkType) => boolean;
|
|
8
8
|
export declare const isTextSelection: (editorState: EditorState) => boolean;
|
|
9
9
|
export declare const isInCodeFence: (editorState: EditorState) => boolean;
|
|
10
|
-
export declare const isTextAndNotHasMark: (editorState: EditorState, mark?: MarkType
|
|
10
|
+
export declare const isTextAndNotHasMark: (editorState: EditorState, mark?: MarkType) => boolean;
|
|
11
11
|
export declare const equalNodeType: (nodeType: NodeType, node: Node) => boolean;
|
|
12
12
|
//# sourceMappingURL=prosemirror.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prosemirror.d.ts","sourceRoot":"","sources":["../../src/utility/prosemirror.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAAE,WAAW,EAAiB,MAAM,uBAAuB,CAAC;AAEnE,oBAAY,QAAQ,GAAG;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,eAAO,MAAM,OAAO,gBAAiB,WAAW,
|
|
1
|
+
{"version":3,"file":"prosemirror.d.ts","sourceRoot":"","sources":["../../src/utility/prosemirror.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAAE,WAAW,EAAiB,MAAM,uBAAuB,CAAC;AAEnE,oBAAY,QAAQ,GAAG;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,eAAO,MAAM,OAAO,gBAAiB,WAAW,SAAS,QAAQ,KAAG,OAOnE,CAAC;AAEF,eAAO,MAAM,eAAe,gBAAiB,WAAW,KAAG,OAU1D,CAAC;AAEF,eAAO,MAAM,aAAa,gBAAiB,WAAW,KAAG,OAC0B,CAAC;AAEpF,eAAO,MAAM,mBAAmB,gBAAiB,WAAW,SAAS,QAAQ,KAAG,OACa,CAAC;AAE9F,eAAO,MAAM,aAAa,aAAc,QAAQ,QAAQ,IAAI,YAE3D,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@milkdown/plugin-tooltip",
|
|
3
|
-
"version": "6.
|
|
3
|
+
"version": "6.3.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./lib/index.es.js",
|
|
6
6
|
"types": "./lib/index.d.ts",
|
|
@@ -15,17 +15,18 @@
|
|
|
15
15
|
"milkdown plugin"
|
|
16
16
|
],
|
|
17
17
|
"devDependencies": {
|
|
18
|
-
"@milkdown/core": "6.
|
|
19
|
-
"@milkdown/prose": "6.
|
|
20
|
-
"@milkdown/design-system": "6.
|
|
18
|
+
"@milkdown/core": "6.3.0",
|
|
19
|
+
"@milkdown/prose": "6.3.0",
|
|
20
|
+
"@milkdown/design-system": "6.3.0"
|
|
21
21
|
},
|
|
22
22
|
"peerDependencies": {
|
|
23
23
|
"@milkdown/core": "^6.0.1",
|
|
24
24
|
"@milkdown/prose": "^6.0.1"
|
|
25
25
|
},
|
|
26
26
|
"dependencies": {
|
|
27
|
-
"@milkdown/utils": "6.
|
|
28
|
-
"
|
|
27
|
+
"@milkdown/utils": "6.3.0",
|
|
28
|
+
"@milkdown/exception": "6.3.0",
|
|
29
|
+
"tslib": "^2.4.0"
|
|
29
30
|
},
|
|
30
31
|
"nx": {
|
|
31
32
|
"targets": {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
/* Copyright 2021, Milkdown by Mirone. */
|
|
2
|
+
import { missingRootElement } from '@milkdown/exception';
|
|
2
3
|
import { calculateTextPosition } from '@milkdown/prose';
|
|
3
4
|
import { EditorView } from '@milkdown/prose/view';
|
|
4
5
|
|
|
@@ -7,7 +8,7 @@ export const calcButtonPos = (buttons: HTMLElement, view: EditorView, isBottom:
|
|
|
7
8
|
calculateTextPosition(view, buttons, (start, end, target, parent) => {
|
|
8
9
|
const $editor = buttons.parentElement;
|
|
9
10
|
if (!$editor) {
|
|
10
|
-
throw
|
|
11
|
+
throw missingRootElement();
|
|
11
12
|
}
|
|
12
13
|
const selectionWidth = end.left - start.left;
|
|
13
14
|
let left = start.left - parent.left - (target.width - selectionWidth) / 2;
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import type { EditorView } from '@milkdown/prose/view';
|
|
3
3
|
import type { Utils } from '@milkdown/utils';
|
|
4
4
|
|
|
5
|
-
import type {
|
|
5
|
+
import type { ButtonList } from '../item';
|
|
6
6
|
import { injectStyle } from './style';
|
|
7
7
|
|
|
8
8
|
type Tooltip = {
|
|
@@ -10,7 +10,7 @@ type Tooltip = {
|
|
|
10
10
|
render: (editorView: EditorView) => void;
|
|
11
11
|
};
|
|
12
12
|
|
|
13
|
-
export const createTooltip = (buttonMap:
|
|
13
|
+
export const createTooltip = (buttonMap: ButtonList, utils: Utils, className: string): Tooltip => {
|
|
14
14
|
const div = document.createElement('div');
|
|
15
15
|
utils.themeManager.onFlush(() => {
|
|
16
16
|
const style = utils.getStyle((emotion) => injectStyle(utils.themeManager, emotion)) || '';
|
|
@@ -24,7 +24,7 @@ export const createTooltip = (buttonMap: ButtonMap, utils: Utils, className: str
|
|
|
24
24
|
return {
|
|
25
25
|
dom: div,
|
|
26
26
|
render: (editorView: EditorView) => {
|
|
27
|
-
|
|
27
|
+
buttonMap
|
|
28
28
|
.filter((item) => item.enable(editorView) && item.$ != null)
|
|
29
29
|
.forEach(({ $ }) => div.appendChild($));
|
|
30
30
|
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
/* Copyright 2021, Milkdown by Mirone. */
|
|
2
2
|
import { EditorView } from '@milkdown/prose/view';
|
|
3
3
|
|
|
4
|
-
import {
|
|
4
|
+
import { ButtonList } from '../item';
|
|
5
5
|
import { noActive } from './no-active';
|
|
6
6
|
|
|
7
|
-
export const filterButton = (
|
|
8
|
-
|
|
7
|
+
export const filterButton = (buttons: ButtonList, view: EditorView) => {
|
|
8
|
+
buttons
|
|
9
9
|
.filter((item) => item.enable(view) && item.$ != null)
|
|
10
10
|
.forEach((item) => {
|
|
11
11
|
const disable = item.disable?.(view);
|
|
@@ -24,5 +24,5 @@ export const filterButton = (buttonMap: ButtonMap, view: EditorView) => {
|
|
|
24
24
|
item.$.classList.remove('active');
|
|
25
25
|
});
|
|
26
26
|
|
|
27
|
-
return noActive(
|
|
27
|
+
return noActive(buttons, view);
|
|
28
28
|
};
|
|
@@ -2,21 +2,16 @@
|
|
|
2
2
|
import type { EditorView } from '@milkdown/prose/view';
|
|
3
3
|
import type { Utils } from '@milkdown/utils';
|
|
4
4
|
|
|
5
|
-
import type {
|
|
5
|
+
import type { ButtonList } from '../item';
|
|
6
6
|
import { calcButtonPos } from './calc-button-pos';
|
|
7
7
|
import { createTooltip } from './create-tooltip';
|
|
8
8
|
import { filterButton } from './filter-button';
|
|
9
9
|
|
|
10
|
-
export const createButtonManager = (
|
|
11
|
-
|
|
12
|
-
utils: Utils,
|
|
13
|
-
bottom: boolean,
|
|
14
|
-
containerClassName: string,
|
|
15
|
-
) => {
|
|
16
|
-
const { dom: buttons, render } = createTooltip(buttonMap, utils, containerClassName);
|
|
10
|
+
export const createButtonManager = (buttons: ButtonList, utils: Utils, bottom: boolean, containerClassName: string) => {
|
|
11
|
+
const { dom: buttonDOM, render } = createTooltip(buttons, utils, containerClassName);
|
|
17
12
|
|
|
18
13
|
const onClick = (e: Event) => {
|
|
19
|
-
const target =
|
|
14
|
+
const target = buttons.find(({ $ }) => e.target instanceof Element && $.contains(e.target));
|
|
20
15
|
if (!target) return;
|
|
21
16
|
|
|
22
17
|
e.stopPropagation();
|
|
@@ -25,24 +20,24 @@ export const createButtonManager = (
|
|
|
25
20
|
};
|
|
26
21
|
|
|
27
22
|
const hide = () => {
|
|
28
|
-
|
|
23
|
+
buttonDOM.classList.add('hide');
|
|
29
24
|
};
|
|
30
25
|
|
|
31
|
-
|
|
26
|
+
buttonDOM.addEventListener('mousedown', onClick);
|
|
32
27
|
|
|
33
28
|
return {
|
|
34
29
|
destroy: () => {
|
|
35
|
-
|
|
36
|
-
|
|
30
|
+
buttonDOM.removeEventListener('mousedown', onClick);
|
|
31
|
+
buttonDOM.remove();
|
|
37
32
|
},
|
|
38
33
|
hide,
|
|
39
34
|
update: (editorView: EditorView) => {
|
|
40
|
-
const noActive = filterButton(
|
|
35
|
+
const noActive = filterButton(buttons, editorView);
|
|
41
36
|
if (noActive) {
|
|
42
37
|
hide();
|
|
43
38
|
return;
|
|
44
39
|
}
|
|
45
|
-
calcButtonPos(
|
|
40
|
+
calcButtonPos(buttonDOM, editorView, bottom);
|
|
46
41
|
},
|
|
47
42
|
render,
|
|
48
43
|
};
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/* Copyright 2021, Milkdown by Mirone. */
|
|
2
2
|
import { EditorView } from '@milkdown/prose/view';
|
|
3
3
|
|
|
4
|
-
import {
|
|
4
|
+
import { ButtonList } from '../item';
|
|
5
5
|
|
|
6
|
-
export const noActive = (buttonMap:
|
|
6
|
+
export const noActive = (buttonMap: ButtonList, view: EditorView) => {
|
|
7
7
|
return Object.values(buttonMap)
|
|
8
8
|
.filter((item) => item.enable(view) && item.$ != null)
|
|
9
9
|
.every(({ $ }) => $.classList.contains('hide'));
|
package/src/index.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
/* Copyright 2021, Milkdown by Mirone. */
|
|
2
|
-
import { schemaCtx } from '@milkdown/core';
|
|
3
2
|
import { Plugin, PluginKey } from '@milkdown/prose/state';
|
|
4
3
|
import { AtomList, createPlugin as create } from '@milkdown/utils';
|
|
5
4
|
|
|
@@ -7,18 +6,13 @@ import { buttonMap, TooltipOptions } from './item';
|
|
|
7
6
|
import { createPlugin } from './selection-marks-tooltip';
|
|
8
7
|
|
|
9
8
|
export const key = new PluginKey('MILKDOWN_TOOLTIP');
|
|
9
|
+
export * from './item';
|
|
10
10
|
|
|
11
11
|
export const tooltipPlugin = create<string, TooltipOptions>((utils, options) => {
|
|
12
12
|
return {
|
|
13
13
|
id: 'tooltip',
|
|
14
14
|
prosePlugins: (_, ctx) => {
|
|
15
|
-
const
|
|
16
|
-
const manager = createPlugin(
|
|
17
|
-
buttonMap(schema, ctx, options?.items),
|
|
18
|
-
utils,
|
|
19
|
-
options?.bottom ?? false,
|
|
20
|
-
'tooltip',
|
|
21
|
-
);
|
|
15
|
+
const manager = createPlugin(buttonMap(ctx, options?.items), utils, options?.bottom ?? false, 'tooltip');
|
|
22
16
|
const plugin = new Plugin({
|
|
23
17
|
key,
|
|
24
18
|
props: {
|
package/src/item.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/* Copyright 2021, Milkdown by Mirone. */
|
|
2
|
-
import { commandsCtx, Ctx, ThemeIcon, themeManagerCtx } from '@milkdown/core';
|
|
2
|
+
import { commandsCtx, Ctx, schemaCtx, ThemeIcon, themeManagerCtx } from '@milkdown/core';
|
|
3
3
|
import type { Icon } from '@milkdown/design-system';
|
|
4
|
-
import {
|
|
4
|
+
import type { MarkType } from '@milkdown/prose/model';
|
|
5
5
|
import { EditorView } from '@milkdown/prose/view';
|
|
6
6
|
|
|
7
|
-
import {
|
|
7
|
+
import { hasMark, isTextAndNotHasMark } from './utility';
|
|
8
8
|
|
|
9
9
|
export type Pred = (view: EditorView) => boolean;
|
|
10
10
|
export type Updater = (view: EditorView, $: HTMLElement) => void;
|
|
@@ -14,12 +14,10 @@ export type OnClick = (ctx: Ctx) => void;
|
|
|
14
14
|
|
|
15
15
|
export type Item = {
|
|
16
16
|
icon: Icon | ((ctx: Ctx) => HTMLElement);
|
|
17
|
-
|
|
18
17
|
onClick: string | ((ctx: Ctx) => () => void);
|
|
19
|
-
|
|
20
18
|
isHidden: (ctx: Ctx) => Pred;
|
|
21
|
-
|
|
22
19
|
isActive: (ctx: Ctx) => Pred;
|
|
20
|
+
canAddToDOM: (ctx: Ctx) => Pred;
|
|
23
21
|
};
|
|
24
22
|
|
|
25
23
|
export type ButtonItem = {
|
|
@@ -30,55 +28,44 @@ export type ButtonItem = {
|
|
|
30
28
|
enable: Pred;
|
|
31
29
|
};
|
|
32
30
|
|
|
33
|
-
const
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
31
|
+
export const createToggleIcon = (
|
|
32
|
+
icon: Icon,
|
|
33
|
+
onClick: string,
|
|
34
|
+
mark: MarkType | undefined,
|
|
35
|
+
disableForMark: MarkType | undefined,
|
|
36
|
+
): Item => ({
|
|
37
|
+
icon,
|
|
38
|
+
onClick,
|
|
39
|
+
isHidden: () => (view: EditorView) => isTextAndNotHasMark(view.state, disableForMark),
|
|
40
|
+
isActive: () => (view: EditorView) => hasMark(view.state, mark),
|
|
41
|
+
canAddToDOM: () => (view: EditorView) => !!mark && !!view.state.schema.marks[mark.name],
|
|
39
42
|
});
|
|
40
43
|
|
|
41
|
-
export
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
44
|
+
export const defaultButtons = (ctx: Ctx) => {
|
|
45
|
+
const marks = ctx.get(schemaCtx).marks;
|
|
46
|
+
return [
|
|
47
|
+
createToggleIcon('bold', 'ToggleBold', marks['strong'], marks['code_inline']),
|
|
48
|
+
createToggleIcon('italic', 'ToggleItalic', marks['em'], marks['code_inline']),
|
|
49
|
+
createToggleIcon('strikeThrough', 'ToggleStrikeThrough', marks['strike_through'], marks['code_inline']),
|
|
50
|
+
createToggleIcon('code', 'ToggleInlineCode', marks['code_inline'], marks['link']),
|
|
51
|
+
createToggleIcon('link', 'ToggleLink', marks['link'], marks['code_inline']),
|
|
52
|
+
];
|
|
53
|
+
};
|
|
48
54
|
|
|
49
|
-
export type
|
|
55
|
+
export type ButtonList = ButtonItem[];
|
|
50
56
|
|
|
51
57
|
export type TooltipOptions = {
|
|
52
58
|
bottom: boolean;
|
|
53
|
-
items: Array<Item
|
|
59
|
+
items: (ctx: Ctx) => Array<Item>;
|
|
54
60
|
};
|
|
55
61
|
|
|
56
|
-
export const buttonMap = (
|
|
57
|
-
const {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
}
|
|
64
|
-
return
|
|
65
|
-
[ButtonAction.ToggleBold]: createToggleIcon(ctx, 'bold', 'ToggleBold', marks['strong'], marks['code_inline']),
|
|
66
|
-
[ButtonAction.ToggleItalic]: createToggleIcon(ctx, 'italic', 'ToggleItalic', marks['em'], marks['code_inline']),
|
|
67
|
-
[ButtonAction.ToggleStrike]: createToggleIcon(
|
|
68
|
-
ctx,
|
|
69
|
-
'strikeThrough',
|
|
70
|
-
'ToggleStrikeThrough',
|
|
71
|
-
marks['strike_through'],
|
|
72
|
-
marks['code_inline'],
|
|
73
|
-
),
|
|
74
|
-
[ButtonAction.ToggleCode]: createToggleIcon(
|
|
75
|
-
ctx,
|
|
76
|
-
'code',
|
|
77
|
-
'ToggleInlineCode',
|
|
78
|
-
marks['code_inline'],
|
|
79
|
-
marks['link'],
|
|
80
|
-
),
|
|
81
|
-
[ButtonAction.ToggleLink]: createToggleIcon(ctx, 'link', 'ToggleLink', marks['link'], marks['code_inline']),
|
|
82
|
-
...ButtonItems,
|
|
83
|
-
};
|
|
62
|
+
export const buttonMap = (ctx: Ctx, items: (ctx: Ctx) => Array<Item> = defaultButtons): ButtonList => {
|
|
63
|
+
const toButton = ({ icon, onClick, isHidden, isActive, canAddToDOM }: Item): ButtonItem => ({
|
|
64
|
+
$: typeof icon === 'function' ? icon(ctx) : (ctx.get(themeManagerCtx).get(ThemeIcon, icon)?.dom as HTMLElement),
|
|
65
|
+
command: typeof onClick === 'string' ? () => ctx.get(commandsCtx).call(onClick) : onClick(ctx),
|
|
66
|
+
disable: isHidden(ctx),
|
|
67
|
+
active: isActive(ctx),
|
|
68
|
+
enable: canAddToDOM(ctx),
|
|
69
|
+
});
|
|
70
|
+
return items(ctx).map(toButton);
|
|
84
71
|
};
|
|
@@ -4,9 +4,9 @@ import type { EditorView } from '@milkdown/prose/view';
|
|
|
4
4
|
import { Utils } from '@milkdown/utils';
|
|
5
5
|
|
|
6
6
|
import { createButtonManager } from './button-manager';
|
|
7
|
-
import type {
|
|
7
|
+
import type { ButtonList } from './item';
|
|
8
8
|
|
|
9
|
-
export const createPlugin = (buttonMap:
|
|
9
|
+
export const createPlugin = (buttonMap: ButtonList, utils: Utils, bottom: boolean, containerClassName: string) => {
|
|
10
10
|
let buttonManager = createButtonManager(buttonMap, utils, bottom, containerClassName);
|
|
11
11
|
let shouldHide = false;
|
|
12
12
|
|
package/src/utility/index.ts
CHANGED
package/lib/utility/toggle.d.ts
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import { Ctx } from '@milkdown/core';
|
|
2
|
-
import type { Icon } from '@milkdown/design-system';
|
|
3
|
-
import type { MarkType } from '@milkdown/prose/model';
|
|
4
|
-
import type { ButtonItem } from '../item';
|
|
5
|
-
export declare const createToggleIcon: (ctx: Ctx, iconName: Icon, key: string, mark: MarkType | undefined, disableForMark: MarkType | undefined) => ButtonItem;
|
|
6
|
-
//# sourceMappingURL=toggle.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"toggle.d.ts","sourceRoot":"","sources":["../../src/utility/toggle.ts"],"names":[],"mappings":"AACA,OAAO,EAAe,GAAG,EAA8B,MAAM,gBAAgB,CAAC;AAC9E,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAG1C,eAAO,MAAM,gBAAgB,QACpB,GAAG,YACE,IAAI,OACT,MAAM,QACL,QAAQ,GAAG,SAAS,kBACV,QAAQ,GAAG,SAAS,KACrC,UAMD,CAAC"}
|
package/src/utility/toggle.ts
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
/* Copyright 2021, Milkdown by Mirone. */
|
|
2
|
-
import { commandsCtx, Ctx, ThemeIcon, themeManagerCtx } from '@milkdown/core';
|
|
3
|
-
import type { Icon } from '@milkdown/design-system';
|
|
4
|
-
import type { MarkType } from '@milkdown/prose/model';
|
|
5
|
-
|
|
6
|
-
import type { ButtonItem } from '../item';
|
|
7
|
-
import { hasMark, isTextAndNotHasMark } from './prosemirror';
|
|
8
|
-
|
|
9
|
-
export const createToggleIcon = (
|
|
10
|
-
ctx: Ctx,
|
|
11
|
-
iconName: Icon,
|
|
12
|
-
key: string,
|
|
13
|
-
mark: MarkType | undefined,
|
|
14
|
-
disableForMark: MarkType | undefined,
|
|
15
|
-
): ButtonItem => ({
|
|
16
|
-
$: ctx.get(themeManagerCtx).get(ThemeIcon, iconName)?.dom as HTMLElement,
|
|
17
|
-
command: () => ctx.get(commandsCtx).call(key),
|
|
18
|
-
active: (view) => hasMark(view.state, mark),
|
|
19
|
-
disable: (view) => isTextAndNotHasMark(view.state, disableForMark),
|
|
20
|
-
enable: (view) => !!mark && !!view.state.schema.marks[mark.name],
|
|
21
|
-
});
|