@pie-lib/editable-html-tip-tap 0.1.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 (158) hide show
  1. package/dist/components/CharacterPicker.d.ts +31 -0
  2. package/dist/components/CharacterPicker.d.ts.map +1 -0
  3. package/dist/components/CharacterPicker.js +129 -0
  4. package/dist/components/EditableHtml.d.ts +11 -0
  5. package/dist/components/EditableHtml.d.ts.map +1 -0
  6. package/dist/components/EditableHtml.js +270 -0
  7. package/dist/components/MenuBar.d.ts +11 -0
  8. package/dist/components/MenuBar.d.ts.map +1 -0
  9. package/dist/components/MenuBar.js +460 -0
  10. package/dist/components/TiptapContainer.d.ts +11 -0
  11. package/dist/components/TiptapContainer.d.ts.map +1 -0
  12. package/dist/components/TiptapContainer.js +157 -0
  13. package/dist/components/characters/characterUtils.d.ts +36 -0
  14. package/dist/components/characters/characterUtils.d.ts.map +1 -0
  15. package/dist/components/characters/characterUtils.js +465 -0
  16. package/dist/components/characters/custom-popper.d.ts +14 -0
  17. package/dist/components/characters/custom-popper.d.ts.map +1 -0
  18. package/dist/components/characters/custom-popper.js +32 -0
  19. package/dist/components/common/done-button.d.ts +30 -0
  20. package/dist/components/common/done-button.d.ts.map +1 -0
  21. package/dist/components/common/done-button.js +26 -0
  22. package/dist/components/common/toolbar-buttons.d.ts +39 -0
  23. package/dist/components/common/toolbar-buttons.d.ts.map +1 -0
  24. package/dist/components/common/toolbar-buttons.js +91 -0
  25. package/dist/components/icons/CssIcon.d.ts +11 -0
  26. package/dist/components/icons/CssIcon.d.ts.map +1 -0
  27. package/dist/components/icons/CssIcon.js +14 -0
  28. package/dist/components/icons/RespArea.d.ts +26 -0
  29. package/dist/components/icons/RespArea.d.ts.map +1 -0
  30. package/dist/components/icons/RespArea.js +42 -0
  31. package/dist/components/icons/TableIcons.d.ts +14 -0
  32. package/dist/components/icons/TableIcons.d.ts.map +1 -0
  33. package/dist/components/icons/TableIcons.js +32 -0
  34. package/dist/components/icons/TextAlign.d.ts +18 -0
  35. package/dist/components/icons/TextAlign.d.ts.map +1 -0
  36. package/dist/components/icons/TextAlign.js +134 -0
  37. package/dist/components/image/AltDialog.d.ts +23 -0
  38. package/dist/components/image/AltDialog.d.ts.map +1 -0
  39. package/dist/components/image/AltDialog.js +61 -0
  40. package/dist/components/image/ImageToolbar.d.ts +25 -0
  41. package/dist/components/image/ImageToolbar.d.ts.map +1 -0
  42. package/dist/components/image/ImageToolbar.js +80 -0
  43. package/dist/components/image/InsertImageHandler.d.ts +33 -0
  44. package/dist/components/image/InsertImageHandler.d.ts.map +1 -0
  45. package/dist/components/image/InsertImageHandler.js +55 -0
  46. package/dist/components/media/MediaDialog.d.ts +44 -0
  47. package/dist/components/media/MediaDialog.d.ts.map +1 -0
  48. package/dist/components/media/MediaDialog.js +389 -0
  49. package/dist/components/media/MediaToolbar.d.ts +20 -0
  50. package/dist/components/media/MediaToolbar.d.ts.map +1 -0
  51. package/dist/components/media/MediaToolbar.js +41 -0
  52. package/dist/components/media/MediaWrapper.d.ts +20 -0
  53. package/dist/components/media/MediaWrapper.d.ts.map +1 -0
  54. package/dist/components/respArea/DragInTheBlank/DragInTheBlank.d.ts +23 -0
  55. package/dist/components/respArea/DragInTheBlank/DragInTheBlank.d.ts.map +1 -0
  56. package/dist/components/respArea/DragInTheBlank/DragInTheBlank.js +58 -0
  57. package/dist/components/respArea/DragInTheBlank/choice.d.ts +56 -0
  58. package/dist/components/respArea/DragInTheBlank/choice.d.ts.map +1 -0
  59. package/dist/components/respArea/DragInTheBlank/choice.js +156 -0
  60. package/dist/components/respArea/ExplicitConstructedResponse.d.ts +20 -0
  61. package/dist/components/respArea/ExplicitConstructedResponse.d.ts.map +1 -0
  62. package/dist/components/respArea/ExplicitConstructedResponse.js +67 -0
  63. package/dist/components/respArea/InlineDropdown.d.ts +18 -0
  64. package/dist/components/respArea/InlineDropdown.d.ts.map +1 -0
  65. package/dist/components/respArea/InlineDropdown.js +91 -0
  66. package/dist/components/respArea/MathTemplated.d.ts +19 -0
  67. package/dist/components/respArea/MathTemplated.d.ts.map +1 -0
  68. package/dist/components/respArea/MathTemplated.js +97 -0
  69. package/dist/components/respArea/ToolbarIcon.d.ts +14 -0
  70. package/dist/components/respArea/ToolbarIcon.d.ts.map +1 -0
  71. package/dist/components/respArea/ToolbarIcon.js +17 -0
  72. package/dist/constants.d.ts +14 -0
  73. package/dist/constants.d.ts.map +1 -0
  74. package/dist/constants.js +4 -0
  75. package/dist/extensions/css.d.ts +12 -0
  76. package/dist/extensions/css.d.ts.map +1 -0
  77. package/dist/extensions/css.js +115 -0
  78. package/dist/extensions/custom-toolbar-wrapper.d.ts +11 -0
  79. package/dist/extensions/custom-toolbar-wrapper.d.ts.map +1 -0
  80. package/dist/extensions/custom-toolbar-wrapper.js +58 -0
  81. package/dist/extensions/div-node.d.ts +11 -0
  82. package/dist/extensions/div-node.d.ts.map +1 -0
  83. package/dist/extensions/div-node.js +25 -0
  84. package/dist/extensions/extended-table.d.ts +11 -0
  85. package/dist/extensions/extended-table.d.ts.map +1 -0
  86. package/dist/extensions/extended-table.js +15 -0
  87. package/dist/extensions/image-component.d.ts +22 -0
  88. package/dist/extensions/image-component.d.ts.map +1 -0
  89. package/dist/extensions/image-component.js +200 -0
  90. package/dist/extensions/image.d.ts +11 -0
  91. package/dist/extensions/image.d.ts.map +1 -0
  92. package/dist/extensions/image.js +42 -0
  93. package/dist/extensions/index.d.ts +17 -0
  94. package/dist/extensions/index.d.ts.map +1 -0
  95. package/dist/extensions/index.js +65 -0
  96. package/dist/extensions/math.d.ts +15 -0
  97. package/dist/extensions/math.d.ts.map +1 -0
  98. package/dist/extensions/math.js +150 -0
  99. package/dist/extensions/media.d.ts +19 -0
  100. package/dist/extensions/media.d.ts.map +1 -0
  101. package/dist/extensions/media.js +147 -0
  102. package/dist/extensions/responseArea.d.ts +28 -0
  103. package/dist/extensions/responseArea.d.ts.map +1 -0
  104. package/dist/extensions/responseArea.js +259 -0
  105. package/dist/index.d.ts +13 -0
  106. package/dist/index.d.ts.map +1 -0
  107. package/dist/index.js +6 -0
  108. package/dist/styles/editorContainerStyles.d.ts +135 -0
  109. package/dist/styles/editorContainerStyles.d.ts.map +1 -0
  110. package/dist/theme.d.ts +10 -0
  111. package/dist/theme.d.ts.map +1 -0
  112. package/dist/utils/helper.d.ts +10 -0
  113. package/dist/utils/helper.d.ts.map +1 -0
  114. package/dist/utils/helper.js +7 -0
  115. package/dist/utils/size.d.ts +10 -0
  116. package/dist/utils/size.d.ts.map +1 -0
  117. package/dist/utils/size.js +14 -0
  118. package/package.json +71 -0
  119. package/src/components/CharacterPicker.tsx +210 -0
  120. package/src/components/EditableHtml.tsx +416 -0
  121. package/src/components/MenuBar.tsx +558 -0
  122. package/src/components/TiptapContainer.tsx +228 -0
  123. package/src/components/characters/characterUtils.ts +457 -0
  124. package/src/components/characters/custom-popper.tsx +48 -0
  125. package/src/components/common/done-button.tsx +37 -0
  126. package/src/components/common/toolbar-buttons.tsx +132 -0
  127. package/src/components/icons/CssIcon.tsx +25 -0
  128. package/src/components/icons/RespArea.tsx +81 -0
  129. package/src/components/icons/TableIcons.tsx +62 -0
  130. package/src/components/icons/TextAlign.tsx +124 -0
  131. package/src/components/image/AltDialog.tsx +92 -0
  132. package/src/components/image/ImageToolbar.tsx +109 -0
  133. package/src/components/image/InsertImageHandler.ts +121 -0
  134. package/src/components/media/MediaDialog.tsx +606 -0
  135. package/src/components/media/MediaToolbar.tsx +59 -0
  136. package/src/components/media/MediaWrapper.tsx +49 -0
  137. package/src/components/respArea/DragInTheBlank/DragInTheBlank.tsx +86 -0
  138. package/src/components/respArea/DragInTheBlank/choice.tsx +266 -0
  139. package/src/components/respArea/ExplicitConstructedResponse.tsx +122 -0
  140. package/src/components/respArea/InlineDropdown.tsx +152 -0
  141. package/src/components/respArea/MathTemplated.tsx +134 -0
  142. package/src/components/respArea/ToolbarIcon.tsx +76 -0
  143. package/src/constants.ts +15 -0
  144. package/src/extensions/css.tsx +230 -0
  145. package/src/extensions/custom-toolbar-wrapper.tsx +88 -0
  146. package/src/extensions/div-node.tsx +46 -0
  147. package/src/extensions/extended-table.ts +34 -0
  148. package/src/extensions/image-component.tsx +303 -0
  149. package/src/extensions/image.tsx +64 -0
  150. package/src/extensions/index.tsx +91 -0
  151. package/src/extensions/math.tsx +285 -0
  152. package/src/extensions/media.tsx +198 -0
  153. package/src/extensions/responseArea.tsx +404 -0
  154. package/src/index.tsx +15 -0
  155. package/src/styles/editorContainerStyles.ts +155 -0
  156. package/src/theme.ts +11 -0
  157. package/src/utils/helper.tsx +27 -0
  158. package/src/utils/size.ts +42 -0
