@pie-lib/editable-html 11.2.1-beta.0 → 11.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/CHANGELOG.json +12 -3322
  2. package/CHANGELOG.md +145 -1
  3. package/lib/block-tags.js +25 -0
  4. package/lib/block-tags.js.map +1 -0
  5. package/lib/constants.js +16 -0
  6. package/lib/constants.js.map +1 -0
  7. package/lib/editor.js +1355 -0
  8. package/lib/editor.js.map +1 -0
  9. package/lib/index.js +269 -0
  10. package/lib/index.js.map +1 -0
  11. package/lib/parse-html.js +16 -0
  12. package/lib/parse-html.js.map +1 -0
  13. package/lib/plugins/characters/custom-popper.js +73 -0
  14. package/lib/plugins/characters/custom-popper.js.map +1 -0
  15. package/lib/plugins/characters/index.js +305 -0
  16. package/lib/plugins/characters/index.js.map +1 -0
  17. package/lib/plugins/characters/utils.js +381 -0
  18. package/lib/plugins/characters/utils.js.map +1 -0
  19. package/lib/plugins/css/icons/index.js +37 -0
  20. package/lib/plugins/css/icons/index.js.map +1 -0
  21. package/lib/plugins/css/index.js +397 -0
  22. package/lib/plugins/css/index.js.map +1 -0
  23. package/lib/plugins/customPlugin/index.js +114 -0
  24. package/lib/plugins/customPlugin/index.js.map +1 -0
  25. package/lib/plugins/html/icons/index.js +38 -0
  26. package/lib/plugins/html/icons/index.js.map +1 -0
  27. package/lib/plugins/html/index.js +80 -0
  28. package/lib/plugins/html/index.js.map +1 -0
  29. package/lib/plugins/image/alt-dialog.js +129 -0
  30. package/lib/plugins/image/alt-dialog.js.map +1 -0
  31. package/lib/plugins/image/component.js +419 -0
  32. package/lib/plugins/image/component.js.map +1 -0
  33. package/lib/plugins/image/image-toolbar.js +177 -0
  34. package/lib/plugins/image/image-toolbar.js.map +1 -0
  35. package/lib/plugins/image/index.js +263 -0
  36. package/lib/plugins/image/index.js.map +1 -0
  37. package/lib/plugins/image/insert-image-handler.js +161 -0
  38. package/lib/plugins/image/insert-image-handler.js.map +1 -0
  39. package/lib/plugins/index.js +402 -0
  40. package/lib/plugins/index.js.map +1 -0
  41. package/lib/plugins/list/index.js +334 -0
  42. package/lib/plugins/list/index.js.map +1 -0
  43. package/lib/plugins/math/index.js +454 -0
  44. package/lib/plugins/math/index.js.map +1 -0
  45. package/lib/plugins/media/index.js +387 -0
  46. package/lib/plugins/media/index.js.map +1 -0
  47. package/lib/plugins/media/media-dialog.js +709 -0
  48. package/lib/plugins/media/media-dialog.js.map +1 -0
  49. package/lib/plugins/media/media-toolbar.js +101 -0
  50. package/lib/plugins/media/media-toolbar.js.map +1 -0
  51. package/lib/plugins/media/media-wrapper.js +93 -0
  52. package/lib/plugins/media/media-wrapper.js.map +1 -0
  53. package/lib/plugins/rendering/index.js +46 -0
  54. package/lib/plugins/rendering/index.js.map +1 -0
  55. package/lib/plugins/respArea/drag-in-the-blank/choice.js +254 -0
  56. package/lib/plugins/respArea/drag-in-the-blank/choice.js.map +1 -0
  57. package/lib/plugins/respArea/drag-in-the-blank/index.js +97 -0
  58. package/lib/plugins/respArea/drag-in-the-blank/index.js.map +1 -0
  59. package/lib/plugins/respArea/explicit-constructed-response/index.js +57 -0
  60. package/lib/plugins/respArea/explicit-constructed-response/index.js.map +1 -0
  61. package/lib/plugins/respArea/icons/index.js +95 -0
  62. package/lib/plugins/respArea/icons/index.js.map +1 -0
  63. package/lib/plugins/respArea/index.js +341 -0
  64. package/lib/plugins/respArea/index.js.map +1 -0
  65. package/lib/plugins/respArea/inline-dropdown/index.js +75 -0
  66. package/lib/plugins/respArea/inline-dropdown/index.js.map +1 -0
  67. package/lib/plugins/respArea/math-templated/index.js +130 -0
  68. package/lib/plugins/respArea/math-templated/index.js.map +1 -0
  69. package/lib/plugins/respArea/utils.js +125 -0
  70. package/lib/plugins/respArea/utils.js.map +1 -0
  71. package/lib/plugins/table/CustomTablePlugin.js +133 -0
  72. package/lib/plugins/table/CustomTablePlugin.js.map +1 -0
  73. package/lib/plugins/table/icons/index.js +69 -0
  74. package/lib/plugins/table/icons/index.js.map +1 -0
  75. package/lib/plugins/table/index.js +483 -0
  76. package/lib/plugins/table/index.js.map +1 -0
  77. package/lib/plugins/table/table-toolbar.js +187 -0
  78. package/lib/plugins/table/table-toolbar.js.map +1 -0
  79. package/lib/plugins/textAlign/icons/index.js +226 -0
  80. package/lib/plugins/textAlign/icons/index.js.map +1 -0
  81. package/lib/plugins/textAlign/index.js +34 -0
  82. package/lib/plugins/textAlign/index.js.map +1 -0
  83. package/lib/plugins/toolbar/default-toolbar.js +229 -0
  84. package/lib/plugins/toolbar/default-toolbar.js.map +1 -0
  85. package/lib/plugins/toolbar/done-button.js +53 -0
  86. package/lib/plugins/toolbar/done-button.js.map +1 -0
  87. package/lib/plugins/toolbar/editor-and-toolbar.js +286 -0
  88. package/lib/plugins/toolbar/editor-and-toolbar.js.map +1 -0
  89. package/lib/plugins/toolbar/index.js +34 -0
  90. package/lib/plugins/toolbar/index.js.map +1 -0
  91. package/lib/plugins/toolbar/toolbar-buttons.js +194 -0
  92. package/lib/plugins/toolbar/toolbar-buttons.js.map +1 -0
  93. package/lib/plugins/toolbar/toolbar.js +376 -0
  94. package/lib/plugins/toolbar/toolbar.js.map +1 -0
  95. package/lib/plugins/utils.js +62 -0
  96. package/lib/plugins/utils.js.map +1 -0
  97. package/lib/serialization.js +677 -0
  98. package/lib/serialization.js.map +1 -0
  99. package/lib/shared/alert-dialog.js +75 -0
  100. package/lib/shared/index.js +136 -0
  101. package/lib/theme.js +9 -0
  102. package/lib/theme.js.map +1 -0
  103. package/package.json +5 -8
  104. package/src/editor.jsx +3 -3
  105. package/src/plugins/media/media-dialog.js +1 -1
  106. package/src/plugins/respArea/drag-in-the-blank/choice.jsx +1 -1
  107. package/src/plugins/toolbar/editor-and-toolbar.jsx +1 -1
