@milkdown/plugin-tooltip 6.4.1 → 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.
@@ -1 +1 @@
1
- {"version":3,"file":"calc-button-pos.d.ts","sourceRoot":"","sources":["../../src/button-manager/calc-button-pos.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,eAAO,MAAM,aAAa,YAAa,WAAW,QAAQ,UAAU,YAAY,OAAO,SAkBtF,CAAC"}
1
+ {"version":3,"file":"calc-button-pos.d.ts","sourceRoot":"","sources":["../../src/button-manager/calc-button-pos.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,eAAO,MAAM,aAAa,YAAa,WAAW,QAAQ,UAAU,YAAY,OAAO,SAuBtF,CAAC"}
package/lib/index.es.js CHANGED
@@ -1,24 +1,24 @@
1
- import { TextSelection as m, PluginKey as p, Plugin as T } from "@milkdown/prose/state";
2
- import { createPlugin as v, AtomList as $ } from "@milkdown/utils";
3
- import { schemaCtx as y, themeManagerCtx as b, ThemeIcon as L, commandsCtx as k, ThemeSize as f, ThemeBorder as P, ThemeShadow as E, ThemeColor as x } from "@milkdown/core";
4
- import { findParentNode as B, calculateTextPosition as C } from "@milkdown/prose";
5
- import { missingRootElement as M } from "@milkdown/exception";
6
- const h = (e, t) => {
1
+ import { TextSelection as p, PluginKey as T, Plugin as v } from "@milkdown/prose/state";
2
+ import { createPlugin as $, AtomList as y } from "@milkdown/utils";
3
+ import { schemaCtx as b, themeManagerCtx as L, ThemeIcon as k, commandsCtx as P, ThemeSize as h, ThemeBorder as E, ThemeShadow as x, ThemeColor as B } from "@milkdown/core";
4
+ import { findParentNode as C, calculateTextPosition as M } from "@milkdown/prose";
5
+ import { missingRootElement as A } from "@milkdown/exception";
6
+ const m = (e, t) => {
7
7
  if (!t)
8
8
  return !1;
9
9
  const { from: o, to: s } = e.selection;
10
10
  return e.doc.rangeHasMark(o, o === s ? s + 1 : s, t);
11
- }, A = (e) => {
11
+ }, H = (e) => {
12
12
  const { selection: t } = e;
13
- return t instanceof m ? !!e.doc.textBetween(t.from, t.to) : !1;
14
- }, H = (e) => Boolean(B((t) => !!t.type.spec.code)(e.selection)), I = (e, t) => !A(e) || H(e) || h(e, t), u = (e, t, o, s) => ({
13
+ return t instanceof p ? !!e.doc.textBetween(t.from, t.to) : !1;
14
+ }, I = (e) => Boolean(C((t) => !!t.type.spec.code)(e.selection)), O = (e, t) => !H(e) || I(e) || m(e, t), u = (e, t, o, s) => ({
15
15
  icon: e,
16
16
  onClick: t,
17
- isHidden: () => (n) => I(n.state, s),
18
- isActive: () => (n) => h(n.state, o),
17
+ isHidden: () => (n) => O(n.state, s),
18
+ isActive: () => (n) => m(n.state, o),
19
19
  canAddToDOM: () => (n) => !!o && !!n.state.schema.marks[o.name]
20
- }), O = (e) => {
21
- const t = e.get(y).marks;
20
+ }), w = (e) => {
21
+ const t = e.get(b).marks;
22
22
  return [
23
23
  u("bold", "ToggleBold", t.strong),
24
24
  u("italic", "ToggleItalic", t.em),
@@ -26,39 +26,41 @@ const h = (e, t) => {
26
26
  u("code", "ToggleInlineCode", t.code_inline),
27
27
  u("link", "ToggleLink", t.link)
28
28
  ];
29
- }, D = (e, t = O) => {
29
+ }, D = (e, t = w) => {
30
30
  const o = ({ icon: s, onClick: n, isHidden: l, isActive: i, canAddToDOM: c }) => {
31
31
  var r;
32
32
  return {
33
- $: typeof s == "function" ? s(e) : (r = e.get(b).get(L, s)) == null ? void 0 : r.dom,
34
- command: typeof n == "string" ? () => e.get(k).call(n) : n(e),
33
+ $: typeof s == "function" ? s(e) : (r = e.get(L).get(k, s)) == null ? void 0 : r.dom,
34
+ command: typeof n == "string" ? () => e.get(P).call(n) : n(e),
35
35
  disable: l(e),
36
36
  active: i(e),
37
37
  enable: c(e)
38
38
  };
39
39
  };
40
40
  return t(e).map(o);
41
- }, q = (e, t, o) => {
42
- e.classList.remove("hide"), C(t, e, (s, n, l, i) => {
41
+ }, W = (e, t, o) => {
42
+ e.classList.remove("hide"), M(t, e, (s, n, l, i) => {
43
43
  const c = e.parentElement;
44
44
  if (!c)
45
- throw M();
45
+ throw A();
46
46
  const r = n.left - s.left;
47
47
  let a = s.left - i.left - (l.width - r) / 2, d = s.top - i.top - l.height - 14 + c.scrollTop;
48
- return a < 0 && (a = 0), (s.top - i.top < l.height || o && i.bottom - s.bottom > l.height) && (d = s.bottom - i.top + 14 + c.scrollTop), [d, a];
48
+ a < 0 && (a = 0);
49
+ const f = c.clientWidth - (l.width + 4);
50
+ return a > f && (a = f), (d < c.scrollTop || o && i.bottom - s.bottom > l.height) && (d = s.bottom - i.top + 14 + c.scrollTop), [d, a];
49
51
  });
50
- }, w = (e, { css: t }) => {
51
- const o = (n, l = 1) => e.get(x, [n, l]), s = e.get(f, "lineWidth");
52
+ }, q = (e, { css: t }) => {
53
+ const o = (n, l = 1) => e.get(B, [n, l]), s = e.get(h, "lineWidth");
52
54
  return t`
53
55
  display: inline-flex;
54
56
  cursor: pointer;
55
57
  justify-content: space-evenly;
56
58
  position: absolute;
57
- border-radius: ${e.get(f, "radius")};
59
+ border-radius: ${e.get(h, "radius")};
58
60
  z-index: 2;
59
61
 
60
- ${e.get(P, void 0)}
61
62
  ${e.get(E, void 0)}
63
+ ${e.get(x, void 0)}
62
64
 
63
65
  overflow: hidden;
64
66
  background: ${o("surface")};
@@ -95,7 +97,7 @@ const h = (e, t) => {
95
97
  }, N = (e, t, o) => {
96
98
  const s = document.createElement("div");
97
99
  return t.themeManager.onFlush(() => {
98
- const n = t.getStyle((l) => w(t.themeManager, l)) || "";
100
+ const n = t.getStyle((l) => q(t.themeManager, l)) || "";
99
101
  n && s.classList.add(n);
100
102
  }), s.classList.add(t.getClassName({}, o)), {
101
103
  dom: s,
@@ -104,7 +106,7 @@ const h = (e, t) => {
104
106
  e.filter((i) => i.enable(n) && i.$ != null).forEach(({ $: i }) => s.appendChild(i)), (l = n.dom.parentNode) == null || l.appendChild(s);
105
107
  }
106
108
  };
107
- }, W = (e, t) => Object.values(e).filter((o) => o.enable(t) && o.$ != null).every(({ $: o }) => o.classList.contains("hide")), _ = (e, t) => (e.filter((o) => o.enable(t) && o.$ != null).forEach((o) => {
109
+ }, _ = (e, t) => Object.values(e).filter((o) => o.enable(t) && o.$ != null).every(({ $: o }) => o.classList.contains("hide")), j = (e, t) => (e.filter((o) => o.enable(t) && o.$ != null).forEach((o) => {
108
110
  var l;
109
111
  if ((l = o.disable) == null ? void 0 : l.call(o, t)) {
110
112
  o.$.classList.add("hide");
@@ -115,7 +117,7 @@ const h = (e, t) => {
115
117
  return;
116
118
  }
117
119
  o.$.classList.remove("active");
118
- }), W(e, t)), g = (e, t, o, s) => {
120
+ }), _(e, t)), g = (e, t, o, s) => {
119
121
  const { dom: n, render: l } = N(e, t, s), i = (r) => {
120
122
  const a = e.find(({ $: d }) => r.target instanceof Element && d.contains(r.target));
121
123
  !a || (r.stopPropagation(), r.preventDefault(), a.command());
@@ -128,15 +130,15 @@ const h = (e, t) => {
128
130
  },
129
131
  hide: c,
130
132
  update: (r) => {
131
- if (_(e, r)) {
133
+ if (j(e, r)) {
132
134
  c();
133
135
  return;
134
136
  }
135
- q(n, r, o);
137
+ W(n, r, o);
136
138
  },
137
139
  render: l
138
140
  };
139
- }, j = (e, t, o, s) => {
141
+ }, z = (e, t, o, s) => {
140
142
  let n = g(e, t, o, s), l = !1;
141
143
  const i = () => {
142
144
  n.hide();
@@ -163,13 +165,13 @@ const h = (e, t) => {
163
165
  l = r;
164
166
  }
165
167
  };
166
- }, z = new p("MILKDOWN_TOOLTIP"), F = v((e, t) => ({
168
+ }, F = new T("MILKDOWN_TOOLTIP"), K = $((e, t) => ({
167
169
  id: "tooltip",
168
170
  prosePlugins: (o, s) => {
169
171
  var i;
170
- const n = j(D(s, t == null ? void 0 : t.items), e, (i = t == null ? void 0 : t.bottom) != null ? i : !1, "tooltip");
171
- return [new T({
172
- key: z,
172
+ const n = z(D(s, t == null ? void 0 : t.items), e, (i = t == null ? void 0 : t.bottom) != null ? i : !1, "tooltip");
173
+ return [new v({
174
+ key: F,
173
175
  props: {
174
176
  handleClick: (c) => (n.setHide(!1), n.update(c), !1),
175
177
  handleDOMEvents: {
@@ -182,13 +184,13 @@ const h = (e, t) => {
182
184
  })
183
185
  })];
184
186
  }
185
- })), U = $.create([F()]);
187
+ })), U = y.create([K()]);
186
188
  export {
187
189
  D as buttonMap,
188
190
  u as createToggleIcon,
189
- O as defaultButtons,
190
- z as key,
191
+ w as defaultButtons,
192
+ F as key,
191
193
  U as tooltip,
192
- F as tooltipPlugin
194
+ K as tooltipPlugin
193
195
  };
194
196
  //# sourceMappingURL=index.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.es.js","sources":["../src/utility/prosemirror.ts","../src/item.ts","../src/button-manager/calc-button-pos.ts","../src/button-manager/style.ts","../src/button-manager/create-tooltip.ts","../src/button-manager/no-active.ts","../src/button-manager/filter-button.ts","../src/button-manager/index.ts","../src/selection-marks-tooltip.ts","../src/index.ts"],"sourcesContent":["/* Copyright 2021, Milkdown by Mirone. */\nimport { findParentNode } from '@milkdown/prose';\nimport { MarkType, Node, NodeType } from '@milkdown/prose/model';\nimport { EditorState, TextSelection } from '@milkdown/prose/state';\n\nexport type Position = {\n start: number;\n end: number;\n};\n\nexport const hasMark = (editorState: EditorState, type?: MarkType): boolean => {\n if (!type) {\n return false;\n }\n const { from, to } = editorState.selection;\n\n return editorState.doc.rangeHasMark(from, from === to ? to + 1 : to, type);\n};\n\nexport const isTextSelection = (editorState: EditorState): boolean => {\n const { selection } = editorState;\n if (selection instanceof TextSelection) {\n const text = editorState.doc.textBetween(selection.from, selection.to);\n\n if (!text) return false;\n\n return true;\n }\n return false;\n};\n\nexport const isInCodeFence = (editorState: EditorState): boolean =>\n Boolean(findParentNode((node) => !!node.type.spec.code)(editorState.selection));\n\nexport const isTextAndNotHasMark = (editorState: EditorState, mark?: MarkType): boolean =>\n !isTextSelection(editorState) || isInCodeFence(editorState) || hasMark(editorState, mark);\n\nexport const equalNodeType = (nodeType: NodeType, node: Node) => {\n return (Array.isArray(nodeType) && nodeType.indexOf(node.type) > -1) || node.type === nodeType;\n};\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { commandsCtx, Ctx, schemaCtx, ThemeIcon, themeManagerCtx } from '@milkdown/core';\nimport type { Icon } from '@milkdown/design-system';\nimport type { MarkType } from '@milkdown/prose/model';\nimport { EditorView } from '@milkdown/prose/view';\n\nimport { hasMark, isTextAndNotHasMark } from './utility';\n\nexport type Pred = (view: EditorView) => boolean;\nexport type Updater = (view: EditorView, $: HTMLElement) => void;\nexport type Event2Command = (e: Event) => void;\n\nexport type OnClick = (ctx: Ctx) => void;\n\nexport type Item = {\n icon: Icon | ((ctx: Ctx) => HTMLElement);\n onClick: string | ((ctx: Ctx) => () => void);\n isHidden: (ctx: Ctx) => Pred;\n isActive: (ctx: Ctx) => Pred;\n canAddToDOM: (ctx: Ctx) => Pred;\n};\n\nexport type ButtonItem = {\n $: HTMLElement;\n command: () => void;\n active: Pred;\n disable?: Pred;\n enable: Pred;\n};\n\nexport const createToggleIcon = (icon: Icon, onClick: string, mark?: MarkType, disableForMark?: MarkType): Item => ({\n icon,\n onClick,\n isHidden: () => (view: EditorView) => isTextAndNotHasMark(view.state, disableForMark),\n isActive: () => (view: EditorView) => hasMark(view.state, mark),\n canAddToDOM: () => (view: EditorView) => !!mark && !!view.state.schema.marks[mark.name],\n});\n\nexport const defaultButtons = (ctx: Ctx) => {\n const marks = ctx.get(schemaCtx).marks;\n return [\n createToggleIcon('bold', 'ToggleBold', marks['strong']),\n createToggleIcon('italic', 'ToggleItalic', marks['em']),\n createToggleIcon('strikeThrough', 'ToggleStrikeThrough', marks['strike_through']),\n createToggleIcon('code', 'ToggleInlineCode', marks['code_inline']),\n createToggleIcon('link', 'ToggleLink', marks['link']),\n ];\n};\n\nexport type ButtonList = ButtonItem[];\n\nexport type TooltipOptions = {\n bottom: boolean;\n items: (ctx: Ctx) => Array<Item>;\n};\n\nexport const buttonMap = (ctx: Ctx, items: (ctx: Ctx) => Array<Item> = defaultButtons): ButtonList => {\n const toButton = ({ icon, onClick, isHidden, isActive, canAddToDOM }: Item): ButtonItem => ({\n $: typeof icon === 'function' ? icon(ctx) : (ctx.get(themeManagerCtx).get(ThemeIcon, icon)?.dom as HTMLElement),\n command: typeof onClick === 'string' ? () => ctx.get(commandsCtx).call(onClick) : onClick(ctx),\n disable: isHidden(ctx),\n active: isActive(ctx),\n enable: canAddToDOM(ctx),\n });\n return items(ctx).map(toButton);\n};\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { missingRootElement } from '@milkdown/exception';\nimport { calculateTextPosition } from '@milkdown/prose';\nimport { EditorView } from '@milkdown/prose/view';\n\nexport const calcButtonPos = (buttons: HTMLElement, view: EditorView, isBottom: boolean) => {\n buttons.classList.remove('hide');\n calculateTextPosition(view, buttons, (start, end, target, parent) => {\n const $editor = buttons.parentElement;\n if (!$editor) {\n throw missingRootElement();\n }\n const selectionWidth = end.left - start.left;\n let left = start.left - parent.left - (target.width - selectionWidth) / 2;\n let top = start.top - parent.top - target.height - 14 + $editor.scrollTop;\n\n if (left < 0) left = 0;\n\n if (start.top - parent.top < target.height || (isBottom && parent.bottom - start.bottom > target.height)) {\n top = start.bottom - parent.top + 14 + $editor.scrollTop;\n }\n return [top, left];\n });\n};\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { Color, Emotion, ThemeBorder, ThemeColor, ThemeManager, ThemeShadow, ThemeSize } from '@milkdown/core';\n\nexport const injectStyle = (themeManager: ThemeManager, { css }: Emotion) => {\n const palette = (color: Color, opacity = 1) => themeManager.get(ThemeColor, [color, opacity]);\n const lineWidth = themeManager.get(ThemeSize, 'lineWidth');\n return css`\n display: inline-flex;\n cursor: pointer;\n justify-content: space-evenly;\n position: absolute;\n border-radius: ${themeManager.get(ThemeSize, 'radius')};\n z-index: 2;\n\n ${themeManager.get(ThemeBorder, undefined)}\n ${themeManager.get(ThemeShadow, undefined)}\n\n overflow: hidden;\n background: ${palette('surface')};\n\n .icon {\n position: relative;\n color: ${palette('solid', 0.87)};\n\n width: 48px;\n line-height: 48px;\n text-align: center;\n transition: all 0.4s ease-in-out;\n &:hover {\n background-color: ${palette('secondary', 0.12)};\n }\n &.active {\n color: ${palette('primary')};\n }\n &:not(:last-child)::after {\n content: '';\n position: absolute;\n top: 0;\n right: calc(-0.5 * ${lineWidth});\n width: ${lineWidth};\n bottom: 0;\n background: ${palette('line')};\n }\n }\n &.hide,\n .hide {\n display: none;\n }\n `;\n};\n","/* Copyright 2021, Milkdown by Mirone. */\nimport type { EditorView } from '@milkdown/prose/view';\nimport type { ThemeUtils } from '@milkdown/utils';\n\nimport type { ButtonList } from '../item';\nimport { injectStyle } from './style';\n\ntype Tooltip = {\n dom: HTMLDivElement;\n render: (editorView: EditorView) => void;\n};\n\nexport const createTooltip = (buttonMap: ButtonList, utils: ThemeUtils, className: string): Tooltip => {\n const div = document.createElement('div');\n utils.themeManager.onFlush(() => {\n const style = utils.getStyle((emotion) => injectStyle(utils.themeManager, emotion)) || '';\n if (style) {\n div.classList.add(style);\n }\n });\n\n div.classList.add(utils.getClassName({}, className));\n\n return {\n dom: div,\n render: (editorView: EditorView) => {\n buttonMap\n .filter((item) => item.enable(editorView) && item.$ != null)\n .forEach(({ $ }) => div.appendChild($));\n\n editorView.dom.parentNode?.appendChild(div);\n },\n };\n};\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { EditorView } from '@milkdown/prose/view';\n\nimport { ButtonList } from '../item';\n\nexport const noActive = (buttonMap: ButtonList, view: EditorView) => {\n return Object.values(buttonMap)\n .filter((item) => item.enable(view) && item.$ != null)\n .every(({ $ }) => $.classList.contains('hide'));\n};\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { EditorView } from '@milkdown/prose/view';\n\nimport { ButtonList } from '../item';\nimport { noActive } from './no-active';\n\nexport const filterButton = (buttons: ButtonList, view: EditorView) => {\n buttons\n .filter((item) => item.enable(view) && item.$ != null)\n .forEach((item) => {\n const disable = item.disable?.(view);\n if (disable) {\n item.$.classList.add('hide');\n return;\n }\n\n item.$.classList.remove('hide');\n\n const active = item.active(view);\n if (active) {\n item.$.classList.add('active');\n return;\n }\n item.$.classList.remove('active');\n });\n\n return noActive(buttons, view);\n};\n","/* Copyright 2021, Milkdown by Mirone. */\nimport type { EditorView } from '@milkdown/prose/view';\nimport type { ThemeUtils } from '@milkdown/utils';\n\nimport type { ButtonList } from '../item';\nimport { calcButtonPos } from './calc-button-pos';\nimport { createTooltip } from './create-tooltip';\nimport { filterButton } from './filter-button';\n\nexport const createButtonManager = (\n buttons: ButtonList,\n utils: ThemeUtils,\n bottom: boolean,\n containerClassName: string,\n) => {\n const { dom: buttonDOM, render } = createTooltip(buttons, utils, containerClassName);\n\n const onClick = (e: Event) => {\n const target = buttons.find(({ $ }) => e.target instanceof Element && $.contains(e.target));\n if (!target) return;\n\n e.stopPropagation();\n e.preventDefault();\n target.command();\n };\n\n const hide = () => {\n buttonDOM.classList.add('hide');\n };\n\n buttonDOM.addEventListener('mousedown', onClick);\n\n return {\n destroy: () => {\n buttonDOM.removeEventListener('mousedown', onClick);\n buttonDOM.remove();\n },\n hide,\n update: (editorView: EditorView) => {\n const noActive = filterButton(buttons, editorView);\n if (noActive) {\n hide();\n return;\n }\n calcButtonPos(buttonDOM, editorView, bottom);\n },\n render,\n };\n};\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { EditorState } from '@milkdown/prose/state';\nimport type { EditorView } from '@milkdown/prose/view';\nimport { ThemeUtils } from '@milkdown/utils';\n\nimport { createButtonManager } from './button-manager';\nimport type { ButtonList } from './item';\n\nexport const createPlugin = (buttonMap: ButtonList, utils: ThemeUtils, bottom: boolean, containerClassName: string) => {\n let buttonManager = createButtonManager(buttonMap, utils, bottom, containerClassName);\n let shouldHide = false;\n\n const hide = () => {\n buttonManager.hide();\n };\n\n const update = (view: EditorView, prevState?: EditorState) => {\n const { state } = view;\n\n if (!view.editable || shouldHide) {\n hide();\n return;\n }\n\n const isEqualSelection = prevState?.doc.eq(state.doc) && prevState.selection.eq(state.selection);\n if (isEqualSelection) return;\n\n buttonManager.update(view);\n };\n\n return {\n recreate: (editorView: EditorView) => {\n buttonManager = createButtonManager(buttonMap, utils, bottom, containerClassName);\n buttonManager.render(editorView);\n update(editorView);\n },\n update,\n destroy: () => {\n buttonManager.destroy();\n },\n render: (editorView: EditorView) => {\n buttonManager.render(editorView);\n update(editorView);\n },\n setHide: (isTyping: boolean) => {\n shouldHide = isTyping;\n },\n };\n};\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { Plugin, PluginKey } from '@milkdown/prose/state';\nimport { AtomList, createPlugin as create } from '@milkdown/utils';\n\nimport { buttonMap, TooltipOptions } from './item';\nimport { createPlugin } from './selection-marks-tooltip';\n\nexport const key = new PluginKey('MILKDOWN_TOOLTIP');\nexport * from './item';\n\nexport const tooltipPlugin = create<string, TooltipOptions>((utils, options) => {\n return {\n id: 'tooltip',\n prosePlugins: (_, ctx) => {\n const manager = createPlugin(buttonMap(ctx, options?.items), utils, options?.bottom ?? false, 'tooltip');\n const plugin = new Plugin({\n key,\n props: {\n handleClick: (view) => {\n manager.setHide(false);\n manager.update(view);\n return false;\n },\n handleDOMEvents: {\n mousedown: () => {\n manager.setHide(false);\n return false;\n },\n },\n },\n view: (editorView) => {\n manager.recreate(editorView);\n return {\n update: manager.update,\n destroy: manager.destroy,\n };\n },\n });\n return [plugin];\n },\n };\n});\n\nexport const tooltip = AtomList.create([tooltipPlugin()]);\n"],"names":["create"],"mappings":"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"}
1
+ {"version":3,"file":"index.es.js","sources":["../src/utility/prosemirror.ts","../src/item.ts","../src/button-manager/calc-button-pos.ts","../src/button-manager/style.ts","../src/button-manager/create-tooltip.ts","../src/button-manager/no-active.ts","../src/button-manager/filter-button.ts","../src/button-manager/index.ts","../src/selection-marks-tooltip.ts","../src/index.ts"],"sourcesContent":["/* Copyright 2021, Milkdown by Mirone. */\nimport { findParentNode } from '@milkdown/prose';\nimport { MarkType, Node, NodeType } from '@milkdown/prose/model';\nimport { EditorState, TextSelection } from '@milkdown/prose/state';\n\nexport type Position = {\n start: number;\n end: number;\n};\n\nexport const hasMark = (editorState: EditorState, type?: MarkType): boolean => {\n if (!type) {\n return false;\n }\n const { from, to } = editorState.selection;\n\n return editorState.doc.rangeHasMark(from, from === to ? to + 1 : to, type);\n};\n\nexport const isTextSelection = (editorState: EditorState): boolean => {\n const { selection } = editorState;\n if (selection instanceof TextSelection) {\n const text = editorState.doc.textBetween(selection.from, selection.to);\n\n if (!text) return false;\n\n return true;\n }\n return false;\n};\n\nexport const isInCodeFence = (editorState: EditorState): boolean =>\n Boolean(findParentNode((node) => !!node.type.spec.code)(editorState.selection));\n\nexport const isTextAndNotHasMark = (editorState: EditorState, mark?: MarkType): boolean =>\n !isTextSelection(editorState) || isInCodeFence(editorState) || hasMark(editorState, mark);\n\nexport const equalNodeType = (nodeType: NodeType, node: Node) => {\n return (Array.isArray(nodeType) && nodeType.indexOf(node.type) > -1) || node.type === nodeType;\n};\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { commandsCtx, Ctx, schemaCtx, ThemeIcon, themeManagerCtx } from '@milkdown/core';\nimport type { Icon } from '@milkdown/design-system';\nimport type { MarkType } from '@milkdown/prose/model';\nimport { EditorView } from '@milkdown/prose/view';\n\nimport { hasMark, isTextAndNotHasMark } from './utility';\n\nexport type Pred = (view: EditorView) => boolean;\nexport type Updater = (view: EditorView, $: HTMLElement) => void;\nexport type Event2Command = (e: Event) => void;\n\nexport type OnClick = (ctx: Ctx) => void;\n\nexport type Item = {\n icon: Icon | ((ctx: Ctx) => HTMLElement);\n onClick: string | ((ctx: Ctx) => () => void);\n isHidden: (ctx: Ctx) => Pred;\n isActive: (ctx: Ctx) => Pred;\n canAddToDOM: (ctx: Ctx) => Pred;\n};\n\nexport type ButtonItem = {\n $: HTMLElement;\n command: () => void;\n active: Pred;\n disable?: Pred;\n enable: Pred;\n};\n\nexport const createToggleIcon = (icon: Icon, onClick: string, mark?: MarkType, disableForMark?: MarkType): Item => ({\n icon,\n onClick,\n isHidden: () => (view: EditorView) => isTextAndNotHasMark(view.state, disableForMark),\n isActive: () => (view: EditorView) => hasMark(view.state, mark),\n canAddToDOM: () => (view: EditorView) => !!mark && !!view.state.schema.marks[mark.name],\n});\n\nexport const defaultButtons = (ctx: Ctx) => {\n const marks = ctx.get(schemaCtx).marks;\n return [\n createToggleIcon('bold', 'ToggleBold', marks['strong']),\n createToggleIcon('italic', 'ToggleItalic', marks['em']),\n createToggleIcon('strikeThrough', 'ToggleStrikeThrough', marks['strike_through']),\n createToggleIcon('code', 'ToggleInlineCode', marks['code_inline']),\n createToggleIcon('link', 'ToggleLink', marks['link']),\n ];\n};\n\nexport type ButtonList = ButtonItem[];\n\nexport type TooltipOptions = {\n bottom: boolean;\n items: (ctx: Ctx) => Array<Item>;\n};\n\nexport const buttonMap = (ctx: Ctx, items: (ctx: Ctx) => Array<Item> = defaultButtons): ButtonList => {\n const toButton = ({ icon, onClick, isHidden, isActive, canAddToDOM }: Item): ButtonItem => ({\n $: typeof icon === 'function' ? icon(ctx) : (ctx.get(themeManagerCtx).get(ThemeIcon, icon)?.dom as HTMLElement),\n command: typeof onClick === 'string' ? () => ctx.get(commandsCtx).call(onClick) : onClick(ctx),\n disable: isHidden(ctx),\n active: isActive(ctx),\n enable: canAddToDOM(ctx),\n });\n return items(ctx).map(toButton);\n};\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { missingRootElement } from '@milkdown/exception';\nimport { calculateTextPosition } from '@milkdown/prose';\nimport { EditorView } from '@milkdown/prose/view';\n\nexport const calcButtonPos = (buttons: HTMLElement, view: EditorView, isBottom: boolean) => {\n buttons.classList.remove('hide');\n calculateTextPosition(view, buttons, (start, end, target, parent) => {\n const $editor = buttons.parentElement;\n if (!$editor) {\n throw missingRootElement();\n }\n const selectionWidth = end.left - start.left;\n let left = start.left - parent.left - (target.width - selectionWidth) / 2;\n let top = start.top - parent.top - target.height - 14 + $editor.scrollTop;\n\n if (left < 0) left = 0;\n\n const maxLeft = $editor.clientWidth - (target.width + 4);\n if (left > maxLeft) {\n left = maxLeft;\n }\n\n if (top < $editor.scrollTop || (isBottom && parent.bottom - start.bottom > target.height)) {\n top = start.bottom - parent.top + 14 + $editor.scrollTop;\n }\n return [top, left];\n });\n};\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { Color, Emotion, ThemeBorder, ThemeColor, ThemeManager, ThemeShadow, ThemeSize } from '@milkdown/core';\n\nexport const injectStyle = (themeManager: ThemeManager, { css }: Emotion) => {\n const palette = (color: Color, opacity = 1) => themeManager.get(ThemeColor, [color, opacity]);\n const lineWidth = themeManager.get(ThemeSize, 'lineWidth');\n return css`\n display: inline-flex;\n cursor: pointer;\n justify-content: space-evenly;\n position: absolute;\n border-radius: ${themeManager.get(ThemeSize, 'radius')};\n z-index: 2;\n\n ${themeManager.get(ThemeBorder, undefined)}\n ${themeManager.get(ThemeShadow, undefined)}\n\n overflow: hidden;\n background: ${palette('surface')};\n\n .icon {\n position: relative;\n color: ${palette('solid', 0.87)};\n\n width: 48px;\n line-height: 48px;\n text-align: center;\n transition: all 0.4s ease-in-out;\n &:hover {\n background-color: ${palette('secondary', 0.12)};\n }\n &.active {\n color: ${palette('primary')};\n }\n &:not(:last-child)::after {\n content: '';\n position: absolute;\n top: 0;\n right: calc(-0.5 * ${lineWidth});\n width: ${lineWidth};\n bottom: 0;\n background: ${palette('line')};\n }\n }\n &.hide,\n .hide {\n display: none;\n }\n `;\n};\n","/* Copyright 2021, Milkdown by Mirone. */\nimport type { EditorView } from '@milkdown/prose/view';\nimport type { ThemeUtils } from '@milkdown/utils';\n\nimport type { ButtonList } from '../item';\nimport { injectStyle } from './style';\n\ntype Tooltip = {\n dom: HTMLDivElement;\n render: (editorView: EditorView) => void;\n};\n\nexport const createTooltip = (buttonMap: ButtonList, utils: ThemeUtils, className: string): Tooltip => {\n const div = document.createElement('div');\n utils.themeManager.onFlush(() => {\n const style = utils.getStyle((emotion) => injectStyle(utils.themeManager, emotion)) || '';\n if (style) {\n div.classList.add(style);\n }\n });\n\n div.classList.add(utils.getClassName({}, className));\n\n return {\n dom: div,\n render: (editorView: EditorView) => {\n buttonMap\n .filter((item) => item.enable(editorView) && item.$ != null)\n .forEach(({ $ }) => div.appendChild($));\n\n editorView.dom.parentNode?.appendChild(div);\n },\n };\n};\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { EditorView } from '@milkdown/prose/view';\n\nimport { ButtonList } from '../item';\n\nexport const noActive = (buttonMap: ButtonList, view: EditorView) => {\n return Object.values(buttonMap)\n .filter((item) => item.enable(view) && item.$ != null)\n .every(({ $ }) => $.classList.contains('hide'));\n};\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { EditorView } from '@milkdown/prose/view';\n\nimport { ButtonList } from '../item';\nimport { noActive } from './no-active';\n\nexport const filterButton = (buttons: ButtonList, view: EditorView) => {\n buttons\n .filter((item) => item.enable(view) && item.$ != null)\n .forEach((item) => {\n const disable = item.disable?.(view);\n if (disable) {\n item.$.classList.add('hide');\n return;\n }\n\n item.$.classList.remove('hide');\n\n const active = item.active(view);\n if (active) {\n item.$.classList.add('active');\n return;\n }\n item.$.classList.remove('active');\n });\n\n return noActive(buttons, view);\n};\n","/* Copyright 2021, Milkdown by Mirone. */\nimport type { EditorView } from '@milkdown/prose/view';\nimport type { ThemeUtils } from '@milkdown/utils';\n\nimport type { ButtonList } from '../item';\nimport { calcButtonPos } from './calc-button-pos';\nimport { createTooltip } from './create-tooltip';\nimport { filterButton } from './filter-button';\n\nexport const createButtonManager = (\n buttons: ButtonList,\n utils: ThemeUtils,\n bottom: boolean,\n containerClassName: string,\n) => {\n const { dom: buttonDOM, render } = createTooltip(buttons, utils, containerClassName);\n\n const onClick = (e: Event) => {\n const target = buttons.find(({ $ }) => e.target instanceof Element && $.contains(e.target));\n if (!target) return;\n\n e.stopPropagation();\n e.preventDefault();\n target.command();\n };\n\n const hide = () => {\n buttonDOM.classList.add('hide');\n };\n\n buttonDOM.addEventListener('mousedown', onClick);\n\n return {\n destroy: () => {\n buttonDOM.removeEventListener('mousedown', onClick);\n buttonDOM.remove();\n },\n hide,\n update: (editorView: EditorView) => {\n const noActive = filterButton(buttons, editorView);\n if (noActive) {\n hide();\n return;\n }\n calcButtonPos(buttonDOM, editorView, bottom);\n },\n render,\n };\n};\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { EditorState } from '@milkdown/prose/state';\nimport type { EditorView } from '@milkdown/prose/view';\nimport { ThemeUtils } from '@milkdown/utils';\n\nimport { createButtonManager } from './button-manager';\nimport type { ButtonList } from './item';\n\nexport const createPlugin = (buttonMap: ButtonList, utils: ThemeUtils, bottom: boolean, containerClassName: string) => {\n let buttonManager = createButtonManager(buttonMap, utils, bottom, containerClassName);\n let shouldHide = false;\n\n const hide = () => {\n buttonManager.hide();\n };\n\n const update = (view: EditorView, prevState?: EditorState) => {\n const { state } = view;\n\n if (!view.editable || shouldHide) {\n hide();\n return;\n }\n\n const isEqualSelection = prevState?.doc.eq(state.doc) && prevState.selection.eq(state.selection);\n if (isEqualSelection) return;\n\n buttonManager.update(view);\n };\n\n return {\n recreate: (editorView: EditorView) => {\n buttonManager = createButtonManager(buttonMap, utils, bottom, containerClassName);\n buttonManager.render(editorView);\n update(editorView);\n },\n update,\n destroy: () => {\n buttonManager.destroy();\n },\n render: (editorView: EditorView) => {\n buttonManager.render(editorView);\n update(editorView);\n },\n setHide: (isTyping: boolean) => {\n shouldHide = isTyping;\n },\n };\n};\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { Plugin, PluginKey } from '@milkdown/prose/state';\nimport { AtomList, createPlugin as create } from '@milkdown/utils';\n\nimport { buttonMap, TooltipOptions } from './item';\nimport { createPlugin } from './selection-marks-tooltip';\n\nexport const key = new PluginKey('MILKDOWN_TOOLTIP');\nexport * from './item';\n\nexport const tooltipPlugin = create<string, TooltipOptions>((utils, options) => {\n return {\n id: 'tooltip',\n prosePlugins: (_, ctx) => {\n const manager = createPlugin(buttonMap(ctx, options?.items), utils, options?.bottom ?? false, 'tooltip');\n const plugin = new Plugin({\n key,\n props: {\n handleClick: (view) => {\n manager.setHide(false);\n manager.update(view);\n return false;\n },\n handleDOMEvents: {\n mousedown: () => {\n manager.setHide(false);\n return false;\n },\n },\n },\n view: (editorView) => {\n manager.recreate(editorView);\n return {\n update: manager.update,\n destroy: manager.destroy,\n };\n },\n });\n return [plugin];\n },\n };\n});\n\nexport const tooltip = AtomList.create([tooltipPlugin()]);\n"],"names":["hasMark","editorState","type","from","to","isTextSelection","selection","TextSelection","isInCodeFence","findParentNode","node","isTextAndNotHasMark","mark","createToggleIcon","icon","onClick","disableForMark","view","defaultButtons","ctx","marks","schemaCtx","buttonMap","items","toButton","isHidden","isActive","canAddToDOM","_a","themeManagerCtx","ThemeIcon","commandsCtx","calcButtonPos","buttons","isBottom","calculateTextPosition","start","end","target","parent","$editor","missingRootElement","selectionWidth","left","top","maxLeft","injectStyle","themeManager","css","palette","color","opacity","ThemeColor","lineWidth","ThemeSize","ThemeBorder","ThemeShadow","createTooltip","utils","className","div","style","emotion","editorView","item","$","noActive","filterButton","createButtonManager","bottom","containerClassName","buttonDOM","render","e","hide","createPlugin","buttonManager","shouldHide","update","prevState","state","isTyping","key","PluginKey","tooltipPlugin","create","options","_","manager","Plugin","tooltip","AtomList"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@milkdown/plugin-tooltip",
3
- "version": "6.4.1",
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.4.1",
19
- "@milkdown/prose": "6.4.1",
20
- "@milkdown/design-system": "6.4.1"
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.4.1",
28
- "@milkdown/exception": "6.4.1",
27
+ "@milkdown/utils": "6.5.2",
28
+ "@milkdown/exception": "6.5.2",
29
29
  "tslib": "^2.4.0"
30
30
  },
31
31
  "nx": {
@@ -16,7 +16,12 @@ export const calcButtonPos = (buttons: HTMLElement, view: EditorView, isBottom:
16
16
 
17
17
  if (left < 0) left = 0;
18
18
 
19
- if (start.top - parent.top < target.height || (isBottom && parent.bottom - start.bottom > target.height)) {
19
+ const maxLeft = $editor.clientWidth - (target.width + 4);
20
+ if (left > maxLeft) {
21
+ left = maxLeft;
22
+ }
23
+
24
+ if (top < $editor.scrollTop || (isBottom && parent.bottom - start.bottom > target.height)) {
20
25
  top = start.bottom - parent.top + 14 + $editor.scrollTop;
21
26
  }
22
27
  return [top, left];