@bigbinary/neeto-editor-frontend 0.0.0-stage → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (214) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +145 -2
  3. package/app/javascript/src/translations/ar.json +209 -0
  4. package/app/javascript/src/translations/bg.json +209 -0
  5. package/app/javascript/src/translations/ca.json +209 -0
  6. package/app/javascript/src/translations/cs.json +209 -0
  7. package/app/javascript/src/translations/da.json +209 -0
  8. package/app/javascript/src/translations/de.json +209 -0
  9. package/app/javascript/src/translations/en.json +208 -0
  10. package/app/javascript/src/translations/es-MX.json +209 -0
  11. package/app/javascript/src/translations/es.json +209 -0
  12. package/app/javascript/src/translations/et.json +209 -0
  13. package/app/javascript/src/translations/fi.json +209 -0
  14. package/app/javascript/src/translations/fil.json +209 -0
  15. package/app/javascript/src/translations/fr.json +209 -0
  16. package/app/javascript/src/translations/he.json +209 -0
  17. package/app/javascript/src/translations/hi.json +209 -0
  18. package/app/javascript/src/translations/hr.json +209 -0
  19. package/app/javascript/src/translations/hu.json +209 -0
  20. package/app/javascript/src/translations/id.json +209 -0
  21. package/app/javascript/src/translations/index.js +1 -0
  22. package/app/javascript/src/translations/it.json +209 -0
  23. package/app/javascript/src/translations/ja.json +209 -0
  24. package/app/javascript/src/translations/ko.json +209 -0
  25. package/app/javascript/src/translations/lv.json +208 -0
  26. package/app/javascript/src/translations/nl.json +209 -0
  27. package/app/javascript/src/translations/pl.json +209 -0
  28. package/app/javascript/src/translations/pt-BR.json +209 -0
  29. package/app/javascript/src/translations/pt.json +209 -0
  30. package/app/javascript/src/translations/ro.json +209 -0
  31. package/app/javascript/src/translations/ru.json +209 -0
  32. package/app/javascript/src/translations/sk.json +209 -0
  33. package/app/javascript/src/translations/sl.json +209 -0
  34. package/app/javascript/src/translations/sv.json +209 -0
  35. package/app/javascript/src/translations/th.json +209 -0
  36. package/app/javascript/src/translations/tr.json +209 -0
  37. package/app/javascript/src/translations/uk.json +209 -0
  38. package/app/javascript/src/translations/vi.json +209 -0
  39. package/app/javascript/src/translations/zh-CN.json +209 -0
  40. package/app/javascript/src/translations/zh-TW.json +209 -0
  41. package/dist/.ready +1 -0
  42. package/dist/Attachments.js +53 -0
  43. package/dist/Attachments.js.map +1 -0
  44. package/dist/Editor.js +5532 -0
  45. package/dist/Editor.js.map +1 -0
  46. package/dist/EditorContent.js +252 -0
  47. package/dist/EditorContent.js.map +1 -0
  48. package/dist/FormikEditor.js +202 -0
  49. package/dist/FormikEditor.js.map +1 -0
  50. package/dist/Menu.js +107 -0
  51. package/dist/Menu.js.map +1 -0
  52. package/dist/chunk-1NlIGj6C.js +378 -0
  53. package/dist/chunk-1NlIGj6C.js.map +1 -0
  54. package/dist/chunk-BFKmIsWV.js +8660 -0
  55. package/dist/chunk-BFKmIsWV.js.map +1 -0
  56. package/dist/chunk-BFTU3MAI.js +8 -0
  57. package/dist/chunk-BFTU3MAI.js.map +1 -0
  58. package/dist/chunk-Ba4Q3HC8.js +15258 -0
  59. package/dist/chunk-Ba4Q3HC8.js.map +1 -0
  60. package/dist/chunk-Bra5VPWO.js +555 -0
  61. package/dist/chunk-Bra5VPWO.js.map +1 -0
  62. package/dist/chunk-C2dztUxs.js +4 -0
  63. package/dist/chunk-C2dztUxs.js.map +1 -0
  64. package/dist/chunk-CK_Ss-J5.js +425 -0
  65. package/dist/chunk-CK_Ss-J5.js.map +1 -0
  66. package/dist/chunk-CO-Yfs5R.js +206 -0
  67. package/dist/chunk-CO-Yfs5R.js.map +1 -0
  68. package/dist/chunk-CX-0IHKE.js +381 -0
  69. package/dist/chunk-CX-0IHKE.js.map +1 -0
  70. package/dist/chunk-CeoqieEt.js +25570 -0
  71. package/dist/chunk-CeoqieEt.js.map +1 -0
  72. package/dist/chunk-D52F37yF.js +19 -0
  73. package/dist/chunk-D52F37yF.js.map +1 -0
  74. package/dist/chunk-DcFvJOrc.js +3368 -0
  75. package/dist/chunk-DcFvJOrc.js.map +1 -0
  76. package/dist/chunk-DgZGzqPs.js +6804 -0
  77. package/dist/chunk-DgZGzqPs.js.map +1 -0
  78. package/dist/chunk-Di3ipdfT.js +20227 -0
  79. package/dist/chunk-Di3ipdfT.js.map +1 -0
  80. package/dist/chunk-DrHVV_g1.js +89 -0
  81. package/dist/chunk-DrHVV_g1.js.map +1 -0
  82. package/dist/chunk-DsAUS6bL.js +3464 -0
  83. package/dist/chunk-DsAUS6bL.js.map +1 -0
  84. package/dist/chunk-PSGRE5nX.js +97 -0
  85. package/dist/chunk-PSGRE5nX.js.map +1 -0
  86. package/dist/chunk-Qg4uQqj3.js +16238 -0
  87. package/dist/chunk-Qg4uQqj3.js.map +1 -0
  88. package/dist/chunk-aCTMceVU.js +135 -0
  89. package/dist/chunk-aCTMceVU.js.map +1 -0
  90. package/dist/chunk-fDmcpgqx.js +12510 -0
  91. package/dist/chunk-fDmcpgqx.js.map +1 -0
  92. package/dist/chunk-mFZL53CS.js +204 -0
  93. package/dist/chunk-mFZL53CS.js.map +1 -0
  94. package/dist/chunk-y5pmJStT.js +573 -0
  95. package/dist/chunk-y5pmJStT.js.map +1 -0
  96. package/dist/cjs/Attachments.cjs.js +59 -0
  97. package/dist/cjs/Attachments.cjs.js.map +1 -0
  98. package/dist/cjs/Editor.cjs.js +5611 -0
  99. package/dist/cjs/Editor.cjs.js.map +1 -0
  100. package/dist/cjs/EditorContent.cjs.js +266 -0
  101. package/dist/cjs/EditorContent.cjs.js.map +1 -0
  102. package/dist/cjs/FormikEditor.cjs.js +209 -0
  103. package/dist/cjs/FormikEditor.cjs.js.map +1 -0
  104. package/dist/cjs/Menu.cjs.js +113 -0
  105. package/dist/cjs/Menu.cjs.js.map +1 -0
  106. package/dist/cjs/chunk-B2NfgecV.cjs.js +599 -0
  107. package/dist/cjs/chunk-B2NfgecV.cjs.js.map +1 -0
  108. package/dist/cjs/chunk-B6qYtOJe.cjs.js +6 -0
  109. package/dist/cjs/chunk-B6qYtOJe.cjs.js.map +1 -0
  110. package/dist/cjs/chunk-BJu3ubxk.cjs.js +11 -0
  111. package/dist/cjs/chunk-BJu3ubxk.cjs.js.map +1 -0
  112. package/dist/cjs/chunk-BKvkHB8E.cjs.js +16259 -0
  113. package/dist/cjs/chunk-BKvkHB8E.cjs.js.map +1 -0
  114. package/dist/cjs/chunk-BlWQNLLE.cjs.js +3450 -0
  115. package/dist/cjs/chunk-BlWQNLLE.cjs.js.map +1 -0
  116. package/dist/cjs/chunk-Bmjmsp-E.cjs.js +97 -0
  117. package/dist/cjs/chunk-Bmjmsp-E.cjs.js.map +1 -0
  118. package/dist/cjs/chunk-C-VxABfm.cjs.js +25578 -0
  119. package/dist/cjs/chunk-C-VxABfm.cjs.js.map +1 -0
  120. package/dist/cjs/chunk-C8X4oFtP.cjs.js +216 -0
  121. package/dist/cjs/chunk-C8X4oFtP.cjs.js.map +1 -0
  122. package/dist/cjs/chunk-CCCSexAh.cjs.js +206 -0
  123. package/dist/cjs/chunk-CCCSexAh.cjs.js.map +1 -0
  124. package/dist/cjs/chunk-CNIzgxEP.cjs.js +49 -0
  125. package/dist/cjs/chunk-CNIzgxEP.cjs.js.map +1 -0
  126. package/dist/cjs/chunk-CesnwG-V.cjs.js +140 -0
  127. package/dist/cjs/chunk-CesnwG-V.cjs.js.map +1 -0
  128. package/dist/cjs/chunk-CohcWDmm.cjs.js +20318 -0
  129. package/dist/cjs/chunk-CohcWDmm.cjs.js.map +1 -0
  130. package/dist/cjs/chunk-Crp27WMe.cjs.js +6833 -0
  131. package/dist/cjs/chunk-Crp27WMe.cjs.js.map +1 -0
  132. package/dist/cjs/chunk-D3Unocnm.cjs.js +8681 -0
  133. package/dist/cjs/chunk-D3Unocnm.cjs.js.map +1 -0
  134. package/dist/cjs/chunk-D6ygkQBu.cjs.js +421 -0
  135. package/dist/cjs/chunk-D6ygkQBu.cjs.js.map +1 -0
  136. package/dist/cjs/chunk-D7p10rIr.cjs.js +112 -0
  137. package/dist/cjs/chunk-D7p10rIr.cjs.js.map +1 -0
  138. package/dist/cjs/chunk-DM1lUvXy.cjs.js +3525 -0
  139. package/dist/cjs/chunk-DM1lUvXy.cjs.js.map +1 -0
  140. package/dist/cjs/chunk-DWyvxp1a.cjs.js +394 -0
  141. package/dist/cjs/chunk-DWyvxp1a.cjs.js.map +1 -0
  142. package/dist/cjs/chunk-DXsX8co9.cjs.js +12512 -0
  143. package/dist/cjs/chunk-DXsX8co9.cjs.js.map +1 -0
  144. package/dist/cjs/chunk-DxXc6tiG.cjs.js +15326 -0
  145. package/dist/cjs/chunk-DxXc6tiG.cjs.js.map +1 -0
  146. package/dist/cjs/chunk-MxWVMW6e.cjs.js +569 -0
  147. package/dist/cjs/chunk-MxWVMW6e.cjs.js.map +1 -0
  148. package/dist/cjs/chunk-cwORbcv3.cjs.js +479 -0
  149. package/dist/cjs/chunk-cwORbcv3.cjs.js.map +1 -0
  150. package/dist/cjs/constants.cjs.js +13 -0
  151. package/dist/cjs/constants.cjs.js.map +1 -0
  152. package/dist/cjs/index.cjs.js +163 -0
  153. package/dist/cjs/index.cjs.js.map +1 -0
  154. package/dist/cjs/utils.cjs.js +29 -0
  155. package/dist/cjs/utils.cjs.js.map +1 -0
  156. package/dist/cjs/v2/Attachments.cjs.js +49 -0
  157. package/dist/cjs/v2/Attachments.cjs.js.map +1 -0
  158. package/dist/cjs/v2/Editor.cjs.js +5741 -0
  159. package/dist/cjs/v2/Editor.cjs.js.map +1 -0
  160. package/dist/cjs/v2/EditorContent.cjs.js +33 -0
  161. package/dist/cjs/v2/EditorContent.cjs.js.map +1 -0
  162. package/dist/cjs/v2/FormikEditor.cjs.js +164 -0
  163. package/dist/cjs/v2/FormikEditor.cjs.js.map +1 -0
  164. package/dist/cjs/v2/Menu.cjs.js +62 -0
  165. package/dist/cjs/v2/Menu.cjs.js.map +1 -0
  166. package/dist/cjs/v2/constants.cjs.js +13 -0
  167. package/dist/cjs/v2/constants.cjs.js.map +1 -0
  168. package/dist/cjs/v2/index.cjs.js +120 -0
  169. package/dist/cjs/v2/index.cjs.js.map +1 -0
  170. package/dist/cjs/v2/utils.cjs.js +29 -0
  171. package/dist/cjs/v2/utils.cjs.js.map +1 -0
  172. package/dist/codeblockHighlight.js +15155 -0
  173. package/dist/codeblockHighlight.js.map +1 -0
  174. package/dist/constants.js +6 -0
  175. package/dist/constants.js.map +1 -0
  176. package/dist/editor-content.min.css +1 -0
  177. package/dist/editor-output-pdf-email.css +1 -0
  178. package/dist/editor-output-pdf-email.js +4 -0
  179. package/dist/editor-output-pdf-email.js.map +1 -0
  180. package/dist/editor-output.js +4 -0
  181. package/dist/editor-output.js.map +1 -0
  182. package/dist/editor-stats.html +4842 -0
  183. package/dist/editorUtils.js +170 -0
  184. package/dist/headerLinks.js +59 -0
  185. package/dist/headerLinks.js.map +1 -0
  186. package/dist/index.js +146 -0
  187. package/dist/index.js.map +1 -0
  188. package/dist/utils.js +17 -0
  189. package/dist/utils.js.map +1 -0
  190. package/dist/v2/Attachments.js +43 -0
  191. package/dist/v2/Attachments.js.map +1 -0
  192. package/dist/v2/Editor.js +5692 -0
  193. package/dist/v2/Editor.js.map +1 -0
  194. package/dist/v2/EditorContent.js +27 -0
  195. package/dist/v2/EditorContent.js.map +1 -0
  196. package/dist/v2/FormikEditor.js +157 -0
  197. package/dist/v2/FormikEditor.js.map +1 -0
  198. package/dist/v2/Menu.js +56 -0
  199. package/dist/v2/Menu.js.map +1 -0
  200. package/dist/v2/constants.js +6 -0
  201. package/dist/v2/constants.js.map +1 -0
  202. package/dist/v2/editor-content-styles.js +4 -0
  203. package/dist/v2/editor-content-styles.js.map +1 -0
  204. package/dist/v2/editor-content.min.css +1 -0
  205. package/dist/v2/index.js +101 -0
  206. package/dist/v2/index.js.map +1 -0
  207. package/dist/v2/styles.css +1 -0
  208. package/dist/v2/styles.js +4 -0
  209. package/dist/v2/styles.js.map +1 -0
  210. package/dist/v2/utils.js +17 -0
  211. package/dist/v2/utils.js.map +1 -0
  212. package/formik.d.ts +9 -0
  213. package/package.json +322 -4
  214. package/types.d.ts +199 -0
