@pega/cosmos-react-rte 5.0.0-dev.4.9 → 5.0.0-dev.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 (193) hide show
  1. package/lib/components/DynamicContentEditor/DynamicContentEditor.d.ts +12 -0
  2. package/lib/components/DynamicContentEditor/DynamicContentEditor.d.ts.map +1 -0
  3. package/lib/components/DynamicContentEditor/DynamicContentEditor.js +252 -0
  4. package/lib/components/DynamicContentEditor/DynamicContentEditor.js.map +1 -0
  5. package/lib/components/DynamicContentEditor/DynamicContentEditor.test-ids.d.ts +2 -0
  6. package/lib/components/DynamicContentEditor/DynamicContentEditor.test-ids.d.ts.map +1 -0
  7. package/lib/components/DynamicContentEditor/DynamicContentEditor.test-ids.js +8 -0
  8. package/lib/components/DynamicContentEditor/DynamicContentEditor.test-ids.js.map +1 -0
  9. package/lib/components/DynamicContentEditor/DynamicContentEditor.types.d.ts +35 -0
  10. package/lib/components/DynamicContentEditor/DynamicContentEditor.types.d.ts.map +1 -0
  11. package/lib/components/DynamicContentEditor/DynamicContentEditor.types.js +3 -0
  12. package/lib/components/DynamicContentEditor/DynamicContentEditor.types.js.map +1 -0
  13. package/lib/components/DynamicContentEditor/PegaCustomElement.d.ts +329 -0
  14. package/lib/components/DynamicContentEditor/PegaCustomElement.d.ts.map +1 -0
  15. package/lib/components/DynamicContentEditor/PegaCustomElement.js +27 -0
  16. package/lib/components/DynamicContentEditor/PegaCustomElement.js.map +1 -0
  17. package/lib/components/DynamicContentEditor/index.d.ts +3 -0
  18. package/lib/components/DynamicContentEditor/index.d.ts.map +1 -0
  19. package/lib/components/DynamicContentEditor/index.js +2 -0
  20. package/lib/components/DynamicContentEditor/index.js.map +1 -0
  21. package/lib/components/Editor/Editor.context.d.ts +10 -0
  22. package/lib/components/Editor/Editor.context.d.ts.map +1 -0
  23. package/lib/components/Editor/Editor.context.js +10 -0
  24. package/lib/components/Editor/Editor.context.js.map +1 -0
  25. package/lib/components/Editor/Editor.d.ts +19 -0
  26. package/lib/components/Editor/Editor.d.ts.map +1 -0
  27. package/lib/components/Editor/Editor.js +366 -0
  28. package/lib/components/Editor/Editor.js.map +1 -0
  29. package/lib/components/Editor/Editor.styles.d.ts +5 -0
  30. package/lib/components/Editor/Editor.styles.d.ts.map +1 -0
  31. package/lib/components/Editor/Editor.styles.js +50 -0
  32. package/lib/components/Editor/Editor.styles.js.map +1 -0
  33. package/lib/components/Editor/Editor.test-ids.d.ts +2 -0
  34. package/lib/components/Editor/Editor.test-ids.d.ts.map +1 -0
  35. package/lib/components/Editor/Editor.test-ids.js +8 -0
  36. package/lib/components/Editor/Editor.test-ids.js.map +1 -0
  37. package/lib/components/Editor/Editor.types.d.ts +69 -0
  38. package/lib/components/Editor/Editor.types.d.ts.map +1 -0
  39. package/lib/components/Editor/Editor.types.js +2 -0
  40. package/lib/components/Editor/Editor.types.js.map +1 -0
  41. package/lib/components/Editor/ImageEditor.d.ts +10 -0
  42. package/lib/components/Editor/ImageEditor.d.ts.map +1 -0
  43. package/lib/components/Editor/ImageEditor.js +276 -0
  44. package/lib/components/Editor/ImageEditor.js.map +1 -0
  45. package/lib/components/Editor/Toolbar/AnchorButton.d.ts +10 -0
  46. package/lib/components/Editor/Toolbar/AnchorButton.d.ts.map +1 -0
  47. package/lib/components/Editor/Toolbar/AnchorButton.js +161 -0
  48. package/lib/components/Editor/Toolbar/AnchorButton.js.map +1 -0
  49. package/lib/components/Editor/Toolbar/ImageButton.d.ts +8 -0
  50. package/lib/components/Editor/Toolbar/ImageButton.d.ts.map +1 -0
  51. package/lib/components/Editor/Toolbar/ImageButton.js +30 -0
  52. package/lib/components/Editor/Toolbar/ImageButton.js.map +1 -0
  53. package/lib/components/Editor/Toolbar/TextSelect.d.ts +14 -0
  54. package/lib/components/Editor/Toolbar/TextSelect.d.ts.map +1 -0
  55. package/lib/components/Editor/Toolbar/TextSelect.js +131 -0
  56. package/lib/components/Editor/Toolbar/TextSelect.js.map +1 -0
  57. package/lib/components/Editor/Toolbar/Toolbar.d.ts +17 -0
  58. package/lib/components/Editor/Toolbar/Toolbar.d.ts.map +1 -0
  59. package/lib/components/Editor/Toolbar/Toolbar.js +164 -0
  60. package/lib/components/Editor/Toolbar/Toolbar.js.map +1 -0
  61. package/lib/components/Editor/Toolbar/Toolbar.test-ids.d.ts +3 -0
  62. package/lib/components/Editor/Toolbar/Toolbar.test-ids.d.ts.map +1 -0
  63. package/lib/components/Editor/Toolbar/Toolbar.test-ids.js +16 -0
  64. package/lib/components/Editor/Toolbar/Toolbar.test-ids.js.map +1 -0
  65. package/lib/components/Editor/index.d.ts +4 -0
  66. package/lib/components/Editor/index.d.ts.map +1 -0
  67. package/lib/components/Editor/index.js +3 -0
  68. package/lib/components/Editor/index.js.map +1 -0
  69. package/lib/components/RichTextEditor/DecoratorComponents/CodeBlock.d.ts +4 -0
  70. package/lib/components/RichTextEditor/DecoratorComponents/CodeBlock.d.ts.map +1 -0
  71. package/lib/components/RichTextEditor/DecoratorComponents/CodeBlock.js +15 -0
  72. package/lib/components/RichTextEditor/DecoratorComponents/CodeBlock.js.map +1 -0
  73. package/lib/components/RichTextEditor/DecoratorComponents/Image.d.ts +4 -0
  74. package/lib/components/RichTextEditor/DecoratorComponents/Image.d.ts.map +1 -0
  75. package/lib/components/RichTextEditor/DecoratorComponents/Image.js +7 -0
  76. package/lib/components/RichTextEditor/DecoratorComponents/Image.js.map +1 -0
  77. package/lib/components/RichTextEditor/DecoratorComponents/Link.d.ts +4 -0
  78. package/lib/components/RichTextEditor/DecoratorComponents/Link.d.ts.map +1 -0
  79. package/lib/components/RichTextEditor/DecoratorComponents/Link.js +8 -0
  80. package/lib/components/RichTextEditor/DecoratorComponents/Link.js.map +1 -0
  81. package/lib/components/RichTextEditor/DecoratorComponents/Table.d.ts +6 -0
  82. package/lib/components/RichTextEditor/DecoratorComponents/Table.d.ts.map +1 -0
  83. package/lib/components/RichTextEditor/DecoratorComponents/Table.js +24 -0
  84. package/lib/components/RichTextEditor/DecoratorComponents/Table.js.map +1 -0
  85. package/lib/components/RichTextEditor/RichTextEditor.context.d.ts +15 -0
  86. package/lib/components/RichTextEditor/RichTextEditor.context.d.ts.map +1 -0
  87. package/lib/components/RichTextEditor/RichTextEditor.context.js +11 -0
  88. package/lib/components/RichTextEditor/RichTextEditor.context.js.map +1 -0
  89. package/lib/components/RichTextEditor/RichTextEditor.d.ts +6 -0
  90. package/lib/components/RichTextEditor/RichTextEditor.d.ts.map +1 -0
  91. package/lib/components/RichTextEditor/RichTextEditor.js +346 -0
  92. package/lib/components/RichTextEditor/RichTextEditor.js.map +1 -0
  93. package/lib/components/RichTextEditor/RichTextEditor.styles.d.ts +10 -0
  94. package/lib/components/RichTextEditor/RichTextEditor.styles.d.ts.map +1 -0
  95. package/lib/components/RichTextEditor/RichTextEditor.styles.js +73 -0
  96. package/lib/components/RichTextEditor/RichTextEditor.styles.js.map +1 -0
  97. package/lib/components/RichTextEditor/RichTextEditor.types.d.ts +72 -0
  98. package/lib/components/RichTextEditor/RichTextEditor.types.d.ts.map +1 -0
  99. package/lib/components/RichTextEditor/RichTextEditor.types.js +2 -0
  100. package/lib/components/RichTextEditor/RichTextEditor.types.js.map +1 -0
  101. package/lib/components/RichTextEditor/RichTextTreeRenderer.d.ts +9 -0
  102. package/lib/components/RichTextEditor/RichTextTreeRenderer.d.ts.map +1 -0
  103. package/lib/components/RichTextEditor/RichTextTreeRenderer.js +15 -0
  104. package/lib/components/RichTextEditor/RichTextTreeRenderer.js.map +1 -0
  105. package/lib/components/RichTextEditor/RichTextViewer.d.ts +7 -0
  106. package/lib/components/RichTextEditor/RichTextViewer.d.ts.map +1 -0
  107. package/lib/components/RichTextEditor/RichTextViewer.js +38 -0
  108. package/lib/components/RichTextEditor/RichTextViewer.js.map +1 -0
  109. package/lib/components/RichTextEditor/RichTextViewer.types.d.ts +33 -0
  110. package/lib/components/RichTextEditor/RichTextViewer.types.d.ts.map +1 -0
  111. package/lib/components/RichTextEditor/RichTextViewer.types.js +2 -0
  112. package/lib/components/RichTextEditor/RichTextViewer.types.js.map +1 -0
  113. package/lib/components/RichTextEditor/Toolbar/AnchorButton.d.ts +8 -0
  114. package/lib/components/RichTextEditor/Toolbar/AnchorButton.d.ts.map +1 -0
  115. package/lib/components/RichTextEditor/Toolbar/AnchorButton.js +156 -0
  116. package/lib/components/RichTextEditor/Toolbar/AnchorButton.js.map +1 -0
  117. package/lib/components/RichTextEditor/Toolbar/ImageButton.d.ts +5 -0
  118. package/lib/components/RichTextEditor/Toolbar/ImageButton.d.ts.map +1 -0
  119. package/lib/components/RichTextEditor/Toolbar/ImageButton.js +30 -0
  120. package/lib/components/RichTextEditor/Toolbar/ImageButton.js.map +1 -0
  121. package/lib/components/RichTextEditor/Toolbar/IndentButton.d.ts +8 -0
  122. package/lib/components/RichTextEditor/Toolbar/IndentButton.d.ts.map +1 -0
  123. package/lib/components/RichTextEditor/Toolbar/IndentButton.js +31 -0
  124. package/lib/components/RichTextEditor/Toolbar/IndentButton.js.map +1 -0
  125. package/lib/components/RichTextEditor/Toolbar/TableButton.d.ts +5 -0
  126. package/lib/components/RichTextEditor/Toolbar/TableButton.d.ts.map +1 -0
  127. package/lib/components/RichTextEditor/Toolbar/TableButton.js +20 -0
  128. package/lib/components/RichTextEditor/Toolbar/TableButton.js.map +1 -0
  129. package/lib/components/RichTextEditor/Toolbar/TextSelect.d.ts +6 -0
  130. package/lib/components/RichTextEditor/Toolbar/TextSelect.d.ts.map +1 -0
  131. package/lib/components/RichTextEditor/Toolbar/TextSelect.js +119 -0
  132. package/lib/components/RichTextEditor/Toolbar/TextSelect.js.map +1 -0
  133. package/lib/components/RichTextEditor/Toolbar/Toolbar.d.ts +10 -0
  134. package/lib/components/RichTextEditor/Toolbar/Toolbar.d.ts.map +1 -0
  135. package/lib/components/RichTextEditor/Toolbar/Toolbar.js +155 -0
  136. package/lib/components/RichTextEditor/Toolbar/Toolbar.js.map +1 -0
  137. package/lib/components/RichTextEditor/Toolbar/Toolbar.types.d.ts +9 -0
  138. package/lib/components/RichTextEditor/Toolbar/Toolbar.types.d.ts.map +1 -0
  139. package/lib/components/RichTextEditor/Toolbar/Toolbar.types.js +2 -0
  140. package/lib/components/RichTextEditor/Toolbar/Toolbar.types.js.map +1 -0
  141. package/lib/components/RichTextEditor/Toolbar/ToolbarButton.d.ts +14 -0
  142. package/lib/components/RichTextEditor/Toolbar/ToolbarButton.d.ts.map +1 -0
  143. package/lib/components/RichTextEditor/Toolbar/ToolbarButton.js +67 -0
  144. package/lib/components/RichTextEditor/Toolbar/ToolbarButton.js.map +1 -0
  145. package/lib/components/RichTextEditor/Toolbar/utils.d.ts +7 -0
  146. package/lib/components/RichTextEditor/Toolbar/utils.d.ts.map +1 -0
  147. package/lib/components/RichTextEditor/Toolbar/utils.js +13 -0
  148. package/lib/components/RichTextEditor/Toolbar/utils.js.map +1 -0
  149. package/lib/components/RichTextEditor/index.d.ts +9 -0
  150. package/lib/components/RichTextEditor/index.d.ts.map +1 -0
  151. package/lib/components/RichTextEditor/index.js +6 -0
  152. package/lib/components/RichTextEditor/index.js.map +1 -0
  153. package/lib/components/RichTextEditor/utils/EditorCommands.d.ts +35 -0
  154. package/lib/components/RichTextEditor/utils/EditorCommands.d.ts.map +1 -0
  155. package/lib/components/RichTextEditor/utils/EditorCommands.js +447 -0
  156. package/lib/components/RichTextEditor/utils/EditorCommands.js.map +1 -0
  157. package/lib/components/RichTextEditor/utils/ListCommands.d.ts +10 -0
  158. package/lib/components/RichTextEditor/utils/ListCommands.d.ts.map +1 -0
  159. package/lib/components/RichTextEditor/utils/ListCommands.js +346 -0
  160. package/lib/components/RichTextEditor/utils/ListCommands.js.map +1 -0
  161. package/lib/components/RichTextEditor/utils/htmlConverter.d.ts +29 -0
  162. package/lib/components/RichTextEditor/utils/htmlConverter.d.ts.map +1 -0
  163. package/lib/components/RichTextEditor/utils/htmlConverter.js +156 -0
  164. package/lib/components/RichTextEditor/utils/htmlConverter.js.map +1 -0
  165. package/lib/components/RichTextEditor/utils/interactionRenderer.d.ts +6 -0
  166. package/lib/components/RichTextEditor/utils/interactionRenderer.d.ts.map +1 -0
  167. package/lib/components/RichTextEditor/utils/interactionRenderer.js +132 -0
  168. package/lib/components/RichTextEditor/utils/interactionRenderer.js.map +1 -0
  169. package/lib/components/RichTextEditor/utils/markdownConverter.d.ts +6 -0
  170. package/lib/components/RichTextEditor/utils/markdownConverter.d.ts.map +1 -0
  171. package/lib/components/RichTextEditor/utils/markdownConverter.js +130 -0
  172. package/lib/components/RichTextEditor/utils/markdownConverter.js.map +1 -0
  173. package/lib/components/RichTextEditor/utils/renderers.d.ts +22 -0
  174. package/lib/components/RichTextEditor/utils/renderers.d.ts.map +1 -0
  175. package/lib/components/RichTextEditor/utils/renderers.js +163 -0
  176. package/lib/components/RichTextEditor/utils/renderers.js.map +1 -0
  177. package/lib/components/RichTextEditor/utils/search.d.ts +11 -0
  178. package/lib/components/RichTextEditor/utils/search.d.ts.map +1 -0
  179. package/lib/components/RichTextEditor/utils/search.js +37 -0
  180. package/lib/components/RichTextEditor/utils/search.js.map +1 -0
  181. package/lib/components/RichTextEditor/utils/slateConverter.d.ts +25 -0
  182. package/lib/components/RichTextEditor/utils/slateConverter.d.ts.map +1 -0
  183. package/lib/components/RichTextEditor/utils/slateConverter.js +88 -0
  184. package/lib/components/RichTextEditor/utils/slateConverter.js.map +1 -0
  185. package/lib/components/RichTextEditor/utils/utils.types.d.ts +3 -0
  186. package/lib/components/RichTextEditor/utils/utils.types.d.ts.map +1 -0
  187. package/lib/components/RichTextEditor/utils/utils.types.js +3 -0
  188. package/lib/components/RichTextEditor/utils/utils.types.js.map +1 -0
  189. package/lib/index.d.ts +5 -0
  190. package/lib/index.d.ts.map +1 -0
  191. package/lib/index.js +6 -0
  192. package/lib/index.js.map +1 -0
  193. package/package.json +2 -2