@@ -0,0 +1,305 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports["default"] = CharactersPlugin;
9
+ exports.removeDialogs = void 0;
10
+
11
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
12
+
13
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
14
+
15
+ var _react = _interopRequireDefault(require("react"));
16
+
17
+ var _reactDom = _interopRequireDefault(require("react-dom"));
18
+
19
+ var _debug = _interopRequireDefault(require("debug"));
20
+
21
+ var _get = _interopRequireDefault(require("lodash/get"));
22
+
23
+ var _mathToolbar = require("@pie-lib/math-toolbar");
24
+
25
+ var _customPopper = _interopRequireDefault(require("./custom-popper"));
26
+
27
+ var _utils = require("../respArea/utils");
28
+
29
+ var _utils2 = require("./utils");
30
+
31
+ var _propTypes = _interopRequireDefault(require("prop-types"));
32
+
33
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
34
+
35
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
36
+
37
+ var log = (0, _debug["default"])('@pie-lib:editable-html:plugins:characters');
38
+
39
+ var removePopOvers = function removePopOvers() {
40
+ var prevPopOvers = document.querySelectorAll('#mouse-over-popover');
41
+ log('[characters:removePopOvers]');
42
+ prevPopOvers.forEach(function (s) {
43
+ return s.remove();
44
+ });
45
+ };
46
+
47
+ var removeDialogs = function removeDialogs() {
48
+ var prevDialogs = document.querySelectorAll('.insert-character-dialog');
49
+ log('[characters:removeDialogs]');
50
+ prevDialogs.forEach(function (s) {
51
+ return s.remove();
52
+ });
53
+ removePopOvers();
54
+ };
55
+
56
+ exports.removeDialogs = removeDialogs;
57
+
58
+ var insertDialog = function insertDialog(_ref) {
59
+ var editorDOM = _ref.editorDOM,
60
+ value = _ref.value,
61
+ callback = _ref.callback,
62
+ opts = _ref.opts;
63
+ var newEl = document.createElement('div');
64
+ log('[characters:insertDialog]');
65
+ removeDialogs();
66
+ newEl.className = 'insert-character-dialog';
67
+ var configToUse;
68
+
69
+ switch (true) {
70
+ case opts.language === 'spanish':
71
+ configToUse = _utils2.spanishConfig;
72
+ break;
73
+
74
+ case opts.language === 'special':
75
+ configToUse = _utils2.specialConfig;
76
+ break;
77
+
78
+ default:
79
+ configToUse = opts;
80
+ }
81
+
82
+ if (!configToUse.characters) {
83
+ (0, _utils.insertSnackBar)('No characters provided or language not recognized');
84
+ return;
85
+ }
86
+
87
+ var layoutForCharacters = configToUse.characters.reduce(function (obj, arr) {
88
+ if (arr.length >= obj.columns) {
89
+ obj.columns = arr.length;
90
+ }
91
+
92
+ return obj;
93
+ }, {
94
+ rows: configToUse.characters.length,
95
+ columns: 0
96
+ });
97
+ var popoverEl;
98
+
99
+ var closePopOver = function closePopOver() {
100
+ if (popoverEl) {
101
+ popoverEl.remove();
102
+ }
103
+
104
+ removePopOvers();
105
+ };
106
+
107
+ var renderPopOver = function renderPopOver(event, el) {
108
+ if (!event) {
109
+ return;
110
+ }
111
+
112
+ var infoStyle = {
113
+ fontSize: '20px',
114
+ lineHeight: '20px'
115
+ };
116
+ closePopOver();
117
+ popoverEl = document.createElement('div');
118
+
119
+ _reactDom["default"].render( /*#__PURE__*/_react["default"].createElement(_customPopper["default"], {
120
+ onClose: closePopOver,
121
+ anchorEl: event.currentTarget
122
+ }, /*#__PURE__*/_react["default"].createElement("div", null, el.label), /*#__PURE__*/_react["default"].createElement("div", {
123
+ style: infoStyle
124
+ }, el.description), /*#__PURE__*/_react["default"].createElement("div", {
125
+ style: infoStyle
126
+ }, el.unicode)), popoverEl);
127
+
128
+ document.body.appendChild(newEl);
129
+ };
130
+
131
+ var firstCallMade = false;
132
+
133
+ var listener = function listener(e) {
134
+ // this will be triggered right after setting it because
135
+ // this toolbar is added on the mousedown event
136
+ // so right after mouseup, the click will be triggered
137
+ if (firstCallMade) {
138
+ var focusIsInModals = newEl.contains(e.target) || popoverEl && popoverEl.contains(e.target);
139
+ var focusIsInEditor = editorDOM.contains(e.target);
140
+
141
+ if (!(focusIsInModals || focusIsInEditor)) {
142
+ handleClose();
143
+ }
144
+ } else {
145
+ firstCallMade = true;
146
+ }
147
+ };
148
+
149
+ var handleClose = function handleClose() {
150
+ callback(undefined, true);
151
+ newEl.remove();
152
+ closePopOver();
153
+ document.body.removeEventListener('click', listener);
154
+ };
155
+
156
+ var handleChange = function handleChange(val) {
157
+ if (typeof val === 'string') {
158
+ callback(val, true);
159
+ }
160
+ };
161
+
162
+ var el = /*#__PURE__*/_react["default"].createElement(_mathToolbar.PureToolbar, {
163
+ keyPadCharacterRef: opts.keyPadCharacterRef,
164
+ setKeypadInteraction: opts.setKeypadInteraction,
165
+ autoFocus: true,
166
+ noDecimal: true,
167
+ hideInput: true,
168
+ noLatexHandling: true,
169
+ hideDoneButtonBackground: true,
170
+ layoutForKeyPad: layoutForCharacters,
171
+ additionalKeys: configToUse.characters.reduce(function (arr, n) {
172
+ arr = [].concat((0, _toConsumableArray2["default"])(arr), (0, _toConsumableArray2["default"])(n.map(function (k) {
173
+ return _objectSpread({
174
+ name: (0, _get["default"])(k, 'name') || k,
175
+ write: (0, _get["default"])(k, 'write') || k,
176
+ label: (0, _get["default"])(k, 'label') || k,
177
+ category: 'character',
178
+ extraClass: 'character',
179
+ extraProps: _objectSpread(_objectSpread({}, k.extraProps || {}), {}, {
180
+ style: _objectSpread(_objectSpread({}, (k.extraProps || {}).style), {}, {
181
+ border: '1px solid #000'
182
+ })
183
+ })
184
+ }, configToUse.hasPreview ? {
185
+ actions: {
186
+ onMouseEnter: function onMouseEnter(ev) {
187
+ return renderPopOver(ev, k);
188
+ },
189
+ onMouseLeave: closePopOver
190
+ }
191
+ } : {});
192
+ })));
193
+ return arr;
194
+ }, []),
195
+ keypadMode: "language",
196
+ onChange: handleChange,
197
+ onDone: handleClose
198
+ });
199
+
200
+ _reactDom["default"].render(el, newEl, function () {
201
+ var cursorItem = document.querySelector("[data-key=\"".concat(value.anchorKey, "\"]"));
202
+
203
+ if (cursorItem) {
204
+ var bodyRect = document.body.getBoundingClientRect();
205
+ var boundRect = cursorItem.getBoundingClientRect();
206
+ document.body.appendChild(newEl); // when height of toolbar exceeds screen - can happen in scrollable contexts
207
+
208
+ var additionalTopOffset = 0;
209
+
210
+ if (boundRect.y < newEl.offsetHeight) {
211
+ additionalTopOffset = newEl.offsetHeight - boundRect.y + 10;
212
+ }
213
+
214
+ newEl.style.maxWidth = '500px';
215
+ newEl.style.position = 'absolute';
216
+ newEl.style.top = "".concat(boundRect.top + Math.abs(bodyRect.top) - newEl.offsetHeight - 10 + additionalTopOffset, "px");
217
+ newEl.style.zIndex = 99999;
218
+ var leftValue = "".concat(boundRect.left + Math.abs(bodyRect.left) + cursorItem.offsetWidth + 10, "px");
219
+ var rightValue = "".concat(boundRect.x, "px");
220
+ newEl.style.left = leftValue;
221
+ var leftAlignedWidth = newEl.offsetWidth;
222
+ newEl.style.left = 'unset';
223
+ newEl.style.right = rightValue;
224
+ var rightAlignedWidth = newEl.offsetWidth;
225
+ newEl.style.left = 'unset';
226
+ newEl.style.right = 'unset';
227
+
228
+ if (leftAlignedWidth >= rightAlignedWidth) {
229
+ newEl.style.left = leftValue;
230
+ } else {
231
+ newEl.style.right = rightValue;
232
+ }
233
+
234
+ document.body.addEventListener('click', listener);
235
+ }
236
+ });
237
+ };
238
+
239
+ var CharacterIcon = function CharacterIcon(_ref2) {
240
+ var letter = _ref2.letter;
241
+ return /*#__PURE__*/_react["default"].createElement("div", {
242
+ style: {
243
+ fontSize: '24px',
244
+ lineHeight: '24px'
245
+ }
246
+ }, letter);
247
+ };
248
+
249
+ CharacterIcon.propTypes = {
250
+ letter: _propTypes["default"].string
251
+ };
252
+
253
+ function CharactersPlugin(opts) {
254
+ removeDialogs();
255
+ return {
256
+ name: 'characters',
257
+ toolbar: {
258
+ icon: /*#__PURE__*/_react["default"].createElement(CharacterIcon, {
259
+ letter: opts.characterIcon || _utils2.characterIcons[opts.language] || 'ñ'
260
+ }),
261
+ ariaLabel: "".concat(opts.language, " characters Toolbar"),
262
+ onClick: function onClick(value, onChange, getFocusedValue) {
263
+ var editorDOM = document.querySelector("[data-key=\"".concat(value.document.key, "\"]"));
264
+ var valueToUse = value;
265
+
266
+ var callback = function callback(_char, focus) {
267
+ if (getFocusedValue) {
268
+ valueToUse = getFocusedValue() || valueToUse;
269
+ }
270
+
271
+ if (_char) {
272
+ var change = valueToUse.change().insertTextByKey(valueToUse.anchorKey, valueToUse.anchorOffset, _char);
273
+ valueToUse = change.value;
274
+ log('[characters:insert]: ', value);
275
+ onChange(change);
276
+ }
277
+
278
+ log('[characters:click]');
279
+
280
+ if (focus) {
281
+ if (editorDOM) {
282
+ editorDOM.focus();
283
+ }
284
+ }
285
+ };
286
+
287
+ insertDialog({
288
+ editorDOM: editorDOM,
289
+ value: valueToUse,
290
+ callback: callback,
291
+ opts: opts
292
+ });
293
+ }
294
+ },
295
+ pluginStyles: function pluginStyles(node, parentNode, p) {
296
+ if (p) {
297
+ return {
298
+ position: 'absolute',
299
+ top: 'initial'
300
+ };
301
+ }
302
+ }
303
+ };
304
+ }
305
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/plugins/characters/index.jsx"],"names":["log","removePopOvers","prevPopOvers","document","querySelectorAll","forEach","s","remove","removeDialogs","prevDialogs","insertDialog","editorDOM","value","callback","opts","newEl","createElement","className","configToUse","language","spanishConfig","specialConfig","characters","layoutForCharacters","reduce","obj","arr","length","columns","rows","popoverEl","closePopOver","renderPopOver","event","el","infoStyle","fontSize","lineHeight","ReactDOM","render","currentTarget","label","description","unicode","body","appendChild","firstCallMade","listener","e","focusIsInModals","contains","target","focusIsInEditor","handleClose","undefined","removeEventListener","handleChange","val","keyPadCharacterRef","setKeypadInteraction","n","map","k","name","write","category","extraClass","extraProps","style","border","hasPreview","actions","onMouseEnter","ev","onMouseLeave","cursorItem","querySelector","anchorKey","bodyRect","getBoundingClientRect","boundRect","additionalTopOffset","y","offsetHeight","maxWidth","position","top","Math","abs","zIndex","leftValue","left","offsetWidth","rightValue","x","leftAlignedWidth","right","rightAlignedWidth","addEventListener","CharacterIcon","letter","propTypes","PropTypes","string","CharactersPlugin","toolbar","icon","characterIcon","characterIcons","ariaLabel","onClick","onChange","getFocusedValue","key","valueToUse","char","focus","change","insertTextByKey","anchorOffset","pluginStyles","node","parentNode","p"],"mappings":"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","sourcesContent":["import React from 'react';\nimport ReactDOM from 'react-dom';\nimport debug from 'debug';\nimport get from 'lodash/get';\n\nimport { PureToolbar } from '@pie-lib/math-toolbar';\n\nimport CustomPopper from './custom-popper';\nimport { insertSnackBar } from '../respArea/utils';\nimport { characterIcons, spanishConfig, specialConfig } from './utils';\nimport PropTypes from 'prop-types';\n\nconst log = debug('@pie-lib:editable-html:plugins:characters');\n\nconst removePopOvers = () => {\n const prevPopOvers = document.querySelectorAll('#mouse-over-popover');\n\n log('[characters:removePopOvers]');\n prevPopOvers.forEach((s) => s.remove());\n};\n\nexport const removeDialogs = () => {\n const prevDialogs = document.querySelectorAll('.insert-character-dialog');\n\n log('[characters:removeDialogs]');\n prevDialogs.forEach((s) => s.remove());\n removePopOvers();\n};\n\nconst insertDialog = ({ editorDOM, value, callback, opts }) => {\n const newEl = document.createElement('div');\n\n log('[characters:insertDialog]');\n\n removeDialogs();\n\n newEl.className = 'insert-character-dialog';\n\n let configToUse;\n\n switch (true) {\n case opts.language === 'spanish':\n configToUse = spanishConfig;\n break;\n case opts.language === 'special':\n configToUse = specialConfig;\n break;\n default:\n configToUse = opts;\n }\n\n if (!configToUse.characters) {\n insertSnackBar('No characters provided or language not recognized');\n return;\n }\n\n const layoutForCharacters = configToUse.characters.reduce(\n (obj, arr) => {\n if (arr.length >= obj.columns) {\n obj.columns = arr.length;\n }\n\n return obj;\n },\n { rows: configToUse.characters.length, columns: 0 },\n );\n\n let popoverEl;\n\n const closePopOver = () => {\n if (popoverEl) {\n popoverEl.remove();\n }\n\n removePopOvers();\n };\n\n const renderPopOver = (event, el) => {\n if (!event) {\n return;\n }\n\n const infoStyle = { fontSize: '20px', lineHeight: '20px' };\n\n closePopOver();\n\n popoverEl = document.createElement('div');\n ReactDOM.render(\n <CustomPopper onClose={closePopOver} anchorEl={event.currentTarget}>\n <div>{el.label}</div>\n\n <div style={infoStyle}>{el.description}</div>\n\n <div style={infoStyle}>{el.unicode}</div>\n </CustomPopper>,\n popoverEl,\n );\n\n document.body.appendChild(newEl);\n };\n\n let firstCallMade = false;\n\n const listener = (e) => {\n // this will be triggered right after setting it because\n // this toolbar is added on the mousedown event\n // so right after mouseup, the click will be triggered\n if (firstCallMade) {\n const focusIsInModals = newEl.contains(e.target) || (popoverEl && popoverEl.contains(e.target));\n const focusIsInEditor = editorDOM.contains(e.target);\n\n if (!(focusIsInModals || focusIsInEditor)) {\n handleClose();\n }\n } else {\n firstCallMade = true;\n }\n };\n\n const handleClose = () => {\n callback(undefined, true);\n newEl.remove();\n closePopOver();\n document.body.removeEventListener('click', listener);\n };\n\n const handleChange = (val) => {\n if (typeof val === 'string') {\n callback(val, true);\n }\n };\n\n const el = (\n <PureToolbar\n keyPadCharacterRef={opts.keyPadCharacterRef}\n setKeypadInteraction={opts.setKeypadInteraction}\n autoFocus\n noDecimal\n hideInput\n noLatexHandling\n hideDoneButtonBackground\n layoutForKeyPad={layoutForCharacters}\n additionalKeys={configToUse.characters.reduce((arr, n) => {\n arr = [\n ...arr,\n ...n.map((k) => ({\n name: get(k, 'name') || k,\n write: get(k, 'write') || k,\n label: get(k, 'label') || k,\n category: 'character',\n extraClass: 'character',\n extraProps: {\n ...(k.extraProps || {}),\n style: {\n ...(k.extraProps || {}).style,\n border: '1px solid #000',\n },\n },\n ...(configToUse.hasPreview\n ? {\n actions: { onMouseEnter: (ev) => renderPopOver(ev, k), onMouseLeave: closePopOver },\n }\n : {}),\n })),\n ];\n\n return arr;\n }, [])}\n keypadMode=\"language\"\n onChange={handleChange}\n onDone={handleClose}\n />\n );\n\n ReactDOM.render(el, newEl, () => {\n const cursorItem = document.querySelector(`[data-key=\"${value.anchorKey}\"]`);\n\n if (cursorItem) {\n const bodyRect = document.body.getBoundingClientRect();\n const boundRect = cursorItem.getBoundingClientRect();\n\n document.body.appendChild(newEl);\n\n // when height of toolbar exceeds screen - can happen in scrollable contexts\n let additionalTopOffset = 0;\n if (boundRect.y < newEl.offsetHeight) {\n additionalTopOffset = newEl.offsetHeight - boundRect.y + 10;\n }\n\n newEl.style.maxWidth = '500px';\n newEl.style.position = 'absolute';\n newEl.style.top = `${boundRect.top + Math.abs(bodyRect.top) - newEl.offsetHeight - 10 + additionalTopOffset}px`;\n newEl.style.zIndex = 99999;\n\n const leftValue = `${boundRect.left + Math.abs(bodyRect.left) + cursorItem.offsetWidth + 10}px`;\n\n const rightValue = `${boundRect.x}px`;\n\n newEl.style.left = leftValue;\n\n const leftAlignedWidth = newEl.offsetWidth;\n\n newEl.style.left = 'unset';\n newEl.style.right = rightValue;\n\n const rightAlignedWidth = newEl.offsetWidth;\n\n newEl.style.left = 'unset';\n newEl.style.right = 'unset';\n\n if (leftAlignedWidth >= rightAlignedWidth) {\n newEl.style.left = leftValue;\n } else {\n newEl.style.right = rightValue;\n }\n\n document.body.addEventListener('click', listener);\n }\n });\n};\n\nconst CharacterIcon = ({ letter }) => (\n <div\n style={{\n fontSize: '24px',\n lineHeight: '24px',\n }}\n >\n {letter}\n </div>\n);\n\nCharacterIcon.propTypes = {\n letter: PropTypes.string,\n};\n\nexport default function CharactersPlugin(opts) {\n removeDialogs();\n\n return {\n name: 'characters',\n toolbar: {\n icon: <CharacterIcon letter={opts.characterIcon || characterIcons[opts.language] || 'ñ'} />,\n ariaLabel: `${opts.language} characters Toolbar`,\n onClick: (value, onChange, getFocusedValue) => {\n const editorDOM = document.querySelector(`[data-key=\"${value.document.key}\"]`);\n let valueToUse = value;\n\n const callback = (char, focus) => {\n if (getFocusedValue) {\n valueToUse = getFocusedValue() || valueToUse;\n }\n\n if (char) {\n const change = valueToUse.change().insertTextByKey(valueToUse.anchorKey, valueToUse.anchorOffset, char);\n\n valueToUse = change.value;\n log('[characters:insert]: ', value);\n onChange(change);\n }\n\n log('[characters:click]');\n\n if (focus) {\n if (editorDOM) {\n editorDOM.focus();\n }\n }\n };\n\n insertDialog({ editorDOM, value: valueToUse, callback, opts });\n },\n },\n\n pluginStyles: (node, parentNode, p) => {\n if (p) {\n return {\n position: 'absolute',\n top: 'initial',\n };\n }\n },\n };\n}\n"],"file":"index.js"}