@@ -0,0 +1,3464 @@
1
+ import _defineProperty from '@babel/runtime/helpers/defineProperty';
2
+ import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';
3
+ import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
4
+ import React__default, { memo, createElement, useRef, useState, useEffect, useCallback, useMemo } from 'react';
5
+ import { isEmpty, prop, fromPairs, assoc, not, last } from 'ramda';
6
+ import i18n, { t as t$1 } from 'i18next';
7
+ import * as yup from 'yup';
8
+ import { A as ALL_PROTOCOL_URL_REGEXP, E as EDITOR_OPTIONS, b as URL_VALIDATORS } from './chunk-DrHVV_g1.js';
9
+ import { Megaphone, Info, AlertTriangle, AlertOctagon, CheckCircle2, AtSign, Flag, Smile, Check, X, RotateCw, Baseline, Heading1, Heading2, Heading3, Pilcrow, Undo, Redo, Paperclip, ImageUp, Video, List, ListOrdered, Quote, Code, SquareCode, Bold, Italic, Underline, Link, Strikethrough, Highlighter, ChevronDown, Table, Ellipsis, FileText, Heading4, Heading5, ListChecks } from 'lucide-react';
10
+ import { e as emojiPickerApi, u as useEditorStore, g as generateFocusProps, B as BubbleMenu } from './chunk-Di3ipdfT.js';
11
+ import classnames from 'classnames';
12
+ import { isNotEmpty, findBy, isNotPresent, noop, hyphenate, filterBy } from '@bigbinary/neeto-cist';
13
+ import { DropdownMenu, Avatar, Button as Button$1, Input, Label, Typography, Tooltip, Dialog, Tabs, Toastr, Checkbox } from '@bigbinary/neeto-atoms';
14
+ import { Popover, PopoverTrigger, PopoverContent } from '@bigbinary/neeto-atoms/primitives/Popover';
15
+ import { useTranslation } from 'react-i18next';
16
+ import { jsx, jsxs, Fragment as Fragment$1 } from 'react/jsx-runtime';
17
+ import _asyncToGenerator from '@babel/runtime/helpers/asyncToGenerator';
18
+ import _classCallCheck from '@babel/runtime/helpers/classCallCheck';
19
+ import _createClass from '@babel/runtime/helpers/createClass';
20
+ import _possibleConstructorReturn from '@babel/runtime/helpers/possibleConstructorReturn';
21
+ import _getPrototypeOf from '@babel/runtime/helpers/getPrototypeOf';
22
+ import _inherits from '@babel/runtime/helpers/inherits';
23
+ import _regeneratorRuntime from '@babel/runtime/regenerator';
24
+ import { Picker } from 'emoji-mart';
25
+ import { withEventTargetValue, hyphenize } from '@bigbinary/neeto-commons-frontend/v2/utils';
26
+ import { HexColorPicker } from 'react-colorful';
27
+ import { N as Node, F as Fragment, S as Slice, a as Selection } from './chunk-DgZGzqPs.js';
28
+ import _objectWithoutProperties from '@babel/runtime/helpers/objectWithoutProperties';
29
+ import ImageUploader from '@bigbinary/neeto-image-uploader-frontend/v2/ImageUploader';
30
+ import { u as useDropFiles, d as directUploadsApi } from './chunk-BFKmIsWV.js';
31
+ import { F as File, u as useFileUploader, b as ALLOWED_IMAGE_TYPES, d as ALLOWED_VIDEO_TYPES, c as convertToFileSize, e as DEFAULT_IMAGE_UPLOAD_CONFIG, f as DEFAULT_VIDEO_UPLOAD_CONFIG, V as VIDEO_EMBED_FORM_VALIDATION_SCHEMA, g as getTabs } from './chunk-1NlIGj6C.js';
32
+ import { withT, useOnClickOutside } from '@bigbinary/neeto-commons-frontend/v2/react-utils';
33
+ import { Form, Input as Input$1, ActionBlock } from '@bigbinary/neeto-atoms/formik';
34
+ import { createPortal } from 'react-dom';
35
+ import { shallow } from 'zustand/shallow';
36
+ import DynamicVariables from '@bigbinary/neeto-molecules/v2/DynamicVariables';
37
+ import Tippy from '@tippyjs/react';
38
+
39
+ var DEFAULT_EDITOR_OPTIONS = [EDITOR_OPTIONS.BOLD, EDITOR_OPTIONS.ITALIC, EDITOR_OPTIONS.UNDERLINE, EDITOR_OPTIONS.STRIKETHROUGH, EDITOR_OPTIONS.LINK, EDITOR_OPTIONS.PARAGRAPH, EDITOR_OPTIONS.H1, EDITOR_OPTIONS.H2, EDITOR_OPTIONS.H3, EDITOR_OPTIONS.H4, EDITOR_OPTIONS.H5, EDITOR_OPTIONS.H6, EDITOR_OPTIONS.LIST_BULLETS, EDITOR_OPTIONS.LIST_ORDERED, EDITOR_OPTIONS.CODE];
40
+ var EDITOR_PADDING_SIZE = 12;
41
+ var EDITOR_BORDER_SIZE = 1;
42
+ var EDITOR_LINE_HEIGHT = 21;
43
+ var IMAGE_REGEX = new RegExp(/(<img[^>]*?>)(?![\s\S]*<\/figure>)/g);
44
+ var IMAGE_REPLACEMENT_PATTERN = "<figure>$1</figure>";
45
+ var EMPTY_DIV_REGEX = new RegExp(/<div[^>]*?>\s*(?:<br[^>]*?>)\s*<\/div>/g);
46
+ var TRAILING_BR_REGEX = new RegExp(/\s*(?:<br[^>]*?>)+\s*$/);
47
+ var LINK_VALIDATION_SCHEMA = yup.object().shape({
48
+ textContent: yup.string().required(t$1("neetoEditor.error.textRequired")),
49
+ urlString: yup.string().matches(ALL_PROTOCOL_URL_REGEXP, t$1("neetoEditor.error.invalidUrl")).required(t$1("neetoEditor.error.urlRequired"))
50
+ });
51
+
52
+ var getEditorStyles = function getEditorStyles(_ref) {
53
+ var rows = _ref.rows;
54
+ var editorHeight = rows * EDITOR_LINE_HEIGHT + 2 * (EDITOR_PADDING_SIZE + EDITOR_BORDER_SIZE);
55
+ return "min-height: ".concat(editorHeight, "px;");
56
+ };
57
+ var clipboardTextParser = function clipboardTextParser(text, context) {
58
+ var nodes = [];
59
+ var blocks = text.split(/\n/);
60
+ blocks.forEach(function (line) {
61
+ var nodeJson = {
62
+ type: "paragraph"
63
+ };
64
+ if (isNotEmpty(line)) {
65
+ nodeJson.content = [{
66
+ type: "text",
67
+ text: line
68
+ }];
69
+ }
70
+ var node = Node.fromJSON(context.doc.type.schema, nodeJson);
71
+ nodes.push(node);
72
+ });
73
+ var fragment = Fragment.fromArray(nodes);
74
+ return Slice.maxOpen(fragment);
75
+ };
76
+ var setInitialPosition = function setInitialPosition(editor) {
77
+ var state = editor.state,
78
+ view = editor.view;
79
+ var endPosition = Selection.atEnd(state.doc);
80
+ var transaction = state.tr;
81
+ transaction.setSelection(endPosition);
82
+ view.dispatch(transaction);
83
+ };
84
+ var isEditorOverlaysActive = function isEditorOverlaysActive() {
85
+ return document.querySelector(".ne-media-uploader,.ne-embed-modal,.tippy-content,.ne-link-popover");
86
+ };
87
+ var validateAndFormatUrl = function validateAndFormatUrl(url) {
88
+ if (!ALL_PROTOCOL_URL_REGEXP.test(url)) {
89
+ return null;
90
+ }
91
+ if (!/^[a-zA-Z]\w*:/i.test(url)) {
92
+ return "https://".concat(url);
93
+ }
94
+ return url;
95
+ };
96
+ var transformEditorContent = function transformEditorContent(content) {
97
+ var _content$replaceAll;
98
+ return content === null || content === void 0 || (_content$replaceAll = content.replaceAll(IMAGE_REGEX, IMAGE_REPLACEMENT_PATTERN)) === null || _content$replaceAll === void 0 || (_content$replaceAll = _content$replaceAll.replaceAll(EMPTY_DIV_REGEX, "")) === null || _content$replaceAll === void 0 ? void 0 : _content$replaceAll.replace(TRAILING_BR_REGEX, "");
99
+ };
100
+ var isEmojiSuggestionsMenuActive = function isEmojiSuggestionsMenuActive() {
101
+ return !!document.querySelector(".neeto-editor-emoji-suggestion");
102
+ };
103
+ var transformPastedHTML = function transformPastedHTML(content) {
104
+ var contentWithoutBr = content.replaceAll("<br />", "<p></p>");
105
+ var doc = new DOMParser().parseFromString(contentWithoutBr, "text/html");
106
+
107
+ // ProseMirror tags clipboard output from any TipTap/ProseMirror editor with
108
+ // `data-pm-slice`. When present, the paste is coming from another
109
+ // neeto-editor instance and we preserve the author's color choices. When
110
+ // absent, the source is external (Word, websites, customer messages) and we
111
+ // strip inline colors so foreign theming does not bleed into the editor.
112
+ var isInternalPaste = doc.querySelector("[data-pm-slice]") !== null;
113
+ if (!isInternalPaste) {
114
+ doc.querySelectorAll("[style]").forEach(function (el) {
115
+ el.style.color = "";
116
+ el.style.backgroundColor = "";
117
+ });
118
+ }
119
+ return doc.body.innerHTML;
120
+ };
121
+ var handlePaste = function handlePaste(view, event, slice) {
122
+ try {
123
+ view.state.tr.replaceSelection(slice);
124
+ return false;
125
+ } catch (_unused) {
126
+ var _event$clipboardData;
127
+ var text = ((_event$clipboardData = event.clipboardData) === null || _event$clipboardData === void 0 ? void 0 : _event$clipboardData.getData("text/plain")) || slice.content.textBetween(0, slice.content.size, "\n").trim();
128
+ if (text) view.dispatch(view.state.tr.insertText(text).scrollIntoView());
129
+ return true;
130
+ }
131
+ };
132
+ var buildLevelsFromOptions = function buildLevelsFromOptions(options) {
133
+ var levels = _defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty({}, EDITOR_OPTIONS.H1, 1), EDITOR_OPTIONS.H2, 2), EDITOR_OPTIONS.H3, 3), EDITOR_OPTIONS.H4, 4), EDITOR_OPTIONS.H5, 5), EDITOR_OPTIONS.H6, 6);
134
+ return Object.entries(levels).filter(function (heading) {
135
+ return options.includes(heading[0]);
136
+ }).map(function (heading) {
137
+ return heading[1];
138
+ });
139
+ };
140
+
141
+ // Suggestion popups (slash, mention, emoji) append to the editor container by
142
+ // default so they stay usable inside a Radix Dialog, whose focus trap excludes
143
+ // document.body. An editor docked at the viewport bottom (e.g. a chat composer)
144
+ // can opt into appending to body via the Editor `appendSuggestionsToBody` prop,
145
+ // so the popup escapes the container's clipping and stacking context and can
146
+ // flip upward into the available space.
147
+ var getSuggestionAppendTo = function getSuggestionAppendTo(editor) {
148
+ return function () {
149
+ var _editor$storage, _container$containerR, _container$containerR2;
150
+ var container = editor === null || editor === void 0 || (_editor$storage = editor.storage) === null || _editor$storage === void 0 ? void 0 : _editor$storage.editorContainer;
151
+ return container !== null && container !== void 0 && container.appendSuggestionsToBody ? document.body : (_container$containerR = container === null || container === void 0 || (_container$containerR2 = container.containerRef) === null || _container$containerR2 === void 0 ? void 0 : _container$containerR2.current) !== null && _container$containerR !== void 0 ? _container$containerR : document.body;
152
+ };
153
+ };
154
+
155
+ var CALLOUT_TYPES = [{
156
+ type: "default",
157
+ label: t$1("neetoEditor.menu.calloutDefault"),
158
+ icon: Megaphone,
159
+ bgColor: "--neeto-editor-gray-100"
160
+ }, {
161
+ type: "info",
162
+ label: t$1("neetoEditor.menu.calloutInfo"),
163
+ icon: Info,
164
+ bgColor: "--neeto-editor-info-100",
165
+ iconColor: "var(--ne-editor-content-callout-info-foreground-color)"
166
+ }, {
167
+ type: "warning",
168
+ label: t$1("neetoEditor.menu.calloutWarning"),
169
+ icon: AlertTriangle,
170
+ bgColor: "--neeto-editor-warning-100",
171
+ iconColor: "var(--ne-editor-content-callout-warning-foreground-color)"
172
+ }, {
173
+ type: "error",
174
+ label: t$1("neetoEditor.menu.calloutError"),
175
+ icon: AlertOctagon,
176
+ bgColor: "--neeto-editor-error-100",
177
+ iconColor: "var(--ne-editor-content-callout-error-foreground-color)"
178
+ }, {
179
+ type: "success",
180
+ label: t$1("neetoEditor.menu.calloutSuccess"),
181
+ icon: CheckCircle2,
182
+ bgColor: "--neeto-editor-success-100",
183
+ iconColor: "var(--ne-editor-content-callout-success-foreground-color)"
184
+ }];
185
+
186
+ function ownKeys$b(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; }
187
+ function _objectSpread$b(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$b(Object(t), true).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$b(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
188
+ function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }
189
+ function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
190
+ var EmojiPickerMenu = /*#__PURE__*/function (_React$Component) {
191
+ function EmojiPickerMenu() {
192
+ var _this;
193
+ _classCallCheck(this, EmojiPickerMenu);
194
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
195
+ args[_key] = arguments[_key];
196
+ }
197
+ _this = _callSuper(this, EmojiPickerMenu, [].concat(args));
198
+ _defineProperty(_this, "ref", /*#__PURE__*/React__default.createRef());
199
+ _defineProperty(_this, "fetchEmojiData", /*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
200
+ var _yield$emojiPickerApi, data;
201
+ return _regeneratorRuntime.wrap(function _callee$(_context) {
202
+ while (1) switch (_context.prev = _context.next) {
203
+ case 0:
204
+ _context.prev = 0;
205
+ _context.next = 3;
206
+ return emojiPickerApi.fetch();
207
+ case 3:
208
+ _yield$emojiPickerApi = _context.sent;
209
+ data = _yield$emojiPickerApi.data;
210
+ return _context.abrupt("return", data);
211
+ case 8:
212
+ _context.prev = 8;
213
+ _context.t0 = _context["catch"](0);
214
+ return _context.abrupt("return", {});
215
+ case 11:
216
+ case "end":
217
+ return _context.stop();
218
+ }
219
+ }, _callee, null, [[0, 8]]);
220
+ })));
221
+ _defineProperty(_this, "onKeyDown", function (_ref2) {
222
+ var event = _ref2.event;
223
+ if (event.key === "Escape") {
224
+ _this.props.editor.chain().focus().deleteRange(_this.props.range).run();
225
+ return true;
226
+ }
227
+ return false;
228
+ });
229
+ _defineProperty(_this, "handleSelect", function (emoji) {
230
+ var _this$props$setActive, _this$props;
231
+ _this.props.editor.chain().focus().deleteRange(_this.props.range).setEmoji(emoji).run();
232
+ (_this$props$setActive = (_this$props = _this.props).setActive) === null || _this$props$setActive === void 0 || _this$props$setActive.call(_this$props, false);
233
+ });
234
+ return _this;
235
+ }
236
+ _inherits(EmojiPickerMenu, _React$Component);
237
+ return _createClass(EmojiPickerMenu, [{
238
+ key: "componentDidMount",
239
+ value: function componentDidMount() {
240
+ new Picker(_objectSpread$b(_objectSpread$b({}, this.props), {}, {
241
+ onEmojiSelect: this.handleSelect,
242
+ style: {
243
+ maxWidth: "100%"
244
+ },
245
+ theme: "light",
246
+ "native": true,
247
+ previewPosition: "none",
248
+ showSkinTones: false,
249
+ data: this.fetchEmojiData,
250
+ ref: this.ref
251
+ }));
252
+ }
253
+ }, {
254
+ key: "render",
255
+ value: function render() {
256
+ return /*#__PURE__*/jsx("div", {
257
+ "data-testid": "neeto-editor-emoji-picker",
258
+ ref: this.ref,
259
+ style: {
260
+ minWidth: "350px"
261
+ }
262
+ });
263
+ }
264
+ }]);
265
+ }(React__default.Component);
266
+ EmojiPickerMenu.defaultProps = {
267
+ editor: {},
268
+ range: {}
269
+ };
270
+
271
+ var validateUrl = function validateUrl(url) {
272
+ if (!url) return false;
273
+ for (var _i = 0, _Object$values = Object.values(URL_VALIDATORS); _i < _Object$values.length; _i++) {
274
+ var validator = _Object$values[_i];
275
+ var result = validator(url);
276
+ if (result) return result;
277
+ }
278
+ return false;
279
+ };
280
+
281
+ var Menu$4 = DropdownMenu.Menu,
282
+ MenuItem$3 = DropdownMenu.MenuItem;
283
+ var Mentions = function Mentions(_ref) {
284
+ var editor = _ref.editor,
285
+ mentions = _ref.mentions,
286
+ tooltipContent = _ref.tooltipContent,
287
+ _ref$isSecondaryMenu = _ref.isSecondaryMenu,
288
+ isSecondaryMenu = _ref$isSecondaryMenu === void 0 ? false : _ref$isSecondaryMenu,
289
+ label = _ref.label;
290
+ if (isEmpty(mentions)) return null;
291
+ var renderItems = mentions.map(function (_ref2) {
292
+ var key = _ref2.key,
293
+ name = _ref2.name,
294
+ imageUrl = _ref2.imageUrl;
295
+ return /*#__PURE__*/jsx(MenuItem$3, {
296
+ "data-testid": "neeto-editor-mention-option-".concat(key),
297
+ prefix: /*#__PURE__*/jsx(Avatar, {
298
+ size: "sm",
299
+ user: {
300
+ name: name,
301
+ imageUrl: imageUrl
302
+ }
303
+ }),
304
+ onClick: function onClick() {
305
+ return editor.commands.setMention({
306
+ id: key,
307
+ label: name
308
+ });
309
+ },
310
+ children: name
311
+ }, key);
312
+ });
313
+ if (isSecondaryMenu) {
314
+ return /*#__PURE__*/jsx(DropdownMenu.SubMenu, {
315
+ label: label,
316
+ contentProps: {
317
+ className: "ne-editor-dropdown min-w-56"
318
+ },
319
+ icon: AtSign,
320
+ triggerProps: {
321
+ "data-testid": "neeto-editor-mention-option"
322
+ },
323
+ children: renderItems
324
+ });
325
+ }
326
+ return /*#__PURE__*/jsx(DropdownMenu, {
327
+ "data-testid": "neeto-editor-mention-option",
328
+ dropdownProps: {
329
+ className: "ne-editor-dropdown min-w-56"
330
+ },
331
+ icon: AtSign,
332
+ position: "bottom-start",
333
+ buttonProps: {
334
+ variant: "ghost",
335
+ size: "sm",
336
+ tooltipProps: {
337
+ content: tooltipContent !== null && tooltipContent !== void 0 ? tooltipContent : label,
338
+ position: "bottom"
339
+ },
340
+ className: "ne-toolbar-item ne-toolbar-dropdown"
341
+ },
342
+ children: /*#__PURE__*/jsx(Menu$4, {
343
+ children: renderItems
344
+ })
345
+ });
346
+ };
347
+ var Mentions$1 = /*#__PURE__*/memo(Mentions);
348
+
349
+ function ownKeys$a(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; }
350
+ function _objectSpread$a(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$a(Object(t), true).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$a(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
351
+ var MenuButton = function MenuButton(_ref) {
352
+ var icon = _ref.icon,
353
+ command = _ref.command,
354
+ optionName = _ref.optionName,
355
+ highlight = _ref.highlight,
356
+ _ref$disabled = _ref.disabled,
357
+ isButtonDisabled = _ref$disabled === void 0 ? false : _ref$disabled,
358
+ label = _ref.label;
359
+ var _useEditorStore = useEditorStore(function (store) {
360
+ var _store$marksState, _store$marksState2;
361
+ return {
362
+ isActive: (_store$marksState = store["marksState"]) === null || _store$marksState === void 0 || (_store$marksState = _store$marksState[optionName]) === null || _store$marksState === void 0 ? void 0 : _store$marksState["isActive"],
363
+ disabled: (_store$marksState2 = store["marksState"]) === null || _store$marksState2 === void 0 || (_store$marksState2 = _store$marksState2[optionName]) === null || _store$marksState2 === void 0 ? void 0 : _store$marksState2["disabled"]
364
+ };
365
+ }, shallow),
366
+ isActive = _useEditorStore.isActive,
367
+ _useEditorStore$disab = _useEditorStore.disabled,
368
+ disabled = _useEditorStore$disab === void 0 ? isButtonDisabled : _useEditorStore$disab;
369
+ return /*#__PURE__*/jsx(Button$1, _objectSpread$a({
370
+ disabled: disabled,
371
+ icon: icon,
372
+ className: "ne-toolbar-item",
373
+ "data-testid": "neeto-editor-fixed-menu-".concat(optionName, "-option"),
374
+ tabIndex: "-1",
375
+ variant: isActive ? "secondary" : "ghost",
376
+ tooltipProps: {
377
+ content: renderTooltipContent(label, optionName),
378
+ position: "bottom"
379
+ },
380
+ onClick: command
381
+ }, generateFocusProps(highlight)));
382
+ };
383
+ var MenuButton$1 = /*#__PURE__*/memo(MenuButton);
384
+
385
+ var CalloutIcon = function CalloutIcon(_ref) {
386
+ var _currentType$icon;
387
+ var currentType = _ref.currentType;
388
+ var Icon = (_currentType$icon = currentType === null || currentType === void 0 ? void 0 : currentType.icon) !== null && _currentType$icon !== void 0 ? _currentType$icon : Flag;
389
+ return /*#__PURE__*/jsx(Icon, {
390
+ size: 16
391
+ });
392
+ };
393
+
394
+ var MenuItem$2 = DropdownMenu.MenuItem;
395
+ var CalloutTypeOption = function CalloutTypeOption(_ref) {
396
+ var calloutType = _ref.calloutType,
397
+ isSelected = _ref.isSelected,
398
+ onClick = _ref.onClick;
399
+ var Icon = calloutType.icon;
400
+ return /*#__PURE__*/jsx(MenuItem$2, {
401
+ onClick: onClick,
402
+ "data-testid": "callout-type-option",
403
+ isActive: isSelected,
404
+ prefix: /*#__PURE__*/jsx(Icon, {
405
+ "data-testid": "callout-type-emoji",
406
+ size: 16,
407
+ style: {
408
+ stroke: calloutType.iconColor
409
+ }
410
+ }),
411
+ children: calloutType.label
412
+ });
413
+ };
414
+
415
+ var RenderCalloutOptions = function RenderCalloutOptions(_ref) {
416
+ var isInCallout = _ref.isInCallout,
417
+ currentCalloutAttrs = _ref.currentCalloutAttrs,
418
+ handleCalloutTypeClick = _ref.handleCalloutTypeClick;
419
+ return CALLOUT_TYPES.map(function (calloutType, idx) {
420
+ return /*#__PURE__*/createElement(CalloutTypeOption, {
421
+ calloutType: calloutType,
422
+ isSelected: isInCallout && (currentCalloutAttrs === null || currentCalloutAttrs === void 0 ? void 0 : currentCalloutAttrs.type) === calloutType.type,
423
+ key: idx,
424
+ onClick: function onClick() {
425
+ return handleCalloutTypeClick(calloutType);
426
+ }
427
+ });
428
+ });
429
+ };
430
+
431
+ var CalloutDropdown = function CalloutDropdown(_ref) {
432
+ var editor = _ref.editor,
433
+ label = _ref.label,
434
+ tooltipContent = _ref.tooltipContent,
435
+ _ref$isSecondaryMenu = _ref.isSecondaryMenu,
436
+ isSecondaryMenu = _ref$isSecondaryMenu === void 0 ? false : _ref$isSecondaryMenu;
437
+ var _useTranslation = useTranslation(),
438
+ t = _useTranslation.t;
439
+ var dropdownRef = useRef(null);
440
+ var isInCallout = editor.isActive("callout");
441
+ var currentCalloutAttrs = isInCallout ? editor.getAttributes("callout") : null;
442
+ var currentType = findBy({
443
+ type: currentCalloutAttrs === null || currentCalloutAttrs === void 0 ? void 0 : currentCalloutAttrs.type
444
+ }, CALLOUT_TYPES) || CALLOUT_TYPES[0];
445
+ var handleCalloutTypeClick = function handleCalloutTypeClick(calloutType) {
446
+ var editorChain = editor.chain().focus();
447
+ var isSameType = isInCallout && (currentCalloutAttrs === null || currentCalloutAttrs === void 0 ? void 0 : currentCalloutAttrs.type) === calloutType.type;
448
+ if (isSameType) {
449
+ editorChain.lift("callout").run();
450
+ } else if (isInCallout) {
451
+ editorChain.updateAttributes("callout", {
452
+ type: calloutType.type,
453
+ emoji: calloutType.emoji
454
+ }).run();
455
+ } else {
456
+ editorChain.setCallout({
457
+ type: calloutType.type,
458
+ emoji: calloutType.emoji
459
+ }).run();
460
+ }
461
+ };
462
+ var renderOptions = /*#__PURE__*/jsxs(Fragment$1, {
463
+ children: [/*#__PURE__*/jsx(DropdownMenu.Label, {
464
+ children: t("neetoEditor.menu.selectCalloutType")
465
+ }), /*#__PURE__*/jsx(RenderCalloutOptions, {
466
+ currentCalloutAttrs: currentCalloutAttrs,
467
+ handleCalloutTypeClick: handleCalloutTypeClick,
468
+ isInCallout: isInCallout
469
+ })]
470
+ });
471
+ if (isSecondaryMenu) {
472
+ return /*#__PURE__*/jsx(DropdownMenu.SubMenu, {
473
+ label: label,
474
+ contentProps: {
475
+ className: "ne-editor-dropdown w-[200px] p-2"
476
+ },
477
+ icon: isInCallout ? currentType.icon : Flag,
478
+ triggerProps: {
479
+ "data-testid": "neeto-editor-fixed-menu-callout-option"
480
+ },
481
+ children: renderOptions
482
+ });
483
+ }
484
+ return /*#__PURE__*/jsx(DropdownMenu, {
485
+ dropdownProps: {
486
+ className: "ne-editor-dropdown w-[200px] p-2"
487
+ },
488
+ icon: /*#__PURE__*/jsx(CalloutIcon, {
489
+ currentType: isInCallout ? currentType : null
490
+ }),
491
+ position: "bottom-start",
492
+ triggerRef: dropdownRef,
493
+ buttonProps: {
494
+ "data-testid": "neeto-editor-fixed-menu-callout-option",
495
+ onKeyDown: function onKeyDown(event) {
496
+ var _dropdownRef$current;
497
+ return event.key === "ArrowDown" && ((_dropdownRef$current = dropdownRef.current) === null || _dropdownRef$current === void 0 ? void 0 : _dropdownRef$current.click());
498
+ },
499
+ tooltipProps: {
500
+ content: tooltipContent !== null && tooltipContent !== void 0 ? tooltipContent : label,
501
+ position: "bottom"
502
+ },
503
+ variant: isInCallout ? "secondary" : "ghost",
504
+ className: "ne-toolbar-item ne-toolbar-dropdown"
505
+ },
506
+ children: /*#__PURE__*/jsx(DropdownMenu.Menu, {
507
+ children: renderOptions
508
+ })
509
+ });
510
+ };
511
+
512
+ var EmojiOption = function EmojiOption(_ref) {
513
+ var editor = _ref.editor,
514
+ setActive = _ref.setActive,
515
+ tooltipContent = _ref.tooltipContent,
516
+ _ref$isSecondaryMenu = _ref.isSecondaryMenu,
517
+ isSecondaryMenu = _ref$isSecondaryMenu === void 0 ? false : _ref$isSecondaryMenu,
518
+ label = _ref.label;
519
+ // Bumping this key remounts the DropdownMenu, which closes it after an
520
+ // emoji is picked. The wrapper exposes onClose for the close direction
521
+ // but no programmatic close, and going controlled via isOpen + onClick
522
+ // flips the wrapper into SplitTrigger mode (a two-button ButtonGroup).
523
+ var _useState = useState(0),
524
+ _useState2 = _slicedToArray(_useState, 2),
525
+ resetKey = _useState2[0],
526
+ setResetKey = _useState2[1];
527
+ var handlePicked = function handlePicked() {
528
+ setActive(false);
529
+ setResetKey(function (k) {
530
+ return k + 1;
531
+ });
532
+ };
533
+ if (isSecondaryMenu) {
534
+ return /*#__PURE__*/createElement(DropdownMenu.SubMenu, {
535
+ label: label,
536
+ icon: Smile,
537
+ key: resetKey,
538
+ contentProps: {
539
+ className: "ne-editor-dropdown neeto-editor-fixed-menu__emoji-dropdown min-w-[350px] p-0"
540
+ },
541
+ triggerProps: {
542
+ "data-testid": "neeto-editor-fixed-menu-emoji-option"
543
+ }
544
+ }, /*#__PURE__*/jsx(EmojiPickerMenu, {
545
+ editor: editor,
546
+ setActive: handlePicked
547
+ }));
548
+ }
549
+ return /*#__PURE__*/jsx(DropdownMenu, {
550
+ closeOnSelect: false,
551
+ icon: Smile,
552
+ position: "bottom-start",
553
+ buttonProps: {
554
+ variant: "ghost",
555
+ tabIndex: -1,
556
+ tooltipProps: {
557
+ content: tooltipContent !== null && tooltipContent !== void 0 ? tooltipContent : label,
558
+ position: "bottom"
559
+ },
560
+ className: "ne-toolbar-item ne-toolbar-dropdown",
561
+ "data-testid": "neeto-editor-fixed-menu-emoji-option"
562
+ },
563
+ dropdownProps: {
564
+ className: "ne-editor-dropdown neeto-editor-fixed-menu__emoji-dropdown min-w-[350px] p-0"
565
+ },
566
+ onClose: function onClose() {
567
+ return setActive(false);
568
+ },
569
+ children: /*#__PURE__*/jsx(EmojiPickerMenu, {
570
+ editor: editor,
571
+ setActive: handlePicked
572
+ })
573
+ }, resetKey);
574
+ };
575
+ var EmojiOption$1 = /*#__PURE__*/memo(EmojiOption);
576
+
577
+ var TextColorOption = function TextColorOption(_ref) {
578
+ var editor = _ref.editor,
579
+ tooltipContent = _ref.tooltipContent,
580
+ _ref$isSecondaryMenu = _ref.isSecondaryMenu,
581
+ isSecondaryMenu = _ref$isSecondaryMenu === void 0 ? false : _ref$isSecondaryMenu,
582
+ label = _ref.label;
583
+ var _useState = useState(null),
584
+ _useState2 = _slicedToArray(_useState, 2),
585
+ color = _useState2[0],
586
+ setColor = _useState2[1];
587
+ // Bumping this key remounts the DropdownMenu, which closes it after the
588
+ // user clicks Save / Reset / Cancel. See the analogous comment in
589
+ // TableOption for why we close via remount instead of controlled isOpen.
590
+ var _useState3 = useState(0),
591
+ _useState4 = _slicedToArray(_useState3, 2),
592
+ resetKey = _useState4[0],
593
+ setResetKey = _useState4[1];
594
+ var _useTranslation = useTranslation(),
595
+ t = _useTranslation.t;
596
+ var closeMenu = function closeMenu() {
597
+ return setResetKey(function (k) {
598
+ return k + 1;
599
+ });
600
+ };
601
+ var handleSave = function handleSave() {
602
+ editor.chain().focus().setColor(color).run();
603
+ closeMenu();
604
+ };
605
+ var handleUnset = function handleUnset() {
606
+ editor.chain().focus().unsetColor().run();
607
+ setColor(null);
608
+ closeMenu();
609
+ };
610
+ useEffect(function () {
611
+ setColor(editor.getAttributes("textStyle").color);
612
+ }, [resetKey, editor.getAttributes("textStyle").color]);
613
+ var pickerContent = /*#__PURE__*/jsxs("div", {
614
+ style: {
615
+ minWidth: "236px"
616
+ },
617
+ onClick: function onClick(e) {
618
+ e.stopPropagation();
619
+ },
620
+ children: [/*#__PURE__*/jsx(HexColorPicker, {
621
+ color: color || "#000000",
622
+ onChange: setColor
623
+ }), /*#__PURE__*/jsxs("div", {
624
+ className: "neeto-editor-text-color-option__options-group",
625
+ children: [/*#__PURE__*/jsx(Input, {
626
+ autoFocus: true,
627
+ className: "neeto-editor-text-color-option__options-group__input",
628
+ placeholder: t("neetoEditor.placeholders.pickColor"),
629
+ size: "small",
630
+ value: color,
631
+ onChange: withEventTargetValue(setColor),
632
+ onClick: function onClick(event) {
633
+ return event.stopPropagation();
634
+ }
635
+ }), /*#__PURE__*/jsx(Button$1, {
636
+ icon: Check,
637
+ size: "sm",
638
+ onClick: handleSave
639
+ }), /*#__PURE__*/jsx(Button$1, {
640
+ icon: X,
641
+ size: "sm",
642
+ variant: "ghost",
643
+ onClick: function onClick() {
644
+ editor.commands.focus();
645
+ closeMenu();
646
+ }
647
+ }), /*#__PURE__*/jsx(Button$1, {
648
+ icon: RotateCw,
649
+ size: "sm",
650
+ variant: "ghost",
651
+ tooltipProps: {
652
+ content: t("neetoEditor.common.resetToDefault"),
653
+ position: "top"
654
+ },
655
+ onClick: handleUnset
656
+ })]
657
+ })]
658
+ });
659
+ if (isSecondaryMenu) {
660
+ return /*#__PURE__*/createElement(DropdownMenu.SubMenu, {
661
+ label: label,
662
+ contentProps: {
663
+ className: "ne-editor-dropdown w-[260px] p-2"
664
+ },
665
+ icon: Baseline,
666
+ key: resetKey,
667
+ triggerProps: {
668
+ "data-testid": "neeto-editor-fixed-menu-text-color-option"
669
+ }
670
+ }, pickerContent);
671
+ }
672
+ return /*#__PURE__*/jsx(DropdownMenu, {
673
+ closeOnSelect: false,
674
+ dropdownProps: {
675
+ className: "ne-editor-dropdown w-[260px] p-2"
676
+ },
677
+ icon: Baseline,
678
+ position: "bottom-start",
679
+ buttonProps: {
680
+ variant: color ? "secondary" : "ghost",
681
+ tabIndex: -1,
682
+ tooltipProps: {
683
+ content: tooltipContent !== null && tooltipContent !== void 0 ? tooltipContent : label,
684
+ position: "bottom"
685
+ },
686
+ className: "ne-toolbar-item ne-toolbar-dropdown neeto-editor-text-color-option",
687
+ "data-testid": "neeto-editor-fixed-menu-text-color-option"
688
+ },
689
+ children: pickerContent
690
+ }, resetKey);
691
+ };
692
+
693
+ var LinkOption = function LinkOption(_ref) {
694
+ var editor = _ref.editor,
695
+ handleClose = _ref.handleClose,
696
+ handleAnimateInvalidLink = _ref.handleAnimateInvalidLink;
697
+ var _useTranslation = useTranslation(),
698
+ t = _useTranslation.t;
699
+ var _useState = useState(""),
700
+ _useState2 = _slicedToArray(_useState, 2),
701
+ link = _useState2[0],
702
+ setLink = _useState2[1];
703
+ useEffect(function () {
704
+ setLink(editor.getAttributes("link").href || "");
705
+ }, [editor]);
706
+ var handleKeyDown = function handleKeyDown(event) {
707
+ if (event.key === "Escape") {
708
+ handleClose();
709
+ } else if (event.key === "Enter") {
710
+ handleSubmit();
711
+ }
712
+ };
713
+ var handleSubmit = function handleSubmit() {
714
+ if (ALL_PROTOCOL_URL_REGEXP.test(link)) {
715
+ editor.chain().focus().setLink({
716
+ href: link
717
+ }).run();
718
+ handleClose();
719
+ } else if (isNotPresent(link)) {
720
+ editor.chain().focus().unsetLink().run();
721
+ handleClose();
722
+ } else {
723
+ setLink("");
724
+ handleAnimateInvalidLink();
725
+ }
726
+ };
727
+ var handleReset = function handleReset() {
728
+ if (link) {
729
+ setLink("");
730
+ editor.chain().focus().unsetLink().run();
731
+ } else {
732
+ handleClose();
733
+ }
734
+ };
735
+ return /*#__PURE__*/jsxs("div", {
736
+ className: "neeto-editor-bubble-menu__link",
737
+ onKeyDown: handleKeyDown,
738
+ children: [/*#__PURE__*/jsx("input", {
739
+ autoFocus: true,
740
+ className: "neeto-editor-bubble-menu-link__input",
741
+ "data-testid": "neeto-editor-link-input",
742
+ name: "url",
743
+ placeholder: t("neetoEditor.placeholders.linkInput"),
744
+ value: link,
745
+ onChange: function onChange(_ref2) {
746
+ var value = _ref2.target.value;
747
+ return setLink(validateAndFormatUrl(value));
748
+ }
749
+ }), /*#__PURE__*/jsx(Button$1, {
750
+ "data-testid": "neeto-editor-link-cancel-button",
751
+ icon: X,
752
+ size: "sm",
753
+ variant: "secondary",
754
+ onClick: handleReset
755
+ })]
756
+ });
757
+ };
758
+
759
+ var TableOption$2 = function TableOption(_ref) {
760
+ var editor = _ref.editor,
761
+ handleClose = _ref.handleClose;
762
+ var _useTranslation = useTranslation(),
763
+ t = _useTranslation.t;
764
+ var _useState = useState(3),
765
+ _useState2 = _slicedToArray(_useState, 2),
766
+ rows = _useState2[0],
767
+ setRows = _useState2[1];
768
+ var _useState3 = useState(3),
769
+ _useState4 = _slicedToArray(_useState3, 2),
770
+ columns = _useState4[0],
771
+ setColumns = _useState4[1];
772
+ var handleSubmit = function handleSubmit() {
773
+ editor.chain().focus().insertTable({
774
+ rows: rows,
775
+ cols: columns,
776
+ withHeaderRow: true
777
+ }).run(), setRows(3);
778
+ setColumns(3);
779
+ handleClose();
780
+ };
781
+ return /*#__PURE__*/jsxs("div", {
782
+ className: "neeto-editor-bubble-menu__table",
783
+ children: [/*#__PURE__*/jsxs("div", {
784
+ className: "neeto-editor-bubble-menu__table__menu-item",
785
+ children: [/*#__PURE__*/jsx(Label, {
786
+ className: "neeto-editor-bubble-menu__table__input-label",
787
+ children: t("neetoEditor.menu.rows")
788
+ }), /*#__PURE__*/jsx("input", {
789
+ autoFocus: true,
790
+ "data-testid": "neeto-editor-bubble-menu-table-rows-input",
791
+ min: "1",
792
+ type: "number",
793
+ value: rows,
794
+ onChange: withEventTargetValue(setRows)
795
+ })]
796
+ }), /*#__PURE__*/jsxs("div", {
797
+ className: "neeto-editor-bubble-menu__table__menu-item",
798
+ children: [/*#__PURE__*/jsx(Label, {
799
+ className: "neeto-editor-bubble-menu__table__input-label",
800
+ children: t("neetoEditor.menu.columns")
801
+ }), /*#__PURE__*/jsx("input", {
802
+ "data-testid": "neeto-editor-bubble-menu-table-option-input",
803
+ min: "1",
804
+ type: "number",
805
+ value: columns,
806
+ onChange: withEventTargetValue(setColumns)
807
+ })]
808
+ }), /*#__PURE__*/jsxs("div", {
809
+ className: "neeto-editor-bubble-menu__table__buttons",
810
+ children: [/*#__PURE__*/jsx(Button$1, {
811
+ "data-testid": "neeto-editor-bubble-menu-table-option-create-button",
812
+ icon: Check,
813
+ size: "sm",
814
+ variant: "secondary",
815
+ onClick: handleSubmit
816
+ }), /*#__PURE__*/jsx(Button$1, {
817
+ "data-testid": "neeto-editor-bubble-menu-table-option-close-button",
818
+ icon: X,
819
+ size: "sm",
820
+ variant: "secondary",
821
+ onClick: handleClose
822
+ })]
823
+ })]
824
+ });
825
+ };
826
+
827
+ function ownKeys$9(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; }
828
+ function _objectSpread$9(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$9(Object(t), true).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$9(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
829
+ var createMenuOptions$2 = function createMenuOptions(_ref) {
830
+ var tooltips = _ref.tooltips,
831
+ editor = _ref.editor,
832
+ setMediaUploader = _ref.setMediaUploader,
833
+ attachmentProps = _ref.attachmentProps,
834
+ setIsAddLinkActive = _ref.setIsAddLinkActive;
835
+ return {
836
+ font: [{
837
+ Icon: Bold,
838
+ command: function command() {
839
+ return editor.chain().focus().toggleBold().run();
840
+ },
841
+ active: editor.isActive("bold"),
842
+ optionName: "bold",
843
+ tooltip: tooltips.bold || t$1("neetoEditor.menu.bold")
844
+ }, {
845
+ Icon: Italic,
846
+ command: function command() {
847
+ return editor.chain().focus().toggleItalic().run();
848
+ },
849
+ active: editor.isActive("italic"),
850
+ optionName: "italic",
851
+ tooltip: tooltips.italic || t$1("neetoEditor.menu.italic")
852
+ }, {
853
+ Icon: Underline,
854
+ command: function command() {
855
+ return editor.chain().focus().toggleUnderline().run();
856
+ },
857
+ active: editor.isActive("underline"),
858
+ optionName: "underline",
859
+ tooltip: tooltips.underline || t$1("neetoEditor.menu.underline")
860
+ }, {
861
+ Icon: Link,
862
+ command: function command() {
863
+ return setIsAddLinkActive(not);
864
+ },
865
+ optionName: "link",
866
+ tooltip: "Link"
867
+ }, {
868
+ Icon: Strikethrough,
869
+ command: function command() {
870
+ return editor.chain().focus().toggleStrike().run();
871
+ },
872
+ active: editor.isActive("strike"),
873
+ optionName: "strike",
874
+ tooltip: tooltips.strike || t$1("neetoEditor.menu.strike")
875
+ }, {
876
+ Icon: Highlighter,
877
+ command: function command() {
878
+ return editor.chain().focus().toggleHighlight().run();
879
+ },
880
+ active: editor.isActive("highlight"),
881
+ optionName: "highlight",
882
+ tooltip: tooltips.highlight || t$1("neetoEditor.menu.highlight")
883
+ }],
884
+ block: [{
885
+ Icon: Quote,
886
+ command: function command() {
887
+ return editor.chain().focus().toggleBlockquote().run();
888
+ },
889
+ active: editor.isActive("blockquote"),
890
+ optionName: "block-quote",
891
+ highlight: true,
892
+ tooltip: tooltips.blockQuote || t$1("neetoEditor.menu.blockQuote")
893
+ }, {
894
+ Icon: Code,
895
+ command: function command() {
896
+ return editor.chain().focus().toggleCode().run();
897
+ },
898
+ active: editor.isActive("code"),
899
+ optionName: "code",
900
+ tooltip: tooltips.code || t$1("neetoEditor.menu.code")
901
+ }, {
902
+ Icon: SquareCode,
903
+ command: function command() {
904
+ return editor.chain().focus().toggleCodeBlock().run();
905
+ },
906
+ active: editor.isActive("codeBlock"),
907
+ optionName: "code-block",
908
+ tooltip: tooltips.codeBlock || t$1("neetoEditor.menu.codeBlock")
909
+ }],
910
+ list: [{
911
+ Icon: List,
912
+ command: function command() {
913
+ return editor.chain().focus().toggleBulletList().run();
914
+ },
915
+ active: editor.isActive("bulletList"),
916
+ optionName: "bullet-list",
917
+ highlight: true,
918
+ tooltip: tooltips.bulletList || t$1("neetoEditor.menu.bulletedList")
919
+ }, {
920
+ Icon: ListOrdered,
921
+ command: function command() {
922
+ return editor.chain().focus().toggleOrderedList().run();
923
+ },
924
+ active: editor.isActive("orderedList"),
925
+ optionName: "ordered-list",
926
+ highlight: true,
927
+ tooltip: tooltips.orderedList || t$1("neetoEditor.menu.orderedList")
928
+ }],
929
+ misc: [{
930
+ Icon: Paperclip,
931
+ command: attachmentProps === null || attachmentProps === void 0 ? void 0 : attachmentProps.handleUploadAttachments,
932
+ disabled: attachmentProps === null || attachmentProps === void 0 ? void 0 : attachmentProps.isDisabled,
933
+ active: false,
934
+ optionName: "attachments",
935
+ tooltip: tooltips.attachments || t$1("neetoEditor.menu.attachments")
936
+ }, {
937
+ Icon: ImageUp,
938
+ command: function command() {
939
+ return setMediaUploader(assoc("image", true));
940
+ },
941
+ optionName: "image-upload",
942
+ tooltip: tooltips.imageUpload || t$1("neetoEditor.menu.imageUpload")
943
+ }, {
944
+ Icon: Video,
945
+ command: function command() {
946
+ return setMediaUploader(assoc("video", true));
947
+ },
948
+ optionName: "video-upload",
949
+ tooltip: tooltips.videoUpload || t$1("neetoEditor.menu.videoUpload")
950
+ }],
951
+ right: [{
952
+ Icon: Undo,
953
+ command: function command() {
954
+ return editor.chain().focus().undo().run();
955
+ },
956
+ active: false,
957
+ disabled: !editor.can().undo(),
958
+ optionName: "undo",
959
+ tooltip: tooltips.undo || t$1("neetoEditor.menu.undo")
960
+ }, {
961
+ Icon: Redo,
962
+ command: function command() {
963
+ return editor.chain().focus().redo().run();
964
+ },
965
+ active: false,
966
+ disabled: !editor.can().redo(),
967
+ optionName: "redo",
968
+ tooltip: tooltips.redo || t$1("neetoEditor.menu.redo")
969
+ }]
970
+ };
971
+ };
972
+ var buildBubbleMenuOptions = function buildBubbleMenuOptions(_ref2) {
973
+ var tooltips = _ref2.tooltips,
974
+ editor = _ref2.editor,
975
+ options = _ref2.options,
976
+ setMediaUploader = _ref2.setMediaUploader,
977
+ attachmentProps = _ref2.attachmentProps,
978
+ setIsAddLinkActive = _ref2.setIsAddLinkActive;
979
+ var menuOptions = createMenuOptions$2({
980
+ tooltips: tooltips,
981
+ editor: editor,
982
+ setMediaUploader: setMediaUploader,
983
+ attachmentProps: attachmentProps,
984
+ setIsAddLinkActive: setIsAddLinkActive
985
+ });
986
+ return fromPairs(["font", "block", "list", "misc", "right"].map(function (option) {
987
+ return [option, menuOptions[option].filter(function (item) {
988
+ return options.includes(item.optionName);
989
+ })];
990
+ }));
991
+ };
992
+ var getTextMenuDropdownOptions = function getTextMenuDropdownOptions(_ref3) {
993
+ var editor = _ref3.editor,
994
+ options = _ref3.options;
995
+ var textOptions = _defineProperty(_defineProperty(_defineProperty(_defineProperty({}, EDITOR_OPTIONS.H1, {
996
+ optionName: "Heading 1",
997
+ icon: Heading1,
998
+ active: editor.isActive("heading", {
999
+ level: 1
1000
+ }),
1001
+ command: function command() {
1002
+ return editor.chain().focus().setNode("heading", {
1003
+ level: 1
1004
+ }).run();
1005
+ }
1006
+ }), EDITOR_OPTIONS.H2, {
1007
+ optionName: "Heading 2",
1008
+ icon: Heading2,
1009
+ active: editor.isActive("heading", {
1010
+ level: 2
1011
+ }),
1012
+ command: function command() {
1013
+ return editor.chain().focus().setNode("heading", {
1014
+ level: 2
1015
+ }).run();
1016
+ }
1017
+ }), EDITOR_OPTIONS.H3, {
1018
+ optionName: "Heading 3",
1019
+ icon: Heading3,
1020
+ active: editor.isActive("heading", {
1021
+ level: 3
1022
+ }),
1023
+ command: function command() {
1024
+ return editor.chain().focus().setNode("heading", {
1025
+ level: 3
1026
+ }).run();
1027
+ }
1028
+ }), EDITOR_OPTIONS.PARAGRAPH, {
1029
+ optionName: "Text",
1030
+ icon: Pilcrow,
1031
+ active: editor.isActive("paragraph"),
1032
+ command: function command() {
1033
+ return editor.chain().focus().setNode("paragraph").run();
1034
+ }
1035
+ });
1036
+ var result = [];
1037
+ options.forEach(function (option) {
1038
+ if (!textOptions[option]) return;
1039
+ result.push(textOptions[option]);
1040
+ });
1041
+ return result;
1042
+ };
1043
+ var getNodeIcon = function getNodeIcon(options) {
1044
+ var _options$find;
1045
+ return ((_options$find = options.find(prop("active"))) === null || _options$find === void 0 ? void 0 : _options$find.icon) || Pilcrow;
1046
+ };
1047
+ var renderOptionButton = function renderOptionButton(_ref4) {
1048
+ var tooltip = _ref4.tooltip,
1049
+ Icon = _ref4.Icon,
1050
+ command = _ref4.command,
1051
+ active = _ref4.active,
1052
+ optionName = _ref4.optionName,
1053
+ highlight = _ref4.highlight;
1054
+ return /*#__PURE__*/jsx(Button$1, _objectSpread$9({
1055
+ className: "ne-toolbar-item",
1056
+ "data-testid": "neeto-editor-bubble-menu-".concat(optionName, "-option"),
1057
+ icon: Icon,
1058
+ size: "default",
1059
+ tooltipProps: {
1060
+ content: tooltip,
1061
+ position: "bottom"
1062
+ },
1063
+ variant: active ? "secondary" : "ghost",
1064
+ onClick: command
1065
+ }, generateFocusProps(highlight)), optionName);
1066
+ };
1067
+
1068
+ var Options = function Options(_ref) {
1069
+ var editor = _ref.editor,
1070
+ options = _ref.options,
1071
+ mentions = _ref.mentions,
1072
+ tooltips = _ref.tooltips,
1073
+ setIsInvalidLink = _ref.setIsInvalidLink,
1074
+ isLinkOptionActive = _ref.isLinkOptionActive,
1075
+ isTableOptionActive = _ref.isTableOptionActive,
1076
+ setIsLinkOptionActive = _ref.setIsLinkOptionActive,
1077
+ setIsTableOptionActive = _ref.setIsTableOptionActive,
1078
+ setMediaUploader = _ref.setMediaUploader,
1079
+ attachmentProps = _ref.attachmentProps,
1080
+ isEmojiPickerActive = _ref.isEmojiPickerActive,
1081
+ setIsEmojiPickerActive = _ref.setIsEmojiPickerActive;
1082
+ var _useTranslation = useTranslation(),
1083
+ t = _useTranslation.t;
1084
+ var dropdownOptions = getTextMenuDropdownOptions({
1085
+ editor: editor,
1086
+ options: options
1087
+ });
1088
+ var Icon = getNodeIcon(dropdownOptions);
1089
+ var isEmojiActive = options.includes(EDITOR_OPTIONS.EMOJI);
1090
+ var isTextColorOptionActive = options.includes(EDITOR_OPTIONS.TEXT_COLOR);
1091
+ var isLinkActive = options.includes(EDITOR_OPTIONS.LINK);
1092
+ var isTableActive = options.includes(EDITOR_OPTIONS.TABLE);
1093
+ var _buildBubbleMenuOptio = buildBubbleMenuOptions({
1094
+ editor: editor,
1095
+ options: options,
1096
+ setMediaUploader: setMediaUploader,
1097
+ tooltips: tooltips,
1098
+ attachmentProps: attachmentProps,
1099
+ setIsAddLinkActive: setIsLinkOptionActive
1100
+ }),
1101
+ fontStyleOptions = _buildBubbleMenuOptio.font,
1102
+ blockStyleOptions = _buildBubbleMenuOptio.block,
1103
+ listStyleOptions = _buildBubbleMenuOptio.list;
1104
+ var handleAnimateInvalidLink = function handleAnimateInvalidLink() {
1105
+ setIsInvalidLink(true);
1106
+ setTimeout(function () {
1107
+ setIsInvalidLink(false);
1108
+ }, 1000);
1109
+ };
1110
+ if (isLinkOptionActive) {
1111
+ return /*#__PURE__*/jsx(LinkOption, {
1112
+ editor: editor,
1113
+ handleAnimateInvalidLink: handleAnimateInvalidLink,
1114
+ handleClose: function handleClose() {
1115
+ return setIsLinkOptionActive(false);
1116
+ }
1117
+ });
1118
+ }
1119
+ if (isTableOptionActive) {
1120
+ return /*#__PURE__*/jsx(TableOption$2, {
1121
+ editor: editor,
1122
+ handleClose: function handleClose() {
1123
+ return setIsTableOptionActive(false);
1124
+ }
1125
+ });
1126
+ }
1127
+ return /*#__PURE__*/jsxs(Fragment$1, {
1128
+ children: [/*#__PURE__*/jsxs(Popover, {
1129
+ children: [/*#__PURE__*/jsx(PopoverTrigger, {
1130
+ asChild: true,
1131
+ children: /*#__PURE__*/jsx(Button$1, {
1132
+ className: "ne-toolbar-item ne-toolbar-dropdown neeto-editor-font-size__wrapper",
1133
+ "data-testid": "neeto-editor-fixed-menu-font-size-option",
1134
+ icon: Icon,
1135
+ iconPosition: "left",
1136
+ trailing: /*#__PURE__*/jsx(ChevronDown, {}),
1137
+ variant: "ghost"
1138
+ })
1139
+ }), /*#__PURE__*/jsx(PopoverContent, {
1140
+ align: "start",
1141
+ className: "ne-editor-dropdown w-32 gap-0 p-1 data-[state=closed]:hidden",
1142
+ side: "bottom",
1143
+ onOpenAutoFocus: function onOpenAutoFocus(e) {
1144
+ return e.preventDefault();
1145
+ },
1146
+ children: dropdownOptions.map(function (_ref2) {
1147
+ var optionName = _ref2.optionName,
1148
+ command = _ref2.command,
1149
+ Icon = _ref2.icon;
1150
+ return /*#__PURE__*/jsx(Button$1, {
1151
+ fullWidth: true,
1152
+ className: "justify-start",
1153
+ icon: /*#__PURE__*/jsx(Icon, {
1154
+ size: 16
1155
+ }),
1156
+ iconPosition: "left",
1157
+ label: optionName,
1158
+ size: "sm",
1159
+ variant: "ghost",
1160
+ onClick: command
1161
+ }, optionName);
1162
+ })
1163
+ })]
1164
+ }), fontStyleOptions.map(renderOptionButton), blockStyleOptions.map(renderOptionButton), isTextColorOptionActive && /*#__PURE__*/jsx(TextColorOption, {
1165
+ editor: editor,
1166
+ tooltipContent: tooltips.textColor || t("neetoEditor.menu.textColor")
1167
+ }), isEmojiActive && /*#__PURE__*/jsx(EmojiOption$1, {
1168
+ editor: editor,
1169
+ isActive: isEmojiPickerActive,
1170
+ setActive: setIsEmojiPickerActive,
1171
+ tooltipContent: tooltips.emoji || t("neetoEditor.menu.emoji")
1172
+ }), listStyleOptions.map(renderOptionButton), isLinkActive && renderOptionButton({
1173
+ Icon: Link,
1174
+ command: function command() {
1175
+ return setIsLinkOptionActive(true);
1176
+ },
1177
+ active: editor.isActive("link"),
1178
+ optionName: "link",
1179
+ highlight: false,
1180
+ tooltip: tooltips.link || t("neetoEditor.menu.link")
1181
+ }), isTableActive && renderOptionButton({
1182
+ Icon: Table,
1183
+ command: function command() {
1184
+ return setIsTableOptionActive(true);
1185
+ },
1186
+ active: editor.isActive("table"),
1187
+ optionName: "table",
1188
+ highlight: false,
1189
+ tooltip: tooltips.table || t("neetoEditor.menu.table")
1190
+ }), /*#__PURE__*/jsx(Mentions$1, {
1191
+ editor: editor,
1192
+ mentions: mentions,
1193
+ tooltipContent: tooltips.mention || t("neetoEditor.menu.mention")
1194
+ })]
1195
+ });
1196
+ };
1197
+
1198
+ var Bubble = function Bubble(_ref) {
1199
+ var editor = _ref.editor,
1200
+ textOptions = _ref.options,
1201
+ _ref$mentions = _ref.mentions,
1202
+ mentions = _ref$mentions === void 0 ? [] : _ref$mentions,
1203
+ setMediaUploader = _ref.setMediaUploader,
1204
+ _ref$tooltips = _ref.tooltips,
1205
+ tooltips = _ref$tooltips === void 0 ? {} : _ref$tooltips,
1206
+ attachmentProps = _ref.attachmentProps,
1207
+ isEmojiPickerActive = _ref.isEmojiPickerActive,
1208
+ setIsEmojiPickerActive = _ref.setIsEmojiPickerActive;
1209
+ var _useState = useState(false),
1210
+ _useState2 = _slicedToArray(_useState, 2),
1211
+ isInvalidLink = _useState2[0],
1212
+ setIsInvalidLink = _useState2[1];
1213
+ var _useState3 = useState(false),
1214
+ _useState4 = _slicedToArray(_useState3, 2),
1215
+ isLinkOptionActive = _useState4[0],
1216
+ setIsLinkOptionActive = _useState4[1];
1217
+ var _useState5 = useState(false),
1218
+ _useState6 = _slicedToArray(_useState5, 2),
1219
+ isTableOptionActive = _useState6[0],
1220
+ setIsTableOptionActive = _useState6[1];
1221
+ var selectedNode = editor && editor.view.state.selection.node;
1222
+ var isImageNodeSelected = selectedNode && selectedNode.type.name === "image";
1223
+ var bubbleMenuOptions = [EDITOR_OPTIONS.BOLD, EDITOR_OPTIONS.ITALIC, EDITOR_OPTIONS.UNDERLINE, EDITOR_OPTIONS.STRIKETHROUGH, EDITOR_OPTIONS.LINK];
1224
+ var noTextOptions = isNotPresent(textOptions.filter(function (option) {
1225
+ return bubbleMenuOptions.includes(option);
1226
+ }));
1227
+ if (!editor || !isImageNodeSelected && noTextOptions) {
1228
+ return null;
1229
+ }
1230
+ return /*#__PURE__*/jsx("div", {
1231
+ children: /*#__PURE__*/jsx(BubbleMenu, {
1232
+ editor: editor,
1233
+ style: {
1234
+ zIndex: 99999,
1235
+ maxWidth: 500
1236
+ },
1237
+ className: classnames("neeto-editor-bubble-menu", {
1238
+ "neeto-editor-bubble-menu-animate-shake": isInvalidLink
1239
+ }),
1240
+ options: {
1241
+ offset: 10,
1242
+ onHide: function onHide() {
1243
+ setIsLinkOptionActive(false);
1244
+ setIsTableOptionActive(false);
1245
+ }
1246
+ },
1247
+ children: /*#__PURE__*/jsx(Options, {
1248
+ attachmentProps: attachmentProps,
1249
+ editor: editor,
1250
+ isEmojiPickerActive: isEmojiPickerActive,
1251
+ isLinkOptionActive: isLinkOptionActive,
1252
+ isTableOptionActive: isTableOptionActive,
1253
+ mentions: mentions,
1254
+ setIsEmojiPickerActive: setIsEmojiPickerActive,
1255
+ setIsInvalidLink: setIsInvalidLink,
1256
+ setIsLinkOptionActive: setIsLinkOptionActive,
1257
+ setIsTableOptionActive: setIsTableOptionActive,
1258
+ setMediaUploader: setMediaUploader,
1259
+ tooltips: tooltips,
1260
+ options: textOptions
1261
+ })
1262
+ })
1263
+ });
1264
+ };
1265
+
1266
+ var EmptyMenu = function EmptyMenu() {
1267
+ return /*#__PURE__*/jsx("div", {});
1268
+ };
1269
+
1270
+ var Progress = withT(function (_ref) {
1271
+ var t = _ref.t,
1272
+ queuedFiles = _ref.queuedFiles,
1273
+ cancelUpload = _ref.cancelUpload;
1274
+ return /*#__PURE__*/jsx("div", {
1275
+ className: "ne-media-uploader__wrapper",
1276
+ children: queuedFiles.map(function (_ref2) {
1277
+ var id = _ref2.id,
1278
+ filename = _ref2.filename,
1279
+ _ref2$progress = _ref2.progress,
1280
+ progress = _ref2$progress === void 0 ? 0 : _ref2$progress;
1281
+ return /*#__PURE__*/jsxs("div", {
1282
+ className: "ne-media-uploader__media",
1283
+ children: [/*#__PURE__*/jsx("div", {
1284
+ className: "ne-media-uploader__media__cancel-button-wrapper",
1285
+ children: /*#__PURE__*/jsx(Button$1, {
1286
+ "data-testid": "neeto-editor-image-upload-cancel-button",
1287
+ icon: X,
1288
+ size: "sm",
1289
+ variant: "ghost",
1290
+ onClick: function onClick() {
1291
+ return cancelUpload(id);
1292
+ }
1293
+ })
1294
+ }), /*#__PURE__*/jsx(File, {
1295
+ className: "ne-media-uploader__media__info__icon",
1296
+ fileName: filename
1297
+ }), /*#__PURE__*/jsxs("div", {
1298
+ className: "ne-media-uploader__media__info",
1299
+ children: [/*#__PURE__*/jsxs(Typography, {
1300
+ variant: "body3",
1301
+ children: [progress === 100 && t("neetoEditor.localUploader.completed"), progress !== 100 && /*#__PURE__*/jsxs(Fragment$1, {
1302
+ children: [progress, "%"]
1303
+ })]
1304
+ }), /*#__PURE__*/jsx("div", {
1305
+ className: "ne-media-uploader__media__progress",
1306
+ children: /*#__PURE__*/jsx("div", {
1307
+ className: "ne-media-uploader__media__progress-bar",
1308
+ style: {
1309
+ width: "".concat(progress, "%")
1310
+ }
1311
+ })
1312
+ }), /*#__PURE__*/jsx(Tooltip, {
1313
+ content: filename,
1314
+ position: "top",
1315
+ children: /*#__PURE__*/jsx(Typography, {
1316
+ variant: "body3",
1317
+ children: filename
1318
+ })
1319
+ })]
1320
+ })]
1321
+ }, id);
1322
+ })
1323
+ });
1324
+ });
1325
+
1326
+ var LocalUploader = function LocalUploader(_ref) {
1327
+ var isImage = _ref.isImage,
1328
+ onClose = _ref.onClose,
1329
+ insertMediaToEditor = _ref.insertMediaToEditor,
1330
+ setIsUploading = _ref.setIsUploading;
1331
+ var _useTranslation = useTranslation(),
1332
+ t = _useTranslation.t;
1333
+ var uploadConfig = isImage ? DEFAULT_IMAGE_UPLOAD_CONFIG : DEFAULT_VIDEO_UPLOAD_CONFIG;
1334
+ var fileInputRef = useRef(null);
1335
+ var dropTargetRef = useRef(null);
1336
+ var _useFileUploader = useFileUploader({
1337
+ config: uploadConfig,
1338
+ setIsUploadingOnHost: setIsUploading
1339
+ }),
1340
+ addFiles = _useFileUploader.addFiles,
1341
+ uploadFiles = _useFileUploader.uploadFiles,
1342
+ queuedFiles = _useFileUploader.queuedFiles,
1343
+ cancelUpload = _useFileUploader.cancelUpload,
1344
+ isUploading = _useFileUploader.isUploading;
1345
+ var handleFilesDrop = /*#__PURE__*/function () {
1346
+ var _ref2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(files) {
1347
+ var uploadedFiles;
1348
+ return _regeneratorRuntime.wrap(function _callee$(_context) {
1349
+ while (1) switch (_context.prev = _context.next) {
1350
+ case 0:
1351
+ addFiles(files);
1352
+ _context.next = 3;
1353
+ return uploadFiles();
1354
+ case 3:
1355
+ uploadedFiles = _context.sent;
1356
+ uploadedFiles.forEach(insertMediaToEditor);
1357
+ onClose();
1358
+ case 6:
1359
+ case "end":
1360
+ return _context.stop();
1361
+ }
1362
+ }, _callee);
1363
+ }));
1364
+ return function handleFilesDrop(_x) {
1365
+ return _ref2.apply(this, arguments);
1366
+ };
1367
+ }();
1368
+ useDropFiles({
1369
+ dropTargetRef: dropTargetRef,
1370
+ onDrop: handleFilesDrop
1371
+ });
1372
+ setIsUploading(isUploading);
1373
+ var handleAddFile = /*#__PURE__*/function () {
1374
+ var _ref4 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2(_ref3) {
1375
+ var files, uploadedFiles;
1376
+ return _regeneratorRuntime.wrap(function _callee2$(_context2) {
1377
+ while (1) switch (_context2.prev = _context2.next) {
1378
+ case 0:
1379
+ files = _ref3.target.files;
1380
+ addFiles(files);
1381
+ _context2.next = 4;
1382
+ return uploadFiles();
1383
+ case 4:
1384
+ uploadedFiles = _context2.sent;
1385
+ uploadedFiles.forEach(insertMediaToEditor);
1386
+ onClose();
1387
+ case 7:
1388
+ case "end":
1389
+ return _context2.stop();
1390
+ }
1391
+ }, _callee2);
1392
+ }));
1393
+ return function handleAddFile(_x2) {
1394
+ return _ref4.apply(this, arguments);
1395
+ };
1396
+ }();
1397
+ return !isEmpty(queuedFiles) || isUploading ? /*#__PURE__*/jsx(Progress, {
1398
+ cancelUpload: cancelUpload,
1399
+ queuedFiles: queuedFiles
1400
+ }) : /*#__PURE__*/jsxs("div", {
1401
+ className: "ne-media-uploader__dnd",
1402
+ "data-testid": "neeto-editor-media-uploader-dnd",
1403
+ ref: dropTargetRef,
1404
+ tabIndex: 0,
1405
+ onClick: function onClick() {
1406
+ var _fileInputRef$current;
1407
+ return (_fileInputRef$current = fileInputRef.current) === null || _fileInputRef$current === void 0 ? void 0 : _fileInputRef$current.click();
1408
+ },
1409
+ children: [/*#__PURE__*/jsx("input", {
1410
+ multiple: true,
1411
+ className: "ne-media-uploader__dnd-input",
1412
+ "data-testid": "neeto-editor-media-uploader-input",
1413
+ ref: fileInputRef,
1414
+ type: "file",
1415
+ accept: isImage ? ALLOWED_IMAGE_TYPES.join(",") : ALLOWED_VIDEO_TYPES.join(","),
1416
+ onChange: handleAddFile
1417
+ }), /*#__PURE__*/jsx(ImageUp, {
1418
+ className: "ne-media-uploader__dnd-icon",
1419
+ size: 24
1420
+ }), /*#__PURE__*/jsx(Typography, {
1421
+ variant: "body2",
1422
+ children: t("neetoEditor.localUploader.dropFilesHere")
1423
+ }), /*#__PURE__*/jsx(Typography, {
1424
+ variant: "body3",
1425
+ children: t("neetoEditor.localUploader.maxFileSize", {
1426
+ entity: convertToFileSize(uploadConfig.restrictions.maxFileSize)
1427
+ })
1428
+ })]
1429
+ });
1430
+ };
1431
+
1432
+ var VideoEmbedForm = function VideoEmbedForm(_ref) {
1433
+ var onEmbedVideo = _ref.onEmbedVideo,
1434
+ onAttachVideo = _ref.onAttachVideo,
1435
+ onClose = _ref.onClose;
1436
+ var _useTranslation = useTranslation(),
1437
+ t = _useTranslation.t;
1438
+ var initialValues = {
1439
+ url: ""
1440
+ };
1441
+ var onSubmit = function onSubmit(_ref2) {
1442
+ var url = _ref2.url;
1443
+ var embedUrl = validateUrl(url);
1444
+ if (embedUrl) onEmbedVideo(url, embedUrl);else onAttachVideo(url);
1445
+ onClose();
1446
+ };
1447
+ return /*#__PURE__*/jsx("div", {
1448
+ className: "ne-video-embed-form",
1449
+ children: /*#__PURE__*/jsx(Form, {
1450
+ formikProps: {
1451
+ initialValues: initialValues,
1452
+ validationSchema: VIDEO_EMBED_FORM_VALIDATION_SCHEMA,
1453
+ onSubmit: onSubmit
1454
+ },
1455
+ children: function children(_ref3) {
1456
+ var dirty = _ref3.dirty,
1457
+ isSubmitting = _ref3.isSubmitting,
1458
+ resetForm = _ref3.resetForm;
1459
+ return /*#__PURE__*/jsxs(Fragment$1, {
1460
+ children: [/*#__PURE__*/jsx("div", {
1461
+ className: "ne-video-embed-form__content",
1462
+ children: /*#__PURE__*/jsx(Input$1, {
1463
+ autoFocus: true,
1464
+ unlimitedChars: true,
1465
+ "data-testid": "neeto-editor-video-embed-input",
1466
+ label: t("neetoEditor.common.videoUrl"),
1467
+ name: "url",
1468
+ placeholder: t("neetoEditor.placeholders.embedUrl"),
1469
+ size: "medium",
1470
+ type: "text"
1471
+ })
1472
+ }), /*#__PURE__*/jsx(ActionBlock, {
1473
+ cancelButtonProps: {
1474
+ "data-testid": "neeto-editor-video-embed-cancel",
1475
+ label: t("neetoEditor.common.cancel"),
1476
+ size: "sm",
1477
+ onClick: function onClick() {
1478
+ resetForm();
1479
+ onClose();
1480
+ }
1481
+ },
1482
+ submitButtonProps: {
1483
+ "data-testid": "neeto-editor-video-embed-submit",
1484
+ disabled: !dirty,
1485
+ label: t("neetoEditor.common.saveChanges"),
1486
+ loading: isSubmitting,
1487
+ size: "sm"
1488
+ }
1489
+ })]
1490
+ });
1491
+ }
1492
+ })
1493
+ });
1494
+ };
1495
+
1496
+ var MediaUploader = function MediaUploader(_ref) {
1497
+ var mediaUploader = _ref.mediaUploader,
1498
+ onClose = _ref.onClose,
1499
+ editor = _ref.editor,
1500
+ _ref$showAssetLibrary = _ref.showAssetLibrary,
1501
+ showAssetLibrary = _ref$showAssetLibrary === void 0 ? true : _ref$showAssetLibrary;
1502
+ var _useTranslation = useTranslation(),
1503
+ t = _useTranslation.t;
1504
+ var _useState = useState("local"),
1505
+ _useState2 = _slicedToArray(_useState, 2),
1506
+ activeTab = _useState2[0],
1507
+ setActiveTab = _useState2[1];
1508
+ var _useState3 = useState(false),
1509
+ _useState4 = _slicedToArray(_useState3, 2),
1510
+ isUploading = _useState4[0],
1511
+ setIsUploading = _useState4[1];
1512
+ var isOpen = mediaUploader.image || mediaUploader.video;
1513
+ var _useState5 = useState([]),
1514
+ _useState6 = _slicedToArray(_useState5, 2),
1515
+ tabs = _useState6[0],
1516
+ setTabs = _useState6[1];
1517
+ useEffect(function () {
1518
+ isOpen && setTabs(getTabs(mediaUploader));
1519
+ }, [mediaUploader]);
1520
+ var handleClose = function handleClose() {
1521
+ onClose();
1522
+ setActiveTab("local");
1523
+ editor.commands.focus();
1524
+ };
1525
+ var insertMediaToEditor = function insertMediaToEditor(file) {
1526
+ if (!editor) return;
1527
+ var url = file.url,
1528
+ _file$filename = file.filename,
1529
+ filename = _file$filename === void 0 ? "image" : _file$filename,
1530
+ _file$caption = file.caption,
1531
+ caption = _file$caption === void 0 ? "" : _file$caption;
1532
+ var mediaAttrs = {
1533
+ src: url,
1534
+ caption: caption,
1535
+ alt: filename
1536
+ };
1537
+ var setMedia = mediaUploader.image ? editor.chain().setFigure(mediaAttrs) : editor.chain().setVideo(mediaAttrs);
1538
+ setMedia.focus().command(function (_ref2) {
1539
+ var tr = _ref2.tr,
1540
+ commands = _ref2.commands;
1541
+ var doc = tr.doc,
1542
+ selection = tr.selection;
1543
+ var position = doc.resolve(selection.to).end() + 1;
1544
+ var safePosition = Math.min(position, doc.content.size);
1545
+ return commands.insertContentAt(safePosition, "<p></p>");
1546
+ }).run();
1547
+ };
1548
+ var onUploadComplete = /*#__PURE__*/function () {
1549
+ var _ref3 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(file) {
1550
+ return _regeneratorRuntime.wrap(function _callee$(_context) {
1551
+ while (1) switch (_context.prev = _context.next) {
1552
+ case 0:
1553
+ if (!(isNotPresent(file.id) && isNotPresent(file.signedId))) {
1554
+ _context.next = 2;
1555
+ break;
1556
+ }
1557
+ return _context.abrupt("return");
1558
+ case 2:
1559
+ _context.prev = 2;
1560
+ _context.next = 5;
1561
+ return directUploadsApi.attach({
1562
+ id: file.id,
1563
+ signed_id: file.signedId
1564
+ });
1565
+ case 5:
1566
+ insertMediaToEditor(file);
1567
+ handleClose();
1568
+ _context.next = 12;
1569
+ break;
1570
+ case 9:
1571
+ _context.prev = 9;
1572
+ _context.t0 = _context["catch"](2);
1573
+ Toastr.error(_context.t0);
1574
+ case 12:
1575
+ case "end":
1576
+ return _context.stop();
1577
+ }
1578
+ }, _callee, null, [[2, 9]]);
1579
+ }));
1580
+ return function onUploadComplete(_x) {
1581
+ return _ref3.apply(this, arguments);
1582
+ };
1583
+ }();
1584
+ var onAttachVideo = function onAttachVideo(url) {
1585
+ var file = {
1586
+ url: url};
1587
+ insertMediaToEditor(file);
1588
+ };
1589
+ var onEmbedVideo = function onEmbedVideo(originalUrl, embedUrl) {
1590
+ if (!editor) return;
1591
+ editor.chain().focus().setExternalVideo({
1592
+ src: embedUrl,
1593
+ originalUrl: originalUrl
1594
+ }).run();
1595
+ };
1596
+ var allowDismiss = not(isUploading);
1597
+ return /*#__PURE__*/jsx(Dialog, {
1598
+ isOpen: isOpen,
1599
+ className: "ne-media-uploader-modal",
1600
+ closeButton: allowDismiss,
1601
+ onClose: allowDismiss ? handleClose : undefined,
1602
+ children: /*#__PURE__*/jsxs("div", {
1603
+ className: "ne-media-uploader",
1604
+ children: [(mediaUploader.video || mediaUploader.image) && /*#__PURE__*/jsx("div", {
1605
+ className: "ne-media-uploader__header",
1606
+ children: /*#__PURE__*/jsxs("h2", {
1607
+ className: "ne-media-uploader__header-title",
1608
+ children: [mediaUploader.video && t("neetoEditor.menu.addVideo"), mediaUploader.image && t("neetoEditor.menu.addImage")]
1609
+ })
1610
+ }), !isNotPresent(tabs) && /*#__PURE__*/jsx(Tabs, {
1611
+ value: activeTab,
1612
+ onValueChange: setActiveTab,
1613
+ children: /*#__PURE__*/jsx(Tabs.List, {
1614
+ children: tabs.map(function (_ref4) {
1615
+ var key = _ref4.key,
1616
+ title = _ref4.title;
1617
+ return /*#__PURE__*/jsx(Tabs.Item, {
1618
+ "data-testid": "neeto-editor-media-uploader-".concat(key, "-tab"),
1619
+ value: key,
1620
+ children: title
1621
+ }, key);
1622
+ })
1623
+ })
1624
+ }), /*#__PURE__*/jsxs("div", {
1625
+ className: "ne-media-uploader__content",
1626
+ children: [mediaUploader.image && /*#__PURE__*/jsx(ImageUploader, {
1627
+ onUploadComplete: onUploadComplete,
1628
+ showAssetLibrary: showAssetLibrary,
1629
+ className: "ne-media-uploader__image-uploader"
1630
+ }), mediaUploader.video && /*#__PURE__*/jsxs(Fragment$1, {
1631
+ children: [activeTab === "local" && /*#__PURE__*/jsx(LocalUploader, {
1632
+ insertMediaToEditor: insertMediaToEditor,
1633
+ setIsUploading: setIsUploading,
1634
+ isImage: false,
1635
+ onClose: handleClose
1636
+ }), activeTab === "embed" && /*#__PURE__*/jsx(VideoEmbedForm, {
1637
+ onAttachVideo: onAttachVideo,
1638
+ onEmbedVideo: onEmbedVideo,
1639
+ onClose: handleClose
1640
+ })]
1641
+ })]
1642
+ })]
1643
+ })
1644
+ });
1645
+ };
1646
+
1647
+ var LinkAddPopOver = function LinkAddPopOver(_ref) {
1648
+ var _containerRef$current;
1649
+ var isAddLinkActive = _ref.isAddLinkActive,
1650
+ setIsAddLinkActive = _ref.setIsAddLinkActive,
1651
+ editor = _ref.editor,
1652
+ openLinkInNewTab = _ref.openLinkInNewTab,
1653
+ containerRef = _ref.containerRef;
1654
+ var _editor$state$selecti = editor.state.selection,
1655
+ from = _editor$state$selecti.from,
1656
+ to = _editor$state$selecti.to;
1657
+ var text = editor.state.doc.textBetween(from, to, "");
1658
+ var _useState = useState(text),
1659
+ _useState2 = _slicedToArray(_useState, 2),
1660
+ linkText = _useState2[0],
1661
+ setLinkText = _useState2[1];
1662
+ var _useState3 = useState(""),
1663
+ _useState4 = _slicedToArray(_useState3, 2),
1664
+ linkUrl = _useState4[0],
1665
+ setLinkUrl = _useState4[1];
1666
+ var _useState5 = useState(openLinkInNewTab),
1667
+ _useState6 = _slicedToArray(_useState5, 2),
1668
+ openInNewTab = _useState6[0],
1669
+ setOpenInNewTab = _useState6[1];
1670
+ var _useState7 = useState(""),
1671
+ _useState8 = _slicedToArray(_useState7, 2),
1672
+ error = _useState8[0],
1673
+ setError = _useState8[1];
1674
+ var _useState9 = useState(getCursorPos(editor, to)),
1675
+ _useState0 = _slicedToArray(_useState9, 2),
1676
+ popoverPosition = _useState0[0],
1677
+ setPopoverPosition = _useState0[1];
1678
+ var _useState1 = useState({
1679
+ top: 0,
1680
+ left: 0
1681
+ }),
1682
+ _useState10 = _slicedToArray(_useState1, 2),
1683
+ arrowPosition = _useState10[0],
1684
+ setArrowPosition = _useState10[1];
1685
+ var popoverRef = useRef(null);
1686
+ var _useTranslation = useTranslation(),
1687
+ t = _useTranslation.t;
1688
+ var isLinkTextPresent = !isNotPresent(linkText);
1689
+ var isLinlUrlPresent = !isNotPresent(linkUrl);
1690
+ var isSubmitDisabled = !isLinkTextPresent || !isLinlUrlPresent;
1691
+ var popoverStyle = {
1692
+ display: "block",
1693
+ position: "fixed",
1694
+ top: popoverPosition.top,
1695
+ left: popoverPosition.left,
1696
+ transform: "translateY(52px) translateX(8px)"
1697
+ };
1698
+ var handleAddLink = function handleAddLink() {
1699
+ var _editor$view = editor.view,
1700
+ state = _editor$view.state,
1701
+ dispatch = _editor$view.dispatch;
1702
+ var _state$selection = state.selection,
1703
+ from = _state$selection.from,
1704
+ to = _state$selection.to;
1705
+ var formattedUrl = validateAndFormatUrl(linkUrl);
1706
+ if (!ALL_PROTOCOL_URL_REGEXP.test(formattedUrl)) {
1707
+ setError(t("neetoEditor.error.invalidUrl"));
1708
+ return;
1709
+ }
1710
+ var attrs = {
1711
+ href: formattedUrl,
1712
+ target: openInNewTab ? "_blank" : "_self"
1713
+ };
1714
+ var linkMark = state.schema.marks.link.create(attrs);
1715
+ var linkTextWithMark = state.schema.text(linkText, [linkMark]);
1716
+ var tr = state.tr.replaceWith(from, to, linkTextWithMark);
1717
+ dispatch(tr);
1718
+ removePopover();
1719
+ };
1720
+ var removePopover = function removePopover() {
1721
+ editor.view.focus();
1722
+ setIsAddLinkActive(false);
1723
+ };
1724
+ var handleKeyDown = function handleKeyDown(e) {
1725
+ e.stopPropagation();
1726
+ if (e.key === "Enter") {
1727
+ e.preventDefault();
1728
+ handleAddLink();
1729
+ } else if (e.key === "Escape") {
1730
+ removePopover();
1731
+ }
1732
+ };
1733
+ var updatePopoverPosition = function updatePopoverPosition() {
1734
+ var _getLinkPopoverPositi = getLinkPopoverPosition(editor, popoverRef),
1735
+ arrowPosition = _getLinkPopoverPositi.arrowPosition,
1736
+ popoverPosition = _getLinkPopoverPositi.popoverPosition;
1737
+ setPopoverPosition(popoverPosition);
1738
+ setArrowPosition(arrowPosition);
1739
+ };
1740
+ useOnClickOutside(popoverRef, removePopover);
1741
+ useEffect(function () {
1742
+ if (editor && isAddLinkActive) {
1743
+ updatePopoverPosition();
1744
+ }
1745
+ window.addEventListener("resize", removePopover);
1746
+ window.addEventListener("wheel", removePopover);
1747
+ return function () {
1748
+ window.removeEventListener("resize", removePopover);
1749
+ window.removeEventListener("wheel", removePopover);
1750
+ };
1751
+ }, []);
1752
+ return isAddLinkActive ? /*#__PURE__*/createPortal(/*#__PURE__*/jsxs(Fragment$1, {
1753
+ children: [/*#__PURE__*/jsx("div", {
1754
+ className: "ne-link-arrow fade-in",
1755
+ style: {
1756
+ top: arrowPosition.top,
1757
+ left: arrowPosition.left
1758
+ }
1759
+ }), /*#__PURE__*/jsxs("div", {
1760
+ className: "ne-link-popover fade-in",
1761
+ id: "ne-link-add-popover",
1762
+ ref: popoverRef,
1763
+ style: popoverStyle,
1764
+ children: [/*#__PURE__*/jsx(Input, {
1765
+ required: true,
1766
+ autoFocus: !isLinkTextPresent,
1767
+ "data-testid": "neeto-editor-add-link-text-input",
1768
+ label: t("neetoEditor.common.text"),
1769
+ placeholder: t("neetoEditor.placeholders.enterText"),
1770
+ size: "small",
1771
+ style: {
1772
+ width: "250px"
1773
+ },
1774
+ value: linkText,
1775
+ onChange: function onChange(_ref2) {
1776
+ var value = _ref2.target.value;
1777
+ return setLinkText(value);
1778
+ },
1779
+ onKeyDown: handleKeyDown
1780
+ }), /*#__PURE__*/jsx(Input, {
1781
+ error: error,
1782
+ required: true,
1783
+ autoFocus: isLinkTextPresent,
1784
+ className: "ne-link-popover__url-input",
1785
+ "data-testid": "neeto-editor-add-link-url-input",
1786
+ label: t("neetoEditor.common.url"),
1787
+ placeholder: t("neetoEditor.placeholders.url"),
1788
+ size: "small",
1789
+ style: {
1790
+ width: "250px"
1791
+ },
1792
+ value: linkUrl,
1793
+ onChange: function onChange(_ref3) {
1794
+ var value = _ref3.target.value;
1795
+ return setLinkUrl(value);
1796
+ },
1797
+ onFocus: function onFocus() {
1798
+ return setError("");
1799
+ },
1800
+ onKeyDown: handleKeyDown
1801
+ }), /*#__PURE__*/jsx(Checkbox, {
1802
+ checked: openInNewTab,
1803
+ className: "ne-link-popover__checkbox",
1804
+ "data-testid": "neeto-editor-add-link-open-in-new-tab-switch",
1805
+ label: t("neetoEditor.common.openInNewTab"),
1806
+ onCheckedChange: function onCheckedChange() {
1807
+ return setOpenInNewTab(not);
1808
+ }
1809
+ }), /*#__PURE__*/jsxs("div", {
1810
+ className: "ne-link-popover__edit-prompt-buttons",
1811
+ children: [/*#__PURE__*/jsx(Button$1, {
1812
+ "data-testid": "neeto-editor-add-link",
1813
+ disabled: isSubmitDisabled,
1814
+ label: t("neetoEditor.common.done"),
1815
+ size: "sm",
1816
+ onClick: handleAddLink
1817
+ }), /*#__PURE__*/jsx(Button$1, {
1818
+ "data-testid": "neeto-editor-link-popover-cancel",
1819
+ label: t("neetoEditor.common.cancel"),
1820
+ size: "sm",
1821
+ variant: "ghost",
1822
+ onClick: removePopover
1823
+ })]
1824
+ })]
1825
+ })]
1826
+ }), (_containerRef$current = containerRef === null || containerRef === void 0 ? void 0 : containerRef.current) !== null && _containerRef$current !== void 0 ? _containerRef$current : document.body) : null;
1827
+ };
1828
+
1829
+ var _excluded$3 = ["type"];
1830
+ function ownKeys$8(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; }
1831
+ function _objectSpread$8(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$8(Object(t), true).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$8(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
1832
+ var Menu$3 = DropdownMenu.Menu,
1833
+ MenuItem$1 = DropdownMenu.MenuItem;
1834
+ var MoreMenu = function MoreMenu(_ref) {
1835
+ var groups = _ref.groups,
1836
+ editor = _ref.editor;
1837
+ return /*#__PURE__*/jsx(DropdownMenu, {
1838
+ dropdownProps: {
1839
+ className: "ne-editor-dropdown"
1840
+ },
1841
+ customTarget: /*#__PURE__*/jsx(Button$1, {
1842
+ className: "flex-shrink-0",
1843
+ "data-testid": "neeto-editor-fixed-menu-more-option",
1844
+ icon: Ellipsis,
1845
+ variant: "ghost"
1846
+ }),
1847
+ children: /*#__PURE__*/jsx(Menu$3, {
1848
+ children: groups.map(function (group) {
1849
+ return group.map(function (_ref2) {
1850
+ var type = _ref2.type,
1851
+ props = _objectWithoutProperties(_ref2, _excluded$3);
1852
+ var Component = MENU_ELEMENTS[type];
1853
+ if (type === MENU_ELEMENT_TYPES.BUTTON) {
1854
+ var Icon = props.icon;
1855
+ return /*#__PURE__*/jsx(MenuItem$1, _objectSpread$8(_objectSpread$8({
1856
+ "data-testid": "neeto-editor-fixed-menu-".concat(props.optionName, "-option"),
1857
+ isActive: editor.isActive(props.optionName),
1858
+ prefix: /*#__PURE__*/jsx(Icon, {
1859
+ size: 16
1860
+ }),
1861
+ tabIndex: "-1",
1862
+ onClick: props.command
1863
+ }, _objectSpread$8(_objectSpread$8(_objectSpread$8({}, generateFocusProps(props.highlight)), props), {}, {
1864
+ editor: editor
1865
+ })), {}, {
1866
+ children: props.label
1867
+ }), props.optionName);
1868
+ }
1869
+ return /*#__PURE__*/jsx(Component, _objectSpread$8(_objectSpread$8({}, _objectSpread$8(_objectSpread$8({}, props), {}, {
1870
+ editor: editor
1871
+ }, generateFocusProps(props.highlight))), {}, {
1872
+ isSecondaryMenu: true
1873
+ }), props.optionName);
1874
+ });
1875
+ })
1876
+ })
1877
+ });
1878
+ };
1879
+
1880
+ var EDITOR_MARKS = [EDITOR_OPTIONS.UNDO, EDITOR_OPTIONS.REDO, "fontSizeOptions", EDITOR_OPTIONS.BOLD, EDITOR_OPTIONS.ITALIC, EDITOR_OPTIONS.UNDERLINE, EDITOR_OPTIONS.LINK, EDITOR_OPTIONS.STRIKETHROUGH, EDITOR_OPTIONS.HIGHLIGHT, EDITOR_OPTIONS.CALLOUT, "bulletList", "orderedList", "todoList", "blockquote", EDITOR_OPTIONS.CODE, "codeBlock", EDITOR_OPTIONS.TABLE, EDITOR_OPTIONS.ATTACHMENTS, EDITOR_OPTIONS.IMAGE_UPLOAD, EDITOR_OPTIONS.VIDEO_UPLOAD, EDITOR_OPTIONS.TEXT_COLOR, EDITOR_OPTIONS.EMOJI, EDITOR_OPTIONS.NEETO_KB_ARTICLE, "mentions"];
1881
+
1882
+ function ownKeys$7(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; }
1883
+ function _objectSpread$7(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$7(Object(t), true).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$7(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
1884
+ var useEditorState = function useEditorState(_ref) {
1885
+ var editor = _ref.editor,
1886
+ neetoKbArticleState = _ref.neetoKbArticleState;
1887
+ var _useEditorStore = useEditorStore(function (store) {
1888
+ return {
1889
+ setMarksState: store["setMarksState"],
1890
+ marksState: store["marksState"]
1891
+ };
1892
+ }, shallow),
1893
+ setMarksState = _useEditorStore.setMarksState,
1894
+ marksState = _useEditorStore.marksState;
1895
+ var handleSelectionUpdate = useCallback(function (_ref2) {
1896
+ var editor = _ref2.editor;
1897
+ var activeMarks = {};
1898
+ EDITOR_MARKS.forEach(function (mark) {
1899
+ if (mark === EDITOR_OPTIONS.NEETO_KB_ARTICLE) {
1900
+ activeMarks[mark] = {
1901
+ isActive: (neetoKbArticleState === null || neetoKbArticleState === void 0 ? void 0 : neetoKbArticleState.active) || false
1902
+ };
1903
+ } else {
1904
+ activeMarks[mark] = {
1905
+ isActive: editor.isActive(mark)
1906
+ };
1907
+ }
1908
+ });
1909
+ var activeFontSizeOption = FONT_SIZE_OPTIONS.find(function (_ref3) {
1910
+ var level = _ref3.value;
1911
+ return editor.isActive("heading", {
1912
+ level: level
1913
+ });
1914
+ }) || last(FONT_SIZE_OPTIONS);
1915
+ activeMarks["fontSizeOption"] = activeFontSizeOption;
1916
+ setMarksState(activeMarks);
1917
+ }, [setMarksState, neetoKbArticleState === null || neetoKbArticleState === void 0 ? void 0 : neetoKbArticleState.active]);
1918
+ var updateHistoryOptionsState = useCallback(function (_ref4) {
1919
+ var editor = _ref4.editor;
1920
+ var undoOptionState = {
1921
+ disabled: !editor.can().undo()
1922
+ };
1923
+ var redoOptionState = {
1924
+ disabled: !editor.can().redo()
1925
+ };
1926
+ var updatedMarksState = _objectSpread$7(_objectSpread$7({}, marksState), {}, _defineProperty(_defineProperty({}, EDITOR_OPTIONS.UNDO, undoOptionState), EDITOR_OPTIONS.REDO, redoOptionState));
1927
+ setMarksState(updatedMarksState);
1928
+ }, [marksState, setMarksState]);
1929
+ useEffect(function () {
1930
+ if (!editor) return noop;
1931
+ updateHistoryOptionsState({
1932
+ editor: editor
1933
+ });
1934
+ editor.on("selectionUpdate", handleSelectionUpdate);
1935
+ editor.on("update", handleSelectionUpdate);
1936
+ editor.on("transaction", handleSelectionUpdate);
1937
+ return function () {
1938
+ editor.off("selectionUpdate", handleSelectionUpdate);
1939
+ editor.off("update", handleSelectionUpdate);
1940
+ editor.off("transaction", handleSelectionUpdate);
1941
+ };
1942
+ }, [editor, handleSelectionUpdate]);
1943
+ useEffect(function () {
1944
+ if (!editor) return;
1945
+ handleSelectionUpdate({
1946
+ editor: editor
1947
+ });
1948
+ }, [editor, neetoKbArticleState === null || neetoKbArticleState === void 0 ? void 0 : neetoKbArticleState.active, handleSelectionUpdate]);
1949
+ };
1950
+
1951
+ var MenuDynamicVariables = function MenuDynamicVariables(_ref) {
1952
+ var editor = _ref.editor,
1953
+ _ref$variables = _ref.variables,
1954
+ variables = _ref$variables === void 0 ? [] : _ref$variables,
1955
+ _ref$standalone = _ref.standalone,
1956
+ standalone = _ref$standalone === void 0 ? false : _ref$standalone;
1957
+ var _useTranslation = useTranslation(),
1958
+ t = _useTranslation.t;
1959
+ if (isEmpty(variables)) return null;
1960
+ var handleVariableClick = function handleVariableClick(item) {
1961
+ var category = item.category,
1962
+ categoryLabel = item.categoryLabel,
1963
+ key = item.key,
1964
+ label = item.label;
1965
+ var variableName = category ? "".concat(category, ".").concat(key) : key;
1966
+ var variableLabel = category ? "".concat(categoryLabel || category, ":").concat(label) : label;
1967
+ editor.chain().focus().setVariable({
1968
+ id: variableName,
1969
+ label: variableLabel
1970
+ }).run();
1971
+ };
1972
+ return /*#__PURE__*/jsx("div", {
1973
+ "data-testid": "neeto-editor-fixed-menu-variables",
1974
+ className: classnames("neeto-editor-fixed-menu__variables", {
1975
+ "neeto-editor-fixed-menu__variables--standalone": standalone
1976
+ }),
1977
+ children: /*#__PURE__*/jsx(DynamicVariables, {
1978
+ variables: variables,
1979
+ buttonSize: "small",
1980
+ dropdownProps: {
1981
+ classNames: "ne-editor-variables-popup"
1982
+ },
1983
+ buttonProps: {
1984
+ tooltipProps: {
1985
+ content: t("neetoEditor.menu.dynamicVariables"),
1986
+ position: "bottom"
1987
+ }
1988
+ },
1989
+ onVariableClick: handleVariableClick
1990
+ })
1991
+ });
1992
+ };
1993
+
1994
+ var _excluded$2 = ["type"];
1995
+ function ownKeys$6(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; }
1996
+ function _objectSpread$6(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$6(Object(t), true).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$6(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
1997
+ var Fixed = function Fixed(_ref) {
1998
+ var editor = _ref.editor,
1999
+ options = _ref.options,
2000
+ mentions = _ref.mentions,
2001
+ _ref$variables = _ref.variables,
2002
+ variables = _ref$variables === void 0 ? [] : _ref$variables,
2003
+ setMediaUploader = _ref.setMediaUploader,
2004
+ mediaUploader = _ref.mediaUploader,
2005
+ _ref$addonCommands = _ref.addonCommands,
2006
+ addonCommands = _ref$addonCommands === void 0 ? [] : _ref$addonCommands,
2007
+ _ref$isIndependant = _ref.isIndependant,
2008
+ isIndependant = _ref$isIndependant === void 0 ? true : _ref$isIndependant,
2009
+ className = _ref.className,
2010
+ _ref$tooltips = _ref.tooltips,
2011
+ tooltips = _ref$tooltips === void 0 ? {} : _ref$tooltips,
2012
+ attachmentProps = _ref.attachmentProps,
2013
+ isEmojiPickerActive = _ref.isEmojiPickerActive,
2014
+ setIsEmojiPickerActive = _ref.setIsEmojiPickerActive,
2015
+ openLinkInNewTab = _ref.openLinkInNewTab,
2016
+ setIsNeetoKbArticleActive = _ref.setIsNeetoKbArticleActive,
2017
+ neetoKbArticleState = _ref.neetoKbArticleState,
2018
+ _ref$showAssetLibrary = _ref.showAssetLibrary,
2019
+ showAssetLibrary = _ref$showAssetLibrary === void 0 ? true : _ref$showAssetLibrary,
2020
+ containerRef = _ref.containerRef;
2021
+ var _useState = useState(0),
2022
+ _useState2 = _slicedToArray(_useState, 2),
2023
+ focusedButtonIndex = _useState2[0],
2024
+ setFocusedButtonIndex = _useState2[1];
2025
+ var _useState3 = useState(false),
2026
+ _useState4 = _slicedToArray(_useState3, 2),
2027
+ isAddLinkActive = _useState4[0],
2028
+ setIsAddLinkActive = _useState4[1];
2029
+ var _useState5 = useState([]),
2030
+ _useState6 = _slicedToArray(_useState5, 2),
2031
+ menuItems = _useState6[0],
2032
+ setMenuItems = _useState6[1];
2033
+ var _useState7 = useState([]),
2034
+ _useState8 = _slicedToArray(_useState7, 2),
2035
+ moreMenuItems = _useState8[0],
2036
+ setMoreMenuItems = _useState8[1];
2037
+ useEditorState({
2038
+ editor: editor,
2039
+ neetoKbArticleState: neetoKbArticleState
2040
+ });
2041
+ var editorRef = useRef(editor);
2042
+ useEffect(function () {
2043
+ editorRef.current = editor;
2044
+ }, [editor]);
2045
+ var menuRef = useRef(null);
2046
+ var menuContainerRef = useRef(null);
2047
+ var runEditorCommand = useCallback(function (command) {
2048
+ return function () {
2049
+ return command(editorRef.current);
2050
+ };
2051
+ }, []);
2052
+ var handleArrowNavigation = function handleArrowNavigation(event) {
2053
+ if (event.key === "ArrowRight") {
2054
+ event.preventDefault();
2055
+ setFocusedButtonIndex(function (prevIndex) {
2056
+ return (prevIndex + 1) % menuButtons.length;
2057
+ });
2058
+ } else if (event.key === "ArrowLeft") {
2059
+ event.preventDefault();
2060
+ setFocusedButtonIndex(function (prevIndex) {
2061
+ return (prevIndex - 1 + menuButtons.length) % menuButtons.length;
2062
+ });
2063
+ }
2064
+ };
2065
+ var menuButtons = useMemo(function () {
2066
+ var _menuRef$current;
2067
+ return (_menuRef$current = menuRef.current) === null || _menuRef$current === void 0 ? void 0 : _menuRef$current.querySelectorAll(".ne-toolbar-item");
2068
+ }, [menuRef.current]);
2069
+ useEffect(function () {
2070
+ menuButtons === null || menuButtons === void 0 || menuButtons[focusedButtonIndex].focus();
2071
+ }, [focusedButtonIndex]);
2072
+ useEffect(function () {
2073
+ menuButtons === null || menuButtons === void 0 || menuButtons.forEach(function (menuItem) {
2074
+ return menuItem.addEventListener("keydown", handleArrowNavigation);
2075
+ });
2076
+ return function () {
2077
+ return menuButtons === null || menuButtons === void 0 ? void 0 : menuButtons.forEach(function (menuItem) {
2078
+ return menuItem.removeEventListener("keydown", handleArrowNavigation);
2079
+ });
2080
+ };
2081
+ }, [menuButtons]);
2082
+ var menuGroups = useMemo(function () {
2083
+ return buildMenuOptions({
2084
+ tooltips: tooltips,
2085
+ runEditorCommand: runEditorCommand,
2086
+ options: options,
2087
+ setMediaUploader: setMediaUploader,
2088
+ attachmentProps: attachmentProps,
2089
+ setIsAddLinkActive: setIsAddLinkActive,
2090
+ mentions: mentions,
2091
+ addonCommands: addonCommands,
2092
+ setIsEmojiPickerActive: setIsEmojiPickerActive,
2093
+ isEmojiPickerActive: isEmojiPickerActive,
2094
+ editor: editor,
2095
+ setIsNeetoKbArticleActive: setIsNeetoKbArticleActive
2096
+ });
2097
+ }, [isEmojiPickerActive, mentions]);
2098
+ var handleResize = useCallback(function () {
2099
+ if (!menuRef.current) return;
2100
+ var _reGroupMenuItems = reGroupMenuItems(menuRef, menuGroups),
2101
+ visibleMenuGroups = _reGroupMenuItems.visibleMenuGroups,
2102
+ invisibleMenuGroups = _reGroupMenuItems.invisibleMenuGroups;
2103
+ setMenuItems(visibleMenuGroups);
2104
+ setMoreMenuItems(invisibleMenuGroups);
2105
+ }, [setMenuItems, menuGroups, menuRef.current]);
2106
+ useEffect(function () {
2107
+ handleResize();
2108
+ var menuContainer = menuContainerRef.current;
2109
+ var resizeObserver = new ResizeObserver(handleResize);
2110
+ if (menuContainer) {
2111
+ resizeObserver.observe(menuContainer);
2112
+ }
2113
+ return function () {
2114
+ if (menuContainer) resizeObserver.unobserve(menuContainer);
2115
+ };
2116
+ }, [menuContainerRef.current, handleResize, menuGroups]);
2117
+ if (!editor) return null;
2118
+ var isMediaUploaderActive = options.includes(EDITOR_OPTIONS.IMAGE_UPLOAD) || options.includes(EDITOR_OPTIONS.VIDEO_UPLOAD);
2119
+ return /*#__PURE__*/jsxs("div", {
2120
+ ref: menuContainerRef,
2121
+ className: classnames("neeto-editor-fixed-menu", _defineProperty({
2122
+ "neeto-editor-fixed-menu--independant": isIndependant
2123
+ }, className, className)),
2124
+ children: [/*#__PURE__*/jsxs("div", {
2125
+ className: "neeto-editor-fixed-menu__wrapper ne-fixed-menu--v2",
2126
+ "data-testid": "neeto-editor-fixed-menu-wrapper",
2127
+ ref: menuRef,
2128
+ children: [menuItems.map(function (group) {
2129
+ return group.map(function (_ref2) {
2130
+ var type = _ref2.type,
2131
+ props = _objectWithoutProperties(_ref2, _excluded$2);
2132
+ var Component = MENU_ELEMENTS[type];
2133
+ if (!Component) return null;
2134
+ return /*#__PURE__*/jsx(Component, _objectSpread$6({}, _objectSpread$6(_objectSpread$6({}, props), {}, {
2135
+ editor: editor,
2136
+ options: options
2137
+ })), props.optionName);
2138
+ });
2139
+ }), isNotEmpty(moreMenuItems) && /*#__PURE__*/jsx(MoreMenu, {
2140
+ editor: editor,
2141
+ groups: moreMenuItems
2142
+ })]
2143
+ }), /*#__PURE__*/jsx(MenuDynamicVariables, {
2144
+ editor: editor,
2145
+ variables: variables
2146
+ }), isAddLinkActive && /*#__PURE__*/jsx(LinkAddPopOver, {
2147
+ containerRef: containerRef,
2148
+ editor: editor,
2149
+ isAddLinkActive: isAddLinkActive,
2150
+ openLinkInNewTab: openLinkInNewTab,
2151
+ setIsAddLinkActive: setIsAddLinkActive
2152
+ }), isMediaUploaderActive && /*#__PURE__*/jsx(MediaUploader, {
2153
+ editor: editor,
2154
+ mediaUploader: mediaUploader,
2155
+ showAssetLibrary: showAssetLibrary,
2156
+ onClose: function onClose() {
2157
+ return setMediaUploader({
2158
+ image: false,
2159
+ video: false
2160
+ });
2161
+ }
2162
+ })]
2163
+ });
2164
+ };
2165
+
2166
+ var _excluded$1 = ["icon", "onClick", "disabled", "className", "tooltipProps"];
2167
+ function ownKeys$5(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; }
2168
+ function _objectSpread$5(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$5(Object(t), true).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$5(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
2169
+ var Button = function Button(_ref) {
2170
+ var _ref$icon = _ref.icon,
2171
+ icon = _ref$icon === void 0 ? null : _ref$icon,
2172
+ _ref$onClick = _ref.onClick,
2173
+ _onClick = _ref$onClick === void 0 ? noop : _ref$onClick,
2174
+ _ref$disabled = _ref.disabled,
2175
+ disabled = _ref$disabled === void 0 ? false : _ref$disabled,
2176
+ className = _ref.className,
2177
+ tooltipProps = _ref.tooltipProps,
2178
+ otherProps = _objectWithoutProperties(_ref, _excluded$1);
2179
+ var Icon = icon;
2180
+ return /*#__PURE__*/jsx(Tooltip, _objectSpread$5(_objectSpread$5({
2181
+ disabled: !tooltipProps,
2182
+ onClick: function onClick() {
2183
+ return _onClick();
2184
+ }
2185
+ }, tooltipProps), {}, {
2186
+ children: /*#__PURE__*/jsx("button", _objectSpread$5(_objectSpread$5({
2187
+ className: classnames("ne-headless-btn", _defineProperty({}, className, className)),
2188
+ type: "button"
2189
+ }, _objectSpread$5({
2190
+ disabled: disabled,
2191
+ onClick: _onClick
2192
+ }, otherProps)), {}, {
2193
+ children: icon && /*#__PURE__*/jsx(Icon, {
2194
+ "aria-hidden": "true",
2195
+ size: 18
2196
+ }, "2")
2197
+ }))
2198
+ }));
2199
+ };
2200
+
2201
+ var _excluded = ["icon", "isOpen", "onClose", "children", "className", "onClick", "buttonProps"];
2202
+ function ownKeys$4(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; }
2203
+ function _objectSpread$4(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$4(Object(t), true).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$4(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
2204
+ var hideOnEsc = {
2205
+ name: "hideOnEsc",
2206
+ defaultValue: true,
2207
+ fn: function fn(_ref) {
2208
+ var hide = _ref.hide,
2209
+ _ref$props = _ref.props,
2210
+ hideOnEsc = _ref$props.hideOnEsc,
2211
+ onClose = _ref$props.onClose;
2212
+ function onKeyDown(event) {
2213
+ if (!(event.key.toLowerCase() === "escape" && hideOnEsc)) return;
2214
+ onClose();
2215
+ hide();
2216
+ }
2217
+ return {
2218
+ onShow: function onShow() {
2219
+ document.addEventListener("keydown", onKeyDown);
2220
+ },
2221
+ onHide: function onHide() {
2222
+ document.removeEventListener("keydown", onKeyDown);
2223
+ }
2224
+ };
2225
+ }
2226
+ };
2227
+ var Dropdown = function Dropdown(_ref2) {
2228
+ var icon = _ref2.icon,
2229
+ isOpen = _ref2.isOpen,
2230
+ _ref2$onClose = _ref2.onClose,
2231
+ onClose = _ref2$onClose === void 0 ? noop : _ref2$onClose,
2232
+ children = _ref2.children,
2233
+ className = _ref2.className,
2234
+ onClick = _ref2.onClick,
2235
+ _ref2$buttonProps = _ref2.buttonProps,
2236
+ buttonProps = _ref2$buttonProps === void 0 ? {} : _ref2$buttonProps,
2237
+ otherProps = _objectWithoutProperties(_ref2, _excluded);
2238
+ var _useState = useState(false),
2239
+ _useState2 = _slicedToArray(_useState, 2),
2240
+ mounted = _useState2[0],
2241
+ setMounted = _useState2[1];
2242
+ return /*#__PURE__*/jsx(Tippy, _objectSpread$4(_objectSpread$4({
2243
+ onClose: onClose,
2244
+ hideOnEsc: true,
2245
+ interactive: true,
2246
+ animation: false,
2247
+ arrow: false,
2248
+ duration: 0,
2249
+ hideOnClick: false,
2250
+ maxWidth: "none",
2251
+ offset: 0,
2252
+ plugins: [hideOnEsc],
2253
+ popperOptions: {
2254
+ strategy: "fixed"
2255
+ },
2256
+ role: "dropdown",
2257
+ theme: "light",
2258
+ trigger: "click",
2259
+ visible: isOpen,
2260
+ className: classnames("ne-headless-dropdown", _defineProperty({}, className, className)),
2261
+ content: mounted && /*#__PURE__*/jsx("div", {
2262
+ className: "ne-headless-dropdown__popup",
2263
+ children: children
2264
+ }),
2265
+ onClickOutside: onClose,
2266
+ onHidden: function onHidden() {
2267
+ return setMounted(false);
2268
+ },
2269
+ onMount: function onMount() {
2270
+ return setMounted(true);
2271
+ }
2272
+ }, otherProps), {}, {
2273
+ children: /*#__PURE__*/jsx("span", {
2274
+ children: /*#__PURE__*/jsx(Button, _objectSpread$4({}, _objectSpread$4({
2275
+ icon: icon,
2276
+ onClick: onClick
2277
+ }, buttonProps)))
2278
+ })
2279
+ }));
2280
+ };
2281
+
2282
+ var Emoji = function Emoji(_ref) {
2283
+ var editor = _ref.editor,
2284
+ isActive = _ref.isActive,
2285
+ setActive = _ref.setActive,
2286
+ tooltipContent = _ref.tooltipContent;
2287
+ return /*#__PURE__*/jsx(Dropdown, {
2288
+ className: "ne-headless__emoji",
2289
+ icon: Smile,
2290
+ isOpen: isActive,
2291
+ buttonProps: {
2292
+ tooltipProps: {
2293
+ content: tooltipContent,
2294
+ delay: [500],
2295
+ position: "bottom"
2296
+ },
2297
+ "data-testid": "ne-emoji-picker"
2298
+ },
2299
+ onClick: function onClick() {
2300
+ return setActive(function (active) {
2301
+ return !active;
2302
+ });
2303
+ },
2304
+ onClose: function onClose() {
2305
+ return setActive(false);
2306
+ },
2307
+ children: /*#__PURE__*/jsx(EmojiPickerMenu, {
2308
+ editor: editor,
2309
+ setActive: setActive
2310
+ })
2311
+ });
2312
+ };
2313
+
2314
+ var Option = function Option(_ref) {
2315
+ var editor = _ref.editor,
2316
+ optionName = _ref.optionName,
2317
+ command = _ref.command,
2318
+ disabled = _ref.disabled,
2319
+ Icon = _ref.Icon,
2320
+ isActive = _ref.isActive,
2321
+ setActive = _ref.setActive,
2322
+ tooltip = _ref.tooltip;
2323
+ if (optionName === EDITOR_OPTIONS.EMOJI) {
2324
+ return /*#__PURE__*/jsx(Emoji, {
2325
+ editor: editor,
2326
+ isActive: isActive,
2327
+ setActive: setActive,
2328
+ tooltipContent: tooltip || "Emoji"
2329
+ });
2330
+ }
2331
+ return /*#__PURE__*/jsx(Button, {
2332
+ disabled: disabled,
2333
+ className: classnames({
2334
+ "ne-headless-btn--active": isActive
2335
+ }),
2336
+ "data-testid": hyphenate(optionName),
2337
+ icon: Icon,
2338
+ tooltipProps: {
2339
+ content: tooltip,
2340
+ delay: [500],
2341
+ position: "bottom"
2342
+ },
2343
+ onClick: command
2344
+ });
2345
+ };
2346
+
2347
+ function ownKeys$3(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; }
2348
+ function _objectSpread$3(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$3(Object(t), true).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$3(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
2349
+ var t = i18n.t;
2350
+ var createMenuOptions$1 = function createMenuOptions(_ref) {
2351
+ var editor = _ref.editor,
2352
+ tooltips = _ref.tooltips,
2353
+ setMediaUploader = _ref.setMediaUploader,
2354
+ attachmentProps = _ref.attachmentProps,
2355
+ isEmojiPickerActive = _ref.isEmojiPickerActive,
2356
+ setIsEmojiPickerActive = _ref.setIsEmojiPickerActive;
2357
+ return [{
2358
+ Icon: Bold,
2359
+ command: function command() {
2360
+ return editor.chain().focus().toggleBold().run();
2361
+ },
2362
+ active: editor.isActive("bold"),
2363
+ optionName: "bold",
2364
+ tooltip: tooltips.bold || t("neetoEditor.menu.bold")
2365
+ }, {
2366
+ Icon: Italic,
2367
+ command: function command() {
2368
+ return editor.chain().focus().toggleItalic().run();
2369
+ },
2370
+ active: editor.isActive("italic"),
2371
+ optionName: "italic",
2372
+ tooltip: tooltips.italic || t("neetoEditor.menu.italic")
2373
+ }, {
2374
+ Icon: Underline,
2375
+ command: function command() {
2376
+ return editor.chain().focus().toggleUnderline().run();
2377
+ },
2378
+ active: editor.isActive("underline"),
2379
+ optionName: "underline",
2380
+ tooltip: tooltips.underline || t("neetoEditor.menu.underline")
2381
+ }, {
2382
+ Icon: Strikethrough,
2383
+ command: function command() {
2384
+ return editor.chain().focus().toggleStrike().run();
2385
+ },
2386
+ active: editor.isActive("strike"),
2387
+ optionName: "strike",
2388
+ tooltip: tooltips.strike || t("neetoEditor.menu.strike")
2389
+ }, {
2390
+ Icon: Highlighter,
2391
+ command: function command() {
2392
+ return editor.chain().focus().toggleHighlight().run();
2393
+ },
2394
+ active: editor.isActive("highlight"),
2395
+ optionName: "highlight",
2396
+ tooltip: tooltips.highlight || t("neetoEditor.menu.highlight")
2397
+ }, {
2398
+ Icon: Quote,
2399
+ command: function command() {
2400
+ return editor.chain().focus().toggleBlockquote().run();
2401
+ },
2402
+ active: editor.isActive("blockquote"),
2403
+ optionName: "block-quote",
2404
+ tooltip: tooltips.blockQuote || t("neetoEditor.menu.blockQuote")
2405
+ }, {
2406
+ Icon: Code,
2407
+ command: function command() {
2408
+ return editor.chain().focus().toggleCode().run();
2409
+ },
2410
+ active: editor.isActive("code"),
2411
+ optionName: "code",
2412
+ tooltip: tooltips.code || t("neetoEditor.menu.code")
2413
+ }, {
2414
+ Icon: SquareCode,
2415
+ command: function command() {
2416
+ return editor.chain().focus().toggleCodeBlock().run();
2417
+ },
2418
+ active: editor.isActive("codeBlock"),
2419
+ optionName: "code-block",
2420
+ tooltip: tooltips.codeBlock || t("neetoEditor.menu.codeBlock")
2421
+ }, {
2422
+ Icon: List,
2423
+ command: function command() {
2424
+ return editor.chain().focus().toggleBulletList().run();
2425
+ },
2426
+ active: editor.isActive("bulletList"),
2427
+ optionName: "bullet-list",
2428
+ tooltip: tooltips.bulletList || t("neetoEditor.menu.bulletedList")
2429
+ }, {
2430
+ Icon: ListOrdered,
2431
+ command: function command() {
2432
+ return editor.chain().focus().toggleOrderedList().run();
2433
+ },
2434
+ active: editor.isActive("orderedList"),
2435
+ optionName: "ordered-list",
2436
+ tooltip: tooltips.orderedList || t("neetoEditor.menu.orderedList")
2437
+ }, {
2438
+ Icon: FileText,
2439
+ command: attachmentProps === null || attachmentProps === void 0 ? void 0 : attachmentProps.handleUploadAttachments,
2440
+ disabled: attachmentProps === null || attachmentProps === void 0 ? void 0 : attachmentProps.isDisabled,
2441
+ optionName: "attachments",
2442
+ tooltip: tooltips.attachments || t("neetoEditor.menu.attachments")
2443
+ }, {
2444
+ Icon: ImageUp,
2445
+ command: function command() {
2446
+ return setMediaUploader(assoc("image", true));
2447
+ },
2448
+ optionName: "image-upload",
2449
+ tooltip: tooltips.imageUpload || t("neetoEditor.menu.imageUpload")
2450
+ }, {
2451
+ Icon: Video,
2452
+ command: function command() {
2453
+ return setMediaUploader(assoc("video", true));
2454
+ },
2455
+ optionName: "video-upload",
2456
+ tooltip: tooltips.videoUpload || t("neetoEditor.menu.videoUpload")
2457
+ }, {
2458
+ Icon: Smile,
2459
+ command: noop,
2460
+ optionName: "emoji",
2461
+ tooltip: tooltips.emoji || t("neetoEditor.menu.emoji"),
2462
+ isActive: isEmojiPickerActive,
2463
+ setActive: setIsEmojiPickerActive
2464
+ }, {
2465
+ Icon: Table,
2466
+ command: function command() {
2467
+ return editor.chain().focus().insertTable({
2468
+ rows: 3,
2469
+ cols: 3,
2470
+ withHeaderRow: true
2471
+ }).run();
2472
+ },
2473
+ optionName: "table",
2474
+ tooltip: tooltips.table || t("neetoEditor.menu.table")
2475
+ }, {
2476
+ Icon: Undo,
2477
+ command: function command() {
2478
+ return editor.chain().focus().undo().run();
2479
+ },
2480
+ disabled: !editor.can().undo(),
2481
+ optionName: "undo",
2482
+ tooltip: tooltips.undo || t("neetoEditor.menu.undo")
2483
+ }, {
2484
+ Icon: Redo,
2485
+ command: function command() {
2486
+ return editor.chain().focus().redo().run();
2487
+ },
2488
+ disabled: !editor.can().redo(),
2489
+ optionName: "redo",
2490
+ tooltip: tooltips.redo || t("neetoEditor.menu.redo")
2491
+ }];
2492
+ };
2493
+ var buildOptionsFromAddonCommands$1 = function buildOptionsFromAddonCommands(_ref2) {
2494
+ var editor = _ref2.editor,
2495
+ commands = _ref2.commands;
2496
+ var to = editor.state.selection.to;
2497
+ return commands.map(function (option) {
2498
+ var _option$active;
2499
+ return _objectSpread$3(_objectSpread$3({}, option), {}, {
2500
+ active: (_option$active = option.active) === null || _option$active === void 0 ? void 0 : _option$active.call(option, {
2501
+ editor: editor
2502
+ }),
2503
+ command: function command() {
2504
+ var _option$command;
2505
+ return (_option$command = option.command) === null || _option$command === void 0 ? void 0 : _option$command.call(option, {
2506
+ editor: editor,
2507
+ range: {
2508
+ from: to,
2509
+ to: to
2510
+ }
2511
+ });
2512
+ }
2513
+ });
2514
+ });
2515
+ };
2516
+ var buildMenuOptions$1 = function buildMenuOptions(_ref3) {
2517
+ var tooltips = _ref3.tooltips,
2518
+ editor = _ref3.editor,
2519
+ options = _ref3.options,
2520
+ setMediaUploader = _ref3.setMediaUploader,
2521
+ attachmentProps = _ref3.attachmentProps,
2522
+ isEmojiPickerActive = _ref3.isEmojiPickerActive,
2523
+ setIsEmojiPickerActive = _ref3.setIsEmojiPickerActive;
2524
+ var menuOptions = createMenuOptions$1({
2525
+ editor: editor,
2526
+ tooltips: tooltips,
2527
+ setMediaUploader: setMediaUploader,
2528
+ attachmentProps: attachmentProps,
2529
+ isEmojiPickerActive: isEmojiPickerActive,
2530
+ setIsEmojiPickerActive: setIsEmojiPickerActive
2531
+ });
2532
+ return options.map(function (option) {
2533
+ return findBy({
2534
+ optionName: option
2535
+ }, menuOptions);
2536
+ }).filter(Boolean);
2537
+ };
2538
+
2539
+ function ownKeys$2(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; }
2540
+ function _objectSpread$2(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$2(Object(t), true).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$2(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
2541
+ var Headless = function Headless(_ref) {
2542
+ var editor = _ref.editor,
2543
+ options = _ref.options,
2544
+ _ref$tooltips = _ref.tooltips,
2545
+ tooltips = _ref$tooltips === void 0 ? {} : _ref$tooltips,
2546
+ setMediaUploader = _ref.setMediaUploader,
2547
+ mediaUploader = _ref.mediaUploader,
2548
+ _ref$addonCommands = _ref.addonCommands,
2549
+ addonCommands = _ref$addonCommands === void 0 ? [] : _ref$addonCommands,
2550
+ className = _ref.className,
2551
+ attachmentProps = _ref.attachmentProps,
2552
+ isEmojiPickerActive = _ref.isEmojiPickerActive,
2553
+ setIsEmojiPickerActive = _ref.setIsEmojiPickerActive,
2554
+ _ref$showAssetLibrary = _ref.showAssetLibrary,
2555
+ showAssetLibrary = _ref$showAssetLibrary === void 0 ? true : _ref$showAssetLibrary;
2556
+ if (!editor) {
2557
+ return null;
2558
+ }
2559
+ var isMediaUploaderActive = options.includes(EDITOR_OPTIONS.IMAGE_UPLOAD) || options.includes(EDITOR_OPTIONS.VIDEO_UPLOAD);
2560
+ var menuOptions = buildMenuOptions$1({
2561
+ tooltips: tooltips,
2562
+ editor: editor,
2563
+ options: options,
2564
+ setMediaUploader: setMediaUploader,
2565
+ attachmentProps: attachmentProps,
2566
+ isEmojiPickerActive: isEmojiPickerActive,
2567
+ setIsEmojiPickerActive: setIsEmojiPickerActive
2568
+ });
2569
+ var addonCommandOptions = buildOptionsFromAddonCommands$1({
2570
+ editor: editor,
2571
+ commands: addonCommands
2572
+ });
2573
+ var allOptions = [].concat(_toConsumableArray(menuOptions), _toConsumableArray(addonCommandOptions));
2574
+ return /*#__PURE__*/jsxs("div", {
2575
+ className: classnames("ne-headless ne-headless--v2", _defineProperty({}, className, className)),
2576
+ children: [allOptions.map(function (option) {
2577
+ return /*#__PURE__*/createElement(Option, _objectSpread$2({
2578
+ editor: editor,
2579
+ key: option.optionName
2580
+ }, option));
2581
+ }), isMediaUploaderActive && /*#__PURE__*/jsx(MediaUploader, {
2582
+ editor: editor,
2583
+ mediaUploader: mediaUploader,
2584
+ showAssetLibrary: showAssetLibrary,
2585
+ onClose: function onClose() {
2586
+ return setMediaUploader({
2587
+ image: false,
2588
+ video: false
2589
+ });
2590
+ }
2591
+ })]
2592
+ });
2593
+ };
2594
+
2595
+ var FONT_SIZE_OPTIONS = [{
2596
+ label: t$1("neetoEditor.menu.heading1"),
2597
+ value: 1,
2598
+ key: "h1",
2599
+ icon: Heading1
2600
+ }, {
2601
+ label: t$1("neetoEditor.menu.heading2"),
2602
+ value: 2,
2603
+ key: "h2",
2604
+ icon: Heading2
2605
+ }, {
2606
+ label: t$1("neetoEditor.menu.heading3"),
2607
+ value: 3,
2608
+ key: "h3",
2609
+ icon: Heading3
2610
+ }, {
2611
+ label: t$1("neetoEditor.menu.heading4"),
2612
+ value: 4,
2613
+ key: "h4",
2614
+ icon: Heading4
2615
+ }, {
2616
+ label: t$1("neetoEditor.menu.heading5"),
2617
+ value: 5,
2618
+ key: "h5",
2619
+ icon: Heading5
2620
+ }, {
2621
+ label: t$1("neetoEditor.menu.normalText"),
2622
+ value: 0,
2623
+ key: "body2",
2624
+ icon: Pilcrow
2625
+ }];
2626
+ var MENU_COMPONENTS = {
2627
+ fixed: Fixed,
2628
+ bubble: Bubble,
2629
+ headless: Headless,
2630
+ none: EmptyMenu
2631
+ };
2632
+
2633
+ var Menu$2 = DropdownMenu.Menu,
2634
+ MenuItem = DropdownMenu.MenuItem;
2635
+ var FontSizeOption = function FontSizeOption(_ref) {
2636
+ var runEditorCommand = _ref.runEditorCommand,
2637
+ tooltipContent = _ref.tooltipContent,
2638
+ label = _ref.label,
2639
+ _ref$options = _ref.options,
2640
+ options = _ref$options === void 0 ? [] : _ref$options,
2641
+ _ref$isSecondaryMenu = _ref.isSecondaryMenu,
2642
+ isSecondaryMenu = _ref$isSecondaryMenu === void 0 ? false : _ref$isSecondaryMenu;
2643
+ var dropdownRef = useRef(null);
2644
+ var lastOption = last(FONT_SIZE_OPTIONS);
2645
+ var _useEditorStore = useEditorStore(function (store) {
2646
+ var _store$marksState;
2647
+ return {
2648
+ fontSizeOption: (_store$marksState = store["marksState"]) === null || _store$marksState === void 0 ? void 0 : _store$marksState["fontSizeOption"]
2649
+ };
2650
+ }, shallow),
2651
+ _useEditorStore$fontS = _useEditorStore.fontSizeOption,
2652
+ activeOption = _useEditorStore$fontS === void 0 ? lastOption : _useEditorStore$fontS;
2653
+ var handleClick = function handleClick(level) {
2654
+ return level ? runEditorCommand(function (editor) {
2655
+ return editor.chain().focus().toggleHeading({
2656
+ level: level
2657
+ }).run();
2658
+ })() : runEditorCommand(function (editor) {
2659
+ return editor.chain().focus().setNode("paragraph").run();
2660
+ })();
2661
+ };
2662
+ var menuOptions = [].concat(_toConsumableArray(filterBy({
2663
+ key: function key(_key) {
2664
+ return options.includes(_key);
2665
+ }
2666
+ }, FONT_SIZE_OPTIONS)), [FONT_SIZE_OPTIONS[FONT_SIZE_OPTIONS.length - 1]]);
2667
+ var renderItems = menuOptions.map(function (_ref2) {
2668
+ var itemLabel = _ref2.label,
2669
+ Icon = _ref2.icon,
2670
+ value = _ref2.value,
2671
+ key = _ref2.key;
2672
+ return /*#__PURE__*/jsx(MenuItem, {
2673
+ "data-testid": "neeto-editor-fixed-menu-font-size-option-".concat(key),
2674
+ isActive: (activeOption === null || activeOption === void 0 ? void 0 : activeOption.value) === value,
2675
+ prefix: /*#__PURE__*/jsx(Icon, {
2676
+ size: 16
2677
+ }),
2678
+ onClick: function onClick() {
2679
+ return handleClick(value);
2680
+ },
2681
+ children: itemLabel
2682
+ }, value);
2683
+ });
2684
+ if (isSecondaryMenu) {
2685
+ return /*#__PURE__*/jsx(DropdownMenu.SubMenu, {
2686
+ label: label,
2687
+ contentProps: {
2688
+ className: "ne-editor-dropdown"
2689
+ },
2690
+ icon: activeOption === null || activeOption === void 0 ? void 0 : activeOption.icon,
2691
+ triggerProps: {
2692
+ "data-testid": "neeto-editor-fixed-menu-font-size-option"
2693
+ },
2694
+ children: renderItems
2695
+ });
2696
+ }
2697
+ return /*#__PURE__*/jsx(DropdownMenu, {
2698
+ dropdownProps: {
2699
+ className: "ne-editor-dropdown"
2700
+ },
2701
+ icon: activeOption === null || activeOption === void 0 ? void 0 : activeOption.icon,
2702
+ position: "bottom-start",
2703
+ triggerRef: dropdownRef,
2704
+ buttonProps: {
2705
+ "data-testid": "neeto-editor-fixed-menu-font-size-option",
2706
+ onKeyDown: function onKeyDown(event) {
2707
+ var _dropdownRef$current;
2708
+ return event.key === "ArrowDown" && ((_dropdownRef$current = dropdownRef.current) === null || _dropdownRef$current === void 0 ? void 0 : _dropdownRef$current.click());
2709
+ },
2710
+ tooltipProps: {
2711
+ content: tooltipContent !== null && tooltipContent !== void 0 ? tooltipContent : label,
2712
+ position: "bottom"
2713
+ },
2714
+ variant: "ghost",
2715
+ className: "ne-toolbar-item ne-toolbar-dropdown neeto-editor-font-size__wrapper"
2716
+ },
2717
+ children: /*#__PURE__*/jsx(Menu$2, {
2718
+ children: renderItems
2719
+ })
2720
+ });
2721
+ };
2722
+ var FontSizeOption$1 = /*#__PURE__*/memo(FontSizeOption);
2723
+
2724
+ var ColorDot = function ColorDot(_ref) {
2725
+ var _colorVar$match;
2726
+ var colorVar = _ref.colorVar,
2727
+ isSelected = _ref.isSelected,
2728
+ onClick = _ref.onClick,
2729
+ isTextColor = _ref.isTextColor;
2730
+ var dotClass = classnames("neeto-editor-highlight-dropdown__color-dot", {
2731
+ "neeto-editor-highlight-dropdown__color-dot--selected": isSelected
2732
+ });
2733
+ var dotStyle = {
2734
+ backgroundColor: "var(".concat(colorVar, ")")
2735
+ };
2736
+ var colorNumber = ((_colorVar$match = colorVar.match(/\d+$/)) === null || _colorVar$match === void 0 ? void 0 : _colorVar$match[0]) || colorVar;
2737
+ return /*#__PURE__*/jsx("div", {
2738
+ onClick: onClick,
2739
+ className: dotClass,
2740
+ style: dotStyle,
2741
+ "data-testid": "neeto-editor-highlight-".concat(hyphenize(isTextColor ? "text" : "background"), "-color-dot-").concat(colorNumber)
2742
+ });
2743
+ };
2744
+
2745
+ var COLORS = {
2746
+ text: ["--neeto-editor-highlight-text-1", "--neeto-editor-highlight-text-2", "--neeto-editor-highlight-text-3", "--neeto-editor-highlight-text-4", "--neeto-editor-highlight-text-5", "--neeto-editor-highlight-text-6", "--neeto-editor-highlight-text-7", "--neeto-editor-highlight-text-8", "--neeto-editor-highlight-text-9", "--neeto-editor-highlight-text-10", "--neeto-editor-highlight-text-11", "--neeto-editor-highlight-text-12", "--neeto-editor-highlight-text-13", "--neeto-editor-highlight-text-14", "--neeto-editor-highlight-text-15", "--neeto-editor-highlight-text-16"],
2747
+ background: ["--neeto-editor-highlight-bg-1", "--neeto-editor-highlight-bg-2", "--neeto-editor-highlight-bg-3", "--neeto-editor-highlight-bg-4", "--neeto-editor-highlight-bg-5", "--neeto-editor-highlight-bg-6", "--neeto-editor-highlight-bg-7", "--neeto-editor-highlight-bg-8", "--neeto-editor-highlight-bg-9", "--neeto-editor-highlight-bg-10", "--neeto-editor-highlight-bg-11", "--neeto-editor-highlight-bg-12", "--neeto-editor-highlight-bg-13", "--neeto-editor-highlight-bg-14", "--neeto-editor-highlight-bg-15", "--neeto-editor-highlight-bg-16"]
2748
+ };
2749
+
2750
+ var colorSections = [{
2751
+ title: "Text color",
2752
+ colors: COLORS.text,
2753
+ isTextColor: true
2754
+ }, {
2755
+ title: "Background color",
2756
+ colors: COLORS.background,
2757
+ isTextColor: false
2758
+ }];
2759
+ var HighlightDropdown = function HighlightDropdown(_ref) {
2760
+ var editor = _ref.editor,
2761
+ label = _ref.label,
2762
+ tooltipContent = _ref.tooltipContent,
2763
+ runEditorCommand = _ref.runEditorCommand,
2764
+ _ref$isSecondaryMenu = _ref.isSecondaryMenu,
2765
+ isSecondaryMenu = _ref$isSecondaryMenu === void 0 ? false : _ref$isSecondaryMenu;
2766
+ var dropdownRef = useRef(null);
2767
+ var textColor = editor.getAttributes("textStyle").color;
2768
+ var backgroundColor = editor.getAttributes("textStyle").backgroundColor;
2769
+ var updateBackgroundColor = function updateBackgroundColor(value) {
2770
+ runEditorCommand(function (editor) {
2771
+ return editor.chain().focus().setMark("textStyle", {
2772
+ backgroundColor: value
2773
+ }).run();
2774
+ })();
2775
+ };
2776
+ var handleBackgroundColorClick = function handleBackgroundColorClick(colorVar, event) {
2777
+ event.stopPropagation();
2778
+ if (backgroundColor === "var(".concat(colorVar, ")")) {
2779
+ updateBackgroundColor(null);
2780
+ } else {
2781
+ updateBackgroundColor("var(".concat(colorVar, ")"));
2782
+ }
2783
+ };
2784
+ var handleTextColorClick = function handleTextColorClick(colorVar, event) {
2785
+ event.stopPropagation();
2786
+ if (textColor === "var(".concat(colorVar, ")")) {
2787
+ editor.chain().focus().unsetColor().run();
2788
+ } else {
2789
+ editor.chain().focus().setColor("var(".concat(colorVar, ")")).run();
2790
+ }
2791
+ };
2792
+ var renderColorDots = function renderColorDots(colorList) {
2793
+ var isTextColor = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
2794
+ return colorList.map(function (colorVar, idx) {
2795
+ return /*#__PURE__*/createElement(ColorDot, {
2796
+ colorVar: colorVar,
2797
+ isTextColor: isTextColor,
2798
+ key: idx,
2799
+ isSelected: isTextColor ? textColor === "var(".concat(colorVar, ")") : backgroundColor === "var(".concat(colorVar, ")"),
2800
+ onClick: function onClick(event) {
2801
+ return isTextColor ? handleTextColorClick(colorVar, event) : handleBackgroundColorClick(colorVar, event);
2802
+ }
2803
+ });
2804
+ });
2805
+ };
2806
+ var renderSections = colorSections.map(function (_ref2) {
2807
+ var title = _ref2.title,
2808
+ colors = _ref2.colors,
2809
+ isTextColor = _ref2.isTextColor;
2810
+ return /*#__PURE__*/jsxs("div", {
2811
+ className: "neeto-editor-highlight-dropdown__section",
2812
+ children: [/*#__PURE__*/jsx(Typography, {
2813
+ className: "neeto-editor-highlight-dropdown__section-title",
2814
+ variant: "body2",
2815
+ weight: "medium",
2816
+ children: title
2817
+ }), /*#__PURE__*/jsx("div", {
2818
+ className: "neeto-editor-highlight-dropdown__color-grid",
2819
+ "data-testid": "neeto-editor-highlight-".concat(hyphenize(title), "-grid"),
2820
+ children: renderColorDots(colors, isTextColor)
2821
+ })]
2822
+ }, title);
2823
+ });
2824
+ if (isSecondaryMenu) {
2825
+ return /*#__PURE__*/jsx(DropdownMenu.SubMenu, {
2826
+ label: label,
2827
+ icon: Highlighter,
2828
+ contentProps: {
2829
+ className: "ne-editor-dropdown neeto-editor-highlight-dropdown w-[280px] p-3"
2830
+ },
2831
+ triggerProps: {
2832
+ "data-testid": "neeto-editor-fixed-menu-highlight-option"
2833
+ },
2834
+ children: renderSections
2835
+ });
2836
+ }
2837
+ return /*#__PURE__*/jsx(DropdownMenu, {
2838
+ dropdownProps: {
2839
+ className: "ne-editor-dropdown w-[280px] p-3"
2840
+ },
2841
+ icon: Highlighter,
2842
+ position: "bottom-start",
2843
+ triggerRef: dropdownRef,
2844
+ buttonProps: {
2845
+ "data-testid": "neeto-editor-fixed-menu-highlight-option",
2846
+ onKeyDown: function onKeyDown(event) {
2847
+ var _dropdownRef$current;
2848
+ return event.key === "ArrowDown" && ((_dropdownRef$current = dropdownRef.current) === null || _dropdownRef$current === void 0 ? void 0 : _dropdownRef$current.click());
2849
+ },
2850
+ tooltipProps: {
2851
+ content: tooltipContent !== null && tooltipContent !== void 0 ? tooltipContent : label,
2852
+ position: "bottom"
2853
+ },
2854
+ variant: "ghost",
2855
+ className: "ne-toolbar-item ne-toolbar-dropdown"
2856
+ },
2857
+ children: /*#__PURE__*/jsx(DropdownMenu.Menu, {
2858
+ className: "neeto-editor-highlight-dropdown",
2859
+ children: renderSections
2860
+ })
2861
+ });
2862
+ };
2863
+
2864
+ var Menu$1 = DropdownMenu.Menu;
2865
+ var TableOption = function TableOption(_ref) {
2866
+ var editor = _ref.editor,
2867
+ tooltipContent = _ref.tooltipContent,
2868
+ _ref$isSecondaryMenu = _ref.isSecondaryMenu,
2869
+ isSecondaryMenu = _ref$isSecondaryMenu === void 0 ? false : _ref$isSecondaryMenu,
2870
+ label = _ref.label;
2871
+ var _useTranslation = useTranslation(),
2872
+ t = _useTranslation.t;
2873
+ var _useState = useState(3),
2874
+ _useState2 = _slicedToArray(_useState, 2),
2875
+ rows = _useState2[0],
2876
+ setRows = _useState2[1];
2877
+ var _useState3 = useState(3),
2878
+ _useState4 = _slicedToArray(_useState3, 2),
2879
+ columns = _useState4[0],
2880
+ setColumns = _useState4[1];
2881
+ // Bumping this key remounts DropdownMenu, which closes it after submit.
2882
+ // The wrapper exposes onClose for the close direction but no programmatic
2883
+ // open control: passing controlled isOpen breaks open clicks (the wrapper's
2884
+ // handleOpenChange ignores open events when controlled), and passing
2885
+ // onClick to drive isOpen flips the wrapper into SplitTrigger mode
2886
+ // (a two-button ButtonGroup) which we don't want here.
2887
+ var _useState5 = useState(0),
2888
+ _useState6 = _slicedToArray(_useState5, 2),
2889
+ resetKey = _useState6[0],
2890
+ setResetKey = _useState6[1];
2891
+ var handleClose = function handleClose() {
2892
+ setRows(3);
2893
+ setColumns(3);
2894
+ };
2895
+ var handleSubmit = function handleSubmit() {
2896
+ editor.chain().focus().insertTable({
2897
+ rows: rows,
2898
+ cols: columns,
2899
+ withHeaderRow: true
2900
+ }).run();
2901
+ handleClose();
2902
+ setResetKey(function (k) {
2903
+ return k + 1;
2904
+ });
2905
+ };
2906
+ var formContent = /*#__PURE__*/jsxs(Fragment$1, {
2907
+ children: [/*#__PURE__*/jsx(Input, {
2908
+ autoFocus: true,
2909
+ "data-testid": "neeto-editor-fixed-menu-table-rows-input",
2910
+ label: t("neetoEditor.menu.rows"),
2911
+ min: "1",
2912
+ placeholder: t("neetoEditor.placeholders.rows"),
2913
+ size: "small",
2914
+ type: "number",
2915
+ value: rows,
2916
+ onChange: withEventTargetValue(setRows)
2917
+ }), /*#__PURE__*/jsx(Input, {
2918
+ "data-testid": "neeto-editor-fixed-menu-table-columns-input",
2919
+ label: t("neetoEditor.menu.columns"),
2920
+ min: "1",
2921
+ placeholder: t("neetoEditor.placeholders.columns"),
2922
+ size: "small",
2923
+ type: "number",
2924
+ value: columns,
2925
+ onChange: withEventTargetValue(setColumns)
2926
+ }), /*#__PURE__*/jsx("div", {
2927
+ className: "neeto-editor-table-menu__button",
2928
+ children: /*#__PURE__*/jsx(Button$1, {
2929
+ className: "mt-auto",
2930
+ "data-testid": "neeto-editor-fixed-menu-table-option-create-button",
2931
+ label: t("neetoEditor.common.create"),
2932
+ size: "sm",
2933
+ onClick: handleSubmit
2934
+ })
2935
+ })]
2936
+ });
2937
+ if (isSecondaryMenu) {
2938
+ return /*#__PURE__*/createElement(DropdownMenu.SubMenu, {
2939
+ label: label,
2940
+ icon: Table,
2941
+ key: resetKey,
2942
+ contentProps: {
2943
+ className: "ne-editor-dropdown neeto-editor-table__item w-auto p-2 flex flex-col"
2944
+ },
2945
+ triggerProps: {
2946
+ "data-testid": "neeto-editor-fixed-menu-table-option"
2947
+ }
2948
+ }, formContent);
2949
+ }
2950
+ return /*#__PURE__*/jsx(DropdownMenu, {
2951
+ closeOnSelect: false,
2952
+ dropdownProps: {
2953
+ className: "ne-editor-dropdown w-auto p-2"
2954
+ },
2955
+ icon: Table,
2956
+ position: "bottom",
2957
+ buttonProps: {
2958
+ tabIndex: -1,
2959
+ tooltipProps: {
2960
+ content: tooltipContent !== null && tooltipContent !== void 0 ? tooltipContent : label,
2961
+ position: "bottom"
2962
+ },
2963
+ variant: "ghost",
2964
+ className: "ne-toolbar-item ne-toolbar-dropdown",
2965
+ "data-testid": "neeto-editor-fixed-menu-table-option"
2966
+ },
2967
+ onClose: handleClose,
2968
+ children: /*#__PURE__*/jsx(Menu$1, {
2969
+ className: "neeto-editor-table__item",
2970
+ children: formContent
2971
+ })
2972
+ }, resetKey);
2973
+ };
2974
+ var TableOption$1 = /*#__PURE__*/memo(TableOption);
2975
+
2976
+ var _SHORTCUTS;
2977
+ var MENU_ELEMENT_TYPES = {
2978
+ BUTTON: "button",
2979
+ CALLOUT: "callout",
2980
+ FONT_SIZE: "fontSize",
2981
+ TABLE: "table",
2982
+ TEXT_COLOR: "textColor",
2983
+ EMOJI: "emoji",
2984
+ MENTIONS: "mentions",
2985
+ HIGHLIGHT: "highlight"
2986
+ };
2987
+ var SHORTCUTS = (_SHORTCUTS = {}, _defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_SHORTCUTS, EDITOR_OPTIONS.BOLD, {
2988
+ mac: "⌘B",
2989
+ win: "Ctrl+B"
2990
+ }), EDITOR_OPTIONS.ITALIC, {
2991
+ mac: "⌘I",
2992
+ win: "Ctrl+I"
2993
+ }), EDITOR_OPTIONS.UNDERLINE, {
2994
+ mac: "⌘U",
2995
+ win: "Ctrl+U"
2996
+ }), EDITOR_OPTIONS.STRIKETHROUGH, {
2997
+ mac: "⌘⇧S or ⌘⇧X",
2998
+ win: "Ctrl+Shift+S or Ctrl+Shift+X"
2999
+ }), EDITOR_OPTIONS.CODE, {
3000
+ mac: "⌘E",
3001
+ win: "Ctrl+E"
3002
+ }), EDITOR_OPTIONS.UNDO, {
3003
+ mac: "⌘Z",
3004
+ win: "Ctrl+Z"
3005
+ }), EDITOR_OPTIONS.REDO, {
3006
+ mac: "⌘⇧Z",
3007
+ win: "Ctrl+Shift+Z"
3008
+ }), EDITOR_OPTIONS.LINK, {
3009
+ mac: "⌘K",
3010
+ win: "Ctrl+K"
3011
+ }), EDITOR_OPTIONS.HIGHLIGHT, {
3012
+ mac: "⌘⇧H",
3013
+ win: "Ctrl+Shift+H"
3014
+ }), "bulletList", {
3015
+ mac: "⌘⇧8",
3016
+ win: "Ctrl+Shift+8"
3017
+ }), _defineProperty(_defineProperty(_SHORTCUTS, "orderedList", {
3018
+ mac: "⌘⇧7",
3019
+ win: "Ctrl+Shift+7"
3020
+ }), "todoList", {
3021
+ mac: "⌘⇧9",
3022
+ win: "Ctrl+Shift+9"
3023
+ }));
3024
+ var MENU_ELEMENTS = _defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty({}, MENU_ELEMENT_TYPES.BUTTON, MenuButton$1), MENU_ELEMENT_TYPES.CALLOUT, CalloutDropdown), MENU_ELEMENT_TYPES.FONT_SIZE, FontSizeOption$1), MENU_ELEMENT_TYPES.TABLE, TableOption$1), MENU_ELEMENT_TYPES.TEXT_COLOR, TextColorOption), MENU_ELEMENT_TYPES.EMOJI, EmojiOption$1), MENU_ELEMENT_TYPES.MENTIONS, Mentions$1), MENU_ELEMENT_TYPES.HIGHLIGHT, HighlightDropdown);
3025
+ var MENU_ELEMENT_WIDTHS = _defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty({}, MENU_ELEMENT_TYPES.BUTTON, 36), MENU_ELEMENT_TYPES.CALLOUT, 23), MENU_ELEMENT_TYPES.FONT_SIZE, 103), MENU_ELEMENT_TYPES.TABLE, 36), MENU_ELEMENT_TYPES.TEXT_COLOR, 36), MENU_ELEMENT_TYPES.EMOJI, 36), MENU_ELEMENT_TYPES.MENTIONS, 36), MENU_ELEMENT_TYPES.HIGHLIGHT, 103);
3026
+
3027
+ function ownKeys$1(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; }
3028
+ function _objectSpread$1(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$1(Object(t), true).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$1(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
3029
+ var createMenuOptions = function createMenuOptions(_ref) {
3030
+ var _tooltips$fontSize, _tooltips$bold, _tooltips$italic, _tooltips$link, _tooltips$strike, _tooltips$highlight, _tooltips$highlight2, _tooltips$bulletList, _tooltips$orderedList, _tooltips$todoList, _tooltips$blockQuote, _tooltips$callout, _tooltips$callout2, _tooltips$table, _tooltips$attachments, _tooltips$neetoKbArti, _tooltips$imageUpload, _tooltips$textColor, _tooltips$emoji, _tooltips$mention, _tooltips$code, _tooltips$codeBlock, _tooltips$videoUpload, _tooltips$underline, _tooltips$undo, _tooltips$redo;
3031
+ var tooltips = _ref.tooltips,
3032
+ setMediaUploader = _ref.setMediaUploader,
3033
+ attachmentProps = _ref.attachmentProps,
3034
+ setIsAddLinkActive = _ref.setIsAddLinkActive,
3035
+ options = _ref.options,
3036
+ mentions = _ref.mentions,
3037
+ addonCommandOptions = _ref.addonCommandOptions,
3038
+ setIsEmojiPickerActive = _ref.setIsEmojiPickerActive,
3039
+ isEmojiPickerActive = _ref.isEmojiPickerActive,
3040
+ runEditorCommand = _ref.runEditorCommand,
3041
+ editor = _ref.editor,
3042
+ setIsNeetoKbArticleActive = _ref.setIsNeetoKbArticleActive;
3043
+ var fontSizeOptions = options.filter(function (option) {
3044
+ return option.match(/^h[1-6]$/);
3045
+ });
3046
+ return [[{
3047
+ type: MENU_ELEMENT_TYPES.FONT_SIZE,
3048
+ options: fontSizeOptions,
3049
+ label: (_tooltips$fontSize = tooltips.fontSize) !== null && _tooltips$fontSize !== void 0 ? _tooltips$fontSize : t$1("neetoEditor.menu.fontSize"),
3050
+ isEnabled: isNotEmpty(fontSizeOptions),
3051
+ optionName: "fontSizeOptions",
3052
+ runEditorCommand: runEditorCommand
3053
+ }, {
3054
+ type: MENU_ELEMENT_TYPES.BUTTON,
3055
+ icon: Bold,
3056
+ isEnabled: options.includes(EDITOR_OPTIONS.BOLD),
3057
+ command: runEditorCommand(function (editor) {
3058
+ return editor === null || editor === void 0 ? void 0 : editor.chain().focus().toggleBold().run();
3059
+ }),
3060
+ optionName: EDITOR_OPTIONS.BOLD,
3061
+ label: (_tooltips$bold = tooltips.bold) !== null && _tooltips$bold !== void 0 ? _tooltips$bold : t$1("neetoEditor.menu.bold")
3062
+ }, {
3063
+ type: MENU_ELEMENT_TYPES.BUTTON,
3064
+ icon: Italic,
3065
+ isEnabled: options.includes(EDITOR_OPTIONS.ITALIC),
3066
+ command: runEditorCommand(function (editor) {
3067
+ return editor.chain().focus().toggleItalic().run();
3068
+ }),
3069
+ optionName: EDITOR_OPTIONS.ITALIC,
3070
+ label: (_tooltips$italic = tooltips.italic) !== null && _tooltips$italic !== void 0 ? _tooltips$italic : t$1("neetoEditor.menu.italic")
3071
+ }, {
3072
+ type: MENU_ELEMENT_TYPES.BUTTON,
3073
+ icon: Link,
3074
+ isEnabled: options.includes(EDITOR_OPTIONS.LINK),
3075
+ command: function command() {
3076
+ return setIsAddLinkActive(not);
3077
+ },
3078
+ optionName: EDITOR_OPTIONS.LINK,
3079
+ label: (_tooltips$link = tooltips.link) !== null && _tooltips$link !== void 0 ? _tooltips$link : t$1("neetoEditor.menu.link")
3080
+ }, {
3081
+ type: MENU_ELEMENT_TYPES.BUTTON,
3082
+ icon: Strikethrough,
3083
+ isEnabled: options.includes(EDITOR_OPTIONS.STRIKETHROUGH),
3084
+ command: runEditorCommand(function (editor) {
3085
+ return editor.chain().focus().toggleStrike().run();
3086
+ }),
3087
+ optionName: EDITOR_OPTIONS.STRIKETHROUGH,
3088
+ label: (_tooltips$strike = tooltips.strike) !== null && _tooltips$strike !== void 0 ? _tooltips$strike : t$1("neetoEditor.menu.strike")
3089
+ }, {
3090
+ type: MENU_ELEMENT_TYPES.HIGHLIGHT,
3091
+ icon: Highlighter,
3092
+ label: (_tooltips$highlight = tooltips.highlight) !== null && _tooltips$highlight !== void 0 ? _tooltips$highlight : t$1("neetoEditor.menu.highlight"),
3093
+ isEnabled: options.includes(EDITOR_OPTIONS.HIGHLIGHT),
3094
+ optionName: EDITOR_OPTIONS.HIGHLIGHT,
3095
+ editor: editor,
3096
+ runEditorCommand: runEditorCommand,
3097
+ tooltipContent: (_tooltips$highlight2 = tooltips.highlight) !== null && _tooltips$highlight2 !== void 0 ? _tooltips$highlight2 : t$1("neetoEditor.menu.highlight")
3098
+ }], [{
3099
+ type: MENU_ELEMENT_TYPES.BUTTON,
3100
+ icon: List,
3101
+ command: runEditorCommand(function (editor) {
3102
+ return editor.chain().focus().toggleBulletList().run();
3103
+ }),
3104
+ isEnabled: options.includes(EDITOR_OPTIONS.LIST_BULLETS),
3105
+ optionName: "bulletList",
3106
+ highlight: true,
3107
+ label: (_tooltips$bulletList = tooltips.bulletList) !== null && _tooltips$bulletList !== void 0 ? _tooltips$bulletList : t$1("neetoEditor.menu.bulletedList")
3108
+ }, {
3109
+ type: MENU_ELEMENT_TYPES.BUTTON,
3110
+ icon: ListOrdered,
3111
+ command: runEditorCommand(function (editor) {
3112
+ return editor.chain().focus().toggleOrderedList().run();
3113
+ }),
3114
+ isEnabled: options.includes(EDITOR_OPTIONS.LIST_ORDERED),
3115
+ optionName: "orderedList",
3116
+ highlight: true,
3117
+ label: (_tooltips$orderedList = tooltips.orderedList) !== null && _tooltips$orderedList !== void 0 ? _tooltips$orderedList : t$1("neetoEditor.menu.orderedList")
3118
+ }, {
3119
+ type: MENU_ELEMENT_TYPES.BUTTON,
3120
+ icon: ListChecks,
3121
+ command: runEditorCommand(function (editor) {
3122
+ return editor.chain().focus().toggleTaskList().run();
3123
+ }),
3124
+ isEnabled: options.includes(EDITOR_OPTIONS.TODO_LIST),
3125
+ optionName: "todoList",
3126
+ highlight: true,
3127
+ label: (_tooltips$todoList = tooltips.todoList) !== null && _tooltips$todoList !== void 0 ? _tooltips$todoList : t$1("neetoEditor.menu.todoList")
3128
+ }], [{
3129
+ type: MENU_ELEMENT_TYPES.BUTTON,
3130
+ icon: Quote,
3131
+ command: runEditorCommand(function (editor) {
3132
+ return editor.chain().focus().toggleBlockquote().run();
3133
+ }),
3134
+ isEnabled: options.includes(EDITOR_OPTIONS.BLOCKQUOTE),
3135
+ optionName: "blockquote",
3136
+ highlight: true,
3137
+ label: (_tooltips$blockQuote = tooltips.blockQuote) !== null && _tooltips$blockQuote !== void 0 ? _tooltips$blockQuote : t$1("neetoEditor.menu.blockQuote")
3138
+ }, {
3139
+ type: MENU_ELEMENT_TYPES.CALLOUT,
3140
+ label: (_tooltips$callout = tooltips.callout) !== null && _tooltips$callout !== void 0 ? _tooltips$callout : t$1("neetoEditor.menu.callout"),
3141
+ isEnabled: options.includes(EDITOR_OPTIONS.CALLOUT),
3142
+ optionName: EDITOR_OPTIONS.CALLOUT,
3143
+ editor: editor,
3144
+ runEditorCommand: runEditorCommand,
3145
+ tooltipContent: (_tooltips$callout2 = tooltips.callout) !== null && _tooltips$callout2 !== void 0 ? _tooltips$callout2 : t$1("neetoEditor.menu.callout")
3146
+ }], [{
3147
+ type: MENU_ELEMENT_TYPES.TABLE,
3148
+ label: (_tooltips$table = tooltips.table) !== null && _tooltips$table !== void 0 ? _tooltips$table : t$1("neetoEditor.menu.table"),
3149
+ isEnabled: options.includes(EDITOR_OPTIONS.TABLE),
3150
+ optionName: EDITOR_OPTIONS.TABLE
3151
+ }, {
3152
+ type: MENU_ELEMENT_TYPES.BUTTON,
3153
+ icon: Paperclip,
3154
+ command: function command() {
3155
+ return attachmentProps === null || attachmentProps === void 0 ? void 0 : attachmentProps.handleUploadAttachments();
3156
+ },
3157
+ disabled: attachmentProps === null || attachmentProps === void 0 ? void 0 : attachmentProps.isDisabled,
3158
+ isEnabled: options.includes(EDITOR_OPTIONS.ATTACHMENTS),
3159
+ optionName: EDITOR_OPTIONS.ATTACHMENTS,
3160
+ label: (_tooltips$attachments = tooltips.attachments) !== null && _tooltips$attachments !== void 0 ? _tooltips$attachments : t$1("neetoEditor.menu.attachments")
3161
+ }, {
3162
+ type: MENU_ELEMENT_TYPES.BUTTON,
3163
+ icon: FileText,
3164
+ command: function command() {
3165
+ if (!editor || !setIsNeetoKbArticleActive) return;
3166
+ var _editor$state$selecti = editor.state.selection,
3167
+ from = _editor$state$selecti.from,
3168
+ to = _editor$state$selecti.to;
3169
+ var cursorPos = editor.view.coordsAtPos(from);
3170
+ setIsNeetoKbArticleActive({
3171
+ active: true,
3172
+ editor: editor,
3173
+ range: {
3174
+ from: from,
3175
+ to: to
3176
+ },
3177
+ cursorPos: cursorPos
3178
+ });
3179
+ },
3180
+ isEnabled: options.includes(EDITOR_OPTIONS.NEETO_KB_ARTICLE),
3181
+ optionName: EDITOR_OPTIONS.NEETO_KB_ARTICLE,
3182
+ label: (_tooltips$neetoKbArti = tooltips.neetoKbArticle) !== null && _tooltips$neetoKbArti !== void 0 ? _tooltips$neetoKbArti : t$1("neetoEditor.menu.linkToNeetoKbArticle")
3183
+ }, {
3184
+ type: MENU_ELEMENT_TYPES.BUTTON,
3185
+ icon: ImageUp,
3186
+ command: function command() {
3187
+ return setMediaUploader(assoc("image", true));
3188
+ },
3189
+ isEnabled: options.includes(EDITOR_OPTIONS.IMAGE_UPLOAD),
3190
+ optionName: EDITOR_OPTIONS.IMAGE_UPLOAD,
3191
+ label: (_tooltips$imageUpload = tooltips.imageUpload) !== null && _tooltips$imageUpload !== void 0 ? _tooltips$imageUpload : t$1("neetoEditor.menu.imageUpload")
3192
+ }], [{
3193
+ type: MENU_ELEMENT_TYPES.TEXT_COLOR,
3194
+ label: (_tooltips$textColor = tooltips.textColor) !== null && _tooltips$textColor !== void 0 ? _tooltips$textColor : t$1("neetoEditor.menu.textColor"),
3195
+ isEnabled: options.includes(EDITOR_OPTIONS.TEXT_COLOR),
3196
+ optionName: EDITOR_OPTIONS.TEXT_COLOR
3197
+ }, {
3198
+ type: MENU_ELEMENT_TYPES.EMOJI,
3199
+ label: (_tooltips$emoji = tooltips.emoji) !== null && _tooltips$emoji !== void 0 ? _tooltips$emoji : t$1("neetoEditor.menu.emoji"),
3200
+ isEnabled: options.includes(EDITOR_OPTIONS.EMOJI),
3201
+ optionName: EDITOR_OPTIONS.EMOJI,
3202
+ setActive: setIsEmojiPickerActive,
3203
+ isActive: isEmojiPickerActive
3204
+ }, {
3205
+ type: MENU_ELEMENT_TYPES.MENTIONS,
3206
+ label: (_tooltips$mention = tooltips.mention) !== null && _tooltips$mention !== void 0 ? _tooltips$mention : t$1("neetoEditor.menu.mention"),
3207
+ isEnabled: isNotEmpty(mentions),
3208
+ optionName: "mentions",
3209
+ mentions: mentions
3210
+ }, {
3211
+ type: MENU_ELEMENT_TYPES.BUTTON,
3212
+ icon: Code,
3213
+ command: runEditorCommand(function (editor) {
3214
+ return editor.chain().focus().toggleCode().run();
3215
+ }),
3216
+ isEnabled: options.includes(EDITOR_OPTIONS.CODE),
3217
+ optionName: EDITOR_OPTIONS.CODE,
3218
+ label: (_tooltips$code = tooltips.code) !== null && _tooltips$code !== void 0 ? _tooltips$code : t$1("neetoEditor.menu.code")
3219
+ }, {
3220
+ type: MENU_ELEMENT_TYPES.BUTTON,
3221
+ icon: SquareCode,
3222
+ command: runEditorCommand(function (editor) {
3223
+ return editor.chain().focus().toggleCodeBlock().run();
3224
+ }),
3225
+ isEnabled: options.includes(EDITOR_OPTIONS.CODE_BLOCK),
3226
+ optionName: "codeBlock",
3227
+ label: (_tooltips$codeBlock = tooltips.codeBlock) !== null && _tooltips$codeBlock !== void 0 ? _tooltips$codeBlock : t$1("neetoEditor.menu.codeBlock")
3228
+ }, {
3229
+ type: MENU_ELEMENT_TYPES.BUTTON,
3230
+ icon: Video,
3231
+ command: function command() {
3232
+ return setMediaUploader(assoc("video", true));
3233
+ },
3234
+ isEnabled: options.includes(EDITOR_OPTIONS.VIDEO_UPLOAD),
3235
+ optionName: EDITOR_OPTIONS.VIDEO_UPLOAD,
3236
+ label: (_tooltips$videoUpload = tooltips.videoUpload) !== null && _tooltips$videoUpload !== void 0 ? _tooltips$videoUpload : t$1("neetoEditor.menu.videoUpload")
3237
+ }, {
3238
+ type: MENU_ELEMENT_TYPES.BUTTON,
3239
+ icon: Underline,
3240
+ isEnabled: options.includes(EDITOR_OPTIONS.UNDERLINE),
3241
+ command: runEditorCommand(function (editor) {
3242
+ return editor.chain().focus().toggleUnderline().run();
3243
+ }),
3244
+ optionName: EDITOR_OPTIONS.UNDERLINE,
3245
+ label: (_tooltips$underline = tooltips.underline) !== null && _tooltips$underline !== void 0 ? _tooltips$underline : t$1("neetoEditor.menu.underline")
3246
+ }], _toConsumableArray(addonCommandOptions), [{
3247
+ icon: Undo,
3248
+ command: runEditorCommand(function (editor) {
3249
+ return editor.chain().focus().undo().run();
3250
+ }),
3251
+ isEnabled: options.includes(EDITOR_OPTIONS.UNDO),
3252
+ optionName: EDITOR_OPTIONS.UNDO,
3253
+ label: (_tooltips$undo = tooltips.undo) !== null && _tooltips$undo !== void 0 ? _tooltips$undo : t$1("neetoEditor.menu.undo"),
3254
+ type: MENU_ELEMENT_TYPES.BUTTON
3255
+ }, {
3256
+ icon: Redo,
3257
+ command: runEditorCommand(function (editor) {
3258
+ return editor.chain().focus().redo().run();
3259
+ }),
3260
+ isEnabled: options.includes(EDITOR_OPTIONS.REDO),
3261
+ optionName: EDITOR_OPTIONS.REDO,
3262
+ label: (_tooltips$redo = tooltips.redo) !== null && _tooltips$redo !== void 0 ? _tooltips$redo : t$1("neetoEditor.menu.redo"),
3263
+ type: MENU_ELEMENT_TYPES.BUTTON
3264
+ }]];
3265
+ };
3266
+ var buildOptionsFromAddonCommands = function buildOptionsFromAddonCommands(_ref2) {
3267
+ var commands = _ref2.commands,
3268
+ runEditorCommand = _ref2.runEditorCommand;
3269
+ return commands.map(function (option) {
3270
+ return _objectSpread$1(_objectSpread$1({}, option), {}, {
3271
+ type: MENU_ELEMENT_TYPES.BUTTON,
3272
+ command: runEditorCommand(function (editor) {
3273
+ var _option$command, _editor$state, _editor$state2;
3274
+ return (_option$command = option.command) === null || _option$command === void 0 ? void 0 : _option$command.call(option, {
3275
+ editor: editor,
3276
+ range: {
3277
+ from: (_editor$state = editor.state) === null || _editor$state === void 0 || (_editor$state = _editor$state.selection) === null || _editor$state === void 0 ? void 0 : _editor$state.to,
3278
+ to: (_editor$state2 = editor.state) === null || _editor$state2 === void 0 ? void 0 : _editor$state2.selection.to
3279
+ }
3280
+ });
3281
+ })
3282
+ });
3283
+ });
3284
+ };
3285
+ var buildMenuOptions = function buildMenuOptions(_ref3) {
3286
+ var tooltips = _ref3.tooltips,
3287
+ options = _ref3.options,
3288
+ setMediaUploader = _ref3.setMediaUploader,
3289
+ attachmentProps = _ref3.attachmentProps,
3290
+ setIsAddLinkActive = _ref3.setIsAddLinkActive,
3291
+ _ref3$mentions = _ref3.mentions,
3292
+ mentions = _ref3$mentions === void 0 ? [] : _ref3$mentions,
3293
+ addonCommands = _ref3.addonCommands,
3294
+ setIsEmojiPickerActive = _ref3.setIsEmojiPickerActive,
3295
+ isEmojiPickerActive = _ref3.isEmojiPickerActive,
3296
+ runEditorCommand = _ref3.runEditorCommand,
3297
+ editor = _ref3.editor,
3298
+ setIsNeetoKbArticleActive = _ref3.setIsNeetoKbArticleActive;
3299
+ var addonCommandOptions = buildOptionsFromAddonCommands({
3300
+ commands: addonCommands,
3301
+ runEditorCommand: runEditorCommand
3302
+ });
3303
+ var menuOptions = createMenuOptions({
3304
+ tooltips: tooltips,
3305
+ setMediaUploader: setMediaUploader,
3306
+ attachmentProps: attachmentProps,
3307
+ setIsAddLinkActive: setIsAddLinkActive,
3308
+ options: options,
3309
+ mentions: mentions,
3310
+ addonCommandOptions: addonCommandOptions,
3311
+ setIsEmojiPickerActive: setIsEmojiPickerActive,
3312
+ isEmojiPickerActive: isEmojiPickerActive,
3313
+ runEditorCommand: runEditorCommand,
3314
+ editor: editor,
3315
+ setIsNeetoKbArticleActive: setIsNeetoKbArticleActive
3316
+ });
3317
+ return menuOptions.map(function (option) {
3318
+ return option.filter(prop("isEnabled"));
3319
+ });
3320
+ };
3321
+ var getCursorPos = function getCursorPos(editor, to) {
3322
+ return editor === null || editor === void 0 ? void 0 : editor.view.coordsAtPos(to);
3323
+ };
3324
+ var reGroupMenuItems = function reGroupMenuItems(menuRef, menuGroups) {
3325
+ var toolbarWidth = menuRef.current.offsetWidth;
3326
+ var totalWidth = 0;
3327
+ var visibleMenuGroups = [];
3328
+ var invisibleMenuGroups = [];
3329
+ menuGroups.forEach(function (group, groupIndex) {
3330
+ group.forEach(function (item, itemIndex) {
3331
+ var width = MENU_ELEMENT_WIDTHS[item.type];
3332
+ if (totalWidth + width < toolbarWidth) {
3333
+ var _visibleMenuGroups$gr;
3334
+ totalWidth += width;
3335
+ visibleMenuGroups[groupIndex] = (_visibleMenuGroups$gr = visibleMenuGroups[groupIndex]) !== null && _visibleMenuGroups$gr !== void 0 ? _visibleMenuGroups$gr : [];
3336
+ visibleMenuGroups[groupIndex][itemIndex] = item;
3337
+ } else {
3338
+ var _invisibleMenuGroups$;
3339
+ var visibleMenuGroupsLength = visibleMenuGroups.length;
3340
+ var index = groupIndex - visibleMenuGroupsLength + 1;
3341
+ invisibleMenuGroups[index] = (_invisibleMenuGroups$ = invisibleMenuGroups[index]) !== null && _invisibleMenuGroups$ !== void 0 ? _invisibleMenuGroups$ : [];
3342
+ invisibleMenuGroups[index][itemIndex] = item;
3343
+ }
3344
+ });
3345
+ });
3346
+ return {
3347
+ visibleMenuGroups: visibleMenuGroups,
3348
+ invisibleMenuGroups: invisibleMenuGroups
3349
+ };
3350
+ };
3351
+ var getLinkPopoverPosition = function getLinkPopoverPosition(editor, popoverRef) {
3352
+ var _editor$view$state$se = editor.view.state.selection,
3353
+ selectionEnd = _editor$view$state$se.$to.pos,
3354
+ selectionStart = _editor$view$state$se.$from.pos;
3355
+ var selectionLength = selectionEnd - selectionStart;
3356
+ var offset = 0;
3357
+ if (selectionLength > 1) offset = Math.round(selectionLength / 2);
3358
+ if (selectionLength === 1) offset = 1;
3359
+ var arrowCoords = editor.view.coordsAtPos(selectionStart + offset);
3360
+ var arrowPosition = {
3361
+ top: "".concat(arrowCoords.top + 21, "px"),
3362
+ left: "".concat(arrowCoords.left - 8.5, "px")
3363
+ };
3364
+ var popoverCoords = editor.view.coordsAtPos(selectionStart);
3365
+ var adjustedLeft = popoverCoords === null || popoverCoords === void 0 ? void 0 : popoverCoords.left,
3366
+ adjustedTop = popoverCoords === null || popoverCoords === void 0 ? void 0 : popoverCoords.top;
3367
+ if (popoverRef !== null && popoverRef !== void 0 && popoverRef.current) {
3368
+ var _popoverRef$current;
3369
+ var popoverRect = (_popoverRef$current = popoverRef.current) === null || _popoverRef$current === void 0 ? void 0 : _popoverRef$current.getBoundingClientRect();
3370
+ var screenWidth = window.innerWidth;
3371
+ var screenHeight = window.innerHeight;
3372
+ var maxLeft = screenWidth - popoverRect.width;
3373
+ var maxTop = screenHeight - popoverRect.height - 50;
3374
+ adjustedLeft = popoverCoords !== null && popoverCoords !== void 0 && popoverCoords.left ? Math.min(popoverCoords.left - 50, maxLeft) : 0;
3375
+ adjustedTop = popoverCoords !== null && popoverCoords !== void 0 && popoverCoords.top ? Math.min(popoverCoords.top - 22, maxTop) : 0;
3376
+ } else {
3377
+ adjustedLeft = popoverCoords.left - 50;
3378
+ adjustedTop = popoverCoords.top - 22;
3379
+ }
3380
+ var popoverPosition = {
3381
+ top: "".concat(adjustedTop, "px"),
3382
+ left: "".concat(adjustedLeft, "px")
3383
+ };
3384
+ return {
3385
+ arrowPosition: arrowPosition,
3386
+ popoverPosition: popoverPosition
3387
+ };
3388
+ };
3389
+ function renderTooltipContent(label, optionName) {
3390
+ var shortcut = SHORTCUTS[optionName];
3391
+ if (!shortcut) return label;
3392
+ var isMac = function isMac() {
3393
+ return typeof window !== "undefined" && /Mac|iPod|iPhone|iPad/.test(window.navigator.userAgent);
3394
+ };
3395
+ var key = isMac() ? shortcut.mac : shortcut.win;
3396
+ return "".concat(label, " (").concat(key, ")");
3397
+ }
3398
+
3399
+ 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; }
3400
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), true).forEach(function (r) { _defineProperty(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; }
3401
+ var Menu = function Menu(props) {
3402
+ var _useState = useState(false),
3403
+ _useState2 = _slicedToArray(_useState, 2),
3404
+ isEmojiPickerActive = _useState2[0],
3405
+ setIsEmojiPickerActive = _useState2[1];
3406
+ var _useState3 = useState({
3407
+ image: false,
3408
+ video: false
3409
+ }),
3410
+ _useState4 = _slicedToArray(_useState3, 2),
3411
+ mediaUploader = _useState4[0],
3412
+ setMediaUploader = _useState4[1];
3413
+ var _props$menuType = props.menuType,
3414
+ menuType = _props$menuType === void 0 ? "fixed" : _props$menuType,
3415
+ _props$addons = props.addons,
3416
+ addons = _props$addons === void 0 ? [] : _props$addons,
3417
+ _props$options = props.options,
3418
+ options = _props$options === void 0 ? [] : _props$options,
3419
+ _props$editorSecrets = props.editorSecrets,
3420
+ editorSecrets = _props$editorSecrets === void 0 ? {} : _props$editorSecrets,
3421
+ attachmentProps = props.attachmentProps,
3422
+ _props$defaults = props.defaults,
3423
+ defaults = _props$defaults === void 0 ? DEFAULT_EDITOR_OPTIONS : _props$defaults;
3424
+ var MenuComponent = useMemo(function () {
3425
+ return MENU_COMPONENTS[menuType];
3426
+ }, [menuType]);
3427
+ var menuOptions = isEmpty(options) ? [].concat(_toConsumableArray(defaults), _toConsumableArray(addons)) : options;
3428
+ useEffect(function () {
3429
+ var handleKeyDown = function handleKeyDown(e) {
3430
+ if ((e.metaKey || e.ctrlKey) && e.altKey) {
3431
+ if (e.code === "KeyE") {
3432
+ setIsEmojiPickerActive(function (prevState) {
3433
+ return !prevState;
3434
+ });
3435
+ } else if (e.code === "KeyA") {
3436
+ not(attachmentProps === null || attachmentProps === void 0 ? void 0 : attachmentProps.isDisabled) && (attachmentProps === null || attachmentProps === void 0 ? void 0 : attachmentProps.handleUploadAttachments());
3437
+ } else if (e.code === "KeyK") {
3438
+ setMediaUploader(assoc("image", true));
3439
+ } else if (e.code === "KeyV") {
3440
+ setMediaUploader(assoc("video", true));
3441
+ }
3442
+ }
3443
+ };
3444
+ if (menuType !== "none") {
3445
+ document.addEventListener("keydown", handleKeyDown);
3446
+ }
3447
+ return function () {
3448
+ document.removeEventListener("keydown", handleKeyDown);
3449
+ };
3450
+ }, []);
3451
+ return /*#__PURE__*/jsx(MenuComponent, _objectSpread(_objectSpread({}, _objectSpread(_objectSpread({}, props), {}, {
3452
+ attachmentProps: attachmentProps,
3453
+ isEmojiPickerActive: isEmojiPickerActive,
3454
+ mediaUploader: mediaUploader,
3455
+ setIsEmojiPickerActive: setIsEmojiPickerActive,
3456
+ setMediaUploader: setMediaUploader
3457
+ })), {}, {
3458
+ options: menuOptions,
3459
+ unsplashApiKey: editorSecrets.unsplash
3460
+ }));
3461
+ };
3462
+
3463
+ export { CALLOUT_TYPES as C, DEFAULT_EDITOR_OPTIONS as D, EmojiPickerMenu as E, LINK_VALIDATION_SCHEMA as L, Menu as M, isEmojiSuggestionsMenuActive as a, buildLevelsFromOptions as b, getLinkPopoverPosition as c, validateAndFormatUrl as d, getEditorStyles as e, MenuDynamicVariables as f, getSuggestionAppendTo as g, MediaUploader as h, isEditorOverlaysActive as i, LinkAddPopOver as j, transformPastedHTML as k, handlePaste as l, clipboardTextParser as m, setInitialPosition as s, transformEditorContent as t, validateUrl as v };
3464
+ //# sourceMappingURL=chunk-DsAUS6bL.js.map