@milkdown/plugin-slash 6.5.0 → 6.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/index.es.js CHANGED
@@ -1,11 +1,11 @@
1
- import { createPlugin as b, AtomList as E } from "@milkdown/utils";
2
- import { ThemeSize as $, ThemeBorder as C, ThemeShadow as N, ThemeScrollbar as S, ThemeFont as k, ThemeColor as y, ThemeIcon as T, schemaCtx as I, themeManagerCtx as m, commandsCtx as u } from "@milkdown/core";
3
- import { missingIcon as A, missingRootElement as D } from "@milkdown/exception";
4
- import { Plugin as x, PluginKey as _ } from "@milkdown/prose/state";
1
+ import { createPlugin as b, AtomList as $ } from "@milkdown/utils";
2
+ import { ThemeSize as E, ThemeBorder as C, ThemeShadow as T, ThemeScrollbar as N, ThemeFont as k, ThemeColor as y, ThemeIcon as S, schemaCtx as I, themeManagerCtx as u, commandsCtx as p } from "@milkdown/core";
3
+ import { missingIcon as x, missingRootElement as A } from "@milkdown/exception";
4
+ import { Plugin as D, PluginKey as _ } from "@milkdown/prose/state";
5
5
  import { findParentNode as M, calculateNodePosition as P } from "@milkdown/prose";
6
- import { DecorationSet as H, Decoration as O } from "@milkdown/prose/view";
6
+ import { DecorationSet as H, Decoration as q } from "@milkdown/prose/view";
7
7
  import w from "smooth-scroll-into-view-if-needed";
