@milkdown/plugin-slash 6.5.4 → 7.0.0-next.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/lib/index.d.ts +2 -13
  2. package/lib/index.d.ts.map +1 -1
  3. package/lib/index.es.js +79 -382
  4. package/lib/index.es.js.map +1 -1
  5. package/lib/slash-plugin.d.ts +10 -0
  6. package/lib/slash-plugin.d.ts.map +1 -0
  7. package/lib/slash-provider.d.ts +21 -0
  8. package/lib/slash-provider.d.ts.map +1 -0
  9. package/package.json +12 -8
  10. package/src/index.ts +2 -34
  11. package/src/slash-plugin.ts +32 -0
  12. package/src/slash-provider.ts +138 -0
  13. package/lib/config.d.ts +0 -21
  14. package/lib/config.d.ts.map +0 -1
  15. package/lib/item.d.ts +0 -12
  16. package/lib/item.d.ts.map +0 -1
  17. package/lib/prose-plugin/dropdown.d.ts +0 -8
  18. package/lib/prose-plugin/dropdown.d.ts.map +0 -1
  19. package/lib/prose-plugin/index.d.ts +0 -7
  20. package/lib/prose-plugin/index.d.ts.map +0 -1
  21. package/lib/prose-plugin/input.d.ts +0 -14
  22. package/lib/prose-plugin/input.d.ts.map +0 -1
  23. package/lib/prose-plugin/props.d.ts +0 -11
  24. package/lib/prose-plugin/props.d.ts.map +0 -1
  25. package/lib/prose-plugin/status.d.ts +0 -14
  26. package/lib/prose-plugin/status.d.ts.map +0 -1
  27. package/lib/prose-plugin/view.d.ts +0 -13
  28. package/lib/prose-plugin/view.d.ts.map +0 -1
  29. package/lib/style.d.ts +0 -3
  30. package/lib/style.d.ts.map +0 -1
  31. package/lib/utility.d.ts +0 -14
  32. package/lib/utility.d.ts.map +0 -1
  33. package/src/config.ts +0 -142
  34. package/src/item.ts +0 -21
  35. package/src/prose-plugin/dropdown.ts +0 -50
  36. package/src/prose-plugin/index.ts +0 -26
  37. package/src/prose-plugin/input.ts +0 -142
  38. package/src/prose-plugin/props.ts +0 -104
  39. package/src/prose-plugin/status.ts +0 -37
  40. package/src/prose-plugin/view.ts +0 -112
  41. package/src/style.ts +0 -76
  42. package/src/utility.ts +0 -85
