@pega/cosmos-react-rte 10.0.0-build.3.0 → 10.0.0-build.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"useIframeSetup.d.ts","sourceRoot":"","sources":["../../../../src/components/Editor/hooks/useIframeSetup.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useIframeSetup.d.ts","sourceRoot":"","sources":["../../../../src/components/Editor/hooks/useIframeSetup.tsx"],"names":[],"mappings":"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"}
@@ -229,11 +229,33 @@ export default function useIframeSetup({ iframeRef, theme, styleSheetTarget, cus
229
229
  }
230
230
  }
231
231
  };
232
- // Handle Tab key to exit editor and focus toolbar
232
+ // Handle Tab key - indent list items or exit editor to toolbar
233
+ // Handle Alt+F10 - standard accessibility shortcut to focus toolbar
233
234
  const handleIframeKeyDown = (e) => {
234
- if (e.key === 'Tab' && !e.shiftKey) {
235
+ if (e.key === 'F10' && e.altKey && !e.ctrlKey && !e.shiftKey && !e.metaKey) {
235
236
  e.preventDefault();
236
237
  onTabOutRef.current?.();
238
+ return;
239
+ }
240
+ if (e.key === 'Tab') {
241
+ const editor = iframeEditorRef.current?.getEditor();
242
+ if (editor) {
243
+ const isInList = editor.isActive('listItem');
244
+ if (isInList) {
245
+ e.preventDefault();
246
+ if (e.shiftKey) {
247
+ editor.chain().focus().liftListItem('listItem').run();
248
+ }
249
+ else {
250
+ editor.chain().focus().sinkListItem('listItem').run();
251
+ }
252
+ return;
253
+ }
254
+ }
255
+ if (!e.shiftKey) {
256
+ e.preventDefault();
257
+ onTabOutRef.current?.();
258
+ }
237
259
  }
238
260
  };
239
261
  iframeDoc.addEventListener('mousedown', handleIframeMouseDown);
@@ -1 +1 @@
1
- {"version":3,"file":"useIframeSetup.js","sourceRoot":"","sources":["../../../../src/components/Editor/hooks/useIframeSetup.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useLayoutEffect, useRef, useState, useEffect } from 'react';\nimport type { RefObject, MutableRefObject } from 'react';\nimport { createRoot } from 'react-dom/client';\nimport type { Root } from 'react-dom/client';\nimport { compile, serialize, stringify } from 'stylis';\nimport type { Editor as TiptapEditor } from '@tiptap/core';\n\nimport { useTheme } 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 type { CustomComponent, EditorProps } from '../Editor.types';\nimport { IframeTiptapEditor } from '../IframeTiptapEditor';\nimport { getIframeContentStyles } from '../iframeContentStyles';\n\ninterface UseIframeSetupParams {\n iframeRef: RefObject<HTMLIFrameElement>;\n theme: ReturnType<typeof useTheme>;\n styleSheetTarget?: HTMLElement | ShadowRoot;\n customElements: CustomComponent[];\n placeholder?: string;\n defaultValue?: string;\n disabled?: boolean;\n readOnly?: boolean;\n onChange?: (editor: TiptapEditor) => void;\n onKeyDown?: (event?: KeyboardEvent) => void;\n onFocus?: () => void;\n onBlur?: () => void;\n onInit?: (editor: TiptapEditor) => void;\n spellcheck?: boolean;\n initOptions?: EditorProps['initOptions'];\n onImageAdded?: (image: File, id: string, altText?: string) => void;\n imagesEnabled: boolean;\n linksEnabled: boolean;\n imageInsertionMode: 'file' | 'url' | 'all';\n pastedImages: MutableRefObject<File[]>;\n editorId: string;\n required?: boolean;\n setTiptapEditor: (editor: TiptapEditor) => void;\n setFocused: (focused: boolean) => void;\n autoResize?: boolean;\n onTabOut?: () => void;\n onFocusTableMenu?: () => void;\n onFocusPreviousCellMenu?: () => void;\n secure?: boolean;\n preserveTableStyles?: boolean;\n}\n\nexport interface IframeEditorHandle {\n focus: () => void;\n getPlainText: () => string;\n getRichText: () => string;\n getHtml: () => string;\n clear: () => void;\n insertText: (text: string) => void;\n setCursorLocationToStart: () => void;\n insertHtml: (html: string, overwrite?: boolean) => void;\n getEditor: () => TiptapEditor | null;\n setEditable: (editable: boolean) => void;\n}\n\nexport type IframeEditorRef = MutableRefObject<IframeEditorHandle | null>;\n\ninterface UseIframeSetupReturn {\n iframeEditorRef: IframeEditorRef;\n}\n\nexport default function useIframeSetup({\n iframeRef,\n theme,\n styleSheetTarget,\n customElements,\n placeholder,\n defaultValue,\n disabled,\n readOnly,\n onChange,\n onKeyDown,\n onFocus,\n onBlur,\n onInit,\n spellcheck,\n initOptions,\n onImageAdded,\n imagesEnabled,\n linksEnabled,\n imageInsertionMode,\n pastedImages,\n editorId,\n required,\n setTiptapEditor,\n setFocused,\n autoResize = true,\n onTabOut,\n onFocusTableMenu,\n onFocusPreviousCellMenu,\n secure = false,\n preserveTableStyles = false\n}: UseIframeSetupParams): UseIframeSetupReturn {\n const {\n components: {\n 'text-area': { 'min-height': textAreaMinHeight }\n }\n } = theme;\n const iframeRootRef = useRef<Root | null>(null);\n const iframeEditorRef = useRef<IframeEditorHandle | null>(null);\n const resizeObserverRef = useRef<ResizeObserver | null>(null);\n const isInitializedRef = useRef(false);\n const savedContentRef = useRef<string | null>(null);\n const [reinitializeCounter, setReinitializeCounter] = useState(0);\n\n // Refs to keep callbacks fresh without re-initializing the iframe\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n\n const onImageAddedRef = useRef(onImageAdded);\n onImageAddedRef.current = onImageAdded;\n\n const onTabOutRef = useRef(onTabOut);\n onTabOutRef.current = onTabOut;\n\n const requiredRef = useRef(required);\n requiredRef.current = required;\n\n const onFocusTableMenuRef = useRef(onFocusTableMenu);\n onFocusTableMenuRef.current = onFocusTableMenu;\n\n const onFocusPreviousCellMenuRef = useRef(onFocusPreviousCellMenu);\n onFocusPreviousCellMenuRef.current = onFocusPreviousCellMenu;\n\n // Listen for iframe load events (fires when iframe reloads due to DOM move)\n useEffect(() => {\n if (!iframeRef.current) return;\n\n const iframe = iframeRef.current;\n\n const handleLoad = () => {\n // Check if content was lost\n const proseMirror = iframe.contentDocument?.querySelector('.ProseMirror');\n if (!proseMirror && isInitializedRef.current) {\n // savedContentRef is updated on every change, so it has the latest content\n isInitializedRef.current = false;\n setReinitializeCounter(c => c + 1);\n }\n };\n\n iframe.addEventListener('load', handleLoad);\n\n return () => {\n iframe.removeEventListener('load', handleLoad);\n };\n }, [iframeRef]);\n\n // Mount Tiptap inside iframe\n useLayoutEffect(() => {\n if (!iframeRef.current) return;\n\n // Check if already initialized and content is still valid\n if (isInitializedRef.current) {\n const proseMirror = iframeRef.current.contentDocument?.querySelector('.ProseMirror');\n if (proseMirror) {\n // Already initialized and content is valid, skip\n return;\n }\n // Content was lost (iframe reloaded), need to reinitialize\n if (iframeRootRef.current) {\n try {\n iframeRootRef.current.unmount();\n } catch (e) {\n // Ignore unmount errors\n }\n iframeRootRef.current = null;\n }\n if (resizeObserverRef.current) {\n resizeObserverRef.current.disconnect();\n resizeObserverRef.current = null;\n }\n }\n\n const iframe = iframeRef.current;\n const iframeDoc = iframe.contentDocument || iframe.contentWindow?.document;\n\n if (!iframeDoc) return;\n\n // Generate styles\n const htmlStyles = serialize(compile(getHtmlStyles(theme)), stringify);\n\n // When preserving table styles, remove the default Tiptap table borders\n // so only the original inline styles show through\n const preserveTableStylesCSS = preserveTableStyles\n ? `\n .ProseMirror table,\n .ProseMirror table tr,\n .ProseMirror table td,\n .ProseMirror table th,\n .ProseMirror table tr td,\n .ProseMirror table tr th {\n border: 0 none transparent;\n }\n `\n : '';\n\n const contentStyle = `\n ${createGlobalRootStyles(theme)}\n ${globalSpacingStyles}\n ${createGlobalBodyStyles(theme)}\n ${htmlStyles}\n ${getIframeContentStyles(theme)}\n ${initOptions?.contentStyle ?? ''}\n ${preserveTableStylesCSS}\n `;\n\n // Create basic HTML structure in iframe\n iframeDoc.open();\n iframeDoc.write(`\n <!DOCTYPE html>\n <html>\n <head>\n <style${window.__webpack_nonce__ ? ` nonce=\"${window.__webpack_nonce__}\"` : ''}>\n ${contentStyle}\n </style>\n </head>\n <body>\n <div id=\"tiptap-root\"></div>\n </body>\n </html>\n `);\n iframeDoc.close();\n\n // Copy global styles into the iframe\n const globalStyles =\n styleSheetTarget?.querySelectorAll('[data-cosmos-global-style]') ?? ([] as HTMLElement[]);\n const extraStyles =\n document.querySelectorAll('[data-cosmos-global-style]') ?? ([] as HTMLElement[]);\n const iframeHead = iframeDoc.querySelector('head');\n [...globalStyles, ...extraStyles].forEach(sheet => {\n iframeHead?.appendChild(sheet.cloneNode(true));\n });\n\n // Register custom components in iframe\n if (customElements && customElements.length > 0 && iframe.contentWindow) {\n const iframeWindow = iframe.contentWindow as unknown as typeof globalThis;\n customElements.forEach((component: CustomComponent) => {\n if (\n component.name &&\n component.createCustomElement &&\n !iframeWindow.customElements.get(component.name)\n ) {\n const CustomElement = component.createCustomElement(iframeWindow);\n iframeWindow.customElements.define(component.name, CustomElement);\n }\n\n // Inject custom component styles into iframe if provided\n if (component.style && iframeHead && component.name) {\n const styleId = `custom-component-${component.name}`;\n if (!iframeDoc.getElementById(styleId)) {\n const styleElement = iframeDoc.createElement('style');\n styleElement.id = styleId;\n styleElement.textContent = component.style;\n if (window.__webpack_nonce__) {\n styleElement.nonce = window.__webpack_nonce__;\n }\n iframeHead.appendChild(styleElement);\n }\n }\n });\n }\n\n // Mount React component inside iframe\n const rootElement = iframeDoc.getElementById('tiptap-root');\n if (rootElement && !iframeRootRef.current) {\n // Use saved content if available (from DOM move), otherwise use defaultValue\n const initialContent = savedContentRef.current ?? defaultValue;\n\n iframeRootRef.current = createRoot(rootElement);\n iframeRootRef.current.render(\n <IframeTiptapEditor\n placeholder={placeholder}\n defaultValue={initialContent}\n disabled={disabled}\n readOnly={readOnly}\n onChange={editor => {\n // Save content on every change so it can be restored if iframe reloads\n savedContentRef.current = editor.getHTML();\n onChangeRef.current?.(editor);\n }}\n onKeyDown={onKeyDown}\n onFocus={() => {\n setFocused(true);\n onFocus?.();\n }}\n onBlur={() => {\n setFocused(false);\n onBlur?.();\n }}\n onInit={(editor: TiptapEditor) => {\n // Save initial content so it can be restored if iframe reloads before any changes\n savedContentRef.current = editor.getHTML();\n // Set aria-required on the contenteditable element\n if (requiredRef.current) {\n editor.view.dom.setAttribute('aria-required', 'true');\n }\n setTiptapEditor(editor);\n onInit?.(editor);\n }}\n editorRef={iframeEditorRef}\n spellcheck={spellcheck}\n customElements={customElements}\n initOptions={initOptions}\n onImageAdded={(image, id, altText) => onImageAddedRef.current?.(image, id, altText)}\n imagesEnabled={imagesEnabled}\n linksEnabled={linksEnabled}\n imageInsertionMode={imageInsertionMode}\n pastedImagesRef={pastedImages}\n editorId={editorId}\n secure={secure}\n preserveTableStyles={preserveTableStyles}\n onFocusTableMenu={() => onFocusTableMenuRef.current?.()}\n onFocusPreviousCellMenu={() => {\n onFocusPreviousCellMenuRef.current?.();\n }}\n />\n );\n }\n\n // Handle mousedown on empty space to enable drag-to-select from anywhere\n const handleIframeMouseDown = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n // Only handle mousedown on empty space (not on actual content like paragraphs, text nodes)\n if (\n target === iframeDoc.documentElement ||\n target === iframeDoc.body ||\n target.id === 'tiptap-root'\n ) {\n const editor = iframeEditorRef.current?.getEditor();\n if (editor) {\n // Find nearest document position and place cursor there\n // This allows ProseMirror to handle the subsequent drag selection\n const pos = editor.view.posAtCoords({ left: e.clientX, top: e.clientY });\n if (pos) {\n editor.commands.setTextSelection(pos.pos);\n editor.commands.focus();\n } else {\n editor.commands.focus('end');\n }\n }\n }\n };\n\n // Handle mouseup on empty space to place cursor/deselect on simple clicks\n const handleIframeMouseUp = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n // Only handle clicks on empty space (html, body, tiptap-root, or ProseMirror container)\n if (\n target === iframeDoc.documentElement ||\n target === iframeDoc.body ||\n target.id === 'tiptap-root' ||\n target.classList.contains('ProseMirror')\n ) {\n const editor = iframeEditorRef.current?.getEditor();\n if (editor) {\n // Check if user has a text selection (from drag) - if so, don't interfere\n const { from, to } = editor.state.selection;\n if (from === to) {\n // Selection is collapsed (no text selected), treat as click\n const pos = editor.view.posAtCoords({ left: e.clientX, top: e.clientY });\n if (pos) {\n // Place cursor at the nearest position\n editor.commands.setTextSelection(pos.pos);\n editor.commands.focus();\n } else {\n // Fallback to end of document if no position found\n editor.commands.focus('end');\n }\n }\n }\n }\n };\n\n // Handle Tab key to exit editor and focus toolbar\n const handleIframeKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Tab' && !e.shiftKey) {\n e.preventDefault();\n onTabOutRef.current?.();\n }\n };\n\n iframeDoc.addEventListener('mousedown', handleIframeMouseDown);\n iframeDoc.addEventListener('mouseup', handleIframeMouseUp);\n iframeDoc.addEventListener('keydown', handleIframeKeyDown);\n\n // Auto-resize iframe based on content height (only if autoResize is enabled)\n if (autoResize) {\n const updateIframeHeight = () => {\n if (iframe.contentDocument?.body) {\n const contentHeight = iframe.contentDocument.body.scrollHeight;\n // Set min height from theme, grow with content\n // Convert rem to pixels using root font size\n const remValue = parseFloat(textAreaMinHeight) || 3;\n const rootFontSize =\n parseFloat(getComputedStyle(document.documentElement).fontSize) || 16;\n const minHeight = remValue * rootFontSize;\n iframe.style.height = `${Math.max(contentHeight + 16, minHeight)}px`;\n }\n };\n\n // Observe changes to iframe content\n if (iframeDoc.body && !resizeObserverRef.current) {\n resizeObserverRef.current = new ResizeObserver(updateIframeHeight);\n resizeObserverRef.current.observe(iframeDoc.body);\n }\n\n // Initial height update\n updateIframeHeight();\n }\n\n // Mark as initialized\n isInitializedRef.current = true;\n\n return () => {\n isInitializedRef.current = false;\n iframeDoc.removeEventListener('mousedown', handleIframeMouseDown);\n iframeDoc.removeEventListener('mouseup', handleIframeMouseUp);\n iframeDoc.removeEventListener('keydown', handleIframeKeyDown);\n if (resizeObserverRef.current) {\n resizeObserverRef.current.disconnect();\n resizeObserverRef.current = null;\n }\n // Defer unmounting to avoid race condition during React's render phase\n if (iframeRootRef.current) {\n const rootToUnmount = iframeRootRef.current;\n iframeRootRef.current = null;\n // Use setTimeout to defer unmount until after React finishes rendering\n setTimeout(() => {\n rootToUnmount.unmount();\n }, 0);\n }\n };\n }, [reinitializeCounter]);\n\n // Keep aria-required in sync when `required` prop changes\n useEffect(() => {\n const editorEl = iframeEditorRef.current?.getEditor()?.view.dom;\n if (!editorEl) return;\n\n if (required) {\n editorEl.setAttribute('aria-required', 'true');\n } else {\n editorEl.removeAttribute('aria-required');\n }\n }, [required]);\n\n return { iframeEditorRef };\n}\n"]}
1
+ {"version":3,"file":"useIframeSetup.js","sourceRoot":"","sources":["../../../../src/components/Editor/hooks/useIframeSetup.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAErE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAGvD,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,kDAAkD,CAAC;AACjF,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,EACpB,MAAM,gDAAgD,CAAC;AAGxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAsDhE,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,EACrC,SAAS,EACT,KAAK,EACL,gBAAgB,EAChB,cAAc,EACd,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,OAAO,EACP,MAAM,EACN,MAAM,EACN,UAAU,EACV,WAAW,EACX,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,kBAAkB,EAClB,YAAY,EACZ,QAAQ,EACR,QAAQ,EACR,eAAe,EACf,UAAU,EACV,UAAU,GAAG,IAAI,EACjB,QAAQ,EACR,gBAAgB,EAChB,uBAAuB,EACvB,MAAM,GAAG,KAAK,EACd,mBAAmB,GAAG,KAAK,EACN;IACrB,MAAM,EACJ,UAAU,EAAE,EACV,WAAW,EAAE,EAAE,YAAY,EAAE,iBAAiB,EAAE,EACjD,EACF,GAAG,KAAK,CAAC;IACV,MAAM,aAAa,GAAG,MAAM,CAAc,IAAI,CAAC,CAAC;IAChD,MAAM,eAAe,GAAG,MAAM,CAA4B,IAAI,CAAC,CAAC;IAChE,MAAM,iBAAiB,GAAG,MAAM,CAAwB,IAAI,CAAC,CAAC;IAC9D,MAAM,gBAAgB,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACvC,MAAM,eAAe,GAAG,MAAM,CAAgB,IAAI,CAAC,CAAC;IACpD,MAAM,CAAC,mBAAmB,EAAE,sBAAsB,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAElE,kEAAkE;IAClE,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IACrC,WAAW,CAAC,OAAO,GAAG,QAAQ,CAAC;IAE/B,MAAM,eAAe,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;IAC7C,eAAe,CAAC,OAAO,GAAG,YAAY,CAAC;IAEvC,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IACrC,WAAW,CAAC,OAAO,GAAG,QAAQ,CAAC;IAE/B,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IACrC,WAAW,CAAC,OAAO,GAAG,QAAQ,CAAC;IAE/B,MAAM,mBAAmB,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC;IACrD,mBAAmB,CAAC,OAAO,GAAG,gBAAgB,CAAC;IAE/C,MAAM,0BAA0B,GAAG,MAAM,CAAC,uBAAuB,CAAC,CAAC;IACnE,0BAA0B,CAAC,OAAO,GAAG,uBAAuB,CAAC;IAE7D,4EAA4E;IAC5E,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,SAAS,CAAC,OAAO;YAAE,OAAO;QAE/B,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC;QAEjC,MAAM,UAAU,GAAG,GAAG,EAAE;YACtB,4BAA4B;YAC5B,MAAM,WAAW,GAAG,MAAM,CAAC,eAAe,EAAE,aAAa,CAAC,cAAc,CAAC,CAAC;YAC1E,IAAI,CAAC,WAAW,IAAI,gBAAgB,CAAC,OAAO,EAAE,CAAC;gBAC7C,2EAA2E;gBAC3E,gBAAgB,CAAC,OAAO,GAAG,KAAK,CAAC;gBACjC,sBAAsB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACrC,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAE5C,OAAO,GAAG,EAAE;YACV,MAAM,CAAC,mBAAmB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QACjD,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAEhB,6BAA6B;IAC7B,eAAe,CAAC,GAAG,EAAE;QACnB,IAAI,CAAC,SAAS,CAAC,OAAO;YAAE,OAAO;QAE/B,0DAA0D;QAC1D,IAAI,gBAAgB,CAAC,OAAO,EAAE,CAAC;YAC7B,MAAM,WAAW,GAAG,SAAS,CAAC,OAAO,CAAC,eAAe,EAAE,aAAa,CAAC,cAAc,CAAC,CAAC;YACrF,IAAI,WAAW,EAAE,CAAC;gBAChB,iDAAiD;gBACjD,OAAO;YACT,CAAC;YACD,2DAA2D;YAC3D,IAAI,aAAa,CAAC,OAAO,EAAE,CAAC;gBAC1B,IAAI,CAAC;oBACH,aAAa,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;gBAClC,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,wBAAwB;gBAC1B,CAAC;gBACD,aAAa,CAAC,OAAO,GAAG,IAAI,CAAC;YAC/B,CAAC;YACD,IAAI,iBAAiB,CAAC,OAAO,EAAE,CAAC;gBAC9B,iBAAiB,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;gBACvC,iBAAiB,CAAC,OAAO,GAAG,IAAI,CAAC;YACnC,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC;QACjC,MAAM,SAAS,GAAG,MAAM,CAAC,eAAe,IAAI,MAAM,CAAC,aAAa,EAAE,QAAQ,CAAC;QAE3E,IAAI,CAAC,SAAS;YAAE,OAAO;QAEvB,kBAAkB;QAClB,MAAM,UAAU,GAAG,SAAS,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QAEvE,wEAAwE;QACxE,kDAAkD;QAClD,MAAM,sBAAsB,GAAG,mBAAmB;YAChD,CAAC,CAAC;;;;;;;;;KASH;YACC,CAAC,CAAC,EAAE,CAAC;QAEP,MAAM,YAAY,GAAG;QACjB,sBAAsB,CAAC,KAAK,CAAC;QAC7B,mBAAmB;QACnB,sBAAsB,CAAC,KAAK,CAAC;QAC7B,UAAU;QACV,sBAAsB,CAAC,KAAK,CAAC;QAC7B,WAAW,EAAE,YAAY,IAAI,EAAE;QAC/B,sBAAsB;KACzB,CAAC;QAEF,wCAAwC;QACxC,SAAS,CAAC,IAAI,EAAE,CAAC;QACjB,SAAS,CAAC,KAAK,CAAC;;;;kBAIF,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,WAAW,MAAM,CAAC,iBAAiB,GAAG,CAAC,CAAC,CAAC,EAAE;cAC1E,YAAY;;;;;;;KAOrB,CAAC,CAAC;QACH,SAAS,CAAC,KAAK,EAAE,CAAC;QAElB,qCAAqC;QACrC,MAAM,YAAY,GAChB,gBAAgB,EAAE,gBAAgB,CAAC,4BAA4B,CAAC,IAAK,EAAoB,CAAC;QAC5F,MAAM,WAAW,GACf,QAAQ,CAAC,gBAAgB,CAAC,4BAA4B,CAAC,IAAK,EAAoB,CAAC;QACnF,MAAM,UAAU,GAAG,SAAS,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QACnD,CAAC,GAAG,YAAY,EAAE,GAAG,WAAW,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YAChD,UAAU,EAAE,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,uCAAuC;QACvC,IAAI,cAAc,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;YACxE,MAAM,YAAY,GAAG,MAAM,CAAC,aAA6C,CAAC;YAC1E,cAAc,CAAC,OAAO,CAAC,CAAC,SAA0B,EAAE,EAAE;gBACpD,IACE,SAAS,CAAC,IAAI;oBACd,SAAS,CAAC,mBAAmB;oBAC7B,CAAC,YAAY,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,EAChD,CAAC;oBACD,MAAM,aAAa,GAAG,SAAS,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC;oBAClE,YAAY,CAAC,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;gBACpE,CAAC;gBAED,yDAAyD;gBACzD,IAAI,SAAS,CAAC,KAAK,IAAI,UAAU,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC;oBACpD,MAAM,OAAO,GAAG,oBAAoB,SAAS,CAAC,IAAI,EAAE,CAAC;oBACrD,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;wBACvC,MAAM,YAAY,GAAG,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;wBACtD,YAAY,CAAC,EAAE,GAAG,OAAO,CAAC;wBAC1B,YAAY,CAAC,WAAW,GAAG,SAAS,CAAC,KAAK,CAAC;wBAC3C,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;4BAC7B,YAAY,CAAC,KAAK,GAAG,MAAM,CAAC,iBAAiB,CAAC;wBAChD,CAAC;wBACD,UAAU,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;oBACvC,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QAED,sCAAsC;QACtC,MAAM,WAAW,GAAG,SAAS,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;QAC5D,IAAI,WAAW,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;YAC1C,6EAA6E;YAC7E,MAAM,cAAc,GAAG,eAAe,CAAC,OAAO,IAAI,YAAY,CAAC;YAE/D,aAAa,CAAC,OAAO,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;YAChD,aAAa,CAAC,OAAO,CAAC,MAAM,CAC1B,KAAC,kBAAkB,IACjB,WAAW,EAAE,WAAW,EACxB,YAAY,EAAE,cAAc,EAC5B,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,MAAM,CAAC,EAAE;oBACjB,uEAAuE;oBACvE,eAAe,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;oBAC3C,WAAW,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC;gBAChC,CAAC,EACD,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,GAAG,EAAE;oBACZ,UAAU,CAAC,IAAI,CAAC,CAAC;oBACjB,OAAO,EAAE,EAAE,CAAC;gBACd,CAAC,EACD,MAAM,EAAE,GAAG,EAAE;oBACX,UAAU,CAAC,KAAK,CAAC,CAAC;oBAClB,MAAM,EAAE,EAAE,CAAC;gBACb,CAAC,EACD,MAAM,EAAE,CAAC,MAAoB,EAAE,EAAE;oBAC/B,kFAAkF;oBAClF,eAAe,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;oBAC3C,mDAAmD;oBACnD,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;wBACxB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;oBACxD,CAAC;oBACD,eAAe,CAAC,MAAM,CAAC,CAAC;oBACxB,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC;gBACnB,CAAC,EACD,SAAS,EAAE,eAAe,EAC1B,UAAU,EAAE,UAAU,EACtB,cAAc,EAAE,cAAc,EAC9B,WAAW,EAAE,WAAW,EACxB,YAAY,EAAE,CAAC,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,EAAE,OAAO,CAAC,EACnF,aAAa,EAAE,aAAa,EAC5B,YAAY,EAAE,YAAY,EAC1B,kBAAkB,EAAE,kBAAkB,EACtC,eAAe,EAAE,YAAY,EAC7B,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM,EACd,mBAAmB,EAAE,mBAAmB,EACxC,gBAAgB,EAAE,GAAG,EAAE,CAAC,mBAAmB,CAAC,OAAO,EAAE,EAAE,EACvD,uBAAuB,EAAE,GAAG,EAAE;oBAC5B,0BAA0B,CAAC,OAAO,EAAE,EAAE,CAAC;gBACzC,CAAC,GACD,CACH,CAAC;QACJ,CAAC;QAED,yEAAyE;QACzE,MAAM,qBAAqB,GAAG,CAAC,CAAa,EAAE,EAAE;YAC9C,MAAM,MAAM,GAAG,CAAC,CAAC,MAAqB,CAAC;YACvC,2FAA2F;YAC3F,IACE,MAAM,KAAK,SAAS,CAAC,eAAe;gBACpC,MAAM,KAAK,SAAS,CAAC,IAAI;gBACzB,MAAM,CAAC,EAAE,KAAK,aAAa,EAC3B,CAAC;gBACD,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC;gBACpD,IAAI,MAAM,EAAE,CAAC;oBACX,wDAAwD;oBACxD,kEAAkE;oBAClE,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;oBACzE,IAAI,GAAG,EAAE,CAAC;wBACR,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;wBAC1C,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;oBAC1B,CAAC;yBAAM,CAAC;wBACN,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;oBAC/B,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC,CAAC;QAEF,0EAA0E;QAC1E,MAAM,mBAAmB,GAAG,CAAC,CAAa,EAAE,EAAE;YAC5C,MAAM,MAAM,GAAG,CAAC,CAAC,MAAqB,CAAC;YACvC,wFAAwF;YACxF,IACE,MAAM,KAAK,SAAS,CAAC,eAAe;gBACpC,MAAM,KAAK,SAAS,CAAC,IAAI;gBACzB,MAAM,CAAC,EAAE,KAAK,aAAa;gBAC3B,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,EACxC,CAAC;gBACD,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC;gBACpD,IAAI,MAAM,EAAE,CAAC;oBACX,0EAA0E;oBAC1E,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC;oBAC5C,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;wBAChB,4DAA4D;wBAC5D,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;wBACzE,IAAI,GAAG,EAAE,CAAC;4BACR,uCAAuC;4BACvC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;4BAC1C,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;wBAC1B,CAAC;6BAAM,CAAC;4BACN,mDAAmD;4BACnD,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;wBAC/B,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC,CAAC;QAEF,+DAA+D;QAC/D,oEAAoE;QACpE,MAAM,mBAAmB,GAAG,CAAC,CAAgB,EAAE,EAAE;YAC/C,IAAI,CAAC,CAAC,GAAG,KAAK,KAAK,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;gBAC3E,CAAC,CAAC,cAAc,EAAE,CAAC;gBACnB,WAAW,CAAC,OAAO,EAAE,EAAE,CAAC;gBACxB,OAAO;YACT,CAAC;YACD,IAAI,CAAC,CAAC,GAAG,KAAK,KAAK,EAAE,CAAC;gBACpB,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC;gBACpD,IAAI,MAAM,EAAE,CAAC;oBACX,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;oBAC7C,IAAI,QAAQ,EAAE,CAAC;wBACb,CAAC,CAAC,cAAc,EAAE,CAAC;wBACnB,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;4BACf,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;wBACxD,CAAC;6BAAM,CAAC;4BACN,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;wBACxD,CAAC;wBACD,OAAO;oBACT,CAAC;gBACH,CAAC;gBACD,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;oBAChB,CAAC,CAAC,cAAc,EAAE,CAAC;oBACnB,WAAW,CAAC,OAAO,EAAE,EAAE,CAAC;gBAC1B,CAAC;YACH,CAAC;QACH,CAAC,CAAC;QAEF,SAAS,CAAC,gBAAgB,CAAC,WAAW,EAAE,qBAAqB,CAAC,CAAC;QAC/D,SAAS,CAAC,gBAAgB,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;QAC3D,SAAS,CAAC,gBAAgB,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;QAE3D,6EAA6E;QAC7E,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,kBAAkB,GAAG,GAAG,EAAE;gBAC9B,IAAI,MAAM,CAAC,eAAe,EAAE,IAAI,EAAE,CAAC;oBACjC,MAAM,aAAa,GAAG,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC;oBAC/D,+CAA+C;oBAC/C,6CAA6C;oBAC7C,MAAM,QAAQ,GAAG,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;oBACpD,MAAM,YAAY,GAChB,UAAU,CAAC,gBAAgB,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;oBACxE,MAAM,SAAS,GAAG,QAAQ,GAAG,YAAY,CAAC;oBAC1C,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,GAAG,EAAE,EAAE,SAAS,CAAC,IAAI,CAAC;gBACvE,CAAC;YACH,CAAC,CAAC;YAEF,oCAAoC;YACpC,IAAI,SAAS,CAAC,IAAI,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,CAAC;gBACjD,iBAAiB,CAAC,OAAO,GAAG,IAAI,cAAc,CAAC,kBAAkB,CAAC,CAAC;gBACnE,iBAAiB,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YACpD,CAAC;YAED,wBAAwB;YACxB,kBAAkB,EAAE,CAAC;QACvB,CAAC;QAED,sBAAsB;QACtB,gBAAgB,CAAC,OAAO,GAAG,IAAI,CAAC;QAEhC,OAAO,GAAG,EAAE;YACV,gBAAgB,CAAC,OAAO,GAAG,KAAK,CAAC;YACjC,SAAS,CAAC,mBAAmB,CAAC,WAAW,EAAE,qBAAqB,CAAC,CAAC;YAClE,SAAS,CAAC,mBAAmB,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;YAC9D,SAAS,CAAC,mBAAmB,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;YAC9D,IAAI,iBAAiB,CAAC,OAAO,EAAE,CAAC;gBAC9B,iBAAiB,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;gBACvC,iBAAiB,CAAC,OAAO,GAAG,IAAI,CAAC;YACnC,CAAC;YACD,uEAAuE;YACvE,IAAI,aAAa,CAAC,OAAO,EAAE,CAAC;gBAC1B,MAAM,aAAa,GAAG,aAAa,CAAC,OAAO,CAAC;gBAC5C,aAAa,CAAC,OAAO,GAAG,IAAI,CAAC;gBAC7B,uEAAuE;gBACvE,UAAU,CAAC,GAAG,EAAE;oBACd,aAAa,CAAC,OAAO,EAAE,CAAC;gBAC1B,CAAC,EAAE,CAAC,CAAC,CAAC;YACR,CAAC;QACH,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAE1B,0DAA0D;IAC1D,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC;QAChE,IAAI,CAAC,QAAQ;YAAE,OAAO;QAEtB,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;QACjD,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,OAAO,EAAE,eAAe,EAAE,CAAC;AAC7B,CAAC","sourcesContent":["import { useLayoutEffect, useRef, useState, useEffect } from 'react';\nimport type { RefObject, MutableRefObject } from 'react';\nimport { createRoot } from 'react-dom/client';\nimport type { Root } from 'react-dom/client';\nimport { compile, serialize, stringify } from 'stylis';\nimport type { Editor as TiptapEditor } from '@tiptap/core';\n\nimport { useTheme } 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 type { CustomComponent, EditorProps } from '../Editor.types';\nimport { IframeTiptapEditor } from '../IframeTiptapEditor';\nimport { getIframeContentStyles } from '../iframeContentStyles';\n\ninterface UseIframeSetupParams {\n iframeRef: RefObject<HTMLIFrameElement>;\n theme: ReturnType<typeof useTheme>;\n styleSheetTarget?: HTMLElement | ShadowRoot;\n customElements: CustomComponent[];\n placeholder?: string;\n defaultValue?: string;\n disabled?: boolean;\n readOnly?: boolean;\n onChange?: (editor: TiptapEditor) => void;\n onKeyDown?: (event?: KeyboardEvent) => void;\n onFocus?: () => void;\n onBlur?: () => void;\n onInit?: (editor: TiptapEditor) => void;\n spellcheck?: boolean;\n initOptions?: EditorProps['initOptions'];\n onImageAdded?: (image: File, id: string, altText?: string) => void;\n imagesEnabled: boolean;\n linksEnabled: boolean;\n imageInsertionMode: 'file' | 'url' | 'all';\n pastedImages: MutableRefObject<File[]>;\n editorId: string;\n required?: boolean;\n setTiptapEditor: (editor: TiptapEditor) => void;\n setFocused: (focused: boolean) => void;\n autoResize?: boolean;\n onTabOut?: () => void;\n onFocusTableMenu?: () => void;\n onFocusPreviousCellMenu?: () => void;\n secure?: boolean;\n preserveTableStyles?: boolean;\n}\n\nexport interface IframeEditorHandle {\n focus: () => void;\n getPlainText: () => string;\n getRichText: () => string;\n getHtml: () => string;\n clear: () => void;\n insertText: (text: string) => void;\n setCursorLocationToStart: () => void;\n insertHtml: (html: string, overwrite?: boolean) => void;\n getEditor: () => TiptapEditor | null;\n setEditable: (editable: boolean) => void;\n}\n\nexport type IframeEditorRef = MutableRefObject<IframeEditorHandle | null>;\n\ninterface UseIframeSetupReturn {\n iframeEditorRef: IframeEditorRef;\n}\n\nexport default function useIframeSetup({\n iframeRef,\n theme,\n styleSheetTarget,\n customElements,\n placeholder,\n defaultValue,\n disabled,\n readOnly,\n onChange,\n onKeyDown,\n onFocus,\n onBlur,\n onInit,\n spellcheck,\n initOptions,\n onImageAdded,\n imagesEnabled,\n linksEnabled,\n imageInsertionMode,\n pastedImages,\n editorId,\n required,\n setTiptapEditor,\n setFocused,\n autoResize = true,\n onTabOut,\n onFocusTableMenu,\n onFocusPreviousCellMenu,\n secure = false,\n preserveTableStyles = false\n}: UseIframeSetupParams): UseIframeSetupReturn {\n const {\n components: {\n 'text-area': { 'min-height': textAreaMinHeight }\n }\n } = theme;\n const iframeRootRef = useRef<Root | null>(null);\n const iframeEditorRef = useRef<IframeEditorHandle | null>(null);\n const resizeObserverRef = useRef<ResizeObserver | null>(null);\n const isInitializedRef = useRef(false);\n const savedContentRef = useRef<string | null>(null);\n const [reinitializeCounter, setReinitializeCounter] = useState(0);\n\n // Refs to keep callbacks fresh without re-initializing the iframe\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n\n const onImageAddedRef = useRef(onImageAdded);\n onImageAddedRef.current = onImageAdded;\n\n const onTabOutRef = useRef(onTabOut);\n onTabOutRef.current = onTabOut;\n\n const requiredRef = useRef(required);\n requiredRef.current = required;\n\n const onFocusTableMenuRef = useRef(onFocusTableMenu);\n onFocusTableMenuRef.current = onFocusTableMenu;\n\n const onFocusPreviousCellMenuRef = useRef(onFocusPreviousCellMenu);\n onFocusPreviousCellMenuRef.current = onFocusPreviousCellMenu;\n\n // Listen for iframe load events (fires when iframe reloads due to DOM move)\n useEffect(() => {\n if (!iframeRef.current) return;\n\n const iframe = iframeRef.current;\n\n const handleLoad = () => {\n // Check if content was lost\n const proseMirror = iframe.contentDocument?.querySelector('.ProseMirror');\n if (!proseMirror && isInitializedRef.current) {\n // savedContentRef is updated on every change, so it has the latest content\n isInitializedRef.current = false;\n setReinitializeCounter(c => c + 1);\n }\n };\n\n iframe.addEventListener('load', handleLoad);\n\n return () => {\n iframe.removeEventListener('load', handleLoad);\n };\n }, [iframeRef]);\n\n // Mount Tiptap inside iframe\n useLayoutEffect(() => {\n if (!iframeRef.current) return;\n\n // Check if already initialized and content is still valid\n if (isInitializedRef.current) {\n const proseMirror = iframeRef.current.contentDocument?.querySelector('.ProseMirror');\n if (proseMirror) {\n // Already initialized and content is valid, skip\n return;\n }\n // Content was lost (iframe reloaded), need to reinitialize\n if (iframeRootRef.current) {\n try {\n iframeRootRef.current.unmount();\n } catch (e) {\n // Ignore unmount errors\n }\n iframeRootRef.current = null;\n }\n if (resizeObserverRef.current) {\n resizeObserverRef.current.disconnect();\n resizeObserverRef.current = null;\n }\n }\n\n const iframe = iframeRef.current;\n const iframeDoc = iframe.contentDocument || iframe.contentWindow?.document;\n\n if (!iframeDoc) return;\n\n // Generate styles\n const htmlStyles = serialize(compile(getHtmlStyles(theme)), stringify);\n\n // When preserving table styles, remove the default Tiptap table borders\n // so only the original inline styles show through\n const preserveTableStylesCSS = preserveTableStyles\n ? `\n .ProseMirror table,\n .ProseMirror table tr,\n .ProseMirror table td,\n .ProseMirror table th,\n .ProseMirror table tr td,\n .ProseMirror table tr th {\n border: 0 none transparent;\n }\n `\n : '';\n\n const contentStyle = `\n ${createGlobalRootStyles(theme)}\n ${globalSpacingStyles}\n ${createGlobalBodyStyles(theme)}\n ${htmlStyles}\n ${getIframeContentStyles(theme)}\n ${initOptions?.contentStyle ?? ''}\n ${preserveTableStylesCSS}\n `;\n\n // Create basic HTML structure in iframe\n iframeDoc.open();\n iframeDoc.write(`\n <!DOCTYPE html>\n <html>\n <head>\n <style${window.__webpack_nonce__ ? ` nonce=\"${window.__webpack_nonce__}\"` : ''}>\n ${contentStyle}\n </style>\n </head>\n <body>\n <div id=\"tiptap-root\"></div>\n </body>\n </html>\n `);\n iframeDoc.close();\n\n // Copy global styles into the iframe\n const globalStyles =\n styleSheetTarget?.querySelectorAll('[data-cosmos-global-style]') ?? ([] as HTMLElement[]);\n const extraStyles =\n document.querySelectorAll('[data-cosmos-global-style]') ?? ([] as HTMLElement[]);\n const iframeHead = iframeDoc.querySelector('head');\n [...globalStyles, ...extraStyles].forEach(sheet => {\n iframeHead?.appendChild(sheet.cloneNode(true));\n });\n\n // Register custom components in iframe\n if (customElements && customElements.length > 0 && iframe.contentWindow) {\n const iframeWindow = iframe.contentWindow as unknown as typeof globalThis;\n customElements.forEach((component: CustomComponent) => {\n if (\n component.name &&\n component.createCustomElement &&\n !iframeWindow.customElements.get(component.name)\n ) {\n const CustomElement = component.createCustomElement(iframeWindow);\n iframeWindow.customElements.define(component.name, CustomElement);\n }\n\n // Inject custom component styles into iframe if provided\n if (component.style && iframeHead && component.name) {\n const styleId = `custom-component-${component.name}`;\n if (!iframeDoc.getElementById(styleId)) {\n const styleElement = iframeDoc.createElement('style');\n styleElement.id = styleId;\n styleElement.textContent = component.style;\n if (window.__webpack_nonce__) {\n styleElement.nonce = window.__webpack_nonce__;\n }\n iframeHead.appendChild(styleElement);\n }\n }\n });\n }\n\n // Mount React component inside iframe\n const rootElement = iframeDoc.getElementById('tiptap-root');\n if (rootElement && !iframeRootRef.current) {\n // Use saved content if available (from DOM move), otherwise use defaultValue\n const initialContent = savedContentRef.current ?? defaultValue;\n\n iframeRootRef.current = createRoot(rootElement);\n iframeRootRef.current.render(\n <IframeTiptapEditor\n placeholder={placeholder}\n defaultValue={initialContent}\n disabled={disabled}\n readOnly={readOnly}\n onChange={editor => {\n // Save content on every change so it can be restored if iframe reloads\n savedContentRef.current = editor.getHTML();\n onChangeRef.current?.(editor);\n }}\n onKeyDown={onKeyDown}\n onFocus={() => {\n setFocused(true);\n onFocus?.();\n }}\n onBlur={() => {\n setFocused(false);\n onBlur?.();\n }}\n onInit={(editor: TiptapEditor) => {\n // Save initial content so it can be restored if iframe reloads before any changes\n savedContentRef.current = editor.getHTML();\n // Set aria-required on the contenteditable element\n if (requiredRef.current) {\n editor.view.dom.setAttribute('aria-required', 'true');\n }\n setTiptapEditor(editor);\n onInit?.(editor);\n }}\n editorRef={iframeEditorRef}\n spellcheck={spellcheck}\n customElements={customElements}\n initOptions={initOptions}\n onImageAdded={(image, id, altText) => onImageAddedRef.current?.(image, id, altText)}\n imagesEnabled={imagesEnabled}\n linksEnabled={linksEnabled}\n imageInsertionMode={imageInsertionMode}\n pastedImagesRef={pastedImages}\n editorId={editorId}\n secure={secure}\n preserveTableStyles={preserveTableStyles}\n onFocusTableMenu={() => onFocusTableMenuRef.current?.()}\n onFocusPreviousCellMenu={() => {\n onFocusPreviousCellMenuRef.current?.();\n }}\n />\n );\n }\n\n // Handle mousedown on empty space to enable drag-to-select from anywhere\n const handleIframeMouseDown = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n // Only handle mousedown on empty space (not on actual content like paragraphs, text nodes)\n if (\n target === iframeDoc.documentElement ||\n target === iframeDoc.body ||\n target.id === 'tiptap-root'\n ) {\n const editor = iframeEditorRef.current?.getEditor();\n if (editor) {\n // Find nearest document position and place cursor there\n // This allows ProseMirror to handle the subsequent drag selection\n const pos = editor.view.posAtCoords({ left: e.clientX, top: e.clientY });\n if (pos) {\n editor.commands.setTextSelection(pos.pos);\n editor.commands.focus();\n } else {\n editor.commands.focus('end');\n }\n }\n }\n };\n\n // Handle mouseup on empty space to place cursor/deselect on simple clicks\n const handleIframeMouseUp = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n // Only handle clicks on empty space (html, body, tiptap-root, or ProseMirror container)\n if (\n target === iframeDoc.documentElement ||\n target === iframeDoc.body ||\n target.id === 'tiptap-root' ||\n target.classList.contains('ProseMirror')\n ) {\n const editor = iframeEditorRef.current?.getEditor();\n if (editor) {\n // Check if user has a text selection (from drag) - if so, don't interfere\n const { from, to } = editor.state.selection;\n if (from === to) {\n // Selection is collapsed (no text selected), treat as click\n const pos = editor.view.posAtCoords({ left: e.clientX, top: e.clientY });\n if (pos) {\n // Place cursor at the nearest position\n editor.commands.setTextSelection(pos.pos);\n editor.commands.focus();\n } else {\n // Fallback to end of document if no position found\n editor.commands.focus('end');\n }\n }\n }\n }\n };\n\n // Handle Tab key - indent list items or exit editor to toolbar\n // Handle Alt+F10 - standard accessibility shortcut to focus toolbar\n const handleIframeKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'F10' && e.altKey && !e.ctrlKey && !e.shiftKey && !e.metaKey) {\n e.preventDefault();\n onTabOutRef.current?.();\n return;\n }\n if (e.key === 'Tab') {\n const editor = iframeEditorRef.current?.getEditor();\n if (editor) {\n const isInList = editor.isActive('listItem');\n if (isInList) {\n e.preventDefault();\n if (e.shiftKey) {\n editor.chain().focus().liftListItem('listItem').run();\n } else {\n editor.chain().focus().sinkListItem('listItem').run();\n }\n return;\n }\n }\n if (!e.shiftKey) {\n e.preventDefault();\n onTabOutRef.current?.();\n }\n }\n };\n\n iframeDoc.addEventListener('mousedown', handleIframeMouseDown);\n iframeDoc.addEventListener('mouseup', handleIframeMouseUp);\n iframeDoc.addEventListener('keydown', handleIframeKeyDown);\n\n // Auto-resize iframe based on content height (only if autoResize is enabled)\n if (autoResize) {\n const updateIframeHeight = () => {\n if (iframe.contentDocument?.body) {\n const contentHeight = iframe.contentDocument.body.scrollHeight;\n // Set min height from theme, grow with content\n // Convert rem to pixels using root font size\n const remValue = parseFloat(textAreaMinHeight) || 3;\n const rootFontSize =\n parseFloat(getComputedStyle(document.documentElement).fontSize) || 16;\n const minHeight = remValue * rootFontSize;\n iframe.style.height = `${Math.max(contentHeight + 16, minHeight)}px`;\n }\n };\n\n // Observe changes to iframe content\n if (iframeDoc.body && !resizeObserverRef.current) {\n resizeObserverRef.current = new ResizeObserver(updateIframeHeight);\n resizeObserverRef.current.observe(iframeDoc.body);\n }\n\n // Initial height update\n updateIframeHeight();\n }\n\n // Mark as initialized\n isInitializedRef.current = true;\n\n return () => {\n isInitializedRef.current = false;\n iframeDoc.removeEventListener('mousedown', handleIframeMouseDown);\n iframeDoc.removeEventListener('mouseup', handleIframeMouseUp);\n iframeDoc.removeEventListener('keydown', handleIframeKeyDown);\n if (resizeObserverRef.current) {\n resizeObserverRef.current.disconnect();\n resizeObserverRef.current = null;\n }\n // Defer unmounting to avoid race condition during React's render phase\n if (iframeRootRef.current) {\n const rootToUnmount = iframeRootRef.current;\n iframeRootRef.current = null;\n // Use setTimeout to defer unmount until after React finishes rendering\n setTimeout(() => {\n rootToUnmount.unmount();\n }, 0);\n }\n };\n }, [reinitializeCounter]);\n\n // Keep aria-required in sync when `required` prop changes\n useEffect(() => {\n const editorEl = iframeEditorRef.current?.getEditor()?.view.dom;\n if (!editorEl) return;\n\n if (required) {\n editorEl.setAttribute('aria-required', 'true');\n } else {\n editorEl.removeAttribute('aria-required');\n }\n }, [required]);\n\n return { iframeEditorRef };\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pega/cosmos-react-rte",
3
- "version": "10.0.0-build.3.0",
3
+ "version": "10.0.0-build.3.2",
4
4
  "license": "SEE LICENSE IN LICENSE",
5
5
  "author": "Pegasystems",
6
6
  "sideEffects": false,
@@ -15,7 +15,7 @@
15
15
  },
16
16
  "dependencies": {
17
17
  "@intevation/tiptap-extension-office-paste": "^0.1.2",
18
- "@pega/cosmos-react-core": "10.0.0-build.3.0",
18
+ "@pega/cosmos-react-core": "10.0.0-build.3.2",
19
19
  "@popperjs/core": "^2.11.6",
20
20
  "@tiptap/core": "^3.12.1",
21
21
  "@tiptap/extension-blockquote": "^3.12.1",