@pie-lib/editable-html-tip-tap 2.1.2-next.30 → 2.1.2-next.34
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/CHANGELOG.json +32 -0
- package/CHANGELOG.md +2532 -0
- package/LICENSE.md +5 -0
- package/lib/components/CharacterPicker.js +201 -0
- package/lib/components/CharacterPicker.js.map +1 -0
- package/lib/components/EditableHtml.js +376 -0
- package/lib/components/EditableHtml.js.map +1 -0
- package/lib/components/MenuBar.js +696 -0
- package/lib/components/MenuBar.js.map +1 -0
- package/lib/components/TiptapContainer.js +234 -0
- package/lib/components/TiptapContainer.js.map +1 -0
- package/lib/components/characters/characterUtils.js +378 -0
- package/lib/components/characters/characterUtils.js.map +1 -0
- package/lib/components/characters/custom-popper.js +44 -0
- package/lib/components/characters/custom-popper.js.map +1 -0
- package/lib/components/common/done-button.js +34 -0
- package/lib/components/common/done-button.js.map +1 -0
- package/lib/components/common/toolbar-buttons.js +144 -0
- package/lib/components/common/toolbar-buttons.js.map +1 -0
- package/lib/components/icons/CssIcon.js +25 -0
- package/lib/components/icons/CssIcon.js.map +1 -0
- package/lib/components/icons/RespArea.js +72 -0
- package/lib/components/icons/RespArea.js.map +1 -0
- package/lib/components/icons/TableIcons.js +53 -0
- package/lib/components/icons/TableIcons.js.map +1 -0
- package/lib/components/icons/TextAlign.js +157 -0
- package/lib/components/icons/TextAlign.js.map +1 -0
- package/lib/components/image/AltDialog.js +98 -0
- package/lib/components/image/AltDialog.js.map +1 -0
- package/lib/components/image/ImageToolbar.js +137 -0
- package/lib/components/image/ImageToolbar.js.map +1 -0
- package/lib/components/image/InsertImageHandler.js +135 -0
- package/lib/components/image/InsertImageHandler.js.map +1 -0
- package/lib/components/media/MediaDialog.js +594 -0
- package/lib/components/media/MediaDialog.js.map +1 -0
- package/lib/components/media/MediaToolbar.js +74 -0
- package/lib/components/media/MediaToolbar.js.map +1 -0
- package/lib/components/media/MediaWrapper.js +67 -0
- package/lib/components/media/MediaWrapper.js.map +1 -0
- package/lib/components/respArea/DragInTheBlank/DragInTheBlank.js +84 -0
- package/lib/components/respArea/DragInTheBlank/DragInTheBlank.js.map +1 -0
- package/lib/components/respArea/DragInTheBlank/choice.js +250 -0
- package/lib/components/respArea/DragInTheBlank/choice.js.map +1 -0
- package/lib/components/respArea/ExplicitConstructedResponse.js +136 -0
- package/lib/components/respArea/ExplicitConstructedResponse.js.map +1 -0
- package/lib/components/respArea/InlineDropdown.js +209 -0
- package/lib/components/respArea/InlineDropdown.js.map +1 -0
- package/lib/components/respArea/MathTemplated.js +130 -0
- package/lib/components/respArea/MathTemplated.js.map +1 -0
- package/lib/components/respArea/ToolbarIcon.js +81 -0
- package/lib/components/respArea/ToolbarIcon.js.map +1 -0
- package/lib/components/respArea/inlineDropdownUtils.js +67 -0
- package/lib/components/respArea/inlineDropdownUtils.js.map +1 -0
- package/lib/constants.js +11 -0
- package/lib/constants.js.map +1 -0
- package/lib/extensions/css.js +217 -0
- package/lib/extensions/css.js.map +1 -0
- package/lib/extensions/custom-toolbar-wrapper.js +92 -0
- package/lib/extensions/custom-toolbar-wrapper.js.map +1 -0
- package/lib/extensions/div-node.js +83 -0
- package/lib/extensions/div-node.js.map +1 -0
- package/lib/extensions/ensure-empty-root-div.js +48 -0
- package/lib/extensions/ensure-empty-root-div.js.map +1 -0
- package/lib/extensions/ensure-list-item-content-is-div.js +64 -0
- package/lib/extensions/ensure-list-item-content-is-div.js.map +1 -0
- package/lib/extensions/extended-list-item.js +15 -0
- package/lib/extensions/extended-list-item.js.map +1 -0
- package/lib/extensions/extended-table-cell.js +22 -0
- package/lib/extensions/extended-table-cell.js.map +1 -0
- package/lib/extensions/extended-table.js +75 -0
- package/lib/extensions/extended-table.js.map +1 -0
- package/lib/extensions/heading-paragraph.js +61 -0
- package/lib/extensions/heading-paragraph.js.map +1 -0
- package/lib/extensions/image-component.js +348 -0
- package/lib/extensions/image-component.js.map +1 -0
- package/lib/extensions/image.js +134 -0
- package/lib/extensions/image.js.map +1 -0
- package/lib/extensions/index.js +46 -0
- package/lib/extensions/index.js.map +1 -0
- package/lib/extensions/math.js +342 -0
- package/lib/extensions/math.js.map +1 -0
- package/lib/extensions/media.js +243 -0
- package/lib/extensions/media.js.map +1 -0
- package/lib/extensions/responseArea.js +446 -0
- package/lib/extensions/responseArea.js.map +1 -0
- package/lib/index.js +37 -0
- package/lib/index.js.map +1 -0
- package/lib/styles/editorContainerStyles.js +137 -0
- package/lib/styles/editorContainerStyles.js.map +1 -0
- package/lib/theme.js +8 -0
- package/lib/theme.js.map +1 -0
- package/lib/utils/helper.js +73 -0
- package/lib/utils/helper.js.map +1 -0
- package/lib/utils/size.js +26 -0
- package/lib/utils/size.js.map +1 -0
- package/package.json +24 -40
- package/src/__tests__/EditableHtml.test.jsx +554 -0
- package/src/__tests__/constants.test.js +19 -0
- package/src/__tests__/div-to-paragraph-conversion.test.jsx +125 -0
- package/src/__tests__/extensions.test.js +208 -0
- package/src/__tests__/index.test.jsx +154 -0
- package/src/__tests__/size-utils.test.js +64 -0
- package/src/__tests__/theme.test.js +17 -0
- package/src/components/CharacterPicker.jsx +207 -0
- package/src/components/EditableHtml.jsx +440 -0
- package/src/components/MenuBar.jsx +554 -0
- package/src/components/TiptapContainer.jsx +219 -0
- package/src/components/__tests__/AltDialog.test.jsx +147 -0
- package/src/components/__tests__/CharacterPicker.test.jsx +261 -0
- package/src/components/__tests__/CssIcon.test.jsx +46 -0
- package/src/components/__tests__/DragInTheBlank.test.jsx +255 -0
- package/src/components/__tests__/ExplicitConstructedResponse.test.jsx +204 -0
- package/src/components/__tests__/ImageToolbar.test.jsx +128 -0
- package/src/components/__tests__/InlineDropdown.test.jsx +388 -0
- package/src/components/__tests__/InsertImageHandler.test.js +161 -0
- package/src/components/__tests__/MediaDialog.test.jsx +293 -0
- package/src/components/__tests__/MediaToolbar.test.jsx +74 -0
- package/src/components/__tests__/MediaWrapper.test.jsx +81 -0
- package/src/components/__tests__/MenuBar.test.jsx +250 -0
- package/src/components/__tests__/RespArea.test.jsx +122 -0
- package/src/components/__tests__/TableIcons.test.jsx +149 -0
- package/src/components/__tests__/TextAlign.test.jsx +167 -0
- package/src/components/__tests__/TiptapContainer.test.jsx +138 -0
- package/src/components/__tests__/characterUtils.test.js +166 -0
- package/src/components/__tests__/choice.test.jsx +171 -0
- package/src/components/__tests__/custom-popper.test.jsx +82 -0
- package/src/components/__tests__/done-button.test.jsx +54 -0
- package/src/components/__tests__/toolbar-buttons.test.jsx +234 -0
- package/src/components/characters/characterUtils.js +447 -0
- package/src/components/characters/custom-popper.js +38 -0
- package/src/components/common/done-button.jsx +27 -0
- package/src/components/common/toolbar-buttons.jsx +122 -0
- package/src/components/icons/CssIcon.jsx +15 -0
- package/src/components/icons/RespArea.jsx +71 -0
- package/src/components/icons/TableIcons.jsx +52 -0
- package/src/components/icons/TextAlign.jsx +114 -0
- package/src/components/image/AltDialog.jsx +82 -0
- package/src/components/image/ImageToolbar.jsx +99 -0
- package/src/components/image/InsertImageHandler.js +107 -0
- package/src/components/media/MediaDialog.jsx +596 -0
- package/src/components/media/MediaToolbar.jsx +49 -0
- package/src/components/media/MediaWrapper.jsx +39 -0
- package/src/components/respArea/DragInTheBlank/DragInTheBlank.jsx +76 -0
- package/src/components/respArea/DragInTheBlank/choice.jsx +256 -0
- package/src/components/respArea/ExplicitConstructedResponse.jsx +135 -0
- package/src/components/respArea/InlineDropdown.jsx +220 -0
- package/src/components/respArea/MathTemplated.jsx +124 -0
- package/src/components/respArea/ToolbarIcon.jsx +66 -0
- package/src/components/respArea/__tests__/MathTemplated.test.jsx +210 -0
- package/src/components/respArea/inlineDropdownUtils.js +79 -0
- package/src/constants.js +5 -0
- package/src/extensions/__tests__/css.test.js +196 -0
- package/src/extensions/__tests__/custom-toolbar-wrapper.test.jsx +180 -0
- package/src/extensions/__tests__/divNode.test.js +87 -0
- package/src/extensions/__tests__/ensure-empty-root-div.test.js +57 -0
- package/src/extensions/__tests__/ensure-list-item-content-is-div.test.js +44 -0
- package/src/extensions/__tests__/extended-list-item.test.js +13 -0
- package/src/extensions/__tests__/extended-table-cell.test.js +22 -0
- package/src/extensions/__tests__/extended-table.test.js +183 -0
- package/src/extensions/__tests__/image-component.test.jsx +345 -0
- package/src/extensions/__tests__/image.test.js +237 -0
- package/src/extensions/__tests__/math.test.js +603 -0
- package/src/extensions/__tests__/media-node-view.test.jsx +298 -0
- package/src/extensions/__tests__/media.test.js +271 -0
- package/src/extensions/__tests__/responseArea.test.js +601 -0
- package/src/extensions/css.js +220 -0
- package/src/extensions/custom-toolbar-wrapper.jsx +78 -0
- package/src/extensions/div-node.js +86 -0
- package/src/extensions/ensure-empty-root-div.js +47 -0
- package/src/extensions/ensure-list-item-content-is-div.js +62 -0
- package/src/extensions/extended-list-item.js +10 -0
- package/src/extensions/extended-table-cell.js +19 -0
- package/src/extensions/extended-table.js +60 -0
- package/src/extensions/heading-paragraph.js +53 -0
- package/src/extensions/image-component.jsx +338 -0
- package/src/extensions/image.js +109 -0
- package/src/extensions/index.js +81 -0
- package/src/extensions/math.js +326 -0
- package/src/extensions/media.js +188 -0
- package/src/extensions/responseArea.js +401 -0
- package/src/index.jsx +5 -0
- package/src/styles/editorContainerStyles.js +145 -0
- package/src/theme.js +1 -0
- package/src/utils/__tests__/helper.test.js +126 -0
- package/src/utils/helper.js +69 -0
- package/src/utils/size.js +32 -0
- package/dist/components/CharacterPicker.d.ts +0 -31
- package/dist/components/CharacterPicker.js +0 -131
- package/dist/components/EditableHtml.d.ts +0 -11
- package/dist/components/EditableHtml.js +0 -291
- package/dist/components/MenuBar.d.ts +0 -11
- package/dist/components/MenuBar.js +0 -462
- package/dist/components/TiptapContainer.d.ts +0 -11
- package/dist/components/TiptapContainer.js +0 -154
- package/dist/components/characters/characterUtils.d.ts +0 -35
- package/dist/components/characters/characterUtils.js +0 -465
- package/dist/components/characters/custom-popper.d.ts +0 -14
- package/dist/components/characters/custom-popper.js +0 -32
- package/dist/components/common/done-button.d.ts +0 -30
- package/dist/components/common/done-button.js +0 -26
- package/dist/components/common/toolbar-buttons.d.ts +0 -38
- package/dist/components/common/toolbar-buttons.js +0 -91
- package/dist/components/icons/CssIcon.d.ts +0 -11
- package/dist/components/icons/CssIcon.js +0 -14
- package/dist/components/icons/RespArea.d.ts +0 -26
- package/dist/components/icons/RespArea.js +0 -42
- package/dist/components/icons/TableIcons.d.ts +0 -14
- package/dist/components/icons/TableIcons.js +0 -32
- package/dist/components/icons/TextAlign.d.ts +0 -18
- package/dist/components/icons/TextAlign.js +0 -134
- package/dist/components/image/AltDialog.d.ts +0 -22
- package/dist/components/image/AltDialog.js +0 -61
- package/dist/components/image/ImageToolbar.d.ts +0 -24
- package/dist/components/image/ImageToolbar.js +0 -80
- package/dist/components/image/InsertImageHandler.d.ts +0 -32
- package/dist/components/image/InsertImageHandler.js +0 -53
- package/dist/components/media/MediaDialog.d.ts +0 -43
- package/dist/components/media/MediaDialog.js +0 -389
- package/dist/components/media/MediaToolbar.d.ts +0 -19
- package/dist/components/media/MediaToolbar.js +0 -41
- package/dist/components/media/MediaWrapper.d.ts +0 -19
- package/dist/components/respArea/DragInTheBlank/DragInTheBlank.d.ts +0 -23
- package/dist/components/respArea/DragInTheBlank/DragInTheBlank.js +0 -58
- package/dist/components/respArea/DragInTheBlank/choice.d.ts +0 -56
- package/dist/components/respArea/DragInTheBlank/choice.js +0 -156
- package/dist/components/respArea/ExplicitConstructedResponse.d.ts +0 -20
- package/dist/components/respArea/ExplicitConstructedResponse.js +0 -83
- package/dist/components/respArea/InlineDropdown.d.ts +0 -18
- package/dist/components/respArea/InlineDropdown.js +0 -119
- package/dist/components/respArea/MathTemplated.d.ts +0 -19
- package/dist/components/respArea/MathTemplated.js +0 -97
- package/dist/components/respArea/ToolbarIcon.d.ts +0 -14
- package/dist/components/respArea/ToolbarIcon.js +0 -17
- package/dist/components/respArea/inlineDropdownUtils.d.ts +0 -15
- package/dist/components/respArea/inlineDropdownUtils.js +0 -15
- package/dist/constants.d.ts +0 -13
- package/dist/constants.js +0 -4
- package/dist/extensions/css.d.ts +0 -11
- package/dist/extensions/css.js +0 -115
- package/dist/extensions/custom-toolbar-wrapper.d.ts +0 -11
- package/dist/extensions/custom-toolbar-wrapper.js +0 -61
- package/dist/extensions/div-node.d.ts +0 -10
- package/dist/extensions/div-node.js +0 -42
- package/dist/extensions/ensure-empty-root-div.d.ts +0 -14
- package/dist/extensions/ensure-empty-root-div.js +0 -24
- package/dist/extensions/ensure-list-item-content-is-div.d.ts +0 -15
- package/dist/extensions/ensure-list-item-content-is-div.js +0 -31
- package/dist/extensions/extended-list-item.d.ts +0 -13
- package/dist/extensions/extended-list-item.js +0 -5
- package/dist/extensions/extended-table-cell.d.ts +0 -10
- package/dist/extensions/extended-table-cell.js +0 -6
- package/dist/extensions/extended-table.d.ts +0 -17
- package/dist/extensions/extended-table.js +0 -34
- package/dist/extensions/heading-paragraph.d.ts +0 -17
- package/dist/extensions/heading-paragraph.js +0 -30
- package/dist/extensions/image-component.d.ts +0 -22
- package/dist/extensions/image-component.js +0 -220
- package/dist/extensions/image.d.ts +0 -10
- package/dist/extensions/image.js +0 -68
- package/dist/extensions/index.d.ts +0 -16
- package/dist/extensions/index.js +0 -64
- package/dist/extensions/math.d.ts +0 -15
- package/dist/extensions/math.js +0 -158
- package/dist/extensions/media.d.ts +0 -19
- package/dist/extensions/media.js +0 -149
- package/dist/extensions/responseArea.d.ts +0 -27
- package/dist/extensions/responseArea.js +0 -259
- package/dist/index.d.ts +0 -13
- package/dist/index.js +0 -7
- package/dist/node_modules/.bun/clsx@2.1.1/node_modules/clsx/dist/clsx.js +0 -16
- package/dist/styles/editorContainerStyles.d.ts +0 -134
- package/dist/theme.d.ts +0 -9
- package/dist/utils/helper.d.ts +0 -9
- package/dist/utils/helper.js +0 -27
- package/dist/utils/size.d.ts +0 -9
- package/dist/utils/size.js +0 -14
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.ZeroWidthSpaceHandlingPlugin = exports.MathNodeView = exports.MathNode = exports.EnsureTextAfterMathPlugin = void 0;
|
|
9
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
10
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
11
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
12
|
+
var _reactDom = _interopRequireDefault(require("react-dom"));
|
|
13
|
+
var _core = require("@tiptap/core");
|
|
14
|
+
var _react2 = require("@tiptap/react");
|
|
15
|
+
var _prosemirrorState = require("prosemirror-state");
|
|
16
|
+
var _mathToolbar = require("@pie-lib/math-toolbar");
|
|
17
|
+
var _mathRendering = require("@pie-lib/math-rendering");
|
|
18
|
+
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
|
|
19
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
20
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
21
|
+
var ensureTextAfterMathPluginKey = new _prosemirrorState.PluginKey('ensureTextAfterMath');
|
|
22
|
+
var generateAdditionalKeys = function generateAdditionalKeys() {
|
|
23
|
+
var keyData = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
|
|
24
|
+
return keyData.map(function (key) {
|
|
25
|
+
return {
|
|
26
|
+
name: key,
|
|
27
|
+
latex: key,
|
|
28
|
+
write: key,
|
|
29
|
+
label: key
|
|
30
|
+
};
|
|
31
|
+
});
|
|
32
|
+
};
|
|
33
|
+
var EnsureTextAfterMathPlugin = exports.EnsureTextAfterMathPlugin = function EnsureTextAfterMathPlugin(mathNodeName) {
|
|
34
|
+
return new _prosemirrorState.Plugin({
|
|
35
|
+
key: ensureTextAfterMathPluginKey,
|
|
36
|
+
appendTransaction: function appendTransaction(transactions, oldState, newState) {
|
|
37
|
+
// Only act when the doc actually changed
|
|
38
|
+
if (!transactions.some(function (tr) {
|
|
39
|
+
return tr.docChanged;
|
|
40
|
+
})) return null;
|
|
41
|
+
var tr = newState.tr;
|
|
42
|
+
var changed = false;
|
|
43
|
+
newState.doc.descendants(function (node, pos) {
|
|
44
|
+
if (node.type.name === mathNodeName) {
|
|
45
|
+
var nextPos = pos + node.nodeSize;
|
|
46
|
+
var nextNode = newState.doc.nodeAt(nextPos);
|
|
47
|
+
|
|
48
|
+
// If there's no node after, or the next node isn't text, insert a space
|
|
49
|
+
if (!nextNode || nextNode.type.name !== 'text') {
|
|
50
|
+
tr.insert(nextPos, newState.schema.text("\u200B"));
|
|
51
|
+
changed = true;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
return changed ? tr : null;
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
};
|
|
59
|
+
var ZeroWidthSpaceHandlingPlugin = exports.ZeroWidthSpaceHandlingPlugin = new _prosemirrorState.Plugin({
|
|
60
|
+
key: new _prosemirrorState.PluginKey('zeroWidthSpaceHandling'),
|
|
61
|
+
props: {
|
|
62
|
+
handleKeyDown: function handleKeyDown(view, event) {
|
|
63
|
+
var state = view.state,
|
|
64
|
+
dispatch = view.dispatch;
|
|
65
|
+
var selection = state.selection,
|
|
66
|
+
doc = state.doc;
|
|
67
|
+
var from = selection.from,
|
|
68
|
+
empty = selection.empty;
|
|
69
|
+
if (empty && event.key === 'Backspace' && from > 0) {
|
|
70
|
+
var prevChar = doc.textBetween(from - 1, from, "\uFFFC", "\uFFFC");
|
|
71
|
+
if (prevChar === "\u200B") {
|
|
72
|
+
var tr = state.tr["delete"](from - 2, from);
|
|
73
|
+
dispatch(tr);
|
|
74
|
+
return true; // handled
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
if (empty && event.key === 'ArrowLeft' && from > 0) {
|
|
78
|
+
var _prevChar = doc.textBetween(from - 1, from, "\uFFFC", "\uFFFC");
|
|
79
|
+
// If the previous character is the zero-width space...
|
|
80
|
+
if (_prevChar === "\u200B") {
|
|
81
|
+
var posBefore = from - 1;
|
|
82
|
+
var resolved = state.doc.resolve(posBefore - 1); // look just before the zwsp
|
|
83
|
+
var maybeNode = resolved.nodeAfter || resolved.nodeBefore;
|
|
84
|
+
|
|
85
|
+
// Check if there's an inline selectable node (e.g., your math node)
|
|
86
|
+
if (maybeNode) {
|
|
87
|
+
var nodePos = posBefore - maybeNode.nodeSize;
|
|
88
|
+
var nodeResolved = state.doc.resolve(nodePos);
|
|
89
|
+
var _tr = state.tr.setSelection(_prosemirrorState.NodeSelection.create(state.doc, nodeResolved.pos));
|
|
90
|
+
dispatch(_tr);
|
|
91
|
+
return true;
|
|
92
|
+
} else {
|
|
93
|
+
// Just move the text cursor before the zwsp
|
|
94
|
+
var _tr2 = state.tr.setSelection(_prosemirrorState.TextSelection.create(state.doc, from - 2));
|
|
95
|
+
dispatch(_tr2);
|
|
96
|
+
return true;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
var MathNode = exports.MathNode = _core.Node.create({
|
|
105
|
+
name: 'math',
|
|
106
|
+
group: 'inline',
|
|
107
|
+
inline: true,
|
|
108
|
+
atom: true,
|
|
109
|
+
addAttributes: function addAttributes() {
|
|
110
|
+
return {
|
|
111
|
+
latex: {
|
|
112
|
+
"default": ''
|
|
113
|
+
},
|
|
114
|
+
wrapper: {
|
|
115
|
+
"default": null
|
|
116
|
+
},
|
|
117
|
+
html: {
|
|
118
|
+
"default": null
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
},
|
|
122
|
+
addProseMirrorPlugins: function addProseMirrorPlugins() {
|
|
123
|
+
return [EnsureTextAfterMathPlugin(this.name), ZeroWidthSpaceHandlingPlugin];
|
|
124
|
+
},
|
|
125
|
+
parseHTML: function parseHTML() {
|
|
126
|
+
return [{
|
|
127
|
+
tag: 'span[data-latex]',
|
|
128
|
+
getAttrs: function getAttrs(el) {
|
|
129
|
+
return {
|
|
130
|
+
latex: el.getAttribute('data-raw') || el.textContent
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
}, {
|
|
134
|
+
tag: 'span[data-type="mathml"]',
|
|
135
|
+
getAttrs: function getAttrs(el) {
|
|
136
|
+
return {
|
|
137
|
+
html: el.innerHTML
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
}];
|
|
141
|
+
},
|
|
142
|
+
addCommands: function addCommands() {
|
|
143
|
+
var _this = this;
|
|
144
|
+
return {
|
|
145
|
+
insertMath: function insertMath() {
|
|
146
|
+
var latex = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
|
|
147
|
+
return function (_ref) {
|
|
148
|
+
var _node$type;
|
|
149
|
+
var tr = _ref.tr,
|
|
150
|
+
editor = _ref.editor,
|
|
151
|
+
dispatch = _ref.dispatch;
|
|
152
|
+
var state = editor.view.state;
|
|
153
|
+
var node = state.schema.nodes.math.create({
|
|
154
|
+
latex: latex
|
|
155
|
+
});
|
|
156
|
+
var selection = state.selection;
|
|
157
|
+
|
|
158
|
+
// The inserted node is typically just before the cursor
|
|
159
|
+
var pos = selection.$from.pos;
|
|
160
|
+
tr.insert(pos, node);
|
|
161
|
+
if ((node === null || node === void 0 || (_node$type = node.type) === null || _node$type === void 0 ? void 0 : _node$type.name) === _this.name) {
|
|
162
|
+
// Create a NodeSelection from the current doc
|
|
163
|
+
var sel = _prosemirrorState.NodeSelection.create(tr.doc, selection.$from.pos);
|
|
164
|
+
|
|
165
|
+
// Build a fresh transaction from the current state and set the selection
|
|
166
|
+
tr.setSelection(sel);
|
|
167
|
+
}
|
|
168
|
+
dispatch(tr);
|
|
169
|
+
return true;
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
// insertMath: (latex = '') => ({ commands }) => {
|
|
173
|
+
// return commands.insertContent({
|
|
174
|
+
// type: this.name,
|
|
175
|
+
// attrs: { latex },
|
|
176
|
+
// });
|
|
177
|
+
// },
|
|
178
|
+
};
|
|
179
|
+
},
|
|
180
|
+
renderHTML: function renderHTML(_ref2) {
|
|
181
|
+
var HTMLAttributes = _ref2.HTMLAttributes;
|
|
182
|
+
if (HTMLAttributes.html) {
|
|
183
|
+
return ['span', {
|
|
184
|
+
'data-type': 'mathml',
|
|
185
|
+
dangerouslySetInnerHTML: {
|
|
186
|
+
__html: HTMLAttributes.html
|
|
187
|
+
}
|
|
188
|
+
}];
|
|
189
|
+
}
|
|
190
|
+
return ['span', {
|
|
191
|
+
'data-latex': '',
|
|
192
|
+
'data-raw': HTMLAttributes.latex
|
|
193
|
+
}, (0, _mathRendering.wrapMath)(HTMLAttributes.latex, HTMLAttributes.wrapper)];
|
|
194
|
+
},
|
|
195
|
+
addNodeView: function addNodeView() {
|
|
196
|
+
var _this2 = this;
|
|
197
|
+
return (0, _react2.ReactNodeViewRenderer)(function (props) {
|
|
198
|
+
return /*#__PURE__*/_react["default"].createElement(MathNodeView, _objectSpread(_objectSpread({}, props), {}, {
|
|
199
|
+
options: _this2.options
|
|
200
|
+
}));
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
var MathNodeView = exports.MathNodeView = function MathNodeView(props) {
|
|
205
|
+
var node = props.node,
|
|
206
|
+
updateAttributes = props.updateAttributes,
|
|
207
|
+
editor = props.editor,
|
|
208
|
+
selected = props.selected,
|
|
209
|
+
options = props.options;
|
|
210
|
+
var _useState = (0, _react.useState)(selected),
|
|
211
|
+
_useState2 = (0, _slicedToArray2["default"])(_useState, 2),
|
|
212
|
+
showToolbar = _useState2[0],
|
|
213
|
+
setShowToolbar = _useState2[1];
|
|
214
|
+
var toolbarRef = (0, _react.useRef)(null);
|
|
215
|
+
var _useState3 = (0, _react.useState)({
|
|
216
|
+
top: 0,
|
|
217
|
+
left: 0
|
|
218
|
+
}),
|
|
219
|
+
_useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
|
|
220
|
+
position = _useState4[0],
|
|
221
|
+
setPosition = _useState4[1];
|
|
222
|
+
var _ref3 = options || {},
|
|
223
|
+
_ref3$math = _ref3.math,
|
|
224
|
+
mathOptions = _ref3$math === void 0 ? {} : _ref3$math;
|
|
225
|
+
var keypadMode = mathOptions.keypadMode,
|
|
226
|
+
_mathOptions$controll = mathOptions.controlledKeypadMode,
|
|
227
|
+
controlledKeypadMode = _mathOptions$controll === void 0 ? true : _mathOptions$controll,
|
|
228
|
+
_mathOptions$customKe = mathOptions.customKeys,
|
|
229
|
+
customKeys = _mathOptions$customKe === void 0 ? [] : _mathOptions$customKe,
|
|
230
|
+
keyPadCharacterRef = mathOptions.keyPadCharacterRef,
|
|
231
|
+
setKeypadInteraction = mathOptions.setKeypadInteraction;
|
|
232
|
+
var latex = node.attrs.latex || '';
|
|
233
|
+
var handleChange = function handleChange(newLatex) {
|
|
234
|
+
updateAttributes({
|
|
235
|
+
latex: newLatex
|
|
236
|
+
});
|
|
237
|
+
};
|
|
238
|
+
var handleDone = function handleDone(newLatex) {
|
|
239
|
+
updateAttributes({
|
|
240
|
+
latex: newLatex
|
|
241
|
+
});
|
|
242
|
+
setShowToolbar(false);
|
|
243
|
+
editor._toolbarOpened = false;
|
|
244
|
+
var _editor$state = editor.state,
|
|
245
|
+
selection = _editor$state.selection,
|
|
246
|
+
tr = _editor$state.tr,
|
|
247
|
+
doc = _editor$state.doc;
|
|
248
|
+
var sel = _prosemirrorState.TextSelection.create(doc, selection.from + 1);
|
|
249
|
+
|
|
250
|
+
// Build a fresh transaction from the current state and set the selection
|
|
251
|
+
tr.setSelection(sel);
|
|
252
|
+
editor.view.dispatch(tr);
|
|
253
|
+
editor.commands.focus();
|
|
254
|
+
};
|
|
255
|
+
(0, _react.useEffect)(function () {
|
|
256
|
+
if (selected) {
|
|
257
|
+
setShowToolbar(true);
|
|
258
|
+
}
|
|
259
|
+
}, [selected]);
|
|
260
|
+
(0, _react.useEffect)(function () {
|
|
261
|
+
editor._toolbarOpened = !!showToolbar;
|
|
262
|
+
}, [showToolbar]);
|
|
263
|
+
(0, _react.useEffect)(function () {
|
|
264
|
+
// Calculate position relative to selection
|
|
265
|
+
var from = editor.state.selection.from;
|
|
266
|
+
var start = editor.view.coordsAtPos(from);
|
|
267
|
+
setPosition({
|
|
268
|
+
top: 40,
|
|
269
|
+
// shift above
|
|
270
|
+
left: start.left
|
|
271
|
+
});
|
|
272
|
+
var handleClickOutside = function handleClickOutside(event) {
|
|
273
|
+
var _document$querySelect, _document, _target$closest, _target$closest2, _target$closest3;
|
|
274
|
+
var target = event === null || event === void 0 ? void 0 : event.target;
|
|
275
|
+
|
|
276
|
+
// MUI's `Select` renders its dropdown options in a portal attached to `document.body`.
|
|
277
|
+
// Those clicks should not dismiss the math toolbar.
|
|
278
|
+
var equationEditorListboxes = ((_document$querySelect = (_document = document).querySelectorAll) === null || _document$querySelect === void 0 ? void 0 : _document$querySelect.call(_document, '[id^="equation-editor-select"][id*="listbox"], [aria-labelledby="equation-editor-label"][role="listbox"]')) || [];
|
|
279
|
+
var equationEditorPopoverOpen = equationEditorListboxes.length > 0;
|
|
280
|
+
var clickedEquationEditorSelect = !!(target !== null && target !== void 0 && target.id && target.id.includes('equation-editor-select')) || !!(target !== null && target !== void 0 && (_target$closest = target.closest) !== null && _target$closest !== void 0 && _target$closest.call(target, '[id*="equation-editor-select"]'));
|
|
281
|
+
|
|
282
|
+
// If the click originated from the math node preview itself (the element
|
|
283
|
+
// that opens the toolbar), ignore it here — the node's own onClick handler
|
|
284
|
+
// will keep/re-open the toolbar. Without this guard, closing and then
|
|
285
|
+
// immediately clicking the math node would fire this listener in the same
|
|
286
|
+
// event cycle and close the toolbar before it could open.
|
|
287
|
+
var clickedMathNode = !!(target !== null && target !== void 0 && (_target$closest2 = target.closest) !== null && _target$closest2 !== void 0 && _target$closest2.call(target, '.math-node'));
|
|
288
|
+
if (toolbarRef.current && !toolbarRef.current.contains(target) && !(target !== null && target !== void 0 && (_target$closest3 = target.closest) !== null && _target$closest3 !== void 0 && _target$closest3.call(target, '[data-inline-node]')) && !equationEditorPopoverOpen && !clickedEquationEditorSelect && !clickedMathNode) {
|
|
289
|
+
setShowToolbar(false);
|
|
290
|
+
handleDone(node.attrs.latex);
|
|
291
|
+
}
|
|
292
|
+
};
|
|
293
|
+
if (showToolbar) {
|
|
294
|
+
// Use `click` (not `mousedown`) so interacting with browser UI like the scrollbar
|
|
295
|
+
// doesn't automatically dismiss the math toolbar.
|
|
296
|
+
document.addEventListener('click', handleClickOutside);
|
|
297
|
+
} else {
|
|
298
|
+
document.removeEventListener('click', handleClickOutside);
|
|
299
|
+
}
|
|
300
|
+
return function () {
|
|
301
|
+
return document.removeEventListener('click', handleClickOutside);
|
|
302
|
+
};
|
|
303
|
+
}, [editor, showToolbar]);
|
|
304
|
+
return /*#__PURE__*/_react["default"].createElement(_react2.NodeViewWrapper, {
|
|
305
|
+
className: "math-node",
|
|
306
|
+
style: {
|
|
307
|
+
display: 'inline-flex',
|
|
308
|
+
cursor: 'pointer',
|
|
309
|
+
margin: '0 4px'
|
|
310
|
+
},
|
|
311
|
+
"data-selected": selected
|
|
312
|
+
}, /*#__PURE__*/_react["default"].createElement("div", {
|
|
313
|
+
onClick: function onClick() {
|
|
314
|
+
return setShowToolbar(true);
|
|
315
|
+
},
|
|
316
|
+
contentEditable: false
|
|
317
|
+
}, /*#__PURE__*/_react["default"].createElement(_mathToolbar.MathPreview, {
|
|
318
|
+
latex: latex
|
|
319
|
+
})), showToolbar && /*#__PURE__*/_reactDom["default"].createPortal(/*#__PURE__*/_react["default"].createElement("div", {
|
|
320
|
+
ref: toolbarRef,
|
|
321
|
+
"data-toolbar-for": editor.instanceId,
|
|
322
|
+
style: {
|
|
323
|
+
position: 'absolute',
|
|
324
|
+
top: "".concat(position.top, "px"),
|
|
325
|
+
left: "".concat(position.left, "px"),
|
|
326
|
+
zIndex: 20,
|
|
327
|
+
background: 'var(--editable-html-toolbar-bg, #efefef)',
|
|
328
|
+
boxShadow: '0px 1px 5px 0px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 3px 1px -2px rgba(0, 0, 0, 0.12)'
|
|
329
|
+
}
|
|
330
|
+
}, /*#__PURE__*/_react["default"].createElement(_mathToolbar.MathToolbar, {
|
|
331
|
+
latex: latex,
|
|
332
|
+
autoFocus: true,
|
|
333
|
+
onChange: handleChange,
|
|
334
|
+
onDone: handleDone,
|
|
335
|
+
keypadMode: keypadMode,
|
|
336
|
+
controlledKeypadMode: controlledKeypadMode,
|
|
337
|
+
additionalKeys: generateAdditionalKeys(customKeys),
|
|
338
|
+
keyPadCharacterRef: keyPadCharacterRef,
|
|
339
|
+
setKeypadInteraction: setKeypadInteraction
|
|
340
|
+
})), (editor === null || editor === void 0 ? void 0 : editor._tiptapContainerEl) || document.body));
|
|
341
|
+
};
|
|
342
|
+
//# sourceMappingURL=math.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"math.js","names":["_react","_interopRequireWildcard","require","_reactDom","_interopRequireDefault","_core","_react2","_prosemirrorState","_mathToolbar","_mathRendering","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","_typeof","has","get","set","_t","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","ownKeys","keys","getOwnPropertySymbols","filter","enumerable","push","apply","_objectSpread","arguments","length","forEach","_defineProperty2","getOwnPropertyDescriptors","defineProperties","ensureTextAfterMathPluginKey","PluginKey","generateAdditionalKeys","keyData","undefined","map","key","name","latex","write","label","EnsureTextAfterMathPlugin","exports","mathNodeName","Plugin","appendTransaction","transactions","oldState","newState","some","tr","docChanged","changed","doc","descendants","node","pos","type","nextPos","nodeSize","nextNode","nodeAt","insert","schema","text","ZeroWidthSpaceHandlingPlugin","props","handleKeyDown","view","event","state","dispatch","selection","from","empty","prevChar","textBetween","posBefore","resolved","resolve","maybeNode","nodeAfter","nodeBefore","nodePos","nodeResolved","setSelection","NodeSelection","create","TextSelection","MathNode","Node","group","inline","atom","addAttributes","wrapper","html","addProseMirrorPlugins","parseHTML","tag","getAttrs","el","getAttribute","textContent","innerHTML","addCommands","_this","insertMath","_ref","_node$type","editor","nodes","math","$from","sel","renderHTML","_ref2","HTMLAttributes","dangerouslySetInnerHTML","__html","wrapMath","addNodeView","_this2","ReactNodeViewRenderer","createElement","MathNodeView","options","updateAttributes","selected","_useState","useState","_useState2","_slicedToArray2","showToolbar","setShowToolbar","toolbarRef","useRef","_useState3","top","left","_useState4","position","setPosition","_ref3","_ref3$math","mathOptions","keypadMode","_mathOptions$controll","controlledKeypadMode","_mathOptions$customKe","customKeys","keyPadCharacterRef","setKeypadInteraction","attrs","handleChange","newLatex","handleDone","_toolbarOpened","_editor$state","commands","focus","useEffect","start","coordsAtPos","handleClickOutside","_document$querySelect","_document","_target$closest","_target$closest2","_target$closest3","target","equationEditorListboxes","document","querySelectorAll","equationEditorPopoverOpen","clickedEquationEditorSelect","id","includes","closest","clickedMathNode","current","contains","addEventListener","removeEventListener","NodeViewWrapper","className","style","display","cursor","margin","onClick","contentEditable","MathPreview","ReactDOM","createPortal","ref","instanceId","concat","zIndex","background","boxShadow","MathToolbar","autoFocus","onChange","onDone","additionalKeys","_tiptapContainerEl","body"],"sources":["../../src/extensions/math.js"],"sourcesContent":["import React, { useEffect, useRef, useState } from 'react';\nimport ReactDOM from 'react-dom';\nimport { Node } from '@tiptap/core';\nimport { NodeViewWrapper, ReactNodeViewRenderer } from '@tiptap/react';\nimport { NodeSelection, Plugin, PluginKey, TextSelection } from 'prosemirror-state';\nimport { MathPreview, MathToolbar } from '@pie-lib/math-toolbar';\nimport { wrapMath } from '@pie-lib/math-rendering';\n\nconst ensureTextAfterMathPluginKey = new PluginKey('ensureTextAfterMath');\n\nconst generateAdditionalKeys = (keyData = []) => {\n return keyData.map((key) => ({\n name: key,\n latex: key,\n write: key,\n label: key,\n }));\n};\n\nexport const EnsureTextAfterMathPlugin = (mathNodeName) =>\n new Plugin({\n key: ensureTextAfterMathPluginKey,\n appendTransaction: (transactions, oldState, newState) => {\n // Only act when the doc actually changed\n if (!transactions.some((tr) => tr.docChanged)) return null;\n\n const tr = newState.tr;\n let changed = false;\n\n newState.doc.descendants((node, pos) => {\n if (node.type.name === mathNodeName) {\n const nextPos = pos + node.nodeSize;\n const nextNode = newState.doc.nodeAt(nextPos);\n\n // If there's no node after, or the next node isn't text, insert a space\n if (!nextNode || nextNode.type.name !== 'text') {\n tr.insert(nextPos, newState.schema.text('\\u200b'));\n changed = true;\n }\n }\n });\n\n return changed ? tr : null;\n },\n });\n\nexport const ZeroWidthSpaceHandlingPlugin = new Plugin({\n key: new PluginKey('zeroWidthSpaceHandling'),\n props: {\n handleKeyDown(view, event) {\n const { state, dispatch } = view;\n const { selection, doc } = state;\n const { from, empty } = selection;\n\n if (empty && event.key === 'Backspace' && from > 0) {\n const prevChar = doc.textBetween(from - 1, from, '\\uFFFC', '\\uFFFC');\n if (prevChar === '\\u200b') {\n const tr = state.tr.delete(from - 2, from);\n dispatch(tr);\n return true; // handled\n }\n }\n\n if (empty && event.key === 'ArrowLeft' && from > 0) {\n const prevChar = doc.textBetween(from - 1, from, '\\uFFFC', '\\uFFFC');\n // If the previous character is the zero-width space...\n if (prevChar === '\\u200b') {\n const posBefore = from - 1;\n const resolved = state.doc.resolve(posBefore - 1); // look just before the zwsp\n const maybeNode = resolved.nodeAfter || resolved.nodeBefore;\n\n // Check if there's an inline selectable node (e.g., your math node)\n if (maybeNode) {\n const nodePos = posBefore - maybeNode.nodeSize;\n const nodeResolved = state.doc.resolve(nodePos);\n const tr = state.tr.setSelection(NodeSelection.create(state.doc, nodeResolved.pos));\n dispatch(tr);\n return true;\n } else {\n // Just move the text cursor before the zwsp\n const tr = state.tr.setSelection(TextSelection.create(state.doc, from - 2));\n dispatch(tr);\n return true;\n }\n }\n }\n\n return false;\n },\n },\n});\n\nexport const MathNode = Node.create({\n name: 'math',\n group: 'inline',\n inline: true,\n atom: true,\n\n addAttributes() {\n return {\n latex: { default: '' },\n wrapper: { default: null },\n html: { default: null },\n };\n },\n\n addProseMirrorPlugins() {\n return [EnsureTextAfterMathPlugin(this.name), ZeroWidthSpaceHandlingPlugin];\n },\n\n parseHTML() {\n return [\n {\n tag: 'span[data-latex]',\n getAttrs: (el) => ({\n latex: el.getAttribute('data-raw') || el.textContent,\n }),\n },\n {\n tag: 'span[data-type=\"mathml\"]',\n getAttrs: (el) => ({\n html: el.innerHTML,\n }),\n },\n ];\n },\n\n addCommands() {\n return {\n insertMath:\n (latex = '') =>\n ({ tr, editor, dispatch }) => {\n const { state } = editor.view;\n const node = state.schema.nodes.math.create({\n latex,\n });\n const { selection } = state;\n\n // The inserted node is typically just before the cursor\n const pos = selection.$from.pos;\n\n tr.insert(pos, node);\n\n if (node?.type?.name === this.name) {\n // Create a NodeSelection from the current doc\n const sel = NodeSelection.create(tr.doc, selection.$from.pos);\n\n // Build a fresh transaction from the current state and set the selection\n tr.setSelection(sel);\n }\n\n dispatch(tr);\n\n return true;\n },\n // insertMath: (latex = '') => ({ commands }) => {\n // return commands.insertContent({\n // type: this.name,\n // attrs: { latex },\n // });\n // },\n };\n },\n\n renderHTML({ HTMLAttributes }) {\n if (HTMLAttributes.html) {\n return ['span', { 'data-type': 'mathml', dangerouslySetInnerHTML: { __html: HTMLAttributes.html } }];\n }\n\n return [\n 'span',\n { 'data-latex': '', 'data-raw': HTMLAttributes.latex },\n wrapMath(HTMLAttributes.latex, HTMLAttributes.wrapper),\n ];\n },\n\n addNodeView() {\n return ReactNodeViewRenderer((props) => <MathNodeView {...{ ...props, options: this.options }} />);\n },\n});\n\nexport const MathNodeView = (props) => {\n const { node, updateAttributes, editor, selected, options } = props;\n const [showToolbar, setShowToolbar] = useState(selected);\n const toolbarRef = useRef(null);\n const [position, setPosition] = useState({ top: 0, left: 0 });\n const { math: mathOptions = {} } = options || {};\n const {\n keypadMode,\n controlledKeypadMode = true,\n customKeys = [],\n keyPadCharacterRef,\n setKeypadInteraction,\n } = mathOptions;\n\n const latex = node.attrs.latex || '';\n\n const handleChange = (newLatex) => {\n updateAttributes({ latex: newLatex });\n };\n\n const handleDone = (newLatex) => {\n updateAttributes({ latex: newLatex });\n setShowToolbar(false);\n\n editor._toolbarOpened = false;\n\n const { selection, tr, doc } = editor.state;\n const sel = TextSelection.create(doc, selection.from + 1);\n\n // Build a fresh transaction from the current state and set the selection\n tr.setSelection(sel);\n editor.view.dispatch(tr);\n editor.commands.focus();\n };\n\n useEffect(() => {\n if (selected) {\n setShowToolbar(true);\n }\n }, [selected]);\n\n useEffect(() => {\n editor._toolbarOpened = !!showToolbar;\n }, [showToolbar]);\n\n useEffect(() => {\n // Calculate position relative to selection\n const { from } = editor.state.selection;\n const start = editor.view.coordsAtPos(from);\n setPosition({\n top: 40, // shift above\n left: start.left,\n });\n\n const handleClickOutside = (event) => {\n const target = event?.target;\n\n // MUI's `Select` renders its dropdown options in a portal attached to `document.body`.\n // Those clicks should not dismiss the math toolbar.\n const equationEditorListboxes =\n document.querySelectorAll?.(\n '[id^=\"equation-editor-select\"][id*=\"listbox\"], [aria-labelledby=\"equation-editor-label\"][role=\"listbox\"]',\n ) || [];\n\n const equationEditorPopoverOpen = equationEditorListboxes.length > 0;\n const clickedEquationEditorSelect =\n !!(target?.id && target.id.includes('equation-editor-select')) ||\n !!target?.closest?.('[id*=\"equation-editor-select\"]');\n\n // If the click originated from the math node preview itself (the element\n // that opens the toolbar), ignore it here — the node's own onClick handler\n // will keep/re-open the toolbar. Without this guard, closing and then\n // immediately clicking the math node would fire this listener in the same\n // event cycle and close the toolbar before it could open.\n const clickedMathNode = !!target?.closest?.('.math-node');\n\n if (\n toolbarRef.current &&\n !toolbarRef.current.contains(target) &&\n !target?.closest?.('[data-inline-node]') &&\n !equationEditorPopoverOpen &&\n !clickedEquationEditorSelect &&\n !clickedMathNode\n ) {\n setShowToolbar(false);\n handleDone(node.attrs.latex);\n }\n };\n\n if (showToolbar) {\n // Use `click` (not `mousedown`) so interacting with browser UI like the scrollbar\n // doesn't automatically dismiss the math toolbar.\n document.addEventListener('click', handleClickOutside);\n } else {\n document.removeEventListener('click', handleClickOutside);\n }\n\n return () => document.removeEventListener('click', handleClickOutside);\n }, [editor, showToolbar]);\n\n return (\n <NodeViewWrapper\n className=\"math-node\"\n style={{\n display: 'inline-flex',\n cursor: 'pointer',\n margin: '0 4px',\n }}\n data-selected={selected}\n >\n <div onClick={() => setShowToolbar(true)} contentEditable={false}>\n <MathPreview latex={latex} />\n </div>\n {showToolbar &&\n ReactDOM.createPortal(\n <div\n ref={toolbarRef}\n data-toolbar-for={editor.instanceId}\n style={{\n position: 'absolute',\n top: `${position.top}px`,\n left: `${position.left}px`,\n zIndex: 20,\n background: 'var(--editable-html-toolbar-bg, #efefef)',\n boxShadow:\n '0px 1px 5px 0px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 3px 1px -2px rgba(0, 0, 0, 0.12)',\n }}\n >\n <MathToolbar\n latex={latex}\n autoFocus\n onChange={handleChange}\n onDone={handleDone}\n keypadMode={keypadMode}\n controlledKeypadMode={controlledKeypadMode}\n additionalKeys={generateAdditionalKeys(customKeys)}\n keyPadCharacterRef={keyPadCharacterRef}\n setKeypadInteraction={setKeypadInteraction}\n />\n </div>,\n editor?._tiptapContainerEl || document.body,\n )}\n </NodeViewWrapper>\n );\n};\n"],"mappings":";;;;;;;;;;AAAA,IAAAA,MAAA,GAAAC,uBAAA,CAAAC,OAAA;AACA,IAAAC,SAAA,GAAAC,sBAAA,CAAAF,OAAA;AACA,IAAAG,KAAA,GAAAH,OAAA;AACA,IAAAI,OAAA,GAAAJ,OAAA;AACA,IAAAK,iBAAA,GAAAL,OAAA;AACA,IAAAM,YAAA,GAAAN,OAAA;AACA,IAAAO,cAAA,GAAAP,OAAA;AAAmD,SAAAD,wBAAAS,CAAA,EAAAC,CAAA,6BAAAC,OAAA,MAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAX,uBAAA,YAAAA,wBAAAS,CAAA,EAAAC,CAAA,SAAAA,CAAA,IAAAD,CAAA,IAAAA,CAAA,CAAAK,UAAA,SAAAL,CAAA,MAAAM,CAAA,EAAAC,CAAA,EAAAC,CAAA,KAAAC,SAAA,mBAAAT,CAAA,iBAAAA,CAAA,gBAAAU,OAAA,CAAAV,CAAA,0BAAAA,CAAA,SAAAQ,CAAA,MAAAF,CAAA,GAAAL,CAAA,GAAAG,CAAA,GAAAD,CAAA,QAAAG,CAAA,CAAAK,GAAA,CAAAX,CAAA,UAAAM,CAAA,CAAAM,GAAA,CAAAZ,CAAA,GAAAM,CAAA,CAAAO,GAAA,CAAAb,CAAA,EAAAQ,CAAA,cAAAM,EAAA,IAAAd,CAAA,gBAAAc,EAAA,OAAAC,cAAA,CAAAC,IAAA,CAAAhB,CAAA,EAAAc,EAAA,OAAAP,CAAA,IAAAD,CAAA,GAAAW,MAAA,CAAAC,cAAA,KAAAD,MAAA,CAAAE,wBAAA,CAAAnB,CAAA,EAAAc,EAAA,OAAAP,CAAA,CAAAK,GAAA,IAAAL,CAAA,CAAAM,GAAA,IAAAP,CAAA,CAAAE,CAAA,EAAAM,EAAA,EAAAP,CAAA,IAAAC,CAAA,CAAAM,EAAA,IAAAd,CAAA,CAAAc,EAAA,WAAAN,CAAA,KAAAR,CAAA,EAAAC,CAAA;AAAA,SAAAmB,QAAApB,CAAA,EAAAG,CAAA,QAAAF,CAAA,GAAAgB,MAAA,CAAAI,IAAA,CAAArB,CAAA,OAAAiB,MAAA,CAAAK,qBAAA,QAAAhB,CAAA,GAAAW,MAAA,CAAAK,qBAAA,CAAAtB,CAAA,GAAAG,CAAA,KAAAG,CAAA,GAAAA,CAAA,CAAAiB,MAAA,WAAApB,CAAA,WAAAc,MAAA,CAAAE,wBAAA,CAAAnB,CAAA,EAAAG,CAAA,EAAAqB,UAAA,OAAAvB,CAAA,CAAAwB,IAAA,CAAAC,KAAA,CAAAzB,CAAA,EAAAK,CAAA,YAAAL,CAAA;AAAA,SAAA0B,cAAA3B,CAAA,aAAAG,CAAA,MAAAA,CAAA,GAAAyB,SAAA,CAAAC,MAAA,EAAA1B,CAAA,UAAAF,CAAA,WAAA2B,SAAA,CAAAzB,CAAA,IAAAyB,SAAA,CAAAzB,CAAA,QAAAA,CAAA,OAAAiB,OAAA,CAAAH,MAAA,CAAAhB,CAAA,OAAA6B,OAAA,WAAA3B,CAAA,QAAA4B,gBAAA,aAAA/B,CAAA,EAAAG,CAAA,EAAAF,CAAA,CAAAE,CAAA,SAAAc,MAAA,CAAAe,yBAAA,GAAAf,MAAA,CAAAgB,gBAAA,CAAAjC,CAAA,EAAAiB,MAAA,CAAAe,yBAAA,CAAA/B,CAAA,KAAAmB,OAAA,CAAAH,MAAA,CAAAhB,CAAA,GAAA6B,OAAA,WAAA3B,CAAA,IAAAc,MAAA,CAAAC,cAAA,CAAAlB,CAAA,EAAAG,CAAA,EAAAc,MAAA,CAAAE,wBAAA,CAAAlB,CAAA,EAAAE,CAAA,iBAAAH,CAAA;AAEnD,IAAMkC,4BAA4B,GAAG,IAAIC,2BAAS,CAAC,qBAAqB,CAAC;AAEzE,IAAMC,sBAAsB,GAAG,SAAzBA,sBAAsBA,CAAA,EAAqB;EAAA,IAAjBC,OAAO,GAAAT,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAU,SAAA,GAAAV,SAAA,MAAG,EAAE;EAC1C,OAAOS,OAAO,CAACE,GAAG,CAAC,UAACC,GAAG;IAAA,OAAM;MAC3BC,IAAI,EAAED,GAAG;MACTE,KAAK,EAAEF,GAAG;MACVG,KAAK,EAAEH,GAAG;MACVI,KAAK,EAAEJ;IACT,CAAC;EAAA,CAAC,CAAC;AACL,CAAC;AAEM,IAAMK,yBAAyB,GAAAC,OAAA,CAAAD,yBAAA,GAAG,SAA5BA,yBAAyBA,CAAIE,YAAY;EAAA,OACpD,IAAIC,wBAAM,CAAC;IACTR,GAAG,EAAEN,4BAA4B;IACjCe,iBAAiB,EAAE,SAAnBA,iBAAiBA,CAAGC,YAAY,EAAEC,QAAQ,EAAEC,QAAQ,EAAK;MACvD;MACA,IAAI,CAACF,YAAY,CAACG,IAAI,CAAC,UAACC,EAAE;QAAA,OAAKA,EAAE,CAACC,UAAU;MAAA,EAAC,EAAE,OAAO,IAAI;MAE1D,IAAMD,EAAE,GAAGF,QAAQ,CAACE,EAAE;MACtB,IAAIE,OAAO,GAAG,KAAK;MAEnBJ,QAAQ,CAACK,GAAG,CAACC,WAAW,CAAC,UAACC,IAAI,EAAEC,GAAG,EAAK;QACtC,IAAID,IAAI,CAACE,IAAI,CAACpB,IAAI,KAAKM,YAAY,EAAE;UACnC,IAAMe,OAAO,GAAGF,GAAG,GAAGD,IAAI,CAACI,QAAQ;UACnC,IAAMC,QAAQ,GAAGZ,QAAQ,CAACK,GAAG,CAACQ,MAAM,CAACH,OAAO,CAAC;;UAE7C;UACA,IAAI,CAACE,QAAQ,IAAIA,QAAQ,CAACH,IAAI,CAACpB,IAAI,KAAK,MAAM,EAAE;YAC9Ca,EAAE,CAACY,MAAM,CAACJ,OAAO,EAAEV,QAAQ,CAACe,MAAM,CAACC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAClDZ,OAAO,GAAG,IAAI;UAChB;QACF;MACF,CAAC,CAAC;MAEF,OAAOA,OAAO,GAAGF,EAAE,GAAG,IAAI;IAC5B;EACF,CAAC,CAAC;AAAA;AAEG,IAAMe,4BAA4B,GAAAvB,OAAA,CAAAuB,4BAAA,GAAG,IAAIrB,wBAAM,CAAC;EACrDR,GAAG,EAAE,IAAIL,2BAAS,CAAC,wBAAwB,CAAC;EAC5CmC,KAAK,EAAE;IACLC,aAAa,WAAbA,aAAaA,CAACC,IAAI,EAAEC,KAAK,EAAE;MACzB,IAAQC,KAAK,GAAeF,IAAI,CAAxBE,KAAK;QAAEC,QAAQ,GAAKH,IAAI,CAAjBG,QAAQ;MACvB,IAAQC,SAAS,GAAUF,KAAK,CAAxBE,SAAS;QAAEnB,GAAG,GAAKiB,KAAK,CAAbjB,GAAG;MACtB,IAAQoB,IAAI,GAAYD,SAAS,CAAzBC,IAAI;QAAEC,KAAK,GAAKF,SAAS,CAAnBE,KAAK;MAEnB,IAAIA,KAAK,IAAIL,KAAK,CAACjC,GAAG,KAAK,WAAW,IAAIqC,IAAI,GAAG,CAAC,EAAE;QAClD,IAAME,QAAQ,GAAGtB,GAAG,CAACuB,WAAW,CAACH,IAAI,GAAG,CAAC,EAAEA,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC;QACpE,IAAIE,QAAQ,KAAK,QAAQ,EAAE;UACzB,IAAMzB,EAAE,GAAGoB,KAAK,CAACpB,EAAE,UAAO,CAACuB,IAAI,GAAG,CAAC,EAAEA,IAAI,CAAC;UAC1CF,QAAQ,CAACrB,EAAE,CAAC;UACZ,OAAO,IAAI,CAAC,CAAC;QACf;MACF;MAEA,IAAIwB,KAAK,IAAIL,KAAK,CAACjC,GAAG,KAAK,WAAW,IAAIqC,IAAI,GAAG,CAAC,EAAE;QAClD,IAAME,SAAQ,GAAGtB,GAAG,CAACuB,WAAW,CAACH,IAAI,GAAG,CAAC,EAAEA,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC;QACpE;QACA,IAAIE,SAAQ,KAAK,QAAQ,EAAE;UACzB,IAAME,SAAS,GAAGJ,IAAI,GAAG,CAAC;UAC1B,IAAMK,QAAQ,GAAGR,KAAK,CAACjB,GAAG,CAAC0B,OAAO,CAACF,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;UACnD,IAAMG,SAAS,GAAGF,QAAQ,CAACG,SAAS,IAAIH,QAAQ,CAACI,UAAU;;UAE3D;UACA,IAAIF,SAAS,EAAE;YACb,IAAMG,OAAO,GAAGN,SAAS,GAAGG,SAAS,CAACrB,QAAQ;YAC9C,IAAMyB,YAAY,GAAGd,KAAK,CAACjB,GAAG,CAAC0B,OAAO,CAACI,OAAO,CAAC;YAC/C,IAAMjC,GAAE,GAAGoB,KAAK,CAACpB,EAAE,CAACmC,YAAY,CAACC,+BAAa,CAACC,MAAM,CAACjB,KAAK,CAACjB,GAAG,EAAE+B,YAAY,CAAC5B,GAAG,CAAC,CAAC;YACnFe,QAAQ,CAACrB,GAAE,CAAC;YACZ,OAAO,IAAI;UACb,CAAC,MAAM;YACL;YACA,IAAMA,IAAE,GAAGoB,KAAK,CAACpB,EAAE,CAACmC,YAAY,CAACG,+BAAa,CAACD,MAAM,CAACjB,KAAK,CAACjB,GAAG,EAAEoB,IAAI,GAAG,CAAC,CAAC,CAAC;YAC3EF,QAAQ,CAACrB,IAAE,CAAC;YACZ,OAAO,IAAI;UACb;QACF;MACF;MAEA,OAAO,KAAK;IACd;EACF;AACF,CAAC,CAAC;AAEK,IAAMuC,QAAQ,GAAA/C,OAAA,CAAA+C,QAAA,GAAGC,UAAI,CAACH,MAAM,CAAC;EAClClD,IAAI,EAAE,MAAM;EACZsD,KAAK,EAAE,QAAQ;EACfC,MAAM,EAAE,IAAI;EACZC,IAAI,EAAE,IAAI;EAEVC,aAAa,WAAbA,aAAaA,CAAA,EAAG;IACd,OAAO;MACLxD,KAAK,EAAE;QAAE,WAAS;MAAG,CAAC;MACtByD,OAAO,EAAE;QAAE,WAAS;MAAK,CAAC;MAC1BC,IAAI,EAAE;QAAE,WAAS;MAAK;IACxB,CAAC;EACH,CAAC;EAEDC,qBAAqB,WAArBA,qBAAqBA,CAAA,EAAG;IACtB,OAAO,CAACxD,yBAAyB,CAAC,IAAI,CAACJ,IAAI,CAAC,EAAE4B,4BAA4B,CAAC;EAC7E,CAAC;EAEDiC,SAAS,WAATA,SAASA,CAAA,EAAG;IACV,OAAO,CACL;MACEC,GAAG,EAAE,kBAAkB;MACvBC,QAAQ,EAAE,SAAVA,QAAQA,CAAGC,EAAE;QAAA,OAAM;UACjB/D,KAAK,EAAE+D,EAAE,CAACC,YAAY,CAAC,UAAU,CAAC,IAAID,EAAE,CAACE;QAC3C,CAAC;MAAA;IACH,CAAC,EACD;MACEJ,GAAG,EAAE,0BAA0B;MAC/BC,QAAQ,EAAE,SAAVA,QAAQA,CAAGC,EAAE;QAAA,OAAM;UACjBL,IAAI,EAAEK,EAAE,CAACG;QACX,CAAC;MAAA;IACH,CAAC,CACF;EACH,CAAC;EAEDC,WAAW,WAAXA,WAAWA,CAAA,EAAG;IAAA,IAAAC,KAAA;IACZ,OAAO;MACLC,UAAU,EACR,SADFA,UAAUA,CAAA;QAAA,IACPrE,KAAK,GAAAd,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAU,SAAA,GAAAV,SAAA,MAAG,EAAE;QAAA,OACX,UAAAoF,IAAA,EAA8B;UAAA,IAAAC,UAAA;UAAA,IAA3B3D,EAAE,GAAA0D,IAAA,CAAF1D,EAAE;YAAE4D,MAAM,GAAAF,IAAA,CAANE,MAAM;YAAEvC,QAAQ,GAAAqC,IAAA,CAARrC,QAAQ;UACrB,IAAQD,KAAK,GAAKwC,MAAM,CAAC1C,IAAI,CAArBE,KAAK;UACb,IAAMf,IAAI,GAAGe,KAAK,CAACP,MAAM,CAACgD,KAAK,CAACC,IAAI,CAACzB,MAAM,CAAC;YAC1CjD,KAAK,EAALA;UACF,CAAC,CAAC;UACF,IAAQkC,SAAS,GAAKF,KAAK,CAAnBE,SAAS;;UAEjB;UACA,IAAMhB,GAAG,GAAGgB,SAAS,CAACyC,KAAK,CAACzD,GAAG;UAE/BN,EAAE,CAACY,MAAM,CAACN,GAAG,EAAED,IAAI,CAAC;UAEpB,IAAI,CAAAA,IAAI,aAAJA,IAAI,gBAAAsD,UAAA,GAAJtD,IAAI,CAAEE,IAAI,cAAAoD,UAAA,uBAAVA,UAAA,CAAYxE,IAAI,MAAKqE,KAAI,CAACrE,IAAI,EAAE;YAClC;YACA,IAAM6E,GAAG,GAAG5B,+BAAa,CAACC,MAAM,CAACrC,EAAE,CAACG,GAAG,EAAEmB,SAAS,CAACyC,KAAK,CAACzD,GAAG,CAAC;;YAE7D;YACAN,EAAE,CAACmC,YAAY,CAAC6B,GAAG,CAAC;UACtB;UAEA3C,QAAQ,CAACrB,EAAE,CAAC;UAEZ,OAAO,IAAI;QACb,CAAC;MAAA;MACH;MACA;MACA;MACA;MACA;MACA;IACF,CAAC;EACH,CAAC;EAEDiE,UAAU,WAAVA,UAAUA,CAAAC,KAAA,EAAqB;IAAA,IAAlBC,cAAc,GAAAD,KAAA,CAAdC,cAAc;IACzB,IAAIA,cAAc,CAACrB,IAAI,EAAE;MACvB,OAAO,CAAC,MAAM,EAAE;QAAE,WAAW,EAAE,QAAQ;QAAEsB,uBAAuB,EAAE;UAAEC,MAAM,EAAEF,cAAc,CAACrB;QAAK;MAAE,CAAC,CAAC;IACtG;IAEA,OAAO,CACL,MAAM,EACN;MAAE,YAAY,EAAE,EAAE;MAAE,UAAU,EAAEqB,cAAc,CAAC/E;IAAM,CAAC,EACtD,IAAAkF,uBAAQ,EAACH,cAAc,CAAC/E,KAAK,EAAE+E,cAAc,CAACtB,OAAO,CAAC,CACvD;EACH,CAAC;EAED0B,WAAW,WAAXA,WAAWA,CAAA,EAAG;IAAA,IAAAC,MAAA;IACZ,OAAO,IAAAC,6BAAqB,EAAC,UAACzD,KAAK;MAAA,oBAAKhF,MAAA,YAAA0I,aAAA,CAACC,YAAY,EAAAtG,aAAA,CAAAA,aAAA,KAAU2C,KAAK;QAAE4D,OAAO,EAAEJ,MAAI,CAACI;MAAO,EAAK,CAAC;IAAA,EAAC;EACpG;AACF,CAAC,CAAC;AAEK,IAAMD,YAAY,GAAAnF,OAAA,CAAAmF,YAAA,GAAG,SAAfA,YAAYA,CAAI3D,KAAK,EAAK;EACrC,IAAQX,IAAI,GAAkDW,KAAK,CAA3DX,IAAI;IAAEwE,gBAAgB,GAAgC7D,KAAK,CAArD6D,gBAAgB;IAAEjB,MAAM,GAAwB5C,KAAK,CAAnC4C,MAAM;IAAEkB,QAAQ,GAAc9D,KAAK,CAA3B8D,QAAQ;IAAEF,OAAO,GAAK5D,KAAK,CAAjB4D,OAAO;EACzD,IAAAG,SAAA,GAAsC,IAAAC,eAAQ,EAACF,QAAQ,CAAC;IAAAG,UAAA,OAAAC,eAAA,aAAAH,SAAA;IAAjDI,WAAW,GAAAF,UAAA;IAAEG,cAAc,GAAAH,UAAA;EAClC,IAAMI,UAAU,GAAG,IAAAC,aAAM,EAAC,IAAI,CAAC;EAC/B,IAAAC,UAAA,GAAgC,IAAAP,eAAQ,EAAC;MAAEQ,GAAG,EAAE,CAAC;MAAEC,IAAI,EAAE;IAAE,CAAC,CAAC;IAAAC,UAAA,OAAAR,eAAA,aAAAK,UAAA;IAAtDI,QAAQ,GAAAD,UAAA;IAAEE,WAAW,GAAAF,UAAA;EAC5B,IAAAG,KAAA,GAAmCjB,OAAO,IAAI,CAAC,CAAC;IAAAkB,UAAA,GAAAD,KAAA,CAAxC/B,IAAI;IAAEiC,WAAW,GAAAD,UAAA,cAAG,CAAC,CAAC,GAAAA,UAAA;EAC9B,IACEE,UAAU,GAKRD,WAAW,CALbC,UAAU;IAAAC,qBAAA,GAKRF,WAAW,CAJbG,oBAAoB;IAApBA,oBAAoB,GAAAD,qBAAA,cAAG,IAAI,GAAAA,qBAAA;IAAAE,qBAAA,GAIzBJ,WAAW,CAHbK,UAAU;IAAVA,UAAU,GAAAD,qBAAA,cAAG,EAAE,GAAAA,qBAAA;IACfE,kBAAkB,GAEhBN,WAAW,CAFbM,kBAAkB;IAClBC,oBAAoB,GAClBP,WAAW,CADbO,oBAAoB;EAGtB,IAAMlH,KAAK,GAAGiB,IAAI,CAACkG,KAAK,CAACnH,KAAK,IAAI,EAAE;EAEpC,IAAMoH,YAAY,GAAG,SAAfA,YAAYA,CAAIC,QAAQ,EAAK;IACjC5B,gBAAgB,CAAC;MAAEzF,KAAK,EAAEqH;IAAS,CAAC,CAAC;EACvC,CAAC;EAED,IAAMC,UAAU,GAAG,SAAbA,UAAUA,CAAID,QAAQ,EAAK;IAC/B5B,gBAAgB,CAAC;MAAEzF,KAAK,EAAEqH;IAAS,CAAC,CAAC;IACrCrB,cAAc,CAAC,KAAK,CAAC;IAErBxB,MAAM,CAAC+C,cAAc,GAAG,KAAK;IAE7B,IAAAC,aAAA,GAA+BhD,MAAM,CAACxC,KAAK;MAAnCE,SAAS,GAAAsF,aAAA,CAATtF,SAAS;MAAEtB,EAAE,GAAA4G,aAAA,CAAF5G,EAAE;MAAEG,GAAG,GAAAyG,aAAA,CAAHzG,GAAG;IAC1B,IAAM6D,GAAG,GAAG1B,+BAAa,CAACD,MAAM,CAAClC,GAAG,EAAEmB,SAAS,CAACC,IAAI,GAAG,CAAC,CAAC;;IAEzD;IACAvB,EAAE,CAACmC,YAAY,CAAC6B,GAAG,CAAC;IACpBJ,MAAM,CAAC1C,IAAI,CAACG,QAAQ,CAACrB,EAAE,CAAC;IACxB4D,MAAM,CAACiD,QAAQ,CAACC,KAAK,CAAC,CAAC;EACzB,CAAC;EAED,IAAAC,gBAAS,EAAC,YAAM;IACd,IAAIjC,QAAQ,EAAE;MACZM,cAAc,CAAC,IAAI,CAAC;IACtB;EACF,CAAC,EAAE,CAACN,QAAQ,CAAC,CAAC;EAEd,IAAAiC,gBAAS,EAAC,YAAM;IACdnD,MAAM,CAAC+C,cAAc,GAAG,CAAC,CAACxB,WAAW;EACvC,CAAC,EAAE,CAACA,WAAW,CAAC,CAAC;EAEjB,IAAA4B,gBAAS,EAAC,YAAM;IACd;IACA,IAAQxF,IAAI,GAAKqC,MAAM,CAACxC,KAAK,CAACE,SAAS,CAA/BC,IAAI;IACZ,IAAMyF,KAAK,GAAGpD,MAAM,CAAC1C,IAAI,CAAC+F,WAAW,CAAC1F,IAAI,CAAC;IAC3CqE,WAAW,CAAC;MACVJ,GAAG,EAAE,EAAE;MAAE;MACTC,IAAI,EAAEuB,KAAK,CAACvB;IACd,CAAC,CAAC;IAEF,IAAMyB,kBAAkB,GAAG,SAArBA,kBAAkBA,CAAI/F,KAAK,EAAK;MAAA,IAAAgG,qBAAA,EAAAC,SAAA,EAAAC,eAAA,EAAAC,gBAAA,EAAAC,gBAAA;MACpC,IAAMC,MAAM,GAAGrG,KAAK,aAALA,KAAK,uBAALA,KAAK,CAAEqG,MAAM;;MAE5B;MACA;MACA,IAAMC,uBAAuB,GAC3B,EAAAN,qBAAA,IAAAC,SAAA,GAAAM,QAAQ,EAACC,gBAAgB,cAAAR,qBAAA,uBAAzBA,qBAAA,CAAAzJ,IAAA,CAAA0J,SAAA,EACE,0GACF,CAAC,KAAI,EAAE;MAET,IAAMQ,yBAAyB,GAAGH,uBAAuB,CAAClJ,MAAM,GAAG,CAAC;MACpE,IAAMsJ,2BAA2B,GAC/B,CAAC,EAAEL,MAAM,aAANA,MAAM,eAANA,MAAM,CAAEM,EAAE,IAAIN,MAAM,CAACM,EAAE,CAACC,QAAQ,CAAC,wBAAwB,CAAC,CAAC,IAC9D,CAAC,EAACP,MAAM,aAANA,MAAM,gBAAAH,eAAA,GAANG,MAAM,CAAEQ,OAAO,cAAAX,eAAA,eAAfA,eAAA,CAAA3J,IAAA,CAAA8J,MAAM,EAAY,gCAAgC,CAAC;;MAEvD;MACA;MACA;MACA;MACA;MACA,IAAMS,eAAe,GAAG,CAAC,EAACT,MAAM,aAANA,MAAM,gBAAAF,gBAAA,GAANE,MAAM,CAAEQ,OAAO,cAAAV,gBAAA,eAAfA,gBAAA,CAAA5J,IAAA,CAAA8J,MAAM,EAAY,YAAY,CAAC;MAEzD,IACEnC,UAAU,CAAC6C,OAAO,IAClB,CAAC7C,UAAU,CAAC6C,OAAO,CAACC,QAAQ,CAACX,MAAM,CAAC,IACpC,EAACA,MAAM,aAANA,MAAM,gBAAAD,gBAAA,GAANC,MAAM,CAAEQ,OAAO,cAAAT,gBAAA,eAAfA,gBAAA,CAAA7J,IAAA,CAAA8J,MAAM,EAAY,oBAAoB,CAAC,KACxC,CAACI,yBAAyB,IAC1B,CAACC,2BAA2B,IAC5B,CAACI,eAAe,EAChB;QACA7C,cAAc,CAAC,KAAK,CAAC;QACrBsB,UAAU,CAACrG,IAAI,CAACkG,KAAK,CAACnH,KAAK,CAAC;MAC9B;IACF,CAAC;IAED,IAAI+F,WAAW,EAAE;MACf;MACA;MACAuC,QAAQ,CAACU,gBAAgB,CAAC,OAAO,EAAElB,kBAAkB,CAAC;IACxD,CAAC,MAAM;MACLQ,QAAQ,CAACW,mBAAmB,CAAC,OAAO,EAAEnB,kBAAkB,CAAC;IAC3D;IAEA,OAAO;MAAA,OAAMQ,QAAQ,CAACW,mBAAmB,CAAC,OAAO,EAAEnB,kBAAkB,CAAC;IAAA;EACxE,CAAC,EAAE,CAACtD,MAAM,EAAEuB,WAAW,CAAC,CAAC;EAEzB,oBACEnJ,MAAA,YAAA0I,aAAA,CAACpI,OAAA,CAAAgM,eAAe;IACdC,SAAS,EAAC,WAAW;IACrBC,KAAK,EAAE;MACLC,OAAO,EAAE,aAAa;MACtBC,MAAM,EAAE,SAAS;MACjBC,MAAM,EAAE;IACV,CAAE;IACF,iBAAe7D;EAAS,gBAExB9I,MAAA,YAAA0I,aAAA;IAAKkE,OAAO,EAAE,SAATA,OAAOA,CAAA;MAAA,OAAQxD,cAAc,CAAC,IAAI,CAAC;IAAA,CAAC;IAACyD,eAAe,EAAE;EAAM,gBAC/D7M,MAAA,YAAA0I,aAAA,CAAClI,YAAA,CAAAsM,WAAW;IAAC1J,KAAK,EAAEA;EAAM,CAAE,CACzB,CAAC,EACL+F,WAAW,iBACV4D,oBAAQ,CAACC,YAAY,cACnBhN,MAAA,YAAA0I,aAAA;IACEuE,GAAG,EAAE5D,UAAW;IAChB,oBAAkBzB,MAAM,CAACsF,UAAW;IACpCV,KAAK,EAAE;MACL7C,QAAQ,EAAE,UAAU;MACpBH,GAAG,KAAA2D,MAAA,CAAKxD,QAAQ,CAACH,GAAG,OAAI;MACxBC,IAAI,KAAA0D,MAAA,CAAKxD,QAAQ,CAACF,IAAI,OAAI;MAC1B2D,MAAM,EAAE,EAAE;MACVC,UAAU,EAAE,0CAA0C;MACtDC,SAAS,EACP;IACJ;EAAE,gBAEFtN,MAAA,YAAA0I,aAAA,CAAClI,YAAA,CAAA+M,WAAW;IACVnK,KAAK,EAAEA,KAAM;IACboK,SAAS;IACTC,QAAQ,EAAEjD,YAAa;IACvBkD,MAAM,EAAEhD,UAAW;IACnBV,UAAU,EAAEA,UAAW;IACvBE,oBAAoB,EAAEA,oBAAqB;IAC3CyD,cAAc,EAAE7K,sBAAsB,CAACsH,UAAU,CAAE;IACnDC,kBAAkB,EAAEA,kBAAmB;IACvCC,oBAAoB,EAAEA;EAAqB,CAC5C,CACE,CAAC,EACN,CAAA1C,MAAM,aAANA,MAAM,uBAANA,MAAM,CAAEgG,kBAAkB,KAAIlC,QAAQ,CAACmC,IACzC,CACa,CAAC;AAEtB,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.Media = void 0;
|
|
9
|
+
exports["default"] = MediaNodeView;
|
|
10
|
+
exports.insertDialog = void 0;
|
|
11
|
+
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
12
|
+
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
|
|
13
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
14
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
15
|
+
var _reactDom = _interopRequireDefault(require("react-dom"));
|
|
16
|
+
var _core = require("@tiptap/core");
|
|
17
|
+
var _react2 = require("@tiptap/react");
|
|
18
|
+
var _MediaDialog = _interopRequireDefault(require("../components/media/MediaDialog"));
|
|
19
|
+
var _MediaToolbar = _interopRequireDefault(require("../components/media/MediaToolbar"));
|
|
20
|
+
var _excluded = ["type", "callback", "options"];
|
|
21
|
+
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
|
|
22
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
23
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
24
|
+
var Media = exports.Media = _core.Node.create({
|
|
25
|
+
name: 'media',
|
|
26
|
+
group: 'inline',
|
|
27
|
+
inline: true,
|
|
28
|
+
atom: true,
|
|
29
|
+
addAttributes: function addAttributes() {
|
|
30
|
+
return {
|
|
31
|
+
type: {
|
|
32
|
+
"default": 'video'
|
|
33
|
+
},
|
|
34
|
+
src: {
|
|
35
|
+
"default": null
|
|
36
|
+
},
|
|
37
|
+
width: {
|
|
38
|
+
"default": null
|
|
39
|
+
},
|
|
40
|
+
height: {
|
|
41
|
+
"default": null
|
|
42
|
+
},
|
|
43
|
+
title: {
|
|
44
|
+
"default": null
|
|
45
|
+
},
|
|
46
|
+
starts: {
|
|
47
|
+
"default": null
|
|
48
|
+
},
|
|
49
|
+
ends: {
|
|
50
|
+
"default": null
|
|
51
|
+
},
|
|
52
|
+
editing: {
|
|
53
|
+
"default": false
|
|
54
|
+
},
|
|
55
|
+
tag: {
|
|
56
|
+
"default": 'iframe'
|
|
57
|
+
},
|
|
58
|
+
// 'iframe' or 'audio'
|
|
59
|
+
url: {
|
|
60
|
+
"default": null
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
},
|
|
64
|
+
parseHTML: function parseHTML() {
|
|
65
|
+
return [{
|
|
66
|
+
tag: 'iframe[data-type="video"]',
|
|
67
|
+
getAttrs: function getAttrs(el) {
|
|
68
|
+
return {
|
|
69
|
+
type: 'video',
|
|
70
|
+
tag: 'iframe',
|
|
71
|
+
src: el.getAttribute('src'),
|
|
72
|
+
width: el.getAttribute('width'),
|
|
73
|
+
height: el.getAttribute('height'),
|
|
74
|
+
title: el.dataset.title,
|
|
75
|
+
starts: el.dataset.starts,
|
|
76
|
+
ends: el.dataset.ends,
|
|
77
|
+
url: el.dataset.url
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
}, {
|
|
81
|
+
tag: 'audio',
|
|
82
|
+
getAttrs: function getAttrs(el) {
|
|
83
|
+
var _el$querySelector;
|
|
84
|
+
return {
|
|
85
|
+
type: 'audio',
|
|
86
|
+
tag: 'audio',
|
|
87
|
+
src: (_el$querySelector = el.querySelector('source')) === null || _el$querySelector === void 0 ? void 0 : _el$querySelector.getAttribute('src')
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
}];
|
|
91
|
+
},
|
|
92
|
+
renderHTML: function renderHTML(_ref) {
|
|
93
|
+
var HTMLAttributes = _ref.HTMLAttributes;
|
|
94
|
+
var tag = HTMLAttributes.tag,
|
|
95
|
+
src = HTMLAttributes.src,
|
|
96
|
+
width = HTMLAttributes.width,
|
|
97
|
+
height = HTMLAttributes.height;
|
|
98
|
+
if (tag === 'audio') {
|
|
99
|
+
return ['audio', {
|
|
100
|
+
controls: 'controls',
|
|
101
|
+
controlsList: 'nodownload'
|
|
102
|
+
}, ['source', {
|
|
103
|
+
src: src,
|
|
104
|
+
type: 'audio/mp3'
|
|
105
|
+
}]];
|
|
106
|
+
}
|
|
107
|
+
return ['iframe', (0, _core.mergeAttributes)({
|
|
108
|
+
'data-type': 'video',
|
|
109
|
+
frameborder: '0',
|
|
110
|
+
allow: 'accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture',
|
|
111
|
+
allowfullscreen: '',
|
|
112
|
+
src: src
|
|
113
|
+
}, width ? {
|
|
114
|
+
width: width
|
|
115
|
+
} : {}, height ? {
|
|
116
|
+
height: height
|
|
117
|
+
} : {})];
|
|
118
|
+
},
|
|
119
|
+
addCommands: function addCommands() {
|
|
120
|
+
var _this = this;
|
|
121
|
+
return {
|
|
122
|
+
insertMedia: function insertMedia(attrs) {
|
|
123
|
+
return function (_ref2) {
|
|
124
|
+
var commands = _ref2.commands;
|
|
125
|
+
return commands.insertContent({
|
|
126
|
+
type: _this.name,
|
|
127
|
+
attrs: attrs
|
|
128
|
+
});
|
|
129
|
+
};
|
|
130
|
+
},
|
|
131
|
+
updateMedia: function updateMedia(attrs) {
|
|
132
|
+
return function (_ref3) {
|
|
133
|
+
var commands = _ref3.commands;
|
|
134
|
+
return commands.updateAttributes(_this.name, attrs);
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
},
|
|
139
|
+
addNodeView: function addNodeView() {
|
|
140
|
+
var _this2 = this;
|
|
141
|
+
return (0, _react2.ReactNodeViewRenderer)(function (props) {
|
|
142
|
+
return /*#__PURE__*/_react["default"].createElement(MediaNodeView, _objectSpread(_objectSpread({}, props), {}, {
|
|
143
|
+
options: _this2.options
|
|
144
|
+
}));
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
var removeDialogs = function removeDialogs() {
|
|
149
|
+
var prevDialogs = document.querySelectorAll('.insert-media-dialog');
|
|
150
|
+
prevDialogs.forEach(function (s) {
|
|
151
|
+
return s.remove();
|
|
152
|
+
});
|
|
153
|
+
};
|
|
154
|
+
var insertDialog = exports.insertDialog = function insertDialog(props) {
|
|
155
|
+
var newEl = document.createElement('div');
|
|
156
|
+
var type = props.type,
|
|
157
|
+
callback = props.callback,
|
|
158
|
+
options = props.options,
|
|
159
|
+
rest = (0, _objectWithoutProperties2["default"])(props, _excluded);
|
|
160
|
+
var initialBodyOverflow = document.body.style.overflow;
|
|
161
|
+
removeDialogs();
|
|
162
|
+
newEl.className = 'insert-media-dialog';
|
|
163
|
+
document.body.style.overflow = 'hidden';
|
|
164
|
+
var handleClose = function handleClose(val, data) {
|
|
165
|
+
callback(val, data);
|
|
166
|
+
newEl.remove();
|
|
167
|
+
document.body.style.overflow = initialBodyOverflow;
|
|
168
|
+
};
|
|
169
|
+
var el = /*#__PURE__*/_react["default"].createElement(_MediaDialog["default"], (0, _extends2["default"])({}, rest, {
|
|
170
|
+
uploadSoundSupport: options.uploadSoundSupport,
|
|
171
|
+
type: type,
|
|
172
|
+
disablePortal: true,
|
|
173
|
+
open: true,
|
|
174
|
+
handleClose: handleClose
|
|
175
|
+
}));
|
|
176
|
+
_reactDom["default"].render(el, newEl);
|
|
177
|
+
document.body.appendChild(newEl);
|
|
178
|
+
};
|
|
179
|
+
function MediaNodeView(_ref4) {
|
|
180
|
+
var editor = _ref4.editor,
|
|
181
|
+
node = _ref4.node,
|
|
182
|
+
updateAttributes = _ref4.updateAttributes,
|
|
183
|
+
deleteNode = _ref4.deleteNode,
|
|
184
|
+
options = _ref4.options;
|
|
185
|
+
var _node$attrs = node.attrs,
|
|
186
|
+
type = _node$attrs.type,
|
|
187
|
+
src = _node$attrs.src,
|
|
188
|
+
width = _node$attrs.width,
|
|
189
|
+
height = _node$attrs.height,
|
|
190
|
+
tag = _node$attrs.tag;
|
|
191
|
+
var handleEdit = function handleEdit() {
|
|
192
|
+
insertDialog(_objectSpread(_objectSpread({}, node.attrs), {}, {
|
|
193
|
+
options: options,
|
|
194
|
+
edit: true,
|
|
195
|
+
callback: function callback(val, data) {
|
|
196
|
+
if (val) {
|
|
197
|
+
updateAttributes(data);
|
|
198
|
+
}
|
|
199
|
+
editor.chain().focus().run();
|
|
200
|
+
}
|
|
201
|
+
}));
|
|
202
|
+
};
|
|
203
|
+
(0, _react.useEffect)(function () {
|
|
204
|
+
// Only open dialog for newly inserted media without a src
|
|
205
|
+
if (!src) {
|
|
206
|
+
insertDialog(_objectSpread(_objectSpread({}, node.attrs), {}, {
|
|
207
|
+
options: options,
|
|
208
|
+
edit: true,
|
|
209
|
+
callback: function callback(val, data) {
|
|
210
|
+
if (val) {
|
|
211
|
+
updateAttributes(data);
|
|
212
|
+
} else {
|
|
213
|
+
deleteNode();
|
|
214
|
+
}
|
|
215
|
+
editor.chain().focus().run();
|
|
216
|
+
}
|
|
217
|
+
}));
|
|
218
|
+
}
|
|
219
|
+
}, []);
|
|
220
|
+
return /*#__PURE__*/_react["default"].createElement(_react2.NodeViewWrapper, {
|
|
221
|
+
"data-type": type,
|
|
222
|
+
style: {
|
|
223
|
+
width: width,
|
|
224
|
+
height: height
|
|
225
|
+
}
|
|
226
|
+
}, tag === 'audio' ? /*#__PURE__*/_react["default"].createElement("audio", {
|
|
227
|
+
controls: true,
|
|
228
|
+
controlsList: "nodownload"
|
|
229
|
+
}, /*#__PURE__*/_react["default"].createElement("source", {
|
|
230
|
+
type: "audio/mp3",
|
|
231
|
+
src: src
|
|
232
|
+
})) : /*#__PURE__*/_react["default"].createElement("iframe", {
|
|
233
|
+
src: src,
|
|
234
|
+
allowFullScreen: true,
|
|
235
|
+
frameBorder: "0",
|
|
236
|
+
width: width,
|
|
237
|
+
height: height
|
|
238
|
+
}), /*#__PURE__*/_react["default"].createElement(_MediaToolbar["default"], {
|
|
239
|
+
onEdit: handleEdit,
|
|
240
|
+
onRemove: deleteNode
|
|
241
|
+
}));
|
|
242
|
+
}
|
|
243
|
+
//# sourceMappingURL=media.js.map
|