package/lib/index.d.ts CHANGED
@@ -1,14 +1,3 @@
1
- import { AtomList } from '@milkdown/utils';
2
- import type { Config } from './config';
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
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAgB,MAAM,iBAAiB,CAAA;AAExD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAGtC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAGvD,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,MAAM,UAAU,CAAA;AACpG,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxD,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAA;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAA;AAE9C,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,EAAE,YAAY,CAAA;CAC3B;AAED,eAAO,MAAM,WAAW,oKAatB,CAAA;AAEF,eAAO,MAAM,KAAK,8IAAmC,CAAA"}
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,86 @@
1
- import { createPlugin as b, AtomList as $ } from "@milkdown/utils";
2
- import { ThemeSize as C, ThemeBorder as E, ThemeShadow as T, ThemeScrollbar as N, ThemeFont as k, ThemeColor as y, ThemeIcon as S, schemaCtx as I, themeManagerCtx as u, commandsCtx as p, editorViewCtx as x } from "@milkdown/core";
3
- import { missingIcon as A, missingRootElement as D } from "@milkdown/exception";
4
- import { Plugin as _, PluginKey as M } from "@milkdown/prose/state";
5
- import { findParentNode as P, calculateNodePosition as H } from "@milkdown/prose";
6
- import { DecorationSet as q, Decoration as K } from "@milkdown/prose/view";
7
- import w from "smooth-scroll-into-view-if-needed";
8
- const O = (e, { css: t }) => {
9
- const n = (o, s = 1) => e.get(y, [o, s]);
10
- return t`
11
- .slash-dropdown-item {
12
- display: flex;
13
- gap: 32px;
14
- height: 48px;
15
- padding: 0 16px;
16
- align-items: center;
17
- justify-content: flex-start;
18
- cursor: pointer;
19
- line-height: 48px;
20
- font-family: ${e.get(k, "typography")};
21
- font-size: 14px;
22
-
23
- transition: all 0.2s ease-in-out;
24
-
25
- &,
26
- .icon {
27
- color: ${n("neutral", 0.87)};
28
- transition: all 0.2s ease-in-out;
29
- }
30
-
31
- &.hide {
32
- display: none;
33
- }
34
-
35
- &.active {
36
- background: ${n("secondary", 0.12)};
37
- &,
38
- .icon {
39
- color: ${n("primary")};
40
- }
41
- }
42
- }
43
- `;
44
- }, U = (e, t) => {
45
- const n = (o, s = 1) => e.get(y, [o, s]);
46
- return t.css`
47
- width: 320px;
48
- min-height: 48px;
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 B = (n, t, e) => t in n ? b(n, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : n[t] = e;
3
+ var c = (n, t, e) => (B(n, typeof t != "symbol" ? t + "" : t, e), e), x = (n, t, e) => {
4
+ if (!t.has(n))
5
+ throw TypeError("Cannot " + e);
6
+ };
7
+ var s = (n, t, e) => (x(n, t, "read from private field"), e ? e.call(n) : t.get(n)), i = (n, t, e) => {
8
+ if (t.has(n))
9
+ throw TypeError("Cannot add the same private member more than once");
10
+ t instanceof WeakSet ? t.add(n) : t.set(n, e);
11
+ }, p = (n, t, e, o) => (x(n, t, "write to private field"), o ? o.call(n, e) : t.set(n, e), e);
12
+ var T = (n, t, e) => (x(n, t, "access private method"), e);
13
+ import { Plugin as R, PluginKey as _, TextSelection as F } from "@milkdown/prose/state";
14
+ import { $ctx as H, $prose as I } from "@milkdown/utils";
15
+ import { posToDOMRect as M, findParentNode as N } from "@milkdown/prose";
16
+ import O from "lodash.debounce";
17
+ import q from "tippy.js";
18
+ const U = (n) => {
19
+ const t = H({}, `${n}_SLASH_SPEC`), e = I((h) => {
20
+ const a = h.get(t.key);
21
+ return new R({
22
+ key: new _(`${n}_SLASH`),
23
+ ...a
24
+ });
25
+ }), o = [t, e];
26
+ return o.key = t.key, o.pluginKey = e.key, o;
27
+ };
28
+ var r, u, m, d, f, S, $;
29
+ class j {
30
+ constructor(t) {
31
+ i(this, S);
32
+ c(this, "element");
33
+ i(this, r, void 0);
34
+ i(this, u, void 0);
35
+ i(this, m, void 0);
36
+ i(this, d, void 0);
37
+ i(this, f, (t, e) => {
38
+ const { state: o, composing: h } = t, { selection: a, doc: k } = o, { ranges: g } = a, y = Math.min(...g.map((l) => l.$from.pos)), C = Math.max(...g.map((l) => l.$to.pos)), P = e && e.doc.eq(k) && e.selection.eq(a);
39
+ if (s(this, r) ?? p(this, r, q(t.dom, {
40
+ trigger: "manual",
41
+ placement: "bottom-start",
42
+ interactive: !0,
43
+ ...s(this, u),
44
+ content: this.element
45
+ })), !(h || P)) {
46
+ if (!s(this, d).call(this, t, e)) {
47
+ this.hide();
48
+ return;
188
49
  }
189
- `;
190
- }, V = (e, { css: t }) => t`
191
- &::before {
192
- left: 8px;
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
+ s(this, r).setProps({
51
+ getReferenceClientRect: () => M(t, y, C)
52
+ }), this.show();
53
+ }
207
54
  });
208
- if (!i)
209
- return null;
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
+ c(this, "update", (t, e) => {
56
+ O(s(this, f), s(this, m))(t, e);
259
57
  });
260
- })), !0;
261
- }, Y = () => {
262
- let e = !1;
263
- return {
264
- isLock: () => e,
265
- lock: () => {
266
- e = !0;
267
- },
268
- unlock: () => {
269
- e = !1;
270
- }
271
- };
272
- }, Z = (e) => () => {
273
- e.unlock();
274
- }, ee = (e, t) => (n) => {
275
- if (t.isLock())
276
- return;
277
- const { actions: o } = e.get(), s = o.findIndex((a) => a.$.classList.contains("active")), r = o[s];
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
+ c(this, "getContent", (t) => {
59
+ const { selection: e } = t.state, { empty: o } = e, h = t.state.selection instanceof F, a = this.element.contains(document.activeElement), k = !t.hasFocus() && !a, g = !t.editable, y = N(({ type: l }) => l.name === "paragraph")(t.state.selection);
60
+ return k || g || !o || !h || !y ? void 0 : y.node.textContent;
61
+ });
62
+ c(this, "destroy", () => {
63
+ var t;
64
+ (t = s(this, r)) == null || t.destroy();
65
+ });
66
+ c(this, "show", () => {
67
+ var t;
68
+ (t = s(this, r)) == null || t.show();
69
+ });
70
+ c(this, "hide", () => {
71
+ var t;
72
+ (t = s(this, r)) == null || t.hide();
73
+ });
74
+ c(this, "getInstance", () => s(this, r));
75
+ this.element = t.content, p(this, u, t.tippyOptions ?? {}), p(this, m, t.debounce ?? 200), p(this, d, t.shouldShow ?? T(this, S, $));
331
76
  }
332
- const m = i[a];
333
- !m || (m.command(t.state, t.dispatch, t), m.$.classList.remove("active"));
334
- }, re = (e, t) => {
335
- H(e, t, (n, o, s) => {
336
- const r = t.parentElement;
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
+ r = new WeakMap(), u = new WeakMap(), m = new WeakMap(), d = new WeakMap(), f = new WeakMap(), S = new WeakSet(), $ = function(t) {
79
+ const e = this.getContent(t);
80
+ return e ? e.at(-1) === "/" : !1;
81
+ };
382
82
  export {
383
- f as createDropdownItem,
384
- L as defaultActions,
385
- j as defaultConfig,
386
- ge as slash,
387
- le as slashPlugin
83
+ j as SlashProvider,
84
+ U as slashFactory
388
85
  };
389
86
  //# sourceMappingURL=index.es.js.map
@@ -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":"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"}
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\n/// @internal\nexport type SlashPluginSpecId<Id extends string> = `${Id}_SLASH_SPEC`\n\n/// @internal\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\n/// Create a slash plugin with a unique id.\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","/* 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\n/// Options for slash provider.\nexport type SlashProviderOptions = {\n /// The slash content.\n content: HTMLElement\n /// The options for creating [tippy.js](https://atomiks.github.io/tippyjs/) instance.\n tippyOptions?: Partial<Props>\n /// The debounce time for updating slash, 200ms by default.\n debounce?: number\n /// The function to determine whether the tooltip should be shown.\n shouldShow?: (view: EditorView, prevState?: EditorState) => boolean\n}\n\n/// A provider for creating slash.\nexport class SlashProvider {\n /// The root element of the slash.\n element: HTMLElement\n\n /// @internal\n #tippy: Instance | undefined\n\n /// @internal\n #tippyOptions: Partial<Props>\n\n /// @internal\n #debounce: number\n\n /// @internal\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 /// @internal\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 /// @internal\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 /// Update provider state by editor view.\n update = (view: EditorView, prevState?: EditorState): void => {\n const updater = debounce(this.#onUpdate, this.#debounce)\n\n updater(view, prevState)\n }\n\n /// Get the content of the current text block.\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 /// Destroy the slash.\n destroy = () => {\n this.#tippy?.destroy()\n }\n\n /// Show the slash.\n show = () => {\n this.#tippy?.show()\n }\n\n /// Hide the slash.\n hide = () => {\n this.#tippy?.hide()\n }\n\n /// Get the [tippy.js](https://atomiks.github.io/tippyjs/) instance.\n getInstance = () => {\n return this.#tippy\n }\n}\n"],"names":["slashFactory","id","slashSpec","$ctx","slashPlugin","$prose","ctx","spec","Plugin","PluginKey","result","SlashProvider","options","__privateAdd","__shouldShow","__publicField","_tippy","_tippyOptions","_debounce","_shouldShow","_onUpdate","view","prevState","state","composing","selection","doc","ranges","from","range","to","isSame","__privateGet","__privateSet","tippy","posToDOMRect","debounce","empty","isTextBlock","TextSelection","isSlashChildren","notHasFocus","isReadonly","paragraph","findParentNode","type","_a","__privateMethod","_shouldShow_fn","currentTextBlockContent"],"mappings":"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"}
@@ -0,0 +1,10 @@
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
+ //# 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;AAInD,MAAM,MAAM,iBAAiB,CAAC,EAAE,SAAS,MAAM,IAAI,GAAG,EAAE,aAAa,CAAA;AAGrE,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;AAGD,eAAO,MAAM,YAAY,kEAcxB,CAAA"}