@milkdown/plugin-slash 6.5.4 → 7.0.0-next.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/index.d.ts +2 -13
- package/lib/index.d.ts.map +1 -1
- package/lib/index.es.js +80 -382
- package/lib/index.es.js.map +1 -1
- package/lib/slash-plugin.d.ts +11 -0
- package/lib/slash-plugin.d.ts.map +1 -0
- package/lib/slash-provider.d.ts +20 -0
- package/lib/slash-provider.d.ts.map +1 -0
- package/package.json +12 -8
- package/src/index.ts +2 -34
- package/src/slash-plugin.ts +31 -0
- package/src/slash-provider.ts +119 -0
- package/lib/config.d.ts +0 -21
- package/lib/config.d.ts.map +0 -1
- package/lib/item.d.ts +0 -12
- package/lib/item.d.ts.map +0 -1
- package/lib/prose-plugin/dropdown.d.ts +0 -8
- package/lib/prose-plugin/dropdown.d.ts.map +0 -1
- package/lib/prose-plugin/index.d.ts +0 -7
- package/lib/prose-plugin/index.d.ts.map +0 -1
- package/lib/prose-plugin/input.d.ts +0 -14
- package/lib/prose-plugin/input.d.ts.map +0 -1
- package/lib/prose-plugin/props.d.ts +0 -11
- package/lib/prose-plugin/props.d.ts.map +0 -1
- package/lib/prose-plugin/status.d.ts +0 -14
- package/lib/prose-plugin/status.d.ts.map +0 -1
- package/lib/prose-plugin/view.d.ts +0 -13
- package/lib/prose-plugin/view.d.ts.map +0 -1
- package/lib/style.d.ts +0 -3
- package/lib/style.d.ts.map +0 -1
- package/lib/utility.d.ts +0 -14
- package/lib/utility.d.ts.map +0 -1
- package/src/config.ts +0 -142
- package/src/item.ts +0 -21
- package/src/prose-plugin/dropdown.ts +0 -50
- package/src/prose-plugin/index.ts +0 -26
- package/src/prose-plugin/input.ts +0 -142
- package/src/prose-plugin/props.ts +0 -104
- package/src/prose-plugin/status.ts +0 -37
- package/src/prose-plugin/view.ts +0 -112
- package/src/style.ts +0 -76
- package/src/utility.ts +0 -85
package/lib/index.d.ts
CHANGED
|
@@ -1,14 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
import type { CalcPosition } from './prose-plugin/view';
|
|
4
|
-
export type { Config, StatusConfig, StatusConfigBuilder, StatusConfigBuilderParams } from './config';
|
|
5
|
-
export { defaultActions, defaultConfig } from './config';
|
|
6
|
-
export type { Action, WrappedAction } from './item';
|
|
7
|
-
export { createDropdownItem } from './utility';
|
|
8
|
-
export interface Options {
|
|
9
|
-
config: Config;
|
|
10
|
-
calcPosition: CalcPosition;
|
|
11
|
-
}
|
|
12
|
-
export declare const slashPlugin: import("@milkdown/utils").WithExtend<string, Options, import("@milkdown/utils").TypeMapping<string, string>, import("@milkdown/utils").PluginRest<string, string>>;
|
|
13
|
-
export declare const slash: AtomList<import("@milkdown/utils").Metadata<import("@milkdown/utils").GetPlugin<string, Options>> & import("@milkdown/core").MilkdownPlugin>;
|
|
1
|
+
export * from './slash-plugin';
|
|
2
|
+
export * from './slash-provider';
|
|
14
3
|
//# 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":"AACA,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,gBAAgB,CAAA;AAC9B,cAAc,kBAAkB,CAAA"}
|
package/lib/index.es.js
CHANGED
|
@@ -1,389 +1,87 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
max-height: 320px;
|
|
50
|
-
overflow-y: auto;
|
|
51
|
-
border-radius: ${e.get(C, "radius")};
|
|
52
|
-
position: absolute;
|
|
53
|
-
background: ${n("surface")};
|
|
54
|
-
|
|
55
|
-
${e.get(E, void 0)}
|
|
56
|
-
${e.get(T, void 0)}
|
|
57
|
-
${e.get(N, void 0)}
|
|
58
|
-
|
|
59
|
-
&.hide {
|
|
60
|
-
display: none;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
${O(e, t)}
|
|
64
|
-
`;
|
|
65
|
-
}, W = (e, t) => {
|
|
66
|
-
const n = document.createElement("div");
|
|
67
|
-
return n.setAttribute("role", "listbox"), n.setAttribute("tabindex", "-1"), e.themeManager.onFlush(() => {
|
|
68
|
-
const o = e.getStyle((s) => U(e.themeManager, s));
|
|
69
|
-
o && n.classList.add(o);
|
|
70
|
-
}), n.classList.add(e.getClassName({}, t), "hide"), n;
|
|
71
|
-
}, f = (e, t, n, o) => {
|
|
72
|
-
var l;
|
|
73
|
-
const s = (l = o == null ? void 0 : o.textClassName) != null ? l : "text", r = document.createElement("div");
|
|
74
|
-
r.setAttribute("role", "option"), r.classList.add("slash-dropdown-item");
|
|
75
|
-
const i = e.get(S, n);
|
|
76
|
-
if (!i)
|
|
77
|
-
throw A(n);
|
|
78
|
-
const a = document.createElement("span");
|
|
79
|
-
return a.textContent = t, a.className = s, r.appendChild(i.dom), r.appendChild(a), r;
|
|
80
|
-
}, B = (e, t) => {
|
|
81
|
-
const { selection: n } = e, { $from: o } = n, s = e.tr.deleteRange(o.start(), o.pos);
|
|
82
|
-
return t == null || t(s), !1;
|
|
83
|
-
}, F = (e) => (t, n, o) => (o && (B(t, n), e()), !0), L = (e, t = "/") => {
|
|
84
|
-
const { nodes: n } = e.get(I), o = [
|
|
85
|
-
{
|
|
86
|
-
id: "h1",
|
|
87
|
-
dom: f(e.get(u), "Large Heading", "h1"),
|
|
88
|
-
command: () => e.get(p).call("TurnIntoHeading", 1),
|
|
89
|
-
keyword: ["h1", "large heading"],
|
|
90
|
-
typeName: "heading"
|
|
91
|
-
},
|
|
92
|
-
{
|
|
93
|
-
id: "h2",
|
|
94
|
-
dom: f(e.get(u), "Medium Heading", "h2"),
|
|
95
|
-
command: () => e.get(p).call("TurnIntoHeading", 2),
|
|
96
|
-
keyword: ["h2", "medium heading"],
|
|
97
|
-
typeName: "heading"
|
|
98
|
-
},
|
|
99
|
-
{
|
|
100
|
-
id: "h3",
|
|
101
|
-
dom: f(e.get(u), "Small Heading", "h3"),
|
|
102
|
-
command: () => e.get(p).call("TurnIntoHeading", 3),
|
|
103
|
-
keyword: ["h3", "small heading"],
|
|
104
|
-
typeName: "heading"
|
|
105
|
-
},
|
|
106
|
-
{
|
|
107
|
-
id: "bulletList",
|
|
108
|
-
dom: f(e.get(u), "Bullet List", "bulletList"),
|
|
109
|
-
command: () => e.get(p).call("WrapInBulletList"),
|
|
110
|
-
keyword: ["bullet list", "ul"],
|
|
111
|
-
typeName: "bullet_list"
|
|
112
|
-
},
|
|
113
|
-
{
|
|
114
|
-
id: "orderedList",
|
|
115
|
-
dom: f(e.get(u), "Ordered List", "orderedList"),
|
|
116
|
-
command: () => e.get(p).call("WrapInOrderedList"),
|
|
117
|
-
keyword: ["ordered list", "ol"],
|
|
118
|
-
typeName: "ordered_list"
|
|
119
|
-
},
|
|
120
|
-
{
|
|
121
|
-
id: "taskList",
|
|
122
|
-
dom: f(e.get(u), "Task List", "taskList"),
|
|
123
|
-
command: () => e.get(p).call("TurnIntoTaskList"),
|
|
124
|
-
keyword: ["task list", "task"],
|
|
125
|
-
typeName: "task_list_item"
|
|
126
|
-
},
|
|
127
|
-
{
|
|
128
|
-
id: "image",
|
|
129
|
-
dom: f(e.get(u), "Image", "image"),
|
|
130
|
-
command: () => e.get(p).call("InsertImage"),
|
|
131
|
-
keyword: ["image"],
|
|
132
|
-
typeName: "image"
|
|
133
|
-
},
|
|
134
|
-
{
|
|
135
|
-
id: "blockquote",
|
|
136
|
-
dom: f(e.get(u), "Quote", "quote"),
|
|
137
|
-
command: () => e.get(p).call("WrapInBlockquote"),
|
|
138
|
-
keyword: ["quote", "blockquote"],
|
|
139
|
-
typeName: "blockquote"
|
|
140
|
-
},
|
|
141
|
-
{
|
|
142
|
-
id: "table",
|
|
143
|
-
dom: f(e.get(u), "Table", "table"),
|
|
144
|
-
command: () => e.get(p).call("InsertTable"),
|
|
145
|
-
keyword: ["table"],
|
|
146
|
-
typeName: "table"
|
|
147
|
-
},
|
|
148
|
-
{
|
|
149
|
-
id: "code",
|
|
150
|
-
dom: f(e.get(u), "Code Fence", "code"),
|
|
151
|
-
command: () => e.get(p).call("TurnIntoCodeFence"),
|
|
152
|
-
keyword: ["code"],
|
|
153
|
-
typeName: "fence"
|
|
154
|
-
},
|
|
155
|
-
{
|
|
156
|
-
id: "divider",
|
|
157
|
-
dom: f(e.get(u), "Divide Line", "divider"),
|
|
158
|
-
command: () => e.get(p).call("InsertHr"),
|
|
159
|
-
keyword: ["divider", "hr"],
|
|
160
|
-
typeName: "hr"
|
|
161
|
-
}
|
|
162
|
-
], s = t.slice(1).toLocaleLowerCase();
|
|
163
|
-
return o.filter((r) => !!n[r.typeName] && r.keyword.some((i) => i.includes(s))).map(({ keyword: r, typeName: i, ...a }) => a);
|
|
164
|
-
}, j = (e) => ({ content: t, isTopLevel: n }) => {
|
|
165
|
-
if (!n)
|
|
166
|
-
return null;
|
|
167
|
-
const o = e.get(x);
|
|
168
|
-
return o != null && o.editable ? t ? t.startsWith("/") ? t === "/" ? {
|
|
169
|
-
placeholder: "Type to filter...",
|
|
170
|
-
actions: L(e)
|
|
171
|
-
} : {
|
|
172
|
-
actions: L(e, t)
|
|
173
|
-
} : null : { placeholder: "Type / to use the slash commands..." } : null;
|
|
174
|
-
}, z = (e, { css: t }) => {
|
|
175
|
-
const n = (s, r = 1) => e.get(y, [s, r]), o = e.get(k, "typography");
|
|
176
|
-
return t`
|
|
177
|
-
position: relative;
|
|
178
|
-
&::before {
|
|
179
|
-
position: absolute;
|
|
180
|
-
cursor: text;
|
|
181
|
-
font-family: ${o};
|
|
182
|
-
font-size: 14px;
|
|
183
|
-
color: ${n("neutral", 0.6)};
|
|
184
|
-
content: attr(data-text);
|
|
185
|
-
height: 100%;
|
|
186
|
-
display: flex;
|
|
187
|
-
align-items: center;
|
|
1
|
+
var B = Object.defineProperty;
|
|
2
|
+
var I = (s, t, e) => t in s ? B(s, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : s[t] = e;
|
|
3
|
+
var i = (s, t, e) => (I(s, typeof t != "symbol" ? t + "" : t, e), e), C = (s, t, e) => {
|
|
4
|
+
if (!t.has(s))
|
|
5
|
+
throw TypeError("Cannot " + e);
|
|
6
|
+
};
|
|
7
|
+
var o = (s, t, e) => (C(s, t, "read from private field"), e ? e.call(s) : t.get(s)), r = (s, t, e) => {
|
|
8
|
+
if (t.has(s))
|
|
9
|
+
throw TypeError("Cannot add the same private member more than once");
|
|
10
|
+
t instanceof WeakSet ? t.add(s) : t.set(s, e);
|
|
11
|
+
}, h = (s, t, e, n) => (C(s, t, "write to private field"), n ? n.call(s, e) : t.set(s, e), e);
|
|
12
|
+
var $ = (s, t, e) => (C(s, t, "access private method"), e);
|
|
13
|
+
import { Plugin as M, PluginKey as N, TextSelection as O } from "@milkdown/prose/state";
|
|
14
|
+
import { $ctx as R, $prose as _ } from "@milkdown/utils";
|
|
15
|
+
import { posToDOMRect as F, findParentNode as H } from "@milkdown/prose";
|
|
16
|
+
import K from "lodash.debounce";
|
|
17
|
+
import L from "tippy.js";
|
|
18
|
+
const q = (s) => {
|
|
19
|
+
const t = R({}, `${s}_SLASH_SPEC`), e = _((p) => {
|
|
20
|
+
const a = p.get(t.key);
|
|
21
|
+
return new M({
|
|
22
|
+
key: new N(`${s}_SLASH`),
|
|
23
|
+
...a
|
|
24
|
+
});
|
|
25
|
+
}), n = [t, e];
|
|
26
|
+
return n.key = t.key, n.pluginKey = e.key, n;
|
|
27
|
+
}, j = q("MILKDOWN");
|
|
28
|
+
var c, l, m, d, g, S, k, b;
|
|
29
|
+
class z {
|
|
30
|
+
constructor(t) {
|
|
31
|
+
r(this, k);
|
|
32
|
+
r(this, c, void 0);
|
|
33
|
+
r(this, l, void 0);
|
|
34
|
+
r(this, m, void 0);
|
|
35
|
+
r(this, d, void 0);
|
|
36
|
+
r(this, g, void 0);
|
|
37
|
+
r(this, S, (t, e) => {
|
|
38
|
+
const { state: n, composing: p } = t, { selection: a, doc: x } = n, { ranges: y } = a, f = Math.min(...y.map((u) => u.$from.pos)), P = Math.max(...y.map((u) => u.$to.pos)), T = e && e.doc.eq(x) && e.selection.eq(a);
|
|
39
|
+
if (o(this, c) ?? h(this, c, L(t.dom, {
|
|
40
|
+
trigger: "manual",
|
|
41
|
+
placement: "bottom-start",
|
|
42
|
+
interactive: !0,
|
|
43
|
+
...o(this, m),
|
|
44
|
+
content: o(this, l)
|
|
45
|
+
})), !(p || T)) {
|
|
46
|
+
if (!o(this, g).call(this, t, e)) {
|
|
47
|
+
this.hide();
|
|
48
|
+
return;
|
|
188
49
|
}
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
}
|
|
194
|
-
`, R = (e, t) => ({
|
|
195
|
-
handleKeyDown: (n, o) => !(e.isEmpty() || !(o instanceof KeyboardEvent) || !["ArrowUp", "ArrowDown", "Enter"].includes(o.key)),
|
|
196
|
-
decorations: (n) => {
|
|
197
|
-
const o = P(({ type: d }) => d.name === "paragraph")(n.selection), s = n.plugins.find(
|
|
198
|
-
(d) => d.key === "MILKDOWN_UPLOAD$"
|
|
199
|
-
), r = s == null ? void 0 : s.getState(n);
|
|
200
|
-
if (r != null && r.find(n.selection.from, n.selection.to).length > 0 || !o || o.node.childCount > 1 || n.selection.$from.parentOffset !== o.node.textContent.length || o.node.firstChild && o.node.firstChild.type.name !== "text")
|
|
201
|
-
return e.clear(), null;
|
|
202
|
-
const { placeholder: i, actions: a } = e.update({
|
|
203
|
-
parentNode: n.selection.$from.node(n.selection.$from.depth - 1),
|
|
204
|
-
isTopLevel: n.selection.$from.depth === 1,
|
|
205
|
-
content: o.node.textContent,
|
|
206
|
-
state: n
|
|
50
|
+
o(this, c).setProps({
|
|
51
|
+
getReferenceClientRect: () => F(t, f, P)
|
|
52
|
+
}), this.show();
|
|
53
|
+
}
|
|
207
54
|
});
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
const l = (d, h) => {
|
|
211
|
-
const g = o.pos;
|
|
212
|
-
return q.create(n.doc, [
|
|
213
|
-
K.node(g, g + o.node.nodeSize, {
|
|
214
|
-
class: h.filter((v) => v).join(" "),
|
|
215
|
-
"data-text": d
|
|
216
|
-
})
|
|
217
|
-
]);
|
|
218
|
-
}, m = t.getStyle((d) => z(t.themeManager, d)), c = t.getStyle((d) => V(t.themeManager, d));
|
|
219
|
-
return a.length ? l(i, [m, c, "empty-node", "is-slash"]) : l(i, [m, "empty-node"]);
|
|
220
|
-
}
|
|
221
|
-
}), Q = (e) => ({
|
|
222
|
-
id: e.id,
|
|
223
|
-
$: e.dom,
|
|
224
|
-
command: F(e.command)
|
|
225
|
-
}), G = () => ({
|
|
226
|
-
placeholder: null,
|
|
227
|
-
actions: []
|
|
228
|
-
}), J = (e) => {
|
|
229
|
-
const t = G();
|
|
230
|
-
return {
|
|
231
|
-
get: () => t,
|
|
232
|
-
clear: () => {
|
|
233
|
-
t.placeholder = null, t.actions = [];
|
|
234
|
-
},
|
|
235
|
-
update: (n) => {
|
|
236
|
-
var s, r;
|
|
237
|
-
const o = e(n);
|
|
238
|
-
return t.placeholder = (s = o == null ? void 0 : o.placeholder) != null ? s : null, t.actions = ((r = o == null ? void 0 : o.actions) != null ? r : []).map(Q), t;
|
|
239
|
-
},
|
|
240
|
-
isEmpty: () => t.actions.length === 0
|
|
241
|
-
};
|
|
242
|
-
}, X = (e, t, n) => {
|
|
243
|
-
const { actions: o } = e.get();
|
|
244
|
-
if (!o.length)
|
|
245
|
-
return t.classList.add("hide"), !1;
|
|
246
|
-
for (t.childNodes.forEach((r) => {
|
|
247
|
-
r.removeEventListener("mouseenter", n.mouseEnter), r.removeEventListener("mouseleave", n.mouseLeave);
|
|
248
|
-
}); t.firstChild; )
|
|
249
|
-
t.firstChild.remove();
|
|
250
|
-
o.forEach(({ $: r }) => {
|
|
251
|
-
r.classList.remove("active"), r.addEventListener("mouseenter", n.mouseEnter), r.addEventListener("mouseleave", n.mouseLeave), t.appendChild(r);
|
|
252
|
-
}), t.style.maxHeight = "", t.classList.remove("hide");
|
|
253
|
-
const s = o[0];
|
|
254
|
-
return s && (s.$.classList.add("active"), requestAnimationFrame(() => {
|
|
255
|
-
w(s.$, {
|
|
256
|
-
scrollMode: "if-needed",
|
|
257
|
-
block: "nearest",
|
|
258
|
-
inline: "nearest"
|
|
55
|
+
i(this, "update", (t, e) => {
|
|
56
|
+
K(o(this, S), o(this, d))(t, e);
|
|
259
57
|
});
|
|
260
|
-
|
|
261
|
-
},
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
r && s >= 0 && r.$.classList.remove("active");
|
|
279
|
-
const { target: i } = n;
|
|
280
|
-
i instanceof HTMLElement && i.classList.add("active");
|
|
281
|
-
}, te = () => (e) => {
|
|
282
|
-
const { target: t } = e;
|
|
283
|
-
t instanceof HTMLElement && t.classList.remove("active");
|
|
284
|
-
}, oe = (e, t, n) => (o) => {
|
|
285
|
-
const { target: s } = o;
|
|
286
|
-
if (!(s instanceof HTMLElement) || !t)
|
|
287
|
-
return;
|
|
288
|
-
const r = () => {
|
|
289
|
-
o.stopPropagation(), o.preventDefault();
|
|
290
|
-
}, { actions: i } = e.get(), a = Object.values(i).find(({ $: l }) => l.contains(s));
|
|
291
|
-
if (!a) {
|
|
292
|
-
if (e.isEmpty())
|
|
293
|
-
return;
|
|
294
|
-
e.clear(), n.classList.add("hide"), r();
|
|
295
|
-
return;
|
|
296
|
-
}
|
|
297
|
-
r(), a.command(t.state, t.dispatch, t);
|
|
298
|
-
}, ne = (e, t, n, o) => (s) => {
|
|
299
|
-
if (!(s instanceof KeyboardEvent))
|
|
300
|
-
return;
|
|
301
|
-
o.isLock() || o.lock();
|
|
302
|
-
const { key: r } = s;
|
|
303
|
-
if (e.isEmpty() || !["ArrowDown", "ArrowUp", "Enter", "Escape"].includes(r))
|
|
304
|
-
return;
|
|
305
|
-
const { actions: i } = e.get();
|
|
306
|
-
let a = i.findIndex(({ $: c }) => c.classList.contains("active"));
|
|
307
|
-
a < 0 && (a = 0);
|
|
308
|
-
const l = (c) => {
|
|
309
|
-
const d = i[a], h = i[c];
|
|
310
|
-
!d || !h || (d.$.classList.remove("active"), h.$.classList.add("active"), w(h.$, {
|
|
311
|
-
scrollMode: "if-needed",
|
|
312
|
-
block: "nearest",
|
|
313
|
-
inline: "nearest"
|
|
314
|
-
}));
|
|
315
|
-
};
|
|
316
|
-
if (r === "ArrowDown") {
|
|
317
|
-
const c = a === i.length - 1 ? 0 : a + 1;
|
|
318
|
-
l(c);
|
|
319
|
-
return;
|
|
320
|
-
}
|
|
321
|
-
if (r === "ArrowUp") {
|
|
322
|
-
const c = a === 0 ? i.length - 1 : a - 1;
|
|
323
|
-
l(c);
|
|
324
|
-
return;
|
|
325
|
-
}
|
|
326
|
-
if (r === "Escape") {
|
|
327
|
-
if (e.isEmpty())
|
|
328
|
-
return;
|
|
329
|
-
e.clear(), n.classList.add("hide");
|
|
330
|
-
return;
|
|
58
|
+
i(this, "getContent", (t) => {
|
|
59
|
+
const { selection: e } = t.state, { empty: n } = e, p = t.state.selection instanceof O, a = o(this, l).contains(document.activeElement), x = !t.hasFocus() && !a, y = !t.editable, f = H(({ type: u }) => u.name === "paragraph")(t.state.selection);
|
|
60
|
+
return x || y || !n || !p || !f ? void 0 : f.node.textContent;
|
|
61
|
+
});
|
|
62
|
+
i(this, "destroy", () => {
|
|
63
|
+
var t;
|
|
64
|
+
(t = o(this, c)) == null || t.destroy();
|
|
65
|
+
});
|
|
66
|
+
i(this, "show", () => {
|
|
67
|
+
var t;
|
|
68
|
+
(t = o(this, c)) == null || t.show();
|
|
69
|
+
});
|
|
70
|
+
i(this, "hide", () => {
|
|
71
|
+
var t;
|
|
72
|
+
(t = o(this, c)) == null || t.hide();
|
|
73
|
+
});
|
|
74
|
+
i(this, "getInstance", () => o(this, c));
|
|
75
|
+
h(this, l, t.content), h(this, m, t.tippyOptions ?? {}), h(this, d, t.debounce ?? 200), h(this, g, t.shouldShow ?? $(this, k, b));
|
|
331
76
|
}
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
if (!r)
|
|
338
|
-
throw D();
|
|
339
|
-
let i = n.left - s.left;
|
|
340
|
-
i < 0 && (i = 0);
|
|
341
|
-
let a, l;
|
|
342
|
-
const m = n.top - s.top, c = s.height + s.top - n.bottom;
|
|
343
|
-
c >= o.height + 28 ? a = "bottom" : m >= o.height + 28 ? a = "top" : c >= m ? (a = "bottom", l = c - 28) : (a = "top", l = m - 28), (m < 0 || c < 0) && (l = s.height - n.height - 28, l > o.height && (l = void 0));
|
|
344
|
-
const d = a === "top" ? n.top - s.top - (l != null ? l : o.height) - 14 + r.scrollTop : n.bottom - s.top + 14 + r.scrollTop;
|
|
345
|
-
return t.style.maxHeight = l !== void 0 && l > 0 ? `${l}px` : "", [d, i];
|
|
346
|
-
});
|
|
347
|
-
}, se = (e, t, n, o, s) => {
|
|
348
|
-
const r = t.dom.parentNode;
|
|
349
|
-
if (!r)
|
|
350
|
-
return {};
|
|
351
|
-
const i = W(n, o), a = Y();
|
|
352
|
-
r.appendChild(i);
|
|
353
|
-
const l = Z(a), m = oe(e, t, i), c = ne(e, t, i, a), d = ee(e, a), h = te();
|
|
354
|
-
return r.addEventListener("mousemove", l), r.addEventListener("mousedown", m), r.addEventListener("keydown", c), {
|
|
355
|
-
update: (g) => {
|
|
356
|
-
!X(e, i, {
|
|
357
|
-
mouseEnter: d,
|
|
358
|
-
mouseLeave: h
|
|
359
|
-
}) || s(g, i);
|
|
360
|
-
},
|
|
361
|
-
destroy: () => {
|
|
362
|
-
r.removeEventListener("mousemove", l), r.removeEventListener("mousedown", m), r.removeEventListener("keydown", c), i.remove();
|
|
363
|
-
}
|
|
364
|
-
};
|
|
365
|
-
}, ie = "MILKDOWN_SLASH", ae = (e, t, n, o) => {
|
|
366
|
-
const s = J(t);
|
|
367
|
-
return new _({
|
|
368
|
-
key: new M(ie),
|
|
369
|
-
props: R(s, e),
|
|
370
|
-
view: (r) => se(s, r, e, n, o)
|
|
371
|
-
});
|
|
372
|
-
}, le = b((e, t) => {
|
|
373
|
-
var s, r;
|
|
374
|
-
const n = (s = t == null ? void 0 : t.config) != null ? s : j, o = (r = t == null ? void 0 : t.calcPosition) != null ? r : re;
|
|
375
|
-
return {
|
|
376
|
-
prosePlugins: (i, a) => {
|
|
377
|
-
const l = n(a);
|
|
378
|
-
return [ae(e, l, "slash-dropdown", o)];
|
|
379
|
-
}
|
|
380
|
-
};
|
|
381
|
-
}), ge = $.create([le()]);
|
|
77
|
+
}
|
|
78
|
+
c = new WeakMap(), l = new WeakMap(), m = new WeakMap(), d = new WeakMap(), g = new WeakMap(), S = new WeakMap(), k = new WeakSet(), b = function(t) {
|
|
79
|
+
const e = this.getContent(t);
|
|
80
|
+
return e ? e.at(-1) === "/" : !1;
|
|
81
|
+
};
|
|
382
82
|
export {
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
ge as slash,
|
|
387
|
-
le as slashPlugin
|
|
83
|
+
z as SlashProvider,
|
|
84
|
+
j as slash,
|
|
85
|
+
q as slashFactory
|
|
388
86
|
};
|
|
389
87
|
//# sourceMappingURL=index.es.js.map
|
package/lib/index.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.es.js","sources":["../src/style.ts","../src/utility.ts","../src/config.ts","../src/prose-plugin/props.ts","../src/item.ts","../src/prose-plugin/status.ts","../src/prose-plugin/dropdown.ts","../src/prose-plugin/input.ts","../src/prose-plugin/view.ts","../src/prose-plugin/index.ts","../src/index.ts"],"sourcesContent":["/* Copyright 2021, Milkdown by Mirone. */\nimport type {\n Color,\n Emotion,\n ThemeManager,\n} from '@milkdown/core'\nimport {\n ThemeBorder,\n ThemeColor,\n ThemeFont,\n ThemeScrollbar,\n ThemeShadow,\n ThemeSize,\n} from '@milkdown/core'\n\nconst itemStyle = (themeManager: ThemeManager, { css }: Emotion) => {\n const palette = (color: Color, opacity = 1) => themeManager.get(ThemeColor, [color, opacity])\n return css`\n .slash-dropdown-item {\n display: flex;\n gap: 32px;\n height: 48px;\n padding: 0 16px;\n align-items: center;\n justify-content: flex-start;\n cursor: pointer;\n line-height: 48px;\n font-family: ${themeManager.get(ThemeFont, 'typography')};\n font-size: 14px;\n\n transition: all 0.2s ease-in-out;\n\n &,\n .icon {\n color: ${palette('neutral', 0.87)};\n transition: all 0.2s ease-in-out;\n }\n\n &.hide {\n display: none;\n }\n\n &.active {\n background: ${palette('secondary', 0.12)};\n &,\n .icon {\n color: ${palette('primary')};\n }\n }\n }\n `\n}\n\nexport const injectStyle = (themeManager: ThemeManager, emotion: Emotion) => {\n const palette = (color: Color, opacity = 1) => themeManager.get(ThemeColor, [color, opacity])\n\n return emotion.css`\n width: 320px;\n min-height: 48px;\n max-height: 320px;\n overflow-y: auto;\n border-radius: ${themeManager.get(ThemeSize, 'radius')};\n position: absolute;\n background: ${palette('surface')};\n\n ${themeManager.get(ThemeBorder, undefined)}\n ${themeManager.get(ThemeShadow, undefined)}\n ${themeManager.get(ThemeScrollbar, undefined)}\n\n &.hide {\n display: none;\n }\n\n ${itemStyle(themeManager, emotion)}\n `\n}\n","/* Copyright 2021, Milkdown by Mirone. */\nimport type { ThemeManager } from '@milkdown/core'\nimport { ThemeIcon } from '@milkdown/core'\nimport type { Icon } from '@milkdown/design-system'\nimport { missingIcon } from '@milkdown/exception'\nimport type { Node } from '@milkdown/prose/model'\nimport type { Command } from '@milkdown/prose/state'\nimport type { ThemeUtils } from '@milkdown/utils'\n\nimport { injectStyle } from './style'\n\nexport const createDropdown = (utils: ThemeUtils, className: string) => {\n const div = document.createElement('div')\n div.setAttribute('role', 'listbox')\n div.setAttribute('tabindex', '-1')\n utils.themeManager.onFlush(() => {\n const style = utils.getStyle(emotion => injectStyle(utils.themeManager, emotion))\n\n if (style)\n div.classList.add(style)\n })\n\n div.classList.add(utils.getClassName({}, className), 'hide')\n\n return div\n}\n\ninterface ItemOptions {\n textClassName: string\n}\nexport const createDropdownItem = (\n themeManager: ThemeManager,\n text: string,\n icon: Icon,\n options?: Partial<ItemOptions>,\n) => {\n const textClassName = options?.textClassName ?? 'text'\n\n const div = document.createElement('div')\n div.setAttribute('role', 'option')\n div.classList.add('slash-dropdown-item')\n\n const iconSpan = themeManager.get(ThemeIcon, icon)\n\n if (!iconSpan)\n throw missingIcon(icon)\n\n const textSpan = document.createElement('span')\n textSpan.textContent = text\n textSpan.className = textClassName\n\n div.appendChild(iconSpan.dom)\n div.appendChild(textSpan)\n\n return div\n}\n\nexport const getDepth = (node: Node) => {\n let cur = node\n let depth = 0\n while (cur.childCount) {\n cur = cur.child(0)\n depth += 1\n }\n\n return depth\n}\n\nconst cleanUp: Command = (state, dispatch) => {\n const { selection } = state\n const { $from } = selection\n const tr = state.tr.deleteRange($from.start(), $from.pos)\n dispatch?.(tr)\n return false\n}\n\nexport const cleanUpAndCreateNode\n = (createCommand: () => void): Command =>\n (state, dispatch, view) => {\n if (view) {\n cleanUp(state, dispatch, view)\n createCommand()\n }\n return true\n }\n","/* Copyright 2021, Milkdown by Mirone. */\nimport type { Ctx } from '@milkdown/core'\nimport { commandsCtx, editorViewCtx, schemaCtx, themeManagerCtx } from '@milkdown/core'\nimport type { Node } from '@milkdown/prose/model'\nimport type { EditorState } from '@milkdown/prose/state'\n\nimport type { WrappedAction } from './item'\nimport { createDropdownItem } from './utility'\n\ntype Nullable<T> = T | null | undefined\n\nexport interface StatusConfig {\n placeholder?: Nullable<string>\n actions?: Nullable<WrappedAction[]>\n}\n\nexport interface StatusConfigBuilderParams {\n content: string\n isTopLevel: boolean\n parentNode: Node\n state: EditorState\n}\n\nexport type StatusConfigBuilder = (params: StatusConfigBuilderParams) => Nullable<StatusConfig>\n\nexport type Config = (ctx: Ctx) => StatusConfigBuilder\n\nexport const defaultActions = (ctx: Ctx, input = '/'): WrappedAction[] => {\n const { nodes } = ctx.get(schemaCtx)\n const actions: Array<WrappedAction & { keyword: string[]; typeName: string }> = [\n {\n id: 'h1',\n dom: createDropdownItem(ctx.get(themeManagerCtx), 'Large Heading', 'h1'),\n command: () => ctx.get(commandsCtx).call('TurnIntoHeading', 1),\n keyword: ['h1', 'large heading'],\n typeName: 'heading',\n },\n {\n id: 'h2',\n dom: createDropdownItem(ctx.get(themeManagerCtx), 'Medium Heading', 'h2'),\n command: () => ctx.get(commandsCtx).call('TurnIntoHeading', 2),\n keyword: ['h2', 'medium heading'],\n typeName: 'heading',\n },\n {\n id: 'h3',\n dom: createDropdownItem(ctx.get(themeManagerCtx), 'Small Heading', 'h3'),\n command: () => ctx.get(commandsCtx).call('TurnIntoHeading', 3),\n keyword: ['h3', 'small heading'],\n typeName: 'heading',\n },\n {\n id: 'bulletList',\n dom: createDropdownItem(ctx.get(themeManagerCtx), 'Bullet List', 'bulletList'),\n command: () => ctx.get(commandsCtx).call('WrapInBulletList'),\n keyword: ['bullet list', 'ul'],\n typeName: 'bullet_list',\n },\n {\n id: 'orderedList',\n dom: createDropdownItem(ctx.get(themeManagerCtx), 'Ordered List', 'orderedList'),\n command: () => ctx.get(commandsCtx).call('WrapInOrderedList'),\n keyword: ['ordered list', 'ol'],\n typeName: 'ordered_list',\n },\n {\n id: 'taskList',\n dom: createDropdownItem(ctx.get(themeManagerCtx), 'Task List', 'taskList'),\n command: () => ctx.get(commandsCtx).call('TurnIntoTaskList'),\n keyword: ['task list', 'task'],\n typeName: 'task_list_item',\n },\n {\n id: 'image',\n dom: createDropdownItem(ctx.get(themeManagerCtx), 'Image', 'image'),\n command: () => ctx.get(commandsCtx).call('InsertImage'),\n keyword: ['image'],\n typeName: 'image',\n },\n {\n id: 'blockquote',\n dom: createDropdownItem(ctx.get(themeManagerCtx), 'Quote', 'quote'),\n command: () => ctx.get(commandsCtx).call('WrapInBlockquote'),\n keyword: ['quote', 'blockquote'],\n typeName: 'blockquote',\n },\n {\n id: 'table',\n dom: createDropdownItem(ctx.get(themeManagerCtx), 'Table', 'table'),\n command: () => ctx.get(commandsCtx).call('InsertTable'),\n keyword: ['table'],\n typeName: 'table',\n },\n {\n id: 'code',\n dom: createDropdownItem(ctx.get(themeManagerCtx), 'Code Fence', 'code'),\n command: () => ctx.get(commandsCtx).call('TurnIntoCodeFence'),\n keyword: ['code'],\n typeName: 'fence',\n },\n {\n id: 'divider',\n dom: createDropdownItem(ctx.get(themeManagerCtx), 'Divide Line', 'divider'),\n command: () => ctx.get(commandsCtx).call('InsertHr'),\n keyword: ['divider', 'hr'],\n typeName: 'hr',\n },\n ]\n\n const userInput = input.slice(1).toLocaleLowerCase()\n\n return actions\n .filter(action => !!nodes[action.typeName] && action.keyword.some(keyword => keyword.includes(userInput)))\n .map(({ keyword, typeName, ...action }) => action)\n}\n\nexport const defaultConfig: Config = (ctx) => {\n return ({ content, isTopLevel }) => {\n if (!isTopLevel)\n return null\n\n const view = ctx.get(editorViewCtx)\n if (!view?.editable)\n return null\n\n if (!content)\n return { placeholder: 'Type / to use the slash commands...' }\n\n if (content.startsWith('/')) {\n return content === '/'\n ? {\n placeholder: 'Type to filter...',\n actions: defaultActions(ctx),\n }\n : {\n actions: defaultActions(ctx, content),\n }\n }\n\n return null\n }\n}\n","/* Copyright 2021, Milkdown by Mirone. */\nimport type { Color, Emotion, ThemeManager } from '@milkdown/core'\nimport { ThemeColor, ThemeFont } from '@milkdown/core'\nimport { findParentNode } from '@milkdown/prose'\nimport type { EditorState } from '@milkdown/prose/state'\nimport type { EditorView } from '@milkdown/prose/view'\nimport { Decoration, DecorationSet } from '@milkdown/prose/view'\nimport type { ThemeUtils } from '@milkdown/utils'\n\nimport type { Status } from './status'\n\nexport type Props = ReturnType<typeof createProps>\n\nconst createEmptyStyle = (themeManager: ThemeManager, { css }: Emotion) => {\n const palette = (color: Color, opacity = 1) => themeManager.get(ThemeColor, [color, opacity])\n const typography = themeManager.get(ThemeFont, 'typography')\n\n return css`\n position: relative;\n &::before {\n position: absolute;\n cursor: text;\n font-family: ${typography};\n font-size: 14px;\n color: ${palette('neutral', 0.6)};\n content: attr(data-text);\n height: 100%;\n display: flex;\n align-items: center;\n }\n `\n}\n\nconst createSlashStyle = (_: ThemeManager, { css }: Emotion) => css`\n &::before {\n left: 8px;\n }\n`\n\nexport const createProps = (status: Status, utils: ThemeUtils) => {\n return {\n handleKeyDown: (_: EditorView, event: Event) => {\n if (status.isEmpty())\n return false\n\n if (!(event instanceof KeyboardEvent))\n return false\n\n if (!['ArrowUp', 'ArrowDown', 'Enter'].includes(event.key))\n return false\n\n return true\n },\n decorations: (state: EditorState) => {\n const paragraph = findParentNode(({ type }) => type.name === 'paragraph')(state.selection)\n const uploadPlugin = state.plugins.find(\n x => (x as unknown as { key: string }).key === 'MILKDOWN_UPLOAD$',\n )\n const decorations: DecorationSet = uploadPlugin?.getState(state)\n if (decorations != null && decorations.find(state.selection.from, state.selection.to).length > 0) {\n status.clear()\n return null\n }\n\n if (\n !paragraph\n || paragraph.node.childCount > 1\n || state.selection.$from.parentOffset !== paragraph.node.textContent.length\n || (paragraph.node.firstChild && paragraph.node.firstChild.type.name !== 'text')\n ) {\n status.clear()\n return null\n }\n\n const { placeholder, actions } = status.update({\n parentNode: state.selection.$from.node(state.selection.$from.depth - 1),\n isTopLevel: state.selection.$from.depth === 1,\n content: paragraph.node.textContent,\n state,\n })\n\n if (!placeholder)\n return null\n\n const createDecoration = (text: string, className: (string | undefined)[]) => {\n const pos = paragraph.pos\n return DecorationSet.create(state.doc, [\n Decoration.node(pos, pos + paragraph.node.nodeSize, {\n 'class': className.filter(x => x).join(' '),\n 'data-text': text,\n }),\n ])\n }\n\n const emptyStyle = utils.getStyle(emotion => createEmptyStyle(utils.themeManager, emotion))\n const slashStyle = utils.getStyle(emotion => createSlashStyle(utils.themeManager, emotion))\n\n if (actions.length)\n return createDecoration(placeholder, [emptyStyle, slashStyle, 'empty-node', 'is-slash'])\n\n return createDecoration(placeholder, [emptyStyle, 'empty-node'])\n },\n }\n}\n","/* Copyright 2021, Milkdown by Mirone. */\nimport type { Command } from '@milkdown/prose/state'\n\nimport { cleanUpAndCreateNode } from './utility'\n\nexport interface Action {\n id: string\n $: HTMLElement\n command: Command\n}\n\nexport type WrappedAction = Pick<Action, 'id'> & {\n command: () => void\n dom: HTMLElement\n}\n\nexport const transformAction = (action: WrappedAction): Action => ({\n id: action.id,\n $: action.dom,\n command: cleanUpAndCreateNode(action.command),\n})\n","/* Copyright 2021, Milkdown by Mirone. */\nimport type { StatusConfigBuilder, StatusConfigBuilderParams } from '..'\nimport type { Action } from '../item'\nimport { transformAction } from '../item'\n\nexport interface StatusCtx {\n placeholder: string | null\n actions: Action[]\n}\n\nconst createStatusCtx = (): StatusCtx => {\n return {\n placeholder: null,\n actions: [],\n }\n}\n\nexport type Status = ReturnType<typeof createStatus>\n\nexport const createStatus = (builder: StatusConfigBuilder) => {\n const statusCtx = createStatusCtx()\n\n return {\n get: () => statusCtx,\n clear: () => {\n statusCtx.placeholder = null\n statusCtx.actions = []\n },\n update: (builderParams: StatusConfigBuilderParams) => {\n const config = builder(builderParams)\n statusCtx.placeholder = config?.placeholder ?? null\n statusCtx.actions = (config?.actions ?? []).map(transformAction)\n return statusCtx\n },\n isEmpty: () => statusCtx.actions.length === 0,\n }\n}\n","/* Copyright 2021, Milkdown by Mirone. */\nimport scrollIntoView from 'smooth-scroll-into-view-if-needed'\n\nimport type { Status } from './status'\n\ninterface Listeners {\n mouseEnter: EventListener\n mouseLeave: EventListener\n}\n\nexport const renderDropdown = (status: Status, dropdownElement: HTMLElement, listeners: Listeners): boolean => {\n const { actions } = status.get()\n\n if (!actions.length) {\n dropdownElement.classList.add('hide')\n return false\n }\n\n dropdownElement.childNodes.forEach((child) => {\n child.removeEventListener('mouseenter', listeners.mouseEnter)\n child.removeEventListener('mouseleave', listeners.mouseLeave)\n })\n\n while (dropdownElement.firstChild)\n dropdownElement.firstChild.remove()\n\n actions.forEach(({ $ }) => {\n $.classList.remove('active')\n $.addEventListener('mouseenter', listeners.mouseEnter)\n $.addEventListener('mouseleave', listeners.mouseLeave)\n dropdownElement.appendChild($)\n })\n\n dropdownElement.style.maxHeight = ''\n dropdownElement.classList.remove('hide')\n\n const first$ = actions[0]\n if (first$) {\n first$.$.classList.add('active')\n requestAnimationFrame(() => {\n scrollIntoView(first$.$, {\n scrollMode: 'if-needed',\n block: 'nearest',\n inline: 'nearest',\n })\n })\n }\n\n return true\n}\n","/* Copyright 2021, Milkdown by Mirone. */\n\nimport type { EditorView } from '@milkdown/prose/view'\nimport scrollIntoView from 'smooth-scroll-into-view-if-needed'\n\nimport type { Status } from './status'\n\nexport const createMouseManager = () => {\n let mouseLock = false\n\n return {\n isLock: () => mouseLock,\n lock: () => {\n mouseLock = true\n },\n unlock: () => {\n mouseLock = false\n },\n }\n}\nexport type MouseManager = ReturnType<typeof createMouseManager>\n\nexport const handleMouseMove = (mouseManager: MouseManager) => () => {\n mouseManager.unlock()\n}\n\nexport const handleMouseEnter = (status: Status, mouseManager: MouseManager) => (e: MouseEvent) => {\n if (mouseManager.isLock())\n return\n const { actions } = status.get()\n const active = actions.findIndex(x => x.$.classList.contains('active'))\n const active$ = actions[active]\n if (active$ && active >= 0)\n active$.$.classList.remove('active')\n\n const { target } = e\n if (!(target instanceof HTMLElement))\n return\n target.classList.add('active')\n}\n\nexport const handleMouseLeave = () => (e: MouseEvent) => {\n const { target } = e\n if (!(target instanceof HTMLElement))\n return\n target.classList.remove('active')\n}\n\nexport const handleClick\n = (status: Status, view: EditorView, dropdownElement: HTMLElement) =>\n (e: Event): void => {\n const { target } = e\n if (!(target instanceof HTMLElement))\n return\n if (!view)\n return\n\n const stop = () => {\n e.stopPropagation()\n e.preventDefault()\n }\n\n const { actions } = status.get()\n\n const el = Object.values(actions).find(({ $ }) => $.contains(target))\n if (!el) {\n if (status.isEmpty())\n return\n\n status.clear()\n dropdownElement.classList.add('hide')\n stop()\n\n return\n }\n\n stop()\n el.command(view.state, view.dispatch, view)\n }\n\nexport const handleKeydown\n = (status: Status, view: EditorView, dropdownElement: HTMLElement, mouseManager: MouseManager) => (e: Event) => {\n if (!(e instanceof KeyboardEvent))\n return\n if (!mouseManager.isLock())\n mouseManager.lock()\n\n const { key } = e\n if (status.isEmpty())\n return\n if (!['ArrowDown', 'ArrowUp', 'Enter', 'Escape'].includes(key))\n return\n\n const { actions } = status.get()\n\n let active = actions.findIndex(({ $ }) => $.classList.contains('active'))\n if (active < 0)\n active = 0\n\n const moveActive = (next: number) => {\n const active$ = actions[active]\n const next$ = actions[next]\n if (!active$ || !next$)\n return\n active$.$.classList.remove('active')\n next$.$.classList.add('active')\n scrollIntoView(next$.$, {\n scrollMode: 'if-needed',\n block: 'nearest',\n inline: 'nearest',\n })\n }\n\n if (key === 'ArrowDown') {\n const next = active === actions.length - 1 ? 0 : active + 1\n\n moveActive(next)\n return\n }\n\n if (key === 'ArrowUp') {\n const next = active === 0 ? actions.length - 1 : active - 1\n\n moveActive(next)\n return\n }\n\n if (key === 'Escape') {\n if (status.isEmpty())\n return\n\n status.clear()\n dropdownElement.classList.add('hide')\n return\n }\n\n const active$ = actions[active]\n if (!active$)\n return\n active$.command(view.state, view.dispatch, view)\n active$.$.classList.remove('active')\n }\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { missingRootElement } from '@milkdown/exception'\nimport { calculateNodePosition } from '@milkdown/prose'\nimport type { EditorView } from '@milkdown/prose/view'\nimport type { ThemeUtils } from '@milkdown/utils'\n\nimport { createDropdown } from '../utility'\nimport { renderDropdown } from './dropdown'\nimport {\n createMouseManager,\n handleClick,\n handleKeydown,\n handleMouseEnter,\n handleMouseLeave,\n handleMouseMove,\n} from './input'\nimport type { Status } from './status'\n\nexport const defaultCalcPosition = (view: EditorView, dropdownElement: HTMLElement) => {\n calculateNodePosition(view, dropdownElement, (selected, target, parent) => {\n const $editor = dropdownElement.parentElement\n if (!$editor)\n throw missingRootElement()\n\n let left = selected.left - parent.left\n\n if (left < 0)\n left = 0\n\n let direction: 'top' | 'bottom'\n let maxHeight: number | undefined\n const selectedToTop = selected.top - parent.top\n const selectedToBottom = parent.height + parent.top - selected.bottom\n if (selectedToBottom >= target.height + 28) {\n direction = 'bottom'\n }\n else if (selectedToTop >= target.height + 28) {\n direction = 'top'\n }\n else if (selectedToBottom >= selectedToTop) {\n direction = 'bottom'\n maxHeight = selectedToBottom - 28\n }\n else {\n direction = 'top'\n maxHeight = selectedToTop - 28\n }\n if (selectedToTop < 0 || selectedToBottom < 0) {\n maxHeight = parent.height - selected.height - 28\n if (maxHeight > target.height)\n maxHeight = undefined\n }\n\n const top\n = direction === 'top'\n ? selected.top - parent.top - (maxHeight ?? target.height) - 14 + $editor.scrollTop\n : selected.bottom - parent.top + 14 + $editor.scrollTop\n\n dropdownElement.style.maxHeight = maxHeight !== undefined && maxHeight > 0 ? `${maxHeight}px` : ''\n\n return [top, left]\n })\n}\n\nexport type CalcPosition = (view: EditorView, dropdownElement: HTMLElement) => void\n\nexport const createView = (\n status: Status,\n view: EditorView,\n utils: ThemeUtils,\n className: string,\n calcPosition: CalcPosition,\n) => {\n const wrapper = view.dom.parentNode\n if (!wrapper)\n return {}\n\n const dropdownElement = createDropdown(utils, className)\n const mouseManager = createMouseManager()\n wrapper.appendChild(dropdownElement)\n\n const _mouseMove = handleMouseMove(mouseManager)\n const _mouseDown = handleClick(status, view, dropdownElement)\n const _keydown = handleKeydown(status, view, dropdownElement, mouseManager)\n const _mouseEnter = handleMouseEnter(status, mouseManager)\n const _mouseLeave = handleMouseLeave()\n\n wrapper.addEventListener('mousemove', _mouseMove)\n wrapper.addEventListener('mousedown', _mouseDown)\n wrapper.addEventListener('keydown', _keydown)\n\n return {\n update: (view: EditorView) => {\n const show = renderDropdown(status, dropdownElement, {\n mouseEnter: _mouseEnter as EventListener,\n mouseLeave: _mouseLeave as EventListener,\n })\n\n if (!show)\n return\n\n calcPosition(view, dropdownElement)\n },\n\n destroy: () => {\n wrapper.removeEventListener('mousemove', _mouseMove)\n wrapper.removeEventListener('mousedown', _mouseDown)\n wrapper.removeEventListener('keydown', _keydown)\n dropdownElement.remove()\n },\n }\n}\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { Plugin, PluginKey } from '@milkdown/prose/state'\nimport type { ThemeUtils } from '@milkdown/utils'\n\nimport type { StatusConfigBuilder } from '..'\nimport { createProps } from './props'\nimport { createStatus } from './status'\nimport type { CalcPosition } from './view'\nimport { createView } from './view'\n\nexport const key = 'MILKDOWN_SLASH'\n\nexport const createSlashPlugin = (\n utils: ThemeUtils,\n builder: StatusConfigBuilder,\n className: string,\n calcPosition: CalcPosition,\n) => {\n const status = createStatus(builder)\n\n return new Plugin({\n key: new PluginKey(key),\n props: createProps(status, utils),\n view: view => createView(status, view, utils, className, calcPosition),\n })\n}\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { AtomList, createPlugin } from '@milkdown/utils'\n\nimport type { Config } from './config'\nimport { defaultConfig } from './config'\nimport { createSlashPlugin } from './prose-plugin'\nimport type { CalcPosition } from './prose-plugin/view'\nimport { defaultCalcPosition } from './prose-plugin/view'\n\nexport type { Config, StatusConfig, StatusConfigBuilder, StatusConfigBuilderParams } from './config'\nexport { defaultActions, defaultConfig } from './config'\nexport type { Action, WrappedAction } from './item'\nexport { createDropdownItem } from './utility'\n\nexport interface Options {\n config: Config\n calcPosition: CalcPosition\n}\n\nexport const slashPlugin = createPlugin<string, Options>((utils, options) => {\n const slashConfig = options?.config ?? defaultConfig\n const calcPosition = options?.calcPosition ?? defaultCalcPosition\n\n return {\n prosePlugins: (_, ctx) => {\n const config = slashConfig(ctx)\n\n const plugin = createSlashPlugin(utils, config, 'slash-dropdown', calcPosition)\n\n return [plugin]\n },\n }\n})\n\nexport const slash = AtomList.create([slashPlugin()])\n"],"names":["itemStyle","themeManager","css","palette","color","opacity","ThemeColor","ThemeFont","injectStyle","emotion","ThemeSize","ThemeBorder","ThemeShadow","ThemeScrollbar","createDropdown","utils","className","div","style","createDropdownItem","text","icon","options","textClassName","_a","iconSpan","ThemeIcon","missingIcon","textSpan","cleanUp","state","dispatch","selection","$from","tr","cleanUpAndCreateNode","createCommand","view","defaultActions","ctx","input","nodes","schemaCtx","actions","themeManagerCtx","commandsCtx","userInput","action","keyword","typeName","defaultConfig","content","isTopLevel","editorViewCtx","createEmptyStyle","typography","createSlashStyle","_","createProps","status","event","paragraph","findParentNode","type","uploadPlugin","x","decorations","placeholder","createDecoration","pos","DecorationSet","Decoration","emptyStyle","slashStyle","transformAction","createStatusCtx","createStatus","builder","statusCtx","builderParams","config","_b","renderDropdown","dropdownElement","listeners","child","$","first$","scrollIntoView","createMouseManager","mouseLock","handleMouseMove","mouseManager","handleMouseEnter","e","active","active$","target","handleMouseLeave","handleClick","stop","el","handleKeydown","key","moveActive","next","next$","defaultCalcPosition","calculateNodePosition","selected","parent","$editor","missingRootElement","left","direction","maxHeight","selectedToTop","selectedToBottom","top","createView","calcPosition","wrapper","_mouseMove","_mouseDown","_keydown","_mouseEnter","_mouseLeave","createSlashPlugin","Plugin","PluginKey","slashPlugin","createPlugin","slashConfig","slash","AtomList"],"mappings":";;;;;;;AAeA,MAAMA,IAAY,CAACC,GAA4B,EAAE,KAAAC,QAAmB;AAC5D,QAAAC,IAAU,CAACC,GAAcC,IAAU,MAAMJ,EAAa,IAAIK,GAAY,CAACF,GAAOC,CAAO,CAAC;AACrF,SAAAH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2BAUkBD,EAAa,IAAIM,GAAW,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAO1CJ,EAAQ,WAAW,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8BASlBA,EAAQ,aAAa,IAAI;AAAA;AAAA;AAAA,6BAG1BA,EAAQ,SAAS;AAAA;AAAA;AAAA;AAAA;AAK9C,GAEaK,IAAc,CAACP,GAA4BQ,MAAqB;AACrE,QAAAN,IAAU,CAACC,GAAcC,IAAU,MAAMJ,EAAa,IAAIK,GAAY,CAACF,GAAOC,CAAO,CAAC;AAE5F,SAAOI,EAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,yBAKQR,EAAa,IAAIS,GAAW,QAAQ;AAAA;AAAA,sBAEvCP,EAAQ,SAAS;AAAA;AAAA,UAE7BF,EAAa,IAAIU,GAAa,MAAS;AAAA,UACvCV,EAAa,IAAIW,GAAa,MAAS;AAAA,UACvCX,EAAa,IAAIY,GAAgB,MAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAM1Cb,EAAUC,GAAcQ,CAAO;AAAA;AAEzC,GChEaK,IAAiB,CAACC,GAAmBC,MAAsB;AAChE,QAAAC,IAAM,SAAS,cAAc,KAAK;AACpC,SAAAA,EAAA,aAAa,QAAQ,SAAS,GAC9BA,EAAA,aAAa,YAAY,IAAI,GAC3BF,EAAA,aAAa,QAAQ,MAAM;AACzB,UAAAG,IAAQH,EAAM,SAAS,CAAAN,MAAWD,EAAYO,EAAM,cAAcN,CAAO,CAAC;AAE5E,IAAAS,KACED,EAAA,UAAU,IAAIC,CAAK;AAAA,EAAA,CAC1B,GAEGD,EAAA,UAAU,IAAIF,EAAM,aAAa,IAAIC,CAAS,GAAG,MAAM,GAEpDC;AACT,GAKaE,IAAqB,CAChClB,GACAmB,GACAC,GACAC,MACG;;AACG,QAAAC,KAAgBC,IAAAF,KAAA,gBAAAA,EAAS,kBAAT,OAAAE,IAA0B,QAE1CP,IAAM,SAAS,cAAc,KAAK;AACpC,EAAAA,EAAA,aAAa,QAAQ,QAAQ,GAC7BA,EAAA,UAAU,IAAI,qBAAqB;AAEvC,QAAMQ,IAAWxB,EAAa,IAAIyB,GAAWL,CAAI;AAEjD,MAAI,CAACI;AACH,UAAME,EAAYN,CAAI;AAElB,QAAAO,IAAW,SAAS,cAAc,MAAM;AAC9C,SAAAA,EAAS,cAAcR,GACvBQ,EAAS,YAAYL,GAEjBN,EAAA,YAAYQ,EAAS,GAAG,GAC5BR,EAAI,YAAYW,CAAQ,GAEjBX;AACT,GAaMY,IAAmB,CAACC,GAAOC,MAAa;AACtC,QAAA,EAAE,WAAAC,EAAc,IAAAF,GAChB,EAAE,OAAAG,EAAU,IAAAD,GACZE,IAAKJ,EAAM,GAAG,YAAYG,EAAM,MAAM,GAAGA,EAAM,GAAG;AACxD,SAAAF,KAAA,QAAAA,EAAWG,IACJ;AACT,GAEaC,IACP,CAACC,MACD,CAACN,GAAOC,GAAUM,OACZA,MACMR,EAAAC,GAAOC,CAAc,GACfK,MAET,KCxDFE,IAAiB,CAACC,GAAUC,IAAQ,QAAyB;AACxE,QAAM,EAAE,OAAAC,EAAU,IAAAF,EAAI,IAAIG,CAAS,GAC7BC,IAA0E;AAAA,IAC9E;AAAA,MACE,IAAI;AAAA,MACJ,KAAKxB,EAAmBoB,EAAI,IAAIK,CAAe,GAAG,iBAAiB,IAAI;AAAA,MACvE,SAAS,MAAML,EAAI,IAAIM,CAAW,EAAE,KAAK,mBAAmB,CAAC;AAAA,MAC7D,SAAS,CAAC,MAAM,eAAe;AAAA,MAC/B,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,KAAK1B,EAAmBoB,EAAI,IAAIK,CAAe,GAAG,kBAAkB,IAAI;AAAA,MACxE,SAAS,MAAML,EAAI,IAAIM,CAAW,EAAE,KAAK,mBAAmB,CAAC;AAAA,MAC7D,SAAS,CAAC,MAAM,gBAAgB;AAAA,MAChC,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,KAAK1B,EAAmBoB,EAAI,IAAIK,CAAe,GAAG,iBAAiB,IAAI;AAAA,MACvE,SAAS,MAAML,EAAI,IAAIM,CAAW,EAAE,KAAK,mBAAmB,CAAC;AAAA,MAC7D,SAAS,CAAC,MAAM,eAAe;AAAA,MAC/B,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,KAAK1B,EAAmBoB,EAAI,IAAIK,CAAe,GAAG,eAAe,YAAY;AAAA,MAC7E,SAAS,MAAML,EAAI,IAAIM,CAAW,EAAE,KAAK,kBAAkB;AAAA,MAC3D,SAAS,CAAC,eAAe,IAAI;AAAA,MAC7B,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,KAAK1B,EAAmBoB,EAAI,IAAIK,CAAe,GAAG,gBAAgB,aAAa;AAAA,MAC/E,SAAS,MAAML,EAAI,IAAIM,CAAW,EAAE,KAAK,mBAAmB;AAAA,MAC5D,SAAS,CAAC,gBAAgB,IAAI;AAAA,MAC9B,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,KAAK1B,EAAmBoB,EAAI,IAAIK,CAAe,GAAG,aAAa,UAAU;AAAA,MACzE,SAAS,MAAML,EAAI,IAAIM,CAAW,EAAE,KAAK,kBAAkB;AAAA,MAC3D,SAAS,CAAC,aAAa,MAAM;AAAA,MAC7B,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,KAAK1B,EAAmBoB,EAAI,IAAIK,CAAe,GAAG,SAAS,OAAO;AAAA,MAClE,SAAS,MAAML,EAAI,IAAIM,CAAW,EAAE,KAAK,aAAa;AAAA,MACtD,SAAS,CAAC,OAAO;AAAA,MACjB,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,KAAK1B,EAAmBoB,EAAI,IAAIK,CAAe,GAAG,SAAS,OAAO;AAAA,MAClE,SAAS,MAAML,EAAI,IAAIM,CAAW,EAAE,KAAK,kBAAkB;AAAA,MAC3D,SAAS,CAAC,SAAS,YAAY;AAAA,MAC/B,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,KAAK1B,EAAmBoB,EAAI,IAAIK,CAAe,GAAG,SAAS,OAAO;AAAA,MAClE,SAAS,MAAML,EAAI,IAAIM,CAAW,EAAE,KAAK,aAAa;AAAA,MACtD,SAAS,CAAC,OAAO;AAAA,MACjB,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,KAAK1B,EAAmBoB,EAAI,IAAIK,CAAe,GAAG,cAAc,MAAM;AAAA,MACtE,SAAS,MAAML,EAAI,IAAIM,CAAW,EAAE,KAAK,mBAAmB;AAAA,MAC5D,SAAS,CAAC,MAAM;AAAA,MAChB,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,KAAK1B,EAAmBoB,EAAI,IAAIK,CAAe,GAAG,eAAe,SAAS;AAAA,MAC1E,SAAS,MAAML,EAAI,IAAIM,CAAW,EAAE,KAAK,UAAU;AAAA,MACnD,SAAS,CAAC,WAAW,IAAI;AAAA,MACzB,UAAU;AAAA,IACZ;AAAA,EAAA,GAGIC,IAAYN,EAAM,MAAM,CAAC,EAAE,kBAAkB;AAE5C,SAAAG,EACJ,OAAO,CAAAI,MAAU,CAAC,CAACN,EAAMM,EAAO,aAAaA,EAAO,QAAQ,KAAK,CAAAC,MAAWA,EAAQ,SAASF,CAAS,CAAC,CAAC,EACxG,IAAI,CAAC,EAAE,SAAAE,GAAS,UAAAC,MAAaF,EAAO,MAAMA,CAAM;AACrD,GAEaG,IAAwB,CAACX,MAC7B,CAAC,EAAE,SAAAY,GAAS,YAAAC,QAAiB;AAClC,MAAI,CAACA;AACI,WAAA;AAEH,QAAAf,IAAOE,EAAI,IAAIc,CAAa;AAClC,SAAKhB,KAAA,QAAAA,EAAM,WAGNc,IAGDA,EAAQ,WAAW,GAAG,IACjBA,MAAY,MACf;AAAA,IACE,aAAa;AAAA,IACb,SAASb,EAAeC,CAAG;AAAA,EAAA,IAE7B;AAAA,IACE,SAASD,EAAeC,GAAKY,CAAO;AAAA,EAAA,IAIrC,OAbE,EAAE,aAAa,0CAHf;AAgBF,GC9HLG,IAAmB,CAACrD,GAA4B,EAAE,KAAAC,QAAmB;AACnE,QAAAC,IAAU,CAACC,GAAcC,IAAU,MAAMJ,EAAa,IAAIK,GAAY,CAACF,GAAOC,CAAO,CAAC,GACtFkD,IAAatD,EAAa,IAAIM,GAAW,YAAY;AAEpD,SAAAL;AAAA;AAAA;AAAA;AAAA;AAAA,2BAKkBqD;AAAA;AAAA,qBAENpD,EAAQ,WAAW,GAAG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAO3C,GAEMqD,IAAmB,CAACC,GAAiB,EAAE,KAAAvD,QAAmBA;AAAA;AAAA;AAAA;AAAA,GAMnDwD,IAAc,CAACC,GAAgB5C,OACnC;AAAA,EACL,eAAe,CAAC0C,GAAeG,MACzB,EAAAD,EAAO,QAAQ,KAGf,EAAEC,aAAiB,kBAGnB,CAAC,CAAC,WAAW,aAAa,OAAO,EAAE,SAASA,EAAM,GAAG;AAAA,EAK3D,aAAa,CAAC9B,MAAuB;AAC7B,UAAA+B,IAAYC,EAAe,CAAC,EAAE,MAAAC,EAAW,MAAAA,EAAK,SAAS,WAAW,EAAEjC,EAAM,SAAS,GACnFkC,IAAelC,EAAM,QAAQ;AAAA,MACjC,CAAAmC,MAAMA,EAAiC,QAAQ;AAAA,IAAA,GAE3CC,IAA6BF,KAAA,gBAAAA,EAAc,SAASlC;AAOxD,QANEoC,KAAe,QAAQA,EAAY,KAAKpC,EAAM,UAAU,MAAMA,EAAM,UAAU,EAAE,EAAE,SAAS,KAM7F,CAAC+B,KACUA,EAAU,KAAK,aAAa,KAC5B/B,EAAM,UAAU,MAAM,iBAAiB+B,EAAU,KAAK,YAAY,UACjEA,EAAU,KAAK,cAAcA,EAAU,KAAK,WAAW,KAAK,SAAS;AAEjF,aAAAF,EAAO,MAAM,GACN;AAGT,UAAM,EAAE,aAAAQ,GAAa,SAAAxB,MAAYgB,EAAO,OAAO;AAAA,MAC7C,YAAY7B,EAAM,UAAU,MAAM,KAAKA,EAAM,UAAU,MAAM,QAAQ,CAAC;AAAA,MACtE,YAAYA,EAAM,UAAU,MAAM,UAAU;AAAA,MAC5C,SAAS+B,EAAU,KAAK;AAAA,MACxB,OAAA/B;AAAA,IAAA,CACD;AAED,QAAI,CAACqC;AACI,aAAA;AAEH,UAAAC,IAAmB,CAAChD,GAAcJ,MAAsC;AAC5E,YAAMqD,IAAMR,EAAU;AACf,aAAAS,EAAc,OAAOxC,EAAM,KAAK;AAAA,QACrCyC,EAAW,KAAKF,GAAKA,IAAMR,EAAU,KAAK,UAAU;AAAA,UAClD,OAAS7C,EAAU,OAAO,OAAKiD,CAAC,EAAE,KAAK,GAAG;AAAA,UAC1C,aAAa7C;AAAA,QAAA,CACd;AAAA,MAAA,CACF;AAAA,IAAA,GAGGoD,IAAazD,EAAM,SAAS,CAAAN,MAAW6C,EAAiBvC,EAAM,cAAcN,CAAO,CAAC,GACpFgE,IAAa1D,EAAM,SAAS,CAAAN,MAAW+C,EAAiBzC,EAAM,cAAcN,CAAO,CAAC;AAE1F,WAAIkC,EAAQ,SACHyB,EAAiBD,GAAa,CAACK,GAAYC,GAAY,cAAc,UAAU,CAAC,IAElFL,EAAiBD,GAAa,CAACK,GAAY,YAAY,CAAC;AAAA,EACjE;AAAA,ICrFSE,IAAkB,CAAC3B,OAAmC;AAAA,EACjE,IAAIA,EAAO;AAAA,EACX,GAAGA,EAAO;AAAA,EACV,SAASZ,EAAqBY,EAAO,OAAO;AAC9C,ICVM4B,IAAkB,OACf;AAAA,EACL,aAAa;AAAA,EACb,SAAS,CAAC;AAAA,IAMDC,IAAe,CAACC,MAAiC;AAC5D,QAAMC,IAAYH;AAEX,SAAA;AAAA,IACL,KAAK,MAAMG;AAAA,IACX,OAAO,MAAM;AACX,MAAAA,EAAU,cAAc,MACxBA,EAAU,UAAU;IACtB;AAAA,IACA,QAAQ,CAACC,MAA6C;;AAC9C,YAAAC,IAASH,EAAQE,CAAa;AAC1B,aAAAD,EAAA,eAActD,IAAAwD,KAAA,gBAAAA,EAAQ,gBAAR,OAAAxD,IAAuB,MAC/CsD,EAAU,YAAWG,IAAAD,KAAA,gBAAAA,EAAQ,YAAR,OAAAC,IAAmB,IAAI,IAAIP,CAAe,GACxDI;AAAA,IACT;AAAA,IACA,SAAS,MAAMA,EAAU,QAAQ,WAAW;AAAA,EAAA;AAEhD,GC1BaI,IAAiB,CAACvB,GAAgBwB,GAA8BC,MAAkC;AAC7G,QAAM,EAAE,SAAAzC,EAAA,IAAYgB,EAAO,IAAI;AAE3B,MAAA,CAAChB,EAAQ;AACK,WAAAwC,EAAA,UAAU,IAAI,MAAM,GAC7B;AAQT,OALgBA,EAAA,WAAW,QAAQ,CAACE,MAAU;AACtC,IAAAA,EAAA,oBAAoB,cAAcD,EAAU,UAAU,GACtDC,EAAA,oBAAoB,cAAcD,EAAU,UAAU;AAAA,EAAA,CAC7D,GAEMD,EAAgB;AACrB,IAAAA,EAAgB,WAAW;AAE7B,EAAAxC,EAAQ,QAAQ,CAAC,EAAE,GAAA2C,QAAQ;AACvB,IAAAA,EAAA,UAAU,OAAO,QAAQ,GACzBA,EAAA,iBAAiB,cAAcF,EAAU,UAAU,GACnDE,EAAA,iBAAiB,cAAcF,EAAU,UAAU,GACrDD,EAAgB,YAAYG,CAAC;AAAA,EAAA,CAC9B,GAEDH,EAAgB,MAAM,YAAY,IAClBA,EAAA,UAAU,OAAO,MAAM;AAEvC,QAAMI,IAAS5C,EAAQ;AACvB,SAAI4C,MACKA,EAAA,EAAE,UAAU,IAAI,QAAQ,GAC/B,sBAAsB,MAAM;AAC1B,IAAAC,EAAeD,EAAO,GAAG;AAAA,MACvB,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,QAAQ;AAAA,IAAA,CACT;AAAA,EAAA,CACF,IAGI;AACT,GC1CaE,IAAqB,MAAM;AACtC,MAAIC,IAAY;AAET,SAAA;AAAA,IACL,QAAQ,MAAMA;AAAA,IACd,MAAM,MAAM;AACE,MAAAA,IAAA;AAAA,IACd;AAAA,IACA,QAAQ,MAAM;AACA,MAAAA,IAAA;AAAA,IACd;AAAA,EAAA;AAEJ,GAGaC,IAAkB,CAACC,MAA+B,MAAM;AACnE,EAAAA,EAAa,OAAO;AACtB,GAEaC,KAAmB,CAAClC,GAAgBiC,MAA+B,CAACE,MAAkB;AACjG,MAAIF,EAAa,OAAO;AACtB;AACF,QAAM,EAAE,SAAAjD,EAAA,IAAYgB,EAAO,IAAI,GACzBoC,IAASpD,EAAQ,UAAU,CAAAsB,MAAKA,EAAE,EAAE,UAAU,SAAS,QAAQ,CAAC,GAChE+B,IAAUrD,EAAQoD;AACxB,EAAIC,KAAWD,KAAU,KACfC,EAAA,EAAE,UAAU,OAAO,QAAQ;AAE/B,QAAA,EAAE,QAAAC,EAAW,IAAAH;AACnB,EAAMG,aAAkB,eAEjBA,EAAA,UAAU,IAAI,QAAQ;AAC/B,GAEaC,KAAmB,MAAM,CAAC,MAAkB;AACjD,QAAA,EAAE,QAAAD,EAAW,IAAA;AACnB,EAAMA,aAAkB,eAEjBA,EAAA,UAAU,OAAO,QAAQ;AAClC,GAEaE,KACP,CAACxC,GAAgBtB,GAAkB8C,MACnC,CAACW,MAAmB;AACZ,QAAA,EAAE,QAAAG,EAAW,IAAAH;AAGnB,MAFI,EAAEG,aAAkB,gBAEpB,CAAC5D;AACH;AAEF,QAAM+D,IAAO,MAAM;AACjB,IAAAN,EAAE,gBAAgB,GAClBA,EAAE,eAAe;AAAA,EAAA,GAGb,EAAE,SAAAnD,EAAA,IAAYgB,EAAO,IAAI,GAEzB0C,IAAK,OAAO,OAAO1D,CAAO,EAAE,KAAK,CAAC,EAAE,GAAA2C,EAAE,MAAMA,EAAE,SAASW,CAAM,CAAC;AACpE,MAAI,CAACI,GAAI;AACP,QAAI1C,EAAO,QAAQ;AACjB;AAEF,IAAAA,EAAO,MAAM,GACGwB,EAAA,UAAU,IAAI,MAAM,GAC/BiB;AAEL;AAAA,EACF;AAEK,EAAAA,KACLC,EAAG,QAAQhE,EAAK,OAAOA,EAAK,UAAUA,CAAI;AAC5C,GAEOiE,KACP,CAAC3C,GAAgBtB,GAAkB8C,GAA8BS,MAA+B,CAACE,MAAa;AAC9G,MAAI,EAAEA,aAAa;AACjB;AACE,EAACF,EAAa,OAAO,KACvBA,EAAa,KAAK;AAEd,QAAA,EAAE,KAAAW,EAAQ,IAAAT;AAGZ,MAFAnC,EAAO,QAAQ,KAEf,CAAC,CAAC,aAAa,WAAW,SAAS,QAAQ,EAAE,SAAS4C,CAAG;AAC3D;AAEF,QAAM,EAAE,SAAA5D,EAAA,IAAYgB,EAAO,IAAI;AAE3B,MAAAoC,IAASpD,EAAQ,UAAU,CAAC,EAAE,GAAA2C,QAAQA,EAAE,UAAU,SAAS,QAAQ,CAAC;AACxE,EAAIS,IAAS,MACFA,IAAA;AAEL,QAAAS,IAAa,CAACC,MAAiB;AACnC,UAAMT,IAAUrD,EAAQoD,IAClBW,IAAQ/D,EAAQ8D;AAClB,IAAA,CAACT,KAAW,CAACU,MAEjBV,EAAQ,EAAE,UAAU,OAAO,QAAQ,GAC7BU,EAAA,EAAE,UAAU,IAAI,QAAQ,GAC9BlB,EAAekB,EAAM,GAAG;AAAA,MACtB,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,QAAQ;AAAA,IAAA,CACT;AAAA,EAAA;AAGH,MAAIH,MAAQ,aAAa;AACvB,UAAME,IAAOV,MAAWpD,EAAQ,SAAS,IAAI,IAAIoD,IAAS;AAE1D,IAAAS,EAAWC,CAAI;AACf;AAAA,EACF;AAEA,MAAIF,MAAQ,WAAW;AACrB,UAAME,IAAOV,MAAW,IAAIpD,EAAQ,SAAS,IAAIoD,IAAS;AAE1D,IAAAS,EAAWC,CAAI;AACf;AAAA,EACF;AAEA,MAAIF,MAAQ,UAAU;AACpB,QAAI5C,EAAO,QAAQ;AACjB;AAEF,IAAAA,EAAO,MAAM,GACGwB,EAAA,UAAU,IAAI,MAAM;AACpC;AAAA,EACF;AAEA,QAAMa,IAAUrD,EAAQoD;AACxB,EAAI,CAACC,MAELA,EAAQ,QAAQ3D,EAAK,OAAOA,EAAK,UAAUA,CAAI,GACvC2D,EAAA,EAAE,UAAU,OAAO,QAAQ;AACrC,GC3HSW,KAAsB,CAACtE,GAAkB8C,MAAiC;AACrF,EAAAyB,EAAsBvE,GAAM8C,GAAiB,CAAC0B,GAAUZ,GAAQa,MAAW;AACzE,UAAMC,IAAU5B,EAAgB;AAChC,QAAI,CAAC4B;AACH,YAAMC,EAAmB;AAEvB,QAAAC,IAAOJ,EAAS,OAAOC,EAAO;AAElC,IAAIG,IAAO,MACFA,IAAA;AAEL,QAAAC,GACAC;AACE,UAAAC,IAAgBP,EAAS,MAAMC,EAAO,KACtCO,IAAmBP,EAAO,SAASA,EAAO,MAAMD,EAAS;AAC3D,IAAAQ,KAAoBpB,EAAO,SAAS,KAC1BiB,IAAA,WAELE,KAAiBnB,EAAO,SAAS,KAC5BiB,IAAA,QAELG,KAAoBD,KACfF,IAAA,UACZC,IAAYE,IAAmB,OAGnBH,IAAA,OACZC,IAAYC,IAAgB,MAE1BA,IAAgB,KAAKC,IAAmB,OAC9BF,IAAAL,EAAO,SAASD,EAAS,SAAS,IAC1CM,IAAYlB,EAAO,WACTkB,IAAA;AAGhB,UAAMG,IACIJ,MAAc,QACZL,EAAS,MAAMC,EAAO,OAAOK,KAAA,OAAAA,IAAalB,EAAO,UAAU,KAAKc,EAAQ,YACxEF,EAAS,SAASC,EAAO,MAAM,KAAKC,EAAQ;AAExD,WAAA5B,EAAgB,MAAM,YAAYgC,MAAc,UAAaA,IAAY,IAAI,GAAGA,QAAgB,IAEzF,CAACG,GAAKL,CAAI;AAAA,EAAA,CAClB;AACH,GAIaM,KAAa,CACxB5D,GACAtB,GACAtB,GACAC,GACAwG,MACG;AACG,QAAAC,IAAUpF,EAAK,IAAI;AACzB,MAAI,CAACoF;AACH,WAAO;AAEH,QAAAtC,IAAkBrE,EAAeC,GAAOC,CAAS,GACjD4E,IAAeH;AACrB,EAAAgC,EAAQ,YAAYtC,CAAe;AAE7B,QAAAuC,IAAa/B,EAAgBC,CAAY,GACzC+B,IAAaxB,GAAYxC,GAAQtB,GAAM8C,CAAe,GACtDyC,IAAWtB,GAAc3C,GAAQtB,GAAM8C,GAAiBS,CAAY,GACpEiC,IAAchC,GAAiBlC,GAAQiC,CAAY,GACnDkC,IAAc5B;AAEZ,SAAAuB,EAAA,iBAAiB,aAAaC,CAAU,GACxCD,EAAA,iBAAiB,aAAaE,CAAU,GACxCF,EAAA,iBAAiB,WAAWG,CAAQ,GAErC;AAAA,IACL,QAAQ,CAACvF,MAAqB;AAM5B,MAAI,CALS6C,EAAevB,GAAQwB,GAAiB;AAAA,QACnD,YAAY0C;AAAA,QACZ,YAAYC;AAAA,MAAA,CACb,KAKDN,EAAanF,GAAM8C,CAAe;AAAA,IACpC;AAAA,IAEA,SAAS,MAAM;AACL,MAAAsC,EAAA,oBAAoB,aAAaC,CAAU,GAC3CD,EAAA,oBAAoB,aAAaE,CAAU,GAC3CF,EAAA,oBAAoB,WAAWG,CAAQ,GAC/CzC,EAAgB,OAAO;AAAA,IACzB;AAAA,EAAA;AAEJ,GCrGaoB,KAAM,kBAENwB,KAAoB,CAC/BhH,GACA8D,GACA7D,GACAwG,MACG;AACG,QAAA7D,IAASiB,EAAaC,CAAO;AAEnC,SAAO,IAAImD,EAAO;AAAA,IAChB,KAAK,IAAIC,EAAU1B,EAAG;AAAA,IACtB,OAAO7C,EAAYC,GAAQ5C,CAAK;AAAA,IAChC,MAAM,CAAQsB,MAAAkF,GAAW5D,GAAQtB,GAAMtB,GAAOC,GAAWwG,CAAY;AAAA,EAAA,CACtE;AACH,GCNaU,KAAcC,EAA8B,CAACpH,GAAOO,MAAY;;AACrE,QAAA8G,KAAc5G,IAAAF,KAAA,gBAAAA,EAAS,WAAT,OAAAE,IAAmB0B,GACjCsE,KAAevC,IAAA3D,KAAA,gBAAAA,EAAS,iBAAT,OAAA2D,IAAyB0B;AAEvC,SAAA;AAAA,IACL,cAAc,CAAClD,GAAGlB,MAAQ;AAClB,YAAAyC,IAASoD,EAAY7F,CAAG;AAI9B,aAAO,CAFQwF,GAAkBhH,GAAOiE,GAAQ,kBAAkBwC,CAAY,CAEhE;AAAA,IAChB;AAAA,EAAA;AAEJ,CAAC,GAEYa,KAAQC,EAAS,OAAO,CAACJ,GAAA,CAAa,CAAC;"}
|
|
1
|
+
{"version":3,"file":"index.es.js","sources":["../src/slash-plugin.ts","../src/slash-provider.ts"],"sourcesContent":["/* Copyright 2021, Milkdown by Mirone. */\nimport type { SliceType } from '@milkdown/ctx'\nimport type { PluginSpec } from '@milkdown/prose/state'\nimport { Plugin, PluginKey } from '@milkdown/prose/state'\nimport type { $Ctx, $Prose } from '@milkdown/utils'\nimport { $ctx, $prose } from '@milkdown/utils'\n\nexport type SlashPluginSpecId<Id extends string> = `${Id}_SLASH_SPEC`\n\nexport type SlashPlugin<Id extends string, State = any> = [$Ctx<PluginSpec<State>, SlashPluginSpecId<Id>>, $Prose] & {\n key: SliceType<PluginSpec<State>, SlashPluginSpecId<Id>>\n pluginKey: $Prose['key']\n}\n\nexport const slashFactory = <Id extends string, State = any>(id: Id) => {\n const slashSpec = $ctx<PluginSpec<State>, SlashPluginSpecId<Id>>({}, `${id}_SLASH_SPEC`)\n const slashPlugin = $prose((ctx) => {\n const spec = ctx.get(slashSpec.key)\n return new Plugin({\n key: new PluginKey(`${id}_SLASH`),\n ...spec,\n })\n })\n const result = [slashSpec, slashPlugin] as SlashPlugin<Id>\n result.key = slashSpec.key\n result.pluginKey = slashPlugin.key\n\n return result\n}\n\nexport const slash = slashFactory('MILKDOWN')\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { findParentNode, posToDOMRect } from '@milkdown/prose'\nimport type { EditorState } from '@milkdown/prose/state'\nimport { TextSelection } from '@milkdown/prose/state'\nimport type { EditorView } from '@milkdown/prose/view'\nimport debounce from 'lodash.debounce'\nimport type { Instance, Props } from 'tippy.js'\nimport tippy from 'tippy.js'\n\nexport type SlashProviderOptions = {\n content: HTMLElement\n tippyOptions?: Partial<Props>\n debounce?: number\n shouldShow?: (view: EditorView, prevState?: EditorState) => boolean\n}\n\nexport class SlashProvider {\n #tippy: Instance | undefined\n\n #element: HTMLElement\n\n #tippyOptions: Partial<Props>\n\n #debounce: number\n\n #shouldShow: (view: EditorView, prevState?: EditorState) => boolean\n\n constructor(options: SlashProviderOptions) {\n this.#element = options.content\n this.#tippyOptions = options.tippyOptions ?? {}\n this.#debounce = options.debounce ?? 200\n this.#shouldShow = options.shouldShow ?? this.#_shouldShow\n }\n\n #onUpdate = (view: EditorView, prevState?: EditorState): void => {\n const { state, composing } = view\n const { selection, doc } = state\n const { ranges } = selection\n const from = Math.min(...ranges.map(range => range.$from.pos))\n const to = Math.max(...ranges.map(range => range.$to.pos))\n const isSame = prevState && prevState.doc.eq(doc) && prevState.selection.eq(selection)\n\n this.#tippy ??= tippy(view.dom, {\n trigger: 'manual',\n placement: 'bottom-start',\n interactive: true,\n ...this.#tippyOptions,\n content: this.#element,\n })\n\n if (composing || isSame)\n return\n\n if (!this.#shouldShow(view, prevState)) {\n this.hide()\n return\n }\n\n this.#tippy.setProps({\n getReferenceClientRect: () => posToDOMRect(view, from, to),\n })\n\n this.show()\n }\n\n update = (view: EditorView, prevState?: EditorState): void => {\n const updater = debounce(this.#onUpdate, this.#debounce)\n\n updater(view, prevState)\n }\n\n getContent = (view: EditorView): string | undefined => {\n const { selection } = view.state\n const { empty } = selection\n const isTextBlock = view.state.selection instanceof TextSelection\n\n const isSlashChildren = this.#element.contains(document.activeElement)\n\n const notHasFocus = !view.hasFocus() && !isSlashChildren\n\n const isReadonly = !view.editable\n\n const paragraph = findParentNode(({ type }) => type.name === 'paragraph')(view.state.selection)\n\n const isNotInParagraph = !paragraph\n\n if (notHasFocus || isReadonly || !empty || !isTextBlock || isNotInParagraph)\n return\n\n const currentTextBlockContent = paragraph.node.textContent\n\n return currentTextBlockContent\n }\n\n #_shouldShow(view: EditorView): boolean {\n const currentTextBlockContent = this.getContent(view)\n\n if (!currentTextBlockContent)\n return false\n\n return currentTextBlockContent.at(-1) === '/'\n }\n\n destroy = () => {\n this.#tippy?.destroy()\n }\n\n show = () => {\n this.#tippy?.show()\n }\n\n hide = () => {\n this.#tippy?.hide()\n }\n\n getInstance = () => {\n return this.#tippy\n }\n}\n"],"names":["slashFactory","id","slashSpec","$ctx","slashPlugin","$prose","ctx","spec","Plugin","PluginKey","result","slash","SlashProvider","options","__privateAdd","__shouldShow","_tippy","_element","_tippyOptions","_debounce","_shouldShow","_onUpdate","view","prevState","state","composing","selection","doc","ranges","from","range","to","isSame","__privateGet","__privateSet","tippy","posToDOMRect","__publicField","debounce","empty","isTextBlock","TextSelection","isSlashChildren","notHasFocus","isReadonly","paragraph","findParentNode","type","_a","__privateMethod","_shouldShow_fn","currentTextBlockContent"],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { SliceType } from '@milkdown/ctx';
|
|
2
|
+
import type { PluginSpec } from '@milkdown/prose/state';
|
|
3
|
+
import type { $Ctx, $Prose } from '@milkdown/utils';
|
|
4
|
+
export type SlashPluginSpecId<Id extends string> = `${Id}_SLASH_SPEC`;
|
|
5
|
+
export type SlashPlugin<Id extends string, State = any> = [$Ctx<PluginSpec<State>, SlashPluginSpecId<Id>>, $Prose] & {
|
|
6
|
+
key: SliceType<PluginSpec<State>, SlashPluginSpecId<Id>>;
|
|
7
|
+
pluginKey: $Prose['key'];
|
|
8
|
+
};
|
|
9
|
+
export declare const slashFactory: <Id extends string, State = any>(id: Id) => SlashPlugin<Id, any>;
|
|
10
|
+
export declare const slash: SlashPlugin<"MILKDOWN", any>;
|
|
11
|
+
//# sourceMappingURL=slash-plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slash-plugin.d.ts","sourceRoot":"","sources":["../src/slash-plugin.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAC9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAEvD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAGnD,MAAM,MAAM,iBAAiB,CAAC,EAAE,SAAS,MAAM,IAAI,GAAG,EAAE,aAAa,CAAA;AAErE,MAAM,MAAM,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,KAAK,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,iBAAiB,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG;IACnH,GAAG,EAAE,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAA;IACxD,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;CACzB,CAAA;AAED,eAAO,MAAM,YAAY,kEAcxB,CAAA;AAED,eAAO,MAAM,KAAK,8BAA2B,CAAA"}
|