@pie-lib/editable-html-tip-tap 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (167) hide show
  1. package/CHANGELOG.json +32 -0
  2. package/CHANGELOG.md +2280 -0
  3. package/lib/__tests__/editor.test.js +470 -0
  4. package/lib/__tests__/serialization.test.js +246 -0
  5. package/lib/__tests__/utils.js +106 -0
  6. package/lib/block-tags.js +25 -0
  7. package/lib/constants.js +16 -0
  8. package/lib/editor.js +1356 -0
  9. package/lib/extensions/MediaView.js +112 -0
  10. package/lib/extensions/characters.js +65 -0
  11. package/lib/extensions/component.js +325 -0
  12. package/lib/extensions/css.js +252 -0
  13. package/lib/extensions/custom-toolbar-wrapper.js +124 -0
  14. package/lib/extensions/image.js +106 -0
  15. package/lib/extensions/math.js +330 -0
  16. package/lib/extensions/media.js +276 -0
  17. package/lib/extensions/responseArea.js +278 -0
  18. package/lib/index.js +1213 -0
  19. package/lib/old-index.js +269 -0
  20. package/lib/parse-html.js +16 -0
  21. package/lib/plugins/characters/custom-popper.js +73 -0
  22. package/lib/plugins/characters/index.js +305 -0
  23. package/lib/plugins/characters/utils.js +381 -0
  24. package/lib/plugins/css/icons/index.js +37 -0
  25. package/lib/plugins/css/index.js +390 -0
  26. package/lib/plugins/customPlugin/index.js +114 -0
  27. package/lib/plugins/html/icons/index.js +38 -0
  28. package/lib/plugins/html/index.js +81 -0
  29. package/lib/plugins/image/__tests__/component.test.js +51 -0
  30. package/lib/plugins/image/__tests__/image-toolbar-logic.test.js +56 -0
  31. package/lib/plugins/image/__tests__/image-toolbar.test.js +26 -0
  32. package/lib/plugins/image/__tests__/index.test.js +98 -0
  33. package/lib/plugins/image/__tests__/insert-image-handler.test.js +125 -0
  34. package/lib/plugins/image/__tests__/mock-change.js +25 -0
  35. package/lib/plugins/image/alt-dialog.js +129 -0
  36. package/lib/plugins/image/component.js +419 -0
  37. package/lib/plugins/image/image-toolbar.js +177 -0
  38. package/lib/plugins/image/index.js +263 -0
  39. package/lib/plugins/image/insert-image-handler.js +117 -0
  40. package/lib/plugins/index.js +413 -0
  41. package/lib/plugins/list/__tests__/index.test.js +79 -0
  42. package/lib/plugins/list/index.js +334 -0
  43. package/lib/plugins/math/__tests__/index.test.js +300 -0
  44. package/lib/plugins/math/index.js +454 -0
  45. package/lib/plugins/media/__tests__/index.test.js +71 -0
  46. package/lib/plugins/media/index.js +387 -0
  47. package/lib/plugins/media/media-dialog.js +709 -0
  48. package/lib/plugins/media/media-toolbar.js +101 -0
  49. package/lib/plugins/media/media-wrapper.js +93 -0
  50. package/lib/plugins/rendering/index.js +46 -0
  51. package/lib/plugins/respArea/drag-in-the-blank/choice.js +289 -0
  52. package/lib/plugins/respArea/drag-in-the-blank/index.js +94 -0
  53. package/lib/plugins/respArea/explicit-constructed-response/index.js +120 -0
  54. package/lib/plugins/respArea/icons/index.js +95 -0
  55. package/lib/plugins/respArea/index.js +341 -0
  56. package/lib/plugins/respArea/inline-dropdown/index.js +126 -0
  57. package/lib/plugins/respArea/math-templated/index.js +130 -0
  58. package/lib/plugins/respArea/utils.js +125 -0
  59. package/lib/plugins/table/CustomTablePlugin.js +133 -0
  60. package/lib/plugins/table/__tests__/index.test.js +442 -0
  61. package/lib/plugins/table/__tests__/table-toolbar.test.js +54 -0
  62. package/lib/plugins/table/icons/index.js +69 -0
  63. package/lib/plugins/table/index.js +483 -0
  64. package/lib/plugins/table/table-toolbar.js +187 -0
  65. package/lib/plugins/textAlign/icons/index.js +194 -0
  66. package/lib/plugins/textAlign/index.js +34 -0
  67. package/lib/plugins/toolbar/__tests__/default-toolbar.test.js +128 -0
  68. package/lib/plugins/toolbar/__tests__/editor-and-toolbar.test.js +51 -0
  69. package/lib/plugins/toolbar/__tests__/toolbar-buttons.test.js +54 -0
  70. package/lib/plugins/toolbar/__tests__/toolbar.test.js +120 -0
  71. package/lib/plugins/toolbar/default-toolbar.js +229 -0
  72. package/lib/plugins/toolbar/done-button.js +53 -0
  73. package/lib/plugins/toolbar/editor-and-toolbar.js +286 -0
  74. package/lib/plugins/toolbar/index.js +34 -0
  75. package/lib/plugins/toolbar/toolbar-buttons.js +194 -0
  76. package/lib/plugins/toolbar/toolbar.js +376 -0
  77. package/lib/plugins/utils.js +62 -0
  78. package/lib/serialization.js +677 -0
  79. package/lib/shared/alert-dialog.js +75 -0
  80. package/lib/theme.js +9 -0
  81. package/package.json +69 -0
  82. package/src/__tests__/editor.test.jsx +363 -0
  83. package/src/__tests__/serialization.test.js +291 -0
  84. package/src/__tests__/utils.js +36 -0
  85. package/src/block-tags.js +17 -0
  86. package/src/constants.js +7 -0
  87. package/src/editor.jsx +1197 -0
  88. package/src/extensions/characters.js +46 -0
  89. package/src/extensions/component.jsx +294 -0
  90. package/src/extensions/css.js +217 -0
  91. package/src/extensions/custom-toolbar-wrapper.jsx +100 -0
  92. package/src/extensions/image.js +55 -0
  93. package/src/extensions/math.js +259 -0
  94. package/src/extensions/media.js +182 -0
  95. package/src/extensions/responseArea.js +205 -0
  96. package/src/index.jsx +1462 -0
  97. package/src/old-index.jsx +162 -0
  98. package/src/parse-html.js +8 -0
  99. package/src/plugins/README.md +27 -0
  100. package/src/plugins/characters/custom-popper.js +48 -0
  101. package/src/plugins/characters/index.jsx +284 -0
  102. package/src/plugins/characters/utils.js +447 -0
  103. package/src/plugins/css/icons/index.jsx +17 -0
  104. package/src/plugins/css/index.jsx +340 -0
  105. package/src/plugins/customPlugin/index.jsx +85 -0
  106. package/src/plugins/html/icons/index.jsx +19 -0
  107. package/src/plugins/html/index.jsx +72 -0
  108. package/src/plugins/image/__tests__/__snapshots__/component.test.jsx.snap +51 -0
  109. package/src/plugins/image/__tests__/__snapshots__/image-toolbar-logic.test.jsx.snap +27 -0
  110. package/src/plugins/image/__tests__/__snapshots__/image-toolbar.test.jsx.snap +44 -0
  111. package/src/plugins/image/__tests__/component.test.jsx +41 -0
  112. package/src/plugins/image/__tests__/image-toolbar-logic.test.jsx +42 -0
  113. package/src/plugins/image/__tests__/image-toolbar.test.jsx +11 -0
  114. package/src/plugins/image/__tests__/index.test.js +95 -0
  115. package/src/plugins/image/__tests__/insert-image-handler.test.js +113 -0
  116. package/src/plugins/image/__tests__/mock-change.js +15 -0
  117. package/src/plugins/image/alt-dialog.jsx +82 -0
  118. package/src/plugins/image/component.jsx +343 -0
  119. package/src/plugins/image/image-toolbar.jsx +100 -0
  120. package/src/plugins/image/index.jsx +227 -0
  121. package/src/plugins/image/insert-image-handler.js +79 -0
  122. package/src/plugins/index.jsx +377 -0
  123. package/src/plugins/list/__tests__/index.test.js +54 -0
  124. package/src/plugins/list/index.jsx +305 -0
  125. package/src/plugins/math/__tests__/__snapshots__/index.test.jsx.snap +48 -0
  126. package/src/plugins/math/__tests__/index.test.jsx +245 -0
  127. package/src/plugins/math/index.jsx +379 -0
  128. package/src/plugins/media/__tests__/index.test.js +75 -0
  129. package/src/plugins/media/index.jsx +325 -0
  130. package/src/plugins/media/media-dialog.js +624 -0
  131. package/src/plugins/media/media-toolbar.jsx +56 -0
  132. package/src/plugins/media/media-wrapper.jsx +43 -0
  133. package/src/plugins/rendering/index.js +31 -0
  134. package/src/plugins/respArea/drag-in-the-blank/choice.jsx +215 -0
  135. package/src/plugins/respArea/drag-in-the-blank/index.jsx +70 -0
  136. package/src/plugins/respArea/explicit-constructed-response/index.jsx +92 -0
  137. package/src/plugins/respArea/icons/index.jsx +71 -0
  138. package/src/plugins/respArea/index.jsx +299 -0
  139. package/src/plugins/respArea/inline-dropdown/index.jsx +108 -0
  140. package/src/plugins/respArea/math-templated/index.jsx +104 -0
  141. package/src/plugins/respArea/utils.jsx +90 -0
  142. package/src/plugins/table/CustomTablePlugin.js +113 -0
  143. package/src/plugins/table/__tests__/__snapshots__/table-toolbar.test.jsx.snap +44 -0
  144. package/src/plugins/table/__tests__/index.test.jsx +401 -0
  145. package/src/plugins/table/__tests__/table-toolbar.test.jsx +42 -0
  146. package/src/plugins/table/icons/index.jsx +53 -0
  147. package/src/plugins/table/index.jsx +427 -0
  148. package/src/plugins/table/table-toolbar.jsx +136 -0
  149. package/src/plugins/textAlign/icons/index.jsx +114 -0
  150. package/src/plugins/textAlign/index.jsx +23 -0
  151. package/src/plugins/toolbar/__tests__/__snapshots__/default-toolbar.test.jsx.snap +923 -0
  152. package/src/plugins/toolbar/__tests__/__snapshots__/editor-and-toolbar.test.jsx.snap +20 -0
  153. package/src/plugins/toolbar/__tests__/__snapshots__/toolbar-buttons.test.jsx.snap +36 -0
  154. package/src/plugins/toolbar/__tests__/__snapshots__/toolbar.test.jsx.snap +46 -0
  155. package/src/plugins/toolbar/__tests__/default-toolbar.test.jsx +94 -0
  156. package/src/plugins/toolbar/__tests__/editor-and-toolbar.test.jsx +37 -0
  157. package/src/plugins/toolbar/__tests__/toolbar-buttons.test.jsx +51 -0
  158. package/src/plugins/toolbar/__tests__/toolbar.test.jsx +106 -0
  159. package/src/plugins/toolbar/default-toolbar.jsx +206 -0
  160. package/src/plugins/toolbar/done-button.jsx +38 -0
  161. package/src/plugins/toolbar/editor-and-toolbar.jsx +257 -0
  162. package/src/plugins/toolbar/index.jsx +23 -0
  163. package/src/plugins/toolbar/toolbar-buttons.jsx +138 -0
  164. package/src/plugins/toolbar/toolbar.jsx +338 -0
  165. package/src/plugins/utils.js +31 -0
  166. package/src/serialization.jsx +621 -0
  167. package/src/theme.js +1 -0