@@ -0,0 +1,416 @@
1
+ // @ts-nocheck
2
+ /**
3
+ * @synced-from pie-lib/packages/editable-html-tip-tap/src/components/EditableHtml.jsx
4
+ * @auto-generated
5
+ *
6
+ * This file is automatically synced from pie-elements and converted to TypeScript.
7
+ * Manual edits will be overwritten on next sync.
8
+ * To make changes, edit the upstream JavaScript file and run sync again.
9
+ */
10
+
11
+ import React, { useEffect, useMemo, useState } from 'react';
12
+ import debounce from 'lodash-es/debounce.js';
13
+ import { EditorContent, useEditor, useEditorState } from '@tiptap/react';
14
+ import { styled } from '@mui/material/styles';
15
+ import StarterKit from '@tiptap/starter-kit';
16
+ import { TextStyleKit } from '@tiptap/extension-text-style';
17
+ import { CharacterCount } from '@tiptap/extension-character-count';
18
+ import SuperScript from '@tiptap/extension-superscript';
19
+ import SubScript from '@tiptap/extension-subscript';
20
+ import TextAlign from '@tiptap/extension-text-align';
21
+ import Image from '@tiptap/extension-image';
22
+ import Placeholder from '@tiptap/extension-placeholder';
23
+ import { normalizeInitialMarkup } from '../utils/helper.js';
24
+
25
+ import ExtendedTable from '../extensions/extended-table.js';
26
+ import { DivNode } from '../extensions/div-node.js';
27
+ import { TableRow } from '@tiptap/extension-table-row';
28
+ import { TableCell } from '@tiptap/extension-table-cell';
29
+ import { TableHeader } from '@tiptap/extension-table-header';
30
+ import {
31
+ DragInTheBlankNode,
32
+ ExplicitConstructedResponseNode,
33
+ InlineDropdownNode,
34
+ MathTemplatedNode,
35
+ ResponseAreaExtension,
36
+ } from '../extensions/responseArea.js';
37
+ import { MathNode } from '../extensions/math.js';
38
+ import { ImageUploadNode } from '../extensions/image.js';
39
+ import { Media } from '../extensions/media.js';
40
+ import { CSSMark } from '../extensions/css.js';
41
+
42
+ import EditorContainer from './TiptapContainer.js';
43
+ import { valueToSize } from '../utils/size.js';
44
+ import { buildExtensions, PLUGINS_MAP } from '../extensions/index.js';
45
+
46
+ const defaultToolbarOpts = {
47
+ position: 'bottom',
48
+ alignment: 'left',
49
+ alwaysVisible: false,
50
+ showDone: true,
51
+ doneOn: 'blur',
52
+ };
53
+
54
+ const defaultResponseAreaProps = {
55
+ options: {},
56
+ respAreaToolbar: () => {},
57
+ onHandleAreaChange: () => {},
58
+ };
59
+
60
+ const DEFAULT_ACTIVE_PLUGINS = [
61
+ 'bold',
62
+ 'italic',
63
+ 'underline',
64
+ 'strikethrough',
65
+ 'code',
66
+ 'bulleted-list',
67
+ 'numbered-list',
68
+ 'image',
69
+ 'math',
70
+ 'languageCharacters',
71
+ 'text-align',
72
+ 'table',
73
+ 'video',
74
+ 'audio',
75
+ 'responseArea',
76
+ 'superscript',
77
+ 'subscript',
78
+ 'css',
79
+ 'h3',
80
+ 'undo',
81
+ 'redo',
82
+ ];
83
+
84
+ const cssVariables = {
85
+ '--white': '#fff',
86
+ '--black': '#2e2b29',
87
+ '--black-contrast': '#110f0e',
88
+ '--gray-1': 'rgba(61, 37, 20, .05)',
89
+ '--gray-2': 'rgba(61, 37, 20, .08)',
90
+ '--gray-3': 'rgba(61, 37, 20, .12)',
91
+ '--gray-4': 'rgba(53, 38, 28, .3)',
92
+ '--gray-5': 'rgba(28, 25, 23, .6)',
93
+ '--green': '#22c55e',
94
+ '--purple': '#6a00f5',
95
+ '--purple-contrast': '#5800cc',
96
+ '--purple-light': 'rgba(88, 5, 255, .05)',
97
+ '--yellow-contrast': '#facc15',
98
+ '--yellow': 'rgba(250, 204, 21, .4)',
99
+ '--yellow-light': '#fffae5',
100
+ '--red': '#ff5c33',
101
+ '--red-light': '#ffebe5',
102
+ '--shadow': `0px 12px 33px 0px rgba(0, 0, 0, .06),
103
+ 0px 3.618px 9.949px 0px rgba(0, 0, 0, .04)`,
104
+ };
105
+
106
+ export const EditableHtml = (props) => {
107
+ const { showParagraphs, separateParagraphs } = props.pluginProps || {};
108
+ const [pendingImages, setPendingImages] = useState([]);
109
+ const [scheduled, setScheduled] = useState(false);
110
+ const { toolbarOpts } = props;
111
+
112
+ const toolbarOptsToUse = {
113
+ ...defaultToolbarOpts,
114
+ ...toolbarOpts,
115
+ };
116
+
117
+ const activePluginsToUse = useMemo(() => {
118
+ let { customPlugins, ...otherPluginProps } = props.pluginProps || {};
119
+
120
+ customPlugins = customPlugins || [];
121
+
122
+ const filteredActivePlugins = (props.activePlugins || DEFAULT_ACTIVE_PLUGINS)?.filter((pluginName) => {
123
+ const nameToUse = PLUGINS_MAP[pluginName] || pluginName;
124
+ const pluginInfo = otherPluginProps[nameToUse] || {};
125
+
126
+ return !pluginInfo || !pluginInfo.disabled;
127
+ });
128
+
129
+ return buildExtensions(filteredActivePlugins, customPlugins, {
130
+ math: {},
131
+ textAlign: props.textAlign,
132
+ html: {},
133
+ extraCSSRules: props.extraCSSRules || {},
134
+ image: {
135
+ ...props.imageSupport,
136
+ },
137
+ toolbar: {},
138
+ table: {},
139
+ responseArea: {
140
+ type: props.responseAreaProps?.type,
141
+ },
142
+ languageCharacters: props.languageCharactersProps,
143
+ keyPadCharacterRef: {},
144
+ setKeypadInteraction: {},
145
+ media: {},
146
+ });
147
+ }, [props]);
148
+
149
+ const extensions = [
150
+ TextAlign.configure({
151
+ types: ['heading', 'paragraph', 'div', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'td', 'th'],
152
+ alignments: ['left', 'right', 'center', 'justify'],
153
+ }),
154
+ TextStyleKit,
155
+ CharacterCount.configure({
156
+ limit: props.charactersLimit || 1000000,
157
+ }),
158
+ StarterKit.configure({
159
+ trailingNode: {
160
+ node: 'paragraph',
161
+ notAfter: ['paragraph', 'div'],
162
+ },
163
+ }),
164
+ DivNode,
165
+ Placeholder.configure({
166
+ placeholder: props.placeholder,
167
+ // show placeholder even when editor is focused
168
+ showOnlyWhenEditable: true,
169
+ showOnlyCurrent: false, // show on all empty nodes, not only the current one
170
+ includeChildren: true,
171
+ }),
172
+ ExtendedTable,
173
+ TableRow,
174
+ TableHeader,
175
+ TableCell,
176
+ ResponseAreaExtension.configure(props.responseAreaProps),
177
+ ExplicitConstructedResponseNode.configure(props.responseAreaProps),
178
+ DragInTheBlankNode.configure(props.responseAreaProps),
179
+ InlineDropdownNode.configure(props.responseAreaProps),
180
+ MathTemplatedNode.configure(props.responseAreaProps),
181
+ MathNode.configure({
182
+ toolbarOpts: toolbarOptsToUse,
183
+ }),
184
+ SubScript,
185
+ SuperScript,
186
+ Image,
187
+ ImageUploadNode.configure({
188
+ toolbarOpts: toolbarOptsToUse,
189
+ imageHandling: {
190
+ disableImageAlignmentButtons: props.disableImageAlignmentButtons,
191
+ onDone: () => props.onDone?.(editor.getHTML()),
192
+ onDelete:
193
+ props.imageSupport &&
194
+ props.imageSupport.delete &&
195
+ ((node) => {
196
+ const { src } = node.attrs;
197
+
198
+ props.imageSupport.delete(src, (e) => {
199
+ const newPendingImages = pendingImages.filter((img) => img.key !== node.key);
200
+ const newState = {
201
+ pendingImages: newPendingImages,
202
+ scheduled: scheduled && newPendingImages.length === 0 ? false : scheduled,
203
+ };
204
+
205
+ setPendingImages(newState.pendingImages);
206
+ setScheduled(newState.scheduled);
207
+ });
208
+ }),
209
+ insertImageRequested:
210
+ props.imageSupport &&
211
+ ((addedImage, getHandler) => {
212
+ const onFinish = (result) => {
213
+ let cb;
214
+
215
+ if (scheduled && result) {
216
+ // finish editing only on success
217
+ cb = props.onChange;
218
+ }
219
+
220
+ const newPendingImages = pendingImages.filter((img) => img.key !== addedImage.key);
221
+ const newState = {
222
+ pendingImages: newPendingImages,
223
+ };
224
+
225
+ if (newPendingImages.length === 0) {
226
+ newState.scheduled = false;
227
+ }
228
+
229
+ setPendingImages(newState.pendingImages);
230
+ setScheduled(newState.scheduled);
231
+ cb?.(editor.getHTML());
232
+ };
233
+ const callback = () => {
234
+ /**
235
+ * The handler is the object through which the outer context
236
+ * communicates file upload events like: fileChosen, cancel, progress
237
+ */
238
+ const handler = getHandler(onFinish);
239
+ props.imageSupport.add(handler);
240
+ };
241
+
242
+ setPendingImages([...pendingImages, addedImage]);
243
+ callback();
244
+ }),
245
+ maxImageWidth: props.maxImageWidth,
246
+ maxImageHeight: props.maxImageHeight,
247
+ },
248
+ limit: 3,
249
+ }),
250
+ Media.configure({
251
+ uploadSoundSupport: props.uploadSoundSupport,
252
+ }),
253
+ CSSMark.configure({
254
+ extraCSSRules: props.extraCSSRules,
255
+ }),
256
+ ];
257
+
258
+ const editor = useEditor(
259
+ {
260
+ extensions,
261
+ immediatelyRender: false,
262
+ editorProps: {
263
+ handleKeyDown(view, event) {
264
+ if (props.onKeyDown) {
265
+ return props.onKeyDown(event);
266
+ }
267
+
268
+ // Return false to let default behavior continue
269
+ return false;
270
+ },
271
+ },
272
+ editable: !props.disabled,
273
+ content: normalizeInitialMarkup(props.markup),
274
+ onUpdate: ({ editor, transaction }) => {
275
+ if (transaction.isDone) {
276
+ props.onChange?.(editor.getHTML());
277
+ }
278
+ },
279
+ onBlur: debounce(({ editor }) => {
280
+ const otherToolbarOpened =
281
+ editor._toolbarOpened ||
282
+ editor.isActive('inline_dropdown') ||
283
+ editor.isActive('explicit_constructed_response');
284
+
285
+ if (otherToolbarOpened) {
286
+ return;
287
+ }
288
+
289
+ if (props.markup !== editor.getHTML()) {
290
+ props.onChange?.(editor.getHTML());
291
+ }
292
+
293
+ if (toolbarOptsToUse.doneOn === 'blur') {
294
+ props.onDone?.(editor.getHTML());
295
+ }
296
+ }, 200),
297
+ },
298
+ [props.charactersLimit],
299
+ );
300
+
301
+ useEffect(() => {
302
+ if (props.editorRef) {
303
+ props.editorRef(editor);
304
+ }
305
+ }, [props.editorRef, editor]);
306
+
307
+ useEffect(() => {
308
+ editor?.setEditable(!props.disabled);
309
+ }, [props.disabled, editor]);
310
+
311
+ useEffect(() => {
312
+ if (!editor) {
313
+ return;
314
+ }
315
+ const nextMarkup = normalizeInitialMarkup(props.markup);
316
+
317
+ if (nextMarkup !== editor.getHTML()) {
318
+ editor.commands.setContent(nextMarkup, false);
319
+ }
320
+ }, [props.markup, editor]);
321
+
322
+ useEffect(() => {
323
+ Object.entries(cssVariables).forEach(([key, value]) => {
324
+ document.documentElement.style.setProperty(key, value);
325
+ });
326
+ }, []);
327
+
328
+ const editorState = useEditorState({
329
+ editor,
330
+ selector: (ctx) => ({
331
+ isFocused: ctx.editor?.isFocused,
332
+ }),
333
+ });
334
+
335
+ const sizeStyle = useMemo(() => {
336
+ const { minWidth, width, maxWidth, minHeight, height, maxHeight } = props;
337
+
338
+ return {
339
+ width: valueToSize(width),
340
+ minWidth: valueToSize(minWidth),
341
+ maxWidth: valueToSize(maxWidth),
342
+ height: valueToSize(height),
343
+ minHeight: valueToSize(minHeight),
344
+ maxHeight: valueToSize(maxHeight),
345
+ };
346
+ }, [props]);
347
+
348
+ return (
349
+ <EditorContainer
350
+ {...{
351
+ ...props,
352
+ activePlugins: activePluginsToUse,
353
+ toolbarOpts: toolbarOptsToUse,
354
+ }}
355
+ editorState={editorState}
356
+ editor={editor}
357
+ >
358
+ {editor && (
359
+ <StyledEditorContent
360
+ style={{
361
+ minHeight: sizeStyle.minHeight,
362
+ height: sizeStyle.height,
363
+ maxHeight: sizeStyle.maxHeight,
364
+ }}
365
+ showParagraph={showParagraphs && !showParagraphs.disabled}
366
+ separateParagraph={separateParagraphs && !separateParagraphs.disabled}
367
+ editor={editor}
368
+ />
369
+ )}
370
+ </EditorContainer>
371
+ );
372
+ };
373
+
374
+ const StyledEditorContent: any = styled(EditorContent, {
375
+ shouldForwardProp: (prop) => !['showParagraph', 'separateParagraph'].includes(prop),
376
+ })(({ showParagraph, separateParagraph }) => ({
377
+ display: 'flex',
378
+ outline: 'none !important',
379
+ '& .ProseMirror': {
380
+ flex: 1,
381
+ padding: '5px',
382
+ maxHeight: '500px',
383
+ outline: 'none !important',
384
+ position: 'initial',
385
+
386
+ // reset default margins for all block paragraphs/divs in the editor
387
+ '& > p, & > div': {
388
+ margin: '0',
389
+ },
390
+
391
+ '& p.is-editor-empty:first-child::before, & div.is-editor-empty:first-child::before': {
392
+ content: 'attr(data-placeholder)',
393
+ float: 'left',
394
+ height: 0,
395
+ color: '#9CA3AF',
396
+ pointerEvents: 'none',
397
+ whiteSpace: 'pre-wrap',
398
+ },
399
+
400
+ ...(showParagraph && {
401
+ '& > p:has(+ p)::after, & > div:has(+ div)::after': {
402
+ display: 'block',
403
+ content: '"¶"',
404
+ fontSize: '1em',
405
+ color: '#146EB3',
406
+ },
407
+ }),
408
+ ...(separateParagraph && {
409
+ '& > div:has(+ div)': {
410
+ marginBottom: '1em',
411
+ },
412
+ }),
413
+ },
414
+ }));
415
+
416
+ export default EditableHtml;