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