8
- const q = (e, { css: t }) => {
8
+ const K = (e, { css: t }) => {
9
9
  const o = (n, s = 1) => e.get(y, [n, s]);
10
10
  return t`
11
11
  .slash-dropdown-item {
@@ -41,131 +41,132 @@ const q = (e, { css: t }) => {
41
41
  }
42
42
  }
43
43
  `;
44
- }, K = (e, t) => {
44
+ }, O = (e, t) => {
45
45
  const o = (n, s = 1) => e.get(y, [n, s]);
46
46
  return t.css`
47
47
  width: 320px;
48
+ min-height: 48px;
48
49
  max-height: 320px;
49
50
  overflow-y: auto;
50
- border-radius: ${e.get($, "radius")};
51
+ border-radius: ${e.get(E, "radius")};
51
52
  position: absolute;
52
53
  background: ${o("surface")};
53
54
 
54
55
  ${e.get(C, void 0)}
56
+ ${e.get(T, void 0)}
55
57
  ${e.get(N, void 0)}
56
- ${e.get(S, void 0)}
57
58
 
58
59
  &.hide {
59
60
  display: none;
60
61
  }
61
62
 
62
- ${q(e, t)}
63
+ ${K(e, t)}
63
64
  `;
64
65
  }, U = (e, t) => {
65
66
  const o = document.createElement("div");
66
67
  return o.setAttribute("role", "listbox"), o.setAttribute("tabindex", "-1"), e.themeManager.onFlush(() => {
67
- const n = e.getStyle((s) => K(e.themeManager, s));
68
+ const n = e.getStyle((s) => O(e.themeManager, s));
68
69
  n && o.classList.add(n);
69
70
  }), o.classList.add(e.getClassName({}, t), "hide"), o;
70
- }, p = (e, t, o, n) => {
71
+ }, f = (e, t, o, n) => {
71
72
  var l;
72
73
  const s = (l = n == null ? void 0 : n.textClassName) != null ? l : "text", r = document.createElement("div");
73
74
  r.setAttribute("role", "option"), r.classList.add("slash-dropdown-item");
74
- const a = e.get(T, o);
75
- if (!a)
76
- throw A(o);
77
- const i = document.createElement("span");
78
- return i.textContent = t, i.className = s, r.appendChild(a.dom), r.appendChild(i), r;
75
+ const i = e.get(S, o);
76
+ if (!i)
77
+ throw x(o);
78
+ const a = document.createElement("span");
79
+ return a.textContent = t, a.className = s, r.appendChild(i.dom), r.appendChild(a), r;
79
80
  }, W = (e, t) => {
80
81
  const { selection: o } = e, { $from: n } = o, s = e.tr.deleteRange(n.start(), n.pos);
81
82
  return t == null || t(s), !1;
82
- }, F = (e) => (t, o, n) => (n && (W(t, o), e()), !0), L = (e, t = "/") => {
83
+ }, B = (e) => (t, o, n) => (n && (W(t, o), e()), !0), L = (e, t = "/") => {
83
84
  const { nodes: o } = e.get(I), n = [
84
85
  {
85
86
  id: "h1",
86
- dom: p(e.get(m), "Large Heading", "h1"),
87
- command: () => e.get(u).call("TurnIntoHeading", 1),
87
+ dom: f(e.get(u), "Large Heading", "h1"),
88
+ command: () => e.get(p).call("TurnIntoHeading", 1),
88
89
  keyword: ["h1", "large heading"],
89
90
  typeName: "heading"
90
91
  },
91
92
  {
92
93
  id: "h2",
93
- dom: p(e.get(m), "Medium Heading", "h2"),
94
- command: () => e.get(u).call("TurnIntoHeading", 2),
94
+ dom: f(e.get(u), "Medium Heading", "h2"),
95
+ command: () => e.get(p).call("TurnIntoHeading", 2),
95
96
  keyword: ["h2", "medium heading"],
96
97
  typeName: "heading"
97
98
  },
98
99
  {
99
100
  id: "h3",
100
- dom: p(e.get(m), "Small Heading", "h3"),
101
- command: () => e.get(u).call("TurnIntoHeading", 3),
101
+ dom: f(e.get(u), "Small Heading", "h3"),
102
+ command: () => e.get(p).call("TurnIntoHeading", 3),
102
103
  keyword: ["h3", "small heading"],
103
104
  typeName: "heading"
104
105
  },
105
106
  {
106
107
  id: "bulletList",
107
- dom: p(e.get(m), "Bullet List", "bulletList"),
108
- command: () => e.get(u).call("WrapInBulletList"),
108
+ dom: f(e.get(u), "Bullet List", "bulletList"),
109
+ command: () => e.get(p).call("WrapInBulletList"),
109
110
  keyword: ["bullet list", "ul"],
110
111
  typeName: "bullet_list"
111
112
  },
112
113
  {
113
114
  id: "orderedList",
114
- dom: p(e.get(m), "Ordered List", "orderedList"),
115
- command: () => e.get(u).call("WrapInOrderedList"),
115
+ dom: f(e.get(u), "Ordered List", "orderedList"),
116
+ command: () => e.get(p).call("WrapInOrderedList"),
116
117
  keyword: ["ordered list", "ol"],
117
118
  typeName: "ordered_list"
118
119
  },
119
120
  {
120
121
  id: "taskList",
121
- dom: p(e.get(m), "Task List", "taskList"),
122
- command: () => e.get(u).call("TurnIntoTaskList"),
122
+ dom: f(e.get(u), "Task List", "taskList"),
123
+ command: () => e.get(p).call("TurnIntoTaskList"),
123
124
  keyword: ["task list", "task"],
124
125
  typeName: "task_list_item"
125
126
  },
126
127
  {
127
128
  id: "image",
128
- dom: p(e.get(m), "Image", "image"),
129
- command: () => e.get(u).call("InsertImage"),
129
+ dom: f(e.get(u), "Image", "image"),
130
+ command: () => e.get(p).call("InsertImage"),
130
131
  keyword: ["image"],
131
132
  typeName: "image"
132
133
  },
133
134
  {
134
135
  id: "blockquote",
135
- dom: p(e.get(m), "Quote", "quote"),
136
- command: () => e.get(u).call("WrapInBlockquote"),
136
+ dom: f(e.get(u), "Quote", "quote"),
137
+ command: () => e.get(p).call("WrapInBlockquote"),
137
138
  keyword: ["quote", "blockquote"],
138
139
  typeName: "blockquote"
139
140
  },
140
141
  {
141
142
  id: "table",
142
- dom: p(e.get(m), "Table", "table"),
143
- command: () => e.get(u).call("InsertTable"),
143
+ dom: f(e.get(u), "Table", "table"),
144
+ command: () => e.get(p).call("InsertTable"),
144
145
  keyword: ["table"],
145
146
  typeName: "table"
146
147
  },
147
148
  {
148
149
  id: "code",
149
- dom: p(e.get(m), "Code Fence", "code"),
150
- command: () => e.get(u).call("TurnIntoCodeFence"),
150
+ dom: f(e.get(u), "Code Fence", "code"),
151
+ command: () => e.get(p).call("TurnIntoCodeFence"),
151
152
  keyword: ["code"],
152
153
  typeName: "fence"
153
154
  },
154
155
  {
155
156
  id: "divider",
156
- dom: p(e.get(m), "Divide Line", "divider"),
157
- command: () => e.get(u).call("InsertHr"),
157
+ dom: f(e.get(u), "Divide Line", "divider"),
158
+ command: () => e.get(p).call("InsertHr"),
158
159
  keyword: ["divider", "hr"],
159
160
  typeName: "hr"
160
161
  }
161
162
  ], s = t.slice(1).toLocaleLowerCase();
162
- return n.filter((r) => !!o[r.typeName] && r.keyword.some((a) => a.includes(s))).map(({ keyword: r, typeName: a, ...i }) => i);
163
- }, j = (e) => ({ content: t, isTopLevel: o }) => o ? t ? t.startsWith("/") ? t === "/" ? {
163
+ return n.filter((r) => !!o[r.typeName] && r.keyword.some((i) => i.includes(s))).map(({ keyword: r, typeName: i, ...a }) => a);
164
+ }, F = (e) => ({ content: t, isTopLevel: o }) => o ? t ? t.startsWith("/") ? t === "/" ? {
164
165
  placeholder: "Type to filter...",
165
166
  actions: L(e)
166
167
  } : {
167
168
  actions: L(e, t)
168
- } : null : { placeholder: "Type / to use the slash commands..." } : null, z = (e, { css: t }) => {
169
+ } : null : { placeholder: "Type / to use the slash commands..." } : null, j = (e, { css: t }) => {
169
170
  const o = (s, r = 1) => e.get(y, [s, r]), n = e.get(k, "typography");
170
171
  return t`
171
172
  position: relative;
@@ -181,39 +182,41 @@ const q = (e, { css: t }) => {
181
182
  align-items: center;
182
183
  }
183
184
  `;
184
- }, B = (e, { css: t }) => t`
185
+ }, z = (e, { css: t }) => t`
185
186
  &::before {
186
187
  left: 8px;
187
188
  }
188
189
  `, R = (e, t) => ({
189
190
  handleKeyDown: (o, n) => !(e.isEmpty() || !(n instanceof KeyboardEvent) || !["ArrowUp", "ArrowDown", "Enter"].includes(n.key)),
190
191
  decorations: (o) => {
191
- const n = M(({ type: c }) => c.name === "paragraph")(o.selection), s = o.plugins.find((c) => c.key === "MILKDOWN_UPLOAD$"), r = s == null ? void 0 : s.getState(o);
192
+ const n = M(({ type: d }) => d.name === "paragraph")(o.selection), s = o.plugins.find(
193
+ (d) => d.key === "MILKDOWN_UPLOAD$"
194
+ ), r = s == null ? void 0 : s.getState(o);
192
195
  if (r != null && r.find(o.selection.from, o.selection.to).length > 0 || !n || n.node.childCount > 1 || o.selection.$from.parentOffset !== n.node.textContent.length || n.node.firstChild && n.node.firstChild.type.name !== "text")
193
196
  return e.clear(), null;
194
- const { placeholder: a, actions: i } = e.update({
197
+ const { placeholder: i, actions: a } = e.update({
195
198
  parentNode: o.selection.$from.node(o.selection.$from.depth - 1),
196
199
  isTopLevel: o.selection.$from.depth === 1,
197
200
  content: n.node.textContent,
198
201
  state: o
199
202
  });
200
- if (!a)
203
+ if (!i)
201
204
  return null;
202
- const l = (c, g) => {
203
- const h = n.pos;
205
+ const l = (d, h) => {
206
+ const g = n.pos;
204
207
  return H.create(o.doc, [
205
- O.node(h, h + n.node.nodeSize, {
206
- class: g.filter((v) => v).join(" "),
207
- "data-text": c
208
+ q.node(g, g + n.node.nodeSize, {
209
+ class: h.filter((v) => v).join(" "),
210
+ "data-text": d
208
211
  })
209
212
  ]);
210
- }, f = t.getStyle((c) => z(t.themeManager, c)), d = t.getStyle((c) => B(t.themeManager, c));
211
- return i.length ? l(a, [f, d, "empty-node", "is-slash"]) : l(a, [f, "empty-node"]);
213
+ }, m = t.getStyle((d) => j(t.themeManager, d)), c = t.getStyle((d) => z(t.themeManager, d));
214
+ return a.length ? l(i, [m, c, "empty-node", "is-slash"]) : l(i, [m, "empty-node"]);
212
215
  }
213
216
  }), V = (e) => ({
214
217
  id: e.id,
215
218
  $: e.dom,
216
- command: F(e.command)
219
+ command: B(e.command)
217
220
  }), Q = () => ({
218
221
  placeholder: null,
219
222
  actions: []
@@ -241,7 +244,7 @@ const q = (e, { css: t }) => {
241
244
  t.firstChild.remove();
242
245
  n.forEach(({ $: r }) => {
243
246
  r.classList.remove("active"), r.addEventListener("mouseenter", o.mouseEnter), r.addEventListener("mouseleave", o.mouseLeave), t.appendChild(r);
244
- }), t.classList.remove("hide");
247
+ }), t.style.maxHeight = "", t.classList.remove("hide");
245
248
  const s = n[0];
246
249
  return s && (s.$.classList.add("active"), requestAnimationFrame(() => {
247
250
  w(s.$, {
@@ -266,10 +269,10 @@ const q = (e, { css: t }) => {
266
269
  }, Z = (e, t) => (o) => {
267
270
  if (t.isLock())
268
271
  return;
269
- const { actions: n } = e.get(), s = n.findIndex((i) => i.$.classList.contains("active")), r = n[s];
272
+ const { actions: n } = e.get(), s = n.findIndex((a) => a.$.classList.contains("active")), r = n[s];
270
273
  r && s >= 0 && r.$.classList.remove("active");
271
- const { target: a } = o;
272
- a instanceof HTMLElement && a.classList.add("active");
274
+ const { target: i } = o;
275
+ i instanceof HTMLElement && i.classList.add("active");
273
276
  }, ee = () => (e) => {
274
277
  const { target: t } = e;
275
278
  t instanceof HTMLElement && t.classList.remove("active");
@@ -279,14 +282,14 @@ const q = (e, { css: t }) => {
279
282
  return;
280
283
  const r = () => {
281
284
  n.stopPropagation(), n.preventDefault();
282
- }, { actions: a } = e.get(), i = Object.values(a).find(({ $: l }) => l.contains(s));
283
- if (!i) {
285
+ }, { actions: i } = e.get(), a = Object.values(i).find(({ $: l }) => l.contains(s));
286
+ if (!a) {
284
287
  if (e.isEmpty())
285
288
  return;
286
289
  e.clear(), o.classList.add("hide"), r();
287
290
  return;
288
291
  }
289
- r(), i.command(t.state, t.dispatch, t);
292
+ r(), a.command(t.state, t.dispatch, t);
290
293
  }, oe = (e, t, o, n) => (s) => {
291
294
  if (!(s instanceof KeyboardEvent))
292
295
  return;
@@ -294,25 +297,25 @@ const q = (e, { css: t }) => {
294
297
  const { key: r } = s;
295
298
  if (e.isEmpty() || !["ArrowDown", "ArrowUp", "Enter", "Escape"].includes(r))
296
299
  return;
297
- const { actions: a } = e.get();
298
- let i = a.findIndex(({ $: d }) => d.classList.contains("active"));
299
- i < 0 && (i = 0);
300
- const l = (d) => {
301
- const c = a[i], g = a[d];
302
- !c || !g || (c.$.classList.remove("active"), g.$.classList.add("active"), w(g.$, {
300
+ const { actions: i } = e.get();
301
+ let a = i.findIndex(({ $: c }) => c.classList.contains("active"));
302
+ a < 0 && (a = 0);
303
+ const l = (c) => {
304
+ const d = i[a], h = i[c];
305
+ !d || !h || (d.$.classList.remove("active"), h.$.classList.add("active"), w(h.$, {
303
306
  scrollMode: "if-needed",
304
307
  block: "nearest",
305
308
  inline: "nearest"
306
309
  }));
307
310
  };
308
311
  if (r === "ArrowDown") {
309
- const d = i === a.length - 1 ? 0 : i + 1;
310
- l(d);
312
+ const c = a === i.length - 1 ? 0 : a + 1;
313
+ l(c);
311
314
  return;
312
315
  }
313
316
  if (r === "ArrowUp") {
314
- const d = i === 0 ? a.length - 1 : i - 1;
315
- l(d);
317
+ const c = a === 0 ? i.length - 1 : a - 1;
318
+ l(c);
316
319
  return;
317
320
  }
318
321
  if (r === "Escape") {
@@ -321,60 +324,61 @@ const q = (e, { css: t }) => {
321
324
  e.clear(), o.classList.add("hide");
322
325
  return;
323
326
  }
324
- const f = a[i];
325
- !f || (f.command(t.state, t.dispatch, t), f.$.classList.remove("active"));
327
+ const m = i[a];
328
+ !m || (m.command(t.state, t.dispatch, t), m.$.classList.remove("active"));
326
329
  }, ne = (e, t) => {
327
330
  P(e, t, (o, n, s) => {
328
331
  const r = t.parentElement;
329
332
  if (!r)
330
- throw D();
331
- let a = o.left - s.left, i = o.bottom - s.top + 14 + r.scrollTop;
332
- if (a < 0 && (a = 0), s.height + s.top - o.bottom < n.height) {
333
- const l = o.top - s.top - n.height - 14 + r.scrollTop;
334
- l > 0 && (i = l);
335
- }
336
- return [i, a];
333
+ throw A();
334
+ let i = o.left - s.left;
335
+ i < 0 && (i = 0);
336
+ let a, l;
337
+ const m = o.top - s.top, c = s.height + s.top - o.bottom;
338
+ c >= n.height + 28 ? a = "bottom" : m >= n.height + 28 ? a = "top" : c >= m ? (a = "bottom", l = c - 28) : (a = "top", l = m - 28), (m < 0 || c < 0) && (l = s.height - o.height - 28, l > n.height && (l = void 0));
339
+ const d = a === "top" ? o.top - s.top - (l != null ? l : n.height) - 14 + r.scrollTop : o.bottom - s.top + 14 + r.scrollTop;
340
+ return t.style.maxHeight = l !== void 0 && l > 0 ? `${l}px` : "", [d, i];
337
341
  });
338
342
  }, re = (e, t, o, n, s) => {
339
343
  const r = t.dom.parentNode;
340
344
  if (!r)
341
345
  return {};
342
- const a = U(o, n), i = X();
343
- r.appendChild(a);
344
- const l = Y(i), f = te(e, t, a), d = oe(e, t, a, i), c = Z(e, i), g = ee();
345
- return r.addEventListener("mousemove", l), r.addEventListener("mousedown", f), r.addEventListener("keydown", d), {
346
- update: (h) => {
347
- !J(e, a, {
348
- mouseEnter: c,
349
- mouseLeave: g
350
- }) || s(h, a);
346
+ const i = U(o, n), a = X();
347
+ r.appendChild(i);
348
+ const l = Y(a), m = te(e, t, i), c = oe(e, t, i, a), d = Z(e, a), h = ee();
349
+ return r.addEventListener("mousemove", l), r.addEventListener("mousedown", m), r.addEventListener("keydown", c), {
350
+ update: (g) => {
351
+ !J(e, i, {
352
+ mouseEnter: d,
353
+ mouseLeave: h
354
+ }) || s(g, i);
351
355
  },
352
356
  destroy: () => {
353
- r.removeEventListener("mousemove", l), r.removeEventListener("mousedown", f), r.removeEventListener("keydown", d), a.remove();
357
+ r.removeEventListener("mousemove", l), r.removeEventListener("mousedown", m), r.removeEventListener("keydown", c), i.remove();
354
358
  }
355
359
  };
356
- }, se = "MILKDOWN_SLASH", ae = (e, t, o, n) => {
360
+ }, se = "MILKDOWN_SLASH", ie = (e, t, o, n) => {
357
361
  const s = G(t);
358
- return new x({
362
+ return new D({
359
363
  key: new _(se),
360
364
  props: R(s, e),
361
365
  view: (r) => re(s, r, e, o, n)
362
366
  });
363
- }, ie = b((e, t) => {
367
+ }, ae = b((e, t) => {
364
368
  var s, r;
365
- const o = (s = t == null ? void 0 : t.config) != null ? s : j, n = (r = t == null ? void 0 : t.calcPosition) != null ? r : ne;
369
+ const o = (s = t == null ? void 0 : t.config) != null ? s : F, n = (r = t == null ? void 0 : t.calcPosition) != null ? r : ne;
366
370
  return {
367
- prosePlugins: (a, i) => {
368
- const l = o(i);
369
- return [ae(e, l, "slash-dropdown", n)];
371
+ prosePlugins: (i, a) => {
372
+ const l = o(a);
373
+ return [ie(e, l, "slash-dropdown", n)];
370
374
  }
371
375
  };
372
- }), ge = E.create([ie()]);
376
+ }), he = $.create([ae()]);
373
377
  export {
374
- p as createDropdownItem,
378
+ f as createDropdownItem,
375
379
  L as defaultActions,
376
- j as defaultConfig,
377
- ge as slash,
378
- ie as slashPlugin
380
+ F as defaultConfig,
381
+ he as slash,
382
+ ae as slashPlugin
379
383
  };
380
384
  //# 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 {\n Color,\n Emotion,\n ThemeBorder,\n ThemeColor,\n ThemeFont,\n ThemeManager,\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 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 { ThemeIcon, ThemeManager } 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\n div.classList.add(utils.getClassName({}, className), 'hide');\n\n return div;\n};\n\ntype 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\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 { commandsCtx, Ctx, schemaCtx, themeManagerCtx } from '@milkdown/core';\nimport { Node } from '@milkdown/prose/model';\nimport { EditorState } from '@milkdown/prose/state';\n\nimport { WrappedAction } from './item';\nimport { createDropdownItem } from './utility';\n\ntype Nullable<T> = T | null | undefined;\n\nexport type StatusConfig = {\n placeholder?: Nullable<string>;\n actions?: Nullable<WrappedAction[]>;\n};\n\nexport type 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) return null;\n\n if (!content) {\n return { placeholder: 'Type / to use the slash commands...' };\n }\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 { Color, Emotion, ThemeColor, ThemeFont, ThemeManager } from '@milkdown/core';\nimport { findParentNode } from '@milkdown/prose';\nimport { EditorState } from '@milkdown/prose/state';\nimport { Decoration, DecorationSet, EditorView } from '@milkdown/prose/view';\nimport { 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\n if (!['ArrowUp', 'ArrowDown', 'Enter'].includes(event.key)) {\n return false;\n }\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\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\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 type 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 { StatusConfigBuilder, StatusConfigBuilderParams } from '..';\nimport { Action, transformAction } from '../item';\n\nexport type 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 { Status } from './status';\n\ntype 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\n actions.forEach(({ $ }) => {\n $.classList.remove('active');\n $.addEventListener('mouseenter', listeners.mouseEnter);\n $.addEventListener('mouseleave', listeners.mouseLeave);\n dropdownElement.appendChild($);\n });\n\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 { EditorView } from '@milkdown/prose/view';\nimport scrollIntoView from 'smooth-scroll-into-view-if-needed';\n\nimport { 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()) 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)) return;\n target.classList.add('active');\n};\n\nexport const handleMouseLeave = () => (e: MouseEvent) => {\n const { target } = e;\n if (!(target instanceof HTMLElement)) 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)) return;\n if (!view) 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()) 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)) return;\n if (!mouseManager.isLock()) mouseManager.lock();\n\n const { key } = e;\n if (status.isEmpty()) return;\n if (!['ArrowDown', 'ArrowUp', 'Enter', 'Escape'].includes(key)) return;\n\n const { actions } = status.get();\n\n let active = actions.findIndex(({ $ }) => $.classList.contains('active'));\n if (active < 0) active = 0;\n\n const moveActive = (next: number) => {\n const active$ = actions[active];\n const next$ = actions[next];\n if (!active$ || !next$) 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()) return;\n\n status.clear();\n dropdownElement.classList.add('hide');\n return;\n }\n\n const active$ = actions[active];\n if (!active$) 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 { EditorView } from '@milkdown/prose/view';\nimport { 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 { 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\n let left = selected.left - parent.left;\n let top = selected.bottom - parent.top + 14 + $editor.scrollTop;\n\n if (left < 0) {\n left = 0;\n }\n\n if (parent.height + parent.top - selected.bottom < target.height) {\n const topOffset = selected.top - parent.top - target.height - 14 + $editor.scrollTop;\n if (topOffset > 0) {\n top = topOffset;\n }\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) 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) 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 { ThemeUtils } from '@milkdown/utils';\n\nimport type { StatusConfigBuilder } from '..';\nimport { createProps } from './props';\nimport { createStatus } from './status';\nimport { CalcPosition, 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 { CalcPosition, 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 type 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":[],"mappings":"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"}
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 {\n Color,\n Emotion,\n ThemeBorder,\n ThemeColor,\n ThemeFont,\n ThemeManager,\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 { ThemeIcon, ThemeManager } 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\n div.classList.add(utils.getClassName({}, className), 'hide');\n\n return div;\n};\n\ntype 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\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 { commandsCtx, Ctx, schemaCtx, themeManagerCtx } from '@milkdown/core';\nimport { Node } from '@milkdown/prose/model';\nimport { EditorState } from '@milkdown/prose/state';\n\nimport { WrappedAction } from './item';\nimport { createDropdownItem } from './utility';\n\ntype Nullable<T> = T | null | undefined;\n\nexport type StatusConfig = {\n placeholder?: Nullable<string>;\n actions?: Nullable<WrappedAction[]>;\n};\n\nexport type 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) return null;\n\n if (!content) {\n return { placeholder: 'Type / to use the slash commands...' };\n }\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 { Color, Emotion, ThemeColor, ThemeFont, ThemeManager } from '@milkdown/core';\nimport { findParentNode } from '@milkdown/prose';\nimport { EditorState } from '@milkdown/prose/state';\nimport { Decoration, DecorationSet, EditorView } from '@milkdown/prose/view';\nimport { 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\n if (!['ArrowUp', 'ArrowDown', 'Enter'].includes(event.key)) {\n return false;\n }\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\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\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 type 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 { StatusConfigBuilder, StatusConfigBuilderParams } from '..';\nimport { Action, transformAction } from '../item';\n\nexport type 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 { Status } from './status';\n\ntype 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\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 { EditorView } from '@milkdown/prose/view';\nimport scrollIntoView from 'smooth-scroll-into-view-if-needed';\n\nimport { 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()) 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)) return;\n target.classList.add('active');\n};\n\nexport const handleMouseLeave = () => (e: MouseEvent) => {\n const { target } = e;\n if (!(target instanceof HTMLElement)) 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)) return;\n if (!view) 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()) 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)) return;\n if (!mouseManager.isLock()) mouseManager.lock();\n\n const { key } = e;\n if (status.isEmpty()) return;\n if (!['ArrowDown', 'ArrowUp', 'Enter', 'Escape'].includes(key)) return;\n\n const { actions } = status.get();\n\n let active = actions.findIndex(({ $ }) => $.classList.contains('active'));\n if (active < 0) active = 0;\n\n const moveActive = (next: number) => {\n const active$ = actions[active];\n const next$ = actions[next];\n if (!active$ || !next$) 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()) return;\n\n status.clear();\n dropdownElement.classList.add('hide');\n return;\n }\n\n const active$ = actions[active];\n if (!active$) 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 { EditorView } from '@milkdown/prose/view';\nimport { 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 { 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\n let left = selected.left - parent.left;\n\n if (left < 0) {\n left = 0;\n }\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 } else if (selectedToTop >= target.height + 28) {\n direction = 'top';\n } else if (selectedToBottom >= selectedToTop) {\n direction = 'bottom';\n maxHeight = selectedToBottom - 28;\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\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) 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) 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 { ThemeUtils } from '@milkdown/utils';\n\nimport type { StatusConfigBuilder } from '..';\nimport { createProps } from './props';\nimport { createStatus } from './status';\nimport { CalcPosition, 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 { CalcPosition, 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 type 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","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 +1 @@
1
- {"version":3,"file":"dropdown.d.ts","sourceRoot":"","sources":["../../src/prose-plugin/dropdown.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,aAAK,SAAS,GAAG;IACb,UAAU,EAAE,aAAa,CAAC;IAC1B,UAAU,EAAE,aAAa,CAAC;CAC7B,CAAC;AAEF,eAAO,MAAM,cAAc,WAAY,MAAM,mBAAmB,WAAW,aAAa,SAAS,KAAG,OAuCnG,CAAC"}
1
+ {"version":3,"file":"dropdown.d.ts","sourceRoot":"","sources":["../../src/prose-plugin/dropdown.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,aAAK,SAAS,GAAG;IACb,UAAU,EAAE,aAAa,CAAC;IAC1B,UAAU,EAAE,aAAa,CAAC;CAC7B,CAAC;AAEF,eAAO,MAAM,cAAc,WAAY,MAAM,mBAAmB,WAAW,aAAa,SAAS,KAAG,OAwCnG,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../src/prose-plugin/view.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAY7C,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,eAAO,MAAM,mBAAmB,SAAU,UAAU,mBAAmB,WAAW,SAsBjF,CAAC;AAEF,oBAAY,YAAY,GAAG,CAAC,IAAI,EAAE,UAAU,EAAE,eAAe,EAAE,WAAW,KAAK,IAAI,CAAC;AAEpF,eAAO,MAAM,UAAU,WACX,MAAM,QACR,UAAU,SACT,UAAU,aACN,MAAM,gBACH,YAAY;;;;mBAoBP,UAAU;;CAkBhC,CAAC"}
1
+ {"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../src/prose-plugin/view.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAY7C,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,eAAO,MAAM,mBAAmB,SAAU,UAAU,mBAAmB,WAAW,SA4CjF,CAAC;AAEF,oBAAY,YAAY,GAAG,CAAC,IAAI,EAAE,UAAU,EAAE,eAAe,EAAE,WAAW,KAAK,IAAI,CAAC;AAEpF,eAAO,MAAM,UAAU,WACX,MAAM,QACR,UAAU,SACT,UAAU,aACN,MAAM,gBACH,YAAY;;;;mBAoBP,UAAU;;CAkBhC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"style.d.ts","sourceRoot":"","sources":["../src/style.ts"],"names":[],"mappings":"AACA,OAAO,EAEH,OAAO,EAIP,YAAY,EAIf,MAAM,gBAAgB,CAAC;AAwCxB,eAAO,MAAM,WAAW,iBAAkB,YAAY,WAAW,OAAO,WAqBvE,CAAC"}
1
+ {"version":3,"file":"style.d.ts","sourceRoot":"","sources":["../src/style.ts"],"names":[],"mappings":"AACA,OAAO,EAEH,OAAO,EAIP,YAAY,EAIf,MAAM,gBAAgB,CAAC;AAwCxB,eAAO,MAAM,WAAW,iBAAkB,YAAY,WAAW,OAAO,WAsBvE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@milkdown/plugin-slash",
3
- "version": "6.5.0",
3
+ "version": "6.5.2",
4
4
  "type": "module",
5
5
  "main": "./lib/index.es.js",
6
6
  "types": "./lib/index.d.ts",
@@ -15,17 +15,17 @@
15
15
  "milkdown plugin"
16
16
  ],
17
17
  "devDependencies": {
18
- "@milkdown/core": "6.5.0",
19
- "@milkdown/prose": "6.5.0",
20
- "@milkdown/design-system": "6.5.0"
18
+ "@milkdown/core": "6.5.2",
19
+ "@milkdown/prose": "6.5.2",
20
+ "@milkdown/design-system": "6.5.2"
21
21
  },
22
22
  "peerDependencies": {
23
23
  "@milkdown/core": "^6.0.1",
24
24
  "@milkdown/prose": "^6.0.1"
25
25
  },
26
26
  "dependencies": {
27
- "@milkdown/utils": "6.5.0",
28
- "@milkdown/exception": "6.5.0",
27
+ "@milkdown/utils": "6.5.2",
28
+ "@milkdown/exception": "6.5.2",
29
29
  "smooth-scroll-into-view-if-needed": "^1.1.32",
30
30
  "tslib": "^2.4.0"
31
31
  },
@@ -32,6 +32,7 @@ export const renderDropdown = (status: Status, dropdownElement: HTMLElement, lis
32
32
  dropdownElement.appendChild($);
33
33
  });
34
34
 
35
+ dropdownElement.style.maxHeight = '';
35
36
  dropdownElement.classList.remove('hide');
36
37
 
37
38
  const first$ = actions[0];
@@ -24,18 +24,40 @@ export const defaultCalcPosition = (view: EditorView, dropdownElement: HTMLEleme
24
24
  }
25
25
 
26
26
  let left = selected.left - parent.left;
27
- let top = selected.bottom - parent.top + 14 + $editor.scrollTop;
28
27
 
29
28
  if (left < 0) {
30
29
  left = 0;
31
30
  }
32
31
 
33
- if (parent.height + parent.top - selected.bottom < target.height) {
34
- const topOffset = selected.top - parent.top - target.height - 14 + $editor.scrollTop;
35
- if (topOffset > 0) {
36
- top = topOffset;
32
+ let direction: 'top' | 'bottom';
33
+ let maxHeight: number | undefined;
34
+ const selectedToTop = selected.top - parent.top;
35
+ const selectedToBottom = parent.height + parent.top - selected.bottom;
36
+ if (selectedToBottom >= target.height + 28) {
37
+ direction = 'bottom';
38
+ } else if (selectedToTop >= target.height + 28) {
39
+ direction = 'top';
40
+ } else if (selectedToBottom >= selectedToTop) {
41
+ direction = 'bottom';
42
+ maxHeight = selectedToBottom - 28;
43
+ } else {
44
+ direction = 'top';
45
+ maxHeight = selectedToTop - 28;
46
+ }
47
+ if (selectedToTop < 0 || selectedToBottom < 0) {
48
+ maxHeight = parent.height - selected.height - 28;
49
+ if (maxHeight > target.height) {
50
+ maxHeight = undefined;
37
51
  }
38
52
  }
53
+
54
+ const top =
55
+ direction === 'top'
56
+ ? selected.top - parent.top - (maxHeight ?? target.height) - 14 + $editor.scrollTop
57
+ : selected.bottom - parent.top + 14 + $editor.scrollTop;
58
+
59
+ dropdownElement.style.maxHeight = maxHeight !== undefined && maxHeight > 0 ? `${maxHeight}px` : '';
60
+
39
61
  return [top, left];
40
62
  });
41
63
  };
package/src/style.ts CHANGED
@@ -54,6 +54,7 @@ export const injectStyle = (themeManager: ThemeManager, emotion: Emotion) => {
54
54
 
55
55
  return emotion.css`
56
56
  width: 320px;
57
+ min-height: 48px;
57
58
  max-height: 320px;
58
59
  overflow-y: auto;
59
60
  border-radius: ${themeManager.get(ThemeSize, 'radius')};