@@ -0,0 +1,330 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ var _typeof = require("@babel/runtime/helpers/typeof");
6
+
7
+ Object.defineProperty(exports, "__esModule", {
8
+ value: true
9
+ });
10
+ exports.ZeroWidthSpaceHandlingPlugin = exports.MathNodeView = exports.MathNode = exports.EnsureTextAfterMathPlugin = void 0;
11
+
12
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
13
+
14
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
15
+
16
+ var _react = _interopRequireWildcard(require("react"));
17
+
18
+ var _core = require("@tiptap/core");
19
+
20
+ var _react2 = require("@tiptap/react");
21
+
22
+ var _prosemirrorState = require("prosemirror-state");
23
+
24
+ var _mathToolbar = require("@pie-lib/math-toolbar");
25
+
26
+ var _mathRendering = require("@pie-lib/math-rendering");
27
+
28
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
29
+
30
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
31
+
32
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
33
+
34
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
35
+
36
+ var ensureTextAfterMathPluginKey = new _prosemirrorState.PluginKey('ensureTextAfterMath');
37
+
38
+ var EnsureTextAfterMathPlugin = function EnsureTextAfterMathPlugin(mathNodeName) {
39
+ return new _prosemirrorState.Plugin({
40
+ key: ensureTextAfterMathPluginKey,
41
+ appendTransaction: function appendTransaction(transactions, oldState, newState) {
42
+ // Only act when the doc actually changed
43
+ if (!transactions.some(function (tr) {
44
+ return tr.docChanged;
45
+ })) return null;
46
+ var tr = newState.tr;
47
+ var changed = false;
48
+ newState.doc.descendants(function (node, pos) {
49
+ if (node.type.name === mathNodeName) {
50
+ var nextPos = pos + node.nodeSize;
51
+ var nextNode = newState.doc.nodeAt(nextPos); // If there's no node after, or the next node isn't text, insert a space
52
+
53
+ if (!nextNode || nextNode.type.name !== 'text') {
54
+ tr.insert(nextPos, newState.schema.text("\u200B"));
55
+ changed = true;
56
+ }
57
+ }
58
+ });
59
+ return changed ? tr : null;
60
+ }
61
+ });
62
+ };
63
+
64
+ exports.EnsureTextAfterMathPlugin = EnsureTextAfterMathPlugin;
65
+ var ZeroWidthSpaceHandlingPlugin = new _prosemirrorState.Plugin({
66
+ key: new _prosemirrorState.PluginKey('zeroWidthSpaceHandling'),
67
+ props: {
68
+ handleKeyDown: function handleKeyDown(view, event) {
69
+ var state = view.state,
70
+ dispatch = view.dispatch;
71
+ var selection = state.selection,
72
+ doc = state.doc;
73
+ var from = selection.from,
74
+ empty = selection.empty;
75
+
76
+ if (empty && event.key === 'Backspace' && from > 0) {
77
+ var prevChar = doc.textBetween(from - 1, from, "\uFFFC", "\uFFFC");
78
+
79
+ if (prevChar === "\u200B") {
80
+ var tr = state.tr["delete"](from - 2, from);
81
+ dispatch(tr);
82
+ return true; // handled
83
+ }
84
+ }
85
+
86
+ if (empty && event.key === 'ArrowLeft' && from > 0) {
87
+ var _prevChar = doc.textBetween(from - 1, from, "\uFFFC", "\uFFFC"); // If the previous character is the zero-width space...
88
+
89
+
90
+ if (_prevChar === "\u200B") {
91
+ var posBefore = from - 1;
92
+ var resolved = state.doc.resolve(posBefore - 1); // look just before the zwsp
93
+
94
+ var maybeNode = resolved.nodeAfter || resolved.nodeBefore; // Check if there's an inline selectable node (e.g., your math node)
95
+
96
+ if (maybeNode) {
97
+ var nodePos = posBefore - maybeNode.nodeSize;
98
+ var nodeResolved = state.doc.resolve(nodePos);
99
+
100
+ var _tr = state.tr.setSelection(_prosemirrorState.NodeSelection.create(state.doc, nodeResolved.pos));
101
+
102
+ dispatch(_tr);
103
+ return true;
104
+ } else {
105
+ // Just move the text cursor before the zwsp
106
+ var _tr2 = state.tr.setSelection(_prosemirrorState.TextSelection.create(state.doc, from - 2));
107
+
108
+ dispatch(_tr2);
109
+ return true;
110
+ }
111
+ }
112
+ }
113
+
114
+ return false;
115
+ }
116
+ }
117
+ });
118
+ exports.ZeroWidthSpaceHandlingPlugin = ZeroWidthSpaceHandlingPlugin;
119
+
120
+ var MathNode = _core.Node.create({
121
+ name: 'math',
122
+ group: 'inline',
123
+ inline: true,
124
+ atom: true,
125
+ addAttributes: function addAttributes() {
126
+ return {
127
+ latex: {
128
+ "default": ''
129
+ },
130
+ wrapper: {
131
+ "default": null
132
+ },
133
+ html: {
134
+ "default": null
135
+ }
136
+ };
137
+ },
138
+ addProseMirrorPlugins: function addProseMirrorPlugins() {
139
+ return [EnsureTextAfterMathPlugin(this.name), ZeroWidthSpaceHandlingPlugin];
140
+ },
141
+ parseHTML: function parseHTML() {
142
+ return [{
143
+ tag: 'span[data-latex]',
144
+ getAttrs: function getAttrs(el) {
145
+ return {
146
+ latex: el.getAttribute('data-raw') || el.textContent
147
+ };
148
+ }
149
+ }, {
150
+ tag: 'span[data-type="mathml"]',
151
+ getAttrs: function getAttrs(el) {
152
+ return {
153
+ html: el.innerHTML
154
+ };
155
+ }
156
+ }];
157
+ },
158
+ addCommands: function addCommands() {
159
+ var _this = this;
160
+
161
+ return {
162
+ insertMath: function insertMath() {
163
+ var latex = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
164
+ return function (_ref) {
165
+ var _node$type;
166
+
167
+ var tr = _ref.tr,
168
+ editor = _ref.editor,
169
+ dispatch = _ref.dispatch;
170
+ // 2) Now the editor.view.state reflects the insertion
171
+ var state = editor.view.state;
172
+ var node = state.schema.nodes.math.create({
173
+ latex: latex
174
+ });
175
+ var selection = state.selection; // The inserted node is typically just before the cursor
176
+
177
+ var pos = selection.$from.pos;
178
+ tr.insert(pos, node);
179
+
180
+ if ((node === null || node === void 0 ? void 0 : (_node$type = node.type) === null || _node$type === void 0 ? void 0 : _node$type.name) === _this.name) {
181
+ // Create a NodeSelection from the current doc
182
+ var sel = _prosemirrorState.NodeSelection.create(tr.doc, selection.$from.pos); // Build a fresh transaction from the current state and set the selection
183
+
184
+
185
+ tr.setSelection(sel);
186
+ }
187
+
188
+ dispatch(tr);
189
+ return true;
190
+ };
191
+ } // insertMath: (latex = '') => ({ commands }) => {
192
+ // return commands.insertContent({
193
+ // type: this.name,
194
+ // attrs: { latex },
195
+ // });
196
+ // },
197
+
198
+ };
199
+ },
200
+ renderHTML: function renderHTML(_ref2) {
201
+ var HTMLAttributes = _ref2.HTMLAttributes;
202
+
203
+ if (HTMLAttributes.html) {
204
+ return ['span', {
205
+ 'data-type': 'mathml',
206
+ dangerouslySetInnerHTML: {
207
+ __html: HTMLAttributes.html
208
+ }
209
+ }];
210
+ }
211
+
212
+ return ['span', {
213
+ 'data-latex': '',
214
+ 'data-raw': HTMLAttributes.latex
215
+ }, (0, _mathRendering.wrapMath)(HTMLAttributes.latex, HTMLAttributes.wrapper)];
216
+ },
217
+ addNodeView: function addNodeView() {
218
+ var _this2 = this;
219
+
220
+ return (0, _react2.ReactNodeViewRenderer)(function (props) {
221
+ return /*#__PURE__*/_react["default"].createElement(MathNodeView, _objectSpread(_objectSpread({}, props), {}, {
222
+ options: _this2.options
223
+ }));
224
+ });
225
+ }
226
+ });
227
+
228
+ exports.MathNode = MathNode;
229
+
230
+ var MathNodeView = function MathNodeView(props) {
231
+ var node = props.node,
232
+ updateAttributes = props.updateAttributes,
233
+ editor = props.editor,
234
+ selected = props.selected,
235
+ options = props.options;
236
+
237
+ var _useState = (0, _react.useState)(selected),
238
+ _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
239
+ showToolbar = _useState2[0],
240
+ setShowToolbar = _useState2[1];
241
+
242
+ var toolbarRef = (0, _react.useRef)(null);
243
+ var latex = node.attrs.latex || '';
244
+ (0, _react.useEffect)(function () {
245
+ if (selected) {
246
+ setShowToolbar(true);
247
+ }
248
+ }, [selected]);
249
+ (0, _react.useEffect)(function () {
250
+ editor._toolbarOpened = !!showToolbar;
251
+ }, [showToolbar]);
252
+ (0, _react.useEffect)(function () {
253
+ var handleClickOutside = function handleClickOutside(event) {
254
+ if (toolbarRef.current && !toolbarRef.current.contains(event.target) && !event.target.closest('[data-inline-node]')) {
255
+ setShowToolbar(false);
256
+ }
257
+ };
258
+
259
+ if (showToolbar) {
260
+ document.addEventListener('mousedown', handleClickOutside);
261
+ } else {
262
+ document.removeEventListener('mousedown', handleClickOutside);
263
+ }
264
+
265
+ return function () {
266
+ return document.removeEventListener('mousedown', handleClickOutside);
267
+ };
268
+ }, [showToolbar]);
269
+
270
+ var handleChange = function handleChange(newLatex) {
271
+ updateAttributes({
272
+ latex: newLatex
273
+ });
274
+ };
275
+
276
+ var handleDone = function handleDone(newLatex) {
277
+ updateAttributes({
278
+ latex: newLatex
279
+ });
280
+ setShowToolbar(false);
281
+ editor._toolbarOpened = false;
282
+ var _editor$state = editor.state,
283
+ selection = _editor$state.selection,
284
+ tr = _editor$state.tr,
285
+ doc = _editor$state.doc;
286
+
287
+ var sel = _prosemirrorState.TextSelection.create(doc, selection.from + 1); // Build a fresh transaction from the current state and set the selection
288
+
289
+
290
+ tr.setSelection(sel);
291
+ editor.view.dispatch(tr);
292
+ editor.commands.focus();
293
+ };
294
+
295
+ return /*#__PURE__*/_react["default"].createElement(_react2.NodeViewWrapper, {
296
+ className: "math-node",
297
+ style: {
298
+ display: 'inline-flex',
299
+ cursor: 'pointer',
300
+ margin: '0 4px'
301
+ },
302
+ "data-selected": selected
303
+ }, /*#__PURE__*/_react["default"].createElement("div", {
304
+ onClick: function onClick() {
305
+ return setShowToolbar(true);
306
+ },
307
+ contentEditable: false
308
+ }, /*#__PURE__*/_react["default"].createElement(_mathToolbar.MathPreview, {
309
+ latex: latex
310
+ })), showToolbar && /*#__PURE__*/_react["default"].createElement("div", {
311
+ ref: toolbarRef,
312
+ style: {
313
+ position: 'absolute',
314
+ top: '100%',
315
+ left: 0,
316
+ zIndex: 20,
317
+ background: 'var(--editable-html-toolbar-bg, #efefef)',
318
+ 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)'
319
+ }
320
+ }, /*#__PURE__*/_react["default"].createElement(_mathToolbar.MathToolbar, {
321
+ latex: latex,
322
+ autoFocus: true,
323
+ onChange: handleChange,
324
+ onDone: handleDone,
325
+ keypadMode: "basic"
326
+ })));
327
+ };
328
+
329
+ exports.MathNodeView = MathNodeView;
330
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9leHRlbnNpb25zL21hdGguanMiXSwibmFtZXMiOlsiZW5zdXJlVGV4dEFmdGVyTWF0aFBsdWdpbktleSIsIlBsdWdpbktleSIsIkVuc3VyZVRleHRBZnRlck1hdGhQbHVnaW4iLCJtYXRoTm9kZU5hbWUiLCJQbHVnaW4iLCJrZXkiLCJhcHBlbmRUcmFuc2FjdGlvbiIsInRyYW5zYWN0aW9ucyIsIm9sZFN0YXRlIiwibmV3U3RhdGUiLCJzb21lIiwidHIiLCJkb2NDaGFuZ2VkIiwiY2hhbmdlZCIsImRvYyIsImRlc2NlbmRhbnRzIiwibm9kZSIsInBvcyIsInR5cGUiLCJuYW1lIiwibmV4dFBvcyIsIm5vZGVTaXplIiwibmV4dE5vZGUiLCJub2RlQXQiLCJpbnNlcnQiLCJzY2hlbWEiLCJ0ZXh0IiwiWmVyb1dpZHRoU3BhY2VIYW5kbGluZ1BsdWdpbiIsInByb3BzIiwiaGFuZGxlS2V5RG93biIsInZpZXciLCJldmVudCIsInN0YXRlIiwiZGlzcGF0Y2giLCJzZWxlY3Rpb24iLCJmcm9tIiwiZW1wdHkiLCJwcmV2Q2hhciIsInRleHRCZXR3ZWVuIiwicG9zQmVmb3JlIiwicmVzb2x2ZWQiLCJyZXNvbHZlIiwibWF5YmVOb2RlIiwibm9kZUFmdGVyIiwibm9kZUJlZm9yZSIsIm5vZGVQb3MiLCJub2RlUmVzb2x2ZWQiLCJzZXRTZWxlY3Rpb24iLCJOb2RlU2VsZWN0aW9uIiwiY3JlYXRlIiwiVGV4dFNlbGVjdGlvbiIsIk1hdGhOb2RlIiwiTm9kZSIsImdyb3VwIiwiaW5saW5lIiwiYXRvbSIsImFkZEF0dHJpYnV0ZXMiLCJsYXRleCIsIndyYXBwZXIiLCJodG1sIiwiYWRkUHJvc2VNaXJyb3JQbHVnaW5zIiwicGFyc2VIVE1MIiwidGFnIiwiZ2V0QXR0cnMiLCJlbCIsImdldEF0dHJpYnV0ZSIsInRleHRDb250ZW50IiwiaW5uZXJIVE1MIiwiYWRkQ29tbWFuZHMiLCJpbnNlcnRNYXRoIiwiZWRpdG9yIiwibm9kZXMiLCJtYXRoIiwiJGZyb20iLCJzZWwiLCJyZW5kZXJIVE1MIiwiSFRNTEF0dHJpYnV0ZXMiLCJkYW5nZXJvdXNseVNldElubmVySFRNTCIsIl9faHRtbCIsImFkZE5vZGVWaWV3Iiwib3B0aW9ucyIsIk1hdGhOb2RlVmlldyIsInVwZGF0ZUF0dHJpYnV0ZXMiLCJzZWxlY3RlZCIsInNob3dUb29sYmFyIiwic2V0U2hvd1Rvb2xiYXIiLCJ0b29sYmFyUmVmIiwiYXR0cnMiLCJfdG9vbGJhck9wZW5lZCIsImhhbmRsZUNsaWNrT3V0c2lkZSIsImN1cnJlbnQiLCJjb250YWlucyIsInRhcmdldCIsImNsb3Nlc3QiLCJkb2N1bWVudCIsImFkZEV2ZW50TGlzdGVuZXIiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwiaGFuZGxlQ2hhbmdlIiwibmV3TGF0ZXgiLCJoYW5kbGVEb25lIiwiY29tbWFuZHMiLCJmb2N1cyIsImRpc3BsYXkiLCJjdXJzb3IiLCJtYXJnaW4iLCJwb3NpdGlvbiIsInRvcCIsImxlZnQiLCJ6SW5kZXgiLCJiYWNrZ3JvdW5kIiwiYm94U2hhZG93Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7Ozs7OztBQUVBLElBQU1BLDRCQUE0QixHQUFHLElBQUlDLDJCQUFKLENBQWMscUJBQWQsQ0FBckM7O0FBRU8sSUFBTUMseUJBQXlCLEdBQUcsU0FBNUJBLHlCQUE0QixDQUFDQyxZQUFEO0FBQUEsU0FDdkMsSUFBSUMsd0JBQUosQ0FBVztBQUNUQyxJQUFBQSxHQUFHLEVBQUVMLDRCQURJO0FBRVRNLElBQUFBLGlCQUFpQixFQUFFLDJCQUFDQyxZQUFELEVBQWVDLFFBQWYsRUFBeUJDLFFBQXpCLEVBQXNDO0FBQ3ZEO0FBQ0EsVUFBSSxDQUFDRixZQUFZLENBQUNHLElBQWIsQ0FBa0IsVUFBQ0MsRUFBRDtBQUFBLGVBQVFBLEVBQUUsQ0FBQ0MsVUFBWDtBQUFBLE9BQWxCLENBQUwsRUFBK0MsT0FBTyxJQUFQO0FBRS9DLFVBQU1ELEVBQUUsR0FB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Q0FMUDtBQU1MQyxNQUFBQSxTQUFTLEVBQ1A7QUFQRztBQUZULGtCQVlFLGdDQUFDLHdCQUFEO0FBQWEsSUFBQSxLQUFLLEVBQUVyRCxLQUFwQjtBQUEyQixJQUFBLFNBQVMsTUFBcEM7QUFBcUMsSUFBQSxRQUFRLEVBQUV3QyxZQUEvQztBQUE2RCxJQUFBLE1BQU0sRUFBRUUsVUFBckU7QUFBaUYsSUFBQSxVQUFVLEVBQUM7QUFBNUYsSUFaRixDQWRKLENBREY7QUFnQ0QsQ0F4Rk0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QsIHsgdXNlU3RhdGUsIHVzZUVmZmVjdCwgdXNlUmVmIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uLCBOb2RlLCBtZXJnZUF0dHJpYnV0ZXMgfSBmcm9tICdAdGlwdGFwL2NvcmUnO1xuaW1wb3J0IHsgTm9kZVZpZXdXcmFwcGVyLCBSZWFjdFJlbmRlcmVyLCBSZWFjdE5vZGVWaWV3UmVuZGVyZXIgfSBmcm9tICdAdGlwdGFwL3JlYWN0JztcbmltcG9ydCB7IFBsdWdpbiwgUGx1Z2luS2V5LCBOb2RlU2VsZWN0aW9uLCBUZXh0U2VsZWN0aW9uIH0gZnJvbSAncHJvc2VtaXJyb3Itc3RhdGUnO1xuaW1wb3J0IHsgTWF0aFByZXZpZXcsIE1hdGhUb29sYmFyIH0gZnJvbSAnQHBpZS1saWIvbWF0aC10b29sYmFyJztcbmltcG9ydCB7IHdyYXBNYXRoLCBtbWxUb0xhdGV4LCByZW5kZXJNYXRoIH0gZnJvbSAnQHBpZS1saWIvbWF0aC1yZW5kZXJpbmcnO1xuXG5jb25zdCBlbnN1cmVUZXh0QWZ0ZXJNYXRoUGx1Z2luS2V5ID0gbmV3IFBsdWdpbktleSgnZW5zdXJlVGV4dEFmdGVyTWF0aCcpO1xuXG5leHBvcnQgY29uc3QgRW5zdXJlVGV4dEFmdGVyTWF0aFBsdWdpbiA9IChtYXRoTm9kZU5hbWUpID0+XG4gIG5ldyBQbHVnaW4oe1xuICAgIGtleTogZW5zdXJlVGV4dEFmdGVyTWF0aFBsdWdpbktleSxcbiAgICBhcHBlbmRUcmFuc2FjdGlvbjogKHRyYW5zYWN0aW9ucywgb2xkU3RhdGUsIG5ld1N0YXRlKSA9PiB7XG4gICAgICAvLyBPbmx5IGFjdCB3aGVuIHRoZSBkb2MgYWN0dWFsbHkgY2hhbmdlZFxuICAgICAgaWYgKCF0cmFuc2FjdGlvbnMuc29tZSgodHIpID0+IHRyLmRvY0NoYW5nZWQpKSByZXR1cm4gbnVsbDtcblxuICAgICAgY29uc3QgdHIgPSBuZXdTdGF0ZS50cjtcbiAgICAgIGxldCBjaGFuZ2VkID0gZmFsc2U7XG5cbiAgICAgIG5ld1N0YXRlLmRvYy5kZXNjZW5kYW50cygobm9kZSwgcG9zKSA9PiB7XG4gICAgICAgIGlmIChub2RlLnR5cGUubmFtZSA9PT0gbWF0aE5vZGVOYW1lKSB7XG4gICAgICAgICAgY29uc3QgbmV4dFBvcyA9IHBvcyArIG5vZGUubm9kZVNpemU7XG4gICAgICAgICAgY29uc3QgbmV4dE5vZGUgPSBuZXdTdGF0ZS5kb2Mubm9kZUF0KG5leHRQb3MpO1xuXG4gICAgICAgICAgLy8gSWYgdGhlcmUncyBubyBub2RlIGFmdGVyLCBvciB0aGUgbmV4dCBub2RlIGlzbid0IHRleHQsIGluc2VydCBhIHNwYWNlXG4gICAgICAgICAgaWYgKCFuZXh0Tm9kZSB8fCBuZXh0Tm9kZS50eXBlLm5hbWUgIT09ICd0ZXh0Jykge1xuICAgICAgICAgICAgdHIuaW5zZXJ0KG5leHRQb3MsIG5ld1N0YXRlLnNjaGVtYS50ZXh0KCdcXHUyMDBiJykpO1xuICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGNoYW5nZWQgPyB0ciA6IG51bGw7XG4gICAgfSxcbiAgfSk7XG5cbmV4cG9ydCBjb25zdCBaZXJvV2lkdGhTcGFjZUhhbmRsaW5nUGx1Z2luID0gbmV3IFBsdWdpbih7XG4gIGtleTogbmV3IFBsdWdpbktleSgnemVyb1dpZHRoU3BhY2VIYW5kbGluZycpLFxuICBwcm9wczoge1xuICAgIGhhbmRsZUtleURvd24odmlldywgZXZlbnQpIHtcbiAgICAgIGNvbnN0IHsgc3RhdGUsIGRpc3BhdGNoIH0gPSB2aWV3O1xuICAgICAgY29uc3QgeyBzZWxlY3Rpb24sIGRvYyB9ID0gc3RhdGU7XG4gICAgICBjb25zdCB7IGZyb20sIGVtcHR5IH0gPSBzZWxlY3Rpb247XG5cbiAgICAgIGlmIChlbXB0eSAmJiBldmVudC5rZXkgPT09ICdCYWNrc3BhY2UnICYmIGZyb20gPiAwKSB7XG4gICAgICAgIGNvbnN0IHByZXZDaGFyID0gZG9jLnRleHRCZXR3ZWVuKGZyb20gLSAxLCBmcm9tLCAnXFx1RkZGQycsICdcXHVGRkZDJyk7XG4gICAgICAgIGlmIChwcmV2Q2hhciA9PT0gJ1xcdTIwMGInKSB7XG4gICAgICAgICAgY29uc3QgdHIgPSBzdGF0ZS50ci5kZWxldGUoZnJvbSAtIDIsIGZyb20pO1xuICAgICAgICAgIGRpc3BhdGNoKHRyKTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gaGFuZGxlZFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChlbXB0eSAmJiBldmVudC5rZXkgPT09ICdBcnJvd0xlZnQnICYmIGZyb20gPiAwKSB7XG4gICAgICAgIGNvbnN0IHByZXZDaGFyID0gZG9jLnRleHRCZXR3ZWVuKGZyb20gLSAxLCBmcm9tLCAnXFx1RkZGQycsICdcXHVGRkZDJyk7XG4gICAgICAgIC8vIElmIHRoZSBwcmV2aW91cyBjaGFyYWN0ZXIgaXMgdGhlIHplcm8td2lkdGggc3BhY2UuLi5cbiAgICAgICAgaWYgKHByZXZDaGFyID09PSAnXFx1MjAwYicpIHtcbiAgICAgICAgICBjb25zdCBwb3NCZWZvcmUgPSBmcm9tIC0gMTtcbiAgICAgICAgICBjb25zdCByZXNvbHZlZCA9IHN0YXRlLmRvYy5yZXNvbHZlKHBvc0JlZm9yZSAtIDEpOyAvLyBsb29rIGp1c3QgYmVmb3JlIHRoZSB6d3NwXG4gICAgICAgICAgY29uc3QgbWF5YmVOb2RlID0gcmVzb2x2ZWQubm9kZUFmdGVyIHx8IHJlc29sdmVkLm5vZGVCZWZvcmU7XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSdzIGFuIGlubGluZSBzZWxlY3RhYmxlIG5vZGUgKGUuZy4sIHlvdXIgbWF0aCBub2RlKVxuICAgICAgICAgIGlmIChtYXliZU5vZGUpIHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGVQb3MgPSBwb3NCZWZvcmUgLSBtYXliZU5vZGUubm9kZVNpemU7XG4gICAgICAgICAgICBjb25zdCBub2RlUmVzb2x2ZWQgPSBzdGF0ZS5kb2MucmVzb2x2ZShub2RlUG9zKTtcbiAgICAgICAgICAgIGNvbnN0IHRyID0gc3RhdGUudHIuc2V0U2VsZWN0aW9uKE5vZGVTZWxlY3Rpb24uY3JlYXRlKHN0YXRlLmRvYywgbm9kZVJlc29sdmVkLnBvcykpO1xuICAgICAgICAgICAgZGlzcGF0Y2godHIpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEp1c3QgbW92ZSB0aGUgdGV4dCBjdXJzb3IgYmVmb3JlIHRoZSB6d3NwXG4gICAgICAgICAgICBjb25zdCB0ciA9IHN0YXRlLnRyLnNldFNlbGVjdGlvbihUZXh0U2VsZWN0aW9uLmNyZWF0ZShzdGF0ZS5kb2MsIGZyb20gLSAyKSk7XG4gICAgICAgICAgICBkaXNwYXRjaCh0cik7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG4gIH0sXG59KTtcblxuZXhwb3J0IGNvbnN0IE1hdGhOb2RlID0gTm9kZS5jcmVhdGUoe1xuICBuYW1lOiAnbWF0aCcsXG4gIGdyb3VwOiAnaW5saW5lJyxcbiAgaW5saW5lOiB0cnVlLFxuICBhdG9tOiB0cnVlLFxuXG4gIGFkZEF0dHJpYnV0ZXMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxhdGV4OiB7IGRlZmF1bHQ6ICcnIH0sXG4gICAgICB3cmFwcGVyOiB7IGRlZmF1bHQ6IG51bGwgfSxcbiAgICAgIGh0bWw6IHsgZGVmYXVsdDogbnVsbCB9LFxuICAgIH07XG4gIH0sXG5cbiAgYWRkUHJvc2VNaXJyb3JQbHVnaW5zKCkge1xuICAgIHJldHVybiBbRW5zdXJlVGV4dEFmdGVyTWF0aFBsdWdpbih0aGlzLm5hbWUpLCBaZXJvV2lkdGhTcGFjZUhhbmRsaW5nUGx1Z2luXTtcbiAgfSxcblxuICBwYXJzZUhUTUwoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgdGFnOiAnc3BhbltkYXRhLWxhdGV4XScsXG4gICAgICAgIGdldEF0dHJzOiAoZWwpID0+ICh7XG4gICAgICAgICAgbGF0ZXg6IGVsLmdldEF0dHJpYnV0ZSgnZGF0YS1yYXcnKSB8fCBlbC50ZXh0Q29udGVudCxcbiAgICAgICAgfSksXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB0YWc6ICdzcGFuW2RhdGEtdHlwZT1cIm1hdGhtbFwiXScsXG4gICAgICAgIGdldEF0dHJzOiAoZWwpID0+ICh7XG4gICAgICAgICAgaHRtbDogZWwuaW5uZXJIVE1MLFxuICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgXTtcbiAgfSxcblxuICBhZGRDb21tYW5kcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaW5zZXJ0TWF0aDogKGxhdGV4ID0gJycpID0+ICh7IHRyLCBlZGl0b3IsIGRpc3BhdGNoIH0pID0+IHtcbiAgICAgICAgLy8gMikgTm93IHRoZSBlZGl0b3Iudmlldy5zdGF0ZSByZWZsZWN0cyB0aGUgaW5zZXJ0aW9uXG4gICAgICAgIGNvbnN0IHsgc3RhdGUgfSA9IGVkaXRvci52aWV3O1xuICAgICAgICBjb25zdCBub2RlID0gc3RhdGUuc2NoZW1hLm5vZGVzLm1hdGguY3JlYXRlKHtcbiAgICAgICAgICBsYXRleCxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHsgc2VsZWN0aW9uIH0gPSBzdGF0ZTtcblxuICAgICAgICAvLyBUaGUgaW5zZXJ0ZWQgbm9kZSBpcyB0eXBpY2FsbHkganVzdCBiZWZvcmUgdGhlIGN1cnNvclxuICAgICAgICBjb25zdCBwb3MgPSBzZWxlY3Rpb24uJGZyb20ucG9zO1xuXG4gICAgICAgIHRyLmluc2VydChwb3MsIG5vZGUpO1xuXG4gICAgICAgIGlmIChub2RlPy50eXBlPy5uYW1lID09PSB0aGlzLm5hbWUpIHtcbiAgICAgICAgICAvLyBDcmVhdGUgYSBOb2RlU2VsZWN0aW9uIGZyb20gdGhlIGN1cnJlbnQgZG9jXG4gICAgICAgICAgY29uc3Qgc2VsID0gTm9kZVNlbGVjdGlvbi5jcmVhdGUodHIuZG9jLCBzZWxlY3Rpb24uJGZyb20ucG9zKTtcblxuICAgICAgICAgIC8vIEJ1aWxkIGEgZnJlc2ggdHJhbnNhY3Rpb24gZnJvbSB0aGUgY3VycmVudCBzdGF0ZSBhbmQgc2V0IHRoZSBzZWxlY3Rpb25cbiAgICAgICAgICB0ci5zZXRTZWxlY3Rpb24oc2VsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRpc3BhdGNoKHRyKTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0sXG4gICAgICAvLyBpbnNlcnRNYXRoOiAobGF0ZXggPSAnJykgPT4gKHsgY29tbWFuZHMgfSkgPT4ge1xuICAgICAgLy8gICByZXR1cm4gY29tbWFuZHMuaW5zZXJ0Q29udGVudCh7XG4gICAgICAvLyAgICAgdHlwZTogdGhpcy5uYW1lLFxuICAgICAgLy8gICAgIGF0dHJzOiB7IGxhdGV4IH0sXG4gICAgICAvLyAgIH0pO1xuICAgICAgLy8gfSxcbiAgICB9O1xuICB9LFxuXG4gIHJlbmRlckhUTUwoeyBIVE1MQXR0cmlidXRlcyB9KSB7XG4gICAgaWYgKEhUTUxBdHRyaWJ1dGVzLmh0bWwpIHtcbiAgICAgIHJldHVybiBbJ3NwYW4nLCB7ICdkYXRhLXR5cGUnOiAnbWF0aG1sJywgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw6IHsgX19odG1sOiBIVE1MQXR0cmlidXRlcy5odG1sIH0gfV07XG4gICAgfVxuXG4gICAgcmV0dXJuIFtcbiAgICAgICdzcGFuJyxcbiAgICAgIHsgJ2RhdGEtbGF0ZXgnOiAnJywgJ2RhdGEtcmF3JzogSFRNTEF0dHJpYnV0ZXMubGF0ZXggfSxcbiAgICAgIHdyYXBNYXRoKEhUTUxBdHRyaWJ1dGVzLmxhdGV4LCBIVE1MQXR0cmlidXRlcy53cmFwcGVyKSxcbiAgICBdO1xuICB9LFxuXG4gIGFkZE5vZGVWaWV3KCkge1xuICAgIHJldHVybiBSZWFjdE5vZGVWaWV3UmVuZGVyZXIoKHByb3BzKSA9PiA8TWF0aE5vZGVWaWV3IHsuLi57IC4uLnByb3BzLCBvcHRpb25zOiB0aGlzLm9wdGlvbnMgfX0gLz4pO1xuICB9LFxufSk7XG5cbmV4cG9ydCBjb25zdCBNYXRoTm9kZVZpZXcgPSAocHJvcHMpID0+IHtcbiAgY29uc3QgeyBub2RlLCB1cGRhdGVBdHRyaWJ1dGVzLCBlZGl0b3IsIHNlbGVjdGVkLCBvcHRpb25zIH0gPSBwcm9wcztcbiAgY29uc3QgW3Nob3dUb29sYmFyLCBzZXRTaG93VG9vbGJhcl0gPSB1c2VTdGF0ZShzZWxlY3RlZCk7XG4gIGNvbnN0IHRvb2xiYXJSZWYgPSB1c2VSZWYobnVsbCk7XG5cbiAgY29uc3QgbGF0ZXggPSBub2RlLmF0dHJzLmxhdGV4IHx8ICcnO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHNlbGVjdGVkKSB7XG4gICAgICBzZXRTaG93VG9vbGJhcih0cnVlKTtcbiAgICB9XG4gIH0sIFtzZWxlY3RlZF0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgZWRpdG9yLl90b29sYmFyT3BlbmVkID0gISFzaG93VG9vbGJhcjtcbiAgfSwgW3Nob3dUb29sYmFyXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBoYW5kbGVDbGlja091dHNpZGUgPSAoZXZlbnQpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgdG9vbGJhclJlZi5jdXJyZW50ICYmXG4gICAgICAgICF0b29sYmFyUmVmLmN1cnJlbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KSAmJlxuICAgICAgICAhZXZlbnQudGFyZ2V0LmNsb3Nlc3QoJ1tkYXRhLWlubGluZS1ub2RlXScpXG4gICAgICApIHtcbiAgICAgICAgc2V0U2hvd1Rvb2xiYXIoZmFsc2UpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAoc2hvd1Rvb2xiYXIpIHtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIGhhbmRsZUNsaWNrT3V0c2lkZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIGhhbmRsZUNsaWNrT3V0c2lkZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuICgpID0+IGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIGhhbmRsZUNsaWNrT3V0c2lkZSk7XG4gIH0sIFtzaG93VG9vbGJhcl0pO1xuXG4gIGNvbnN0IGhhbmRsZUNoYW5nZSA9IChuZXdMYXRleCkgPT4ge1xuICAgIHVwZGF0ZUF0dHJpYnV0ZXMoeyBsYXRleDogbmV3TGF0ZXggfSk7XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlRG9uZSA9IChuZXdMYXRleCkgPT4ge1xuICAgIHVwZGF0ZUF0dHJpYnV0ZXMoeyBsYXRleDogbmV3TGF0ZXggfSk7XG4gICAgc2V0U2hvd1Rvb2xiYXIoZmFsc2UpO1xuXG4gICAgZWRpdG9yLl90b29sYmFyT3BlbmVkID0gZmFsc2U7XG5cbiAgICBjb25zdCB7IHNlbGVjdGlvbiwgdHIsIGRvYyB9ID0gZWRpdG9yLnN0YXRlO1xuICAgIGNvbnN0IHNlbCA9IFRleHRTZWxlY3Rpb24uY3JlYXRlKGRvYywgc2VsZWN0aW9uLmZyb20gKyAxKTtcblxuICAgIC8vIEJ1aWxkIGEgZnJlc2ggdHJhbnNhY3Rpb24gZnJvbSB0aGUgY3VycmVudCBzdGF0ZSBhbmQgc2V0IHRoZSBzZWxlY3Rpb25cbiAgICB0ci5zZXRTZWxlY3Rpb24oc2VsKTtcbiAgICBlZGl0b3Iudmlldy5kaXNwYXRjaCh0cik7XG4gICAgZWRpdG9yLmNvbW1hbmRzLmZvY3VzKCk7XG4gIH07XG5cbiAgcmV0dXJuIChcbiAgICA8Tm9kZVZpZXdXcmFwcGVyXG4gICAgICBjbGFzc05hbWU9XCJtYXRoLW5vZGVcIlxuICAgICAgc3R5bGU9e3tcbiAgICAgICAgZGlzcGxheTogJ2lubGluZS1mbGV4JyxcbiAgICAgICAgY3Vyc29yOiAncG9pbnRlcicsXG4gICAgICAgIG1hcmdpbjogJzAgNHB4JyxcbiAgICAgIH19XG4gICAgICBkYXRhLXNlbGVjdGVkPXtzZWxlY3RlZH1cbiAgICA+XG4gICAgICA8ZGl2IG9uQ2xpY2s9eygpID0+IHNldFNob3dUb29sYmFyKHRydWUpfSBjb250ZW50RWRpdGFibGU9e2ZhbHNlfT5cbiAgICAgICAgPE1hdGhQcmV2aWV3IGxhdGV4PXtsYXRleH0gLz5cbiAgICAgIDwvZGl2PlxuXG4gICAgICB7c2hvd1Rvb2xiYXIgJiYgKFxuICAgICAgICA8ZGl2XG4gICAgICAgICAgcmVmPXt0b29sYmFyUmVmfVxuICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgICAgIHRvcDogJzEwMCUnLFxuICAgICAgICAgICAgbGVmdDogMCxcbiAgICAgICAgICAgIHpJbmRleDogMjAsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kOiAndmFyKC0tZWRpdGFibGUtaHRtbC10b29sYmFyLWJnLCAjZWZlZmVmKScsXG4gICAgICAgICAgICBib3hTaGFkb3c6XG4gICAgICAgICAgICAgICcwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLCAwcHggMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwgMHB4IDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMTIpJyxcbiAgICAgICAgICB9fVxuICAgICAgICA+XG4gICAgICAgICAgPE1hdGhUb29sYmFyIGxhdGV4PXtsYXRleH0gYXV0b0ZvY3VzIG9uQ2hhbmdlPXtoYW5kbGVDaGFuZ2V9IG9uRG9uZT17aGFuZGxlRG9uZX0ga2V5cGFkTW9kZT1cImJhc2ljXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICApfVxuICAgIDwvTm9kZVZpZXdXcmFwcGVyPlxuICApO1xufTtcbiJdfQ==
@@ -0,0 +1,276 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ var _typeof = require("@babel/runtime/helpers/typeof");
6
+
7
+ Object.defineProperty(exports, "__esModule", {
8
+ value: true
9
+ });
10
+ exports.Media = void 0;
11
+ exports["default"] = MediaNodeView;
12
+ exports.insertDialog = void 0;
13
+
14
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
15
+
16
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
17
+
18
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
19
+
20
+ var _react = _interopRequireWildcard(require("react"));
21
+
22
+ var _reactDom = _interopRequireDefault(require("react-dom"));
23
+
24
+ var _core = require("@tiptap/core");
25
+
26
+ var _react2 = require("@tiptap/react");
27
+
28
+ var _mediaDialog = _interopRequireDefault(require("../plugins/media/media-dialog"));
29
+
30
+ var _mediaToolbar = _interopRequireDefault(require("../plugins/media/media-toolbar"));
31
+
32
+ var _excluded = ["type", "callback", "options"];
33
+
34
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
35
+
36
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
37
+
38
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
39
+
40
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
41
+
42
+ var Media = _core.Node.create({
43
+ name: 'media',
44
+ group: 'inline',
45
+ inline: true,
46
+ atom: true,
47
+ addAttributes: function addAttributes() {
48
+ return {
49
+ type: {
50
+ "default": 'video'
51
+ },
52
+ src: {
53
+ "default": null
54
+ },
55
+ width: {
56
+ "default": null
57
+ },
58
+ height: {
59
+ "default": null
60
+ },
61
+ title: {
62
+ "default": null
63
+ },
64
+ starts: {
65
+ "default": null
66
+ },
67
+ ends: {
68
+ "default": null
69
+ },
70
+ editing: {
71
+ "default": false
72
+ },
73
+ tag: {
74
+ "default": 'iframe'
75
+ },
76
+ // 'iframe' or 'audio'
77
+ url: {
78
+ "default": null
79
+ }
80
+ };
81
+ },
82
+ parseHTML: function parseHTML() {
83
+ return [{
84
+ tag: 'iframe[data-type="video"]',
85
+ getAttrs: function getAttrs(el) {
86
+ return {
87
+ type: 'video',
88
+ tag: 'iframe',
89
+ src: el.getAttribute('src'),
90
+ width: el.getAttribute('width'),
91
+ height: el.getAttribute('height'),
92
+ title: el.dataset.title,
93
+ starts: el.dataset.starts,
94
+ ends: el.dataset.ends,
95
+ url: el.dataset.url
96
+ };
97
+ }
98
+ }, {
99
+ tag: 'audio',
100
+ getAttrs: function getAttrs(el) {
101
+ var _el$querySelector;
102
+
103
+ return {
104
+ type: 'audio',
105
+ tag: 'audio',
106
+ src: (_el$querySelector = el.querySelector('source')) === null || _el$querySelector === void 0 ? void 0 : _el$querySelector.getAttribute('src')
107
+ };
108
+ }
109
+ }];
110
+ },
111
+ renderHTML: function renderHTML(_ref) {
112
+ var HTMLAttributes = _ref.HTMLAttributes;
113
+ var tag = HTMLAttributes.tag,
114
+ src = HTMLAttributes.src,
115
+ width = HTMLAttributes.width,
116
+ height = HTMLAttributes.height;
117
+
118
+ if (tag === 'audio') {
119
+ return ['audio', {
120
+ controls: 'controls',
121
+ controlsList: 'nodownload'
122
+ }, ['source', {
123
+ src: src,
124
+ type: 'audio/mp3'
125
+ }]];
126
+ }
127
+
128
+ return ['iframe', (0, _core.mergeAttributes)({
129
+ 'data-type': 'video',
130
+ frameborder: '0',
131
+ allow: 'accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture',
132
+ allowfullscreen: '',
133
+ src: src
134
+ }, width ? {
135
+ width: width
136
+ } : {}, height ? {
137
+ height: height
138
+ } : {})];
139
+ },
140
+ addCommands: function addCommands() {
141
+ var _this = this;
142
+
143
+ return {
144
+ insertMedia: function insertMedia(attrs) {
145
+ return function (_ref2) {
146
+ var commands = _ref2.commands;
147
+ return commands.insertContent({
148
+ type: _this.name,
149
+ attrs: attrs
150
+ });
151
+ };
152
+ },
153
+ updateMedia: function updateMedia(attrs) {
154
+ return function (_ref3) {
155
+ var commands = _ref3.commands;
156
+ return commands.updateAttributes(_this.name, attrs);
157
+ };
158
+ }
159
+ };
160
+ },
161
+ addNodeView: function addNodeView() {
162
+ var _this2 = this;
163
+
164
+ return (0, _react2.ReactNodeViewRenderer)(function (props) {
165
+ return /*#__PURE__*/_react["default"].createElement(MediaNodeView, _objectSpread(_objectSpread({}, props), {}, {
166
+ options: _this2.options
167
+ }));
168
+ });
169
+ }
170
+ });
171
+
172
+ exports.Media = Media;
173
+
174
+ var removeDialogs = function removeDialogs() {
175
+ var prevDialogs = document.querySelectorAll('.insert-media-dialog');
176
+ prevDialogs.forEach(function (s) {
177
+ return s.remove();
178
+ });
179
+ };
180
+
181
+ var insertDialog = function insertDialog(props) {
182
+ var newEl = document.createElement('div');
183
+ var type = props.type,
184
+ callback = props.callback,
185
+ options = props.options,
186
+ rest = (0, _objectWithoutProperties2["default"])(props, _excluded);
187
+ var initialBodyOverflow = document.body.style.overflow;
188
+ removeDialogs();
189
+ newEl.className = 'insert-media-dialog';
190
+ document.body.style.overflow = 'hidden';
191
+
192
+ var handleClose = function handleClose(val, data) {
193
+ callback(val, data);
194
+ newEl.remove();
195
+ document.body.style.overflow = initialBodyOverflow;
196
+ };
197
+
198
+ var el = /*#__PURE__*/_react["default"].createElement(_mediaDialog["default"], (0, _extends2["default"])({}, rest, {
199
+ uploadSoundSupport: options.uploadSoundSupport,
200
+ type: type,
201
+ disablePortal: true,
202
+ open: true,
203
+ handleClose: handleClose
204
+ }));
205
+
206
+ _reactDom["default"].render(el, newEl);
207
+
208
+ document.body.appendChild(newEl);
209
+ };
210
+
211
+ exports.insertDialog = insertDialog;
212
+
213
+ function MediaNodeView(_ref4) {
214
+ var editor = _ref4.editor,
215
+ node = _ref4.node,
216
+ updateAttributes = _ref4.updateAttributes,
217
+ deleteNode = _ref4.deleteNode,
218
+ options = _ref4.options;
219
+ var _node$attrs = node.attrs,
220
+ type = _node$attrs.type,
221
+ src = _node$attrs.src,
222
+ width = _node$attrs.width,
223
+ height = _node$attrs.height,
224
+ tag = _node$attrs.tag;
225
+
226
+ var handleEdit = function handleEdit() {
227
+ insertDialog(_objectSpread(_objectSpread({}, node.attrs), {}, {
228
+ edit: true,
229
+ callback: function callback(val, data) {
230
+ if (val) {
231
+ updateAttributes(data);
232
+ } else {
233
+ deleteNode();
234
+ }
235
+
236
+ editor.chain().focus().run();
237
+ }
238
+ }));
239
+ };
240
+
241
+ (0, _react.useEffect)(function () {
242
+ insertDialog(_objectSpread(_objectSpread({}, node.attrs), {}, {
243
+ options: options,
244
+ edit: true,
245
+ callback: function callback(val, data) {
246
+ if (val) {
247
+ updateAttributes(data);
248
+ } else {
249
+ deleteNode();
250
+ }
251
+
252
+ editor.chain().focus().run();
253
+ }
254
+ }));
255
+ }, []);
256
+ return /*#__PURE__*/_react["default"].createElement(_react2.NodeViewWrapper, {
257
+ "data-type": type,
258
+ style: {
259
+ width: width,
260
+ height: height
261
+ }
262
+ }, tag === 'audio' ? /*#__PURE__*/_react["default"].createElement("audio", {
263
+ controls: true,
264
+ controlsList: "nodownload"
265
+ }, /*#__PURE__*/_react["default"].createElement("source", {
266
+ src: src
267
+ })) : /*#__PURE__*/_react["default"].createElement("iframe", {
268
+ src: src,
269
+ allowFullScreen: true,
270
+ frameBorder: "0"
271
+ }), /*#__PURE__*/_react["default"].createElement(_mediaToolbar["default"], {
272
+ onEdit: handleEdit,
273
+ onRemove: deleteNode
274
+ }));
275
+ }
276
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9leHRlbnNpb25zL21lZGlhLmpzIl0sIm5hbWVzIjpbIk1lZGlhIiwiTm9kZSIsImNyZWF0ZSIsIm5hbWUiLCJncm91cCIsImlubGluZSIsImF0b20iLCJhZGRBdHRyaWJ1dGVzIiwidHlwZSIsInNyYyIsIndpZHRoIiwiaGVpZ2h0IiwidGl0bGUiLCJzdGFydHMiLCJlbmRzIiwiZWRpdGluZyIsInRhZyIsInVybCIsInBhcnNlSFRNTCIsImdldEF0dHJzIiwiZWwiLCJnZXRBdHRyaWJ1dGUiLCJkYXRhc2V0IiwicXVlcnlTZWxlY3RvciIsInJlbmRlckhUTUwiLCJIVE1MQXR0cmlidXRlcyIsImNvbnRyb2xzIiwiY29udHJvbHNMaXN0IiwiZnJhbWVib3JkZXIiLCJhbGxvdyIsImFsbG93ZnVsbHNjcmVlbiIsImFkZENvbW1hbmRzIiwiaW5zZXJ0TWVkaWEiLCJhdHRycyIsImNvbW1hbmRzIiwiaW5zZXJ0Q29udGVudCIsInVwZGF0ZU1lZGlhIiwidXBkYXRlQXR0cmlidXRlcyIsImFkZE5vZGVWaWV3IiwicHJvcHMiLCJvcHRpb25zIiwicmVtb3ZlRGlhbG9ncyIsInByZXZEaWFsb2dzIiwiZG9jdW1lbnQiLCJxdWVyeVNlbGVjdG9yQWxsIiwiZm9yRWFjaCIsInMiLCJyZW1vdmUiLCJpbnNlcnREaWFsb2ciLCJuZXdFbCIsImNyZWF0ZUVsZW1lbnQiLCJjYWxsYmFjayIsInJlc3QiLCJpbml0aWFsQm9keU92ZXJmbG93IiwiYm9keSIsInN0eWxlIiwib3ZlcmZsb3ciLCJjbGFzc05hbWUiLCJoYW5kbGVDbG9zZSIsInZhbCIsImRhdGEiLCJ1cGxvYWRTb3VuZFN1cHBvcnQiLCJSZWFjdERPTSIsInJlbmRlciIsImFwcGVuZENoaWxkIiwiTWVkaWFOb2RlVmlldyIsImVkaXRvciIsIm5vZGUiLCJkZWxldGVOb2RlIiwiaGFuZGxlRWRpdCIsImVkaXQiLCJjaGFpbiIsImZvY3VzIiwicnVuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7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LElBQUEsR0FBRyxFQUFFQSxHQUFiO0FBQWtCLElBQUEsZUFBZSxNQUFqQztBQUFrQyxJQUFBLFdBQVcsRUFBQztBQUE5QyxJQU5KLGVBU0UsZ0NBQUMsd0JBQUQ7QUFBYyxJQUFBLE1BQU0sRUFBRTRELFVBQXRCO0FBQWtDLElBQUEsUUFBUSxFQUFFRDtBQUE1QyxJQVRGLENBREY7QUFhRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCwgeyB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUmVhY3RET00gZnJvbSAncmVhY3QtZG9tJztcbmltcG9ydCB7IG1lcmdlQXR0cmlidXRlcywgTm9kZSB9IGZyb20gJ0B0aXB0YXAvY29yZSc7XG5pbXBvcnQgeyBOb2RlVmlld1dyYXBwZXIsIFJlYWN0Tm9kZVZpZXdSZW5kZXJlciB9IGZyb20gJ0B0aXB0YXAvcmVhY3QnO1xuaW1wb3J0IE1lZGlhRGlhbG9nIGZyb20gJy4uL3BsdWdpbnMvbWVkaWEvbWVkaWEtZGlhbG9nJztcbmltcG9ydCBNZWRpYVRvb2xiYXIgZnJvbSAnLi4vcGx1Z2lucy9tZWRpYS9tZWRpYS10b29sYmFyJztcblxuZXhwb3J0IGNvbnN0IE1lZGlhID0gTm9kZS5jcmVhdGUoe1xuICBuYW1lOiAnbWVkaWEnLFxuICBncm91cDogJ2lubGluZScsXG4gIGlubGluZTogdHJ1ZSxcbiAgYXRvbTogdHJ1ZSxcblxuICBhZGRBdHRyaWJ1dGVzKCkge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiB7IGRlZmF1bHQ6ICd2aWRlbycgfSxcbiAgICAgIHNyYzogeyBkZWZhdWx0OiBudWxsIH0sXG4gICAgICB3aWR0aDogeyBkZWZhdWx0OiBudWxsIH0sXG4gICAgICBoZWlnaHQ6IHsgZGVmYXVsdDogbnVsbCB9LFxuICAgICAgdGl0bGU6IHsgZGVmYXVsdDogbnVsbCB9LFxuICAgICAgc3RhcnRzOiB7IGRlZmF1bHQ6IG51bGwgfSxcbiAgICAgIGVuZHM6IHsgZGVmYXVsdDogbnVsbCB9LFxuICAgICAgZWRpdGluZzogeyBkZWZhdWx0OiBmYWxzZSB9LFxuICAgICAgdGFnOiB7IGRlZmF1bHQ6ICdpZnJhbWUnIH0sIC8vICdpZnJhbWUnIG9yICdhdWRpbydcbiAgICAgIHVybDogeyBkZWZhdWx0OiBudWxsIH0sXG4gICAgfTtcbiAgfSxcblxuICBwYXJzZUhUTUwoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgdGFnOiAnaWZyYW1lW2RhdGEtdHlwZT1cInZpZGVvXCJdJyxcbiAgICAgICAgZ2V0QXR0cnM6IChlbCkgPT4gKHtcbiAgICAgICAgICB0eXBlOiAndmlkZW8nLFxuICAgICAgICAgIHRhZzogJ2lmcmFtZScsXG4gICAgICAgICAgc3JjOiBlbC5nZXRBdHRyaWJ1dGUoJ3NyYycpLFxuICAgICAgICAgIHdpZHRoOiBlbC5nZXRBdHRyaWJ1dGUoJ3dpZHRoJyksXG4gICAgICAgICAgaGVpZ2h0OiBlbC5nZXRBdHRyaWJ1dGUoJ2hlaWdodCcpLFxuICAgICAgICAgIHRpdGxlOiBlbC5kYXRhc2V0LnRpdGxlLFxuICAgICAgICAgIHN0YXJ0czogZWwuZGF0YXNldC5zdGFydHMsXG4gICAgICAgICAgZW5kczogZWwuZGF0YXNldC5lbmRzLFxuICAgICAgICAgIHVybDogZWwuZGF0YXNldC51cmwsXG4gICAgICAgIH0pLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdGFnOiAnYXVkaW8nLFxuICAgICAgICBnZXRBdHRyczogKGVsKSA9PiAoe1xuICAgICAgICAgIHR5cGU6ICdhdWRpbycsXG4gICAgICAgICAgdGFnOiAnYXVkaW8nLFxuICAgICAgICAgIHNyYzogZWwucXVlcnlTZWxlY3Rvcignc291cmNlJyk/LmdldEF0dHJpYnV0ZSgnc3JjJyksXG4gICAgICAgIH0pLFxuICAgICAgfSxcbiAgICBdO1xuICB9LFxuXG4gIHJlbmRlckhUTUwoeyBIVE1MQXR0cmlidXRlcyB9KSB7XG4gICAgY29uc3QgeyB0YWcsIHNyYywgd2lkdGgsIGhlaWdodCB9ID0gSFRNTEF0dHJpYnV0ZXM7XG5cbiAgICBpZiAodGFnID09PSAnYXVkaW8nKSB7XG4gICAgICByZXR1cm4gWydhdWRpbycsIHsgY29udHJvbHM6ICdjb250cm9scycsIGNvbnRyb2xzTGlzdDogJ25vZG93bmxvYWQnIH0sIFsnc291cmNlJywgeyBzcmMsIHR5cGU6ICdhdWRpby9tcDMnIH1dXTtcbiAgICB9XG5cbiAgICByZXR1cm4gW1xuICAgICAgJ2lmcmFtZScsXG4gICAgICBtZXJnZUF0dHJpYnV0ZXMoXG4gICAgICAgIHtcbiAgICAgICAgICAnZGF0YS10eXBlJzogJ3ZpZGVvJyxcbiAgICAgICAgICBmcmFtZWJvcmRlcjogJzAnLFxuICAgICAgICAgIGFsbG93OiAnYWNjZWxlcm9tZXRlcjsgYXV0b3BsYXk7IGNsaXBib2FyZC13cml0ZTsgZW5jcnlwdGVkLW1lZGlhOyBneXJvc2NvcGU7IHBpY3R1cmUtaW4tcGljdHVyZScsXG4gICAgICAgICAgYWxsb3dmdWxsc2NyZWVuOiAnJyxcbiAgICAgICAgICBzcmMsXG4gICAgICAgIH0sXG4gICAgICAgIHdpZHRoID8geyB3aWR0aCB9IDoge30sXG4gICAgICAgIGhlaWdodCA/IHsgaGVpZ2h0IH0gOiB7fSxcbiAgICAgICksXG4gICAgXTtcbiAgfSxcblxuICBhZGRDb21tYW5kcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaW5zZXJ0TWVkaWE6IChhdHRycykgPT4gKHsgY29tbWFuZHMgfSkgPT4ge1xuICAgICAgICByZXR1cm4gY29tbWFuZHMuaW5zZXJ0Q29udGVudCh7IHR5cGU6IHRoaXMubmFtZSwgYXR0cnMgfSk7XG4gICAgICB9LFxuICAgICAgdXBkYXRlTWVkaWE6IChhdHRycykgPT4gKHsgY29tbWFuZHMgfSkgPT4ge1xuICAgICAgICByZXR1cm4gY29tbWFuZHMudXBkYXRlQXR0cmlidXRlcyh0aGlzLm5hbWUsIGF0dHJzKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfSxcblxuICBhZGROb2RlVmlldygpIHtcbiAgICByZXR1cm4gUmVhY3ROb2RlVmlld1JlbmRlcmVyKChwcm9wcykgPT4gPE1lZGlhTm9kZVZpZXcgey4uLnsgLi4ucHJvcHMsIG9wdGlvbnM6IHRoaXMub3B0aW9ucyB9fSAvPik7XG4gIH0sXG59KTtcblxuY29uc3QgcmVtb3ZlRGlhbG9ncyA9ICgpID0+IHtcbiAgY29uc3QgcHJldkRpYWxvZ3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuaW5zZXJ0LW1lZGlhLWRpYWxvZycpO1xuXG4gIHByZXZEaWFsb2dzLmZvckVhY2goKHMpID0+IHMucmVtb3ZlKCkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGluc2VydERpYWxvZyA9IChwcm9wcykgPT4ge1xuICBjb25zdCBuZXdFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBjb25zdCB7IHR5cGUsIGNhbGxiYWNrLCBvcHRpb25zLCAuLi5yZXN0IH0gPSBwcm9wcztcbiAgY29uc3QgaW5pdGlhbEJvZHlPdmVyZmxvdyA9IGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3c7XG5cbiAgcmVtb3ZlRGlhbG9ncygpO1xuXG4gIG5ld0VsLmNsYXNzTmFtZSA9ICdpbnNlcnQtbWVkaWEtZGlhbG9nJztcbiAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xuXG4gIGNvbnN0IGhhbmRsZUNsb3NlID0gKHZhbCwgZGF0YSkgPT4ge1xuICAgIGNhbGxiYWNrKHZhbCwgZGF0YSk7XG4gICAgbmV3RWwucmVtb3ZlKCk7XG4gICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9IGluaXRpYWxCb2R5T3ZlcmZsb3c7XG4gIH07XG5cbiAgY29uc3QgZWwgPSAoXG4gICAgPE1lZGlhRGlhbG9nXG4gICAgICB7Li4ucmVzdH1cbiAgICAgIHVwbG9hZFNvdW5kU3VwcG9ydD17b3B0aW9ucy51cGxvYWRTb3VuZFN1cHBvcnR9XG4gICAgICB0eXBlPXt0eXBlfVxuICAgICAgZGlzYWJsZVBvcnRhbD17dHJ1ZX1cbiAgICAgIG9wZW49e3RydWV9XG4gICAgICBoYW5kbGVDbG9zZT17aGFuZGxlQ2xvc2V9XG4gICAgLz5cbiAgKTtcblxuICBSZWFjdERPTS5yZW5kZXIoZWwsIG5ld0VsKTtcblxuICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG5ld0VsKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIE1lZGlhTm9kZVZpZXcoeyBlZGl0b3IsIG5vZGUsIHVwZGF0ZUF0dHJpYnV0ZXMsIGRlbGV0ZU5vZGUsIG9wdGlvbnMgfSkge1xuICBjb25zdCB7IHR5cGUsIHNyYywgd2lkdGgsIGhlaWdodCwgdGFnIH0gPSBub2RlLmF0dHJzO1xuXG4gIGNvbnN0IGhhbmRsZUVkaXQgPSAoKSA9PiB7XG4gICAgaW5zZXJ0RGlhbG9nKHtcbiAgICAgIC4uLm5vZGUuYXR0cnMsXG4gICAgICBlZGl0OiB0cnVlLFxuICAgICAgY2FsbGJhY2s6ICh2YWwsIGRhdGEpID0+IHtcbiAgICAgICAgaWYgKHZhbCkge1xuICAgICAgICAgIHVwZGF0ZUF0dHJpYnV0ZXMoZGF0YSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGVsZXRlTm9kZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgZWRpdG9yLmNoYWluKCkuZm9jdXMoKS5ydW4oKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH07XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpbnNlcnREaWFsb2coe1xuICAgICAgLi4ubm9kZS5hdHRycyxcbiAgICAgIG9wdGlvbnM6IG9wdGlvbnMsXG4gICAgICBlZGl0OiB0cnVlLFxuICAgICAgY2FsbGJhY2s6ICh2YWwsIGRhdGEpID0+IHtcbiAgICAgICAgaWYgKHZhbCkge1xuICAgICAgICAgIHVwZGF0ZUF0dHJpYnV0ZXMoZGF0YSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGVsZXRlTm9kZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgZWRpdG9yLmNoYWluKCkuZm9jdXMoKS5ydW4oKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0sIFtdKTtcblxuICByZXR1cm4gKFxuICAgIDxOb2RlVmlld1dyYXBwZXIgZGF0YS10eXBlPXt0eXBlfSBzdHlsZT17eyB3aWR0aCwgaGVpZ2h0IH19PlxuICAgICAge3RhZyA9PT0gJ2F1ZGlvJyA/IChcbiAgICAgICAgPGF1ZGlvIGNvbnRyb2xzIGNvbnRyb2xzTGlzdD1cIm5vZG93bmxvYWRcIj5cbiAgICAgICAgICA8c291cmNlIHNyYz17c3JjfSAvPlxuICAgICAgICA8L2F1ZGlvPlxuICAgICAgKSA6IChcbiAgICAgICAgPGlmcmFtZSBzcmM9e3NyY30gYWxsb3dGdWxsU2NyZWVuIGZyYW1lQm9yZGVyPVwiMFwiIC8+XG4gICAgICApfVxuXG4gICAgICA8TWVkaWFUb29sYmFyIG9uRWRpdD17aGFuZGxlRWRpdH0gb25SZW1vdmU9e2RlbGV0ZU5vZGV9IC8+XG4gICAgPC9Ob2RlVmlld1dyYXBwZXI+XG4gICk7XG59XG4iXX0=