@pega/cosmos-react-rte 10.0.0-build.4.3 → 10.0.0-build.4.5

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":"Editor.d.ts","sourceRoot":"","sources":["../../../src/components/Editor/Editor.tsx"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,yBAAyB,CAAC;AAM/E,OAAO,KAAK,EAAE,WAAW,EAAgC,MAAM,gBAAgB,CAAC;;;;AA+qBhF,wBAAqD"}
1
+ {"version":3,"file":"Editor.d.ts","sourceRoot":"","sources":["../../../src/components/Editor/Editor.tsx"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,yBAAyB,CAAC;AAM/E,OAAO,KAAK,EAAE,WAAW,EAAgC,MAAM,gBAAgB,CAAC;;;;AAmrBhF,wBAAqD"}
@@ -67,6 +67,8 @@ const Editor = forwardRef(function ForwardedEditor(props, ref) {
67
67
  const tablesEnabled = toolbar?.includes('tables') ?? false;
68
68
  // Check if links feature is enabled (controls autolink behavior)
69
69
  const linksEnabled = toolbar?.includes('links') ?? false;
70
+ // Check if text color feature is enabled
71
+ const colorsEnabled = toolbar?.includes('text-color') ?? false;
70
72
  // Define built-in custom components and merge with user-provided ones
71
73
  const customElements = useMemo(() => {
72
74
  const FileItemStyle = css `
@@ -119,6 +121,7 @@ const Editor = forwardRef(function ForwardedEditor(props, ref) {
119
121
  onImageAdded,
120
122
  imagesEnabled,
121
123
  linksEnabled,
124
+ colorsEnabled,
122
125
  imageInsertionMode,
123
126
  pastedImages,
124
127
  editorId,
@@ -1 +1 @@
1
- {"version":3,"file":"Editor.js","sourceRoot":"","sources":["../../../src/components/Editor/Editor.tsx"],"names":[],"mappings":"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","sourcesContent":["import type { Editor as TiptapEditor } from '@tiptap/core';\nimport {\n forwardRef,\n useEffect,\n useRef,\n useState,\n useImperativeHandle,\n useMemo,\n useCallback\n} from 'react';\nimport type { PropsWithoutRef, ReactNode, RefObject } from 'react';\nimport { css } from 'styled-components';\n\nimport {\n FormControl,\n Progress,\n HiddenText,\n useAfterInitialEffect,\n useTheme,\n useUID,\n useConsolidatedRef,\n useTestIds,\n withTestIds,\n useConfiguration,\n useI18n\n} from '@pega/cosmos-react-core';\nimport type { ForwardRefForwardPropsComponent } from '@pega/cosmos-react-core';\n\nimport StyledRichTextEditor from '../RichTextEditor/RichTextEditor.styles';\nimport type { Features } from '../RichTextEditor/Toolbar/Toolbar.types';\n\nimport EditorContext from './Editor.context';\nimport type { EditorProps, EditorState, CustomComponent } from './Editor.types';\nimport {\n StyledEditorContainer,\n StyledEditorIframe,\n StyledEditorRoot,\n StyledSourceTextarea\n} from './Editor.styles';\nimport { getEditorTestIds } from './Editor.test-ids';\nimport Toolbar from './Toolbar/Toolbar';\nimport WordCount from './Toolbar/WordCount';\nimport { ImageEditDialog } from './ImageEditDialog';\nimport type { ImageAttributes } from './ImageEditDialog';\nimport ImageActionButtons from './ImageActionButtons';\nimport TableCellMenu from './TableCellMenu';\nimport createFileItemElement from './FileItemElement';\nimport useIframeSetup from './hooks/useIframeSetup';\nimport useImageActions from './hooks/useImageActions';\nimport useTableCellMenu from './hooks/useTableCellMenu';\nimport { dispatchEditorClickEvent } from './hooks/useCloseOnEditorClick';\nimport sanitizeHtml from './sanitize';\n\n// Suggestion editor has no toolbar — formatting controls are intentionally omitted\nconst SUGGESTION_TOOLBAR: Features[] = [];\n\ninterface SuggestionEditorRenderProps {\n ref: RefObject<EditorState>;\n onInit: (tiptapEditor: TiptapEditor) => void;\n onChange: (editor?: TiptapEditor) => void;\n}\n\ninterface SuggestionEditorProps {\n defaultValue?: string;\n disabled: boolean;\n readOnly: boolean;\n onGetContent: (getContent: () => string) => void;\n onContentChange: (hasContent: boolean) => void;\n /** Render prop — receives ref and callbacks; must render an Editor-like element */\n renderEditor: (renderProps: SuggestionEditorRenderProps) => ReactNode;\n}\n\nconst SuggestionEditor = ({\n defaultValue,\n onGetContent,\n onContentChange,\n renderEditor\n}: SuggestionEditorProps) => {\n const editorRef = useRef<EditorState>(null);\n\n useEffect(() => {\n onGetContent(() => editorRef.current?.getEditor()?.getHTML() ?? '');\n }, [onGetContent]);\n\n useAfterInitialEffect(() => {\n editorRef.current?.getEditor()?.commands.setContent(defaultValue ?? '');\n }, [defaultValue]);\n\n return renderEditor({\n ref: editorRef,\n onInit: tiptapEditor => {\n // Signal initial content state so submit button enables correctly\n onContentChange(tiptapEditor.getText().trim() !== '');\n },\n onChange: editor => {\n onContentChange((editor?.getText() ?? '').trim() !== '');\n }\n });\n};\n\nconst Editor: ForwardRefForwardPropsComponent<EditorProps> = forwardRef(function ForwardedEditor(\n props: PropsWithoutRef<EditorProps>,\n ref: EditorProps['ref']\n) {\n const {\n testId,\n id,\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 suggestion,\n onInit,\n onUnload,\n defaultValue,\n placeholder,\n children,\n additionalInfo,\n toolbar,\n customActions,\n customComponents = [],\n spellcheck = true,\n imageInsertionMode = 'all',\n initOptions,\n onRewriteClick,\n linkCustomSource,\n imageCustomSource,\n progress,\n autoFocus,\n height,\n autoResize = true,\n secure = false,\n preserveTableStyles = false,\n ...restProps\n } = props;\n\n const theme = useTheme();\n const { styleSheetTarget } = useConfiguration();\n const t = useI18n();\n const [focused, setFocused] = useState(false);\n const [tiptapEditor, setTiptapEditor] = useState<TiptapEditor | null>(null);\n const [imageEditDialog, setImageEditDialog] = useState<{\n isOpen: boolean;\n attributes: ImageAttributes | null;\n }>({ isOpen: false, attributes: null });\n const [sourceMode, setSourceMode] = useState(false);\n const [sourceCode, setSourceCode] = useState('');\n const editButtonRef = useRef<HTMLButtonElement>(null);\n const tableCellMenuButtonRef = useRef<HTMLButtonElement>(null);\n const editorContainerRef = useRef<HTMLDivElement>(null);\n const generatedId = useUID();\n const editorId = id ?? generatedId;\n const labelId = useUID();\n const requiredDescriptionId = `${editorId}-required`;\n const editorRef = useConsolidatedRef(ref);\n const formFieldRef = useRef<HTMLElement>(null);\n const pastedImages = useRef<File[]>([]);\n const iframeRef = useRef<HTMLIFrameElement>(null);\n const pendingImageActionUrlsRef = useRef<Map<string, string>>(new Map());\n\n const testIds = useTestIds(testId, getEditorTestIds);\n\n // Check if images feature is enabled\n const imagesEnabled = toolbar?.includes('images') ?? false;\n\n // Check if tables feature is enabled\n const tablesEnabled = toolbar?.includes('tables') ?? false;\n\n // Check if links feature is enabled (controls autolink behavior)\n const linksEnabled = toolbar?.includes('links') ?? false;\n\n // Define built-in custom components and merge with user-provided ones\n const customElements: CustomComponent[] = useMemo(() => {\n const FileItemStyle = css`\n /* stylelint-disable-next-line selector-type-no-unknown */\n pega-file {\n display: inline-block;\n width: ${theme.base['content-width'].md};\n }\n `;\n\n return [\n {\n createCustomElement: createFileItemElement,\n name: 'pega-file',\n style: FileItemStyle.toString(),\n extensionAttributes: ['contenteditable']\n },\n ...customComponents\n ];\n }, [customComponents, theme]);\n\n // Register custom elements in the main window (needed for Tiptap to recognize them)\n useEffect(() => {\n customElements.forEach((component: CustomComponent) => {\n if (\n component.name &&\n component.createCustomElement &&\n !window.customElements.get(component.name)\n ) {\n const CustomElement = component.createCustomElement(window);\n window.customElements.define(component.name, CustomElement);\n }\n });\n }, [customElements]);\n\n // Sanitize defaultValue if secure mode is enabled\n const sanitizedDefaultValue = useMemo(\n () => (secure && defaultValue ? sanitizeHtml(defaultValue) : defaultValue),\n [secure, defaultValue]\n );\n\n // Mount Tiptap inside iframe using custom hook\n const { iframeEditorRef } = useIframeSetup({\n iframeRef,\n theme,\n styleSheetTarget,\n customElements,\n placeholder,\n defaultValue: sanitizedDefaultValue,\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,\n secure,\n preserveTableStyles,\n onTabOut: () => {\n // Focus first toolbar button when Tab is pressed in editor\n const toolbarEl = editorContainerRef.current?.querySelector('[data-testid$=\"toolbar\"]');\n const firstButton = toolbarEl?.querySelector<HTMLElement>('button:not([disabled])');\n if (firstButton) {\n firstButton.focus();\n }\n },\n onFocusTableMenu: () => {\n tableCellMenuButtonRef.current?.focus();\n },\n onFocusPreviousCellMenu: () => {\n // Go to previous cell and then focus its menu\n if (tiptapEditor) {\n tiptapEditor.commands.goToPreviousCell();\n setTimeout(() => {\n tableCellMenuButtonRef.current?.focus();\n }, 0);\n }\n }\n });\n\n // Set up unload event listener to save content before iframe is destroyed\n useEffect(() => {\n if (!iframeRef.current?.contentWindow || !onUnload) return;\n\n const iframeWindow = iframeRef.current.contentWindow;\n const abortController = new AbortController();\n\n iframeWindow.addEventListener(\n 'unload',\n () => {\n const html = iframeEditorRef.current?.getHtml() ?? '';\n onUnload(html);\n },\n { signal: abortController.signal }\n );\n\n return () => {\n abortController.abort();\n };\n }, [onUnload]);\n\n // Dispatch event on iframe mousedown to close all open popovers/menus\n useEffect(() => {\n const iframeDoc = iframeRef.current?.contentDocument;\n if (!iframeDoc) return;\n\n const handleMouseDown = () => {\n dispatchEditorClickEvent();\n };\n\n iframeDoc.addEventListener('mousedown', handleMouseDown);\n return () => iframeDoc.removeEventListener('mousedown', handleMouseDown);\n }, [tiptapEditor]);\n\n // Set up image action buttons (edit and delete) using custom hook\n const {\n hoveredImagePosition,\n currentImageAttrs,\n currentImageElement,\n handleDelete: handleImageDelete,\n setIsOverButtons\n } = useImageActions({\n tiptapEditor,\n iframeRef,\n isDialogOpen: imageEditDialog.isOpen\n });\n\n // Set up table cell menu using custom hook (only when tables are active)\n const tableMenuEnabled = tablesEnabled && !readOnly && !disabled;\n const {\n cellPosition,\n setIsOverMenu: setIsOverTableMenu,\n addRowBelow,\n addRowAbove,\n addColumnAfter,\n addColumnBefore,\n deleteRow,\n deleteColumn,\n deleteTable\n } = useTableCellMenu({\n tiptapEditor: tableMenuEnabled ? tiptapEditor : null,\n iframeRef\n });\n\n // Handle keyboard navigation from table menu to next cell (start of content)\n const goToNextCell = useCallback(() => {\n if (tiptapEditor) {\n tiptapEditor.commands.focus();\n tiptapEditor.commands.goToNextCell();\n }\n }, [tiptapEditor]);\n\n // Handle keyboard navigation from table menu back to current cell\n const returnToCell = useCallback(() => {\n tiptapEditor?.commands.focus();\n }, [tiptapEditor]);\n\n // Store the image element when opening the dialog to target the correct node on save\n const editingImageElementRef = useRef<HTMLImageElement | null>(null);\n\n // Handle edit button click from ImageActionButtons\n const onEditButtonClick = () => {\n if (currentImageAttrs && currentImageElement) {\n // Store the element reference to target the correct node on save\n editingImageElementRef.current = currentImageElement;\n setImageEditDialog({\n isOpen: true,\n attributes: currentImageAttrs\n });\n // Don't call handleImageEdit() here - keep buttons visible while dialog is open\n }\n };\n\n // Handle image edit save\n const handleImageEditSave = (attrs: ImageAttributes) => {\n if (!tiptapEditor || !editingImageElementRef.current) {\n editingImageElementRef.current = null;\n return;\n }\n\n // Get exact position from DOM element to handle duplicate images correctly\n const pos = tiptapEditor.view.posAtDOM(editingImageElementRef.current, 0);\n\n let imageUpdated = false;\n\n if (pos >= 0) {\n const { state } = tiptapEditor;\n const node = state.doc.nodeAt(pos);\n if (!node || node.type.name !== 'image') {\n editingImageElementRef.current = null;\n return;\n }\n\n const nodeEnd = pos + node.nodeSize;\n const tr = state.tr;\n\n // Update image attributes\n tr.setNodeMarkup(pos, undefined, {\n src: attrs.src,\n alt: attrs.alt,\n ...(attrs.width && { width: attrs.width }),\n ...(attrs.height && { height: attrs.height })\n });\n\n // Handle action URL (links are marks in ProseMirror, not nodes)\n // Always remove existing link mark first, then add new one if needed\n tr.removeMark(pos, nodeEnd, state.schema.marks.link);\n if (attrs.actionUrl) {\n const linkMark = state.schema.marks.link.create({\n href: attrs.actionUrl,\n target: '_blank'\n });\n tr.addMark(pos, nodeEnd, linkMark);\n }\n\n tiptapEditor.view.dispatch(tr);\n imageUpdated = true;\n }\n\n // Clear the ref after save\n editingImageElementRef.current = null;\n\n // Trigger blur callback to persist image changes to redux\n // Without this, edited images won't be saved until user manually blurs the editor\n if (imageUpdated && onBlur) {\n onBlur();\n }\n };\n\n // Update editor when props change\n useAfterInitialEffect(() => {\n iframeEditorRef.current?.setEditable(!readOnly && !disabled);\n }, [readOnly, disabled]);\n\n // Handle autoFocus\n useEffect(() => {\n if (autoFocus && tiptapEditor) {\n tiptapEditor.commands.focus();\n }\n }, [autoFocus, tiptapEditor]);\n\n // Expose methods via ref\n useImperativeHandle(\n editorRef,\n () => ({\n focus: () => iframeEditorRef.current?.focus(),\n getPlainText: () => iframeEditorRef.current?.getPlainText() ?? '',\n getRichText: () => iframeEditorRef.current?.getRichText() ?? '',\n getHtml: () => iframeEditorRef.current?.getHtml() ?? '',\n clear: () => iframeEditorRef.current?.clear(),\n updateAttachmentAttributes: (imageId: string, uploadProgress?: number, error?: string) => {\n if (!iframeRef.current?.contentDocument) return;\n\n const iframeDoc = iframeRef.current.contentDocument;\n const imageCustomEl = iframeDoc.querySelector(`pega-file[data-id=\"${imageId}\"]`);\n\n if (imageCustomEl) {\n if (error) {\n imageCustomEl.setAttribute('data-error', error);\n } else if (uploadProgress !== undefined) {\n imageCustomEl.setAttribute('data-progress', `${uploadProgress}`);\n }\n }\n },\n appendImage: (\n imageData: { src: string; alt: string; attachmentId?: string },\n imageId: string\n ) => {\n if (!iframeRef.current?.contentDocument || !tiptapEditor) return;\n\n const iframeDoc = iframeRef.current.contentDocument;\n const imageUploadEl = iframeDoc.querySelector(`pega-file[data-id=\"${imageId}\"]`);\n\n if (imageUploadEl) {\n // Create img element\n const imgEl = iframeDoc.createElement('img');\n imgEl.setAttribute('src', imageData.src);\n imgEl.setAttribute('alt', imageData.alt);\n if (imageData.attachmentId) {\n imgEl.setAttribute('data-attachment-id', imageData.attachmentId);\n }\n\n const anchorEl = iframeDoc.createElement('a');\n const pendingActionUrl = pendingImageActionUrlsRef.current.get(imageId);\n anchorEl.setAttribute('href', pendingActionUrl || imageData.src);\n anchorEl.setAttribute('target', '_blank');\n anchorEl.setAttribute('rel', 'noopener noreferrer');\n anchorEl.appendChild(imgEl);\n\n // Replace pega-file with linked img in the DOM\n imageUploadEl.replaceWith(anchorEl);\n\n // Also update the Tiptap document\n const html = tiptapEditor.getHTML();\n const updatedHtml = html.replace(\n new RegExp(`<pega-file[^>]*data-id=[\"']${imageId}[\"'][^>]*>.*?</pega-file>`, 'g'),\n anchorEl.outerHTML\n );\n\n if (updatedHtml !== html) {\n tiptapEditor.commands.setContent(updatedHtml, { emitUpdate: false });\n }\n\n pendingImageActionUrlsRef.current.delete(imageId);\n }\n },\n insertText: (text: string) => iframeEditorRef.current?.insertText(text),\n setCursorLocationToStart: () => iframeEditorRef.current?.setCursorLocationToStart(),\n insertHtml: (html: string, overwrite?: boolean) =>\n iframeEditorRef.current?.insertHtml(html, overwrite),\n getEditor: () => iframeEditorRef.current?.getEditor() ?? null,\n element: formFieldRef.current || undefined\n }),\n [tiptapEditor]\n );\n\n const ctx = useMemo(\n () => ({\n editor: tiptapEditor,\n addImage: (image: File, imageId?: string, alt?: string, actionUrl?: string) => {\n if (!tiptapEditor || !image) return;\n\n const imgId = imageId || `img-${Date.now()}-${Math.random().toString(36).substring(2, 11)}`;\n\n if (actionUrl) {\n pendingImageActionUrlsRef.current.set(imgId, actionUrl);\n }\n\n // Create pega-file element to show upload progress\n const pegaFileHtml = `<br/><pega-file data-id='${imgId}' data-progress='0' data-name='${image.name}' data-alt='${alt || image.name}' contenteditable='false'></pega-file><br/>`;\n\n // Insert the pega-file element\n tiptapEditor.chain().focus().insertContent(pegaFileHtml).run();\n\n // Trigger the onImageAdded callback so consumer can upload and call appendImage\n onImageAdded?.(image, imgId, alt);\n }\n }),\n [tiptapEditor, onImageAdded]\n );\n\n const renderSuggestionEditor = useCallback(\n (suggestionProps: {\n defaultValue?: string;\n disabled: boolean;\n readOnly: boolean;\n onGetContent: (getContent: () => string) => void;\n onContentChange: (hasContent: boolean) => void;\n }) => (\n <SuggestionEditor\n defaultValue={suggestionProps.defaultValue}\n disabled={suggestionProps.disabled}\n readOnly={suggestionProps.readOnly}\n onGetContent={suggestionProps.onGetContent}\n onContentChange={suggestionProps.onContentChange}\n renderEditor={({\n ref: suggestionEditorRef,\n onInit: suggestionOnInit,\n onChange: suggestionOnChange\n }) => (\n <Editor\n ref={suggestionEditorRef}\n label={t('ai_rewrite_result_label')}\n labelHidden\n toolbar={SUGGESTION_TOOLBAR}\n defaultValue={suggestionProps.defaultValue}\n disabled={suggestionProps.disabled}\n readOnly={suggestionProps.readOnly}\n height={height}\n onInit={suggestionOnInit}\n onChange={suggestionOnChange}\n />\n )}\n />\n ),\n [height, t]\n );\n\n return (\n <EditorContext.Provider value={ctx}>\n <StyledEditorRoot\n testId={testIds}\n label={label}\n labelFor=''\n labelId={labelId}\n labelHidden={labelHidden}\n id={editorId}\n info={info}\n status={status}\n required={required}\n disabled={disabled}\n readOnly={readOnly}\n suggestion={suggestion}\n ref={formFieldRef}\n additionalInfo={additionalInfo}\n >\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 hasSuggestion={status === 'pending'}\n >\n <StyledEditorContainer ref={editorContainerRef}>\n {progress ? (\n <Progress\n placement='local'\n message={typeof progress === 'string' ? progress : undefined}\n />\n ) : null}\n {/* Title attribute is required for iframe accessibility (WCAG) */}\n <StyledEditorIframe\n data-testid={testIds.iframe}\n title={typeof label === 'string' ? label : t('rte_text_formatting_toolbar')}\n role='application'\n aria-label={typeof label === 'string' ? label : t('rte_text_formatting_toolbar')}\n aria-describedby={required ? requiredDescriptionId : undefined}\n ref={iframeRef}\n tabIndex={sourceMode ? -1 : 0}\n $minHeight={height?.min}\n $maxHeight={height?.max}\n $hidden={sourceMode}\n />\n {required ? (\n <HiddenText id={requiredDescriptionId}>{t('required')}</HiddenText>\n ) : null}\n {sourceMode ? (\n <StyledSourceTextarea\n value={sourceCode}\n onChange={e => setSourceCode(e.target.value)}\n spellCheck={false}\n aria-label={t('rte_source_code')}\n $minHeight={height?.min}\n $maxHeight={height?.max}\n />\n ) : null}\n {(toolbar?.length || customActions?.length) && tiptapEditor ? (\n <Toolbar\n testId={testIds}\n features={toolbar || []}\n editor={tiptapEditor}\n customActions={customActions}\n imageInsertionMode={imageInsertionMode}\n onRewriteClick={onRewriteClick}\n linkCustomSource={linkCustomSource}\n imageCustomSource={imageCustomSource}\n renderSuggestionEditor={renderSuggestionEditor}\n sourceMode={sourceMode}\n onSourceModeToggle={(isSourceMode: boolean) => {\n if (isSourceMode) {\n setSourceCode(tiptapEditor.getHTML());\n } else {\n tiptapEditor.commands.setContent(sourceCode);\n }\n setSourceMode(isSourceMode);\n }}\n />\n ) : null}\n {imagesEnabled && !readOnly && !disabled ? (\n <ImageActionButtons\n ref={editButtonRef}\n position={hoveredImagePosition}\n containerRef={editorContainerRef}\n onEdit={onEditButtonClick}\n onDelete={handleImageDelete}\n onMouseEnter={() => setIsOverButtons(true)}\n onMouseLeave={() => setIsOverButtons(false)}\n editLabel={t('rte_edit_image', [currentImageAttrs?.alt || ''])}\n deleteLabel={t('rte_delete_image', [currentImageAttrs?.alt || ''])}\n />\n ) : null}\n {tablesEnabled && !readOnly && !disabled && !sourceMode ? (\n <TableCellMenu\n ref={tableCellMenuButtonRef}\n position={cellPosition}\n containerRef={editorContainerRef}\n onAddRowBelow={addRowBelow}\n onAddRowAbove={addRowAbove}\n onAddColumnAfter={addColumnAfter}\n onAddColumnBefore={addColumnBefore}\n onDeleteRow={deleteRow}\n onDeleteColumn={deleteColumn}\n onDeleteTable={deleteTable}\n onGoToNextCell={goToNextCell}\n onReturnToCell={returnToCell}\n onMouseEnter={() => setIsOverTableMenu(true)}\n onMouseLeave={() => setIsOverTableMenu(false)}\n labels={{\n tableOptions: t('rte_table_options'),\n addRowBelow: t('rte_add_row_below'),\n addRowAbove: t('rte_add_row_above'),\n addColumnAfter: t('rte_add_column_after'),\n addColumnBefore: t('rte_add_column_before'),\n deleteRow: t('rte_delete_row'),\n deleteColumn: t('rte_delete_column'),\n deleteTable: t('rte_delete_table')\n }}\n />\n ) : null}\n </StyledEditorContainer>\n </FormControl>\n {toolbar?.includes('word-count') && tiptapEditor ? (\n <WordCount data-testid={testIds.wordCount} editor={tiptapEditor} />\n ) : null}\n </>\n </StyledEditorRoot>\n {children}\n {imageEditDialog.attributes && (\n <ImageEditDialog\n isOpen={imageEditDialog.isOpen}\n onClose={() => {\n setImageEditDialog({ isOpen: false, attributes: null });\n }}\n onSave={handleImageEditSave}\n initialAttributes={imageEditDialog.attributes}\n target={editButtonRef.current}\n imageCustomSource={imageCustomSource}\n />\n )}\n </EditorContext.Provider>\n );\n});\n\nexport default withTestIds(Editor, getEditorTestIds);\n"]}
1
+ {"version":3,"file":"Editor.js","sourceRoot":"","sources":["../../../src/components/Editor/Editor.tsx"],"names":[],"mappings":";AACA,OAAO,EACL,UAAU,EACV,SAAS,EACT,MAAM,EACN,QAAQ,EACR,mBAAmB,EACnB,OAAO,EACP,WAAW,EACZ,MAAM,OAAO,CAAC;AAEf,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAExC,OAAO,EACL,WAAW,EACX,QAAQ,EACR,UAAU,EACV,qBAAqB,EACrB,QAAQ,EACR,MAAM,EACN,kBAAkB,EAClB,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,OAAO,EACR,MAAM,yBAAyB,CAAC;AAGjC,OAAO,oBAAoB,MAAM,yCAAyC,CAAC;AAG3E,OAAO,aAAa,MAAM,kBAAkB,CAAC;AAE7C,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,gBAAgB,EAChB,oBAAoB,EACrB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,OAAO,MAAM,mBAAmB,CAAC;AACxC,OAAO,SAAS,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,kBAAkB,MAAM,sBAAsB,CAAC;AACtD,OAAO,aAAa,MAAM,iBAAiB,CAAC;AAC5C,OAAO,qBAAqB,MAAM,mBAAmB,CAAC;AACtD,OAAO,cAAc,MAAM,wBAAwB,CAAC;AACpD,OAAO,eAAe,MAAM,yBAAyB,CAAC;AACtD,OAAO,gBAAgB,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,YAAY,MAAM,YAAY,CAAC;AAEtC,mFAAmF;AACnF,MAAM,kBAAkB,GAAe,EAAE,CAAC;AAkB1C,MAAM,gBAAgB,GAAG,CAAC,EACxB,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,YAAY,EACU,EAAE,EAAE;IAC1B,MAAM,SAAS,GAAG,MAAM,CAAc,IAAI,CAAC,CAAC;IAE5C,SAAS,CAAC,GAAG,EAAE;QACb,YAAY,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IACtE,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAEnB,qBAAqB,CAAC,GAAG,EAAE;QACzB,SAAS,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,QAAQ,CAAC,UAAU,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;IAC1E,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAEnB,OAAO,YAAY,CAAC;QAClB,GAAG,EAAE,SAAS;QACd,MAAM,EAAE,YAAY,CAAC,EAAE;YACrB,kEAAkE;YAClE,eAAe,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACxD,CAAC;QACD,QAAQ,EAAE,MAAM,CAAC,EAAE;YACjB,eAAe,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC3D,CAAC;KACF,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,MAAM,GAAiD,UAAU,CAAC,SAAS,eAAe,CAC9F,KAAmC,EACnC,GAAuB;IAEvB,MAAM,EACJ,MAAM,EACN,EAAE,EACF,KAAK,EACL,WAAW,EACX,IAAI,EACJ,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,OAAO,EACP,MAAM,EACN,YAAY,EACZ,UAAU,EACV,MAAM,EACN,QAAQ,EACR,YAAY,EACZ,WAAW,EACX,QAAQ,EACR,cAAc,EACd,OAAO,EACP,aAAa,EACb,gBAAgB,GAAG,EAAE,EACrB,UAAU,GAAG,IAAI,EACjB,kBAAkB,GAAG,KAAK,EAC1B,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,QAAQ,EACR,SAAS,EACT,MAAM,EACN,UAAU,GAAG,IAAI,EACjB,MAAM,GAAG,KAAK,EACd,mBAAmB,GAAG,KAAK,EAC3B,GAAG,SAAS,EACb,GAAG,KAAK,CAAC;IAEV,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,MAAM,EAAE,gBAAgB,EAAE,GAAG,gBAAgB,EAAE,CAAC;IAChD,MAAM,CAAC,GAAG,OAAO,EAAE,CAAC;IACpB,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAsB,IAAI,CAAC,CAAC;IAC5E,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAGnD,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;IACxC,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACpD,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACjD,MAAM,aAAa,GAAG,MAAM,CAAoB,IAAI,CAAC,CAAC;IACtD,MAAM,sBAAsB,GAAG,MAAM,CAAoB,IAAI,CAAC,CAAC;IAC/D,MAAM,kBAAkB,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IACxD,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC;IAC7B,MAAM,QAAQ,GAAG,EAAE,IAAI,WAAW,CAAC;IACnC,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC;IACzB,MAAM,qBAAqB,GAAG,GAAG,QAAQ,WAAW,CAAC;IACrD,MAAM,SAAS,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;IAC1C,MAAM,YAAY,GAAG,MAAM,CAAc,IAAI,CAAC,CAAC;IAC/C,MAAM,YAAY,GAAG,MAAM,CAAS,EAAE,CAAC,CAAC;IACxC,MAAM,SAAS,GAAG,MAAM,CAAoB,IAAI,CAAC,CAAC;IAClD,MAAM,yBAAyB,GAAG,MAAM,CAAsB,IAAI,GAAG,EAAE,CAAC,CAAC;IAEzE,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAErD,qCAAqC;IACrC,MAAM,aAAa,GAAG,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC;IAE3D,qCAAqC;IACrC,MAAM,aAAa,GAAG,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC;IAE3D,iEAAiE;IACjE,MAAM,YAAY,GAAG,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC;IAEzD,yCAAyC;IACzC,MAAM,aAAa,GAAG,OAAO,EAAE,QAAQ,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC;IAE/D,sEAAsE;IACtE,MAAM,cAAc,GAAsB,OAAO,CAAC,GAAG,EAAE;QACrD,MAAM,aAAa,GAAG,GAAG,CAAA;;;;iBAIZ,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,EAAE;;KAE1C,CAAC;QAEF,OAAO;YACL;gBACE,mBAAmB,EAAE,qBAAqB;gBAC1C,IAAI,EAAE,WAAW;gBACjB,KAAK,EAAE,aAAa,CAAC,QAAQ,EAAE;gBAC/B,mBAAmB,EAAE,CAAC,iBAAiB,CAAC;aACzC;YACD,GAAG,gBAAgB;SACpB,CAAC;IACJ,CAAC,EAAE,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC,CAAC;IAE9B,oFAAoF;IACpF,SAAS,CAAC,GAAG,EAAE;QACb,cAAc,CAAC,OAAO,CAAC,CAAC,SAA0B,EAAE,EAAE;YACpD,IACE,SAAS,CAAC,IAAI;gBACd,SAAS,CAAC,mBAAmB;gBAC7B,CAAC,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,EAC1C,CAAC;gBACD,MAAM,aAAa,GAAG,SAAS,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;gBAC5D,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC;IAErB,kDAAkD;IAClD,MAAM,qBAAqB,GAAG,OAAO,CACnC,GAAG,EAAE,CAAC,CAAC,MAAM,IAAI,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,EAC1E,CAAC,MAAM,EAAE,YAAY,CAAC,CACvB,CAAC;IAEF,+CAA+C;IAC/C,MAAM,EAAE,eAAe,EAAE,GAAG,cAAc,CAAC;QACzC,SAAS;QACT,KAAK;QACL,gBAAgB;QAChB,cAAc;QACd,WAAW;QACX,YAAY,EAAE,qBAAqB;QACnC,QAAQ;QACR,QAAQ;QACR,QAAQ;QACR,SAAS;QACT,OAAO;QACP,MAAM;QACN,MAAM;QACN,UAAU;QACV,WAAW;QACX,YAAY;QACZ,aAAa;QACb,YAAY;QACZ,aAAa;QACb,kBAAkB;QAClB,YAAY;QACZ,QAAQ;QACR,QAAQ;QACR,eAAe;QACf,UAAU;QACV,UAAU;QACV,MAAM;QACN,mBAAmB;QACnB,QAAQ,EAAE,GAAG,EAAE;YACb,2DAA2D;YAC3D,MAAM,SAAS,GAAG,kBAAkB,CAAC,OAAO,EAAE,aAAa,CAAC,0BAA0B,CAAC,CAAC;YACxF,MAAM,WAAW,GAAG,SAAS,EAAE,aAAa,CAAc,wBAAwB,CAAC,CAAC;YACpF,IAAI,WAAW,EAAE,CAAC;gBAChB,WAAW,CAAC,KAAK,EAAE,CAAC;YACtB,CAAC;QACH,CAAC;QACD,gBAAgB,EAAE,GAAG,EAAE;YACrB,sBAAsB,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;QAC1C,CAAC;QACD,uBAAuB,EAAE,GAAG,EAAE;YAC5B,8CAA8C;YAC9C,IAAI,YAAY,EAAE,CAAC;gBACjB,YAAY,CAAC,QAAQ,CAAC,gBAAgB,EAAE,CAAC;gBACzC,UAAU,CAAC,GAAG,EAAE;oBACd,sBAAsB,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;gBAC1C,CAAC,EAAE,CAAC,CAAC,CAAC;YACR,CAAC;QACH,CAAC;KACF,CAAC,CAAC;IAEH,0EAA0E;IAC1E,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,aAAa,IAAI,CAAC,QAAQ;YAAE,OAAO;QAE3D,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC,aAAa,CAAC;QACrD,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;QAE9C,YAAY,CAAC,gBAAgB,CAC3B,QAAQ,EACR,GAAG,EAAE;YACH,MAAM,IAAI,GAAG,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YACtD,QAAQ,CAAC,IAAI,CAAC,CAAC;QACjB,CAAC,EACD,EAAE,MAAM,EAAE,eAAe,CAAC,MAAM,EAAE,CACnC,CAAC;QAEF,OAAO,GAAG,EAAE;YACV,eAAe,CAAC,KAAK,EAAE,CAAC;QAC1B,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,sEAAsE;IACtE,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,SAAS,GAAG,SAAS,CAAC,OAAO,EAAE,eAAe,CAAC;QACrD,IAAI,CAAC,SAAS;YAAE,OAAO;QAEvB,MAAM,eAAe,GAAG,GAAG,EAAE;YAC3B,wBAAwB,EAAE,CAAC;QAC7B,CAAC,CAAC;QAEF,SAAS,CAAC,gBAAgB,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;QACzD,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC,mBAAmB,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;IAC3E,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAEnB,kEAAkE;IAClE,MAAM,EACJ,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,EACnB,YAAY,EAAE,iBAAiB,EAC/B,gBAAgB,EACjB,GAAG,eAAe,CAAC;QAClB,YAAY;QACZ,SAAS;QACT,YAAY,EAAE,eAAe,CAAC,MAAM;KACrC,CAAC,CAAC;IAEH,yEAAyE;IACzE,MAAM,gBAAgB,GAAG,aAAa,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC;IACjE,MAAM,EACJ,YAAY,EACZ,aAAa,EAAE,kBAAkB,EACjC,WAAW,EACX,WAAW,EACX,cAAc,EACd,eAAe,EACf,SAAS,EACT,YAAY,EACZ,WAAW,EACZ,GAAG,gBAAgB,CAAC;QACnB,YAAY,EAAE,gBAAgB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI;QACpD,SAAS;KACV,CAAC,CAAC;IAEH,6EAA6E;IAC7E,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE;QACpC,IAAI,YAAY,EAAE,CAAC;YACjB,YAAY,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YAC9B,YAAY,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC;QACvC,CAAC;IACH,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAEnB,kEAAkE;IAClE,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE;QACpC,YAAY,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC;IACjC,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAEnB,qFAAqF;IACrF,MAAM,sBAAsB,GAAG,MAAM,CAA0B,IAAI,CAAC,CAAC;IAErE,mDAAmD;IACnD,MAAM,iBAAiB,GAAG,GAAG,EAAE;QAC7B,IAAI,iBAAiB,IAAI,mBAAmB,EAAE,CAAC;YAC7C,iEAAiE;YACjE,sBAAsB,CAAC,OAAO,GAAG,mBAAmB,CAAC;YACrD,kBAAkB,CAAC;gBACjB,MAAM,EAAE,IAAI;gBACZ,UAAU,EAAE,iBAAiB;aAC9B,CAAC,CAAC;YACH,gFAAgF;QAClF,CAAC;IACH,CAAC,CAAC;IAEF,yBAAyB;IACzB,MAAM,mBAAmB,GAAG,CAAC,KAAsB,EAAE,EAAE;QACrD,IAAI,CAAC,YAAY,IAAI,CAAC,sBAAsB,CAAC,OAAO,EAAE,CAAC;YACrD,sBAAsB,CAAC,OAAO,GAAG,IAAI,CAAC;YACtC,OAAO;QACT,CAAC;QAED,2EAA2E;QAC3E,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,sBAAsB,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAE1E,IAAI,YAAY,GAAG,KAAK,CAAC;QAEzB,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;YACb,MAAM,EAAE,KAAK,EAAE,GAAG,YAAY,CAAC;YAC/B,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACnC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBACxC,sBAAsB,CAAC,OAAO,GAAG,IAAI,CAAC;gBACtC,OAAO;YACT,CAAC;YAED,MAAM,OAAO,GAAG,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC;YACpC,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;YAEpB,0BAA0B;YAC1B,EAAE,CAAC,aAAa,CAAC,GAAG,EAAE,SAAS,EAAE;gBAC/B,GAAG,EAAE,KAAK,CAAC,GAAG;gBACd,GAAG,EAAE,KAAK,CAAC,GAAG;gBACd,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;gBAC1C,GAAG,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;aAC9C,CAAC,CAAC;YAEH,gEAAgE;YAChE,qEAAqE;YACrE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACrD,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;gBACpB,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;oBAC9C,IAAI,EAAE,KAAK,CAAC,SAAS;oBACrB,MAAM,EAAE,QAAQ;iBACjB,CAAC,CAAC;gBACH,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;YACrC,CAAC;YAED,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC/B,YAAY,GAAG,IAAI,CAAC;QACtB,CAAC;QAED,2BAA2B;QAC3B,sBAAsB,CAAC,OAAO,GAAG,IAAI,CAAC;QAEtC,0DAA0D;QAC1D,kFAAkF;QAClF,IAAI,YAAY,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,EAAE,CAAC;QACX,CAAC;IACH,CAAC,CAAC;IAEF,kCAAkC;IAClC,qBAAqB,CAAC,GAAG,EAAE;QACzB,eAAe,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC/D,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;IAEzB,mBAAmB;IACnB,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,SAAS,IAAI,YAAY,EAAE,CAAC;YAC9B,YAAY,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QAChC,CAAC;IACH,CAAC,EAAE,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;IAE9B,yBAAyB;IACzB,mBAAmB,CACjB,SAAS,EACT,GAAG,EAAE,CAAC,CAAC;QACL,KAAK,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,OAAO,EAAE,KAAK,EAAE;QAC7C,YAAY,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE;QACjE,WAAW,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE;QAC/D,OAAO,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE;QACvD,KAAK,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,OAAO,EAAE,KAAK,EAAE;QAC7C,0BAA0B,EAAE,CAAC,OAAe,EAAE,cAAuB,EAAE,KAAc,EAAE,EAAE;YACvF,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,eAAe;gBAAE,OAAO;YAEhD,MAAM,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,eAAe,CAAC;YACpD,MAAM,aAAa,GAAG,SAAS,CAAC,aAAa,CAAC,sBAAsB,OAAO,IAAI,CAAC,CAAC;YAEjF,IAAI,aAAa,EAAE,CAAC;gBAClB,IAAI,KAAK,EAAE,CAAC;oBACV,aAAa,CAAC,YAAY,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;gBAClD,CAAC;qBAAM,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;oBACxC,aAAa,CAAC,YAAY,CAAC,eAAe,EAAE,GAAG,cAAc,EAAE,CAAC,CAAC;gBACnE,CAAC;YACH,CAAC;QACH,CAAC;QACD,WAAW,EAAE,CACX,SAA8D,EAC9D,OAAe,EACf,EAAE;YACF,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,eAAe,IAAI,CAAC,YAAY;gBAAE,OAAO;YAEjE,MAAM,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,eAAe,CAAC;YACpD,MAAM,aAAa,GAAG,SAAS,CAAC,aAAa,CAAC,sBAAsB,OAAO,IAAI,CAAC,CAAC;YAEjF,IAAI,aAAa,EAAE,CAAC;gBAClB,qBAAqB;gBACrB,MAAM,KAAK,GAAG,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;gBAC7C,KAAK,CAAC,YAAY,CAAC,KAAK,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC;gBACzC,KAAK,CAAC,YAAY,CAAC,KAAK,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC;gBACzC,IAAI,SAAS,CAAC,YAAY,EAAE,CAAC;oBAC3B,KAAK,CAAC,YAAY,CAAC,oBAAoB,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC;gBACnE,CAAC;gBAED,MAAM,QAAQ,GAAG,SAAS,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;gBAC9C,MAAM,gBAAgB,GAAG,yBAAyB,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBACxE,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,gBAAgB,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC;gBACjE,QAAQ,CAAC,YAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;gBAC1C,QAAQ,CAAC,YAAY,CAAC,KAAK,EAAE,qBAAqB,CAAC,CAAC;gBACpD,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;gBAE5B,+CAA+C;gBAC/C,aAAa,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;gBAEpC,kCAAkC;gBAClC,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,EAAE,CAAC;gBACpC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAC9B,IAAI,MAAM,CAAC,8BAA8B,OAAO,2BAA2B,EAAE,GAAG,CAAC,EACjF,QAAQ,CAAC,SAAS,CACnB,CAAC;gBAEF,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;oBACzB,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC,WAAW,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;gBACvE,CAAC;gBAED,yBAAyB,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACpD,CAAC;QACH,CAAC;QACD,UAAU,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,eAAe,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC;QACvE,wBAAwB,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,OAAO,EAAE,wBAAwB,EAAE;QACnF,UAAU,EAAE,CAAC,IAAY,EAAE,SAAmB,EAAE,EAAE,CAChD,eAAe,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC;QACtD,SAAS,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,IAAI;QAC7D,OAAO,EAAE,YAAY,CAAC,OAAO,IAAI,SAAS;KAC3C,CAAC,EACF,CAAC,YAAY,CAAC,CACf,CAAC;IAEF,MAAM,GAAG,GAAG,OAAO,CACjB,GAAG,EAAE,CAAC,CAAC;QACL,MAAM,EAAE,YAAY;QACpB,QAAQ,EAAE,CAAC,KAAW,EAAE,OAAgB,EAAE,GAAY,EAAE,SAAkB,EAAE,EAAE;YAC5E,IAAI,CAAC,YAAY,IAAI,CAAC,KAAK;gBAAE,OAAO;YAEpC,MAAM,KAAK,GAAG,OAAO,IAAI,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;YAE5F,IAAI,SAAS,EAAE,CAAC;gBACd,yBAAyB,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YAC1D,CAAC;YAED,mDAAmD;YACnD,MAAM,YAAY,GAAG,4BAA4B,KAAK,kCAAkC,KAAK,CAAC,IAAI,eAAe,GAAG,IAAI,KAAK,CAAC,IAAI,6CAA6C,CAAC;YAEhL,+BAA+B;YAC/B,YAAY,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,CAAC;YAE/D,gFAAgF;YAChF,YAAY,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;QACpC,CAAC;KACF,CAAC,EACF,CAAC,YAAY,EAAE,YAAY,CAAC,CAC7B,CAAC;IAEF,MAAM,sBAAsB,GAAG,WAAW,CACxC,CAAC,eAMA,EAAE,EAAE,CAAC,CACJ,KAAC,gBAAgB,IACf,YAAY,EAAE,eAAe,CAAC,YAAY,EAC1C,QAAQ,EAAE,eAAe,CAAC,QAAQ,EAClC,QAAQ,EAAE,eAAe,CAAC,QAAQ,EAClC,YAAY,EAAE,eAAe,CAAC,YAAY,EAC1C,eAAe,EAAE,eAAe,CAAC,eAAe,EAChD,YAAY,EAAE,CAAC,EACb,GAAG,EAAE,mBAAmB,EACxB,MAAM,EAAE,gBAAgB,EACxB,QAAQ,EAAE,kBAAkB,EAC7B,EAAE,EAAE,CAAC,CACJ,KAAC,MAAM,IACL,GAAG,EAAE,mBAAmB,EACxB,KAAK,EAAE,CAAC,CAAC,yBAAyB,CAAC,EACnC,WAAW,QACX,OAAO,EAAE,kBAAkB,EAC3B,YAAY,EAAE,eAAe,CAAC,YAAY,EAC1C,QAAQ,EAAE,eAAe,CAAC,QAAQ,EAClC,QAAQ,EAAE,eAAe,CAAC,QAAQ,EAClC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,gBAAgB,EACxB,QAAQ,EAAE,kBAAkB,GAC5B,CACH,GACD,CACH,EACD,CAAC,MAAM,EAAE,CAAC,CAAC,CACZ,CAAC;IAEF,OAAO,CACL,MAAC,aAAa,CAAC,QAAQ,IAAC,KAAK,EAAE,GAAG,aAChC,KAAC,gBAAgB,IACf,MAAM,EAAE,OAAO,EACf,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAC,EAAE,EACX,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,WAAW,EACxB,EAAE,EAAE,QAAQ,EACZ,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,UAAU,EACtB,GAAG,EAAE,YAAY,EACjB,cAAc,EAAE,cAAc,YAE9B,8BACE,KAAC,WAAW,OACN,SAAS,EACb,GAAG,EAAE,SAAS,EACd,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,oBAAoB,EACxB,OAAO,EAAE,OAAO,EAChB,aAAa,EAAE,MAAM,KAAK,SAAS,YAEnC,MAAC,qBAAqB,IAAC,GAAG,EAAE,kBAAkB,aAC3C,QAAQ,CAAC,CAAC,CAAC,CACV,KAAC,QAAQ,IACP,SAAS,EAAC,OAAO,EACjB,OAAO,EAAE,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,GAC5D,CACH,CAAC,CAAC,CAAC,IAAI,EAER,KAAC,kBAAkB,mBACJ,OAAO,CAAC,MAAM,EAC3B,KAAK,EAAE,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,6BAA6B,CAAC,EAC3E,IAAI,EAAC,aAAa,gBACN,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,6BAA6B,CAAC,sBAC9D,QAAQ,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,SAAS,EAC9D,GAAG,EAAE,SAAS,EACd,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,gBACjB,MAAM,EAAE,GAAG,gBACX,MAAM,EAAE,GAAG,aACd,UAAU,GACnB,EACD,QAAQ,CAAC,CAAC,CAAC,CACV,KAAC,UAAU,IAAC,EAAE,EAAE,qBAAqB,YAAG,CAAC,CAAC,UAAU,CAAC,GAAc,CACpE,CAAC,CAAC,CAAC,IAAI,EACP,UAAU,CAAC,CAAC,CAAC,CACZ,KAAC,oBAAoB,IACnB,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAC5C,UAAU,EAAE,KAAK,gBACL,CAAC,CAAC,iBAAiB,CAAC,gBACpB,MAAM,EAAE,GAAG,gBACX,MAAM,EAAE,GAAG,GACvB,CACH,CAAC,CAAC,CAAC,IAAI,EACP,CAAC,OAAO,EAAE,MAAM,IAAI,aAAa,EAAE,MAAM,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,CAC5D,KAAC,OAAO,IACN,MAAM,EAAE,OAAO,EACf,QAAQ,EAAE,OAAO,IAAI,EAAE,EACvB,MAAM,EAAE,YAAY,EACpB,aAAa,EAAE,aAAa,EAC5B,kBAAkB,EAAE,kBAAkB,EACtC,cAAc,EAAE,cAAc,EAC9B,gBAAgB,EAAE,gBAAgB,EAClC,iBAAiB,EAAE,iBAAiB,EACpC,sBAAsB,EAAE,sBAAsB,EAC9C,UAAU,EAAE,UAAU,EACtB,kBAAkB,EAAE,CAAC,YAAqB,EAAE,EAAE;4CAC5C,IAAI,YAAY,EAAE,CAAC;gDACjB,aAAa,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC;4CACxC,CAAC;iDAAM,CAAC;gDACN,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;4CAC/C,CAAC;4CACD,aAAa,CAAC,YAAY,CAAC,CAAC;wCAC9B,CAAC,GACD,CACH,CAAC,CAAC,CAAC,IAAI,EACP,aAAa,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CACzC,KAAC,kBAAkB,IACjB,GAAG,EAAE,aAAa,EAClB,QAAQ,EAAE,oBAAoB,EAC9B,YAAY,EAAE,kBAAkB,EAChC,MAAM,EAAE,iBAAiB,EACzB,QAAQ,EAAE,iBAAiB,EAC3B,YAAY,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAC1C,YAAY,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAC3C,SAAS,EAAE,CAAC,CAAC,gBAAgB,EAAE,CAAC,iBAAiB,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,EAC9D,WAAW,EAAE,CAAC,CAAC,kBAAkB,EAAE,CAAC,iBAAiB,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,GAClE,CACH,CAAC,CAAC,CAAC,IAAI,EACP,aAAa,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CACxD,KAAC,aAAa,IACZ,GAAG,EAAE,sBAAsB,EAC3B,QAAQ,EAAE,YAAY,EACtB,YAAY,EAAE,kBAAkB,EAChC,aAAa,EAAE,WAAW,EAC1B,aAAa,EAAE,WAAW,EAC1B,gBAAgB,EAAE,cAAc,EAChC,iBAAiB,EAAE,eAAe,EAClC,WAAW,EAAE,SAAS,EACtB,cAAc,EAAE,YAAY,EAC5B,aAAa,EAAE,WAAW,EAC1B,cAAc,EAAE,YAAY,EAC5B,cAAc,EAAE,YAAY,EAC5B,YAAY,EAAE,GAAG,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAC5C,YAAY,EAAE,GAAG,EAAE,CAAC,kBAAkB,CAAC,KAAK,CAAC,EAC7C,MAAM,EAAE;4CACN,YAAY,EAAE,CAAC,CAAC,mBAAmB,CAAC;4CACpC,WAAW,EAAE,CAAC,CAAC,mBAAmB,CAAC;4CACnC,WAAW,EAAE,CAAC,CAAC,mBAAmB,CAAC;4CACnC,cAAc,EAAE,CAAC,CAAC,sBAAsB,CAAC;4CACzC,eAAe,EAAE,CAAC,CAAC,uBAAuB,CAAC;4CAC3C,SAAS,EAAE,CAAC,CAAC,gBAAgB,CAAC;4CAC9B,YAAY,EAAE,CAAC,CAAC,mBAAmB,CAAC;4CACpC,WAAW,EAAE,CAAC,CAAC,kBAAkB,CAAC;yCACnC,GACD,CACH,CAAC,CAAC,CAAC,IAAI,IACc,GACZ,EACb,OAAO,EAAE,QAAQ,CAAC,YAAY,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,CACjD,KAAC,SAAS,mBAAc,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,GAAI,CACpE,CAAC,CAAC,CAAC,IAAI,IACP,GACc,EAClB,QAAQ,EACR,eAAe,CAAC,UAAU,IAAI,CAC7B,KAAC,eAAe,IACd,MAAM,EAAE,eAAe,CAAC,MAAM,EAC9B,OAAO,EAAE,GAAG,EAAE;oBACZ,kBAAkB,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC1D,CAAC,EACD,MAAM,EAAE,mBAAmB,EAC3B,iBAAiB,EAAE,eAAe,CAAC,UAAU,EAC7C,MAAM,EAAE,aAAa,CAAC,OAAO,EAC7B,iBAAiB,EAAE,iBAAiB,GACpC,CACH,IACsB,CAC1B,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,eAAe,WAAW,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC","sourcesContent":["import type { Editor as TiptapEditor } from '@tiptap/core';\nimport {\n forwardRef,\n useEffect,\n useRef,\n useState,\n useImperativeHandle,\n useMemo,\n useCallback\n} from 'react';\nimport type { PropsWithoutRef, ReactNode, RefObject } from 'react';\nimport { css } from 'styled-components';\n\nimport {\n FormControl,\n Progress,\n HiddenText,\n useAfterInitialEffect,\n useTheme,\n useUID,\n useConsolidatedRef,\n useTestIds,\n withTestIds,\n useConfiguration,\n useI18n\n} from '@pega/cosmos-react-core';\nimport type { ForwardRefForwardPropsComponent } from '@pega/cosmos-react-core';\n\nimport StyledRichTextEditor from '../RichTextEditor/RichTextEditor.styles';\nimport type { Features } from '../RichTextEditor/Toolbar/Toolbar.types';\n\nimport EditorContext from './Editor.context';\nimport type { EditorProps, EditorState, CustomComponent } from './Editor.types';\nimport {\n StyledEditorContainer,\n StyledEditorIframe,\n StyledEditorRoot,\n StyledSourceTextarea\n} from './Editor.styles';\nimport { getEditorTestIds } from './Editor.test-ids';\nimport Toolbar from './Toolbar/Toolbar';\nimport WordCount from './Toolbar/WordCount';\nimport { ImageEditDialog } from './ImageEditDialog';\nimport type { ImageAttributes } from './ImageEditDialog';\nimport ImageActionButtons from './ImageActionButtons';\nimport TableCellMenu from './TableCellMenu';\nimport createFileItemElement from './FileItemElement';\nimport useIframeSetup from './hooks/useIframeSetup';\nimport useImageActions from './hooks/useImageActions';\nimport useTableCellMenu from './hooks/useTableCellMenu';\nimport { dispatchEditorClickEvent } from './hooks/useCloseOnEditorClick';\nimport sanitizeHtml from './sanitize';\n\n// Suggestion editor has no toolbar — formatting controls are intentionally omitted\nconst SUGGESTION_TOOLBAR: Features[] = [];\n\ninterface SuggestionEditorRenderProps {\n ref: RefObject<EditorState>;\n onInit: (tiptapEditor: TiptapEditor) => void;\n onChange: (editor?: TiptapEditor) => void;\n}\n\ninterface SuggestionEditorProps {\n defaultValue?: string;\n disabled: boolean;\n readOnly: boolean;\n onGetContent: (getContent: () => string) => void;\n onContentChange: (hasContent: boolean) => void;\n /** Render prop — receives ref and callbacks; must render an Editor-like element */\n renderEditor: (renderProps: SuggestionEditorRenderProps) => ReactNode;\n}\n\nconst SuggestionEditor = ({\n defaultValue,\n onGetContent,\n onContentChange,\n renderEditor\n}: SuggestionEditorProps) => {\n const editorRef = useRef<EditorState>(null);\n\n useEffect(() => {\n onGetContent(() => editorRef.current?.getEditor()?.getHTML() ?? '');\n }, [onGetContent]);\n\n useAfterInitialEffect(() => {\n editorRef.current?.getEditor()?.commands.setContent(defaultValue ?? '');\n }, [defaultValue]);\n\n return renderEditor({\n ref: editorRef,\n onInit: tiptapEditor => {\n // Signal initial content state so submit button enables correctly\n onContentChange(tiptapEditor.getText().trim() !== '');\n },\n onChange: editor => {\n onContentChange((editor?.getText() ?? '').trim() !== '');\n }\n });\n};\n\nconst Editor: ForwardRefForwardPropsComponent<EditorProps> = forwardRef(function ForwardedEditor(\n props: PropsWithoutRef<EditorProps>,\n ref: EditorProps['ref']\n) {\n const {\n testId,\n id,\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 suggestion,\n onInit,\n onUnload,\n defaultValue,\n placeholder,\n children,\n additionalInfo,\n toolbar,\n customActions,\n customComponents = [],\n spellcheck = true,\n imageInsertionMode = 'all',\n initOptions,\n onRewriteClick,\n linkCustomSource,\n imageCustomSource,\n progress,\n autoFocus,\n height,\n autoResize = true,\n secure = false,\n preserveTableStyles = false,\n ...restProps\n } = props;\n\n const theme = useTheme();\n const { styleSheetTarget } = useConfiguration();\n const t = useI18n();\n const [focused, setFocused] = useState(false);\n const [tiptapEditor, setTiptapEditor] = useState<TiptapEditor | null>(null);\n const [imageEditDialog, setImageEditDialog] = useState<{\n isOpen: boolean;\n attributes: ImageAttributes | null;\n }>({ isOpen: false, attributes: null });\n const [sourceMode, setSourceMode] = useState(false);\n const [sourceCode, setSourceCode] = useState('');\n const editButtonRef = useRef<HTMLButtonElement>(null);\n const tableCellMenuButtonRef = useRef<HTMLButtonElement>(null);\n const editorContainerRef = useRef<HTMLDivElement>(null);\n const generatedId = useUID();\n const editorId = id ?? generatedId;\n const labelId = useUID();\n const requiredDescriptionId = `${editorId}-required`;\n const editorRef = useConsolidatedRef(ref);\n const formFieldRef = useRef<HTMLElement>(null);\n const pastedImages = useRef<File[]>([]);\n const iframeRef = useRef<HTMLIFrameElement>(null);\n const pendingImageActionUrlsRef = useRef<Map<string, string>>(new Map());\n\n const testIds = useTestIds(testId, getEditorTestIds);\n\n // Check if images feature is enabled\n const imagesEnabled = toolbar?.includes('images') ?? false;\n\n // Check if tables feature is enabled\n const tablesEnabled = toolbar?.includes('tables') ?? false;\n\n // Check if links feature is enabled (controls autolink behavior)\n const linksEnabled = toolbar?.includes('links') ?? false;\n\n // Check if text color feature is enabled\n const colorsEnabled = toolbar?.includes('text-color') ?? false;\n\n // Define built-in custom components and merge with user-provided ones\n const customElements: CustomComponent[] = useMemo(() => {\n const FileItemStyle = css`\n /* stylelint-disable-next-line selector-type-no-unknown */\n pega-file {\n display: inline-block;\n width: ${theme.base['content-width'].md};\n }\n `;\n\n return [\n {\n createCustomElement: createFileItemElement,\n name: 'pega-file',\n style: FileItemStyle.toString(),\n extensionAttributes: ['contenteditable']\n },\n ...customComponents\n ];\n }, [customComponents, theme]);\n\n // Register custom elements in the main window (needed for Tiptap to recognize them)\n useEffect(() => {\n customElements.forEach((component: CustomComponent) => {\n if (\n component.name &&\n component.createCustomElement &&\n !window.customElements.get(component.name)\n ) {\n const CustomElement = component.createCustomElement(window);\n window.customElements.define(component.name, CustomElement);\n }\n });\n }, [customElements]);\n\n // Sanitize defaultValue if secure mode is enabled\n const sanitizedDefaultValue = useMemo(\n () => (secure && defaultValue ? sanitizeHtml(defaultValue) : defaultValue),\n [secure, defaultValue]\n );\n\n // Mount Tiptap inside iframe using custom hook\n const { iframeEditorRef } = useIframeSetup({\n iframeRef,\n theme,\n styleSheetTarget,\n customElements,\n placeholder,\n defaultValue: sanitizedDefaultValue,\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 colorsEnabled,\n imageInsertionMode,\n pastedImages,\n editorId,\n required,\n setTiptapEditor,\n setFocused,\n autoResize,\n secure,\n preserveTableStyles,\n onTabOut: () => {\n // Focus first toolbar button when Tab is pressed in editor\n const toolbarEl = editorContainerRef.current?.querySelector('[data-testid$=\"toolbar\"]');\n const firstButton = toolbarEl?.querySelector<HTMLElement>('button:not([disabled])');\n if (firstButton) {\n firstButton.focus();\n }\n },\n onFocusTableMenu: () => {\n tableCellMenuButtonRef.current?.focus();\n },\n onFocusPreviousCellMenu: () => {\n // Go to previous cell and then focus its menu\n if (tiptapEditor) {\n tiptapEditor.commands.goToPreviousCell();\n setTimeout(() => {\n tableCellMenuButtonRef.current?.focus();\n }, 0);\n }\n }\n });\n\n // Set up unload event listener to save content before iframe is destroyed\n useEffect(() => {\n if (!iframeRef.current?.contentWindow || !onUnload) return;\n\n const iframeWindow = iframeRef.current.contentWindow;\n const abortController = new AbortController();\n\n iframeWindow.addEventListener(\n 'unload',\n () => {\n const html = iframeEditorRef.current?.getHtml() ?? '';\n onUnload(html);\n },\n { signal: abortController.signal }\n );\n\n return () => {\n abortController.abort();\n };\n }, [onUnload]);\n\n // Dispatch event on iframe mousedown to close all open popovers/menus\n useEffect(() => {\n const iframeDoc = iframeRef.current?.contentDocument;\n if (!iframeDoc) return;\n\n const handleMouseDown = () => {\n dispatchEditorClickEvent();\n };\n\n iframeDoc.addEventListener('mousedown', handleMouseDown);\n return () => iframeDoc.removeEventListener('mousedown', handleMouseDown);\n }, [tiptapEditor]);\n\n // Set up image action buttons (edit and delete) using custom hook\n const {\n hoveredImagePosition,\n currentImageAttrs,\n currentImageElement,\n handleDelete: handleImageDelete,\n setIsOverButtons\n } = useImageActions({\n tiptapEditor,\n iframeRef,\n isDialogOpen: imageEditDialog.isOpen\n });\n\n // Set up table cell menu using custom hook (only when tables are active)\n const tableMenuEnabled = tablesEnabled && !readOnly && !disabled;\n const {\n cellPosition,\n setIsOverMenu: setIsOverTableMenu,\n addRowBelow,\n addRowAbove,\n addColumnAfter,\n addColumnBefore,\n deleteRow,\n deleteColumn,\n deleteTable\n } = useTableCellMenu({\n tiptapEditor: tableMenuEnabled ? tiptapEditor : null,\n iframeRef\n });\n\n // Handle keyboard navigation from table menu to next cell (start of content)\n const goToNextCell = useCallback(() => {\n if (tiptapEditor) {\n tiptapEditor.commands.focus();\n tiptapEditor.commands.goToNextCell();\n }\n }, [tiptapEditor]);\n\n // Handle keyboard navigation from table menu back to current cell\n const returnToCell = useCallback(() => {\n tiptapEditor?.commands.focus();\n }, [tiptapEditor]);\n\n // Store the image element when opening the dialog to target the correct node on save\n const editingImageElementRef = useRef<HTMLImageElement | null>(null);\n\n // Handle edit button click from ImageActionButtons\n const onEditButtonClick = () => {\n if (currentImageAttrs && currentImageElement) {\n // Store the element reference to target the correct node on save\n editingImageElementRef.current = currentImageElement;\n setImageEditDialog({\n isOpen: true,\n attributes: currentImageAttrs\n });\n // Don't call handleImageEdit() here - keep buttons visible while dialog is open\n }\n };\n\n // Handle image edit save\n const handleImageEditSave = (attrs: ImageAttributes) => {\n if (!tiptapEditor || !editingImageElementRef.current) {\n editingImageElementRef.current = null;\n return;\n }\n\n // Get exact position from DOM element to handle duplicate images correctly\n const pos = tiptapEditor.view.posAtDOM(editingImageElementRef.current, 0);\n\n let imageUpdated = false;\n\n if (pos >= 0) {\n const { state } = tiptapEditor;\n const node = state.doc.nodeAt(pos);\n if (!node || node.type.name !== 'image') {\n editingImageElementRef.current = null;\n return;\n }\n\n const nodeEnd = pos + node.nodeSize;\n const tr = state.tr;\n\n // Update image attributes\n tr.setNodeMarkup(pos, undefined, {\n src: attrs.src,\n alt: attrs.alt,\n ...(attrs.width && { width: attrs.width }),\n ...(attrs.height && { height: attrs.height })\n });\n\n // Handle action URL (links are marks in ProseMirror, not nodes)\n // Always remove existing link mark first, then add new one if needed\n tr.removeMark(pos, nodeEnd, state.schema.marks.link);\n if (attrs.actionUrl) {\n const linkMark = state.schema.marks.link.create({\n href: attrs.actionUrl,\n target: '_blank'\n });\n tr.addMark(pos, nodeEnd, linkMark);\n }\n\n tiptapEditor.view.dispatch(tr);\n imageUpdated = true;\n }\n\n // Clear the ref after save\n editingImageElementRef.current = null;\n\n // Trigger blur callback to persist image changes to redux\n // Without this, edited images won't be saved until user manually blurs the editor\n if (imageUpdated && onBlur) {\n onBlur();\n }\n };\n\n // Update editor when props change\n useAfterInitialEffect(() => {\n iframeEditorRef.current?.setEditable(!readOnly && !disabled);\n }, [readOnly, disabled]);\n\n // Handle autoFocus\n useEffect(() => {\n if (autoFocus && tiptapEditor) {\n tiptapEditor.commands.focus();\n }\n }, [autoFocus, tiptapEditor]);\n\n // Expose methods via ref\n useImperativeHandle(\n editorRef,\n () => ({\n focus: () => iframeEditorRef.current?.focus(),\n getPlainText: () => iframeEditorRef.current?.getPlainText() ?? '',\n getRichText: () => iframeEditorRef.current?.getRichText() ?? '',\n getHtml: () => iframeEditorRef.current?.getHtml() ?? '',\n clear: () => iframeEditorRef.current?.clear(),\n updateAttachmentAttributes: (imageId: string, uploadProgress?: number, error?: string) => {\n if (!iframeRef.current?.contentDocument) return;\n\n const iframeDoc = iframeRef.current.contentDocument;\n const imageCustomEl = iframeDoc.querySelector(`pega-file[data-id=\"${imageId}\"]`);\n\n if (imageCustomEl) {\n if (error) {\n imageCustomEl.setAttribute('data-error', error);\n } else if (uploadProgress !== undefined) {\n imageCustomEl.setAttribute('data-progress', `${uploadProgress}`);\n }\n }\n },\n appendImage: (\n imageData: { src: string; alt: string; attachmentId?: string },\n imageId: string\n ) => {\n if (!iframeRef.current?.contentDocument || !tiptapEditor) return;\n\n const iframeDoc = iframeRef.current.contentDocument;\n const imageUploadEl = iframeDoc.querySelector(`pega-file[data-id=\"${imageId}\"]`);\n\n if (imageUploadEl) {\n // Create img element\n const imgEl = iframeDoc.createElement('img');\n imgEl.setAttribute('src', imageData.src);\n imgEl.setAttribute('alt', imageData.alt);\n if (imageData.attachmentId) {\n imgEl.setAttribute('data-attachment-id', imageData.attachmentId);\n }\n\n const anchorEl = iframeDoc.createElement('a');\n const pendingActionUrl = pendingImageActionUrlsRef.current.get(imageId);\n anchorEl.setAttribute('href', pendingActionUrl || imageData.src);\n anchorEl.setAttribute('target', '_blank');\n anchorEl.setAttribute('rel', 'noopener noreferrer');\n anchorEl.appendChild(imgEl);\n\n // Replace pega-file with linked img in the DOM\n imageUploadEl.replaceWith(anchorEl);\n\n // Also update the Tiptap document\n const html = tiptapEditor.getHTML();\n const updatedHtml = html.replace(\n new RegExp(`<pega-file[^>]*data-id=[\"']${imageId}[\"'][^>]*>.*?</pega-file>`, 'g'),\n anchorEl.outerHTML\n );\n\n if (updatedHtml !== html) {\n tiptapEditor.commands.setContent(updatedHtml, { emitUpdate: false });\n }\n\n pendingImageActionUrlsRef.current.delete(imageId);\n }\n },\n insertText: (text: string) => iframeEditorRef.current?.insertText(text),\n setCursorLocationToStart: () => iframeEditorRef.current?.setCursorLocationToStart(),\n insertHtml: (html: string, overwrite?: boolean) =>\n iframeEditorRef.current?.insertHtml(html, overwrite),\n getEditor: () => iframeEditorRef.current?.getEditor() ?? null,\n element: formFieldRef.current || undefined\n }),\n [tiptapEditor]\n );\n\n const ctx = useMemo(\n () => ({\n editor: tiptapEditor,\n addImage: (image: File, imageId?: string, alt?: string, actionUrl?: string) => {\n if (!tiptapEditor || !image) return;\n\n const imgId = imageId || `img-${Date.now()}-${Math.random().toString(36).substring(2, 11)}`;\n\n if (actionUrl) {\n pendingImageActionUrlsRef.current.set(imgId, actionUrl);\n }\n\n // Create pega-file element to show upload progress\n const pegaFileHtml = `<br/><pega-file data-id='${imgId}' data-progress='0' data-name='${image.name}' data-alt='${alt || image.name}' contenteditable='false'></pega-file><br/>`;\n\n // Insert the pega-file element\n tiptapEditor.chain().focus().insertContent(pegaFileHtml).run();\n\n // Trigger the onImageAdded callback so consumer can upload and call appendImage\n onImageAdded?.(image, imgId, alt);\n }\n }),\n [tiptapEditor, onImageAdded]\n );\n\n const renderSuggestionEditor = useCallback(\n (suggestionProps: {\n defaultValue?: string;\n disabled: boolean;\n readOnly: boolean;\n onGetContent: (getContent: () => string) => void;\n onContentChange: (hasContent: boolean) => void;\n }) => (\n <SuggestionEditor\n defaultValue={suggestionProps.defaultValue}\n disabled={suggestionProps.disabled}\n readOnly={suggestionProps.readOnly}\n onGetContent={suggestionProps.onGetContent}\n onContentChange={suggestionProps.onContentChange}\n renderEditor={({\n ref: suggestionEditorRef,\n onInit: suggestionOnInit,\n onChange: suggestionOnChange\n }) => (\n <Editor\n ref={suggestionEditorRef}\n label={t('ai_rewrite_result_label')}\n labelHidden\n toolbar={SUGGESTION_TOOLBAR}\n defaultValue={suggestionProps.defaultValue}\n disabled={suggestionProps.disabled}\n readOnly={suggestionProps.readOnly}\n height={height}\n onInit={suggestionOnInit}\n onChange={suggestionOnChange}\n />\n )}\n />\n ),\n [height, t]\n );\n\n return (\n <EditorContext.Provider value={ctx}>\n <StyledEditorRoot\n testId={testIds}\n label={label}\n labelFor=''\n labelId={labelId}\n labelHidden={labelHidden}\n id={editorId}\n info={info}\n status={status}\n required={required}\n disabled={disabled}\n readOnly={readOnly}\n suggestion={suggestion}\n ref={formFieldRef}\n additionalInfo={additionalInfo}\n >\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 hasSuggestion={status === 'pending'}\n >\n <StyledEditorContainer ref={editorContainerRef}>\n {progress ? (\n <Progress\n placement='local'\n message={typeof progress === 'string' ? progress : undefined}\n />\n ) : null}\n {/* Title attribute is required for iframe accessibility (WCAG) */}\n <StyledEditorIframe\n data-testid={testIds.iframe}\n title={typeof label === 'string' ? label : t('rte_text_formatting_toolbar')}\n role='application'\n aria-label={typeof label === 'string' ? label : t('rte_text_formatting_toolbar')}\n aria-describedby={required ? requiredDescriptionId : undefined}\n ref={iframeRef}\n tabIndex={sourceMode ? -1 : 0}\n $minHeight={height?.min}\n $maxHeight={height?.max}\n $hidden={sourceMode}\n />\n {required ? (\n <HiddenText id={requiredDescriptionId}>{t('required')}</HiddenText>\n ) : null}\n {sourceMode ? (\n <StyledSourceTextarea\n value={sourceCode}\n onChange={e => setSourceCode(e.target.value)}\n spellCheck={false}\n aria-label={t('rte_source_code')}\n $minHeight={height?.min}\n $maxHeight={height?.max}\n />\n ) : null}\n {(toolbar?.length || customActions?.length) && tiptapEditor ? (\n <Toolbar\n testId={testIds}\n features={toolbar || []}\n editor={tiptapEditor}\n customActions={customActions}\n imageInsertionMode={imageInsertionMode}\n onRewriteClick={onRewriteClick}\n linkCustomSource={linkCustomSource}\n imageCustomSource={imageCustomSource}\n renderSuggestionEditor={renderSuggestionEditor}\n sourceMode={sourceMode}\n onSourceModeToggle={(isSourceMode: boolean) => {\n if (isSourceMode) {\n setSourceCode(tiptapEditor.getHTML());\n } else {\n tiptapEditor.commands.setContent(sourceCode);\n }\n setSourceMode(isSourceMode);\n }}\n />\n ) : null}\n {imagesEnabled && !readOnly && !disabled ? (\n <ImageActionButtons\n ref={editButtonRef}\n position={hoveredImagePosition}\n containerRef={editorContainerRef}\n onEdit={onEditButtonClick}\n onDelete={handleImageDelete}\n onMouseEnter={() => setIsOverButtons(true)}\n onMouseLeave={() => setIsOverButtons(false)}\n editLabel={t('rte_edit_image', [currentImageAttrs?.alt || ''])}\n deleteLabel={t('rte_delete_image', [currentImageAttrs?.alt || ''])}\n />\n ) : null}\n {tablesEnabled && !readOnly && !disabled && !sourceMode ? (\n <TableCellMenu\n ref={tableCellMenuButtonRef}\n position={cellPosition}\n containerRef={editorContainerRef}\n onAddRowBelow={addRowBelow}\n onAddRowAbove={addRowAbove}\n onAddColumnAfter={addColumnAfter}\n onAddColumnBefore={addColumnBefore}\n onDeleteRow={deleteRow}\n onDeleteColumn={deleteColumn}\n onDeleteTable={deleteTable}\n onGoToNextCell={goToNextCell}\n onReturnToCell={returnToCell}\n onMouseEnter={() => setIsOverTableMenu(true)}\n onMouseLeave={() => setIsOverTableMenu(false)}\n labels={{\n tableOptions: t('rte_table_options'),\n addRowBelow: t('rte_add_row_below'),\n addRowAbove: t('rte_add_row_above'),\n addColumnAfter: t('rte_add_column_after'),\n addColumnBefore: t('rte_add_column_before'),\n deleteRow: t('rte_delete_row'),\n deleteColumn: t('rte_delete_column'),\n deleteTable: t('rte_delete_table')\n }}\n />\n ) : null}\n </StyledEditorContainer>\n </FormControl>\n {toolbar?.includes('word-count') && tiptapEditor ? (\n <WordCount data-testid={testIds.wordCount} editor={tiptapEditor} />\n ) : null}\n </>\n </StyledEditorRoot>\n {children}\n {imageEditDialog.attributes && (\n <ImageEditDialog\n isOpen={imageEditDialog.isOpen}\n onClose={() => {\n setImageEditDialog({ isOpen: false, attributes: null });\n }}\n onSave={handleImageEditSave}\n initialAttributes={imageEditDialog.attributes}\n target={editButtonRef.current}\n imageCustomSource={imageCustomSource}\n />\n )}\n </EditorContext.Provider>\n );\n});\n\nexport default withTestIds(Editor, getEditorTestIds);\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"Editor.styles.d.ts","sourceRoot":"","sources":["../../../src/components/Editor/Editor.styles.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,qBAAqB,6NAOjC,CAAC;AAIF,UAAU,uBAAuB;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,eAAO,MAAM,kBAAkB,wQAyB9B,CAAC;AAIF,eAAO,MAAM,gBAAgB;2BA6D+nC,CAAC;iDA7D1mC,CAAC;AAIpD,eAAO,MAAM,iBAAiB,0dAQ5B,CAAC;AAIH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;qSAE5B,CAAC;AAIF,UAAU,yBAAyB;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,oBAAoB,gRA+BhC,CAAC"}
1
+ {"version":3,"file":"Editor.styles.d.ts","sourceRoot":"","sources":["../../../src/components/Editor/Editor.styles.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,qBAAqB,6NAOjC,CAAC;AAIF,UAAU,uBAAuB;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,eAAO,MAAM,kBAAkB,wQAyB9B,CAAC;AAIF,eAAO,MAAM,gBAAgB;2BA6D+gE,CAAC;iDA7D1/D,CAAC;AAIpD,eAAO,MAAM,iBAAiB,0dAQ5B,CAAC;AAIH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;qSAE5B,CAAC;AAIF,UAAU,yBAAyB;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,oBAAoB,gRA+BhC,CAAC"}
@@ -15,6 +15,7 @@ export interface IframeTiptapEditorProps {
15
15
  onImageAdded?: (image: File, id: string, altText?: string) => void;
16
16
  imagesEnabled?: boolean;
17
17
  linksEnabled?: boolean;
18
+ colorsEnabled?: boolean;
18
19
  imageInsertionMode?: 'file' | 'url' | 'all';
19
20
  pastedImagesRef?: MutableRefObject<File[]>;
20
21
  editorId?: string;
@@ -27,5 +28,5 @@ export interface IframeTiptapEditorProps {
27
28
  onFocusTableMenu?: () => void;
28
29
  onFocusPreviousCellMenu?: () => void;
29
30
  }
30
- export declare const IframeTiptapEditor: ({ placeholder, defaultValue, disabled, readOnly, onChange, onKeyDown, onFocus, onBlur, onInit, editorRef, spellcheck, customElements, initOptions, onImageAdded, imagesEnabled, linksEnabled, imageInsertionMode, pastedImagesRef, editorId, secure, preserveTableStyles, onFocusTableMenu, onFocusPreviousCellMenu }: IframeTiptapEditorProps) => import("react/jsx-runtime").JSX.Element;
31
+ export declare const IframeTiptapEditor: ({ placeholder, defaultValue, disabled, readOnly, onChange, onKeyDown, onFocus, onBlur, onInit, editorRef, spellcheck, customElements, initOptions, onImageAdded, imagesEnabled, linksEnabled, colorsEnabled, imageInsertionMode, pastedImagesRef, editorId, secure, preserveTableStyles, onFocusTableMenu, onFocusPreviousCellMenu }: IframeTiptapEditorProps) => import("react/jsx-runtime").JSX.Element;
31
32
  //# sourceMappingURL=IframeTiptapEditor.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"IframeTiptapEditor.d.ts","sourceRoot":"","sources":["../../../src/components/Editor/IframeTiptapEditor.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,cAAc,CAAC;AAmB3D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAC;AAI9C,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACnE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAqQjE,MAAM,WAAW,uBAAuB;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,CAAC;IAC1C,SAAS,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;IAC5C,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,CAAC;IACxC,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACnE,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,kBAAkB,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,KAAK,CAAC;IAC5C,eAAe,CAAC,EAAE,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAC;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,gBAAgB,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAAC;IACvD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,eAAe,EAAE,CAAC;IACnC,WAAW,CAAC,EAAE,WAAW,CAAC,aAAa,CAAC,CAAC;IACzC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9B,uBAAuB,CAAC,EAAE,MAAM,IAAI,CAAC;CACtC;AAGD,eAAO,MAAM,kBAAkB,GAAI,uTAwBhC,uBAAuB,4CAkezB,CAAC"}
1
+ {"version":3,"file":"IframeTiptapEditor.d.ts","sourceRoot":"","sources":["../../../src/components/Editor/IframeTiptapEditor.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,cAAc,CAAC;AAmB3D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAC;AAI9C,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACnE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAqQjE,MAAM,WAAW,uBAAuB;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,CAAC;IAC1C,SAAS,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,aAAa,KAAK,IAAI,CAAC;IAC5C,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,CAAC;IACxC,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACnE,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,KAAK,CAAC;IAC5C,eAAe,CAAC,EAAE,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAC;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,gBAAgB,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAAC;IACvD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,eAAe,EAAE,CAAC;IACnC,WAAW,CAAC,EAAE,WAAW,CAAC,aAAa,CAAC,CAAC;IACzC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9B,uBAAuB,CAAC,EAAE,MAAM,IAAI,CAAC;CACtC;AAGD,eAAO,MAAM,kBAAkB,GAAI,sUAyBhC,uBAAuB,4CAkezB,CAAC"}
@@ -232,7 +232,7 @@ const getFileFromUrl = async (url, name) => {
232
232
  }
233
233
  };
234
234
  // Component that renders inside the iframe
235
- export const IframeTiptapEditor = ({ placeholder, defaultValue, disabled, readOnly, onChange, onKeyDown, onFocus, onBlur, onInit, editorRef, spellcheck = true, customElements = [], initOptions, onImageAdded, imagesEnabled = false, linksEnabled = true, imageInsertionMode = 'all', pastedImagesRef, editorId = '', secure = false, preserveTableStyles = false, onFocusTableMenu, onFocusPreviousCellMenu }) => {
235
+ export const IframeTiptapEditor = ({ placeholder, defaultValue, disabled, readOnly, onChange, onKeyDown, onFocus, onBlur, onInit, editorRef, spellcheck = true, customElements = [], initOptions, onImageAdded, imagesEnabled = false, linksEnabled = true, colorsEnabled = false, imageInsertionMode = 'all', pastedImagesRef, editorId = '', secure = false, preserveTableStyles = false, onFocusTableMenu, onFocusPreviousCellMenu }) => {
236
236
  // Keep callbacks in refs so the extension always has access to the latest callback
237
237
  const onFocusTableMenuRef = useRef(onFocusTableMenu);
238
238
  onFocusTableMenuRef.current = onFocusTableMenu;
@@ -351,7 +351,7 @@ export const IframeTiptapEditor = ({ placeholder, defaultValue, disabled, readOn
351
351
  Subscript,
352
352
  Superscript,
353
353
  TextStyle,
354
- Color,
354
+ ...(colorsEnabled ? [Color] : []),
355
355
  Highlight.configure({
356
356
  multicolor: true
357
357
  }),
@@ -1 +1 @@
1
- {"version":3,"file":"IframeTiptapEditor.js","sourceRoot":"","sources":["../../../src/components/Editor/IframeTiptapEditor.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useEditor, EditorContent } from '@tiptap/react';\nimport { Extension, Node } from '@tiptap/core';\nimport type { Editor as TiptapEditor } from '@tiptap/core';\nimport type { Node as ProseMirrorNode } from '@tiptap/pm/model';\nimport StarterKit from '@tiptap/starter-kit';\nimport Placeholder from '@tiptap/extension-placeholder';\nimport Link from '@tiptap/extension-link';\nimport Underline from '@tiptap/extension-underline';\nimport Subscript from '@tiptap/extension-subscript';\nimport Superscript from '@tiptap/extension-superscript';\nimport { TextStyle } from '@tiptap/extension-text-style';\nimport { Color } from '@tiptap/extension-color';\nimport Highlight from '@tiptap/extension-highlight';\nimport FontFamily from '@tiptap/extension-font-family';\nimport TextAlign from '@tiptap/extension-text-align';\nimport { Table } from '@tiptap/extension-table';\nimport TableRow from '@tiptap/extension-table-row';\nimport TableCell from '@tiptap/extension-table-cell';\nimport TableHeader from '@tiptap/extension-table-header';\nimport OfficePaste from '@intevation/tiptap-extension-office-paste';\nimport { useEffect, useImperativeHandle, useMemo, useRef } from 'react';\nimport type { MutableRefObject } from 'react';\n\nimport { createUID } from '@pega/cosmos-react-core';\n\nimport type { EditorProps, CustomComponent } from './Editor.types';\nimport type { IframeEditorHandle } from './hooks/useIframeSetup';\nimport { TextIndent } from './extensions/TextIndent';\nimport { PreserveDiv } from './extensions/PreserveDiv';\nimport { FontSize } from './extensions/FontSize';\nimport TableCellSelection from './extensions/TableCellSelection';\nimport {\n BlockquoteWithStyle,\n ParagraphWithStyle,\n HeadingWithStyle,\n ImageWithDataAttachmentId,\n TableWithStyle,\n TableRowWithStyle,\n TableCellWithStyle,\n TableHeaderWithStyle\n} from './extensions/PreserveAttributes';\nimport sanitizeHtml from './sanitize';\n\n// Helper to check if cursor is at end of table cell content\nconst isAtEndOfCell = (editor: TiptapEditor): boolean => {\n const { state } = editor;\n const { selection } = state;\n\n if (!selection.empty) return false;\n\n const isInTable = editor.isActive('tableCell') || editor.isActive('tableHeader');\n if (!isInTable) return false;\n\n const $pos = selection.$from;\n\n // Check if there's any content after the cursor within the cell\n // by checking if we're at the end of the parent (paragraph) and it's the last child of the cell\n const parentEnd = $pos.end($pos.depth);\n const atEndOfParagraph = $pos.pos === parentEnd;\n\n if (!atEndOfParagraph) return false;\n\n // Check if this paragraph is the last block in the cell\n let cellDepth = $pos.depth;\n while (cellDepth > 0) {\n const node = $pos.node(cellDepth);\n if (node.type.name === 'tableCell' || node.type.name === 'tableHeader') {\n break;\n }\n cellDepth -= 1;\n }\n\n if (cellDepth === 0) return false;\n\n const cellNode = $pos.node(cellDepth);\n const indexInCell = $pos.index(cellDepth);\n const isLastBlock = indexInCell === cellNode.childCount - 1;\n\n return atEndOfParagraph && isLastBlock;\n};\n\n// Helper to check if cursor is at start of table cell content\nconst isAtStartOfCell = (editor: TiptapEditor): boolean => {\n const { state } = editor;\n const { selection } = state;\n\n if (!selection.empty) return false;\n\n const isInTable = editor.isActive('tableCell') || editor.isActive('tableHeader');\n if (!isInTable) return false;\n\n const $pos = selection.$from;\n\n // Check if we're at the start of the parent (paragraph)\n const parentStart = $pos.start($pos.depth);\n const atStartOfParagraph = $pos.pos === parentStart;\n\n if (!atStartOfParagraph) return false;\n\n // Check if this paragraph is the first block in the cell\n let cellDepth = $pos.depth;\n while (cellDepth > 0) {\n const node = $pos.node(cellDepth);\n if (node.type.name === 'tableCell' || node.type.name === 'tableHeader') {\n break;\n }\n cellDepth -= 1;\n }\n\n if (cellDepth === 0) return false;\n\n const indexInCell = $pos.index(cellDepth);\n const isFirstBlock = indexInCell === 0;\n\n return atStartOfParagraph && isFirstBlock;\n};\n\n// Custom keyboard shortcuts that match the toolbar tooltips\nconst CustomKeyboardShortcuts = Extension.create<{\n onFocusTableMenu?: () => void;\n onFocusPreviousCellMenu?: () => void;\n}>({\n name: 'customKeyboardShortcuts',\n\n addOptions() {\n return {\n onFocusTableMenu: undefined,\n onFocusPreviousCellMenu: undefined\n };\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-Shift-x': () => this.editor.commands.toggleStrike(),\n 'Mod-Shift-l': () => this.editor.commands.toggleBulletList(),\n // Override Tab in tables to prevent auto-adding rows\n Tab: () => {\n if (this.editor.isActive('table')) {\n // Just navigate, don't add rows - goToNextCell returns false at last cell\n this.editor.commands.goToNextCell();\n return true; // Consume the event either way\n }\n return false;\n },\n 'Shift-Tab': () => {\n if (this.editor.isActive('table')) {\n this.editor.commands.goToPreviousCell();\n return true;\n }\n return false;\n },\n ArrowRight: () => {\n if (isAtEndOfCell(this.editor) && this.options.onFocusTableMenu) {\n this.options.onFocusTableMenu();\n return true;\n }\n return false;\n },\n ArrowLeft: () => {\n if (isAtStartOfCell(this.editor) && this.options.onFocusPreviousCellMenu) {\n this.options.onFocusPreviousCellMenu();\n return true;\n }\n return false;\n }\n };\n }\n});\n\n// Extension to delete empty table on repeated delete/backspace in empty cell\nconst TableDeleteOnEmpty = Extension.create({\n name: 'tableDeleteOnEmpty',\n\n addStorage() {\n return {\n deleteCount: 0,\n lastDeleteTime: 0\n };\n },\n\n addKeyboardShortcuts() {\n const handleDelete = () => {\n const { editor } = this;\n const { state } = editor;\n const { selection } = state;\n\n // Check if we're in a table cell\n const isInTable = editor.isActive('tableCell') || editor.isActive('tableHeader');\n\n if (!isInTable) {\n this.storage.deleteCount = 0;\n return false;\n }\n\n // Find the current cell node\n const $pos = selection.$from;\n let cellDepth = $pos.depth;\n while (cellDepth > 0) {\n const node = $pos.node(cellDepth);\n if (node.type.name === 'tableCell' || node.type.name === 'tableHeader') {\n break;\n }\n cellDepth -= 1;\n }\n\n if (cellDepth === 0) {\n this.storage.deleteCount = 0;\n return false;\n }\n\n const cellNode = $pos.node(cellDepth);\n const cellContent = cellNode.textContent.trim();\n\n // If cell has content, reset counter and let default behavior handle it\n if (cellContent.length > 0) {\n this.storage.deleteCount = 0;\n return false;\n }\n\n // Find the table node and check if entire table is empty\n let tableDepth = cellDepth;\n while (tableDepth > 0) {\n const node = $pos.node(tableDepth);\n if (node.type.name === 'table') {\n break;\n }\n tableDepth -= 1;\n }\n\n if (tableDepth === 0) {\n this.storage.deleteCount = 0;\n return false;\n }\n\n const tableNode = $pos.node(tableDepth);\n const tableContent = tableNode.textContent.trim();\n\n // Only allow table deletion if entire table is empty\n if (tableContent.length > 0) {\n this.storage.deleteCount = 0;\n return false;\n }\n\n // Table is empty - increment delete counter\n const now = Date.now();\n // Reset counter if more than 1 second since last delete\n if (now - this.storage.lastDeleteTime > 1000) {\n this.storage.deleteCount = 0;\n }\n\n this.storage.deleteCount += 1;\n this.storage.lastDeleteTime = now;\n\n // After 3 deletes in empty table, delete the table\n if (this.storage.deleteCount >= 3) {\n this.storage.deleteCount = 0;\n editor.chain().focus().deleteTable().run();\n return true;\n }\n\n return false;\n };\n\n return {\n Backspace: handleDelete,\n Delete: handleDelete\n };\n }\n});\n\ntype ImageInfoArray = { id: string; url: string; name: string }[];\n\nconst getFileFromUrl = async (url: string, name: string): Promise<File | null> => {\n try {\n const response = await fetch(url);\n if (!response.ok) {\n return null;\n }\n const data = await response.blob();\n return new File([data], name, {\n type: data.type\n });\n } catch {\n return null;\n }\n};\n\nexport interface IframeTiptapEditorProps {\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 onImageAdded?: (image: File, id: string, altText?: string) => void;\n imagesEnabled?: boolean;\n linksEnabled?: boolean;\n imageInsertionMode?: 'file' | 'url' | 'all';\n pastedImagesRef?: MutableRefObject<File[]>;\n editorId?: string;\n editorRef: MutableRefObject<IframeEditorHandle | null>;\n spellcheck?: boolean;\n customElements?: CustomComponent[];\n initOptions?: EditorProps['initOptions'];\n secure?: boolean;\n preserveTableStyles?: boolean;\n onFocusTableMenu?: () => void;\n onFocusPreviousCellMenu?: () => void;\n}\n\n// Component that renders inside the iframe\nexport const IframeTiptapEditor = ({\n placeholder,\n defaultValue,\n disabled,\n readOnly,\n onChange,\n onKeyDown,\n onFocus,\n onBlur,\n onInit,\n editorRef,\n spellcheck = true,\n customElements = [],\n initOptions,\n onImageAdded,\n imagesEnabled = false,\n linksEnabled = true,\n imageInsertionMode = 'all',\n pastedImagesRef,\n editorId = '',\n secure = false,\n preserveTableStyles = false,\n onFocusTableMenu,\n onFocusPreviousCellMenu\n}: IframeTiptapEditorProps) => {\n // Keep callbacks in refs so the extension always has access to the latest callback\n const onFocusTableMenuRef = useRef(onFocusTableMenu);\n onFocusTableMenuRef.current = onFocusTableMenu;\n\n const onFocusPreviousCellMenuRef = useRef(onFocusPreviousCellMenu);\n onFocusPreviousCellMenuRef.current = onFocusPreviousCellMenu;\n\n // Process pasted image URLs and convert to File objects\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 if (file) {\n onImageAdded?.(file, infoArr[i].id);\n }\n });\n };\n\n // Generate Tiptap extensions for custom components\n const customComponentExtensions = useMemo(() => {\n return customElements.map((component: CustomComponent) => {\n return Node.create({\n name: component.name,\n group: 'inline',\n inline: true,\n atom: true,\n content: 'text*', // Allow text content inside\n\n addAttributes() {\n const attrs: Record<string, { default: null }> = {};\n if (component.extensionAttributes) {\n component.extensionAttributes.forEach((attr: string) => {\n attrs[attr] = { default: null };\n });\n }\n // Add common attributes for pega-file\n attrs['data-id'] = { default: null };\n attrs['data-name'] = { default: null };\n attrs['data-url'] = { default: null };\n attrs['data-progress'] = { default: null };\n attrs['data-error'] = { default: null };\n attrs['data-alt'] = { default: null };\n // Add attributes for pega-reference\n attrs['data-rule-id'] = { default: null };\n attrs['data-rule-type'] = { default: null };\n attrs['data-rule-namespace'] = { default: null };\n attrs.role = { default: null };\n return attrs;\n },\n\n parseHTML() {\n return [\n {\n tag: component.name,\n getAttrs: (node: HTMLElement | string) => {\n if (typeof node === 'string') return null;\n const attrs: Record<string, string | null> = {};\n // Get all data attributes and role\n Array.from(node.attributes).forEach(attr => {\n if (\n attr.name.startsWith('data-') ||\n attr.name === 'role' ||\n component.extensionAttributes?.includes(attr.name)\n ) {\n attrs[attr.name] = attr.value;\n }\n });\n return attrs;\n }\n }\n ];\n },\n\n renderHTML({\n HTMLAttributes,\n node\n }: {\n HTMLAttributes: Record<string, string | null>;\n node: ProseMirrorNode;\n }) {\n // Get text content from the node\n const textContent = node.textContent || '';\n return [component.name, HTMLAttributes, textContent];\n }\n });\n });\n }, [customElements]);\n\n const editor = useEditor({\n extensions: [\n StarterKit.configure({\n // Exclude link from StarterKit since we're configuring it separately\n link: false,\n // Exclude these so we can use our extended versions with style preservation\n blockquote: false,\n paragraph: false,\n heading: false,\n // Disable text patterns if specified in initOptions\n ...(initOptions?.textPatterns === false && {\n typography: false\n })\n }),\n BlockquoteWithStyle,\n ParagraphWithStyle,\n HeadingWithStyle,\n Placeholder.configure({\n placeholder: placeholder ?? ''\n }),\n TextIndent.configure({\n types: ['paragraph', 'heading']\n }),\n // Link extension is always loaded to preserve existing links in content\n // When linksEnabled is false, autolink is disabled to prevent auto-converting URLs\n Link.configure({\n openOnClick: false,\n autolink: linksEnabled,\n linkOnPaste: linksEnabled,\n HTMLAttributes: {\n target: '_blank',\n rel: 'noopener noreferrer'\n }\n }),\n // Image extension is always loaded to render existing images in content\n // The imagesEnabled flag controls whether NEW images can be inserted (via paste/drop handlers)\n ImageWithDataAttachmentId.configure({\n inline: true,\n allowBase64: true\n }),\n // Text formatting extensions\n Underline,\n Subscript,\n Superscript,\n TextStyle,\n Color,\n Highlight.configure({\n multicolor: true\n }),\n FontFamily,\n FontSize,\n // Alignment\n TextAlign.configure({\n types: ['heading', 'paragraph']\n }),\n // Table extensions - use style-preserving versions for correspondence editing\n ...(preserveTableStyles\n ? [\n TableWithStyle.configure({ resizable: false }),\n TableRowWithStyle,\n TableHeaderWithStyle,\n TableCellWithStyle\n ]\n : [Table.configure({ resizable: true }), TableRow, TableHeader, TableCell]),\n TableDeleteOnEmpty,\n TableCellSelection,\n CustomKeyboardShortcuts.configure({\n onFocusTableMenu: () => onFocusTableMenuRef.current?.(),\n onFocusPreviousCellMenu: () => onFocusPreviousCellMenuRef.current?.()\n }),\n PreserveDiv,\n OfficePaste,\n ...customComponentExtensions\n ],\n content: defaultValue,\n editable: !disabled && !readOnly,\n editorProps: {\n attributes: {\n class: 'ProseMirror',\n spellcheck: spellcheck ? 'true' : 'false'\n },\n handleDOMEvents: {\n keydown: (_view, event) => {\n onKeyDown?.(event);\n return false; // Allow other handlers to process\n },\n paste: (_view, event) => {\n // Block pasted image files when images are disabled\n if (!imagesEnabled && event.clipboardData?.files) {\n const hasImageFile = Array.from(event.clipboardData.files).some(file =>\n file.type.startsWith('image/')\n );\n if (hasImageFile) {\n event.preventDefault();\n return true;\n }\n }\n // Track pasted files for later processing\n if (\n event.clipboardData?.files &&\n event.clipboardData.files.length > 0 &&\n pastedImagesRef\n ) {\n pastedImagesRef.current = Array.from(event.clipboardData.files);\n }\n return false; // Let handlePaste process\n },\n drop: (_view, event) => {\n // Block dropped image files when images are disabled\n if (!imagesEnabled && event.dataTransfer?.files) {\n const hasImageFile = Array.from(event.dataTransfer.files).some(file =>\n file.type.startsWith('image/')\n );\n if (hasImageFile) {\n event.preventDefault();\n return true;\n }\n }\n return false;\n }\n },\n // Handle paste behavior based on initOptions\n handlePaste: (view, event) => {\n // If pasteAsText is enabled, convert to plain text\n if (initOptions?.pasteAsText) {\n event.preventDefault();\n const text = event.clipboardData?.getData('text/plain');\n if (text) {\n view.dispatch(view.state.tr.insertText(text));\n }\n return true;\n }\n\n let html = event.clipboardData?.getData('text/html');\n const text = event.clipboardData?.getData('text/plain');\n const shouldPreferTextPaste = Boolean(text?.trim()) || Boolean(html?.trim());\n\n // If secure mode is enabled, sanitize pasted HTML content first\n if (secure && html) {\n html = sanitizeHtml(html);\n }\n\n const isImg = html && html.includes('<img');\n const hasLinks = html && /<a\\s/i.test(html);\n\n // If links are disabled, handle paste to prevent link creation\n if (!linksEnabled) {\n // Check if pasting HTML with <a> tags - strip them\n if (hasLinks && html) {\n event.preventDefault();\n // Replace <a> tags with their text content\n const strippedHtml = html.replace(/<a\\s[^>]*>([\\s\\S]*?)<\\/a>/gi, '$1');\n const currentEditor = editorRef.current?.getEditor();\n if (currentEditor) {\n currentEditor.chain().focus().insertContent(strippedHtml).run();\n }\n return true;\n }\n\n // Check if pasting plain text that looks like a URL - insert as plain text\n const urlPattern = /^(https?:\\/\\/|www\\.)\\S+$/i;\n if (text && urlPattern.test(text.trim())) {\n event.preventDefault();\n view.dispatch(view.state.tr.insertText(text));\n return true;\n }\n }\n\n // If images are disabled or mode is url-only, strip images from pasted content\n if ((!imagesEnabled || imageInsertionMode === 'url') && isImg && html) {\n event.preventDefault();\n const cleanedHtml = html.replace(/<img[^>]*\\/?>/g, '');\n const tempDiv = document.createElement('div');\n tempDiv.innerHTML = cleanedHtml;\n view.dispatch(\n view.state.tr.replaceSelectionWith(\n view.state.schema.nodes.paragraph.create(\n null,\n view.state.schema.text(tempDiv.textContent || '')\n )\n )\n );\n return true;\n }\n\n // If pasteDataImages is disabled, strip images from pasted content\n if (initOptions?.pasteDataImages === false && isImg && html) {\n event.preventDefault();\n const cleanedHtml = html.replace(/<img[^>]*>/g, '');\n const tempDiv = document.createElement('div');\n tempDiv.innerHTML = cleanedHtml;\n view.dispatch(\n view.state.tr.replaceSelectionWith(\n view.state.schema.nodes.paragraph.create(\n null,\n view.state.schema.text(tempDiv.textContent || '')\n )\n )\n );\n return true;\n }\n\n // Handle raw image file pasting (e.g., screenshot, file from disk)\n // Prioritize raw files over HTML with blob URLs since blob URLs may fail to fetch\n const files = event.clipboardData?.files;\n if (\n imagesEnabled &&\n imageInsertionMode !== 'url' &&\n !shouldPreferTextPaste &&\n files &&\n files.length > 0\n ) {\n const imageFiles = Array.from(files).filter(file => file.type.startsWith('image/'));\n\n if (imageFiles.length > 0) {\n event.preventDefault();\n\n imageFiles.forEach(file => {\n const imgId = createUID();\n\n // Create pega-file element to show upload progress\n const pegaFileHtml = `<br/><pega-file data-id='${imgId}' data-progress='0' data-name='${file.name}' data-alt='${file.name}' contenteditable='false'></pega-file><br/>`;\n\n // Insert the pega-file element\n const currentEditor = editorRef.current?.getEditor();\n if (currentEditor) {\n currentEditor.chain().focus().insertContent(pegaFileHtml).run();\n }\n\n // Trigger the onImageAdded callback so consumer can upload and call appendImage\n onImageAdded?.(file, imgId, file.name);\n });\n\n return true;\n }\n }\n\n // Process pasted images from HTML (fallback when no raw files available)\n if (imagesEnabled && isImg && html) {\n event.preventDefault();\n\n const pastedHtml = new DOMParser().parseFromString(html, 'text/html').body;\n const imgInfo: ImageInfoArray = [];\n\n pastedHtml.querySelectorAll('img').forEach(imgEl => {\n const imgId = createUID();\n const url = imgEl.src;\n const name = pastedImagesRef?.current.shift()?.name || editorId || 'pasted-image';\n\n imgInfo.push({ id: imgId, url, name });\n\n // Create pega-file element to show upload progress\n const uploadEl = document.createElement('pega-file');\n uploadEl.setAttribute('data-id', imgId);\n uploadEl.setAttribute('data-name', name);\n uploadEl.setAttribute('data-url', url);\n uploadEl.setAttribute('data-progress', '0');\n uploadEl.setAttribute('contenteditable', 'false');\n\n const uploadElString = `<br/>${uploadEl.outerHTML}<br/>`;\n const uploadElHtml = new DOMParser().parseFromString(uploadElString, 'text/html').body;\n\n imgEl.replaceWith(uploadElHtml);\n });\n\n // Insert the modified HTML\n const modifiedHtml = pastedHtml.innerHTML;\n view.dispatch(view.state.tr.insertText(''));\n\n // Use setTimeout to ensure the DOM is ready\n setTimeout(() => {\n const currentEditor = editorRef.current?.getEditor();\n if (currentEditor) {\n currentEditor.chain().focus().insertContent(modifiedHtml).run();\n }\n }, 0);\n\n // Process the pasted image URLs\n processPastedImgUrls(imgInfo).catch(() => {\n // Errors are handled inside processPastedImgUrls\n });\n\n return true;\n }\n\n return false;\n },\n // Handle drag-and-drop of image files from the system\n handleDrop: (view, event, _slice, moved) => {\n // Only handle drops from outside the editor (not internal moves)\n if (moved) {\n return false;\n }\n\n const files = event.dataTransfer?.files;\n if (!imagesEnabled || imageInsertionMode === 'url' || !files || files.length === 0) {\n return false;\n }\n\n const imageFiles = Array.from(files).filter(file => file.type.startsWith('image/'));\n\n if (imageFiles.length === 0) {\n return false;\n }\n\n event.preventDefault();\n\n const dropEditor = editorRef.current?.getEditor();\n if (!dropEditor) {\n return false;\n }\n\n // Set cursor position to where the drop occurred\n const coordinates = view.posAtCoords({ left: event.clientX, top: event.clientY });\n if (coordinates) {\n dropEditor.commands.setTextSelection(coordinates.pos);\n }\n\n imageFiles.forEach(file => {\n const imgId = createUID();\n\n // Create pega-file element to show upload progress\n const pegaFileHtml = `<br/><pega-file data-id='${imgId}' data-progress='0' data-name='${file.name}' data-alt='${file.name}' contenteditable='false'></pega-file><br/>`;\n\n // Insert the pega-file element\n dropEditor.chain().focus().insertContent(pegaFileHtml).run();\n\n // Trigger the onImageAdded callback so consumer can upload and call appendImage\n onImageAdded?.(file, imgId, file.name);\n });\n\n return true;\n }\n },\n onUpdate: ({ editor: currentEditor }) => {\n // Clear stored link mark if cursor is not inside actual linked text\n // This prevents link styling from persisting after deleting linked text\n const { selection, storedMarks } = currentEditor.state;\n const linkMark = currentEditor.schema.marks.link;\n if (selection.empty && storedMarks?.some(mark => mark.type === linkMark)) {\n const hasLinkInDoc = selection.$from.marks().some(mark => mark.type === linkMark);\n if (!hasLinkInDoc) {\n currentEditor.commands.unsetMark('link');\n // Return early - onChange will fire on the subsequent update with cleaned state\n return;\n }\n }\n onChange?.(currentEditor);\n },\n onFocus: () => {\n onFocus?.();\n },\n onBlur: () => {\n onBlur?.();\n }\n });\n\n useEffect(() => {\n if (editor && onInit) {\n // Call initInstanceCallback if provided\n if (initOptions?.initInstanceCallback) {\n initOptions.initInstanceCallback(editor);\n }\n\n onInit(editor);\n }\n }, [editor, onInit, initOptions]);\n\n useImperativeHandle(\n editorRef,\n () => ({\n focus: () => editor?.chain().focus().run(),\n getPlainText: () => editor?.getText() ?? '',\n getRichText: () => (editor ? JSON.stringify(editor.getJSON()) : ''),\n getHtml: () => editor?.getHTML() ?? '',\n clear: () => editor?.chain().clearContent().run(),\n insertText: (text: string) => editor?.chain().insertContent(text).run(),\n setCursorLocationToStart: () => editor?.chain().focus('start').run(),\n insertHtml: (html: string, overwrite: boolean = false) => {\n if (overwrite) {\n editor?.chain().setContent(html).run();\n } else {\n editor?.chain().insertContent(html).run();\n }\n },\n getEditor: () => editor,\n setEditable: (editable: boolean) => editor?.setEditable(editable)\n }),\n [editor]\n );\n\n return <EditorContent editor={editor} />;\n};\n"]}
1
+ {"version":3,"file":"IframeTiptapEditor.js","sourceRoot":"","sources":["../../../src/components/Editor/IframeTiptapEditor.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useEditor, EditorContent } from '@tiptap/react';\nimport { Extension, Node } from '@tiptap/core';\nimport type { Editor as TiptapEditor } from '@tiptap/core';\nimport type { Node as ProseMirrorNode } from '@tiptap/pm/model';\nimport StarterKit from '@tiptap/starter-kit';\nimport Placeholder from '@tiptap/extension-placeholder';\nimport Link from '@tiptap/extension-link';\nimport Underline from '@tiptap/extension-underline';\nimport Subscript from '@tiptap/extension-subscript';\nimport Superscript from '@tiptap/extension-superscript';\nimport { TextStyle } from '@tiptap/extension-text-style';\nimport { Color } from '@tiptap/extension-color';\nimport Highlight from '@tiptap/extension-highlight';\nimport FontFamily from '@tiptap/extension-font-family';\nimport TextAlign from '@tiptap/extension-text-align';\nimport { Table } from '@tiptap/extension-table';\nimport TableRow from '@tiptap/extension-table-row';\nimport TableCell from '@tiptap/extension-table-cell';\nimport TableHeader from '@tiptap/extension-table-header';\nimport OfficePaste from '@intevation/tiptap-extension-office-paste';\nimport { useEffect, useImperativeHandle, useMemo, useRef } from 'react';\nimport type { MutableRefObject } from 'react';\n\nimport { createUID } from '@pega/cosmos-react-core';\n\nimport type { EditorProps, CustomComponent } from './Editor.types';\nimport type { IframeEditorHandle } from './hooks/useIframeSetup';\nimport { TextIndent } from './extensions/TextIndent';\nimport { PreserveDiv } from './extensions/PreserveDiv';\nimport { FontSize } from './extensions/FontSize';\nimport TableCellSelection from './extensions/TableCellSelection';\nimport {\n BlockquoteWithStyle,\n ParagraphWithStyle,\n HeadingWithStyle,\n ImageWithDataAttachmentId,\n TableWithStyle,\n TableRowWithStyle,\n TableCellWithStyle,\n TableHeaderWithStyle\n} from './extensions/PreserveAttributes';\nimport sanitizeHtml from './sanitize';\n\n// Helper to check if cursor is at end of table cell content\nconst isAtEndOfCell = (editor: TiptapEditor): boolean => {\n const { state } = editor;\n const { selection } = state;\n\n if (!selection.empty) return false;\n\n const isInTable = editor.isActive('tableCell') || editor.isActive('tableHeader');\n if (!isInTable) return false;\n\n const $pos = selection.$from;\n\n // Check if there's any content after the cursor within the cell\n // by checking if we're at the end of the parent (paragraph) and it's the last child of the cell\n const parentEnd = $pos.end($pos.depth);\n const atEndOfParagraph = $pos.pos === parentEnd;\n\n if (!atEndOfParagraph) return false;\n\n // Check if this paragraph is the last block in the cell\n let cellDepth = $pos.depth;\n while (cellDepth > 0) {\n const node = $pos.node(cellDepth);\n if (node.type.name === 'tableCell' || node.type.name === 'tableHeader') {\n break;\n }\n cellDepth -= 1;\n }\n\n if (cellDepth === 0) return false;\n\n const cellNode = $pos.node(cellDepth);\n const indexInCell = $pos.index(cellDepth);\n const isLastBlock = indexInCell === cellNode.childCount - 1;\n\n return atEndOfParagraph && isLastBlock;\n};\n\n// Helper to check if cursor is at start of table cell content\nconst isAtStartOfCell = (editor: TiptapEditor): boolean => {\n const { state } = editor;\n const { selection } = state;\n\n if (!selection.empty) return false;\n\n const isInTable = editor.isActive('tableCell') || editor.isActive('tableHeader');\n if (!isInTable) return false;\n\n const $pos = selection.$from;\n\n // Check if we're at the start of the parent (paragraph)\n const parentStart = $pos.start($pos.depth);\n const atStartOfParagraph = $pos.pos === parentStart;\n\n if (!atStartOfParagraph) return false;\n\n // Check if this paragraph is the first block in the cell\n let cellDepth = $pos.depth;\n while (cellDepth > 0) {\n const node = $pos.node(cellDepth);\n if (node.type.name === 'tableCell' || node.type.name === 'tableHeader') {\n break;\n }\n cellDepth -= 1;\n }\n\n if (cellDepth === 0) return false;\n\n const indexInCell = $pos.index(cellDepth);\n const isFirstBlock = indexInCell === 0;\n\n return atStartOfParagraph && isFirstBlock;\n};\n\n// Custom keyboard shortcuts that match the toolbar tooltips\nconst CustomKeyboardShortcuts = Extension.create<{\n onFocusTableMenu?: () => void;\n onFocusPreviousCellMenu?: () => void;\n}>({\n name: 'customKeyboardShortcuts',\n\n addOptions() {\n return {\n onFocusTableMenu: undefined,\n onFocusPreviousCellMenu: undefined\n };\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-Shift-x': () => this.editor.commands.toggleStrike(),\n 'Mod-Shift-l': () => this.editor.commands.toggleBulletList(),\n // Override Tab in tables to prevent auto-adding rows\n Tab: () => {\n if (this.editor.isActive('table')) {\n // Just navigate, don't add rows - goToNextCell returns false at last cell\n this.editor.commands.goToNextCell();\n return true; // Consume the event either way\n }\n return false;\n },\n 'Shift-Tab': () => {\n if (this.editor.isActive('table')) {\n this.editor.commands.goToPreviousCell();\n return true;\n }\n return false;\n },\n ArrowRight: () => {\n if (isAtEndOfCell(this.editor) && this.options.onFocusTableMenu) {\n this.options.onFocusTableMenu();\n return true;\n }\n return false;\n },\n ArrowLeft: () => {\n if (isAtStartOfCell(this.editor) && this.options.onFocusPreviousCellMenu) {\n this.options.onFocusPreviousCellMenu();\n return true;\n }\n return false;\n }\n };\n }\n});\n\n// Extension to delete empty table on repeated delete/backspace in empty cell\nconst TableDeleteOnEmpty = Extension.create({\n name: 'tableDeleteOnEmpty',\n\n addStorage() {\n return {\n deleteCount: 0,\n lastDeleteTime: 0\n };\n },\n\n addKeyboardShortcuts() {\n const handleDelete = () => {\n const { editor } = this;\n const { state } = editor;\n const { selection } = state;\n\n // Check if we're in a table cell\n const isInTable = editor.isActive('tableCell') || editor.isActive('tableHeader');\n\n if (!isInTable) {\n this.storage.deleteCount = 0;\n return false;\n }\n\n // Find the current cell node\n const $pos = selection.$from;\n let cellDepth = $pos.depth;\n while (cellDepth > 0) {\n const node = $pos.node(cellDepth);\n if (node.type.name === 'tableCell' || node.type.name === 'tableHeader') {\n break;\n }\n cellDepth -= 1;\n }\n\n if (cellDepth === 0) {\n this.storage.deleteCount = 0;\n return false;\n }\n\n const cellNode = $pos.node(cellDepth);\n const cellContent = cellNode.textContent.trim();\n\n // If cell has content, reset counter and let default behavior handle it\n if (cellContent.length > 0) {\n this.storage.deleteCount = 0;\n return false;\n }\n\n // Find the table node and check if entire table is empty\n let tableDepth = cellDepth;\n while (tableDepth > 0) {\n const node = $pos.node(tableDepth);\n if (node.type.name === 'table') {\n break;\n }\n tableDepth -= 1;\n }\n\n if (tableDepth === 0) {\n this.storage.deleteCount = 0;\n return false;\n }\n\n const tableNode = $pos.node(tableDepth);\n const tableContent = tableNode.textContent.trim();\n\n // Only allow table deletion if entire table is empty\n if (tableContent.length > 0) {\n this.storage.deleteCount = 0;\n return false;\n }\n\n // Table is empty - increment delete counter\n const now = Date.now();\n // Reset counter if more than 1 second since last delete\n if (now - this.storage.lastDeleteTime > 1000) {\n this.storage.deleteCount = 0;\n }\n\n this.storage.deleteCount += 1;\n this.storage.lastDeleteTime = now;\n\n // After 3 deletes in empty table, delete the table\n if (this.storage.deleteCount >= 3) {\n this.storage.deleteCount = 0;\n editor.chain().focus().deleteTable().run();\n return true;\n }\n\n return false;\n };\n\n return {\n Backspace: handleDelete,\n Delete: handleDelete\n };\n }\n});\n\ntype ImageInfoArray = { id: string; url: string; name: string }[];\n\nconst getFileFromUrl = async (url: string, name: string): Promise<File | null> => {\n try {\n const response = await fetch(url);\n if (!response.ok) {\n return null;\n }\n const data = await response.blob();\n return new File([data], name, {\n type: data.type\n });\n } catch {\n return null;\n }\n};\n\nexport interface IframeTiptapEditorProps {\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 onImageAdded?: (image: File, id: string, altText?: string) => void;\n imagesEnabled?: boolean;\n linksEnabled?: boolean;\n colorsEnabled?: boolean;\n imageInsertionMode?: 'file' | 'url' | 'all';\n pastedImagesRef?: MutableRefObject<File[]>;\n editorId?: string;\n editorRef: MutableRefObject<IframeEditorHandle | null>;\n spellcheck?: boolean;\n customElements?: CustomComponent[];\n initOptions?: EditorProps['initOptions'];\n secure?: boolean;\n preserveTableStyles?: boolean;\n onFocusTableMenu?: () => void;\n onFocusPreviousCellMenu?: () => void;\n}\n\n// Component that renders inside the iframe\nexport const IframeTiptapEditor = ({\n placeholder,\n defaultValue,\n disabled,\n readOnly,\n onChange,\n onKeyDown,\n onFocus,\n onBlur,\n onInit,\n editorRef,\n spellcheck = true,\n customElements = [],\n initOptions,\n onImageAdded,\n imagesEnabled = false,\n linksEnabled = true,\n colorsEnabled = false,\n imageInsertionMode = 'all',\n pastedImagesRef,\n editorId = '',\n secure = false,\n preserveTableStyles = false,\n onFocusTableMenu,\n onFocusPreviousCellMenu\n}: IframeTiptapEditorProps) => {\n // Keep callbacks in refs so the extension always has access to the latest callback\n const onFocusTableMenuRef = useRef(onFocusTableMenu);\n onFocusTableMenuRef.current = onFocusTableMenu;\n\n const onFocusPreviousCellMenuRef = useRef(onFocusPreviousCellMenu);\n onFocusPreviousCellMenuRef.current = onFocusPreviousCellMenu;\n\n // Process pasted image URLs and convert to File objects\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 if (file) {\n onImageAdded?.(file, infoArr[i].id);\n }\n });\n };\n\n // Generate Tiptap extensions for custom components\n const customComponentExtensions = useMemo(() => {\n return customElements.map((component: CustomComponent) => {\n return Node.create({\n name: component.name,\n group: 'inline',\n inline: true,\n atom: true,\n content: 'text*', // Allow text content inside\n\n addAttributes() {\n const attrs: Record<string, { default: null }> = {};\n if (component.extensionAttributes) {\n component.extensionAttributes.forEach((attr: string) => {\n attrs[attr] = { default: null };\n });\n }\n // Add common attributes for pega-file\n attrs['data-id'] = { default: null };\n attrs['data-name'] = { default: null };\n attrs['data-url'] = { default: null };\n attrs['data-progress'] = { default: null };\n attrs['data-error'] = { default: null };\n attrs['data-alt'] = { default: null };\n // Add attributes for pega-reference\n attrs['data-rule-id'] = { default: null };\n attrs['data-rule-type'] = { default: null };\n attrs['data-rule-namespace'] = { default: null };\n attrs.role = { default: null };\n return attrs;\n },\n\n parseHTML() {\n return [\n {\n tag: component.name,\n getAttrs: (node: HTMLElement | string) => {\n if (typeof node === 'string') return null;\n const attrs: Record<string, string | null> = {};\n // Get all data attributes and role\n Array.from(node.attributes).forEach(attr => {\n if (\n attr.name.startsWith('data-') ||\n attr.name === 'role' ||\n component.extensionAttributes?.includes(attr.name)\n ) {\n attrs[attr.name] = attr.value;\n }\n });\n return attrs;\n }\n }\n ];\n },\n\n renderHTML({\n HTMLAttributes,\n node\n }: {\n HTMLAttributes: Record<string, string | null>;\n node: ProseMirrorNode;\n }) {\n // Get text content from the node\n const textContent = node.textContent || '';\n return [component.name, HTMLAttributes, textContent];\n }\n });\n });\n }, [customElements]);\n\n const editor = useEditor({\n extensions: [\n StarterKit.configure({\n // Exclude link from StarterKit since we're configuring it separately\n link: false,\n // Exclude these so we can use our extended versions with style preservation\n blockquote: false,\n paragraph: false,\n heading: false,\n // Disable text patterns if specified in initOptions\n ...(initOptions?.textPatterns === false && {\n typography: false\n })\n }),\n BlockquoteWithStyle,\n ParagraphWithStyle,\n HeadingWithStyle,\n Placeholder.configure({\n placeholder: placeholder ?? ''\n }),\n TextIndent.configure({\n types: ['paragraph', 'heading']\n }),\n // Link extension is always loaded to preserve existing links in content\n // When linksEnabled is false, autolink is disabled to prevent auto-converting URLs\n Link.configure({\n openOnClick: false,\n autolink: linksEnabled,\n linkOnPaste: linksEnabled,\n HTMLAttributes: {\n target: '_blank',\n rel: 'noopener noreferrer'\n }\n }),\n // Image extension is always loaded to render existing images in content\n // The imagesEnabled flag controls whether NEW images can be inserted (via paste/drop handlers)\n ImageWithDataAttachmentId.configure({\n inline: true,\n allowBase64: true\n }),\n // Text formatting extensions\n Underline,\n Subscript,\n Superscript,\n TextStyle,\n ...(colorsEnabled ? [Color] : []),\n Highlight.configure({\n multicolor: true\n }),\n FontFamily,\n FontSize,\n // Alignment\n TextAlign.configure({\n types: ['heading', 'paragraph']\n }),\n // Table extensions - use style-preserving versions for correspondence editing\n ...(preserveTableStyles\n ? [\n TableWithStyle.configure({ resizable: false }),\n TableRowWithStyle,\n TableHeaderWithStyle,\n TableCellWithStyle\n ]\n : [Table.configure({ resizable: true }), TableRow, TableHeader, TableCell]),\n TableDeleteOnEmpty,\n TableCellSelection,\n CustomKeyboardShortcuts.configure({\n onFocusTableMenu: () => onFocusTableMenuRef.current?.(),\n onFocusPreviousCellMenu: () => onFocusPreviousCellMenuRef.current?.()\n }),\n PreserveDiv,\n OfficePaste,\n ...customComponentExtensions\n ],\n content: defaultValue,\n editable: !disabled && !readOnly,\n editorProps: {\n attributes: {\n class: 'ProseMirror',\n spellcheck: spellcheck ? 'true' : 'false'\n },\n handleDOMEvents: {\n keydown: (_view, event) => {\n onKeyDown?.(event);\n return false; // Allow other handlers to process\n },\n paste: (_view, event) => {\n // Block pasted image files when images are disabled\n if (!imagesEnabled && event.clipboardData?.files) {\n const hasImageFile = Array.from(event.clipboardData.files).some(file =>\n file.type.startsWith('image/')\n );\n if (hasImageFile) {\n event.preventDefault();\n return true;\n }\n }\n // Track pasted files for later processing\n if (\n event.clipboardData?.files &&\n event.clipboardData.files.length > 0 &&\n pastedImagesRef\n ) {\n pastedImagesRef.current = Array.from(event.clipboardData.files);\n }\n return false; // Let handlePaste process\n },\n drop: (_view, event) => {\n // Block dropped image files when images are disabled\n if (!imagesEnabled && event.dataTransfer?.files) {\n const hasImageFile = Array.from(event.dataTransfer.files).some(file =>\n file.type.startsWith('image/')\n );\n if (hasImageFile) {\n event.preventDefault();\n return true;\n }\n }\n return false;\n }\n },\n // Handle paste behavior based on initOptions\n handlePaste: (view, event) => {\n // If pasteAsText is enabled, convert to plain text\n if (initOptions?.pasteAsText) {\n event.preventDefault();\n const text = event.clipboardData?.getData('text/plain');\n if (text) {\n view.dispatch(view.state.tr.insertText(text));\n }\n return true;\n }\n\n let html = event.clipboardData?.getData('text/html');\n const text = event.clipboardData?.getData('text/plain');\n const shouldPreferTextPaste = Boolean(text?.trim()) || Boolean(html?.trim());\n\n // If secure mode is enabled, sanitize pasted HTML content first\n if (secure && html) {\n html = sanitizeHtml(html);\n }\n\n const isImg = html && html.includes('<img');\n const hasLinks = html && /<a\\s/i.test(html);\n\n // If links are disabled, handle paste to prevent link creation\n if (!linksEnabled) {\n // Check if pasting HTML with <a> tags - strip them\n if (hasLinks && html) {\n event.preventDefault();\n // Replace <a> tags with their text content\n const strippedHtml = html.replace(/<a\\s[^>]*>([\\s\\S]*?)<\\/a>/gi, '$1');\n const currentEditor = editorRef.current?.getEditor();\n if (currentEditor) {\n currentEditor.chain().focus().insertContent(strippedHtml).run();\n }\n return true;\n }\n\n // Check if pasting plain text that looks like a URL - insert as plain text\n const urlPattern = /^(https?:\\/\\/|www\\.)\\S+$/i;\n if (text && urlPattern.test(text.trim())) {\n event.preventDefault();\n view.dispatch(view.state.tr.insertText(text));\n return true;\n }\n }\n\n // If images are disabled or mode is url-only, strip images from pasted content\n if ((!imagesEnabled || imageInsertionMode === 'url') && isImg && html) {\n event.preventDefault();\n const cleanedHtml = html.replace(/<img[^>]*\\/?>/g, '');\n const tempDiv = document.createElement('div');\n tempDiv.innerHTML = cleanedHtml;\n view.dispatch(\n view.state.tr.replaceSelectionWith(\n view.state.schema.nodes.paragraph.create(\n null,\n view.state.schema.text(tempDiv.textContent || '')\n )\n )\n );\n return true;\n }\n\n // If pasteDataImages is disabled, strip images from pasted content\n if (initOptions?.pasteDataImages === false && isImg && html) {\n event.preventDefault();\n const cleanedHtml = html.replace(/<img[^>]*>/g, '');\n const tempDiv = document.createElement('div');\n tempDiv.innerHTML = cleanedHtml;\n view.dispatch(\n view.state.tr.replaceSelectionWith(\n view.state.schema.nodes.paragraph.create(\n null,\n view.state.schema.text(tempDiv.textContent || '')\n )\n )\n );\n return true;\n }\n\n // Handle raw image file pasting (e.g., screenshot, file from disk)\n // Prioritize raw files over HTML with blob URLs since blob URLs may fail to fetch\n const files = event.clipboardData?.files;\n if (\n imagesEnabled &&\n imageInsertionMode !== 'url' &&\n !shouldPreferTextPaste &&\n files &&\n files.length > 0\n ) {\n const imageFiles = Array.from(files).filter(file => file.type.startsWith('image/'));\n\n if (imageFiles.length > 0) {\n event.preventDefault();\n\n imageFiles.forEach(file => {\n const imgId = createUID();\n\n // Create pega-file element to show upload progress\n const pegaFileHtml = `<br/><pega-file data-id='${imgId}' data-progress='0' data-name='${file.name}' data-alt='${file.name}' contenteditable='false'></pega-file><br/>`;\n\n // Insert the pega-file element\n const currentEditor = editorRef.current?.getEditor();\n if (currentEditor) {\n currentEditor.chain().focus().insertContent(pegaFileHtml).run();\n }\n\n // Trigger the onImageAdded callback so consumer can upload and call appendImage\n onImageAdded?.(file, imgId, file.name);\n });\n\n return true;\n }\n }\n\n // Process pasted images from HTML (fallback when no raw files available)\n if (imagesEnabled && isImg && html) {\n event.preventDefault();\n\n const pastedHtml = new DOMParser().parseFromString(html, 'text/html').body;\n const imgInfo: ImageInfoArray = [];\n\n pastedHtml.querySelectorAll('img').forEach(imgEl => {\n const imgId = createUID();\n const url = imgEl.src;\n const name = pastedImagesRef?.current.shift()?.name || editorId || 'pasted-image';\n\n imgInfo.push({ id: imgId, url, name });\n\n // Create pega-file element to show upload progress\n const uploadEl = document.createElement('pega-file');\n uploadEl.setAttribute('data-id', imgId);\n uploadEl.setAttribute('data-name', name);\n uploadEl.setAttribute('data-url', url);\n uploadEl.setAttribute('data-progress', '0');\n uploadEl.setAttribute('contenteditable', 'false');\n\n const uploadElString = `<br/>${uploadEl.outerHTML}<br/>`;\n const uploadElHtml = new DOMParser().parseFromString(uploadElString, 'text/html').body;\n\n imgEl.replaceWith(uploadElHtml);\n });\n\n // Insert the modified HTML\n const modifiedHtml = pastedHtml.innerHTML;\n view.dispatch(view.state.tr.insertText(''));\n\n // Use setTimeout to ensure the DOM is ready\n setTimeout(() => {\n const currentEditor = editorRef.current?.getEditor();\n if (currentEditor) {\n currentEditor.chain().focus().insertContent(modifiedHtml).run();\n }\n }, 0);\n\n // Process the pasted image URLs\n processPastedImgUrls(imgInfo).catch(() => {\n // Errors are handled inside processPastedImgUrls\n });\n\n return true;\n }\n\n return false;\n },\n // Handle drag-and-drop of image files from the system\n handleDrop: (view, event, _slice, moved) => {\n // Only handle drops from outside the editor (not internal moves)\n if (moved) {\n return false;\n }\n\n const files = event.dataTransfer?.files;\n if (!imagesEnabled || imageInsertionMode === 'url' || !files || files.length === 0) {\n return false;\n }\n\n const imageFiles = Array.from(files).filter(file => file.type.startsWith('image/'));\n\n if (imageFiles.length === 0) {\n return false;\n }\n\n event.preventDefault();\n\n const dropEditor = editorRef.current?.getEditor();\n if (!dropEditor) {\n return false;\n }\n\n // Set cursor position to where the drop occurred\n const coordinates = view.posAtCoords({ left: event.clientX, top: event.clientY });\n if (coordinates) {\n dropEditor.commands.setTextSelection(coordinates.pos);\n }\n\n imageFiles.forEach(file => {\n const imgId = createUID();\n\n // Create pega-file element to show upload progress\n const pegaFileHtml = `<br/><pega-file data-id='${imgId}' data-progress='0' data-name='${file.name}' data-alt='${file.name}' contenteditable='false'></pega-file><br/>`;\n\n // Insert the pega-file element\n dropEditor.chain().focus().insertContent(pegaFileHtml).run();\n\n // Trigger the onImageAdded callback so consumer can upload and call appendImage\n onImageAdded?.(file, imgId, file.name);\n });\n\n return true;\n }\n },\n onUpdate: ({ editor: currentEditor }) => {\n // Clear stored link mark if cursor is not inside actual linked text\n // This prevents link styling from persisting after deleting linked text\n const { selection, storedMarks } = currentEditor.state;\n const linkMark = currentEditor.schema.marks.link;\n if (selection.empty && storedMarks?.some(mark => mark.type === linkMark)) {\n const hasLinkInDoc = selection.$from.marks().some(mark => mark.type === linkMark);\n if (!hasLinkInDoc) {\n currentEditor.commands.unsetMark('link');\n // Return early - onChange will fire on the subsequent update with cleaned state\n return;\n }\n }\n onChange?.(currentEditor);\n },\n onFocus: () => {\n onFocus?.();\n },\n onBlur: () => {\n onBlur?.();\n }\n });\n\n useEffect(() => {\n if (editor && onInit) {\n // Call initInstanceCallback if provided\n if (initOptions?.initInstanceCallback) {\n initOptions.initInstanceCallback(editor);\n }\n\n onInit(editor);\n }\n }, [editor, onInit, initOptions]);\n\n useImperativeHandle(\n editorRef,\n () => ({\n focus: () => editor?.chain().focus().run(),\n getPlainText: () => editor?.getText() ?? '',\n getRichText: () => (editor ? JSON.stringify(editor.getJSON()) : ''),\n getHtml: () => editor?.getHTML() ?? '',\n clear: () => editor?.chain().clearContent().run(),\n insertText: (text: string) => editor?.chain().insertContent(text).run(),\n setCursorLocationToStart: () => editor?.chain().focus('start').run(),\n insertHtml: (html: string, overwrite: boolean = false) => {\n if (overwrite) {\n editor?.chain().setContent(html).run();\n } else {\n editor?.chain().insertContent(html).run();\n }\n },\n getEditor: () => editor,\n setEditable: (editable: boolean) => editor?.setEditable(editable)\n }),\n [editor]\n );\n\n return <EditorContent editor={editor} />;\n};\n"]}
@@ -21,6 +21,7 @@ interface UseIframeSetupParams {
21
21
  onImageAdded?: (image: File, id: string, altText?: string) => void;
22
22
  imagesEnabled: boolean;
23
23
  linksEnabled: boolean;
24
+ colorsEnabled: boolean;
24
25
  imageInsertionMode: 'file' | 'url' | 'all';
25
26
  pastedImages: MutableRefObject<File[]>;
26
27
  editorId: string;
@@ -50,6 +51,6 @@ export type IframeEditorRef = MutableRefObject<IframeEditorHandle | null>;
50
51
  interface UseIframeSetupReturn {
51
52
  iframeEditorRef: IframeEditorRef;
52
53
  }
53
- export default function useIframeSetup({ iframeRef, theme, styleSheetTarget, customElements, placeholder, defaultValue, disabled, readOnly, onChange, onKeyDown, onFocus, onBlur, onInit, spellcheck, initOptions, onImageAdded, imagesEnabled, linksEnabled, imageInsertionMode, pastedImages, editorId, required, setTiptapEditor, setFocused, autoResize, onTabOut, onFocusTableMenu, onFocusPreviousCellMenu, secure, preserveTableStyles }: UseIframeSetupParams): UseIframeSetupReturn;
54
+ export default function useIframeSetup({ iframeRef, theme, styleSheetTarget, customElements, placeholder, defaultValue, disabled, readOnly, onChange, onKeyDown, onFocus, onBlur, onInit, spellcheck, initOptions, onImageAdded, imagesEnabled, linksEnabled, colorsEnabled, imageInsertionMode, pastedImages, editorId, required, setTiptapEditor, setFocused, autoResize, onTabOut, onFocusTableMenu, onFocusPreviousCellMenu, secure, preserveTableStyles }: UseIframeSetupParams): UseIframeSetupReturn;
54
55
  export {};
55
56
  //# sourceMappingURL=useIframeSetup.d.ts.map
@@ -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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"}
@@ -7,7 +7,7 @@ import { getHtmlStyles } from '@pega/cosmos-react-core/lib/components/HTML/HTML'
7
7
  import { createGlobalBodyStyles, createGlobalRootStyles, globalSpacingStyles } from '@pega/cosmos-react-core/lib/styles/GlobalStyle';
8
8
  import { IframeTiptapEditor } from '../IframeTiptapEditor';
9
9
  import { getIframeContentStyles } from '../iframeContentStyles';
10
- export default function useIframeSetup({ iframeRef, theme, styleSheetTarget, customElements, placeholder, defaultValue, disabled, readOnly, onChange, onKeyDown, onFocus, onBlur, onInit, spellcheck, initOptions, onImageAdded, imagesEnabled, linksEnabled, imageInsertionMode, pastedImages, editorId, required, setTiptapEditor, setFocused, autoResize = true, onTabOut, onFocusTableMenu, onFocusPreviousCellMenu, secure = false, preserveTableStyles = false }) {
10
+ export default function useIframeSetup({ iframeRef, theme, styleSheetTarget, customElements, placeholder, defaultValue, disabled, readOnly, onChange, onKeyDown, onFocus, onBlur, onInit, spellcheck, initOptions, onImageAdded, imagesEnabled, linksEnabled, colorsEnabled, imageInsertionMode, pastedImages, editorId, required, setTiptapEditor, setFocused, autoResize = true, onTabOut, onFocusTableMenu, onFocusPreviousCellMenu, secure = false, preserveTableStyles = false }) {
11
11
  const { components: { 'text-area': { 'min-height': textAreaMinHeight } } } = theme;
12
12
  const iframeRootRef = useRef(null);
13
13
  const iframeEditorRef = useRef(null);
@@ -175,7 +175,7 @@ export default function useIframeSetup({ iframeRef, theme, styleSheetTarget, cus
175
175
  }
176
176
  setTiptapEditor(editor);
177
177
  onInit?.(editor);
178
- }, editorRef: iframeEditorRef, spellcheck: spellcheck, customElements: customElements, initOptions: initOptions, onImageAdded: (image, id, altText) => onImageAddedRef.current?.(image, id, altText), imagesEnabled: imagesEnabled, linksEnabled: linksEnabled, imageInsertionMode: imageInsertionMode, pastedImagesRef: pastedImages, editorId: editorId, secure: secure, preserveTableStyles: preserveTableStyles, onFocusTableMenu: () => onFocusTableMenuRef.current?.(), onFocusPreviousCellMenu: () => {
178
+ }, editorRef: iframeEditorRef, spellcheck: spellcheck, customElements: customElements, initOptions: initOptions, onImageAdded: (image, id, altText) => onImageAddedRef.current?.(image, id, altText), imagesEnabled: imagesEnabled, linksEnabled: linksEnabled, colorsEnabled: colorsEnabled, imageInsertionMode: imageInsertionMode, pastedImagesRef: pastedImages, editorId: editorId, secure: secure, preserveTableStyles: preserveTableStyles, onFocusTableMenu: () => onFocusTableMenuRef.current?.(), onFocusPreviousCellMenu: () => {
179
179
  onFocusPreviousCellMenuRef.current?.();
180
180
  } }));
181
181
  }
@@ -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 - 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"]}
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 colorsEnabled: 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 colorsEnabled,\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 colorsEnabled={colorsEnabled}\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.4.3",
3
+ "version": "10.0.0-build.4.5",
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.4.3",
18
+ "@pega/cosmos-react-core": "10.0.0-build.4.5",
19
19
  "@popperjs/core": "^2.11.6",
20
20
  "@tiptap/core": "^3.12.1",
21
21
  "@tiptap/extension-blockquote": "^3.12.1",