@@ -0,0 +1,366 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import tinymce from 'tinymce/tinymce';
3
+ import 'tinymce/icons/default';
4
+ import 'tinymce/themes/silver';
5
+ import 'tinymce/plugins/advlist';
6
+ import 'tinymce/plugins/lists';
7
+ import 'tinymce/plugins/autolink';
8
+ import 'tinymce/models/dom';
9
+ import { forwardRef, useEffect, useRef, useState, useLayoutEffect, useImperativeHandle, useCallback, useMemo } from 'react';
10
+ import styled, { css } from 'styled-components';
11
+ import { compile, serialize, stringify } from 'stylis';
12
+ import { stripUnit } from 'polished';
13
+ import { createUID, FormControl, FormField, useAfterInitialEffect, useTheme, useUID, useI18n, useConsolidatedRef, defaultThemeProp, useAutoResize, useConfiguration, useTestIds, withTestIds, documentIsAvailable, getActiveElement } from '@pega/cosmos-react-core';
14
+ import { getHtmlStyles } from '@pega/cosmos-react-core/lib/components/HTML/HTML';
15
+ import { createGlobalBodyStyles, createGlobalRootStyles, globalSpacingStyles } from '@pega/cosmos-react-core/lib/styles/GlobalStyle';
16
+ import StyledRichTextEditor from '../RichTextEditor/RichTextEditor.styles';
17
+ import Toolbar from './Toolbar/Toolbar';
18
+ import EditorContext from './Editor.context';
19
+ import { getTextFormats } from './Toolbar/TextSelect';
20
+ import ImageEditor, { imgHoverClass } from './ImageEditor';
21
+ import { offscreenSelectionStyles, placeholderStyles, mceContentBodyStyles, StyledEditorContainer } from './Editor.styles';
22
+ import { getEditorTestIds } from './Editor.test-ids';
23
+ const getFileFromUrl = async (url, name) => {
24
+ const response = await fetch(url);
25
+ const data = await response.blob();
26
+ return new File([data], name, {
27
+ type: data.type
28
+ });
29
+ };
30
+ export const getImageStyles = (theme) => {
31
+ return `
32
+ img:hover,
33
+ img.${imgHoverClass} {
34
+ box-shadow: 0 0 0 0.06125rem ${theme.base.palette['primary-background']},
35
+ 0 0 0 0.125rem ${theme.base.palette.interactive}, 0 0 0 0.25rem rgba(0, 118, 209, 0.3);
36
+ }
37
+ `;
38
+ };
39
+ export const StyledInnerEditor = styled.div(({ theme, showPlaceholder }) => {
40
+ return css `
41
+ ${showPlaceholder &&
42
+ css `
43
+ ::before {
44
+ color: ${theme.base.colors.slate.medium};
45
+ position: absolute;
46
+ content: attr(data-mce-placeholder);
47
+ }
48
+ `}
49
+ `;
50
+ });
51
+ StyledInnerEditor.defaultProps = defaultThemeProp;
52
+ const Editor = forwardRef(function Editor(props, ref) {
53
+ const { components: { 'text-area': { 'min-height': textAreaMinHeight } } } = useTheme();
54
+ const theme = useTheme();
55
+ const { styleSheetTarget } = useConfiguration();
56
+ const [editor, setEditor] = useState();
57
+ const [focused, setFocused] = useState(false);
58
+ const t = useI18n();
59
+ const uid = useUID();
60
+ const labelId = useUID();
61
+ const editorRef = useConsolidatedRef(ref);
62
+ const tinyMceRef = useRef(null);
63
+ const tinyMceContainerRef = useRef(null);
64
+ const initialized = useRef(false);
65
+ const { testId, id = uid, toolbar = [], label, labelHidden, info, status, required, disabled, readOnly, onChange, onKeyDown, onFocus, onBlur, onImageAdded, onInit, defaultValue, customComponents = [], height, customActions, placeholder, children, spellcheck = true, additionalInfo, ...restProps } = props;
66
+ const testIds = useTestIds(testId, getEditorTestIds);
67
+ const baseHeight = {
68
+ min: height?.min ?? stripUnit(textAreaMinHeight) * 16,
69
+ max: height?.max ?? undefined
70
+ };
71
+ const getHeight = (type) => {
72
+ if (typeof baseHeight === 'number') {
73
+ return stripUnit(baseHeight);
74
+ }
75
+ if (baseHeight[type]) {
76
+ return stripUnit(baseHeight[type]);
77
+ }
78
+ return undefined;
79
+ };
80
+ const imagesEnabled = toolbar.includes('images');
81
+ const maxHeight = getHeight('max');
82
+ const minHeight = getHeight('min');
83
+ const [autoResizeRef, resizeEditor] = useAutoResize(maxHeight, minHeight);
84
+ const formFieldRef = useRef(null);
85
+ const value = useRef(defaultValue);
86
+ const renderToolbar = editor && toolbar.length > 0 && !readOnly && !disabled;
87
+ const processPastedImgUrls = async (infoArr) => {
88
+ const files = await Promise.all(infoArr.map(({ id: imgId, url }) => getFileFromUrl(url, imgId)));
89
+ files.forEach((file, i) => {
90
+ onImageAdded?.(file, infoArr[i].id);
91
+ });
92
+ };
93
+ const pastePreprocess = (plugin, args) => {
94
+ const isImg = args.content.includes('<img');
95
+ if (!imagesEnabled && isImg) {
96
+ args.content = args.content.replace(/<img(.*)\/>/g, '');
97
+ }
98
+ if (imagesEnabled && isImg) {
99
+ const pastedHtml = new DOMParser().parseFromString(args.content, 'text/html').body;
100
+ const imgInfo = [];
101
+ pastedHtml.querySelectorAll('img').forEach(imgEl => {
102
+ const imgId = createUID();
103
+ const url = imgEl.src;
104
+ imgInfo.push({ id: imgId, url });
105
+ imgEl.setAttribute('id', imgId);
106
+ imgEl.setAttribute('src', '');
107
+ });
108
+ args.content = pastedHtml.innerHTML;
109
+ processPastedImgUrls(imgInfo);
110
+ }
111
+ };
112
+ useImperativeHandle(editorRef, () => ({
113
+ focus: () => {
114
+ editor?.focus();
115
+ },
116
+ getPlainText: () => {
117
+ return editor ? editor.getContent({ format: 'text' }) : '';
118
+ },
119
+ getRichText: () => {
120
+ return editor ? JSON.stringify(editor.getContent({ format: 'raw' })) : '';
121
+ },
122
+ getHtml: () => {
123
+ return editor ? editor.getContent({ format: 'html' }) : '';
124
+ },
125
+ clear: () => {
126
+ editor?.setContent('');
127
+ },
128
+ appendImage: ({ src, alt }, imageId) => {
129
+ if (editor) {
130
+ const editorEl = editor.getDoc();
131
+ const imageEl = editorEl.querySelector(`#${imageId}`);
132
+ if (imageEl) {
133
+ imageEl.setAttribute('src', src);
134
+ imageEl.setAttribute('alt', alt);
135
+ resizeEditor();
136
+ }
137
+ }
138
+ },
139
+ insertText: (text) => {
140
+ let activeElement = null;
141
+ if (documentIsAvailable) {
142
+ activeElement = getActiveElement();
143
+ }
144
+ editor?.insertContent(text);
145
+ if (activeElement)
146
+ activeElement.focus();
147
+ },
148
+ setCursorLocationToStart: () => {
149
+ editor?.selection.setCursorLocation();
150
+ editor?.selection.getNode().scrollIntoView();
151
+ },
152
+ insertHtml: (html, overwrite = false) => {
153
+ let activeElement = null;
154
+ if (documentIsAvailable) {
155
+ activeElement = getActiveElement();
156
+ }
157
+ if (overwrite) {
158
+ editor?.setContent('');
159
+ }
160
+ editor?.insertContent(html);
161
+ if (activeElement)
162
+ activeElement.focus();
163
+ },
164
+ getEditor: () => {
165
+ return editor;
166
+ },
167
+ element: formFieldRef.current || undefined
168
+ }), [editor]);
169
+ useLayoutEffect(() => {
170
+ if (!tinyMceRef.current || !tinyMceContainerRef.current)
171
+ return;
172
+ const styles = serialize(compile(getHtmlStyles(theme)), stringify);
173
+ const imageStyles = serialize(compile(getImageStyles(theme)), stringify);
174
+ tinymce
175
+ .init({
176
+ readonly: readOnly || disabled,
177
+ skin: false,
178
+ target: tinyMceRef.current,
179
+ toolbar: false,
180
+ min_height: 60,
181
+ height: 60,
182
+ menubar: false,
183
+ plugins: 'lists advlist autolink',
184
+ paste_block_drop: true,
185
+ paste_data_images: true,
186
+ lists_indent_on_tab: true,
187
+ icons: '',
188
+ branding: false,
189
+ elementpath: false,
190
+ placeholder,
191
+ content_css: false,
192
+ browser_spellcheck: spellcheck,
193
+ paste_preprocess: pastePreprocess,
194
+ content_style: `${createGlobalRootStyles(theme)} ${globalSpacingStyles} ${createGlobalBodyStyles(theme)} body { min-height: 3rem; padding: ${theme.base.spacing}; } html { overflow: hidden; } ${offscreenSelectionStyles} ${mceContentBodyStyles} ${placeholderStyles} ${imageStyles} ${styles}`,
195
+ init_instance_callback: initializedEditor => {
196
+ const iframeWindow = (tinyMceContainerRef.current?.querySelector('iframe')).contentWindow;
197
+ const editorCustomElements = iframeWindow?.customElements;
198
+ if (editorCustomElements) {
199
+ customComponents.forEach(({ name, createCustomElement: customElementCreator, style }) => {
200
+ if (!editorCustomElements.get(name)) {
201
+ editorCustomElements.define(name, customElementCreator(iframeWindow));
202
+ }
203
+ if (style) {
204
+ const styleEl = document.createElement('style');
205
+ styleEl.innerText = style;
206
+ initializedEditor.getDoc().head.appendChild(styleEl);
207
+ }
208
+ });
209
+ }
210
+ },
211
+ extended_valid_elements: `${customComponents
212
+ .map(comp => `${comp.name}${comp.extensionAttributes ? `[${comp.extensionAttributes.join('|')}]` : ''}`)
213
+ .join(',')}`,
214
+ custom_elements: customComponents.map(comp => `~${comp.name}`).join('~,'),
215
+ setup: editorSettings => {
216
+ editorSettings.on('keydown', e => {
217
+ onKeyDown?.(e);
218
+ });
219
+ getTextFormats().forEach((format, i) => {
220
+ editorSettings.addShortcut(`meta+alt+${i}`, `${t('rte_change_text_format')} ${format.text}`, () => {
221
+ editorSettings.execCommand('FormatBlock', false, format.type);
222
+ });
223
+ });
224
+ editorSettings.addShortcut('meta+shift+b', t('rte_bold'), () => {
225
+ editorSettings.execCommand('Bold');
226
+ });
227
+ editorSettings.addShortcut('meta+shift+i', t('rte_italic'), () => {
228
+ editorSettings.execCommand('Italic');
229
+ });
230
+ editorSettings.addShortcut('meta+shift+x', t('rte_strike_through'), () => {
231
+ editorSettings.execCommand('Strikethrough');
232
+ });
233
+ editorSettings.addShortcut('meta+shift+l', t('rte_toggle_unordered_list'), () => {
234
+ editorSettings.execCommand('InsertUnorderedList');
235
+ });
236
+ editorSettings.addShortcut('alt+m', t('rte_indent_selection'), () => {
237
+ editorSettings.execCommand('Indent');
238
+ });
239
+ editorSettings.addShortcut('alt+shift+m', t('rte_unindent_selection'), () => {
240
+ editorSettings.execCommand('Outdent');
241
+ });
242
+ customActions?.forEach(action => {
243
+ if (action.shortcut) {
244
+ editorSettings.addShortcut(action.shortcut.pattern, action.shortcut.description, () => {
245
+ action.shortcut?.command(editorSettings);
246
+ });
247
+ }
248
+ });
249
+ }
250
+ })
251
+ .then(tinymceEditors => {
252
+ setEditor(tinymceEditors[0]);
253
+ tinymceEditors[0].editorContainer?.setAttribute('style', '');
254
+ const iframe = tinyMceContainerRef.current?.querySelector('iframe');
255
+ if (iframe) {
256
+ const globalStyles = styleSheetTarget?.querySelectorAll('[data-cosmos-global-style]') ??
257
+ [];
258
+ const extraStyles = document.querySelectorAll('[data-cosmos-global-style]') ?? [];
259
+ const iframeContentHead = iframe?.contentDocument?.querySelector('head');
260
+ [...globalStyles, ...extraStyles].forEach(sheet => {
261
+ iframeContentHead?.appendChild(sheet.cloneNode(true));
262
+ });
263
+ autoResizeRef.current = iframe;
264
+ resizeEditor();
265
+ }
266
+ });
267
+ }, []);
268
+ useEffect(() => {
269
+ if (editor) {
270
+ editor.options.set('paste_preprocess', pastePreprocess);
271
+ }
272
+ }, [imagesEnabled]);
273
+ useEffect(() => {
274
+ if (!editor || initialized.current)
275
+ return;
276
+ initialized.current = true;
277
+ onInit?.(editor);
278
+ }, [editor, onInit]);
279
+ useEffect(() => {
280
+ if (!editor)
281
+ return;
282
+ const onChangeEvents = ['input', 'paste', 'FormatApply', 'FormatRemove', 'ExecCommand'];
283
+ const onEditorKeyDown = () => {
284
+ resizeEditor();
285
+ };
286
+ const onEditorChange = (event) => {
287
+ if (event.type !== 'execcommand' || event.command !== 'mceFocus') {
288
+ onChange?.(editor);
289
+ }
290
+ };
291
+ const onEditorFocus = () => {
292
+ setFocused(true);
293
+ onFocus?.();
294
+ };
295
+ const onEditorBlur = () => {
296
+ setFocused(false);
297
+ onBlur?.();
298
+ };
299
+ onChangeEvents.forEach(event => {
300
+ editor.on(event, onEditorChange);
301
+ });
302
+ editor.on('keydown', onEditorKeyDown);
303
+ editor.on('paste', resizeEditor);
304
+ editor.on('focus', onEditorFocus);
305
+ editor.on('blur', onEditorBlur);
306
+ return () => {
307
+ onChangeEvents.forEach(event => {
308
+ editor.off(event, onEditorChange);
309
+ });
310
+ editor.off('keydown', onEditorKeyDown);
311
+ editor.off('paste', resizeEditor);
312
+ editor.off('focus', onEditorFocus);
313
+ editor.off('blur', onEditorBlur);
314
+ };
315
+ }, [editor, onFocus, onBlur]);
316
+ useAfterInitialEffect(() => {
317
+ editor?.mode.set(readOnly || disabled ? 'readonly' : 'design');
318
+ }, [readOnly, disabled]);
319
+ const addImage = useCallback((image) => {
320
+ if (editor) {
321
+ const imageId = createUID();
322
+ editor.insertContent(`<br/><img src='' id='${imageId}' style="max-width: 100%;"/><br/>`);
323
+ onImageAdded?.(image, imageId);
324
+ }
325
+ }, [editor]);
326
+ const ctx = useMemo(() => ({ addImage, editor: editor || {} }), [editor, addImage]);
327
+ useEffect(() => {
328
+ const onEditorDrop = (e) => {
329
+ e.preventDefault();
330
+ if (e.dataTransfer) {
331
+ Array.from(e.dataTransfer.files).forEach(file => {
332
+ if (file.type.includes('image') && imagesEnabled) {
333
+ addImage(file);
334
+ }
335
+ });
336
+ }
337
+ };
338
+ editor?.on('drop', onEditorDrop);
339
+ const body = editor?.getDoc().body;
340
+ const resizeObserver = new ResizeObserver(() => {
341
+ resizeEditor();
342
+ });
343
+ if (body) {
344
+ resizeObserver.observe(body);
345
+ }
346
+ return () => {
347
+ editor?.off('drop', onEditorDrop);
348
+ resizeObserver.disconnect();
349
+ };
350
+ }, [editor, resizeEditor]);
351
+ return (_jsxs(EditorContext.Provider, { value: ctx, children: [_jsx(FormField, { testId: testIds, toolbar: renderToolbar, label:
352
+ // eslint-disable-next-line jsx-a11y/no-static-element-interactions, jsx-a11y/click-events-have-key-events
353
+ _jsx("span", { onClick: () => {
354
+ editor?.focus();
355
+ }, children: label }), labelFor: '', labelId: labelId, labelHidden: labelHidden, id: id, info: info, status: status, required: required, disabled: disabled, readOnly: readOnly, onFocus: (e) => {
356
+ if (e.target === formFieldRef.current && !disabled) {
357
+ editor?.focus();
358
+ }
359
+ }, ref: formFieldRef, tabIndex: disabled ? -1 : undefined, additionalInfo: additionalInfo, children: _jsxs(FormControl, { ...restProps, ref: editorRef, required: required, disabled: disabled, readOnly: readOnly, status: status, as: StyledRichTextEditor, focused: focused, tabIndex: readOnly ? 0 : undefined, children: [_jsxs(StyledEditorContainer, { onClick: () => {
360
+ if (!disabled) {
361
+ editor?.focus();
362
+ }
363
+ }, ref: tinyMceContainerRef, children: [_jsx("textarea", { id: id, value: value.current || '', onChange: () => { }, "aria-label": `${label}${renderToolbar ? `. ${t('rte_toolbar_instructions')}.` : ''}`, "aria-labelledby": labelId, ref: tinyMceRef }), tinyMceContainerRef.current && editor && !readOnly && (_jsx(ImageEditor, { editor: editor, editorEl: tinyMceContainerRef.current, onChange: () => onChange?.(editor) }))] }), renderToolbar && (_jsx(Toolbar, { testId: testIds, features: toolbar, editor: editor, customActions: customActions }))] }) }), children] }));
364
+ });
365
+ export default withTestIds(Editor, getEditorTestIds);
366
+ //# sourceMappingURL=Editor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Editor.js","sourceRoot":"","sources":["../../../src/components/Editor/Editor.tsx"],"names":[],"mappings":"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","sourcesContent":["import tinymce from 'tinymce/tinymce';\nimport type { Editor as TinymceEditor, EditorEvent } from 'tinymce/tinymce';\nimport 'tinymce/icons/default';\nimport 'tinymce/themes/silver';\nimport 'tinymce/plugins/advlist';\nimport 'tinymce/plugins/lists';\nimport 'tinymce/plugins/autolink';\nimport 'tinymce/models/dom';\nimport {\n forwardRef,\n useEffect,\n useRef,\n useState,\n useLayoutEffect,\n useImperativeHandle,\n useCallback,\n useMemo\n} from 'react';\nimport type { FC, PropsWithoutRef, FocusEvent } from 'react';\nimport styled, { css } from 'styled-components';\nimport type { DefaultTheme } from 'styled-components';\nimport { compile, serialize, stringify } from 'stylis';\nimport { stripUnit } from 'polished';\n\nimport {\n createUID,\n FormControl,\n FormField,\n useAfterInitialEffect,\n useTheme,\n useUID,\n useI18n,\n useConsolidatedRef,\n defaultThemeProp,\n useAutoResize,\n useConfiguration,\n useTestIds,\n withTestIds,\n documentIsAvailable,\n getActiveElement\n} from '@pega/cosmos-react-core';\nimport type { ForwardProps } from '@pega/cosmos-react-core';\nimport { getHtmlStyles } from '@pega/cosmos-react-core/lib/components/HTML/HTML';\nimport {\n createGlobalBodyStyles,\n createGlobalRootStyles,\n globalSpacingStyles\n} from '@pega/cosmos-react-core/lib/styles/GlobalStyle';\n\nimport StyledRichTextEditor from '../RichTextEditor/RichTextEditor.styles';\n\nimport Toolbar from './Toolbar/Toolbar';\nimport EditorContext from './Editor.context';\nimport { getTextFormats } from './Toolbar/TextSelect';\nimport type { EditorProps, EditorState } from './Editor.types';\nimport ImageEditor, { imgHoverClass } from './ImageEditor';\nimport {\n offscreenSelectionStyles,\n placeholderStyles,\n mceContentBodyStyles,\n StyledEditorContainer\n} from './Editor.styles';\nimport { getEditorTestIds } from './Editor.test-ids';\n\ntype ImageInfoArray = { id: string; url: string }[];\n\nconst getFileFromUrl = async (url: string, name: string) => {\n const response = await fetch(url);\n const data = await response.blob();\n return new File([data], name, {\n type: data.type\n });\n};\n\nexport const getImageStyles = (theme: DefaultTheme) => {\n return `\n img:hover,\n img.${imgHoverClass} {\n box-shadow: 0 0 0 0.06125rem ${theme.base.palette['primary-background']},\n 0 0 0 0.125rem ${theme.base.palette.interactive}, 0 0 0 0.25rem rgba(0, 118, 209, 0.3);\n }\n `;\n};\n\nexport const StyledInnerEditor = styled.div<{ showPlaceholder: boolean }>(\n ({ theme, showPlaceholder }) => {\n return css`\n ${showPlaceholder &&\n css`\n ::before {\n color: ${theme.base.colors.slate.medium};\n position: absolute;\n content: attr(data-mce-placeholder);\n }\n `}\n `;\n }\n);\n\nStyledInnerEditor.defaultProps = defaultThemeProp;\n\nconst Editor: FC<EditorProps & ForwardProps> = forwardRef(function Editor(\n props: PropsWithoutRef<EditorProps> & ForwardProps,\n ref: EditorProps['ref']\n) {\n const {\n components: {\n 'text-area': { 'min-height': textAreaMinHeight }\n }\n } = useTheme();\n const theme = useTheme();\n const { styleSheetTarget } = useConfiguration();\n const [editor, setEditor] = useState<TinymceEditor>();\n const [focused, setFocused] = useState(false);\n const t = useI18n();\n const uid = useUID();\n const labelId = useUID();\n const editorRef = useConsolidatedRef(ref);\n const tinyMceRef = useRef<HTMLTextAreaElement>(null);\n const tinyMceContainerRef = useRef<HTMLDivElement>(null);\n const initialized = useRef(false);\n\n const {\n testId,\n id = uid,\n toolbar = [],\n label,\n labelHidden,\n info,\n status,\n required,\n disabled,\n readOnly,\n onChange,\n onKeyDown,\n onFocus,\n onBlur,\n onImageAdded,\n onInit,\n defaultValue,\n customComponents = [],\n height,\n customActions,\n placeholder,\n children,\n spellcheck = true,\n additionalInfo,\n ...restProps\n } = props;\n\n const testIds = useTestIds(testId, getEditorTestIds);\n\n const baseHeight: EditorProps['height'] = {\n min: height?.min ?? (stripUnit(textAreaMinHeight) as number) * 16,\n max: height?.max ?? undefined\n };\n const getHeight = (type: 'max' | 'min') => {\n if (typeof baseHeight === 'number') {\n return stripUnit(baseHeight) as number;\n }\n if (baseHeight[type]) {\n return stripUnit(baseHeight[type] as number) as number;\n }\n return undefined;\n };\n\n const imagesEnabled = toolbar.includes('images');\n const maxHeight = getHeight('max');\n const minHeight = getHeight('min');\n const [autoResizeRef, resizeEditor] = useAutoResize<HTMLIFrameElement>(maxHeight, minHeight);\n const formFieldRef = useRef<HTMLElement>(null);\n const value = useRef(defaultValue);\n const renderToolbar = editor && toolbar.length > 0 && !readOnly && !disabled;\n\n const processPastedImgUrls = async (infoArr: ImageInfoArray) => {\n const files = await Promise.all(\n infoArr.map(({ id: imgId, url }) => getFileFromUrl(url, imgId))\n );\n files.forEach((file, i) => {\n onImageAdded?.(file, infoArr[i].id);\n });\n };\n\n const pastePreprocess = (plugin: unknown, args: { content: string }) => {\n const isImg = args.content.includes('<img');\n if (!imagesEnabled && isImg) {\n args.content = args.content.replace(/<img(.*)\\/>/g, '');\n }\n if (imagesEnabled && isImg) {\n const pastedHtml: HTMLElement = new DOMParser().parseFromString(\n args.content,\n 'text/html'\n ).body;\n const imgInfo: ImageInfoArray = [];\n pastedHtml.querySelectorAll('img').forEach(imgEl => {\n const imgId = createUID();\n const url = imgEl.src;\n imgInfo.push({ id: imgId, url });\n imgEl.setAttribute('id', imgId);\n imgEl.setAttribute('src', '');\n });\n args.content = pastedHtml.innerHTML;\n processPastedImgUrls(imgInfo);\n }\n };\n\n useImperativeHandle<any, EditorState>(\n editorRef,\n () => ({\n focus: () => {\n editor?.focus();\n },\n getPlainText: () => {\n return editor ? editor.getContent({ format: 'text' }) : '';\n },\n getRichText: () => {\n return editor ? JSON.stringify(editor.getContent({ format: 'raw' })) : '';\n },\n getHtml: () => {\n return editor ? editor.getContent({ format: 'html' }) : '';\n },\n clear: () => {\n editor?.setContent('');\n },\n appendImage: ({ src, alt }, imageId) => {\n if (editor) {\n const editorEl = editor.getDoc();\n const imageEl = editorEl.querySelector(`#${imageId}`);\n if (imageEl) {\n imageEl.setAttribute('src', src);\n imageEl.setAttribute('alt', alt);\n resizeEditor();\n }\n }\n },\n insertText: (text: string) => {\n let activeElement: Element | null = null;\n if (documentIsAvailable) {\n activeElement = getActiveElement();\n }\n editor?.insertContent(text);\n\n if (activeElement) (activeElement as HTMLElement).focus();\n },\n setCursorLocationToStart: () => {\n editor?.selection.setCursorLocation();\n editor?.selection.getNode().scrollIntoView();\n },\n insertHtml: (html: string, overwrite: boolean = false) => {\n let activeElement: Element | null = null;\n if (documentIsAvailable) {\n activeElement = getActiveElement();\n }\n if (overwrite) {\n editor?.setContent('');\n }\n editor?.insertContent(html);\n\n if (activeElement) (activeElement as HTMLElement).focus();\n },\n getEditor: () => {\n return editor;\n },\n element: formFieldRef.current || undefined\n }),\n [editor]\n );\n\n useLayoutEffect(() => {\n if (!tinyMceRef.current || !tinyMceContainerRef.current) return;\n const styles = serialize(compile(getHtmlStyles(theme)), stringify);\n const imageStyles = serialize(compile(getImageStyles(theme)), stringify);\n tinymce\n .init({\n readonly: readOnly || disabled,\n skin: false,\n target: tinyMceRef.current,\n toolbar: false,\n min_height: 60,\n height: 60,\n menubar: false,\n plugins: 'lists advlist autolink',\n paste_block_drop: true,\n paste_data_images: true,\n lists_indent_on_tab: true,\n icons: '',\n branding: false,\n elementpath: false,\n placeholder,\n content_css: false,\n browser_spellcheck: spellcheck,\n paste_preprocess: pastePreprocess,\n content_style: `${createGlobalRootStyles(\n theme\n )} ${globalSpacingStyles} ${createGlobalBodyStyles(\n theme\n )} body { min-height: 3rem; padding: ${\n theme.base.spacing\n }; } html { overflow: hidden; } ${offscreenSelectionStyles} ${mceContentBodyStyles} ${placeholderStyles} ${imageStyles} ${styles}`,\n init_instance_callback: initializedEditor => {\n const iframeWindow = (\n tinyMceContainerRef.current?.querySelector('iframe') as HTMLIFrameElement\n ).contentWindow;\n const editorCustomElements = iframeWindow?.customElements;\n if (editorCustomElements) {\n customComponents.forEach(\n ({ name, createCustomElement: customElementCreator, style }) => {\n if (!editorCustomElements.get(name)) {\n editorCustomElements.define(\n name,\n customElementCreator(iframeWindow as unknown as typeof globalThis)\n );\n }\n if (style) {\n const styleEl = document.createElement('style');\n styleEl.innerText = style;\n initializedEditor.getDoc().head.appendChild(styleEl);\n }\n }\n );\n }\n },\n extended_valid_elements: `${customComponents\n .map(\n comp =>\n `${comp.name}${\n comp.extensionAttributes ? `[${comp.extensionAttributes.join('|')}]` : ''\n }`\n )\n .join(',')}`,\n custom_elements: customComponents.map(comp => `~${comp.name}`).join('~,'),\n setup: editorSettings => {\n editorSettings.on('keydown', e => {\n onKeyDown?.(e);\n });\n getTextFormats().forEach((format, i) => {\n editorSettings.addShortcut(\n `meta+alt+${i}`,\n `${t('rte_change_text_format')} ${format.text}`,\n () => {\n editorSettings.execCommand('FormatBlock', false, format.type);\n }\n );\n });\n editorSettings.addShortcut('meta+shift+b', t('rte_bold'), () => {\n editorSettings.execCommand('Bold');\n });\n editorSettings.addShortcut('meta+shift+i', t('rte_italic'), () => {\n editorSettings.execCommand('Italic');\n });\n editorSettings.addShortcut('meta+shift+x', t('rte_strike_through'), () => {\n editorSettings.execCommand('Strikethrough');\n });\n editorSettings.addShortcut('meta+shift+l', t('rte_toggle_unordered_list'), () => {\n editorSettings.execCommand('InsertUnorderedList');\n });\n editorSettings.addShortcut('alt+m', t('rte_indent_selection'), () => {\n editorSettings.execCommand('Indent');\n });\n editorSettings.addShortcut('alt+shift+m', t('rte_unindent_selection'), () => {\n editorSettings.execCommand('Outdent');\n });\n customActions?.forEach(action => {\n if (action.shortcut) {\n editorSettings.addShortcut(\n action.shortcut.pattern,\n action.shortcut.description,\n () => {\n action.shortcut?.command(editorSettings);\n }\n );\n }\n });\n }\n })\n .then(tinymceEditors => {\n setEditor(tinymceEditors[0]);\n tinymceEditors[0].editorContainer?.setAttribute('style', '');\n const iframe = tinyMceContainerRef.current?.querySelector('iframe');\n if (iframe) {\n const globalStyles =\n styleSheetTarget?.querySelectorAll('[data-cosmos-global-style]') ??\n ([] as HTMLElement[]);\n const extraStyles =\n document.querySelectorAll('[data-cosmos-global-style]') ?? ([] as HTMLElement[]);\n const iframeContentHead = iframe?.contentDocument?.querySelector('head');\n [...globalStyles, ...extraStyles].forEach(sheet => {\n iframeContentHead?.appendChild(sheet.cloneNode(true));\n });\n autoResizeRef.current = iframe;\n resizeEditor();\n }\n });\n }, []);\n\n useEffect(() => {\n if (editor) {\n editor.options.set('paste_preprocess', pastePreprocess);\n }\n }, [imagesEnabled]);\n\n useEffect(() => {\n if (!editor || initialized.current) return;\n initialized.current = true;\n onInit?.(editor);\n }, [editor, onInit]);\n\n useEffect(() => {\n if (!editor) return;\n const onChangeEvents = ['input', 'paste', 'FormatApply', 'FormatRemove', 'ExecCommand'];\n const onEditorKeyDown = () => {\n resizeEditor();\n };\n const onEditorChange = (event: EditorEvent<Event & { command?: string }>) => {\n if (event.type !== 'execcommand' || event.command !== 'mceFocus') {\n onChange?.(editor);\n }\n };\n const onEditorFocus = () => {\n setFocused(true);\n onFocus?.();\n };\n const onEditorBlur = () => {\n setFocused(false);\n onBlur?.();\n };\n onChangeEvents.forEach(event => {\n editor.on(event, onEditorChange);\n });\n editor.on('keydown', onEditorKeyDown);\n editor.on('paste', resizeEditor);\n editor.on('focus', onEditorFocus);\n editor.on('blur', onEditorBlur);\n return () => {\n onChangeEvents.forEach(event => {\n editor.off(event, onEditorChange);\n });\n editor.off('keydown', onEditorKeyDown);\n editor.off('paste', resizeEditor);\n editor.off('focus', onEditorFocus);\n editor.off('blur', onEditorBlur);\n };\n }, [editor, onFocus, onBlur]);\n\n useAfterInitialEffect(() => {\n editor?.mode.set(readOnly || disabled ? 'readonly' : 'design');\n }, [readOnly, disabled]);\n\n const addImage = useCallback(\n (image: File) => {\n if (editor) {\n const imageId = createUID();\n editor.insertContent(`<br/><img src='' id='${imageId}' style=\"max-width: 100%;\"/><br/>`);\n onImageAdded?.(image, imageId);\n }\n },\n [editor]\n );\n\n const ctx = useMemo(\n () => ({ addImage, editor: editor || ({} as TinymceEditor) }),\n [editor, addImage]\n );\n\n useEffect(() => {\n const onEditorDrop = (e: DragEvent) => {\n e.preventDefault();\n if (e.dataTransfer) {\n Array.from(e.dataTransfer.files).forEach(file => {\n if (file.type.includes('image') && imagesEnabled) {\n addImage(file);\n }\n });\n }\n };\n editor?.on('drop', onEditorDrop);\n const body = editor?.getDoc().body;\n const resizeObserver = new ResizeObserver(() => {\n resizeEditor();\n });\n if (body) {\n resizeObserver.observe(body);\n }\n return () => {\n editor?.off('drop', onEditorDrop);\n resizeObserver.disconnect();\n };\n }, [editor, resizeEditor]);\n\n return (\n <EditorContext.Provider value={ctx}>\n <FormField\n testId={testIds}\n toolbar={renderToolbar}\n label={\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions, jsx-a11y/click-events-have-key-events\n <span\n onClick={() => {\n editor?.focus();\n }}\n >\n {label}\n </span>\n }\n labelFor=''\n labelId={labelId}\n labelHidden={labelHidden}\n id={id}\n info={info}\n status={status}\n required={required}\n disabled={disabled}\n readOnly={readOnly}\n onFocus={(e: FocusEvent) => {\n if (e.target === formFieldRef.current && !disabled) {\n editor?.focus();\n }\n }}\n ref={formFieldRef}\n tabIndex={disabled ? -1 : undefined}\n additionalInfo={additionalInfo}\n >\n <FormControl\n {...restProps}\n ref={editorRef}\n required={required}\n disabled={disabled}\n readOnly={readOnly}\n status={status}\n as={StyledRichTextEditor}\n focused={focused}\n tabIndex={readOnly ? 0 : undefined}\n >\n <StyledEditorContainer\n onClick={() => {\n if (!disabled) {\n editor?.focus();\n }\n }}\n ref={tinyMceContainerRef}\n >\n <textarea\n id={id}\n value={value.current || ''}\n onChange={() => {}}\n aria-label={`${label}${renderToolbar ? `. ${t('rte_toolbar_instructions')}.` : ''}`}\n aria-labelledby={labelId}\n ref={tinyMceRef}\n />\n {tinyMceContainerRef.current && editor && !readOnly && (\n <ImageEditor\n editor={editor}\n editorEl={tinyMceContainerRef.current}\n onChange={() => onChange?.(editor)}\n />\n )}\n </StyledEditorContainer>\n {renderToolbar && (\n <Toolbar\n testId={testIds}\n features={toolbar}\n editor={editor}\n customActions={customActions}\n />\n )}\n </FormControl>\n </FormField>\n {children}\n </EditorContext.Provider>\n );\n});\n\nexport default withTestIds(Editor, getEditorTestIds);\n"]}
@@ -0,0 +1,5 @@
1
+ export declare const offscreenSelectionStyles = "\n .mce-offscreen-selection {\n border: 0;\n clip: rect(0 0 0 0);\n height: 1px;\n margin: -1px;\n overflow: hidden;\n padding: 0;\n position: absolute;\n whiteSpace: nowrap;\n width: 1px;\n }\n";
2
+ export declare const mceContentBodyStyles = "\n .mce-content-body {\n overflow-wrap: break-word;\n }\n";
3
+ export declare const placeholderStyles = "\n .mce-content-body[data-mce-placeholder] {\n position: relative;\n }\n .mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before {\n cursor: text;\n color: rgb(117, 117, 117);\n content: attr(data-mce-placeholder);\n position: absolute;\n }\n";
4
+ export declare const StyledEditorContainer: import("styled-components").StyledComponent<"div", import("styled-components").DefaultTheme, {}, never>;
5
+ //# sourceMappingURL=Editor.styles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Editor.styles.d.ts","sourceRoot":"","sources":["../../../src/components/Editor/Editor.styles.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,wBAAwB,oOAYpC,CAAC;AAEF,eAAO,MAAM,oBAAoB,mEAIhC,CAAC;AAEF,eAAO,MAAM,iBAAiB,yRAU7B,CAAC;AAEF,eAAO,MAAM,qBAAqB,yGAgBhC,CAAC"}
@@ -0,0 +1,50 @@
1
+ import styled, { css } from 'styled-components';
2
+ import { defaultThemeProp } from '@pega/cosmos-react-core';
3
+ export const offscreenSelectionStyles = `
4
+ .mce-offscreen-selection {
5
+ border: 0;
6
+ clip: rect(0 0 0 0);
7
+ height: 1px;
8
+ margin: -1px;
9
+ overflow: hidden;
10
+ padding: 0;
11
+ position: absolute;
12
+ whiteSpace: nowrap;
13
+ width: 1px;
14
+ }
15
+ `;
16
+ export const mceContentBodyStyles = `
17
+ .mce-content-body {
18
+ overflow-wrap: break-word;
19
+ }
20
+ `;
21
+ export const placeholderStyles = `
22
+ .mce-content-body[data-mce-placeholder] {
23
+ position: relative;
24
+ }
25
+ .mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before {
26
+ cursor: text;
27
+ color: rgb(117, 117, 117);
28
+ content: attr(data-mce-placeholder);
29
+ position: absolute;
30
+ }
31
+ `;
32
+ export const StyledEditorContainer = styled.div(({ theme }) => {
33
+ return css `
34
+ &:hover {
35
+ cursor: text;
36
+ }
37
+
38
+ iframe {
39
+ display: block;
40
+ width: 100%;
41
+ height: ${theme.components['text-area']['min-height']};
42
+ }
43
+
44
+ .tox-statusbar {
45
+ display: none !important;
46
+ }
47
+ `;
48
+ });
49
+ StyledEditorContainer.defaultProps = defaultThemeProp;
50
+ //# sourceMappingURL=Editor.styles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Editor.styles.js","sourceRoot":"","sources":["../../../src/components/Editor/Editor.styles.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,MAAM,CAAC,MAAM,wBAAwB,GAAG;;;;;;;;;;;;CAYvC,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG;;;;CAInC,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG;;;;;;;;;;CAUhC,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;IAC5D,OAAO,GAAG,CAAA;;;;;;;;gBAQI,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,YAAY,CAAC;;;;;;GAMxD,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,qBAAqB,CAAC,YAAY,GAAG,gBAAgB,CAAC","sourcesContent":["import styled, { css } from 'styled-components';\n\nimport { defaultThemeProp } from '@pega/cosmos-react-core';\n\nexport const offscreenSelectionStyles = `\n .mce-offscreen-selection {\n border: 0;\n clip: rect(0 0 0 0);\n height: 1px;\n margin: -1px;\n overflow: hidden;\n padding: 0;\n position: absolute;\n whiteSpace: nowrap;\n width: 1px;\n }\n`;\n\nexport const mceContentBodyStyles = `\n .mce-content-body {\n overflow-wrap: break-word;\n }\n`;\n\nexport const placeholderStyles = `\n .mce-content-body[data-mce-placeholder] {\n position: relative;\n }\n .mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before {\n cursor: text;\n color: rgb(117, 117, 117);\n content: attr(data-mce-placeholder);\n position: absolute;\n }\n`;\n\nexport const StyledEditorContainer = styled.div(({ theme }) => {\n return css`\n &:hover {\n cursor: text;\n }\n\n iframe {\n display: block;\n width: 100%;\n height: ${theme.components['text-area']['min-height']};\n }\n\n .tox-statusbar {\n display: none !important;\n }\n `;\n});\n\nStyledEditorContainer.defaultProps = defaultThemeProp;\n"]}
@@ -0,0 +1,2 @@
1
+ export declare const getEditorTestIds: (testIdProp?: string | undefined) => import("@pega/cosmos-react-core").TestIdsRecord<readonly ["toolbar", "text-styles", "bold", "italic", "strike-through", "bulleted-list", "numbered-list", "indent", "unindent", "link", "image", "label", "info", "additional-info", "suggestion-accept", "suggestion-reject"]>;
2
+ //# sourceMappingURL=Editor.test-ids.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Editor.test-ids.d.ts","sourceRoot":"","sources":["../../../src/components/Editor/Editor.test-ids.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,gBAAgB,sTAGlB,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { createTestIds } from '@pega/cosmos-react-core';
2
+ import { elements as formFieldTestIdElements } from '@pega/cosmos-react-core/lib/components/FormField/FormField.test-ids';
3
+ import { elements as toolbarTestIdElements } from './Toolbar/Toolbar.test-ids';
4
+ export const getEditorTestIds = createTestIds('editor', [
5
+ ...toolbarTestIdElements,
6
+ ...formFieldTestIdElements
7
+ ]);
8
+ //# sourceMappingURL=Editor.test-ids.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Editor.test-ids.js","sourceRoot":"","sources":["../../../src/components/Editor/Editor.test-ids.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,QAAQ,IAAI,uBAAuB,EAAE,MAAM,qEAAqE,CAAC;AAE1H,OAAO,EAAE,QAAQ,IAAI,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAE/E,MAAM,CAAC,MAAM,gBAAgB,GAAG,aAAa,CAAC,QAAQ,EAAE;IACtD,GAAG,qBAAqB;IACxB,GAAG,uBAAuB;CAClB,CAAC,CAAC","sourcesContent":["import { createTestIds } from '@pega/cosmos-react-core';\nimport { elements as formFieldTestIdElements } from '@pega/cosmos-react-core/lib/components/FormField/FormField.test-ids';\n\nimport { elements as toolbarTestIdElements } from './Toolbar/Toolbar.test-ids';\n\nexport const getEditorTestIds = createTestIds('editor', [\n ...toolbarTestIdElements,\n ...formFieldTestIdElements\n] as const);\n"]}
@@ -0,0 +1,69 @@
1
+ import type { ReactNode, Ref, MouseEvent as ReactMouseEvent, KeyboardEvent as ReactKeyboardEvent } from 'react';
2
+ import type { Editor as TinymceEditor } from 'tinymce/tinymce';
3
+ import type { Action, BaseProps, FormControlProps, TestIdProp } from '@pega/cosmos-react-core';
4
+ import type { Features } from '../RichTextEditor/Toolbar/Toolbar.types';
5
+ import type { RichTextEditorState } from '../RichTextEditor';
6
+ export type EditorState = RichTextEditorState & {
7
+ getEditor: () => TinymceEditor | undefined;
8
+ element?: HTMLElement;
9
+ setCursorLocationToStart?: () => void;
10
+ };
11
+ export type CustomAction = {
12
+ text: Action['text'];
13
+ icon: NonNullable<Action['icon']>;
14
+ onMouseDown: (e: ReactMouseEvent | ReactKeyboardEvent) => void;
15
+ active?: (editor: TinymceEditor) => void;
16
+ shortcut?: {
17
+ pattern: string;
18
+ description: string;
19
+ command: (editor: TinymceEditor) => void;
20
+ };
21
+ 'data-testid'?: string;
22
+ };
23
+ export type CustomComponent = {
24
+ createCustomElement: (window: typeof globalThis) => CustomElementConstructor;
25
+ name: string;
26
+ extensionAttributes?: string[];
27
+ style?: string;
28
+ };
29
+ export interface EditorProps extends FormControlProps, BaseProps, TestIdProp {
30
+ /** An array of strings that activate features on the toolbar */
31
+ toolbar?: Features[];
32
+ /** Children content */
33
+ children?: ReactNode;
34
+ /** A callback that supplies an object with functions that can manipulate the editor and retrieve it's content/state */
35
+ onChange?: (editor?: TinymceEditor) => void;
36
+ /** KeyDown event custom handlers for the editor */
37
+ onKeyDown?: (event?: KeyboardEvent) => void;
38
+ /** A callback that runs if the editor is focused */
39
+ onFocus?: () => void;
40
+ /** A callback that runs if the editor loses focus */
41
+ onBlur?: () => void;
42
+ /** A callback when an image is added through the toolbar image feature */
43
+ onImageAdded?: (image: File, id: string) => void;
44
+ /** A callback for when tinymce is finished initializing */
45
+ onInit?: (editor: TinymceEditor) => void;
46
+ /** Standard placeholder for an input */
47
+ placeholder?: string;
48
+ /** Default value for the RTE - HTML String */
49
+ defaultValue?: string;
50
+ /** Will automatically focus the RTE on render if true */
51
+ autoFocus?: boolean;
52
+ /** Sets the height for the RTE. If no max height is set the RTE will continue to expand, otherwise an overflow will be applied */
53
+ height?: {
54
+ min?: number;
55
+ max?: number;
56
+ };
57
+ /** An array of custom components, custom components must use web component API */
58
+ customComponents?: CustomComponent[];
59
+ /** An array of custom buttons to be inserted into the toolbar */
60
+ customActions?: CustomAction[];
61
+ /**
62
+ * Enables browser spellcheck.
63
+ * @default true
64
+ */
65
+ spellcheck?: boolean;
66
+ /** Handle to the state. */
67
+ ref?: Ref<EditorState>;
68
+ }
69
+ //# sourceMappingURL=Editor.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Editor.types.d.ts","sourceRoot":"","sources":["../../../src/components/Editor/Editor.types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=Editor.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Editor.types.js","sourceRoot":"","sources":["../../../src/components/Editor/Editor.types.ts"],"names":[],"mappings":"","sourcesContent":["import type {\n ReactNode,\n Ref,\n MouseEvent as ReactMouseEvent,\n KeyboardEvent as ReactKeyboardEvent\n} from 'react';\nimport type { Editor as TinymceEditor } from 'tinymce/tinymce';\n\nimport type { Action, BaseProps, FormControlProps, TestIdProp } from '@pega/cosmos-react-core';\n\nimport type { Features } from '../RichTextEditor/Toolbar/Toolbar.types';\nimport type { RichTextEditorState } from '../RichTextEditor';\n\nexport type EditorState = RichTextEditorState & {\n getEditor: () => TinymceEditor | undefined;\n element?: HTMLElement;\n setCursorLocationToStart?: () => void;\n};\n\nexport type CustomAction = {\n text: Action['text'];\n icon: NonNullable<Action['icon']>;\n onMouseDown: (e: ReactMouseEvent | ReactKeyboardEvent) => void;\n active?: (editor: TinymceEditor) => void;\n shortcut?: { pattern: string; description: string; command: (editor: TinymceEditor) => void };\n 'data-testid'?: string;\n};\n\nexport type CustomComponent = {\n createCustomElement: (window: typeof globalThis) => CustomElementConstructor;\n name: string;\n extensionAttributes?: string[];\n style?: string;\n};\n\nexport interface EditorProps extends FormControlProps, BaseProps, TestIdProp {\n /** An array of strings that activate features on the toolbar */\n toolbar?: Features[];\n /** Children content */\n children?: ReactNode;\n /** A callback that supplies an object with functions that can manipulate the editor and retrieve it's content/state */\n onChange?: (editor?: TinymceEditor) => void;\n /** KeyDown event custom handlers for the editor */\n onKeyDown?: (event?: KeyboardEvent) => void;\n /** A callback that runs if the editor is focused */\n onFocus?: () => void;\n /** A callback that runs if the editor loses focus */\n onBlur?: () => void;\n /** A callback when an image is added through the toolbar image feature */\n onImageAdded?: (image: File, id: string) => void;\n /** A callback for when tinymce is finished initializing */\n onInit?: (editor: TinymceEditor) => void;\n /** Standard placeholder for an input */\n placeholder?: string;\n /** Default value for the RTE - HTML String */\n defaultValue?: string;\n /** Will automatically focus the RTE on render if true */\n autoFocus?: boolean;\n /** Sets the height for the RTE. If no max height is set the RTE will continue to expand, otherwise an overflow will be applied */\n height?: {\n min?: number;\n max?: number;\n };\n /** An array of custom components, custom components must use web component API */\n customComponents?: CustomComponent[];\n /** An array of custom buttons to be inserted into the toolbar */\n customActions?: CustomAction[];\n /**\n * Enables browser spellcheck.\n * @default true\n */\n spellcheck?: boolean;\n /** Handle to the state. */\n ref?: Ref<EditorState>;\n}\n"]}
@@ -0,0 +1,10 @@
1
+ import type { FC } from 'react';
2
+ import type { Editor } from 'tinymce';
3
+ export declare const imgHoverClass: string;
4
+ declare const ImageEditor: FC<{
5
+ editorEl: HTMLElement;
6
+ editor: Editor;
7
+ onChange: () => void;
8
+ }>;
9
+ export default ImageEditor;
10
+ //# sourceMappingURL=ImageEditor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImageEditor.d.ts","sourceRoot":"","sources":["../../../src/components/Editor/ImageEditor.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,EAA6D,MAAM,OAAO,CAAC;AAC3F,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AA6BtC,eAAO,MAAM,aAAa,QAAc,CAAC;AAEzC,QAAA,MAAM,WAAW,EAAE,EAAE,CAAC;IAAE,QAAQ,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,IAAI,CAAA;CAAE,CA2YpF,CAAC;AAEF,eAAe,WAAW,CAAC"}