@pie-lib/editable-html 11.4.0 → 11.6.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 (106) hide show
  1. package/CHANGELOG.md +24 -52
  2. package/package.json +8 -7
  3. package/src/editor.jsx +2 -2
  4. package/src/plugins/media/media-dialog.js +1 -1
  5. package/src/plugins/respArea/drag-in-the-blank/choice.jsx +1 -1
  6. package/src/plugins/toolbar/editor-and-toolbar.jsx +1 -1
  7. package/lib/block-tags.js +0 -25
  8. package/lib/block-tags.js.map +0 -1
  9. package/lib/constants.js +0 -16
  10. package/lib/constants.js.map +0 -1
  11. package/lib/editor.js +0 -1355
  12. package/lib/editor.js.map +0 -1
  13. package/lib/index.js +0 -269
  14. package/lib/index.js.map +0 -1
  15. package/lib/parse-html.js +0 -16
  16. package/lib/parse-html.js.map +0 -1
  17. package/lib/plugins/characters/custom-popper.js +0 -73
  18. package/lib/plugins/characters/custom-popper.js.map +0 -1
  19. package/lib/plugins/characters/index.js +0 -305
  20. package/lib/plugins/characters/index.js.map +0 -1
  21. package/lib/plugins/characters/utils.js +0 -381
  22. package/lib/plugins/characters/utils.js.map +0 -1
  23. package/lib/plugins/css/icons/index.js +0 -37
  24. package/lib/plugins/css/icons/index.js.map +0 -1
  25. package/lib/plugins/css/index.js +0 -397
  26. package/lib/plugins/css/index.js.map +0 -1
  27. package/lib/plugins/customPlugin/index.js +0 -114
  28. package/lib/plugins/customPlugin/index.js.map +0 -1
  29. package/lib/plugins/html/icons/index.js +0 -38
  30. package/lib/plugins/html/icons/index.js.map +0 -1
  31. package/lib/plugins/html/index.js +0 -80
  32. package/lib/plugins/html/index.js.map +0 -1
  33. package/lib/plugins/image/alt-dialog.js +0 -129
  34. package/lib/plugins/image/alt-dialog.js.map +0 -1
  35. package/lib/plugins/image/component.js +0 -419
  36. package/lib/plugins/image/component.js.map +0 -1
  37. package/lib/plugins/image/image-toolbar.js +0 -177
  38. package/lib/plugins/image/image-toolbar.js.map +0 -1
  39. package/lib/plugins/image/index.js +0 -263
  40. package/lib/plugins/image/index.js.map +0 -1
  41. package/lib/plugins/image/insert-image-handler.js +0 -161
  42. package/lib/plugins/image/insert-image-handler.js.map +0 -1
  43. package/lib/plugins/index.js +0 -402
  44. package/lib/plugins/index.js.map +0 -1
  45. package/lib/plugins/list/index.js +0 -334
  46. package/lib/plugins/list/index.js.map +0 -1
  47. package/lib/plugins/math/index.js +0 -454
  48. package/lib/plugins/math/index.js.map +0 -1
  49. package/lib/plugins/media/index.js +0 -387
  50. package/lib/plugins/media/index.js.map +0 -1
  51. package/lib/plugins/media/media-dialog.js +0 -709
  52. package/lib/plugins/media/media-dialog.js.map +0 -1
  53. package/lib/plugins/media/media-toolbar.js +0 -101
  54. package/lib/plugins/media/media-toolbar.js.map +0 -1
  55. package/lib/plugins/media/media-wrapper.js +0 -93
  56. package/lib/plugins/media/media-wrapper.js.map +0 -1
  57. package/lib/plugins/rendering/index.js +0 -46
  58. package/lib/plugins/rendering/index.js.map +0 -1
  59. package/lib/plugins/respArea/drag-in-the-blank/choice.js +0 -254
  60. package/lib/plugins/respArea/drag-in-the-blank/choice.js.map +0 -1
  61. package/lib/plugins/respArea/drag-in-the-blank/index.js +0 -97
  62. package/lib/plugins/respArea/drag-in-the-blank/index.js.map +0 -1
  63. package/lib/plugins/respArea/explicit-constructed-response/index.js +0 -57
  64. package/lib/plugins/respArea/explicit-constructed-response/index.js.map +0 -1
  65. package/lib/plugins/respArea/icons/index.js +0 -95
  66. package/lib/plugins/respArea/icons/index.js.map +0 -1
  67. package/lib/plugins/respArea/index.js +0 -341
  68. package/lib/plugins/respArea/index.js.map +0 -1
  69. package/lib/plugins/respArea/inline-dropdown/index.js +0 -75
  70. package/lib/plugins/respArea/inline-dropdown/index.js.map +0 -1
  71. package/lib/plugins/respArea/math-templated/index.js +0 -130
  72. package/lib/plugins/respArea/math-templated/index.js.map +0 -1
  73. package/lib/plugins/respArea/utils.js +0 -125
  74. package/lib/plugins/respArea/utils.js.map +0 -1
  75. package/lib/plugins/table/CustomTablePlugin.js +0 -133
  76. package/lib/plugins/table/CustomTablePlugin.js.map +0 -1
  77. package/lib/plugins/table/icons/index.js +0 -69
  78. package/lib/plugins/table/icons/index.js.map +0 -1
  79. package/lib/plugins/table/index.js +0 -483
  80. package/lib/plugins/table/index.js.map +0 -1
  81. package/lib/plugins/table/table-toolbar.js +0 -187
  82. package/lib/plugins/table/table-toolbar.js.map +0 -1
  83. package/lib/plugins/textAlign/icons/index.js +0 -226
  84. package/lib/plugins/textAlign/icons/index.js.map +0 -1
  85. package/lib/plugins/textAlign/index.js +0 -34
  86. package/lib/plugins/textAlign/index.js.map +0 -1
  87. package/lib/plugins/toolbar/default-toolbar.js +0 -229
  88. package/lib/plugins/toolbar/default-toolbar.js.map +0 -1
  89. package/lib/plugins/toolbar/done-button.js +0 -53
  90. package/lib/plugins/toolbar/done-button.js.map +0 -1
  91. package/lib/plugins/toolbar/editor-and-toolbar.js +0 -286
  92. package/lib/plugins/toolbar/editor-and-toolbar.js.map +0 -1
  93. package/lib/plugins/toolbar/index.js +0 -34
  94. package/lib/plugins/toolbar/index.js.map +0 -1
  95. package/lib/plugins/toolbar/toolbar-buttons.js +0 -194
  96. package/lib/plugins/toolbar/toolbar-buttons.js.map +0 -1
  97. package/lib/plugins/toolbar/toolbar.js +0 -376
  98. package/lib/plugins/toolbar/toolbar.js.map +0 -1
  99. package/lib/plugins/utils.js +0 -62
  100. package/lib/plugins/utils.js.map +0 -1
  101. package/lib/serialization.js +0 -677
  102. package/lib/serialization.js.map +0 -1
  103. package/lib/shared/alert-dialog.js +0 -75
  104. package/lib/shared/index.js +0 -136
  105. package/lib/theme.js +0 -9
  106. package/lib/theme.js.map +0 -1
@@ -1,305 +0,0 @@
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
@@ -1 +0,0 @@
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"}