@milkdown/plugin-slash 6.5.3 → 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.
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 +80 -382
  4. package/lib/index.es.js.map +1 -1
  5. package/lib/slash-plugin.d.ts +11 -0
  6. package/lib/slash-plugin.d.ts.map +1 -0
  7. package/lib/slash-provider.d.ts +20 -0
  8. package/lib/slash-provider.d.ts.map +1 -0
  9. package/package.json +17 -8
  10. package/src/index.ts +2 -34
  11. package/src/slash-plugin.ts +31 -0
  12. package/src/slash-provider.ts +119 -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,87 @@
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 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
- }, 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
+ o(this, c).setProps({
51
+ getReferenceClientRect: () => F(t, f, P)
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
+ i(this, "update", (t, e) => {
56
+ K(o(this, S), o(this, d))(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
+ 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
- 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
+ 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
- f as createDropdownItem,
384
- L as defaultActions,
385
- j as defaultConfig,
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
@@ -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\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"}