@flogeez/angular-tiptap-editor 2.0.2 → 2.0.3

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":"flogeez-angular-tiptap-editor.mjs","sources":["../../../projects/angular-tiptap-editor/src/lib/extensions/resizable-image.extension.ts","../../../projects/angular-tiptap-editor/src/lib/extensions/upload-progress.extension.ts","../../../projects/angular-tiptap-editor/src/lib/extensions/table.extension.ts","../../../projects/angular-tiptap-editor/src/lib/models/editor-state.model.ts","../../../projects/angular-tiptap-editor/src/lib/extensions/tiptap-state.extension.ts","../../../projects/angular-tiptap-editor/src/lib/tiptap-button.component.ts","../../../projects/angular-tiptap-editor/src/lib/tiptap-separator.component.ts","../../../projects/angular-tiptap-editor/src/lib/services/i18n.service.ts","../../../projects/angular-tiptap-editor/src/lib/services/image.service.ts","../../../projects/angular-tiptap-editor/src/lib/utils/color.utils.ts","../../../projects/angular-tiptap-editor/src/lib/services/color-picker.service.ts","../../../projects/angular-tiptap-editor/src/lib/services/link.service.ts","../../../projects/angular-tiptap-editor/src/lib/services/editor-commands.service.ts","../../../projects/angular-tiptap-editor/src/lib/components/tiptap-color-picker.component.ts","../../../projects/angular-tiptap-editor/src/lib/tiptap-toolbar.component.ts","../../../projects/angular-tiptap-editor/src/lib/base/tiptap-base-bubble-menu.ts","../../../projects/angular-tiptap-editor/src/lib/tiptap-bubble-menu.component.ts","../../../projects/angular-tiptap-editor/src/lib/tiptap-image-bubble-menu.component.ts","../../../projects/angular-tiptap-editor/src/lib/tiptap-table-bubble-menu.component.ts","../../../projects/angular-tiptap-editor/src/lib/tiptap-cell-bubble-menu.component.ts","../../../projects/angular-tiptap-editor/src/lib/tiptap-link-bubble-menu.component.ts","../../../projects/angular-tiptap-editor/src/lib/tiptap-color-bubble-menu.component.ts","../../../projects/angular-tiptap-editor/src/lib/config/slash-commands.config.ts","../../../projects/angular-tiptap-editor/src/lib/tiptap-slash-commands.component.ts","../../../projects/angular-tiptap-editor/src/lib/noop-value-accessor.directive.ts","../../../projects/angular-tiptap-editor/src/lib/extensions/calculators/selection.calculator.ts","../../../projects/angular-tiptap-editor/src/lib/extensions/calculators/marks.calculator.ts","../../../projects/angular-tiptap-editor/src/lib/extensions/calculators/table.calculator.ts","../../../projects/angular-tiptap-editor/src/lib/extensions/calculators/image.calculator.ts","../../../projects/angular-tiptap-editor/src/lib/extensions/calculators/structure.calculator.ts","../../../projects/angular-tiptap-editor/src/lib/extensions/calculators/discovery.calculator.ts","../../../projects/angular-tiptap-editor/src/lib/extensions/link-click-behavior.extension.ts","../../../projects/angular-tiptap-editor/src/lib/config/editor.config.ts","../../../projects/angular-tiptap-editor/src/lib/tiptap-editor.component.ts","../../../projects/angular-tiptap-editor/src/public-api.ts","../../../projects/angular-tiptap-editor/src/flogeez-angular-tiptap-editor.ts"],"sourcesContent":["import { Node, mergeAttributes, nodeInputRule } from \"@tiptap/core\";\r\n\r\nexport interface ResizableImageOptions {\r\n inline: boolean;\r\n allowBase64: boolean;\r\n HTMLAttributes: Record<string, any>;\r\n}\r\n\r\ndeclare module \"@tiptap/core\" {\r\n interface Commands<ReturnType> {\r\n resizableImage: {\r\n setResizableImage: (options: {\r\n src: string;\r\n alt?: string;\r\n title?: string;\r\n width?: number;\r\n height?: number;\r\n }) => ReturnType;\r\n updateResizableImage: (options: {\r\n src?: string;\r\n alt?: string;\r\n title?: string;\r\n width?: number;\r\n height?: number;\r\n }) => ReturnType;\r\n };\r\n }\r\n}\r\n\r\nexport const ResizableImage = Node.create<ResizableImageOptions>({\r\n name: \"resizableImage\",\r\n\r\n addOptions() {\r\n return {\r\n inline: false,\r\n allowBase64: false,\r\n HTMLAttributes: {},\r\n };\r\n },\r\n\r\n inline() {\r\n return this.options.inline;\r\n },\r\n\r\n group() {\r\n return this.options.inline ? \"inline\" : \"block\";\r\n },\r\n\r\n draggable: true,\r\n\r\n addAttributes() {\r\n return {\r\n src: {\r\n default: null,\r\n },\r\n alt: {\r\n default: null,\r\n },\r\n title: {\r\n default: null,\r\n },\r\n width: {\r\n default: null,\r\n parseHTML: (element) => {\r\n const width = element.getAttribute(\"width\");\r\n return width ? parseInt(width, 10) : null;\r\n },\r\n renderHTML: (attributes) => {\r\n if (!attributes[\"width\"]) {\r\n return {};\r\n }\r\n return {\r\n width: attributes[\"width\"],\r\n };\r\n },\r\n },\r\n height: {\r\n default: null,\r\n parseHTML: (element) => {\r\n const height = element.getAttribute(\"height\");\r\n return height ? parseInt(height, 10) : null;\r\n },\r\n renderHTML: (attributes) => {\r\n if (!attributes[\"height\"]) {\r\n return {};\r\n }\r\n return {\r\n height: attributes[\"height\"],\r\n };\r\n },\r\n },\r\n };\r\n },\r\n\r\n parseHTML() {\r\n return [\r\n {\r\n tag: \"img[src]\",\r\n },\r\n ];\r\n },\r\n\r\n renderHTML({ HTMLAttributes }) {\r\n return [\r\n \"img\",\r\n mergeAttributes(this.options.HTMLAttributes, HTMLAttributes),\r\n ];\r\n },\r\n\r\n addCommands() {\r\n return {\r\n setResizableImage:\r\n (options) =>\r\n ({ commands }) => {\r\n return commands.insertContent({\r\n type: this.name,\r\n attrs: options,\r\n }, {\r\n updateSelection: true,\r\n });\r\n },\r\n updateResizableImage:\r\n (options) =>\r\n ({ commands }) => {\r\n return commands.updateAttributes(this.name, options);\r\n },\r\n };\r\n },\r\n\r\n addInputRules() {\r\n return [\r\n nodeInputRule({\r\n find: /!\\[(.+|:?)]\\((\\S+)(?:(?:\\s+)[\"'](\\S+)[\"'])?\\)/,\r\n type: this.type,\r\n getAttributes: (match) => {\r\n const [, alt, src, title] = match;\r\n return { src, alt, title };\r\n },\r\n }),\r\n ];\r\n },\r\n\r\n addNodeView() {\r\n return ({ node, getPos, editor }) => {\r\n const container = document.createElement(\"div\");\r\n container.className = \"resizable-image-container\";\r\n container.style.position = \"relative\";\r\n container.style.display = \"inline-block\";\r\n\r\n const img = document.createElement(\"img\");\r\n img.src = node.attrs[\"src\"];\r\n img.alt = node.attrs[\"alt\"] || \"\";\r\n img.title = node.attrs[\"title\"] || \"\";\r\n img.className = \"tiptap-image\";\r\n\r\n if (node.attrs[\"width\"]) img.width = node.attrs[\"width\"];\r\n if (node.attrs[\"height\"]) img.height = node.attrs[\"height\"];\r\n\r\n img.parentNode?.insertBefore(container, img);\r\n container.appendChild(img);\r\n\r\n // Add modern resize controls\r\n const resizeControls = document.createElement(\"div\");\r\n resizeControls.className = \"resize-controls\";\r\n resizeControls.style.display = \"none\";\r\n\r\n // Create 8 handles for full resizing capability\r\n const handles = [\"nw\", \"n\", \"ne\", \"w\", \"e\", \"sw\", \"s\", \"se\"];\r\n handles.forEach((direction) => {\r\n const handle = document.createElement(\"div\");\r\n handle.className = `resize-handle resize-handle-${direction}`;\r\n handle.setAttribute(\"data-direction\", direction);\r\n resizeControls.appendChild(handle);\r\n });\r\n\r\n // Attach controls to container\r\n container.appendChild(resizeControls);\r\n\r\n // Variables for resizing\r\n let isResizing = false;\r\n let startX = 0;\r\n let startY = 0;\r\n let startWidth = 0;\r\n let startHeight = 0;\r\n let aspectRatio = 1;\r\n\r\n // Calculate aspect ratio\r\n img.onload = () => {\r\n aspectRatio = img.naturalWidth / img.naturalHeight;\r\n };\r\n\r\n // Resizing logic\r\n const handleMouseDown = (e: MouseEvent, direction: string) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n isResizing = true;\r\n startX = e.clientX;\r\n startY = e.clientY;\r\n\r\n // Use current image dimensions instead of initial ones\r\n startWidth =\r\n parseInt(img.getAttribute(\"width\") || \"0\") ||\r\n node.attrs[\"width\"] ||\r\n img.naturalWidth;\r\n startHeight =\r\n parseInt(img.getAttribute(\"height\") || \"0\") ||\r\n node.attrs[\"height\"] ||\r\n img.naturalHeight;\r\n\r\n // Add resizing class to body\r\n document.body.classList.add(\"resizing\");\r\n\r\n const handleMouseMove = (e: MouseEvent) => {\r\n if (!isResizing) return;\r\n\r\n const deltaX = e.clientX - startX;\r\n const deltaY = e.clientY - startY;\r\n\r\n let newWidth = startWidth;\r\n let newHeight = startHeight;\r\n\r\n // Resize according to direction\r\n switch (direction) {\r\n case \"e\":\r\n newWidth = startWidth + deltaX;\r\n newHeight = newWidth / aspectRatio;\r\n break;\r\n case \"w\":\r\n newWidth = startWidth - deltaX;\r\n newHeight = newWidth / aspectRatio;\r\n break;\r\n case \"s\":\r\n newHeight = startHeight + deltaY;\r\n newWidth = newHeight * aspectRatio;\r\n break;\r\n case \"n\":\r\n newHeight = startHeight - deltaY;\r\n newWidth = newHeight * aspectRatio;\r\n break;\r\n case \"se\":\r\n newWidth = startWidth + deltaX;\r\n newHeight = startHeight + deltaY;\r\n break;\r\n case \"sw\":\r\n newWidth = startWidth - deltaX;\r\n newHeight = startHeight + deltaY;\r\n break;\r\n case \"ne\":\r\n newWidth = startWidth + deltaX;\r\n newHeight = startHeight - deltaY;\r\n break;\r\n case \"nw\":\r\n newWidth = startWidth - deltaX;\r\n newHeight = startHeight - deltaY;\r\n break;\r\n }\r\n\r\n // Limits\r\n newWidth = Math.max(50, Math.min(2000, newWidth));\r\n newHeight = Math.max(50, Math.min(2000, newHeight));\r\n\r\n // Update image attributes directly\r\n img.setAttribute(\"width\", Math.round(newWidth).toString());\r\n img.setAttribute(\"height\", Math.round(newHeight).toString());\r\n };\r\n\r\n const handleMouseUp = () => {\r\n isResizing = false;\r\n document.body.classList.remove(\"resizing\");\r\n\r\n // Update Tiptap node with new dimensions\r\n if (typeof getPos === \"function\") {\r\n const finalWidth = parseInt(img.getAttribute(\"width\") || \"0\");\r\n const finalHeight = parseInt(img.getAttribute(\"height\") || \"0\");\r\n\r\n if (finalWidth && finalHeight) {\r\n editor.commands.updateAttributes(\"resizableImage\", {\r\n width: finalWidth,\r\n height: finalHeight,\r\n });\r\n }\r\n }\r\n\r\n document.removeEventListener(\"mousemove\", handleMouseMove);\r\n document.removeEventListener(\"mouseup\", handleMouseUp);\r\n };\r\n\r\n document.addEventListener(\"mousemove\", handleMouseMove);\r\n document.addEventListener(\"mouseup\", handleMouseUp);\r\n };\r\n\r\n // Add events to handles\r\n resizeControls.addEventListener(\"mousedown\", (e) => {\r\n const target = e.target as HTMLElement;\r\n if (target.classList.contains(\"resize-handle\")) {\r\n const direction = target.getAttribute(\"data-direction\");\r\n if (direction) {\r\n handleMouseDown(e, direction);\r\n }\r\n }\r\n });\r\n\r\n // Proper selection management via ProseMirror lifecycle\r\n const selectNode = () => {\r\n resizeControls.style.display = \"block\";\r\n container.classList.add(\"selected\");\r\n img.classList.add(\"selected\");\r\n };\r\n\r\n const deselectNode = () => {\r\n resizeControls.style.display = \"none\";\r\n container.classList.remove(\"selected\");\r\n img.classList.remove(\"selected\");\r\n };\r\n\r\n return {\r\n dom: container,\r\n selectNode,\r\n deselectNode,\r\n update: (updatedNode) => {\r\n if (updatedNode.type.name !== \"resizableImage\") return false;\r\n\r\n img.src = updatedNode.attrs[\"src\"];\r\n img.alt = updatedNode.attrs[\"alt\"] || \"\";\r\n img.title = updatedNode.attrs[\"title\"] || \"\";\r\n\r\n if (updatedNode.attrs[\"width\"])\r\n img.width = updatedNode.attrs[\"width\"];\r\n if (updatedNode.attrs[\"height\"])\r\n img.height = updatedNode.attrs[\"height\"];\r\n\r\n return true;\r\n },\r\n };\r\n };\r\n },\r\n});\r\n","import { Extension } from \"@tiptap/core\";\r\nimport { Plugin, PluginKey } from \"@tiptap/pm/state\";\r\nimport { Decoration, DecorationSet } from \"@tiptap/pm/view\";\r\n\r\nexport interface UploadProgressOptions {\r\n isUploading: () => boolean;\r\n uploadProgress: () => number;\r\n uploadMessage: () => string;\r\n}\r\n\r\nexport const UploadProgress = Extension.create<UploadProgressOptions>({\r\n name: \"uploadProgress\",\r\n\r\n addOptions() {\r\n return {\r\n isUploading: () => false,\r\n uploadProgress: () => 0,\r\n uploadMessage: () => \"\",\r\n };\r\n },\r\n\r\n addProseMirrorPlugins() {\r\n const options = this.options;\r\n\r\n return [\r\n new Plugin({\r\n key: new PluginKey(\"uploadProgress\"),\r\n state: {\r\n init() {\r\n return {\r\n decorations: DecorationSet.empty,\r\n isUploading: false,\r\n uploadPosition: null as number | null,\r\n };\r\n },\r\n apply: (tr, state) => {\r\n const isUploading = options.isUploading();\r\n\r\n // Si l'upload commence, sauvegarder la position\r\n if (isUploading && !state.isUploading) {\r\n const uploadPosition = tr.selection.from;\r\n const uploadProgress = options.uploadProgress();\r\n const uploadMessage = options.uploadMessage();\r\n\r\n // Créer un élément de progression\r\n const uploadElement = document.createElement(\"div\");\r\n uploadElement.className = \"upload-progress-widget\";\r\n uploadElement.innerHTML = `\r\n <div class=\"upload-skeleton\">\r\n <div class=\"upload-content\">\r\n <div class=\"upload-icon\">\r\n <span class=\"material-symbols-outlined spinning\">image</span>\r\n </div>\r\n <div class=\"upload-info\">\r\n <div class=\"upload-message\">${uploadMessage}</div>\r\n <div class=\"progress-bar\">\r\n <div class=\"progress-fill\" style=\"width: ${uploadProgress}%\"></div>\r\n </div>\r\n <div class=\"progress-text\">${uploadProgress}%</div>\r\n </div>\r\n </div>\r\n </div>\r\n `;\r\n\r\n // Ajouter les styles si pas déjà fait\r\n if (!document.querySelector(\"#upload-progress-styles\")) {\r\n const style = document.createElement(\"style\");\r\n style.id = \"upload-progress-styles\";\r\n style.textContent = `\r\n .upload-progress-widget {\r\n display: block;\r\n margin: 8px 0;\r\n max-width: 400px;\r\n }\r\n .upload-skeleton {\r\n background: var(--ate-surface-secondary);\r\n border: 2px dashed var(--ate-border-color);\r\n border-radius: var(--ate-border-radius);\r\n padding: 16px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n min-height: 120px;\r\n animation: pulse 2s infinite;\r\n }\r\n @keyframes pulse {\r\n 0%, 100% { background-color: var(--ate-surface-secondary); }\r\n 50% { background-color: var(--ate-surface-tertiary); }\r\n }\r\n .upload-content {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n gap: 12px;\r\n text-align: center;\r\n }\r\n .upload-icon {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 48px;\r\n height: 48px;\r\n background: var(--ate-primary-light);\r\n border-radius: 50%;\r\n color: var(--ate-primary);\r\n }\r\n .upload-icon .material-symbols-outlined {\r\n font-size: 24px;\r\n }\r\n .spinning {\r\n animation: spin 1s linear infinite;\r\n }\r\n @keyframes spin {\r\n from { transform: rotate(0deg); }\r\n to { transform: rotate(360deg); }\r\n }\r\n .upload-info {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 8px;\r\n width: 100%;\r\n max-width: 200px;\r\n }\r\n .upload-message {\r\n font-size: 14px;\r\n color: var(--ate-text);\r\n font-weight: 500;\r\n }\r\n .progress-bar {\r\n width: 100%;\r\n height: 6px;\r\n background: var(--ate-border-color);\r\n border-radius: 3px;\r\n overflow: hidden;\r\n }\r\n .progress-fill {\r\n height: 100%;\r\n background: var(--ate-primary);\r\n border-radius: 3px;\r\n transition: width 0.3s ease;\r\n }\r\n .progress-text {\r\n font-size: 12px;\r\n color: var(--ate-text-secondary);\r\n font-weight: 500;\r\n }\r\n `;\r\n document.head.appendChild(style);\r\n }\r\n\r\n // Créer une décoration widget à la position sauvegardée\r\n const decoration = Decoration.widget(\r\n uploadPosition,\r\n uploadElement,\r\n {\r\n side: 1,\r\n key: \"upload-progress\",\r\n }\r\n );\r\n\r\n return {\r\n decorations: DecorationSet.create(tr.doc, [decoration]),\r\n isUploading: true,\r\n uploadPosition,\r\n };\r\n }\r\n\r\n // Si l'upload continue, mettre à jour le contenu\r\n if (\r\n isUploading &&\r\n state.isUploading &&\r\n state.uploadPosition !== null\r\n ) {\r\n const uploadProgress = options.uploadProgress();\r\n const uploadMessage = options.uploadMessage();\r\n\r\n // Mettre à jour le contenu de l'élément existant\r\n const existingElement = document.querySelector(\r\n \".upload-progress-widget\"\r\n );\r\n if (existingElement) {\r\n existingElement.innerHTML = `\r\n <div class=\"upload-skeleton\">\r\n <div class=\"upload-content\">\r\n <div class=\"upload-icon\">\r\n <span class=\"material-symbols-outlined spinning\">image</span>\r\n </div>\r\n <div class=\"upload-info\">\r\n <div class=\"upload-message\">${uploadMessage}</div>\r\n <div class=\"progress-bar\">\r\n <div class=\"progress-fill\" style=\"width: ${uploadProgress}%\"></div>\r\n </div>\r\n <div class=\"progress-text\">${uploadProgress}%</div>\r\n </div>\r\n </div>\r\n </div>\r\n `;\r\n }\r\n\r\n return state; // Garder les décorations existantes\r\n }\r\n\r\n // Si l'upload se termine, supprimer les décorations\r\n if (!isUploading && state.isUploading) {\r\n return {\r\n decorations: DecorationSet.empty,\r\n isUploading: false,\r\n uploadPosition: null,\r\n };\r\n }\r\n\r\n return state;\r\n },\r\n },\r\n props: {\r\n decorations(state) {\r\n const pluginState = this.getState(state);\r\n return pluginState ? pluginState.decorations : DecorationSet.empty;\r\n },\r\n },\r\n }),\r\n ];\r\n },\r\n});\r\n","import { Extension } from \"@tiptap/core\";\r\nimport Table from \"@tiptap/extension-table\";\r\nimport TableRow from \"@tiptap/extension-table-row\";\r\nimport TableCell from \"@tiptap/extension-table-cell\";\r\nimport TableHeader from \"@tiptap/extension-table-header\";\r\n\r\nexport const TableExtension = Extension.create({\r\n name: \"tableExtension\",\r\n\r\n addExtensions() {\r\n return [\r\n Table.configure({\r\n resizable: true,\r\n handleWidth: 5,\r\n cellMinWidth: 100,\r\n }),\r\n TableRow,\r\n TableHeader.configure({\r\n HTMLAttributes: {\r\n class: \"table-header\",\r\n },\r\n }),\r\n TableCell.configure({\r\n HTMLAttributes: {\r\n class: \"table-cell\",\r\n },\r\n }),\r\n ];\r\n },\r\n});\r\n","import { Editor } from \"@tiptap/core\";\r\n\r\nexport type StateCalculator = (editor: Editor) => Partial<{\r\n [K in keyof EditorStateSnapshot]: EditorStateSnapshot[K] extends object\r\n ? Partial<EditorStateSnapshot[K]>\r\n : EditorStateSnapshot[K]\r\n}>;\r\n\r\nexport interface EditorStateSnapshot {\r\n /** Global editor states */\r\n isFocused: boolean;\r\n isEditable: boolean;\r\n\r\n /** \r\n * Detailed selection information to avoid overlap between menus\r\n */\r\n selection: {\r\n type: 'text' | 'node' | 'cell' | 'none';\r\n from: number;\r\n to: number;\r\n empty: boolean;\r\n /** Specific for CellSelection */\r\n isSingleCell: boolean;\r\n };\r\n\r\n /** Text formatting states (Marks) */\r\n marks: {\r\n bold: boolean;\r\n italic: boolean;\r\n underline: boolean;\r\n strike: boolean;\r\n code: boolean;\r\n superscript: boolean;\r\n subscript: boolean;\r\n highlight: boolean;\r\n link: boolean;\r\n linkHref: string | null;\r\n color: string | null;\r\n computedColor: string | null;\r\n background: string | null;\r\n computedBackground: string | null;\r\n linkOpenOnClick: boolean;\r\n };\r\n\r\n /** Capability states (canExecute) */\r\n can: {\r\n toggleBold: boolean;\r\n toggleItalic: boolean;\r\n toggleUnderline: boolean;\r\n toggleStrike: boolean;\r\n toggleCode: boolean;\r\n toggleHighlight: boolean;\r\n toggleLink: boolean;\r\n toggleSuperscript: boolean;\r\n toggleSubscript: boolean;\r\n setColor: boolean;\r\n setHighlight: boolean;\r\n undo: boolean;\r\n redo: boolean;\r\n\r\n /** Table specific capabilities */\r\n addRowBefore: boolean;\r\n addRowAfter: boolean;\r\n deleteRow: boolean;\r\n addColumnBefore: boolean;\r\n addColumnAfter: boolean;\r\n deleteColumn: boolean;\r\n deleteTable: boolean;\r\n mergeCells: boolean;\r\n splitCell: boolean;\r\n toggleHeaderRow: boolean;\r\n toggleHeaderColumn: boolean;\r\n\r\n /** Structure/Node capabilities */\r\n toggleHeading1: boolean;\r\n toggleHeading2: boolean;\r\n toggleHeading3: boolean;\r\n toggleBulletList: boolean;\r\n toggleOrderedList: boolean;\r\n toggleBlockquote: boolean;\r\n toggleCodeBlock: boolean;\r\n setTextAlignLeft: boolean;\r\n setTextAlignCenter: boolean;\r\n setTextAlignRight: boolean;\r\n setTextAlignJustify: boolean;\r\n insertHorizontalRule: boolean;\r\n insertTable: boolean;\r\n insertImage: boolean;\r\n };\r\n\r\n /** Current node context */\r\n nodes: {\r\n isTable: boolean;\r\n isTableNodeSelected: boolean;\r\n isTableCell: boolean;\r\n isImage: boolean;\r\n isBlockquote: boolean;\r\n isCodeBlock: boolean;\r\n isBulletList: boolean;\r\n isOrderedList: boolean;\r\n\r\n /** Headings */\r\n h1: boolean;\r\n h2: boolean;\r\n h3: boolean;\r\n\r\n /** Alignment */\r\n alignLeft: boolean;\r\n alignCenter: boolean;\r\n alignRight: boolean;\r\n alignJustify: boolean;\r\n\r\n /** Table specific */\r\n isTableHeaderRow: boolean;\r\n isTableHeaderColumn: boolean;\r\n\r\n /** Name of the active node at selection head */\r\n activeNodeName: string | null;\r\n };\r\n\r\n /** Placeholder for custom extension states */\r\n custom: Record<string, any>;\r\n}\r\n\r\nexport const INITIAL_EDITOR_STATE: EditorStateSnapshot = {\r\n isFocused: false,\r\n isEditable: true,\r\n selection: {\r\n type: 'none',\r\n from: 0,\r\n to: 0,\r\n empty: true,\r\n isSingleCell: false\r\n },\r\n marks: {\r\n bold: false,\r\n italic: false,\r\n underline: false,\r\n strike: false,\r\n code: false,\r\n superscript: false,\r\n subscript: false,\r\n highlight: false,\r\n link: false,\r\n linkHref: null,\r\n color: null,\r\n computedColor: null,\r\n background: null,\r\n computedBackground: null,\r\n linkOpenOnClick: false,\r\n },\r\n can: {\r\n toggleBold: false,\r\n toggleItalic: false,\r\n toggleUnderline: false,\r\n toggleStrike: false,\r\n toggleCode: false,\r\n toggleHighlight: false,\r\n toggleLink: false,\r\n toggleSuperscript: false,\r\n toggleSubscript: false,\r\n setColor: false,\r\n setHighlight: false,\r\n undo: false,\r\n redo: false,\r\n addRowBefore: false,\r\n addRowAfter: false,\r\n deleteRow: false,\r\n addColumnBefore: false,\r\n addColumnAfter: false,\r\n deleteColumn: false,\r\n deleteTable: false,\r\n mergeCells: false,\r\n splitCell: false,\r\n toggleHeaderRow: false,\r\n toggleHeaderColumn: false,\r\n toggleHeading1: false,\r\n toggleHeading2: false,\r\n toggleHeading3: false,\r\n toggleBulletList: false,\r\n toggleOrderedList: false,\r\n toggleBlockquote: false,\r\n toggleCodeBlock: false,\r\n setTextAlignLeft: false,\r\n setTextAlignCenter: false,\r\n setTextAlignRight: false,\r\n setTextAlignJustify: false,\r\n insertHorizontalRule: false,\r\n insertTable: false,\r\n insertImage: false,\r\n },\r\n nodes: {\r\n isTable: false,\r\n isTableNodeSelected: false,\r\n isTableCell: false,\r\n isImage: false,\r\n isBlockquote: false,\r\n isCodeBlock: false,\r\n isBulletList: false,\r\n isOrderedList: false,\r\n h1: false,\r\n h2: false,\r\n h3: false,\r\n alignLeft: false,\r\n alignCenter: false,\r\n alignRight: false,\r\n alignJustify: false,\r\n isTableHeaderRow: false,\r\n isTableHeaderColumn: false,\r\n activeNodeName: null,\r\n },\r\n custom: {}\r\n};\r\n","import { Extension } from '@tiptap/core';\r\nimport { Plugin, PluginKey } from '@tiptap/pm/state';\r\nimport { EditorStateSnapshot, INITIAL_EDITOR_STATE, StateCalculator } from '../models/editor-state.model';\r\n\r\nexport interface TiptapStateOptions {\r\n onUpdate?: (state: EditorStateSnapshot) => void;\r\n calculators: StateCalculator[];\r\n}\r\n\r\n/**\r\n * High-performance flat property merger.\r\n * Processes sub-objects (marks, can, nodes) property by property.\r\n */\r\nfunction fastMerge(target: any, source: any) {\r\n if (!source) return;\r\n\r\n for (const key in source) {\r\n const sourceVal = source[key];\r\n\r\n // If the value is an object (marks, can, nodes, selection)\r\n if (sourceVal !== null && typeof sourceVal === 'object' && !Array.isArray(sourceVal)) {\r\n if (!target[key]) target[key] = {};\r\n\r\n // Merge internal properties\r\n for (const subKey in sourceVal) {\r\n const subVal = sourceVal[subKey];\r\n // TRUE priority rule for boolean state categories\r\n if (typeof subVal === 'boolean' && (key === 'marks' || key === 'can' || key === 'nodes')) {\r\n target[key][subKey] = target[key][subKey] || subVal;\r\n } else {\r\n target[key][subKey] = subVal;\r\n }\r\n }\r\n } else {\r\n // Simple value (isFocused, isEditable)\r\n target[key] = sourceVal;\r\n }\r\n }\r\n}\r\n\r\nfunction createFreshSnapshot(): EditorStateSnapshot {\r\n return JSON.parse(JSON.stringify(INITIAL_EDITOR_STATE));\r\n}\r\n\r\nexport const TiptapStateExtension = Extension.create<TiptapStateOptions>({\r\n name: 'tiptapState',\r\n\r\n addOptions() {\r\n return {\r\n onUpdate: undefined,\r\n calculators: [],\r\n };\r\n },\r\n\r\n addProseMirrorPlugins() {\r\n const extension = this;\r\n return [\r\n new Plugin({\r\n key: new PluginKey('tiptapState'),\r\n view: () => ({\r\n update: (view) => {\r\n const { editor } = extension;\r\n if (!editor) return;\r\n\r\n const snapshot = createFreshSnapshot();\r\n const calcs = extension.options.calculators;\r\n\r\n for (let i = 0; i < calcs.length; i++) {\r\n try {\r\n const partial = calcs[i](editor);\r\n fastMerge(snapshot, partial);\r\n } catch (e) {\r\n console.error('TiptapStateExtension: Calculator error', e);\r\n }\r\n }\r\n\r\n if (extension.options.onUpdate) {\r\n extension.options.onUpdate(snapshot);\r\n }\r\n },\r\n }),\r\n }),\r\n ];\r\n },\r\n\r\n onFocus() {\r\n this.editor.view.dispatch(this.editor.state.tr.setMeta('tiptapStateForceUpdate', true));\r\n },\r\n\r\n onBlur() {\r\n this.editor.view.dispatch(this.editor.state.tr.setMeta('tiptapStateForceUpdate', true));\r\n },\r\n});\r\n","import { Component, input, output, ChangeDetectionStrategy } from \"@angular/core\";\r\n\r\nexport interface TiptapButtonConfig {\r\n icon: string;\r\n title: string;\r\n active?: boolean;\r\n disabled?: boolean;\r\n variant?: \"default\" | \"text\" | \"danger\";\r\n size?: \"small\" | \"medium\" | \"large\";\r\n iconSize?: \"small\" | \"medium\" | \"large\";\r\n}\r\n\r\n@Component({\r\n selector: \"tiptap-button\",\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n template: `\r\n <button\r\n class=\"tiptap-button\"\r\n [class.is-active]=\"active()\"\r\n [class.is-disabled]=\"disabled()\"\r\n [class.text-button]=\"variant() === 'text'\"\r\n [class.danger]=\"variant() === 'danger'\"\r\n [class.small]=\"size() === 'small'\"\r\n [class.medium]=\"size() === 'medium'\"\r\n [class.large]=\"size() === 'large'\"\r\n [class.has-custom-color]=\"!!color()\"\r\n [class.has-custom-bg]=\"!!backgroundColor()\"\r\n [disabled]=\"disabled()\"\r\n [style.color]=\"color()\"\r\n [style.background-color]=\"backgroundColor()\"\r\n [attr.title]=\"title()\"\r\n [attr.aria-label]=\"title()\"\r\n (mousedown)=\"onMouseDown($event)\"\r\n (click)=\"onClick.emit($event)\"\r\n type=\"button\"\r\n >\r\n @if (icon()) {\r\n <span\r\n class=\"material-symbols-outlined\"\r\n [class.icon-small]=\"iconSize() === 'small'\"\r\n [class.icon-medium]=\"iconSize() === 'medium'\"\r\n [class.icon-large]=\"iconSize() === 'large'\"\r\n >{{ icon() }}</span>\r\n }\r\n <ng-content></ng-content>\r\n </button>\r\n `,\r\n styles: [\r\n `\r\n /* Styles de base pour les boutons Tiptap */\r\n .tiptap-button {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 32px;\r\n height: 32px;\r\n border: none;\r\n background: transparent;\r\n border-radius: var(--ate-sub-border-radius, 8px);\r\n cursor: pointer;\r\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\r\n color: var(--ate-toolbar-button-color, var(--ate-text-secondary));\r\n position: relative;\r\n overflow: hidden;\r\n }\r\n\r\n .tiptap-button::before {\r\n content: \"\";\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n bottom: 0;\r\n background: var(--ate-primary);\r\n opacity: 0;\r\n transition: opacity 0.2s ease;\r\n border-radius: var(--ate-sub-border-radius, 8px);\r\n }\r\n\r\n .tiptap-button:hover:not(.has-custom-color) {\r\n color: var(--ate-toolbar-button-active-color, var(--ate-primary));\r\n background: var(--ate-toolbar-button-hover-background, transparent);\r\n transform: translateY(-1px);\r\n }\r\n \r\n /* If has custom color, we still want the hover background but not the color change */\r\n .tiptap-button.has-custom-color:hover:not(.has-custom-bg) {\r\n background: var(--ate-toolbar-button-hover-background, transparent);\r\n transform: translateY(-1px);\r\n }\r\n\r\n .tiptap-button.has-custom-bg:hover {\r\n transform: translateY(-1px);\r\n filter: brightness(0.9);\r\n }\r\n\r\n .tiptap-button:hover::before {\r\n opacity: 0.1;\r\n }\r\n\r\n .tiptap-button:active {\r\n transform: translateY(0);\r\n }\r\n\r\n .tiptap-button.is-active:not(.has-custom-color) {\r\n color: var(--ate-toolbar-button-active-color, var(--ate-primary));\r\n background: var(--ate-toolbar-button-active-background, var(--ate-primary-light));\r\n }\r\n\r\n /* If has custom color and active, prioritize the custom color */\r\n .tiptap-button.is-active.has-custom-color {\r\n background: var(--ate-toolbar-button-active-background, var(--ate-primary-light));\r\n }\r\n\r\n .tiptap-button:disabled {\r\n opacity: 0.4;\r\n cursor: not-allowed;\r\n pointer-events: none;\r\n }\r\n\r\n /* Icônes Material Symbols */\r\n .tiptap-button .material-symbols-outlined {\r\n font-size: 20px;\r\n position: relative;\r\n z-index: 1;\r\n }\r\n\r\n .tiptap-button .material-symbols-outlined.icon-small {\r\n font-size: 16px;\r\n }\r\n\r\n .tiptap-button .material-symbols-outlined.icon-medium {\r\n font-size: 20px;\r\n }\r\n\r\n .tiptap-button .material-symbols-outlined.icon-large {\r\n font-size: 24px;\r\n }\r\n\r\n /* Boutons avec texte */\r\n .tiptap-button.text-button {\r\n width: auto;\r\n padding: 0 12px;\r\n font-size: 14px;\r\n font-weight: 500;\r\n gap: 8px;\r\n }\r\n\r\n /* Boutons de couleur */\r\n .tiptap-button.color-button {\r\n width: 28px;\r\n height: 28px;\r\n border-radius: 50%;\r\n border: 2px solid transparent;\r\n transition: all 0.2s ease;\r\n }\r\n\r\n .tiptap-button.color-button:hover {\r\n border-color: var(--ate-border);\r\n transform: scale(1.1);\r\n }\r\n\r\n .tiptap-button.color-button.is-active {\r\n border-color: var(--ate-primary);\r\n box-shadow: 0 0 0 2px var(--ate-primary-light);\r\n }\r\n\r\n /* Boutons avec variantes */\r\n .tiptap-button.danger {\r\n color: var(--ate-error-color, #ef4444);\r\n }\r\n\r\n .tiptap-button.danger:hover {\r\n color: var(--ate-error-color, #ef4444);\r\n background: var(--ate-error-bg, rgba(239, 68, 68, 0.1));\r\n }\r\n\r\n .tiptap-button.danger::before {\r\n background: var(--ate-error-color, #ef4444);\r\n }\r\n\r\n /* Boutons de taille différente */\r\n .tiptap-button.small {\r\n width: 24px;\r\n height: 24px;\r\n }\r\n\r\n .tiptap-button.medium {\r\n width: 32px;\r\n height: 32px;\r\n }\r\n\r\n .tiptap-button.large {\r\n width: 40px;\r\n height: 40px;\r\n }\r\n\r\n /* Animation de pulsation pour les boutons actifs */\r\n @keyframes pulse {\r\n 0%,\r\n 100% {\r\n box-shadow: 0 0 0 0 var(--ate-primary-light-alpha);\r\n }\r\n 50% {\r\n box-shadow: 0 0 0 4px transparent;\r\n }\r\n }\r\n\r\n .tiptap-button.is-active.pulse {\r\n animation: pulse 2s infinite;\r\n }\r\n\r\n /* Responsive */\r\n @media (max-width: 768px) {\r\n .tiptap-button {\r\n width: 32px;\r\n height: 32px;\r\n }\r\n\r\n .tiptap-button .material-symbols-outlined {\r\n font-size: 18px;\r\n }\r\n\r\n .tiptap-button.text-button {\r\n padding: 0 8px;\r\n font-size: 13px;\r\n }\r\n }\r\n `,\r\n ],\r\n})\r\nexport class TiptapButtonComponent {\r\n // Inputs\r\n icon = input<string>(\"\");\r\n title = input.required<string>();\r\n active = input(false);\r\n disabled = input(false);\r\n color = input<string>();\r\n backgroundColor = input<string>();\r\n variant = input<\"default\" | \"text\" | \"danger\">(\"default\");\r\n size = input<\"small\" | \"medium\" | \"large\">(\"medium\");\r\n iconSize = input<\"small\" | \"medium\" | \"large\">(\"medium\");\r\n\r\n // Outputs\r\n onClick = output<Event>();\r\n\r\n onMouseDown(event: MouseEvent) {\r\n event.preventDefault();\r\n }\r\n}\r\n","import { Component, input, ChangeDetectionStrategy } from \"@angular/core\";\r\n\r\n@Component({\r\n selector: \"tiptap-separator\",\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n template: `\r\n <div\r\n class=\"tiptap-separator\"\r\n [class.vertical]=\"orientation() === 'vertical'\"\r\n [class.horizontal]=\"orientation() === 'horizontal'\"\r\n [class.small]=\"size() === 'small'\"\r\n [class.medium]=\"size() === 'medium'\"\r\n [class.large]=\"size() === 'large'\"\r\n ></div>\r\n `,\r\n styles: [\r\n `\r\n .tiptap-separator {\r\n background-color: var(--ate-border, #e2e8f0);\r\n margin: 0;\r\n }\r\n\r\n .tiptap-separator.vertical {\r\n width: 1px;\r\n height: 24px;\r\n margin: 0 8px;\r\n }\r\n\r\n .tiptap-separator.horizontal {\r\n height: 1px;\r\n width: 100%;\r\n margin: 8px 0;\r\n }\r\n\r\n .tiptap-separator.small.vertical {\r\n height: 16px;\r\n margin: 0 4px;\r\n }\r\n\r\n .tiptap-separator.small.horizontal {\r\n margin: 4px 0;\r\n }\r\n\r\n .tiptap-separator.medium.vertical {\r\n height: 24px;\r\n margin: 0 8px;\r\n }\r\n\r\n .tiptap-separator.medium.horizontal {\r\n margin: 8px 0;\r\n }\r\n\r\n .tiptap-separator.large.vertical {\r\n height: 32px;\r\n margin: 0 12px;\r\n }\r\n\r\n .tiptap-separator.large.horizontal {\r\n margin: 12px 0;\r\n }\r\n `,\r\n ],\r\n})\r\nexport class TiptapSeparatorComponent {\r\n orientation = input<\"vertical\" | \"horizontal\">(\"vertical\");\r\n size = input<\"small\" | \"medium\" | \"large\">(\"medium\");\r\n}\r\n","import { Injectable, signal, computed } from \"@angular/core\";\r\n\r\nexport type SupportedLocale = \"en\" | \"fr\" | (string & {});\r\n\r\nexport interface TiptapTranslations {\r\n // Toolbar\r\n toolbar: {\r\n bold: string;\r\n italic: string;\r\n underline: string;\r\n strike: string;\r\n code: string;\r\n codeBlock: string;\r\n superscript: string;\r\n subscript: string;\r\n highlight: string;\r\n highlightPicker: string;\r\n heading1: string;\r\n heading2: string;\r\n heading3: string;\r\n bulletList: string;\r\n orderedList: string;\r\n blockquote: string;\r\n alignLeft: string;\r\n alignCenter: string;\r\n alignRight: string;\r\n alignJustify: string;\r\n link: string;\r\n image: string;\r\n horizontalRule: string;\r\n table: string;\r\n undo: string;\r\n redo: string;\r\n clear: string;\r\n textColor: string;\r\n customColor: string;\r\n presets: string;\r\n };\r\n\r\n // Bubble Menu\r\n bubbleMenu: {\r\n bold: string;\r\n italic: string;\r\n underline: string;\r\n strike: string;\r\n code: string;\r\n superscript: string;\r\n subscript: string;\r\n highlight: string;\r\n highlightPicker: string;\r\n textColor: string;\r\n link: string;\r\n addLink: string;\r\n editLink: string;\r\n removeLink: string;\r\n linkUrl: string;\r\n linkText: string;\r\n openLink: string;\r\n customColor: string;\r\n presets: string;\r\n };\r\n\r\n // Slash Commands\r\n slashCommands: {\r\n heading1: {\r\n title: string;\r\n description: string;\r\n keywords: string[];\r\n };\r\n heading2: {\r\n title: string;\r\n description: string;\r\n keywords: string[];\r\n };\r\n heading3: {\r\n title: string;\r\n description: string;\r\n keywords: string[];\r\n };\r\n bulletList: {\r\n title: string;\r\n description: string;\r\n keywords: string[];\r\n };\r\n orderedList: {\r\n title: string;\r\n description: string;\r\n keywords: string[];\r\n };\r\n blockquote: {\r\n title: string;\r\n description: string;\r\n keywords: string[];\r\n };\r\n code: {\r\n title: string;\r\n description: string;\r\n keywords: string[];\r\n };\r\n image: {\r\n title: string;\r\n description: string;\r\n keywords: string[];\r\n };\r\n horizontalRule: {\r\n title: string;\r\n description: string;\r\n keywords: string[];\r\n };\r\n table: {\r\n title: string;\r\n description: string;\r\n keywords: string[];\r\n };\r\n };\r\n\r\n // Table Actions\r\n table: {\r\n addRowBefore: string;\r\n addRowAfter: string;\r\n deleteRow: string;\r\n addColumnBefore: string;\r\n addColumnAfter: string;\r\n deleteColumn: string;\r\n deleteTable: string;\r\n toggleHeaderRow: string;\r\n toggleHeaderColumn: string;\r\n mergeCells: string;\r\n splitCell: string;\r\n };\r\n\r\n // Image Upload\r\n imageUpload: {\r\n selectImage: string;\r\n loadError: string;\r\n uploadingImage: string;\r\n uploadProgress: string;\r\n uploadError: string;\r\n uploadSuccess: string;\r\n imageTooLarge: string;\r\n invalidFileType: string;\r\n dragDropText: string;\r\n changeImage: string;\r\n deleteImage: string;\r\n resizeSmall: string;\r\n resizeMedium: string;\r\n resizeLarge: string;\r\n resizeOriginal: string;\r\n resizing: string;\r\n compressing: string;\r\n compressionError: string;\r\n validating: string;\r\n uploadingToServer: string;\r\n replacingImage: string;\r\n insertingImage: string;\r\n noFileSelected: string;\r\n selectionCancelled: string;\r\n };\r\n\r\n // Editor\r\n editor: {\r\n placeholder: string;\r\n character: string;\r\n word: string;\r\n linkPrompt: string;\r\n linkUrlPrompt: string;\r\n confirmDelete: string;\r\n };\r\n\r\n // Common\r\n common: {\r\n cancel: string;\r\n confirm: string;\r\n apply: string;\r\n delete: string;\r\n save: string;\r\n close: string;\r\n loading: string;\r\n error: string;\r\n success: string;\r\n };\r\n}\r\n\r\nconst ENGLISH_TRANSLATIONS: TiptapTranslations = {\r\n toolbar: {\r\n bold: \"Bold\",\r\n italic: \"Italic\",\r\n underline: \"Underline\",\r\n strike: \"Strikethrough\",\r\n code: \"Inline Code\",\r\n codeBlock: \"Code Block\",\r\n superscript: \"Superscript\",\r\n subscript: \"Subscript\",\r\n highlight: \"Highlight\",\r\n highlightPicker: \"Background Color\",\r\n heading1: \"Heading 1\",\r\n heading2: \"Heading 2\",\r\n heading3: \"Heading 3\",\r\n bulletList: \"Bullet List\",\r\n orderedList: \"Ordered List\",\r\n blockquote: \"Blockquote\",\r\n alignLeft: \"Align Left\",\r\n alignCenter: \"Align Center\",\r\n alignRight: \"Align Right\",\r\n alignJustify: \"Align Justify\",\r\n link: \"Add Link\",\r\n image: \"Add Image\",\r\n horizontalRule: \"Horizontal Rule\",\r\n table: \"Insert Table\",\r\n undo: \"Undo\",\r\n redo: \"Redo\",\r\n clear: \"Clear\",\r\n textColor: \"Text Color\",\r\n customColor: \"Custom Color\",\r\n presets: \"Presets\",\r\n },\r\n bubbleMenu: {\r\n bold: \"Bold\",\r\n italic: \"Italic\",\r\n underline: \"Underline\",\r\n strike: \"Strikethrough\",\r\n code: \"Code\",\r\n superscript: \"Superscript\",\r\n subscript: \"Subscript\",\r\n highlight: \"Highlight\",\r\n highlightPicker: \"Background Color\",\r\n textColor: \"Text Color\",\r\n link: \"Link\",\r\n addLink: \"Add Link\",\r\n editLink: \"Edit Link\",\r\n removeLink: \"Remove Link\",\r\n linkUrl: \"Link URL\",\r\n linkText: \"Link Text\",\r\n openLink: \"Open Link\",\r\n customColor: \"Custom Color\",\r\n presets: \"Presets\",\r\n },\r\n slashCommands: {\r\n heading1: {\r\n title: \"Heading 1\",\r\n description: \"Large section heading\",\r\n keywords: [\"heading\", \"h1\", \"title\", \"1\", \"header\"],\r\n },\r\n heading2: {\r\n title: \"Heading 2\",\r\n description: \"Medium section heading\",\r\n keywords: [\"heading\", \"h2\", \"title\", \"2\", \"header\"],\r\n },\r\n heading3: {\r\n title: \"Heading 3\",\r\n description: \"Small section heading\",\r\n keywords: [\"heading\", \"h3\", \"title\", \"3\", \"header\"],\r\n },\r\n bulletList: {\r\n title: \"Bullet List\",\r\n description: \"Create a bullet list\",\r\n keywords: [\"bullet\", \"list\", \"ul\", \"unordered\"],\r\n },\r\n orderedList: {\r\n title: \"Ordered List\",\r\n description: \"Create an ordered list\",\r\n keywords: [\"ordered\", \"list\", \"ol\", \"numbered\"],\r\n },\r\n blockquote: {\r\n title: \"Blockquote\",\r\n description: \"Add a blockquote\",\r\n keywords: [\"quote\", \"blockquote\", \"citation\"],\r\n },\r\n code: {\r\n title: \"Code Block\",\r\n description: \"Add a code block\",\r\n keywords: [\"code\", \"codeblock\", \"pre\", \"programming\"],\r\n },\r\n image: {\r\n title: \"Image\",\r\n description: \"Insert an image\",\r\n keywords: [\"image\", \"photo\", \"picture\", \"img\"],\r\n },\r\n horizontalRule: {\r\n title: \"Horizontal Rule\",\r\n description: \"Add a horizontal line\",\r\n keywords: [\"hr\", \"horizontal\", \"rule\", \"line\", \"separator\"],\r\n },\r\n table: {\r\n title: \"Table\",\r\n description: \"Insert a table\",\r\n keywords: [\"table\", \"grid\", \"data\", \"rows\", \"columns\"],\r\n },\r\n },\r\n table: {\r\n addRowBefore: \"Add row before\",\r\n addRowAfter: \"Add row after\",\r\n deleteRow: \"Delete row\",\r\n addColumnBefore: \"Add column before\",\r\n addColumnAfter: \"Add column after\",\r\n deleteColumn: \"Delete column\",\r\n deleteTable: \"Delete table\",\r\n toggleHeaderRow: \"Toggle header row\",\r\n toggleHeaderColumn: \"Toggle header column\",\r\n mergeCells: \"Merge cells\",\r\n splitCell: \"Split cell\",\r\n },\r\n imageUpload: {\r\n selectImage: \"Select Image\",\r\n loadError: \"Error loading image\",\r\n uploadingImage: \"Uploading image...\",\r\n uploadProgress: \"Upload Progress\",\r\n uploadError: \"Upload Error\",\r\n uploadSuccess: \"Upload Success\",\r\n imageTooLarge: \"Image too large\",\r\n invalidFileType: \"Invalid file type\",\r\n dragDropText: \"Drag and drop images here\",\r\n changeImage: \"Change Image\",\r\n deleteImage: \"Delete Image\",\r\n resizeSmall: \"Small\",\r\n resizeMedium: \"Medium\",\r\n resizeLarge: \"Large\",\r\n resizeOriginal: \"Original\",\r\n resizing: \"Resizing...\",\r\n compressing: \"Compressing...\",\r\n compressionError: \"Error during compression\",\r\n validating: \"Validating file...\",\r\n uploadingToServer: \"Uploading to server...\",\r\n replacingImage: \"Replacing image...\",\r\n insertingImage: \"Inserting into editor...\",\r\n noFileSelected: \"No image file selected\",\r\n selectionCancelled: \"Selection cancelled\",\r\n },\r\n editor: {\r\n placeholder: \"Start typing...\",\r\n character: \"character\",\r\n word: \"word\",\r\n linkPrompt: \"Enter link URL\",\r\n linkUrlPrompt: \"Enter URL\",\r\n confirmDelete: \"Are you sure you want to delete this?\",\r\n },\r\n common: {\r\n cancel: \"Cancel\",\r\n confirm: \"Confirm\",\r\n apply: \"Apply\",\r\n delete: \"Delete\",\r\n save: \"Save\",\r\n close: \"Close\",\r\n loading: \"Loading\",\r\n error: \"Error\",\r\n success: \"Success\",\r\n },\r\n};\r\n\r\nconst FRENCH_TRANSLATIONS: TiptapTranslations = {\r\n toolbar: {\r\n bold: \"Gras\",\r\n italic: \"Italique\",\r\n underline: \"Souligné\",\r\n strike: \"Barré\",\r\n code: \"Code en ligne\",\r\n codeBlock: \"Bloc de code\",\r\n superscript: \"Exposant\",\r\n subscript: \"Indice\",\r\n highlight: \"Surligner\",\r\n highlightPicker: \"Couleur de fond\",\r\n heading1: \"Titre 1\",\r\n heading2: \"Titre 2\",\r\n heading3: \"Titre 3\",\r\n bulletList: \"Liste à puces\",\r\n orderedList: \"Liste numérotée\",\r\n blockquote: \"Citation\",\r\n alignLeft: \"Aligner à gauche\",\r\n alignCenter: \"Centrer\",\r\n alignRight: \"Aligner à droite\",\r\n alignJustify: \"Justifier\",\r\n link: \"Ajouter un lien\",\r\n image: \"Ajouter une image\",\r\n horizontalRule: \"Ligne horizontale\",\r\n table: \"Insérer un tableau\",\r\n undo: \"Annuler\",\r\n redo: \"Refaire\",\r\n clear: \"Vider\",\r\n textColor: \"Couleur texte\",\r\n customColor: \"Couleur personnalisée\",\r\n presets: \"Préréglages\",\r\n },\r\n bubbleMenu: {\r\n bold: \"Gras\",\r\n italic: \"Italique\",\r\n underline: \"Souligné\",\r\n strike: \"Barré\",\r\n code: \"Code\",\r\n superscript: \"Exposant\",\r\n subscript: \"Indice\",\r\n highlight: \"Surligner\",\r\n highlightPicker: \"Couleur de fond\",\r\n textColor: \"Couleur texte\",\r\n link: \"Lien\",\r\n addLink: \"Ajouter un lien\",\r\n editLink: \"Modifier le lien\",\r\n removeLink: \"Supprimer le lien\",\r\n linkUrl: \"URL du lien\",\r\n linkText: \"Texte du lien\",\r\n openLink: \"Ouvrir le lien\",\r\n customColor: \"Couleur personnalisée\",\r\n presets: \"Préréglages\",\r\n },\r\n slashCommands: {\r\n heading1: {\r\n title: \"Titre 1\",\r\n description: \"Grand titre de section\",\r\n keywords: [\"heading\", \"h1\", \"titre\", \"title\", \"1\", \"header\"],\r\n },\r\n heading2: {\r\n title: \"Titre 2\",\r\n description: \"Titre de sous-section\",\r\n keywords: [\"heading\", \"h2\", \"titre\", \"title\", \"2\", \"header\"],\r\n },\r\n heading3: {\r\n title: \"Titre 3\",\r\n description: \"Petit titre\",\r\n keywords: [\"heading\", \"h3\", \"titre\", \"title\", \"3\", \"header\"],\r\n },\r\n bulletList: {\r\n title: \"Liste à puces\",\r\n description: \"Créer une liste à puces\",\r\n keywords: [\"bullet\", \"list\", \"liste\", \"puces\", \"ul\"],\r\n },\r\n orderedList: {\r\n title: \"Liste numérotée\",\r\n description: \"Créer une liste numérotée\",\r\n keywords: [\"numbered\", \"list\", \"liste\", \"numérotée\", \"ol\", \"ordered\"],\r\n },\r\n blockquote: {\r\n title: \"Citation\",\r\n description: \"Ajouter une citation\",\r\n keywords: [\"quote\", \"blockquote\", \"citation\"],\r\n },\r\n code: {\r\n title: \"Bloc de code\",\r\n description: \"Ajouter un bloc de code\",\r\n keywords: [\"code\", \"codeblock\", \"pre\", \"programmation\"],\r\n },\r\n image: {\r\n title: \"Image\",\r\n description: \"Insérer une image\",\r\n keywords: [\"image\", \"photo\", \"picture\", \"img\"],\r\n },\r\n horizontalRule: {\r\n title: \"Ligne horizontale\",\r\n description: \"Ajouter une ligne de séparation\",\r\n keywords: [\"hr\", \"horizontal\", \"rule\", \"ligne\", \"séparation\"],\r\n },\r\n table: {\r\n title: \"Tableau\",\r\n description: \"Insérer un tableau\",\r\n keywords: [\r\n \"table\",\r\n \"tableau\",\r\n \"grid\",\r\n \"grille\",\r\n \"data\",\r\n \"données\",\r\n \"rows\",\r\n \"colonnes\",\r\n ],\r\n },\r\n },\r\n table: {\r\n addRowBefore: \"Ajouter une ligne avant\",\r\n addRowAfter: \"Ajouter une ligne après\",\r\n deleteRow: \"Supprimer la ligne\",\r\n addColumnBefore: \"Ajouter une colonne avant\",\r\n addColumnAfter: \"Ajouter une colonne après\",\r\n deleteColumn: \"Supprimer la colonne\",\r\n deleteTable: \"Supprimer le tableau\",\r\n toggleHeaderRow: \"Basculer ligne d'en-tête\",\r\n toggleHeaderColumn: \"Basculer colonne d'en-tête\",\r\n mergeCells: \"Fusionner les cellules\",\r\n splitCell: \"Diviser la cellule\",\r\n },\r\n imageUpload: {\r\n selectImage: \"Sélectionner une image\",\r\n loadError: \"Erreur de chargement de l'image\",\r\n uploadingImage: \"Téléchargement de l'image...\",\r\n uploadProgress: \"Progression du téléchargement\",\r\n uploadError: \"Erreur de téléchargement\",\r\n uploadSuccess: \"Téléchargement réussi\",\r\n imageTooLarge: \"Image trop volumineuse\",\r\n invalidFileType: \"Type de fichier invalide\",\r\n dragDropText: \"Glissez et déposez des images ici\",\r\n changeImage: \"Changer l'image\",\r\n deleteImage: \"Supprimer l'image\",\r\n resizeSmall: \"Petit\",\r\n resizeMedium: \"Moyen\",\r\n resizeLarge: \"Grand\",\r\n resizeOriginal: \"Original\",\r\n resizing: \"Redimensionnement...\",\r\n compressing: \"Compression...\",\r\n compressionError: \"Erreur lors de la compression\",\r\n validating: \"Validation du fichier...\",\r\n uploadingToServer: \"Upload vers le serveur...\",\r\n replacingImage: \"Remplacement de l'image...\",\r\n insertingImage: \"Insertion dans l'éditeur...\",\r\n noFileSelected: \"Aucun fichier image sélectionné\",\r\n selectionCancelled: \"Sélection annulée\",\r\n },\r\n editor: {\r\n placeholder: \"Commencez à écrire...\",\r\n character: \"caractère\",\r\n word: \"mot\",\r\n linkPrompt: \"Entrez l'URL du lien\",\r\n linkUrlPrompt: \"Entrez l'URL\",\r\n confirmDelete: \"Êtes-vous sûr de vouloir supprimer ceci ?\",\r\n },\r\n common: {\r\n cancel: \"Annuler\",\r\n confirm: \"Confirmer\",\r\n apply: \"Appliquer\",\r\n delete: \"Supprimer\",\r\n save: \"Sauvegarder\",\r\n close: \"Fermer\",\r\n loading: \"Chargement\",\r\n error: \"Erreur\",\r\n success: \"Succès\",\r\n },\r\n};\r\n\r\n@Injectable({\r\n providedIn: \"root\",\r\n})\r\nexport class TiptapI18nService {\r\n private _currentLocale = signal<SupportedLocale>(\"en\");\r\n private _translations = signal<Record<SupportedLocale, TiptapTranslations>>({\r\n en: ENGLISH_TRANSLATIONS,\r\n fr: FRENCH_TRANSLATIONS,\r\n });\r\n\r\n // Public signals\r\n readonly currentLocale = this._currentLocale.asReadonly();\r\n /** All loaded translations (useful for dynamic key access) */\r\n readonly allTranslations = this._translations.asReadonly();\r\n \r\n readonly translations = computed(\r\n () => this._translations()[this._currentLocale()]\r\n );\r\n\r\n // Fast translation methods\r\n readonly t = computed(() => this.translations());\r\n readonly toolbar = computed(() => this.translations().toolbar);\r\n readonly bubbleMenu = computed(() => this.translations().bubbleMenu);\r\n readonly slashCommands = computed(() => this.translations().slashCommands);\r\n readonly table = computed(() => this.translations().table);\r\n readonly imageUpload = computed(() => this.translations().imageUpload);\r\n readonly editor = computed(() => this.translations().editor);\r\n readonly common = computed(() => this.translations().common);\r\n\r\n constructor() {\r\n // Automatically detect browser language\r\n this.detectBrowserLanguage();\r\n }\r\n\r\n setLocale(locale: SupportedLocale): void {\r\n this._currentLocale.set(locale);\r\n }\r\n\r\n autoDetectLocale(): void {\r\n this.detectBrowserLanguage();\r\n }\r\n\r\n getSupportedLocales(): SupportedLocale[] {\r\n return Object.keys(this._translations()) as SupportedLocale[];\r\n }\r\n\r\n addTranslations(\r\n locale: string,\r\n translations: TiptapTranslations | Partial<TiptapTranslations>\r\n ): void {\r\n this._translations.update((current) => {\r\n const existing = current[locale] || ENGLISH_TRANSLATIONS;\r\n return {\r\n ...current,\r\n [locale]: {\r\n ...existing,\r\n ...translations,\r\n },\r\n };\r\n });\r\n }\r\n\r\n private detectBrowserLanguage(): void {\r\n const browserLang = navigator.language.toLowerCase();\r\n if (browserLang.startsWith(\"fr\")) {\r\n this._currentLocale.set(\"fr\");\r\n } else {\r\n this._currentLocale.set(\"en\");\r\n }\r\n }\r\n\r\n // Utility methods for components\r\n getToolbarTitle(key: keyof TiptapTranslations[\"toolbar\"]): string {\r\n return this.translations().toolbar[key];\r\n }\r\n\r\n getBubbleMenuTitle(key: keyof TiptapTranslations[\"bubbleMenu\"]): string {\r\n return this.translations().bubbleMenu[key];\r\n }\r\n\r\n getSlashCommand(key: keyof TiptapTranslations[\"slashCommands\"]) {\r\n return this.translations().slashCommands[key];\r\n }\r\n}\r\n","import { Injectable, signal, computed, inject } from \"@angular/core\";\r\nimport { Editor } from \"@tiptap/core\";\r\nimport { Observable, isObservable, firstValueFrom } from \"rxjs\";\r\nimport { TiptapI18nService } from \"./i18n.service\";\r\n\r\nexport interface ImageData {\r\n src: string;\r\n alt?: string;\r\n title?: string;\r\n width?: number;\r\n height?: number;\r\n}\r\n\r\nexport interface ImageUploadResult {\r\n src: string;\r\n name: string;\r\n size: number;\r\n type: string;\r\n width?: number;\r\n height?: number;\r\n originalSize?: number;\r\n}\r\n\r\nexport interface ResizeOptions {\r\n width?: number;\r\n height?: number;\r\n maintainAspectRatio?: boolean;\r\n}\r\n\r\n/**\r\n * Context passed to the image upload handler containing information about the image\r\n */\r\nexport interface ImageUploadContext {\r\n /** Original file being uploaded */\r\n file: File;\r\n /** Width of the processed image */\r\n width: number;\r\n /** Height of the processed image */\r\n height: number;\r\n /** MIME type of the image */\r\n type: string;\r\n /** Base64 data URL of the processed image (after compression/resize) */\r\n base64: string;\r\n}\r\n\r\n/**\r\n * Result expected from a custom image upload handler.\r\n * Must contain at least the `src` property with the image URL.\r\n */\r\nexport interface ImageUploadHandlerResult {\r\n /** URL of the uploaded image (can be a remote URL or any string) */\r\n src: string;\r\n /** Optional custom alt text */\r\n alt?: string;\r\n /** Optional custom title */\r\n title?: string;\r\n}\r\n\r\n/**\r\n * Custom handler function for image uploads.\r\n * Allows users to implement their own image storage logic (e.g., upload to S3, Cloudinary, etc.)\r\n *\r\n * Can return either a Promise or an Observable (Angular-friendly).\r\n *\r\n * @param context - Context containing the image file and metadata\r\n * @returns Promise or Observable resolving to ImageUploadHandlerResult\r\n *\r\n * @example Using Promise (async/await)\r\n * ```typescript\r\n * uploadHandler: ImageUploadHandler = async (ctx) => {\r\n * const formData = new FormData();\r\n * formData.append('image', ctx.file);\r\n * const result = await firstValueFrom(this.http.post<{url: string}>('/api/upload', formData));\r\n * return { src: result.url };\r\n * };\r\n * ```\r\n *\r\n * @example Using Observable (Angular HttpClient)\r\n * ```typescript\r\n * uploadHandler: ImageUploadHandler = (ctx) => {\r\n * const formData = new FormData();\r\n * formData.append('image', ctx.file);\r\n * return this.http.post<{url: string}>('/api/upload', formData).pipe(\r\n * map(result => ({ src: result.url }))\r\n * );\r\n * };\r\n * ```\r\n */\r\nexport type ImageUploadHandler = (\r\n context: ImageUploadContext\r\n) => Promise<ImageUploadHandlerResult> | Observable<ImageUploadHandlerResult>;\r\n\r\n\r\n@Injectable()\r\nexport class ImageService {\r\n /** Signals for image state */\r\n selectedImage = signal<ImageData | null>(null);\r\n isImageSelected = computed(() => this.selectedImage() !== null);\r\n\r\n /** Resizing state */\r\n isResizing = signal(false);\r\n\r\n private i18n = inject(TiptapI18nService);\r\n private readonly t = this.i18n.imageUpload;\r\n\r\n /** Upload state signals */\r\n isUploading = signal(false);\r\n uploadProgress = signal(0);\r\n uploadMessage = signal(\"\");\r\n\r\n /**\r\n * Custom upload handler.\r\n * If set, this handler replaces the default base64 conversion.\r\n */\r\n uploadHandler: ImageUploadHandler | null = null;\r\n\r\n private currentEditor: Editor | null = null;\r\n\r\n /** Select and track an image from the editor */\r\n selectImage(editor: Editor): void {\r\n if (editor.isActive(\"resizableImage\")) {\r\n const attrs = editor.getAttributes(\"resizableImage\");\r\n this.selectedImage.set({\r\n src: attrs[\"src\"],\r\n alt: attrs[\"alt\"],\r\n title: attrs[\"title\"],\r\n width: attrs[\"width\"],\r\n height: attrs[\"height\"],\r\n });\r\n } else {\r\n this.selectedImage.set(null);\r\n }\r\n }\r\n\r\n clearSelection(): void {\r\n this.selectedImage.set(null);\r\n }\r\n\r\n /** Insert a new image and ensure it's selected */\r\n insertImage(editor: Editor, imageData: ImageData): void {\r\n const { from } = editor.state.selection;\r\n editor.chain()\r\n .focus()\r\n .setResizableImage(imageData)\r\n .setNodeSelection(from)\r\n .run();\r\n }\r\n\r\n /** Update attributes of the currently active image */\r\n updateImageAttributes(editor: Editor, attributes: Partial<ImageData>): void {\r\n if (editor.isActive(\"resizableImage\")) {\r\n const pos = editor.state.selection.from;\r\n editor\r\n .chain()\r\n .focus()\r\n .updateAttributes(\"resizableImage\", attributes)\r\n .setNodeSelection(pos)\r\n .run();\r\n this.updateSelectedImage(attributes);\r\n }\r\n }\r\n\r\n /** Resize image with optional aspect ratio maintenance */\r\n resizeImage(editor: Editor, options: ResizeOptions): void {\r\n if (!editor.isActive(\"resizableImage\")) return;\r\n\r\n const currentAttrs = editor.getAttributes(\"resizableImage\");\r\n let newWidth = options.width;\r\n let newHeight = options.height;\r\n\r\n // Maintain aspect ratio if requested\r\n if (\r\n options.maintainAspectRatio !== false &&\r\n currentAttrs[\"width\"] &&\r\n currentAttrs[\"height\"]\r\n ) {\r\n const aspectRatio = currentAttrs[\"width\"] / currentAttrs[\"height\"];\r\n\r\n if (newWidth && !newHeight) {\r\n newHeight = Math.round(newWidth / aspectRatio);\r\n } else if (newHeight && !newWidth) {\r\n newWidth = Math.round(newHeight * aspectRatio);\r\n }\r\n }\r\n\r\n // Apply minimum limits\r\n if (newWidth) newWidth = Math.max(50, newWidth);\r\n if (newHeight) newHeight = Math.max(50, newHeight);\r\n\r\n this.updateImageAttributes(editor, {\r\n width: newWidth,\r\n height: newHeight,\r\n });\r\n }\r\n\r\n /** Predetermined resize helpers used by UI */\r\n resizeImageToSmall(editor: Editor): void {\r\n this.resizeImage(editor, { width: 300, height: 200, maintainAspectRatio: true });\r\n }\r\n\r\n resizeImageToMedium(editor: Editor): void {\r\n this.resizeImage(editor, { width: 500, height: 350, maintainAspectRatio: true });\r\n }\r\n\r\n resizeImageToLarge(editor: Editor): void {\r\n this.resizeImage(editor, { width: 800, height: 600, maintainAspectRatio: true });\r\n }\r\n\r\n resizeImageToOriginal(editor: Editor): void {\r\n if (!editor.isActive(\"resizableImage\")) return;\r\n const img = new Image();\r\n img.onload = () => {\r\n this.resizeImage(editor, { width: img.naturalWidth, height: img.naturalHeight });\r\n };\r\n img.src = editor.getAttributes(\"resizableImage\")[\"src\"];\r\n }\r\n\r\n /** Get current image dimensions */\r\n getImageDimensions(editor: Editor): { width: number; height: number } | null {\r\n if (!editor.isActive(\"resizableImage\")) return null;\r\n const attrs = editor.getAttributes(\"resizableImage\");\r\n return {\r\n width: attrs[\"width\"] || 0,\r\n height: attrs[\"height\"] || 0,\r\n };\r\n }\r\n\r\n /** Remove the selected image */\r\n deleteImage(editor: Editor): void {\r\n if (editor.isActive(\"resizableImage\")) {\r\n editor.chain().focus().deleteSelection().run();\r\n this.clearSelection();\r\n }\r\n }\r\n\r\n private updateSelectedImage(attributes: Partial<ImageData>): void {\r\n const current = this.selectedImage();\r\n if (current) {\r\n this.selectedImage.set({ ...current, ...attributes });\r\n }\r\n }\r\n\r\n /** Validate file type and size */\r\n validateImage(file: File, maxSize: number = 10 * 1024 * 1024): { valid: boolean; error?: string } {\r\n if (!file.type.startsWith(\"image/\")) {\r\n return { valid: false, error: this.t().invalidFileType };\r\n }\r\n if (file.size > maxSize) {\r\n return {\r\n valid: false,\r\n error: `${this.t().imageTooLarge} (max ${maxSize / 1024 / 1024}MB)`,\r\n };\r\n }\r\n return { valid: true };\r\n }\r\n\r\n /** Compress and process image on client side */\r\n async compressImage(\r\n file: File,\r\n quality: number = 0.8,\r\n maxWidth: number = 1920,\r\n maxHeight: number = 1200\r\n ): Promise<ImageUploadResult> {\r\n return new Promise((resolve, reject) => {\r\n const canvas = document.createElement(\"canvas\");\r\n const ctx = canvas.getContext(\"2d\");\r\n const img = new Image();\r\n\r\n img.onload = () => {\r\n if (this.isUploading()) {\r\n this.uploadProgress.set(40);\r\n this.uploadMessage.set(this.t().resizing);\r\n }\r\n\r\n let { width, height } = img;\r\n if (width > maxWidth || height > maxHeight) {\r\n const ratio = Math.min(maxWidth / width, maxHeight / height);\r\n width *= ratio;\r\n height *= ratio;\r\n }\r\n\r\n canvas.width = width;\r\n canvas.height = height;\r\n ctx?.drawImage(img, 0, 0, width, height);\r\n\r\n if (this.isUploading()) {\r\n this.uploadProgress.set(60);\r\n this.uploadMessage.set(this.t().compressing);\r\n }\r\n\r\n canvas.toBlob(\r\n (blob) => {\r\n if (blob) {\r\n const reader = new FileReader();\r\n reader.onload = (e) => {\r\n const base64 = e.target?.result as string;\r\n resolve({\r\n src: base64,\r\n name: file.name,\r\n size: blob.size,\r\n type: file.type,\r\n width: Math.round(width),\r\n height: Math.round(height),\r\n originalSize: file.size,\r\n });\r\n };\r\n reader.readAsDataURL(blob);\r\n } else {\r\n reject(new Error(this.t().compressionError));\r\n }\r\n },\r\n file.type,\r\n quality\r\n );\r\n };\r\n\r\n img.onerror = () => reject(new Error(this.t().loadError));\r\n img.src = URL.createObjectURL(file);\r\n });\r\n }\r\n\r\n /** Core upload logic with progress tracking */\r\n private async uploadImageWithProgress(\r\n editor: Editor,\r\n file: File,\r\n insertionStrategy: (editor: Editor, result: ImageUploadResult) => void,\r\n actionMessage: string,\r\n options?: { quality?: number; maxWidth?: number; maxHeight?: number }\r\n ): Promise<void> {\r\n try {\r\n this.currentEditor = editor;\r\n this.isUploading.set(true);\r\n this.uploadProgress.set(10);\r\n this.uploadMessage.set(this.t().validating);\r\n this.forceEditorUpdate();\r\n\r\n const validation = this.validateImage(file);\r\n if (!validation.valid) throw new Error(validation.error);\r\n\r\n this.uploadProgress.set(30);\r\n this.uploadMessage.set(this.t().compressing);\r\n this.forceEditorUpdate();\r\n\r\n const result = await this.compressImage(\r\n file,\r\n options?.quality || 0.8,\r\n options?.maxWidth || 1920,\r\n options?.maxHeight || 1200\r\n );\r\n\r\n this.uploadProgress.set(70);\r\n\r\n // Handle custom upload if handler is provided\r\n if (this.uploadHandler) {\r\n this.uploadMessage.set(this.t().uploadingToServer);\r\n this.forceEditorUpdate();\r\n\r\n try {\r\n const handlerResponse = this.uploadHandler({\r\n file,\r\n width: result.width || 0,\r\n height: result.height || 0,\r\n type: result.type,\r\n base64: result.src,\r\n });\r\n\r\n const handlerResult = isObservable(handlerResponse)\r\n ? await firstValueFrom(handlerResponse)\r\n : await handlerResponse;\r\n\r\n result.src = handlerResult.src;\r\n if (handlerResult.alt) result.name = handlerResult.alt;\r\n } catch (handlerError) {\r\n console.error(this.t().uploadError, handlerError);\r\n throw handlerError;\r\n }\r\n }\r\n\r\n this.uploadProgress.set(90);\r\n this.uploadMessage.set(actionMessage);\r\n this.forceEditorUpdate();\r\n\r\n // Final insertion\r\n insertionStrategy(editor, result);\r\n\r\n this.resetUploadState();\r\n } catch (error) {\r\n this.resetUploadState();\r\n console.error(this.t().uploadError, error);\r\n throw error;\r\n }\r\n }\r\n\r\n private resetUploadState() {\r\n this.isUploading.set(false);\r\n this.uploadProgress.set(0);\r\n this.uploadMessage.set(\"\");\r\n this.forceEditorUpdate();\r\n this.currentEditor = null;\r\n }\r\n\r\n /** Main entry point for file upload and insertion */\r\n async uploadAndInsertImage(editor: Editor, file: File, options?: Record<string, any>): Promise<void> {\r\n return this.uploadImageWithProgress(\r\n editor,\r\n file,\r\n (ed, result) => {\r\n this.insertImage(ed, {\r\n src: result.src,\r\n alt: result.name,\r\n title: `${result.name} (${result.width}×${result.height})`,\r\n width: result.width,\r\n height: result.height,\r\n });\r\n },\r\n this.t().insertingImage,\r\n options\r\n );\r\n }\r\n\r\n /** Trigger an editor transaction to force decoration update */\r\n private forceEditorUpdate() {\r\n if (this.currentEditor) {\r\n const { tr } = this.currentEditor.state;\r\n this.currentEditor.view.dispatch(tr);\r\n }\r\n }\r\n\r\n /** Generic helper to open file picker and process selection */\r\n private async selectFileAndProcess(\r\n editor: Editor,\r\n uploadMethod: (editor: Editor, file: File, options?: Record<string, any>) => Promise<void>,\r\n options?: Record<string, any>\r\n ): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n const input = document.createElement(\"input\");\r\n input.type = \"file\";\r\n input.accept = options?.['accept'] || \"image/*\";\r\n input.style.display = \"none\";\r\n\r\n input.addEventListener(\"change\", async (e) => {\r\n const file = (e.target as HTMLInputElement).files?.[0];\r\n if (file && file.type.startsWith(\"image/\")) {\r\n try {\r\n await uploadMethod(editor, file, options);\r\n resolve();\r\n } catch (error) { reject(error); }\r\n } else {\r\n reject(new Error(this.t().noFileSelected));\r\n }\r\n document.body.removeChild(input);\r\n });\r\n\r\n input.addEventListener(\"cancel\", () => {\r\n document.body.removeChild(input);\r\n reject(new Error(this.t().selectionCancelled));\r\n });\r\n\r\n document.body.appendChild(input);\r\n input.click();\r\n });\r\n }\r\n\r\n /** Select file and upload as new image */\r\n async selectAndUploadImage(editor: Editor, options?: Record<string, any>): Promise<void> {\r\n return this.selectFileAndProcess(editor, this.uploadAndInsertImage.bind(this), options);\r\n }\r\n\r\n /** Select file and replace currently selected image */\r\n async selectAndReplaceImage(editor: Editor, options?: Record<string, any>): Promise<void> {\r\n // No need for complicated backup/restore now that we don't delete prematurely.\r\n // The uploadAndReplaceImage will handle the atomic replacement.\r\n return this.selectFileAndProcess(editor, this.uploadAndReplaceImage.bind(this), options);\r\n }\r\n\r\n /** Internal helper used by replacement logic */\r\n async uploadAndReplaceImage(editor: Editor, file: File, options?: Record<string, any>): Promise<void> {\r\n // Store current position to ensure we can re-select the image even if selection blurs during upload\r\n const pos = editor.state.selection.from;\r\n const wasActive = editor.isActive(\"resizableImage\");\r\n\r\n await this.uploadImageWithProgress(\r\n editor,\r\n file,\r\n (ed, result) => {\r\n const imageData = {\r\n src: result.src,\r\n alt: result.name,\r\n title: `${result.name} (${result.width}×${result.height})`,\r\n width: result.width,\r\n height: result.height,\r\n };\r\n\r\n // If the image was active or is still active, update it atomically\r\n if (wasActive || ed.isActive(\"resizableImage\")) {\r\n ed.chain()\r\n .focus()\r\n .updateAttributes(\"resizableImage\", imageData)\r\n .setNodeSelection(pos)\r\n .run();\r\n this.updateSelectedImage(imageData);\r\n } else {\r\n // Otherwise replace whatever is selected (or insert at cursor)\r\n this.insertImage(ed, imageData);\r\n }\r\n\r\n // After replacement, ensure the image is tracked in our signals\r\n this.selectImage(ed);\r\n },\r\n this.t().replacingImage,\r\n options\r\n );\r\n }\r\n}\r\n","/**\r\n * Normalizes color values (rgb/rgba to hex).\r\n */\r\nexport function normalizeColor(color: string | null | undefined): string | null {\r\n if (!color || color === 'transparent' || color === 'rgba(0, 0, 0, 0)') return null;\r\n if (color.startsWith(\"#\")) return color;\r\n\r\n // Support both comma-separated (legacy) and space-separated (modern) rgb/rgba\r\n const rgbMatch = color\r\n .trim()\r\n .match(\r\n /^rgba?\\(\\s*([\\d.]+)[,\\s]+([\\d.]+)[,\\s]+([\\d.]+)(?:[,\\s/]+([\\d.]+))?\\s*\\)$/i\r\n );\r\n\r\n // If it's a named color or something else we don't recognize, \r\n // we can't easily normalize it to hex without a heavy dictionary.\r\n // However, getComputedStyle usually returns rgb() which we handle above.\r\n if (!rgbMatch) {\r\n // Simple fallback for common named colors if getComputedStyle fails to return rgb\r\n const named: Record<string, string> = { 'black': '#000000', 'white': '#ffffff', 'red': '#ff0000' };\r\n if (named[color.toLowerCase()]) return named[color.toLowerCase()]!;\r\n return null;\r\n }\r\n\r\n const r = Math.max(0, Math.min(255, Math.round(parseFloat(rgbMatch[1]!))));\r\n const g = Math.max(0, Math.min(255, Math.round(parseFloat(rgbMatch[2]!))));\r\n const b = Math.max(0, Math.min(255, Math.round(parseFloat(rgbMatch[3]!))));\r\n const a = rgbMatch[4] ? parseFloat(rgbMatch[4]) : 1;\r\n\r\n // If completely transparent, return null\r\n if (a === 0) return null;\r\n\r\n return (\r\n \"#\" +\r\n [r, g, b]\r\n .map((n) => n.toString(16).padStart(2, \"0\"))\r\n .join(\"\")\r\n .toLowerCase()\r\n );\r\n}\r\n\r\n/**\r\n * Calculate luminance (0-255).\r\n */\r\nexport function getLuminance(color: string | null | undefined): number {\r\n const normalized = normalizeColor(color);\r\n if (!normalized) return 0; // Default to dark (luminance 0) if no color\r\n const hex = normalized.replace(\"#\", \"\");\r\n const r = parseInt(hex.substring(0, 2), 16);\r\n const g = parseInt(hex.substring(2, 4), 16);\r\n const b = parseInt(hex.substring(4, 6), 16);\r\n return (r * 299 + g * 587 + b * 114) / 1000;\r\n}\r\n\r\n/**\r\n * Returns contrast color for readability.\r\n */\r\nexport function getContrastColor(color: string): \"black\" | \"white\" {\r\n return getLuminance(color) > 128 ? \"black\" : \"white\";\r\n}\r\n","import { Injectable, signal } from \"@angular/core\";\r\nimport type { Editor } from \"@tiptap/core\";\r\nimport { normalizeColor, getLuminance, getContrastColor } from \"../utils/color.utils\";\r\n\r\nexport interface ColorPickerSelection {\r\n from: number;\r\n to: number;\r\n}\r\n\r\nexport type ColorEditMode = 'text' | 'highlight';\r\n\r\n@Injectable()\r\nexport class ColorPickerService {\r\n private storedSelection: ColorPickerSelection | null = null;\r\n\r\n // ============================================\r\n // State Signals (owned by this service)\r\n // ============================================\r\n\r\n /** Current edit mode: null when closed, 'text' or 'highlight' when open */\r\n readonly editMode = signal<ColorEditMode | null>(null);\r\n\r\n /** Reference to the element that triggered the menu (for anchoring) */\r\n readonly menuTrigger = signal<HTMLElement | null>(null);\r\n\r\n /** Whether the user is currently interacting with the picker UI (e.g. typing) */\r\n readonly isInteracting = signal<boolean>(false);\r\n\r\n\r\n // ============================================\r\n // Menu Lifecycle Methods\r\n // ============================================\r\n\r\n /**\r\n * Open the color picker menu in the specified mode.\r\n */\r\n open(mode: ColorEditMode, trigger?: HTMLElement): void {\r\n this.menuTrigger.set(trigger || null);\r\n this.editMode.set(mode);\r\n }\r\n\r\n /**\r\n * Close the color picker menu.\r\n */\r\n close(): void {\r\n this.editMode.set(null);\r\n this.isInteracting.set(false);\r\n }\r\n\r\n\r\n /**\r\n * Set interaction state (prevents premature closing when blurring editor)\r\n */\r\n setInteracting(value: boolean): void {\r\n this.isInteracting.set(value);\r\n }\r\n\r\n\r\n /**\r\n * Toggle color picker from UI (extracts trigger from event).\r\n */\r\n toggle(editor: Editor, mode: ColorEditMode, event?: Event): void {\r\n if (!editor) return;\r\n\r\n let trigger: HTMLElement | undefined;\r\n if (event && typeof event !== 'string') {\r\n const target = event.target as HTMLElement;\r\n trigger = (event.currentTarget as HTMLElement) || target?.closest('button') || target;\r\n }\r\n\r\n this.open(mode, trigger);\r\n }\r\n\r\n // ============================================\r\n // Selection Capture (for reliable color application)\r\n // ============================================\r\n\r\n /**\r\n * Capture current editor selection.\r\n */\r\n captureSelection(editor: Editor): void {\r\n if (!editor) return;\r\n this.storedSelection = {\r\n from: editor.state.selection.from,\r\n to: editor.state.selection.to,\r\n };\r\n }\r\n\r\n /**\r\n * Get last captured selection.\r\n */\r\n getStoredSelection(): ColorPickerSelection | null {\r\n return this.storedSelection;\r\n }\r\n\r\n /**\r\n * Clear captured selection.\r\n */\r\n done(): void {\r\n this.storedSelection = null;\r\n this.menuTrigger.set(null);\r\n }\r\n\r\n\r\n // ============================================\r\n // Color Application Commands\r\n // ============================================\r\n\r\n /**\r\n * Apply text color to selection.\r\n */\r\n applyColor(editor: Editor, color: string, addToHistory: boolean = true, focus: boolean = true): void {\r\n if (!editor) return;\r\n\r\n const stored = this.storedSelection;\r\n let chain = editor.chain();\r\n if (focus) chain = chain.focus();\r\n\r\n if (stored && (editor.state.selection.empty || !editor.isFocused)) {\r\n chain = chain.setTextSelection(stored);\r\n } else if (editor.state.selection.empty && !stored) {\r\n chain = chain.extendMarkRange(\"textStyle\");\r\n }\r\n\r\n (chain as any).setColor(color);\r\n if (addToHistory === false) chain = (chain as any).setMeta(\"addToHistory\", false);\r\n chain.run();\r\n }\r\n\r\n /**\r\n * Remove text color from selection.\r\n */\r\n unsetColor(editor: Editor, focus: boolean = true): void {\r\n if (!editor) return;\r\n\r\n const stored = this.storedSelection;\r\n let chain = editor.chain();\r\n if (focus) chain = chain.focus();\r\n\r\n if (stored) {\r\n chain = chain.setTextSelection(stored);\r\n } else if (editor.state.selection.empty) {\r\n chain = chain.extendMarkRange(\"textStyle\");\r\n }\r\n\r\n (chain as any).unsetColor();\r\n chain.run();\r\n }\r\n\r\n /**\r\n * Apply highlight color to selection.\r\n */\r\n applyHighlight(editor: Editor, color: string, addToHistory: boolean = true, focus: boolean = true): void {\r\n if (!editor) return;\r\n\r\n const stored = this.storedSelection;\r\n let chain = editor.chain();\r\n if (focus) chain = chain.focus();\r\n\r\n if (stored && (editor.state.selection.empty || !editor.isFocused)) {\r\n chain = chain.setTextSelection(stored);\r\n } else if (editor.state.selection.empty && !stored) {\r\n chain = chain.extendMarkRange(\"highlight\");\r\n }\r\n\r\n (chain as any).setHighlight({ color });\r\n if (addToHistory === false) chain = (chain as any).setMeta(\"addToHistory\", false);\r\n chain.run();\r\n }\r\n\r\n /**\r\n * Remove highlight from selection.\r\n */\r\n unsetHighlight(editor: Editor, focus: boolean = true): void {\r\n if (!editor) return;\r\n\r\n const stored = this.storedSelection;\r\n let chain = editor.chain();\r\n if (focus) chain = chain.focus();\r\n\r\n if (stored) {\r\n chain = chain.setTextSelection(stored);\r\n } else if (editor.state.selection.empty) {\r\n chain = chain.extendMarkRange(\"highlight\");\r\n }\r\n\r\n (chain as any).unsetHighlight();\r\n chain.run();\r\n }\r\n\r\n\r\n // ============================================\r\n // Color Utilities (Delegated to color.utils.ts)\r\n // ============================================\r\n\r\n normalizeColor(color: string | null | undefined): string {\r\n return normalizeColor(color) || \"#000000\";\r\n }\r\n\r\n getLuminance(color: string): number {\r\n return getLuminance(color);\r\n }\r\n\r\n getContrastColor(color: string): \"black\" | \"white\" {\r\n return getContrastColor(color);\r\n }\r\n}\r\n\r\n\r\n","import { Injectable, signal } from \"@angular/core\";\r\nimport type { Editor } from \"@tiptap/core\";\r\n\r\n@Injectable()\r\nexport class LinkService {\r\n\r\n // ============================================\r\n // State Signals (owned by this service)\r\n // ============================================\r\n\r\n /** Whether link edit mode is active */\r\n readonly editMode = signal<boolean>(false);\r\n\r\n /** Reference to the element that triggered the menu (for anchoring) */\r\n readonly menuTrigger = signal<HTMLElement | null>(null);\r\n\r\n /** Whether the user is currently interacting with the link UI (input focus) */\r\n readonly isInteracting = signal<boolean>(false);\r\n\r\n\r\n // ============================================\r\n // Menu Lifecycle Methods\r\n // ============================================\r\n\r\n /**\r\n * Open the link edit menu.\r\n */\r\n open(trigger?: HTMLElement): void {\r\n this.menuTrigger.set(trigger || null);\r\n this.editMode.set(true);\r\n }\r\n\r\n /**\r\n * Close the link edit menu.\r\n */\r\n close(): void {\r\n this.editMode.set(false);\r\n this.isInteracting.set(false);\r\n }\r\n\r\n /**\r\n * Final cleanup (called after UI is hidden)\r\n */\r\n done(): void {\r\n this.menuTrigger.set(null);\r\n }\r\n\r\n\r\n /**\r\n * Set interaction state\r\n */\r\n setInteracting(value: boolean): void {\r\n this.isInteracting.set(value);\r\n }\r\n\r\n /**\r\n * Toggle link mode from UI.\r\n * If a URL string is provided, applies the link and closes.\r\n * If an Event is provided, extracts the trigger for anchoring.\r\n */\r\n toggle(editor: Editor, urlOrEvent?: string | Event): void {\r\n if (!editor) return;\r\n\r\n // If a string URL is provided, set the link and close\r\n if (urlOrEvent && typeof urlOrEvent === 'string') {\r\n this.setLink(editor, urlOrEvent);\r\n return;\r\n }\r\n\r\n // If an Event is provided, extract the trigger element\r\n let trigger: HTMLElement | undefined;\r\n if (urlOrEvent && typeof urlOrEvent !== 'string') {\r\n const target = (urlOrEvent as Event).target as HTMLElement;\r\n trigger = ((urlOrEvent as Event).currentTarget as HTMLElement) || target?.closest('button') || target;\r\n }\r\n\r\n // Open the edit menu\r\n this.open(trigger);\r\n }\r\n\r\n // ============================================\r\n // Link Commands\r\n // ============================================\r\n\r\n /**\r\n * Apply a link to the current selection.\r\n */\r\n setLink(editor: Editor, url: string): void {\r\n if (!editor) return;\r\n editor.chain().focus().extendMarkRange(\"link\").setLink({ href: url }).run();\r\n this.close();\r\n }\r\n\r\n /**\r\n * Remove link from the current selection.\r\n */\r\n unsetLink(editor: Editor): void {\r\n if (!editor) return;\r\n editor.chain().focus().extendMarkRange(\"link\").unsetLink().run();\r\n this.close();\r\n }\r\n}\r\n","import { Injectable, inject, signal } from \"@angular/core\";\r\nimport { Editor } from \"@tiptap/core\";\r\nimport { ImageService, ImageUploadHandler } from \"./image.service\";\r\nimport { ColorPickerService } from \"./color-picker.service\";\r\nimport { LinkService } from \"./link.service\";\r\nimport { EditorStateSnapshot, INITIAL_EDITOR_STATE } from \"../models/editor-state.model\";\r\n\r\n@Injectable()\r\nexport class EditorCommandsService {\r\n private imageService = inject(ImageService);\r\n private colorPickerSvc = inject(ColorPickerService);\r\n private linkSvc = inject(LinkService);\r\n private readonly _editorState = signal<EditorStateSnapshot>(INITIAL_EDITOR_STATE, {\r\n equal: (a, b) => {\r\n // 1. Primitive global states\r\n if (a.isFocused !== b.isFocused || a.isEditable !== b.isEditable) return false;\r\n\r\n // 2. Detailed selection comparison\r\n if (\r\n a.selection.from !== b.selection.from ||\r\n a.selection.to !== b.selection.to ||\r\n a.selection.type !== b.selection.type ||\r\n a.selection.empty !== b.selection.empty ||\r\n a.selection.isSingleCell !== b.selection.isSingleCell\r\n ) return false;\r\n\r\n // Helper for object comparison\r\n const isRecordEqual = (objA: Record<string, any>, objB: Record<string, any>) => {\r\n const keysA = Object.keys(objA);\r\n const keysB = Object.keys(objB);\r\n if (keysA.length !== keysB.length) return false;\r\n return keysA.every(key => objA[key] === objB[key]);\r\n };\r\n\r\n // 3. Compare sub-states (marks, can, nodes)\r\n if (!isRecordEqual(a.marks, b.marks)) return false;\r\n if (!isRecordEqual(a.can, b.can)) return false;\r\n if (!isRecordEqual(a.nodes, b.nodes)) return false;\r\n\r\n // 4. Compare custom extension states\r\n if (!isRecordEqual(a.custom, b.custom)) return false;\r\n\r\n return true;\r\n }\r\n });\r\n\r\n /** Exposed editor state as a readonly signal */\r\n readonly editorState = this._editorState.asReadonly();\r\n\r\n // ============================================\r\n // Toolbar Interaction State\r\n // ============================================\r\n\r\n /** Signal to track when the toolbar is being hovered/interacted with */\r\n private readonly _isToolbarInteracting = signal(false);\r\n readonly isToolbarInteracting = this._isToolbarInteracting.asReadonly();\r\n\r\n /** Set toolbar interaction state (called by editor component) */\r\n setToolbarInteracting(value: boolean): void {\r\n this._isToolbarInteracting.set(value);\r\n }\r\n\r\n // Access to ImageService states as readonly signals for UI binding\r\n readonly isUploading = this.imageService.isUploading.asReadonly();\r\n readonly uploadProgress = this.imageService.uploadProgress.asReadonly();\r\n readonly uploadMessage = this.imageService.uploadMessage.asReadonly();\r\n set uploadHandler(handler: ImageUploadHandler | null) { this.imageService.uploadHandler = handler; }\r\n\r\n /** Update state (called by TiptapStateExtension) */\r\n updateState(state: EditorStateSnapshot) {\r\n this._editorState.set(state);\r\n }\r\n\r\n // ============================================\r\n // Link State (proxied from LinkService)\r\n // ============================================\r\n\r\n /** Signal to toggle link edit mode from UI (Toolbar) - Immediate response */\r\n readonly linkEditMode = this.linkSvc.editMode.asReadonly();\r\n\r\n /** Reference to the element that triggered the link menu (for anchoring) */\r\n readonly linkMenuTrigger = this.linkSvc.menuTrigger.asReadonly();\r\n\r\n // ============================================\r\n // Color Picker State (proxied from ColorPickerService)\r\n // ============================================\r\n\r\n /** Signal to toggle color picker mode from UI (text or highlight) */\r\n readonly colorEditMode = this.colorPickerSvc.editMode.asReadonly();\r\n\r\n /** Reference to the element that triggered the color menu (for anchoring) */\r\n readonly colorMenuTrigger = this.colorPickerSvc.menuTrigger.asReadonly();\r\n\r\n // ============================================\r\n // Link Edit Methods (delegated to LinkService)\r\n // ============================================\r\n\r\n // ============================================\r\n // Command Execution\r\n // ============================================\r\n\r\n /** Generic method to execute any command by name */\r\n execute(editor: Editor, command: string, ...args: any[]): void {\r\n if (!editor) return;\r\n\r\n switch (command) {\r\n case \"toggleBold\": this.toggleBold(editor); break;\r\n case \"toggleItalic\": this.toggleItalic(editor); break;\r\n case \"toggleStrike\": this.toggleStrike(editor); break;\r\n case \"toggleCode\": this.toggleCode(editor); break;\r\n case \"toggleCodeBlock\": this.toggleCodeBlock(editor); break;\r\n case \"toggleUnderline\": this.toggleUnderline(editor); break;\r\n case \"toggleSuperscript\": this.toggleSuperscript(editor); break;\r\n case \"toggleSubscript\": this.toggleSubscript(editor); break;\r\n case \"toggleHeading\": this.toggleHeading(editor, args[0] as 1 | 2 | 3); break;\r\n case \"toggleBulletList\": this.toggleBulletList(editor); break;\r\n case \"toggleOrderedList\": this.toggleOrderedList(editor); break;\r\n case \"toggleBlockquote\": this.toggleBlockquote(editor); break;\r\n case \"setTextAlign\": this.setTextAlign(editor, args[0] as any); break;\r\n case \"toggleLink\": this.linkSvc.toggle(editor, args[0]); break;\r\n case \"unsetLink\": this.linkSvc.unsetLink(editor); break;\r\n case \"toggleColorPicker\": this.colorPickerSvc.toggle(editor, args[0] as 'text' | 'highlight', args[1] as Event); break;\r\n case \"insertHorizontalRule\": this.insertHorizontalRule(editor); break;\r\n case \"insertImage\": this.insertImage(editor, args[0]); break;\r\n case \"uploadImage\": this.uploadImage(editor, args[0], args[1]); break;\r\n case \"toggleHighlight\": this.toggleHighlight(editor, args[0] as string); break;\r\n case \"undo\": this.undo(editor); break;\r\n case \"redo\": this.redo(editor); break;\r\n case \"insertTable\": this.insertTable(editor, args[0], args[1]); break;\r\n case \"addColumnBefore\": this.addColumnBefore(editor); break;\r\n case \"addColumnAfter\": this.addColumnAfter(editor); break;\r\n case \"deleteColumn\": this.deleteColumn(editor); break;\r\n case \"addRowBefore\": this.addRowBefore(editor); break;\r\n case \"addRowAfter\": this.addRowAfter(editor); break;\r\n case \"deleteRow\": this.deleteRow(editor); break;\r\n case \"deleteTable\": this.deleteTable(editor); break;\r\n case \"mergeCells\": this.mergeCells(editor); break;\r\n case \"splitCell\": this.splitCell(editor); break;\r\n case \"toggleHeaderColumn\": this.toggleHeaderColumn(editor); break;\r\n case \"toggleHeaderRow\": this.toggleHeaderRow(editor); break;\r\n case \"applyColor\": this.colorPickerSvc.applyColor(editor, args[0], args[1], args[2]); break;\r\n case \"applyHighlight\": this.colorPickerSvc.applyHighlight(editor, args[0], args[1], args[2]); break;\r\n case \"unsetColor\": this.colorPickerSvc.unsetColor(editor, args[0]); break;\r\n case \"unsetHighlight\": this.colorPickerSvc.unsetHighlight(editor, args[0]); break;\r\n\r\n case \"clearContent\": this.clearContent(editor); break;\r\n }\r\n\r\n }\r\n\r\n // --- Formatting Commands ---\r\n\r\n toggleBold(editor: Editor): void {\r\n if (!editor) return;\r\n editor.chain().focus().toggleBold().run();\r\n }\r\n\r\n toggleItalic(editor: Editor): void {\r\n if (!editor) return;\r\n editor.chain().focus().toggleItalic().run();\r\n }\r\n\r\n toggleStrike(editor: Editor): void {\r\n if (!editor) return;\r\n editor.chain().focus().toggleStrike().run();\r\n }\r\n\r\n toggleCode(editor: Editor): void {\r\n if (!editor) return;\r\n editor.chain().focus().toggleCode().run();\r\n }\r\n\r\n toggleCodeBlock(editor: Editor): void {\r\n if (!editor) return;\r\n editor.chain().focus().toggleCodeBlock().run();\r\n }\r\n\r\n toggleUnderline(editor: Editor): void {\r\n if (!editor) return;\r\n editor.chain().focus().toggleUnderline().run();\r\n }\r\n\r\n toggleSuperscript(editor: Editor): void {\r\n if (!editor) return;\r\n editor.chain().focus().toggleSuperscript().run();\r\n }\r\n\r\n toggleSubscript(editor: Editor): void {\r\n if (!editor) return;\r\n editor.chain().focus().toggleSubscript().run();\r\n }\r\n\r\n toggleHeading(editor: Editor, level: 1 | 2 | 3): void {\r\n if (!editor) return;\r\n editor.chain().focus().toggleHeading({ level }).run();\r\n }\r\n\r\n toggleHighlight(editor: Editor, color?: string): void {\r\n if (!editor) return;\r\n if (color) {\r\n editor.chain().focus().setHighlight({ color }).run();\r\n } else {\r\n editor.chain().focus().toggleHighlight().run();\r\n }\r\n }\r\n\r\n\r\n // --- Structure Commands ---\r\n\r\n toggleBulletList(editor: Editor): void {\r\n if (!editor) return;\r\n editor.chain().focus().toggleBulletList().run();\r\n }\r\n\r\n toggleOrderedList(editor: Editor): void {\r\n if (!editor) return;\r\n editor.chain().focus().toggleOrderedList().run();\r\n }\r\n\r\n toggleBlockquote(editor: Editor): void {\r\n if (!editor) return;\r\n editor.chain().focus().toggleBlockquote().run();\r\n }\r\n\r\n setTextAlign(editor: Editor, alignment: \"left\" | \"center\" | \"right\" | \"justify\"): void {\r\n if (!editor) return;\r\n editor.chain().focus().setTextAlign(alignment).run();\r\n }\r\n\r\n insertHorizontalRule(editor: Editor): void {\r\n if (!editor) return;\r\n editor.chain().focus().setHorizontalRule().run();\r\n }\r\n\r\n // --- History Commands ---\r\n\r\n undo(editor: Editor): void {\r\n if (!editor) return;\r\n editor.chain().focus().undo().run();\r\n }\r\n\r\n redo(editor: Editor): void {\r\n if (!editor) return;\r\n editor.chain().focus().redo().run();\r\n }\r\n\r\n // --- Table Commands ---\r\n\r\n insertTable(editor: Editor, rows: number = 3, cols: number = 3): void {\r\n if (!editor) return;\r\n editor.chain().focus().insertTable({ rows, cols }).run();\r\n }\r\n\r\n addColumnBefore(editor: Editor): void {\r\n if (!editor) return;\r\n editor.chain().focus().addColumnBefore().run();\r\n }\r\n\r\n addColumnAfter(editor: Editor): void {\r\n if (!editor) return;\r\n editor.chain().focus().addColumnAfter().run();\r\n }\r\n\r\n deleteColumn(editor: Editor): void {\r\n if (!editor) return;\r\n editor.chain().focus().deleteColumn().run();\r\n }\r\n\r\n addRowBefore(editor: Editor): void {\r\n if (!editor) return;\r\n editor.chain().focus().addRowBefore().run();\r\n }\r\n\r\n addRowAfter(editor: Editor): void {\r\n if (!editor) return;\r\n editor.chain().focus().addRowAfter().run();\r\n }\r\n\r\n deleteRow(editor: Editor): void {\r\n if (!editor) return;\r\n editor.chain().focus().deleteRow().run();\r\n }\r\n\r\n deleteTable(editor: Editor): void {\r\n if (!editor) return;\r\n editor.chain().focus().deleteTable().run();\r\n }\r\n\r\n mergeCells(editor: Editor): void {\r\n if (!editor) return;\r\n editor.chain().focus().mergeCells().run();\r\n }\r\n\r\n splitCell(editor: Editor): void {\r\n if (!editor) return;\r\n editor.chain().focus().splitCell().run();\r\n }\r\n\r\n toggleHeaderColumn(editor: Editor): void {\r\n if (!editor) return;\r\n editor.chain().focus().toggleHeaderColumn().run();\r\n }\r\n\r\n toggleHeaderRow(editor: Editor): void {\r\n if (!editor) return;\r\n editor.chain().focus().toggleHeaderRow().run();\r\n }\r\n\r\n // --- Utility Commands ---\r\n\r\n clearContent(editor: Editor): void {\r\n if (!editor) return;\r\n editor.commands.clearContent(true);\r\n }\r\n\r\n focus(editor: Editor): void {\r\n if (!editor) return;\r\n editor.chain().focus().run();\r\n }\r\n\r\n blur(editor: Editor): void {\r\n if (!editor) return;\r\n editor.chain().blur().run();\r\n }\r\n\r\n setContent(editor: Editor, content: string, emitUpdate = true): void {\r\n if (!editor) return;\r\n editor.commands.setContent(content, emitUpdate);\r\n }\r\n\r\n setEditable(editor: Editor, editable: boolean): void {\r\n if (!editor) return;\r\n editor.setEditable(editable);\r\n }\r\n\r\n insertContent(editor: Editor, content: string): void {\r\n if (!editor) return;\r\n editor.chain().focus().insertContent(content).run();\r\n }\r\n\r\n async insertImage(\r\n editor: Editor,\r\n options?: {\r\n quality?: number;\r\n maxWidth?: number;\r\n maxHeight?: number;\r\n accept?: string;\r\n }\r\n ): Promise<void> {\r\n try {\r\n await this.imageService.selectAndUploadImage(editor, options);\r\n } catch (error) {\r\n console.error(\"Error inserting image:\", error);\r\n throw error;\r\n }\r\n }\r\n\r\n async uploadImage(\r\n editor: Editor,\r\n file: File,\r\n options?: {\r\n quality?: number;\r\n maxWidth?: number;\r\n maxHeight?: number;\r\n }\r\n ): Promise<void> {\r\n try {\r\n await this.imageService.uploadAndInsertImage(editor, file, options);\r\n } catch (error) {\r\n console.error(\"Error uploading image:\", error);\r\n throw error;\r\n }\r\n }\r\n}\r\n","import {\r\n Component,\r\n computed,\r\n inject,\r\n input,\r\n ChangeDetectionStrategy,\r\n} from \"@angular/core\";\r\nimport { CommonModule } from \"@angular/common\";\r\nimport type { Editor } from \"@tiptap/core\";\r\nimport { ColorPickerService } from \"../services/color-picker.service\";\r\nimport { TiptapButtonComponent } from \"../tiptap-button.component\";\r\nimport { TiptapI18nService } from \"../services/i18n.service\";\r\nimport { EditorCommandsService } from \"../services/editor-commands.service\";\r\n\r\nexport type ColorPickerMode = \"text\" | \"highlight\";\r\n\r\n@Component({\r\n selector: \"tiptap-color-picker\",\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [TiptapButtonComponent, CommonModule],\r\n template: `\r\n <div class=\"color-picker-wrapper\">\r\n <div class=\"color-picker-container\" [class.is-highlight]=\"mode() === 'highlight'\">\r\n <tiptap-button\r\n [icon]=\"buttonIcon()\"\r\n [title]=\"mode() === 'text' ? t().textColor : t().highlight\"\r\n [color]=\"buttonTextColor()\"\r\n [backgroundColor]=\"buttonBgColor()\"\r\n [disabled]=\"disabled() || !state().isEditable\"\r\n (onClick)=\"onToggle($event)\"\r\n />\r\n\r\n @if (hasColorApplied()) {\r\n <button\r\n class=\"btn-clear-badge\"\r\n type=\"button\"\r\n [title]=\"t().clear\"\r\n [attr.aria-label]=\"t().clear\"\r\n (click)=\"onClear($event)\"\r\n >\r\n <span class=\"material-symbols-outlined\">close</span>\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n `,\r\n styles: [\r\n `\r\n .color-picker-wrapper {\r\n position: relative;\r\n display: inline-block;\r\n }\r\n\r\n .color-picker-container {\r\n position: relative;\r\n display: inline-flex;\r\n align-items: center;\r\n }\r\n\r\n .btn-clear-badge {\r\n position: absolute;\r\n top: -4px;\r\n right: -4px;\r\n width: 14px;\r\n height: 14px;\r\n padding: 0;\r\n border: none;\r\n border-radius: 999px;\r\n background: rgba(15, 23, 42, 0.75);\r\n color: #ffffff;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n z-index: 10;\r\n opacity: 0;\r\n pointer-events: none;\r\n transition: opacity 120ms ease;\r\n }\r\n\r\n .color-picker-container:hover .btn-clear-badge {\r\n opacity: 1;\r\n pointer-events: auto;\r\n }\r\n\r\n .btn-clear-badge .material-symbols-outlined {\r\n font-size: 10px;\r\n line-height: 1;\r\n }\r\n `,\r\n ],\r\n})\r\nexport class TiptapColorPickerComponent {\r\n editor = input.required<Editor>();\r\n mode = input<ColorPickerMode>(\"text\");\r\n disabled = input<boolean>(false);\r\n anchorToText = input<boolean>(false);\r\n\r\n private colorPickerSvc = inject(ColorPickerService);\r\n private i18nService = inject(TiptapI18nService);\r\n private editorCommands = inject(EditorCommandsService);\r\n\r\n readonly t = this.i18nService.toolbar;\r\n readonly state = this.editorCommands.editorState;\r\n\r\n readonly currentColor = computed(() => {\r\n const marks = this.state().marks;\r\n const color = this.mode() === \"text\" ? marks.computedColor : marks.computedBackground;\r\n return color || (this.mode() === \"text\" ? \"#000000\" : \"#ffff00\");\r\n });\r\n\r\n readonly hasColorApplied = computed(() => {\r\n const marks = this.state().marks;\r\n return (this.mode() === \"text\" ? marks.color : marks.background) !== null;\r\n });\r\n\r\n readonly buttonIcon = computed(() => {\r\n return this.mode() === \"text\" ? \"format_color_text\" : \"format_color_fill\";\r\n });\r\n\r\n readonly buttonBgColor = computed(() => {\r\n const color = this.currentColor();\r\n if (this.mode() === \"highlight\") {\r\n return this.hasColorApplied() ? color : \"\";\r\n }\r\n // For text mode, add contrast background if current color is too light\r\n if (this.colorPickerSvc.getLuminance(color) > 200) {\r\n return \"#030617\";\r\n }\r\n return \"\";\r\n });\r\n\r\n readonly buttonTextColor = computed(() => {\r\n const color = this.currentColor();\r\n if (this.mode() === \"text\") {\r\n return color;\r\n }\r\n if (this.hasColorApplied()) {\r\n return this.colorPickerSvc.getLuminance(color) > 128 ? \"#000000\" : \"#ffffff\";\r\n }\r\n return \"var(--ate-text-secondary)\";\r\n });\r\n\r\n onToggle(event: Event) {\r\n // If anchorToText is true, we don't pass the event so it defaults to text selection anchoring\r\n this.colorPickerSvc.toggle(this.editor(), this.mode(), this.anchorToText() ? undefined : event);\r\n }\r\n\r\n onClear(event: MouseEvent) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n const editor = this.editor();\r\n if (this.mode() === \"text\") {\r\n this.colorPickerSvc.unsetColor(editor);\r\n } else {\r\n this.colorPickerSvc.unsetHighlight(editor);\r\n }\r\n\r\n this.colorPickerSvc.close();\r\n }\r\n}\r\n","import { Component, input, inject, ChangeDetectionStrategy } from \"@angular/core\";\r\nimport { Editor } from \"@tiptap/core\";\r\nimport { TiptapButtonComponent } from \"./tiptap-button.component\";\r\nimport { TiptapSeparatorComponent } from \"./tiptap-separator.component\";\r\nimport { EditorCommandsService } from \"./services/editor-commands.service\";\r\nimport { TiptapI18nService } from \"./services/i18n.service\";\r\nimport { EditorStateSnapshot } from \"./models/editor-state.model\";\r\nimport { TiptapColorPickerComponent } from \"./components/tiptap-color-picker.component\";\r\n\r\nimport { ToolbarConfig } from \"./models/toolbar.model\";\r\n\r\n@Component({\r\n selector: \"tiptap-toolbar\",\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n TiptapButtonComponent,\r\n TiptapSeparatorComponent,\r\n TiptapColorPickerComponent,\r\n ],\r\n template: `\r\n <div class=\"tiptap-toolbar\" [class.floating]=\"floating()\">\r\n @if (config().bold) {\r\n <tiptap-button\r\n icon=\"format_bold\"\r\n [title]=\"t().bold\"\r\n [active]=\"state().marks.bold\"\r\n [disabled]=\"!state().can.toggleBold\"\r\n (onClick)=\"onCommand('toggleBold')\"\r\n />\r\n } @if (config().italic) {\r\n <tiptap-button\r\n icon=\"format_italic\"\r\n [title]=\"t().italic\"\r\n [active]=\"state().marks.italic\"\r\n [disabled]=\"!state().can.toggleItalic\"\r\n (onClick)=\"onCommand('toggleItalic')\"\r\n />\r\n } @if (config().underline) {\r\n <tiptap-button\r\n icon=\"format_underlined\"\r\n [title]=\"t().underline\"\r\n [active]=\"state().marks.underline\"\r\n [disabled]=\"!state().can.toggleUnderline\"\r\n (onClick)=\"onCommand('toggleUnderline')\"\r\n />\r\n } @if (config().strike) {\r\n <tiptap-button\r\n icon=\"strikethrough_s\"\r\n [title]=\"t().strike\"\r\n [active]=\"state().marks.strike\"\r\n [disabled]=\"!state().can.toggleStrike\"\r\n (onClick)=\"onCommand('toggleStrike')\"\r\n />\r\n } @if (config().code) {\r\n <tiptap-button\r\n icon=\"code\"\r\n [title]=\"t().code\"\r\n [active]=\"state().marks.code\"\r\n [disabled]=\"!state().can.toggleCode\"\r\n (onClick)=\"onCommand('toggleCode')\"\r\n />\r\n } @if (config().codeBlock) {\r\n <tiptap-button\r\n icon=\"terminal\"\r\n [title]=\"t().codeBlock\"\r\n [active]=\"state().nodes.isCodeBlock\"\r\n [disabled]=\"!state().can.toggleCodeBlock\"\r\n (onClick)=\"onCommand('toggleCodeBlock')\"\r\n />\r\n } @if (config().superscript) {\r\n <tiptap-button\r\n icon=\"superscript\"\r\n [title]=\"t().superscript\"\r\n [active]=\"state().marks.superscript\"\r\n [disabled]=\"!state().can.toggleSuperscript\"\r\n (onClick)=\"onCommand('toggleSuperscript')\"\r\n />\r\n } @if (config().subscript) {\r\n <tiptap-button\r\n icon=\"subscript\"\r\n [title]=\"t().subscript\"\r\n [active]=\"state().marks.subscript\"\r\n [disabled]=\"!state().can.toggleSubscript\"\r\n (onClick)=\"onCommand('toggleSubscript')\"\r\n />\r\n } @if (config().highlight) {\r\n <tiptap-button\r\n icon=\"highlight\"\r\n [title]=\"t().highlight\"\r\n [active]=\"state().marks.highlight\"\r\n [disabled]=\"!state().can.toggleHighlight\"\r\n (onClick)=\"onCommand('toggleHighlight')\"\r\n />\r\n } @if (config().highlightPicker) {\r\n <tiptap-color-picker \r\n mode=\"highlight\" \r\n [editor]=\"editor()\" \r\n [disabled]=\"!state().can.setHighlight\"\r\n />\r\n } @if (config().textColor) {\r\n <tiptap-color-picker \r\n mode=\"text\" \r\n [editor]=\"editor()\" \r\n [disabled]=\"!state().can.setColor\"\r\n />\r\n }\r\n \r\n @if (config().separator && (config().heading1 || config().heading2 || config().heading3)) {\r\n <tiptap-separator />\r\n } @if (config().heading1) {\r\n <tiptap-button\r\n icon=\"format_h1\"\r\n [title]=\"t().heading1\"\r\n [active]=\"state().nodes.h1\"\r\n [disabled]=\"!state().can.toggleHeading1\"\r\n (onClick)=\"onCommand('toggleHeading', 1)\"\r\n />\r\n } @if (config().heading2) {\r\n <tiptap-button\r\n icon=\"format_h2\"\r\n [title]=\"t().heading2\"\r\n [active]=\"state().nodes.h2\"\r\n [disabled]=\"!state().can.toggleHeading2\"\r\n (onClick)=\"onCommand('toggleHeading', 2)\"\r\n />\r\n } @if (config().heading3) {\r\n <tiptap-button\r\n icon=\"format_h3\"\r\n [title]=\"t().heading3\"\r\n [active]=\"state().nodes.h3\"\r\n [disabled]=\"!state().can.toggleHeading3\"\r\n (onClick)=\"onCommand('toggleHeading', 3)\"\r\n />\r\n } @if (config().separator && (config().bulletList || config().orderedList || config().blockquote)) {\r\n <tiptap-separator />\r\n } @if (config().bulletList) {\r\n <tiptap-button\r\n icon=\"format_list_bulleted\"\r\n [title]=\"t().bulletList\"\r\n [active]=\"state().nodes.isBulletList\"\r\n [disabled]=\"!state().can.toggleBulletList\"\r\n (onClick)=\"onCommand('toggleBulletList')\"\r\n />\r\n } @if (config().orderedList) {\r\n <tiptap-button\r\n icon=\"format_list_numbered\"\r\n [title]=\"t().orderedList\"\r\n [active]=\"state().nodes.isOrderedList\"\r\n [disabled]=\"!state().can.toggleOrderedList\"\r\n (onClick)=\"onCommand('toggleOrderedList')\"\r\n />\r\n } @if (config().blockquote) {\r\n <tiptap-button\r\n icon=\"format_quote\"\r\n [title]=\"t().blockquote\"\r\n [active]=\"state().nodes.isBlockquote\"\r\n [disabled]=\"!state().can.toggleBlockquote\"\r\n (onClick)=\"onCommand('toggleBlockquote')\"\r\n />\r\n } @if (config().separator && (config().alignLeft || config().alignCenter || config().alignRight || config().alignJustify)) {\r\n <tiptap-separator />\r\n } @if (config().alignLeft) {\r\n <tiptap-button\r\n icon=\"format_align_left\"\r\n [title]=\"t().alignLeft\"\r\n [active]=\"state().nodes.alignLeft\"\r\n [disabled]=\"!state().can.setTextAlignLeft\"\r\n (onClick)=\"onCommand('setTextAlign', 'left')\"\r\n />\r\n } @if (config().alignCenter) {\r\n <tiptap-button\r\n icon=\"format_align_center\"\r\n [title]=\"t().alignCenter\"\r\n [active]=\"state().nodes.alignCenter\"\r\n [disabled]=\"!state().can.setTextAlignCenter\"\r\n (onClick)=\"onCommand('setTextAlign', 'center')\"\r\n />\r\n } @if (config().alignRight) {\r\n <tiptap-button\r\n icon=\"format_align_right\"\r\n [title]=\"t().alignRight\"\r\n [active]=\"state().nodes.alignRight\"\r\n [disabled]=\"!state().can.setTextAlignRight\"\r\n (onClick)=\"onCommand('setTextAlign', 'right')\"\r\n />\r\n } @if (config().alignJustify) {\r\n <tiptap-button\r\n icon=\"format_align_justify\"\r\n [title]=\"t().alignJustify\"\r\n [active]=\"state().nodes.alignJustify\"\r\n [disabled]=\"!state().can.setTextAlignJustify\"\r\n (onClick)=\"onCommand('setTextAlign', 'justify')\"\r\n />\r\n } @if (config().separator && (config().link || config().horizontalRule)) {\r\n <tiptap-separator />\r\n } @if (config().link) {\r\n <tiptap-button\r\n icon=\"link\"\r\n [title]=\"t().link\"\r\n [active]=\"state().marks.link\"\r\n [disabled]=\"!state().can.toggleLink\"\r\n (onClick)=\"onCommand('toggleLink', $event)\"\r\n />\r\n } @if (config().horizontalRule) {\r\n <tiptap-button\r\n icon=\"horizontal_rule\"\r\n [title]=\"t().horizontalRule\"\r\n [disabled]=\"!state().can.insertHorizontalRule\"\r\n (onClick)=\"onCommand('insertHorizontalRule')\"\r\n />\r\n } @if (config().table) {\r\n <tiptap-button\r\n icon=\"table_view\"\r\n [title]=\"t().table\"\r\n [disabled]=\"!state().can.insertTable\"\r\n (onClick)=\"onCommand('insertTable')\"\r\n />\r\n } @if (config().separator && config().image) {\r\n <tiptap-separator />\r\n } @if (config().image) {\r\n <tiptap-button\r\n icon=\"image\"\r\n [title]=\"t().image\"\r\n [disabled]=\"!state().can.insertImage\"\r\n (onClick)=\"onCommand('insertImage', imageUpload())\"\r\n />\r\n } @if (config().separator && (config().undo || config().redo)) {\r\n <tiptap-separator />\r\n } @if (config().undo) {\r\n <tiptap-button\r\n icon=\"undo\"\r\n [title]=\"t().undo\"\r\n [disabled]=\"!state().can.undo\"\r\n (onClick)=\"onCommand('undo')\"\r\n />\r\n } @if (config().redo) {\r\n <tiptap-button\r\n icon=\"redo\"\r\n [title]=\"t().redo\"\r\n [disabled]=\"!state().can.redo\"\r\n (onClick)=\"onCommand('redo')\"\r\n />\r\n } @if (config().separator && config().clear) {\r\n <tiptap-separator />\r\n } @if (config().clear) {\r\n <tiptap-button\r\n icon=\"delete\"\r\n [title]=\"t().clear\"\r\n [disabled]=\"!state().isEditable\"\r\n (onClick)=\"onCommand('clearContent')\"\r\n />\r\n }\r\n </div>\r\n `,\r\n styles: [\r\n `\r\n :host {\r\n display: block;\r\n transition: opacity 0.3s ease;\r\n }\r\n\r\n :host-context(.floating-toolbar) {\r\n position: sticky;\r\n top: 3rem;\r\n left: 0;\r\n right: 0;\r\n z-index: 100;\r\n display: flex;\r\n height: 0;\r\n overflow: visible;\r\n pointer-events: none; /* Let clicks pass through to content if not on toolbar */\r\n opacity: 0;\r\n }\r\n\r\n :host-context(.floating-toolbar:focus-within),\r\n :host-context(.floating-toolbar:hover) {\r\n opacity: 1;\r\n }\r\n\r\n .tiptap-toolbar {\r\n display: flex;\r\n align-items: center;\r\n gap: 4px;\r\n padding: var(--ate-toolbar-padding);\r\n background: var(--ate-toolbar-background);\r\n border-bottom: 1px solid var(--ate-toolbar-border-color);\r\n flex-wrap: wrap;\r\n min-height: 32px;\r\n position: relative;\r\n z-index: 50;\r\n border-top-left-radius: calc(var(--ate-menu-border-radius, 8px) - var(--ate-border-width, 2px));\r\n border-top-right-radius: calc(var(--ate-menu-border-radius, 8px) - var(--ate-border-width, 2px));\r\n }\r\n\r\n /* Floating Toolbar Mode */\r\n .tiptap-toolbar.floating {\r\n pointer-events: auto;\r\n border-radius: var(--ate-menu-border-radius, 8px);\r\n border: 1px solid var(--ate-menu-border) !important;\r\n box-shadow: var(--ate-menu-shadow) !important;\r\n background: var(--ate-menu-bg) !important;\r\n padding: var(--ate-menu-padding) !important;\r\n flex-wrap: nowrap;\r\n overflow-x: auto;\r\n max-width: 95vw;\r\n scrollbar-width: none;\r\n \r\n transform: translateY(0);\r\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\r\n }\r\n\r\n .tiptap-toolbar.floating::-webkit-scrollbar {\r\n display: none;\r\n }\r\n\r\n :host-context(.floating-toolbar:focus-within) .tiptap-toolbar.floating,\r\n :host-context(.floating-toolbar:hover) .tiptap-toolbar.floating {\r\n transform: translateY(-2rem);\r\n }\r\n\r\n @media (max-width: 768px) {\r\n .tiptap-toolbar {\r\n padding: 6px 8px;\r\n gap: 2px;\r\n }\r\n }\r\n\r\n @keyframes toolbarSlideIn {\r\n from {\r\n opacity: 0;\r\n transform: translateY(-10px);\r\n }\r\n to {\r\n opacity: 1;\r\n transform: translateY(0);\r\n }\r\n }\r\n\r\n .tiptap-toolbar {\r\n animation: toolbarSlideIn 0.3s cubic-bezier(0.4, 0, 0.2, 1);\r\n }\r\n `,\r\n ],\r\n})\r\nexport class TiptapToolbarComponent {\r\n editor = input.required<Editor>();\r\n config = input.required<ToolbarConfig>();\r\n imageUpload = input<any>({});\r\n floating = input<boolean>(false);\r\n\r\n private i18nService = inject(TiptapI18nService);\r\n private editorCommands = inject(EditorCommandsService);\r\n\r\n readonly t = this.i18nService.toolbar;\r\n readonly state = this.editorCommands.editorState;\r\n\r\n onCommand(command: string, ...args: any[]) {\r\n const editor = this.editor();\r\n if (!editor) return;\r\n this.editorCommands.execute(editor, command, ...args);\r\n }\r\n}\r\n\r\n","import {\r\n Directive,\r\n input,\r\n ViewChild,\r\n ElementRef,\r\n OnInit,\r\n OnDestroy,\r\n inject,\r\n effect,\r\n} from \"@angular/core\";\r\nimport tippy, { Instance as TippyInstance, sticky } from \"tippy.js\";\r\nimport { Editor } from \"@tiptap/core\";\r\nimport { EditorCommandsService } from \"../services/editor-commands.service\";\r\nimport { TiptapI18nService } from \"../services/i18n.service\";\r\n\r\n/**\r\n * Base abstract class for all Bubble Menus (Text, Image, Table, Cell).\r\n * Handles common logic for Tippy.js initialization, positioning, and visibility.\r\n */\r\n@Directive()\r\nexport abstract class TiptapBaseBubbleMenu implements OnInit, OnDestroy {\r\n protected readonly i18nService = inject(TiptapI18nService);\r\n protected readonly editorCommands = inject(EditorCommandsService);\r\n\r\n // Core Inputs\r\n editor = input.required<Editor>();\r\n\r\n // Required ViewChild for the menu container\r\n @ViewChild(\"menuRef\", { static: false }) menuRef!: ElementRef<HTMLDivElement>;\r\n\r\n // Internal State\r\n protected tippyInstance: TippyInstance | null = null;\r\n protected updateTimeout: any = null;\r\n\r\n // Toolbar interaction state (from centralized service)\r\n protected readonly isToolbarInteracting = this.editorCommands.isToolbarInteracting;\r\n\r\n // Reactive state alias for templates\r\n readonly state = this.editorCommands.editorState;\r\n\r\n constructor() {\r\n // Effect to reactively update the menu when editor state\r\n // or toolbar interaction changes.\r\n effect(() => {\r\n this.state();\r\n this.isToolbarInteracting();\r\n // Also react to link/color edit modes to hide when sub-menus activate\r\n this.editorCommands.linkEditMode();\r\n this.editorCommands.colorEditMode();\r\n\r\n this.updateMenu();\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n this.initTippy();\r\n }\r\n\r\n ngOnDestroy() {\r\n if (this.updateTimeout) {\r\n clearTimeout(this.updateTimeout);\r\n }\r\n if (this.tippyInstance) {\r\n this.tippyInstance.destroy();\r\n this.tippyInstance = null;\r\n }\r\n }\r\n\r\n /**\r\n * Initializes the Tippy instance.\r\n * Can be overridden for specific Tippy configurations.\r\n */\r\n protected initTippy() {\r\n if (!this.menuRef?.nativeElement) {\r\n // Re-try if the view child is not yet available\r\n setTimeout(() => this.initTippy(), 50);\r\n return;\r\n }\r\n\r\n const ed = this.editor();\r\n if (this.tippyInstance) {\r\n this.tippyInstance.destroy();\r\n }\r\n\r\n this.tippyInstance = tippy(document.body, {\r\n content: this.menuRef.nativeElement,\r\n trigger: \"manual\",\r\n placement: \"top-start\",\r\n appendTo: () => (ed ? ed.options.element : document.body),\r\n interactive: true,\r\n hideOnClick: false,\r\n arrow: false,\r\n offset: [0, 8],\r\n plugins: [sticky],\r\n sticky: false,\r\n getReferenceClientRect: () => this.getSelectionRect(),\r\n popperOptions: {\r\n modifiers: [\r\n {\r\n name: \"preventOverflow\",\r\n options: {\r\n boundary: this.editor().options.element,\r\n padding: 8,\r\n },\r\n },\r\n {\r\n name: \"flip\",\r\n options: {\r\n fallbackPlacements: [\"bottom-start\", \"top-end\", \"bottom-end\"],\r\n },\r\n },\r\n ],\r\n },\r\n onShow: (instance) => this.onTippyShow(instance),\r\n onHide: (instance) => this.onTippyHide(instance),\r\n });\r\n\r\n this.updateMenu();\r\n\r\n }\r\n\r\n /**\r\n * Core logic to decide whether to show or hide the menu.\r\n */\r\n updateMenu = () => {\r\n if (this.updateTimeout) {\r\n clearTimeout(this.updateTimeout);\r\n }\r\n\r\n this.updateTimeout = setTimeout(() => {\r\n const ed = this.editor();\r\n if (!ed) return;\r\n\r\n // Hide when interacting with the main toolbar\r\n if (this.isToolbarInteracting()) {\r\n this.hideTippy();\r\n return;\r\n }\r\n\r\n if (this.shouldShow()) {\r\n this.showTippy();\r\n } else {\r\n this.hideTippy();\r\n }\r\n }, 10);\r\n };\r\n\r\n /**\r\n * Helper to show the Tippy instance with updated positioning.\r\n */\r\n showTippy() {\r\n if (!this.tippyInstance) return;\r\n\r\n // Update position before showing\r\n this.tippyInstance.setProps({\r\n getReferenceClientRect: () => this.getSelectionRect(),\r\n sticky: \"reference\",\r\n });\r\n this.tippyInstance.show();\r\n }\r\n\r\n /**\r\n * Helper to hide the Tippy instance.\r\n */\r\n hideTippy() {\r\n if (this.tippyInstance) {\r\n this.tippyInstance.setProps({ sticky: false });\r\n this.tippyInstance.hide();\r\n }\r\n }\r\n\r\n /**\r\n * Common command handler for buttons in the menu.\r\n */\r\n onCommand(command: string, event?: Event) {\r\n if (event) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n }\r\n const ed = this.editor();\r\n if (ed) {\r\n this.executeCommand(ed, command);\r\n this.updateMenu();\r\n }\r\n }\r\n\r\n\r\n\r\n /**\r\n * Shared helper to get the bounding rect of the current selection.\r\n * Uses a combination of native selection and ProseMirror coordinates.\r\n */\r\n protected getRectForSelection(ed: Editor): DOMRect {\r\n if (!ed) return new DOMRect(0, 0, 0, 0);\r\n\r\n const { from, to, empty } = ed.state.selection;\r\n if (empty) return new DOMRect(-9999, -9999, 0, 0);\r\n\r\n // 1. Try native selection for multi-line accuracy\r\n const selection = window.getSelection();\r\n if (selection && selection.rangeCount > 0) {\r\n const range = selection.getRangeAt(0);\r\n const rect = range.getBoundingClientRect();\r\n\r\n // Ensure the rect is valid and belongs to the editor\r\n if (rect.width > 0 && rect.height > 0) {\r\n return rect;\r\n }\r\n }\r\n\r\n // 2. Fallback to Tiptap coordinates for precision (single line / edge cases)\r\n const start = ed.view.coordsAtPos(from);\r\n const end = ed.view.coordsAtPos(to);\r\n\r\n const top = Math.min(start.top, end.top);\r\n const bottom = Math.max(start.bottom, end.bottom);\r\n const left = Math.min(start.left, end.left);\r\n const right = Math.max(start.right, end.right);\r\n\r\n return new DOMRect(left, top, right - left, bottom - top);\r\n }\r\n\r\n // --- Abstract methods to be implemented by sub-components ---\r\n\r\n /**\r\n * Returns the Rect representing the target for positioning the menu.\r\n */\r\n abstract getSelectionRect(): DOMRect;\r\n\r\n /**\r\n * Returns whether the menu should be displayed based on current state.\r\n */\r\n abstract shouldShow(): boolean;\r\n\r\n /**\r\n * Executes the given command on the editor.\r\n */\r\n protected abstract executeCommand(editor: Editor, command: string): void;\r\n\r\n /**\r\n * Optional hook called when Tippy is about to be shown.\r\n */\r\n protected onTippyShow(instance: TippyInstance) { }\r\n\r\n /**\r\n * Optional hook called when Tippy is about to be hidden.\r\n */\r\n protected onTippyHide(instance: TippyInstance) { }\r\n}\r\n","import {\r\n Component,\r\n input,\r\n ChangeDetectionStrategy,\r\n computed,\r\n OnInit,\r\n OnDestroy,\r\n} from \"@angular/core\";\r\nimport { type Editor } from \"@tiptap/core\";\r\nimport { TiptapButtonComponent } from \"./tiptap-button.component\";\r\nimport { TiptapColorPickerComponent } from \"./components/tiptap-color-picker.component\";\r\nimport { BubbleMenuConfig } from \"./models/bubble-menu.model\";\r\nimport { TiptapBaseBubbleMenu } from \"./base/tiptap-base-bubble-menu\";\r\n\r\n@Component({\r\n selector: \"tiptap-bubble-menu\",\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n TiptapButtonComponent,\r\n TiptapColorPickerComponent,\r\n ],\r\n template: `\r\n <div #menuRef class=\"bubble-menu\" (mousedown)=\"$event.preventDefault()\">\r\n @if (bubbleMenuConfig().bold) {\r\n <tiptap-button\r\n icon=\"format_bold\"\r\n [title]=\"t().bold\"\r\n [active]=\"state().marks.bold\"\r\n [disabled]=\"!state().can.toggleBold\"\r\n (onClick)=\"onCommand('toggleBold', $event)\"\r\n ></tiptap-button>\r\n } @if (bubbleMenuConfig().italic) {\r\n <tiptap-button\r\n icon=\"format_italic\"\r\n [title]=\"t().italic\"\r\n [active]=\"state().marks.italic\"\r\n [disabled]=\"!state().can.toggleItalic\"\r\n (onClick)=\"onCommand('toggleItalic', $event)\"\r\n ></tiptap-button>\r\n } @if (bubbleMenuConfig().underline) {\r\n <tiptap-button\r\n icon=\"format_underlined\"\r\n [title]=\"t().underline\"\r\n [active]=\"state().marks.underline\"\r\n [disabled]=\"!state().can.toggleUnderline\"\r\n (onClick)=\"onCommand('toggleUnderline', $event)\"\r\n ></tiptap-button>\r\n } @if (bubbleMenuConfig().strike) {\r\n <tiptap-button\r\n icon=\"strikethrough_s\"\r\n [title]=\"t().strike\"\r\n [active]=\"state().marks.strike\"\r\n [disabled]=\"!state().can.toggleStrike\"\r\n (onClick)=\"onCommand('toggleStrike', $event)\"\r\n ></tiptap-button>\r\n } @if (bubbleMenuConfig().code) {\r\n <tiptap-button\r\n icon=\"code\"\r\n [title]=\"t().code\"\r\n [active]=\"state().marks.code\"\r\n [disabled]=\"!state().can.toggleCode\"\r\n (onClick)=\"onCommand('toggleCode', $event)\"\r\n ></tiptap-button>\r\n } @if (bubbleMenuConfig().superscript) {\r\n <tiptap-button\r\n icon=\"superscript\"\r\n [title]=\"t().superscript\"\r\n [active]=\"state().marks.superscript\"\r\n [disabled]=\"!state().can.toggleSuperscript\"\r\n (onClick)=\"onCommand('toggleSuperscript', $event)\"\r\n ></tiptap-button>\r\n } @if (bubbleMenuConfig().subscript) {\r\n <tiptap-button\r\n icon=\"subscript\"\r\n [title]=\"t().subscript\"\r\n [active]=\"state().marks.subscript\"\r\n [disabled]=\"!state().can.toggleSubscript\"\r\n (onClick)=\"onCommand('toggleSubscript', $event)\"\r\n ></tiptap-button>\r\n } @if (bubbleMenuConfig().highlight) {\r\n <tiptap-button\r\n icon=\"highlight\"\r\n [title]=\"t().highlight\"\r\n [active]=\"state().marks.highlight\"\r\n [disabled]=\"!state().can.toggleHighlight\"\r\n (onClick)=\"onCommand('toggleHighlight', $event)\"\r\n ></tiptap-button>\r\n } @if (bubbleMenuConfig().highlightPicker) {\r\n <tiptap-color-picker\r\n mode=\"highlight\"\r\n [editor]=\"editor()\"\r\n [disabled]=\"!state().can.setHighlight\"\r\n [anchorToText]=\"true\"\r\n />\r\n } @if (bubbleMenuConfig().textColor) {\r\n <tiptap-color-picker\r\n mode=\"text\"\r\n [editor]=\"editor()\"\r\n [disabled]=\"!state().can.setColor\"\r\n [anchorToText]=\"true\"\r\n />\r\n } @if (bubbleMenuConfig().link) {\r\n <tiptap-button\r\n icon=\"link\"\r\n [title]=\"t().link\"\r\n [active]=\"state().marks.link\"\r\n [disabled]=\"!state().can.toggleLink\"\r\n (onClick)=\"onCommand('toggleLink', $event)\"\r\n ></tiptap-button>\r\n }\r\n </div>\r\n `,\r\n})\r\nexport class TiptapBubbleMenuComponent extends TiptapBaseBubbleMenu implements OnInit, OnDestroy {\r\n readonly t = this.i18nService.bubbleMenu;\r\n\r\n override ngOnInit() {\r\n super.ngOnInit();\r\n const ed = this.editor();\r\n // Specialized mousedown listener for the text bubble menu:\r\n // This is necessary to hide the menu immediately when clicking elsewhere,\r\n // avoiding a 'jumping' effect where the menu moves to the new cursor position\r\n // before the reactive state has time to hide it.\r\n if (ed?.view?.dom) {\r\n ed.view.dom.addEventListener(\"mousedown\", this.onMouseDown, { capture: true });\r\n }\r\n }\r\n\r\n override ngOnDestroy() {\r\n super.ngOnDestroy();\r\n const ed = this.editor();\r\n if (ed?.view?.dom) {\r\n ed.view.dom.removeEventListener(\"mousedown\", this.onMouseDown, { capture: true });\r\n }\r\n }\r\n\r\n private onMouseDown = () => {\r\n this.hideTippy();\r\n };\r\n\r\n config = input<BubbleMenuConfig>({\r\n bold: true,\r\n italic: true,\r\n underline: true,\r\n strike: true,\r\n code: true,\r\n superscript: false,\r\n subscript: false,\r\n highlight: true,\r\n textColor: false,\r\n link: true,\r\n separator: true,\r\n });\r\n\r\n bubbleMenuConfig = computed(() => ({\r\n bold: true,\r\n italic: true,\r\n underline: true,\r\n strike: true,\r\n code: true,\r\n superscript: false,\r\n subscript: false,\r\n highlight: true,\r\n textColor: false,\r\n link: true,\r\n separator: true,\r\n ...this.config(),\r\n }));\r\n\r\n override shouldShow(): boolean {\r\n const { selection, nodes, isEditable, isFocused } = this.state();\r\n\r\n if (!isEditable) {\r\n return false;\r\n }\r\n\r\n // PRIORITY: If we are editing a link or color, HIDE this main bubble menu\r\n // to give full priority to the specialized sub-menus.\r\n if (this.editorCommands.linkEditMode() || this.editorCommands.colorEditMode()) {\r\n return false;\r\n }\r\n\r\n // Now we can check focus for the standard text selection menu\r\n if (!isFocused) {\r\n return false;\r\n }\r\n\r\n // Only show text bubble menu if there is a non-empty text selection\r\n // and no higher-priority node (image, table) is selected.\r\n return (\r\n selection.type === 'text' &&\r\n !selection.empty &&\r\n !nodes.isImage &&\r\n !nodes.isTableNodeSelected\r\n );\r\n }\r\n\r\n override getSelectionRect(): DOMRect {\r\n return this.getRectForSelection(this.editor());\r\n }\r\n\r\n protected override executeCommand(editor: Editor, command: string, ...args: any[]): void {\r\n this.editorCommands.execute(editor, command, ...args);\r\n }\r\n\r\n protected override onTippyHide() {\r\n // Sub-menus now manage their own state. Clearing them here causes \r\n // premature closing when clicking between 'sibling' menu instances.\r\n }\r\n}\r\n","import {\r\n Component,\r\n input,\r\n ChangeDetectionStrategy,\r\n computed,\r\n inject,\r\n} from \"@angular/core\";\r\nimport { type Editor } from \"@tiptap/core\";\r\nimport { TiptapButtonComponent } from \"./tiptap-button.component\";\r\nimport { TiptapSeparatorComponent } from \"./tiptap-separator.component\";\r\nimport { ImageService } from \"./services/image.service\";\r\nimport { ImageBubbleMenuConfig } from \"./models/bubble-menu.model\";\r\nimport { TiptapBaseBubbleMenu } from \"./base/tiptap-base-bubble-menu\";\r\n\r\n@Component({\r\n selector: \"tiptap-image-bubble-menu\",\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [TiptapButtonComponent, TiptapSeparatorComponent],\r\n template: `\r\n <div #menuRef class=\"bubble-menu\" (mousedown)=\"$event.preventDefault()\">\r\n @if (imageBubbleMenuConfig().changeImage) {\r\n <tiptap-button\r\n icon=\"drive_file_rename_outline\"\r\n [title]=\"t().changeImage\"\r\n (onClick)=\"onCommand('changeImage', $event)\"\r\n ></tiptap-button>\r\n } @if (imageBubbleMenuConfig().separator && hasResizeButtons()) {\r\n <tiptap-separator />\r\n } @if (imageBubbleMenuConfig().resizeSmall) {\r\n <tiptap-button\r\n icon=\"crop_square\"\r\n iconSize=\"small\"\r\n [title]=\"t().resizeSmall\"\r\n (onClick)=\"onCommand('resizeSmall', $event)\"\r\n ></tiptap-button>\r\n } @if (imageBubbleMenuConfig().resizeMedium) {\r\n <tiptap-button\r\n icon=\"crop_square\"\r\n iconSize=\"medium\"\r\n [title]=\"t().resizeMedium\"\r\n (onClick)=\"onCommand('resizeMedium', $event)\"\r\n ></tiptap-button>\r\n } @if (imageBubbleMenuConfig().resizeLarge) {\r\n <tiptap-button\r\n icon=\"crop_square\"\r\n iconSize=\"large\"\r\n [title]=\"t().resizeLarge\"\r\n (onClick)=\"onCommand('resizeLarge', $event)\"\r\n ></tiptap-button>\r\n } @if (imageBubbleMenuConfig().resizeOriginal) {\r\n <tiptap-button\r\n icon=\"photo_size_select_actual\"\r\n [title]=\"t().resizeOriginal\"\r\n (onClick)=\"onCommand('resizeOriginal', $event)\"\r\n ></tiptap-button>\r\n } @if (imageBubbleMenuConfig().separator &&\r\n imageBubbleMenuConfig().deleteImage) {\r\n <tiptap-separator />\r\n } @if (imageBubbleMenuConfig().deleteImage) {\r\n <tiptap-button\r\n icon=\"delete\"\r\n [title]=\"t().deleteImage\"\r\n variant=\"danger\"\r\n (onClick)=\"onCommand('deleteImage', $event)\"\r\n ></tiptap-button>\r\n }\r\n </div>\r\n `,\r\n})\r\nexport class TiptapImageBubbleMenuComponent extends TiptapBaseBubbleMenu {\r\n readonly t = this.i18nService.imageUpload;\r\n private readonly imageService = inject(ImageService);\r\n\r\n config = input<ImageBubbleMenuConfig>({\r\n changeImage: true,\r\n resizeSmall: true,\r\n resizeMedium: true,\r\n resizeLarge: true,\r\n resizeOriginal: true,\r\n deleteImage: true,\r\n separator: true,\r\n });\r\n\r\n imageBubbleMenuConfig = computed(() => ({\r\n changeImage: this.config().changeImage ?? true,\r\n resizeSmall: this.config().resizeSmall ?? true,\r\n resizeMedium: this.config().resizeMedium ?? true,\r\n resizeLarge: this.config().resizeLarge ?? true,\r\n resizeOriginal: this.config().resizeOriginal ?? true,\r\n deleteImage: this.config().deleteImage ?? true,\r\n separator: this.config().separator ?? true,\r\n }));\r\n\r\n hasResizeButtons = computed(() => {\r\n const c = this.imageBubbleMenuConfig();\r\n return (\r\n c.resizeSmall ||\r\n c.resizeMedium ||\r\n c.resizeLarge ||\r\n c.resizeOriginal\r\n );\r\n });\r\n\r\n override shouldShow(): boolean {\r\n const { nodes, isEditable, isFocused } = this.state();\r\n\r\n if (this.editorCommands.linkEditMode() || this.editorCommands.colorEditMode()) {\r\n return false;\r\n }\r\n\r\n return nodes.isImage && isEditable && isFocused;\r\n }\r\n\r\n override getSelectionRect(): DOMRect {\r\n const ed = this.editor();\r\n if (!ed) return new DOMRect(0, 0, 0, 0);\r\n\r\n const { from } = ed.state.selection;\r\n\r\n try {\r\n // 1. Direct ProseMirror approach: get DOM node at position\r\n const dom = ed.view.nodeDOM(from);\r\n if (dom instanceof HTMLElement) {\r\n // If it's a resizable container, look for the image inside\r\n if (dom.classList.contains(\"resizable-image-container\")) {\r\n const img = dom.querySelector(\"img\");\r\n if (img) return img.getBoundingClientRect();\r\n }\r\n return dom.getBoundingClientRect();\r\n }\r\n } catch (e) {\r\n // Fallback if nodeDOM fails\r\n }\r\n\r\n // 2. Ultimate fallback: find selected image in DOM\r\n const selectedImg = ed.view.dom.querySelector('img.selected, .resizable-image-container.selected img');\r\n if (selectedImg) {\r\n return selectedImg.getBoundingClientRect();\r\n }\r\n\r\n // If nothing found at all\r\n return new DOMRect(-9999, -9999, 0, 0);\r\n }\r\n\r\n protected override executeCommand(editor: Editor, command: string): void {\r\n switch (command) {\r\n case \"changeImage\":\r\n this.changeImage();\r\n break;\r\n case \"resizeSmall\":\r\n this.imageService.resizeImageToSmall(editor);\r\n break;\r\n case \"resizeMedium\":\r\n this.imageService.resizeImageToMedium(editor);\r\n break;\r\n case \"resizeLarge\":\r\n this.imageService.resizeImageToLarge(editor);\r\n break;\r\n case \"resizeOriginal\":\r\n this.imageService.resizeImageToOriginal(editor);\r\n break;\r\n case \"deleteImage\":\r\n this.deleteImage();\r\n break;\r\n }\r\n }\r\n\r\n private async changeImage() {\r\n const ed = this.editor();\r\n if (!ed) return;\r\n\r\n try {\r\n // Use dedicated method to replace an existing image\r\n await this.imageService.selectAndReplaceImage(ed, {\r\n quality: 0.8,\r\n maxWidth: 1920,\r\n maxHeight: 1080,\r\n accept: \"image/*\",\r\n });\r\n } catch (error) {\r\n console.error(this.i18nService.imageUpload().uploadError, error);\r\n }\r\n }\r\n\r\n private deleteImage() {\r\n const ed = this.editor();\r\n if (ed) {\r\n ed.chain().focus().deleteSelection().run();\r\n }\r\n }\r\n}\r\n","import {\r\n Component,\r\n input,\r\n ChangeDetectionStrategy,\r\n} from \"@angular/core\";\r\nimport { CommonModule } from \"@angular/common\";\r\nimport { type Editor } from \"@tiptap/core\";\r\nimport { TiptapButtonComponent } from \"./tiptap-button.component\";\r\nimport { TiptapSeparatorComponent } from \"./tiptap-separator.component\";\r\nimport { TiptapBaseBubbleMenu } from \"./base/tiptap-base-bubble-menu\";\r\n\r\n@Component({\r\n selector: \"tiptap-table-bubble-menu\",\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [CommonModule, TiptapButtonComponent, TiptapSeparatorComponent],\r\n template: `\r\n <div #menuRef class=\"bubble-menu\" (mousedown)=\"$event.preventDefault()\">\r\n <!-- Row actions -->\r\n @if (config().addRowBefore !== false) {\r\n <tiptap-button\r\n icon=\"add_row_above\"\r\n [title]=\"t().addRowBefore\"\r\n [disabled]=\"!state().can.addRowBefore\"\r\n (onClick)=\"onCommand('addRowBefore', $event)\"\r\n ></tiptap-button>\r\n } @if (config().addRowAfter !== false) {\r\n <tiptap-button\r\n icon=\"add_row_below\"\r\n [title]=\"t().addRowAfter\"\r\n [disabled]=\"!state().can.addRowAfter\"\r\n (onClick)=\"onCommand('addRowAfter', $event)\"\r\n ></tiptap-button>\r\n } @if (config().deleteRow !== false) {\r\n <tiptap-button\r\n icon=\"delete\"\r\n [title]=\"t().deleteRow\"\r\n variant=\"danger\"\r\n [disabled]=\"!state().can.deleteRow\"\r\n (onClick)=\"onCommand('deleteRow', $event)\"\r\n ></tiptap-button>\r\n } @if (config().separator !== false) {\r\n <tiptap-separator />\r\n }\r\n\r\n <!-- Column actions -->\r\n @if (config().addColumnBefore !== false) {\r\n <tiptap-button\r\n icon=\"add_column_left\"\r\n [title]=\"t().addColumnBefore\"\r\n [disabled]=\"!state().can.addColumnBefore\"\r\n (onClick)=\"onCommand('addColumnBefore', $event)\"\r\n ></tiptap-button>\r\n } @if (config().addColumnAfter !== false) {\r\n <tiptap-button\r\n icon=\"add_column_right\"\r\n [title]=\"t().addColumnAfter\"\r\n [disabled]=\"!state().can.addColumnAfter\"\r\n (onClick)=\"onCommand('addColumnAfter', $event)\"\r\n ></tiptap-button>\r\n } @if (config().deleteColumn !== false) {\r\n <tiptap-button\r\n icon=\"delete\"\r\n [title]=\"t().deleteColumn\"\r\n variant=\"danger\"\r\n [disabled]=\"!state().can.deleteColumn\"\r\n (onClick)=\"onCommand('deleteColumn', $event)\"\r\n ></tiptap-button>\r\n } @if (config().separator !== false) {\r\n <tiptap-separator />\r\n }\r\n\r\n <!-- Cell actions -->\r\n @if (config().toggleHeaderRow !== false) {\r\n <tiptap-button\r\n icon=\"toolbar\"\r\n [title]=\"t().toggleHeaderRow\"\r\n [active]=\"state().nodes.isTableHeaderRow\"\r\n [disabled]=\"!state().can.toggleHeaderRow\"\r\n (onClick)=\"onCommand('toggleHeaderRow', $event)\"\r\n ></tiptap-button>\r\n } @if (config().toggleHeaderColumn !== false) {\r\n <tiptap-button\r\n icon=\"dock_to_right\"\r\n [title]=\"t().toggleHeaderColumn\"\r\n [active]=\"state().nodes.isTableHeaderColumn\"\r\n [disabled]=\"!state().can.toggleHeaderColumn\"\r\n (onClick)=\"onCommand('toggleHeaderColumn', $event)\"\r\n ></tiptap-button>\r\n } @if (config().separator !== false && config().deleteTable !== false) {\r\n <tiptap-separator />\r\n }\r\n\r\n <!-- Table actions -->\r\n @if (config().deleteTable !== false) {\r\n <tiptap-button\r\n icon=\"delete_forever\"\r\n [title]=\"t().deleteTable\"\r\n variant=\"danger\"\r\n [disabled]=\"!state().can.deleteTable\"\r\n (onClick)=\"onCommand('deleteTable', $event)\"\r\n ></tiptap-button>\r\n }\r\n </div>\r\n `,\r\n})\r\nexport class TiptapTableBubbleMenuComponent extends TiptapBaseBubbleMenu {\r\n // Alias for template\r\n readonly t = this.i18nService.table;\r\n\r\n config = input<any>({\r\n addRowBefore: true,\r\n addRowAfter: true,\r\n deleteRow: true,\r\n addColumnBefore: true,\r\n addColumnAfter: true,\r\n deleteColumn: true,\r\n deleteTable: true,\r\n toggleHeaderRow: true,\r\n toggleHeaderColumn: true,\r\n separator: true,\r\n });\r\n\r\n override shouldShow(): boolean {\r\n const { selection, nodes, isEditable, isFocused } = this.state();\r\n\r\n if (this.editorCommands.linkEditMode() || this.editorCommands.colorEditMode()) {\r\n return false;\r\n }\r\n\r\n // Only show table bubble menu if:\r\n // 1. We are inside a table (nodes.isTable)\r\n // 2. Editor is editable and focused\r\n // 3. Selection is EMPTY (cursor) OR the Table node itself is selected\r\n // 4. It's NOT a CellSelection (cell bubble menu takes priority)\r\n return (\r\n nodes.isTable &&\r\n isEditable &&\r\n isFocused &&\r\n (selection.empty || nodes.isTableNodeSelected) &&\r\n selection.type !== 'cell'\r\n );\r\n }\r\n\r\n override getSelectionRect(): DOMRect {\r\n const ed = this.editor();\r\n if (!ed) return new DOMRect(0, 0, 0, 0);\r\n\r\n const { from } = ed.state.selection;\r\n\r\n try {\r\n // 1. Direct ProseMirror approach: get DOM node at position\r\n const dom = ed.view.domAtPos(from).node;\r\n\r\n // Find closest table element\r\n const tableElement = dom instanceof HTMLElement\r\n ? dom.closest('table')\r\n : dom.parentElement?.closest('table');\r\n\r\n if (tableElement) {\r\n return tableElement.getBoundingClientRect();\r\n }\r\n } catch (e) {\r\n // Fallback\r\n }\r\n\r\n // 2. Fallback via coordinates\r\n const coords = ed.view.coordsAtPos(from);\r\n if (coords) {\r\n // Search for table element at these coordinates\r\n const element = document.elementFromPoint(coords.left, coords.top);\r\n const table = element?.closest('table');\r\n if (table) return table.getBoundingClientRect();\r\n }\r\n\r\n // 3. Ultimate fallback if selection is ambiguous\r\n const activeTable = ed.view.dom.querySelector('table.selected, table:has(.selected), table:has(.selected-cell), table:has(.selected-node)');\r\n if (activeTable) {\r\n return activeTable.getBoundingClientRect();\r\n }\r\n\r\n return new DOMRect(-9999, -9999, 0, 0);\r\n }\r\n\r\n protected override executeCommand(editor: Editor, command: string): void {\r\n this.editorCommands.execute(editor, command);\r\n }\r\n}\r\n","import {\r\n Component,\r\n input,\r\n ChangeDetectionStrategy,\r\n} from \"@angular/core\";\r\nimport { CommonModule } from \"@angular/common\";\r\nimport { type Editor } from \"@tiptap/core\";\r\nimport { TiptapButtonComponent } from \"./tiptap-button.component\";\r\nimport { TiptapBaseBubbleMenu } from \"./base/tiptap-base-bubble-menu\";\r\n\r\nimport { CellBubbleMenuConfig } from \"./models/bubble-menu.model\";\r\n\r\n@Component({\r\n selector: \"tiptap-cell-bubble-menu\",\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [CommonModule, TiptapButtonComponent],\r\n template: `\r\n <div #menuRef class=\"bubble-menu\" (mousedown)=\"$event.preventDefault()\">\r\n <!-- Cell specific actions -->\r\n @if (config().mergeCells !== false && !state().selection.isSingleCell) {\r\n <tiptap-button\r\n icon=\"cell_merge\"\r\n [title]=\"i18n().table().mergeCells\"\r\n [disabled]=\"!state().can.mergeCells\"\r\n (onClick)=\"onCommand('mergeCells', $event)\"\r\n ></tiptap-button>\r\n } @if (config().splitCell !== false && state().selection.isSingleCell) {\r\n <tiptap-button\r\n icon=\"split_scene\"\r\n [title]=\"i18n().table().splitCell\"\r\n [disabled]=\"!state().can.splitCell\"\r\n (onClick)=\"onCommand('splitCell', $event)\"\r\n ></tiptap-button>\r\n }\r\n </div>\r\n `,\r\n})\r\nexport class TiptapCellBubbleMenuComponent extends TiptapBaseBubbleMenu {\r\n // Inputs\r\n config = input<CellBubbleMenuConfig>({});\r\n\r\n // Signals\r\n readonly i18n = () => this.i18nService;\r\n\r\n override shouldShow(): boolean {\r\n const { selection, nodes, isEditable, isFocused } = this.state();\r\n\r\n if (this.editorCommands.linkEditMode() || this.editorCommands.colorEditMode()) {\r\n return false;\r\n }\r\n\r\n // Only show cell bubble menu for CellSelection\r\n return (\r\n selection.type === 'cell' &&\r\n nodes.isTableCell &&\r\n isEditable &&\r\n isFocused\r\n );\r\n }\r\n\r\n override getSelectionRect(): DOMRect {\r\n const ed = this.editor();\r\n if (!ed) return new DOMRect(0, 0, 0, 0);\r\n\r\n // CellSelection\r\n const selection = ed.state.selection as any;\r\n\r\n // 1. Multiple cells selected\r\n if (selection.$anchorCell && selection.$headCell) {\r\n const cells: HTMLElement[] = [];\r\n\r\n // Try to find all selected cell nodes\r\n ed.view.dom.querySelectorAll('.selectedCell').forEach(el => {\r\n if (el instanceof HTMLElement) cells.push(el);\r\n });\r\n\r\n if (cells.length > 0) {\r\n let top = Infinity, bottom = -Infinity, left = Infinity, right = -Infinity;\r\n\r\n cells.forEach(cell => {\r\n const r = cell.getBoundingClientRect();\r\n top = Math.min(top, r.top);\r\n bottom = Math.max(bottom, r.bottom);\r\n left = Math.min(left, r.left);\r\n right = Math.max(right, r.right);\r\n });\r\n\r\n return new DOMRect(left, top, right - left, bottom - top);\r\n }\r\n\r\n // Fallback to anchor/head if no .selectedCell (rare)\r\n const anchor = ed.view.nodeDOM(selection.$anchorCell.pos) as HTMLElement;\r\n const head = ed.view.nodeDOM(selection.$headCell.pos) as HTMLElement;\r\n\r\n if (anchor && head) {\r\n const anchorRect = anchor.getBoundingClientRect();\r\n const headRect = head.getBoundingClientRect();\r\n\r\n const top = Math.min(anchorRect.top, headRect.top);\r\n const bottom = Math.max(anchorRect.bottom, headRect.bottom);\r\n const left = Math.min(anchorRect.left, headRect.left);\r\n const right = Math.max(anchorRect.right, headRect.right);\r\n\r\n return new DOMRect(left, top, right - left, bottom - top);\r\n }\r\n }\r\n\r\n // 2. Ultimate fallback via ProseMirror class\r\n const singleCell = ed.view.dom.querySelector('.selectedCell');\r\n if (singleCell) {\r\n return singleCell.getBoundingClientRect();\r\n }\r\n\r\n return new DOMRect(-9999, -9999, 0, 0);\r\n }\r\n\r\n protected override executeCommand(editor: Editor, command: string): void {\r\n this.editorCommands.execute(editor, command);\r\n }\r\n}\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n ViewChild,\r\n ElementRef,\r\n signal,\r\n effect,\r\n inject,\r\n OnInit,\r\n OnDestroy,\r\n input,\r\n} from \"@angular/core\";\r\nimport { FormsModule } from \"@angular/forms\";\r\nimport { type Editor } from \"@tiptap/core\";\r\nimport tippy, { Instance as TippyInstance, sticky } from \"tippy.js\";\r\nimport { TiptapButtonComponent } from \"./tiptap-button.component\";\r\nimport { EditorCommandsService } from \"./services/editor-commands.service\";\r\nimport { TiptapI18nService } from \"./services/i18n.service\";\r\nimport { LinkService } from \"./services/link.service\";\r\nimport { TiptapSeparatorComponent } from \"./tiptap-separator.component\";\r\n\r\n@Component({\r\n selector: \"tiptap-link-bubble-menu\",\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [TiptapButtonComponent, TiptapSeparatorComponent, FormsModule],\r\n template: `\r\n <div \r\n #menuRef \r\n class=\"bubble-menu\"\r\n (mousedown)=\"onMouseDown($event)\"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n <div class=\"link-input-row\">\r\n <div class=\"url-input-container\">\r\n <span class=\"material-symbols-outlined icon-link\">link</span>\r\n <input\r\n #linkInput\r\n type=\"text\"\r\n class=\"url-field\"\r\n [placeholder]=\"t().linkUrl\"\r\n [ngModel]=\"editUrl()\"\r\n (ngModelChange)=\"editUrl.set($event)\"\r\n (focus)=\"onFocus()\"\r\n (blur)=\"onBlur()\"\r\n (keydown.enter)=\"onApply($event)\"\r\n (keydown.escape)=\"onCancel($event)\"\r\n />\r\n </div>\r\n\r\n <div class=\"action-buttons\">\r\n <tiptap-button\r\n icon=\"check\"\r\n [title]=\"common().apply\"\r\n color=\"var(--ate-primary)\"\r\n [disabled]=\"!editUrl().trim()\"\r\n (onClick)=\"onApply($event)\"\r\n ></tiptap-button>\r\n <tiptap-button\r\n icon=\"open_in_new\"\r\n [title]=\"t().openLink\"\r\n [disabled]=\"!currentUrl()\"\r\n (onClick)=\"onOpenLink($event)\"\r\n ></tiptap-button>\r\n <tiptap-separator />\r\n <tiptap-button\r\n icon=\"link_off\"\r\n [title]=\"t().removeLink\"\r\n variant=\"danger\"\r\n [disabled]=\"!currentUrl()\"\r\n (onClick)=\"onRemove($event)\"\r\n ></tiptap-button>\r\n </div>\r\n </div>\r\n </div>\r\n `,\r\n styles: [`\r\n\r\n .link-input-row {\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n }\r\n\r\n .url-input-container {\r\n flex: 1;\r\n display: flex;\r\n align-items: center;\r\n background: var(--ate-surface-secondary, #f8fafc);\r\n border: 1px solid var(--ate-border, #e2e8f0);\r\n border-radius: 8px;\r\n padding: 0 10px;\r\n height: 32px;\r\n transition: all 150ms ease;\r\n }\r\n\r\n .url-input-container:focus-within {\r\n border-color: var(--ate-primary, #3b82f6);\r\n background: var(--ate-surface, #ffffff);\r\n box-shadow: 0 0 0 2px var(--ate-primary-light, rgba(59, 130, 246, 0.1));\r\n }\r\n\r\n .icon-link {\r\n font-size: 16px;\r\n color: var(--ate-text-muted, #94a3b8);\r\n margin-right: 6px;\r\n }\r\n\r\n .url-field {\r\n background: transparent;\r\n border: none;\r\n outline: none;\r\n color: var(--ate-text, #1e293b);\r\n font-size: 13px;\r\n width: 100%;\r\n font-family: inherit;\r\n }\r\n\r\n .action-buttons {\r\n display: flex;\r\n align-items: center;\r\n gap: 2px;\r\n }\r\n `]\r\n})\r\nexport class TiptapLinkBubbleMenuComponent implements OnInit, OnDestroy {\r\n private readonly i18nService = inject(TiptapI18nService);\r\n private readonly editorCommands = inject(EditorCommandsService);\r\n private readonly linkSvc = inject(LinkService);\r\n\r\n readonly t = this.i18nService.bubbleMenu;\r\n readonly common = this.i18nService.common;\r\n readonly state = this.editorCommands.editorState;\r\n\r\n editor = input.required<Editor>();\r\n\r\n @ViewChild('linkInput') linkInput?: ElementRef<HTMLInputElement>;\r\n @ViewChild('menuRef', { static: false }) menuRef!: ElementRef<HTMLDivElement>;\r\n\r\n protected tippyInstance: TippyInstance | null = null;\r\n protected updateTimeout: any = null;\r\n\r\n editUrl = signal('');\r\n\r\n constructor() {\r\n // Reactive effect for URL sync and focus\r\n effect(() => {\r\n const state = this.state();\r\n const isInteracting = this.linkSvc.isInteracting();\r\n const currentLinkHref = state.marks.linkHref || '';\r\n\r\n // SYNC LOGIC:\r\n // If we are NOT currently typing (interacting), \r\n // always keep the input in sync with the current editor selection.\r\n if (!isInteracting) {\r\n this.editUrl.set(currentLinkHref);\r\n }\r\n });\r\n\r\n // Reactive effect for menu updates (re-positioning)\r\n effect(() => {\r\n this.state();\r\n this.linkSvc.editMode();\r\n this.linkSvc.menuTrigger();\r\n this.linkSvc.isInteracting();\r\n\r\n this.updateMenu();\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n this.initTippy();\r\n }\r\n\r\n ngOnDestroy() {\r\n if (this.updateTimeout) clearTimeout(this.updateTimeout);\r\n if (this.tippyInstance) {\r\n this.tippyInstance.destroy();\r\n this.tippyInstance = null;\r\n }\r\n }\r\n\r\n private initTippy() {\r\n if (!this.menuRef?.nativeElement) {\r\n setTimeout(() => this.initTippy(), 50);\r\n return;\r\n }\r\n\r\n const ed = this.editor();\r\n this.tippyInstance = tippy(document.body, {\r\n content: this.menuRef.nativeElement,\r\n trigger: \"manual\",\r\n placement: \"bottom-start\",\r\n appendTo: () => ed.options.element,\r\n interactive: true,\r\n arrow: false,\r\n offset: [0, 8],\r\n hideOnClick: true,\r\n plugins: [sticky],\r\n sticky: false,\r\n getReferenceClientRect: () => this.getSelectionRect(),\r\n popperOptions: {\r\n modifiers: [\r\n {\r\n name: \"preventOverflow\",\r\n options: { boundary: ed.options.element, padding: 8 },\r\n },\r\n {\r\n name: \"flip\",\r\n options: { fallbackPlacements: [\"top-start\", \"bottom-end\", \"top-end\"] },\r\n },\r\n ],\r\n },\r\n onShow: () => {\r\n // We no longer auto-focus the input here to keep the editor selection visible.\r\n // The user can click the input if they want to type, but for swatches/preview, \r\n // staying in the editor is better for UX.\r\n },\r\n onHide: () => {\r\n // Clear trigger only AFTER the menu is hidden to maintain anchor stability during animation\r\n this.linkSvc.done();\r\n this.linkSvc.close();\r\n },\r\n\r\n });\r\n\r\n this.updateMenu();\r\n }\r\n\r\n updateMenu = () => {\r\n if (this.updateTimeout) clearTimeout(this.updateTimeout);\r\n this.updateTimeout = setTimeout(() => {\r\n if (this.shouldShow()) {\r\n this.showTippy();\r\n } else {\r\n this.hideTippy();\r\n }\r\n }, 10);\r\n }\r\n\r\n private showTippy() {\r\n if (this.tippyInstance) {\r\n this.tippyInstance.setProps({ getReferenceClientRect: () => this.getSelectionRect() });\r\n this.tippyInstance.show();\r\n }\r\n }\r\n\r\n private hideTippy() {\r\n this.tippyInstance?.hide();\r\n }\r\n\r\n private focusInput() {\r\n setTimeout(() => {\r\n this.linkInput?.nativeElement?.focus();\r\n this.linkInput?.nativeElement?.select();\r\n }, 50);\r\n }\r\n\r\n currentUrl() {\r\n return this.state().marks.linkHref || '';\r\n }\r\n\r\n shouldShow(): boolean {\r\n const { selection, marks, isEditable, isFocused } = this.state();\r\n if (!isEditable) return false;\r\n\r\n // Show if explicitly in edit mode (from toolbar/bubble menu) or interacting with input\r\n if (this.linkSvc.editMode() || this.linkSvc.isInteracting()) {\r\n return true;\r\n }\r\n\r\n // Show if cursor is on an existing link (read/preview mode)\r\n return isFocused && marks.link && selection.empty;\r\n }\r\n\r\n\r\n getSelectionRect(): DOMRect {\r\n const trigger = this.linkSvc.menuTrigger();\r\n const ed = this.editor();\r\n if (!ed) return new DOMRect(0, 0, 0, 0);\r\n\r\n // 1. If we have a stable trigger from service (toolbar or parent menu), anchor to it\r\n if (trigger) {\r\n const rect = trigger.getBoundingClientRect();\r\n // Only use if it's still visible/in DOM (width > 0)\r\n if (rect.width > 0) return rect;\r\n }\r\n\r\n // 2. Otherwise (bubble menu / relay), anchor to text selection\r\n const { from } = ed.state.selection;\r\n\r\n try {\r\n const { node } = ed.view.domAtPos(from);\r\n const element = node instanceof Element ? node : node.parentElement;\r\n const linkElement = element?.closest(\"a\");\r\n if (linkElement) return linkElement.getBoundingClientRect();\r\n } catch (e) { }\r\n\r\n // Use native selection for multi-line accuracy\r\n const selection = window.getSelection();\r\n if (selection && selection.rangeCount > 0) {\r\n const range = selection.getRangeAt(0);\r\n const rect = range.getBoundingClientRect();\r\n if (rect.width > 0 && rect.height > 0) return rect;\r\n }\r\n\r\n // Final fallback to coordinates at cursor\r\n const { top, bottom, left, right } = ed.view.coordsAtPos(from);\r\n return new DOMRect(left, top, right - left, bottom - top);\r\n }\r\n\r\n onMouseDown(event: MouseEvent) {\r\n event.stopPropagation();\r\n const target = event.target as HTMLElement;\r\n if (target.tagName !== 'INPUT') {\r\n event.preventDefault();\r\n }\r\n }\r\n\r\n onFocus() {\r\n this.linkSvc.setInteracting(true);\r\n }\r\n\r\n onBlur() {\r\n setTimeout(() => {\r\n this.linkSvc.setInteracting(false);\r\n this.updateMenu();\r\n }, 150);\r\n }\r\n\r\n onOpenLink(event: Event) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n const url = this.currentUrl();\r\n if (url) window.open(url, \"_blank\", \"noopener,noreferrer\");\r\n }\r\n\r\n onRemove(event: Event) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.linkSvc.unsetLink(this.editor());\r\n }\r\n\r\n onApply(event: Event) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n const url = this.editUrl().trim();\r\n if (url) {\r\n this.linkSvc.setLink(this.editor(), url);\r\n this.editUrl.set('');\r\n this.linkSvc.setInteracting(false);\r\n this.hideTippy();\r\n } else {\r\n this.onRemove(event);\r\n }\r\n }\r\n\r\n onCancel(event: Event) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.linkSvc.close();\r\n this.hideTippy();\r\n }\r\n}\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n ViewChild,\r\n ElementRef,\r\n signal,\r\n effect,\r\n inject,\r\n OnInit,\r\n OnDestroy,\r\n input,\r\n computed,\r\n viewChild,\r\n} from \"@angular/core\";\r\nimport { CommonModule } from \"@angular/common\";\r\nimport { FormsModule } from \"@angular/forms\";\r\nimport { type Editor } from \"@tiptap/core\";\r\nimport tippy, { Instance as TippyInstance, sticky } from \"tippy.js\";\r\nimport { EditorCommandsService } from \"./services/editor-commands.service\";\r\nimport { TiptapI18nService } from \"./services/i18n.service\";\r\nimport { ColorPickerService } from \"./services/color-picker.service\";\r\nimport { TiptapButtonComponent } from \"./tiptap-button.component\";\r\nimport { TiptapSeparatorComponent } from \"./tiptap-separator.component\";\r\n\r\nconst PRESET_COLORS = [\r\n \"#000000\", \"#666666\", \"#CCCCCC\", \"#FFFFFF\",\r\n \"#F44336\", \"#FF9800\", \"#FFEB3B\", \"#4CAF50\",\r\n \"#00BCD4\", \"#2196F3\", \"#9C27B0\", \"#E91E63\"\r\n];\r\n\r\n@Component({\r\n selector: \"tiptap-color-bubble-menu\",\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [CommonModule, FormsModule, TiptapButtonComponent, TiptapSeparatorComponent],\r\n template: `\r\n <div \r\n #menuRef \r\n class=\"bubble-menu color-bubble-menu\"\r\n (mousedown)=\"onMouseDown($event)\"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n <div class=\"color-picker-container\">\r\n <div class=\"dropdown-row presets\">\r\n <div class=\"color-grid\">\r\n @for (color of presets; track color) {\r\n <tiptap-button \r\n class=\"color-swatch-btn\" \r\n size=\"small\"\r\n [title]=\"color\"\r\n [active]=\"isColorActive(color)\"\r\n [backgroundColor]=\"color\"\r\n (onClick)=\"applyColor(color, true, $event)\"\r\n ></tiptap-button>\r\n }\r\n </div>\r\n </div>\r\n\r\n <div class=\"dropdown-row controls\">\r\n <div class=\"hex-input-wrapper\">\r\n <span class=\"hex-hash\">#</span>\r\n <input \r\n #hexInput\r\n type=\"text\" \r\n class=\"hex-input\" \r\n [value]=\"hexValue()\"\r\n [attr.aria-label]=\"t().customColor\"\r\n (input)=\"onHexInput($event)\"\r\n (change)=\"onHexChange($event)\"\r\n (keydown.enter)=\"onApply($event)\"\r\n (focus)=\"onFocus()\"\r\n (blur)=\"onBlur()\"\r\n maxlength=\"6\"\r\n placeholder=\"000000\"\r\n />\r\n </div>\r\n \r\n <div class=\"native-trigger-wrapper\">\r\n <tiptap-button \r\n class=\"btn-native-picker-trigger\" \r\n icon=\"colorize\"\r\n [title]=\"t().customColor\"\r\n [backgroundColor]=\"currentColor()\"\r\n (onClick)=\"triggerNativePicker($event)\" \r\n ></tiptap-button>\r\n <input\r\n #colorInput\r\n type=\"color\"\r\n class=\"hidden-native-input\"\r\n [value]=\"currentColor()\"\r\n [attr.aria-label]=\"t().customColor\"\r\n (input)=\"onNativeInput($event)\"\r\n (change)=\"onNativeChange($event)\"\r\n (focus)=\"onFocus()\"\r\n (blur)=\"onBlur()\"\r\n />\r\n </div>\r\n\r\n <tiptap-button \r\n icon=\"check\"\r\n [title]=\"common().apply\"\r\n color=\"var(--ate-primary)\"\r\n (onClick)=\"onApply($event)\"\r\n ></tiptap-button>\r\n\r\n <tiptap-separator />\r\n\r\n <tiptap-button \r\n icon=\"format_color_reset\"\r\n [title]=\"t().clear\"\r\n variant=\"danger\"\r\n (onClick)=\"onClearColor($event)\" \r\n ></tiptap-button>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n `,\r\n styles: [`\r\n .color-picker-container {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 8px;\r\n }\r\n\r\n .dropdown-row {\r\n display: flex;\r\n align-items: center;\r\n width: 100%;\r\n }\r\n\r\n .dropdown-row.presets {\r\n justify-content: center;\r\n }\r\n\r\n .dropdown-row.controls {\r\n gap: 8px;\r\n justify-content: space-between;\r\n padding-top: 4px;\r\n border-top: 1px solid var(--ate-border, #e2e8f0);\r\n }\r\n\r\n .color-grid {\r\n display: grid;\r\n grid-template-columns: repeat(12, 1fr);\r\n gap: 4px;\r\n width: 100%;\r\n }\r\n\r\n :host ::ng-deep .color-swatch-btn .tiptap-button {\r\n width: 100%;\r\n aspect-ratio: 1;\r\n height: auto;\r\n border-radius: 4px;\r\n border: 1px solid rgba(0, 0, 0, 0.1);\r\n padding: 0;\r\n }\r\n\r\n :host ::ng-deep .color-swatch-btn .tiptap-button.is-active {\r\n border-color: var(--ate-primary, #3b82f6);\r\n box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.3);\r\n }\r\n \r\n :host ::ng-deep .btn-native-picker-trigger .tiptap-button {\r\n color: #ffffff;\r\n text-shadow: 0 1px 2px rgba(0,0,0,0.2);\r\n }\r\n\r\n .divider-v {\r\n width: 1px;\r\n height: 24px;\r\n background: var(--ate-border, #e2e8f0);\r\n }\r\n\r\n .hex-input-wrapper {\r\n flex: 1;\r\n display: flex;\r\n align-items: center;\r\n background: var(--ate-surface-secondary, #f8fafc);\r\n border: 1px solid var(--ate-border, #e2e8f0);\r\n border-radius: 8px;\r\n padding: 0 10px;\r\n height: 32px;\r\n transition: border-color 150ms ease;\r\n }\r\n\r\n .hex-input-wrapper:focus-within {\r\n border-color: var(--ate-primary, #3b82f6);\r\n background: var(--ate-menu-bg, #ffffff);\r\n }\r\n\r\n .hex-hash {\r\n color: var(--ate-text-muted, #94a3b8);\r\n font-family: monospace;\r\n font-size: 0.875rem;\r\n }\r\n\r\n .hex-input {\r\n background: transparent;\r\n border: none;\r\n outline: none;\r\n color: var(--ate-text, #1e293b);\r\n font-family: monospace;\r\n font-size: 0.875rem;\r\n width: 100%;\r\n padding-left: 4px;\r\n }\r\n\r\n .native-trigger-wrapper {\r\n position: relative;\r\n width: 32px;\r\n height: 32px;\r\n }\r\n\r\n .hidden-native-input {\r\n position: absolute;\r\n inset: 0;\r\n opacity: 0;\r\n width: 100%;\r\n height: 100%;\r\n cursor: pointer;\r\n }\r\n `]\r\n})\r\nexport class TiptapColorBubbleMenuComponent implements OnInit, OnDestroy {\r\n private readonly i18nService = inject(TiptapI18nService);\r\n private readonly editorCommands = inject(EditorCommandsService);\r\n private readonly colorPickerSvc = inject(ColorPickerService);\r\n\r\n readonly t = this.i18nService.toolbar;\r\n readonly common = this.i18nService.common;\r\n readonly state = this.editorCommands.editorState;\r\n readonly presets = PRESET_COLORS;\r\n\r\n editor = input.required<Editor>();\r\n\r\n @ViewChild('menuRef', { static: false }) menuRef!: ElementRef<HTMLDivElement>;\r\n private colorInputRef = viewChild<ElementRef<HTMLInputElement>>(\"colorInput\");\r\n\r\n protected tippyInstance: TippyInstance | null = null;\r\n protected updateTimeout: any = null;\r\n\r\n\r\n /** \r\n * LOCAL MODE: We lock the mode when the menu is shown to avoid race conditions \r\n * where the parent (bubble menu) clears the global signal before we apply the color.\r\n */\r\n activeMode = signal<'text' | 'highlight'>('text');\r\n\r\n constructor() {\r\n effect(() => {\r\n this.state();\r\n this.colorPickerSvc.editMode();\r\n this.colorPickerSvc.menuTrigger();\r\n this.colorPickerSvc.isInteracting();\r\n\r\n\r\n this.updateMenu();\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n this.initTippy();\r\n }\r\n\r\n ngOnDestroy() {\r\n if (this.updateTimeout) clearTimeout(this.updateTimeout);\r\n if (this.tippyInstance) {\r\n this.tippyInstance.destroy();\r\n this.tippyInstance = null;\r\n }\r\n }\r\n\r\n private initTippy() {\r\n if (!this.menuRef?.nativeElement) {\r\n setTimeout(() => this.initTippy(), 50);\r\n return;\r\n }\r\n\r\n const ed = this.editor();\r\n this.tippyInstance = tippy(document.body, {\r\n content: this.menuRef.nativeElement,\r\n trigger: \"manual\",\r\n placement: \"bottom-start\",\r\n appendTo: () => ed.options.element,\r\n interactive: true,\r\n arrow: false,\r\n offset: [0, 8],\r\n hideOnClick: true,\r\n plugins: [sticky],\r\n sticky: false,\r\n getReferenceClientRect: () => this.getSelectionRect(),\r\n popperOptions: {\r\n modifiers: [\r\n {\r\n name: \"preventOverflow\",\r\n options: { boundary: ed.options.element, padding: 8 },\r\n },\r\n {\r\n name: \"flip\",\r\n options: { fallbackPlacements: [\"top-start\", \"bottom-end\", \"top-end\"] },\r\n },\r\n ],\r\n },\r\n onShow: () => {\r\n // 1. Lock the mode immediately to be immune to external signal changes\r\n const currentMode = this.colorPickerSvc.editMode() || 'text';\r\n this.activeMode.set(currentMode);\r\n\r\n // 2. Capture selection for the command fallback\r\n this.colorPickerSvc.captureSelection(this.editor());\r\n\r\n\r\n // Note: We don't auto-focus the Hex input anymore to keep the \r\n // visual selection (blue highlight) active in the editor.\r\n },\r\n onHide: () => {\r\n // Clear trigger only AFTER the menu is hidden to maintain anchor stability during animation\r\n this.colorPickerSvc.done();\r\n this.colorPickerSvc.close();\r\n },\r\n\r\n });\r\n\r\n this.updateMenu();\r\n }\r\n\r\n updateMenu = () => {\r\n if (this.updateTimeout) clearTimeout(this.updateTimeout);\r\n this.updateTimeout = setTimeout(() => {\r\n if (this.shouldShow()) {\r\n this.showTippy();\r\n } else {\r\n this.hideTippy();\r\n }\r\n }, 10);\r\n }\r\n\r\n private showTippy() {\r\n if (this.tippyInstance) {\r\n this.tippyInstance.setProps({ getReferenceClientRect: () => this.getSelectionRect() });\r\n this.tippyInstance.show();\r\n }\r\n }\r\n\r\n private hideTippy() {\r\n this.tippyInstance?.hide();\r\n }\r\n\r\n shouldShow(): boolean {\r\n const { isEditable } = this.state();\r\n if (!isEditable) return false;\r\n\r\n if (this.colorPickerSvc.editMode() !== null || this.colorPickerSvc.isInteracting()) {\r\n return true;\r\n }\r\n\r\n\r\n return false;\r\n }\r\n\r\n getSelectionRect(): DOMRect {\r\n const trigger = this.colorPickerSvc.menuTrigger();\r\n const ed = this.editor();\r\n if (!ed) return new DOMRect(0, 0, 0, 0);\r\n\r\n // 1. If we have a stable trigger from service (toolbar or parent menu), anchor to it\r\n if (trigger) {\r\n const rect = trigger.getBoundingClientRect();\r\n // Only use if it's still visible/in DOM (width > 0)\r\n if (rect.width > 0) return rect;\r\n }\r\n\r\n // 2. Otherwise (bubble menu / relay), anchor to text selection\r\n const { from } = ed.state.selection;\r\n\r\n try {\r\n const { node } = ed.view.domAtPos(from);\r\n const element = node instanceof Element ? node : node.parentElement;\r\n const colorElement = element?.closest('[style*=\"color\"], [style*=\"background\"], mark');\r\n if (colorElement) return colorElement.getBoundingClientRect();\r\n } catch (e) { /* ignore */ }\r\n\r\n // Use native selection for multi-line accuracy\r\n const selection = window.getSelection();\r\n if (selection && selection.rangeCount > 0) {\r\n const range = selection.getRangeAt(0);\r\n const rect = range.getBoundingClientRect();\r\n if (rect.width > 0 && rect.height > 0) return rect;\r\n }\r\n\r\n // Final fallback to coordinates at cursor\r\n const { top, bottom, left, right } = ed.view.coordsAtPos(from);\r\n return new DOMRect(left, top, right - left, bottom - top);\r\n }\r\n\r\n readonly currentColor = computed(() => {\r\n const marks = this.state().marks;\r\n const color = this.activeMode() === \"text\" ? marks.computedColor : marks.computedBackground;\r\n return color || (this.activeMode() === \"text\" ? \"#000000\" : \"#ffff00\");\r\n });\r\n\r\n readonly hexValue = computed(() => {\r\n const color = this.currentColor();\r\n return color.replace('#', '').toUpperCase();\r\n });\r\n\r\n isColorActive(color: string): boolean {\r\n return this.colorPickerSvc.normalizeColor(this.currentColor()) === this.colorPickerSvc.normalizeColor(color);\r\n }\r\n\r\n applyColor(color: string, addToHistory: boolean = true, event?: Event) {\r\n if (event) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n }\r\n\r\n const editor = this.editor();\r\n // Use our LOCKED mode instead of the global signal\r\n const cmd = this.activeMode() === \"text\" ? \"applyColor\" : \"applyHighlight\";\r\n\r\n // Determine if we should focus back to the editor.\r\n // If we're interacting with an input (live typing), we DON'T want to focus back yet.\r\n const shouldFocus = !this.colorPickerSvc.isInteracting();\r\n\r\n if (this.activeMode() === \"text\") {\r\n this.colorPickerSvc.applyColor(editor, color, addToHistory, shouldFocus);\r\n } else {\r\n this.colorPickerSvc.applyHighlight(editor, color, addToHistory, shouldFocus);\r\n }\r\n }\r\n\r\n\r\n\r\n onApply(event?: Event) {\r\n if (event) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n }\r\n this.colorPickerSvc.close();\r\n }\r\n\r\n onHexInput(event: Event) {\r\n const input = event.target as HTMLInputElement;\r\n let value = input.value.trim();\r\n if (!value.startsWith(\"#\")) value = \"#\" + value;\r\n if (/^#?[0-9A-Fa-f]{3,6}$/.test(value)) {\r\n this.applyColor(value, false);\r\n }\r\n }\r\n\r\n onHexChange(event: Event) {\r\n const input = event.target as HTMLInputElement;\r\n let value = input.value.trim();\r\n if (!value.startsWith(\"#\")) value = \"#\" + value;\r\n if (/^#?[0-9A-Fa-f]{3,6}$/.test(value)) {\r\n this.applyColor(value, true, event);\r\n }\r\n }\r\n\r\n triggerNativePicker(event?: Event) {\r\n if (event) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n }\r\n this.colorInputRef()?.nativeElement.click();\r\n }\r\n\r\n onNativeInput(event: Event) {\r\n this.applyColor((event.target as HTMLInputElement).value, false);\r\n }\r\n\r\n onNativeChange(event: Event) {\r\n this.applyColor((event.target as HTMLInputElement).value, true, event);\r\n }\r\n\r\n onClearColor(event?: Event) {\r\n if (event) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n }\r\n\r\n const editor = this.editor();\r\n if (this.activeMode() === \"text\") {\r\n this.colorPickerSvc.unsetColor(editor);\r\n } else {\r\n this.colorPickerSvc.unsetHighlight(editor);\r\n }\r\n }\r\n\r\n onMouseDown(event: MouseEvent) {\r\n event.stopPropagation();\r\n const target = event.target as HTMLElement;\r\n if (target.tagName !== 'INPUT') {\r\n event.preventDefault();\r\n }\r\n }\r\n\r\n onFocus() {\r\n this.colorPickerSvc.setInteracting(true);\r\n }\r\n\r\n onBlur() {\r\n setTimeout(() => {\r\n this.colorPickerSvc.setInteracting(false);\r\n this.updateMenu();\r\n }, 150);\r\n }\r\n}\r\n","import { Editor } from \"@tiptap/core\";\r\nimport { SlashCommandItem } from \"../tiptap-slash-commands.component\";\r\nimport { TiptapI18nService } from \"../services/i18n.service\";\r\nimport { EditorCommandsService } from \"../services/editor-commands.service\";\r\n\r\n/**\r\n * Clés des commandes natives dans l'ordre d'affichage\r\n */\r\nexport const SLASH_COMMAND_KEYS = [\r\n \"heading1\",\r\n \"heading2\",\r\n \"heading3\",\r\n \"bulletList\",\r\n \"orderedList\",\r\n \"blockquote\",\r\n \"code\",\r\n \"image\",\r\n \"horizontalRule\",\r\n \"table\",\r\n] as const;\r\n\r\nexport type SlashCommandKey = (typeof SLASH_COMMAND_KEYS)[number];\r\n\r\n/**\r\n * Configuration simplifiée pour activer/désactiver les slash commands natives.\r\n * Permet aussi d'ajouter des commandes personnalisées.\r\n */\r\nexport interface SlashCommandsConfig extends Partial<Record<SlashCommandKey, boolean>> {\r\n /**\r\n * Liste de commandes supplémentaires à ajouter à la fin du menu\r\n */\r\n custom?: SlashCommandItem[];\r\n}\r\n\r\n/**\r\n * Configuration par défaut : toutes les commandes natives sont activées\r\n */\r\nexport const DEFAULT_SLASH_COMMANDS_CONFIG: Record<SlashCommandKey, boolean> = {\r\n heading1: true,\r\n heading2: true,\r\n heading3: true,\r\n bulletList: true,\r\n orderedList: true,\r\n blockquote: true,\r\n code: true,\r\n image: true,\r\n horizontalRule: true,\r\n table: true,\r\n};\r\n\r\n/**\r\n * Factory pour créer les commandes natives avec leurs traductions et leur logique d'exécution.\r\n * Utilise les services de l'éditeur pour garantir une cohérence de comportement.\r\n */\r\nexport function createDefaultSlashCommands(\r\n i18n: TiptapI18nService,\r\n commands: EditorCommandsService,\r\n imageOptions?: { quality?: number; maxWidth?: number; maxHeight?: number; allowedTypes?: string[] }\r\n): SlashCommandItem[] {\r\n const t = i18n.slashCommands();\r\n\r\n return [\r\n {\r\n title: t.heading1.title,\r\n description: t.heading1.description,\r\n icon: \"format_h1\",\r\n keywords: t.heading1.keywords,\r\n command: (editor: Editor) => commands.toggleHeading(editor, 1),\r\n },\r\n {\r\n title: t.heading2.title,\r\n description: t.heading2.description,\r\n icon: \"format_h2\",\r\n keywords: t.heading2.keywords,\r\n command: (editor: Editor) => commands.toggleHeading(editor, 2),\r\n },\r\n {\r\n title: t.heading3.title,\r\n description: t.heading3.description,\r\n icon: \"format_h3\",\r\n keywords: t.heading3.keywords,\r\n command: (editor: Editor) => commands.toggleHeading(editor, 3),\r\n },\r\n {\r\n title: t.bulletList.title,\r\n description: t.bulletList.description,\r\n icon: \"format_list_bulleted\",\r\n keywords: t.bulletList.keywords,\r\n command: (editor: Editor) => commands.toggleBulletList(editor),\r\n },\r\n {\r\n title: t.orderedList.title,\r\n description: t.orderedList.description,\r\n icon: \"format_list_numbered\",\r\n keywords: t.orderedList.keywords,\r\n command: (editor: Editor) => commands.toggleOrderedList(editor),\r\n },\r\n {\r\n title: t.blockquote.title,\r\n description: t.blockquote.description,\r\n icon: \"format_quote\",\r\n keywords: t.blockquote.keywords,\r\n command: (editor: Editor) => commands.toggleBlockquote(editor),\r\n },\r\n {\r\n title: t.code.title,\r\n description: t.code.description,\r\n icon: \"code\",\r\n keywords: t.code.keywords,\r\n command: (editor: Editor) => commands.toggleCodeBlock(editor),\r\n },\r\n {\r\n title: t.image.title,\r\n description: t.image.description,\r\n icon: \"image\",\r\n keywords: t.image.keywords,\r\n command: (editor: Editor) => commands.execute(editor, \"insertImage\", {\r\n quality: imageOptions?.quality,\r\n maxWidth: imageOptions?.maxWidth,\r\n maxHeight: imageOptions?.maxHeight,\r\n accept: imageOptions?.allowedTypes?.join(',')\r\n }),\r\n },\r\n {\r\n title: t.horizontalRule.title,\r\n description: t.horizontalRule.description,\r\n icon: \"horizontal_rule\",\r\n keywords: t.horizontalRule.keywords,\r\n command: (editor: Editor) => commands.insertHorizontalRule(editor),\r\n },\r\n {\r\n title: t.table.title,\r\n description: t.table.description,\r\n icon: \"table_view\",\r\n keywords: t.table.keywords,\r\n command: (editor: Editor) => commands.insertTable(editor),\r\n },\r\n ];\r\n}\r\n\r\n/**\r\n * Filtre et assemble les commandes selon la configuration fournie.\r\n */\r\nexport function filterSlashCommands(\r\n config: SlashCommandsConfig,\r\n i18n: TiptapI18nService,\r\n commands: EditorCommandsService,\r\n imageOptions?: { quality?: number; maxWidth?: number; maxHeight?: number; allowedTypes?: string[] }\r\n): SlashCommandItem[] {\r\n const allNatives = createDefaultSlashCommands(i18n, commands, imageOptions);\r\n const activeConfig = { ...DEFAULT_SLASH_COMMANDS_CONFIG, ...config };\r\n\r\n const filtered = allNatives.filter((_, index) => {\r\n const key = SLASH_COMMAND_KEYS[index];\r\n return key && activeConfig[key] !== false;\r\n });\r\n\r\n if (config.custom && Array.isArray(config.custom)) {\r\n return [...filtered, ...config.custom];\r\n }\r\n\r\n return filtered;\r\n}\r\n","import {\r\n Component,\r\n input,\r\n output,\r\n ViewChild,\r\n ElementRef,\r\n OnInit,\r\n OnDestroy,\r\n effect,\r\n computed,\r\n inject,\r\n signal,\r\n ChangeDetectionStrategy,\r\n} from \"@angular/core\";\r\nimport tippy, { Instance as TippyInstance, sticky } from \"tippy.js\";\r\nimport { Editor } from \"@tiptap/core\";\r\nimport { TiptapI18nService } from \"./services/i18n.service\";\r\nimport { EditorCommandsService } from \"./services/editor-commands.service\";\r\nimport {\r\n filterSlashCommands,\r\n createDefaultSlashCommands\r\n} from \"./config/slash-commands.config\";\r\nimport { Plugin, PluginKey } from \"@tiptap/pm/state\";\r\nimport { EditorView } from \"@tiptap/pm/view\";\r\n\r\nexport interface SlashCommandItem {\r\n title: string;\r\n description: string;\r\n icon: string;\r\n keywords: string[];\r\n command: (editor: Editor) => void;\r\n}\r\n\r\nexport interface CustomSlashCommands {\r\n commands?: SlashCommandItem[];\r\n}\r\n\r\n// Default command definitions are now centralized in src/lib/config/slash-commands.config.ts\r\n\r\n@Component({\r\n selector: \"tiptap-slash-commands\",\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n template: `\r\n <div #menuRef class=\"slash-commands-menu\">\r\n @for (command of filteredCommands(); track command.title) {\r\n <div\r\n class=\"slash-command-item\"\r\n [class.selected]=\"$index === selectedIndex()\"\r\n (mousedown)=\"executeCommand(command); $event.preventDefault(); $event.stopPropagation()\"\r\n (mouseenter)=\"selectedIndex.set($index)\"\r\n >\r\n <div class=\"slash-command-icon\">\r\n <span class=\"material-symbols-outlined\">{{ command.icon }}</span>\r\n </div>\r\n <div class=\"slash-command-content\">\r\n <div class=\"slash-command-title\">{{ command.title }}</div>\r\n <div class=\"slash-command-description\">{{ command.description }}</div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n `,\r\n styles: [\r\n `\r\n .slash-commands-menu {\r\n background: var(--ate-menu-bg);\r\n border: 1px solid var(--ate-menu-border);\r\n border-radius: var(--ate-border-radius, 12px);\r\n box-shadow: var(--ate-menu-shadow);\r\n padding: var(--ate-menu-padding);\r\n max-height: 320px;\r\n overflow-y: auto;\r\n min-width: 280px;\r\n outline: none;\r\n animation: slashMenuFadeIn 0.2s cubic-bezier(0, 0, 0.2, 1);\r\n scrollbar-width: thin;\r\n scrollbar-color: var(--ate-scrollbar-thumb) var(--ate-scrollbar-track);\r\n }\r\n\r\n .slash-commands-menu::-webkit-scrollbar {\r\n width: var(--ate-scrollbar-width);\r\n }\r\n\r\n .slash-commands-menu::-webkit-scrollbar-track {\r\n background: var(--ate-scrollbar-track);\r\n }\r\n\r\n .slash-commands-menu::-webkit-scrollbar-thumb {\r\n background: var(--ate-scrollbar-thumb);\r\n border: 3px solid transparent;\r\n background-clip: content-box;\r\n border-radius: 10px;\r\n }\r\n\r\n .slash-commands-menu::-webkit-scrollbar-thumb:hover {\r\n background: var(--ate-scrollbar-thumb-hover);\r\n background-clip: content-box;\r\n }\r\n\r\n @keyframes slashMenuFadeIn {\r\n from { opacity: 0; transform: translateY(4px); }\r\n to { opacity: 1; transform: translateY(0); }\r\n }\r\n\r\n .slash-command-item {\r\n display: flex;\r\n align-items: center;\r\n gap: 12px;\r\n padding: var(--ate-menu-padding);\r\n border-radius: var(--ate-border-radius, 8px);\r\n cursor: pointer;\r\n transition: all 0.15s ease;\r\n border: var(--ate-border-width, 1px) solid transparent;\r\n outline: none;\r\n margin-bottom: 2px;\r\n }\r\n\r\n .slash-command-item:last-child {\r\n margin-bottom: 0;\r\n }\r\n\r\n .slash-command-item:hover {\r\n background: var(--ate-surface-secondary);\r\n }\r\n\r\n .slash-command-item.selected {\r\n background: var(--ate-primary-light);\r\n border-color: var(--ate-primary-light-alpha);\r\n }\r\n\r\n .slash-command-icon {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 32px;\r\n height: 32px;\r\n background: var(--ate-surface-tertiary);\r\n border-radius: var(--ate-sub-border-radius, 8px);\r\n color: var(--ate-primary);\r\n flex-shrink: 0;\r\n transition: all 0.15s ease;\r\n }\r\n\r\n .slash-command-item.selected .slash-command-icon {\r\n background: var(--ate-primary);\r\n color: var(--ate-primary-contrast, #ffffff);\r\n }\r\n\r\n .slash-command-icon .material-symbols-outlined {\r\n font-size: 18px;\r\n }\r\n\r\n .slash-command-content {\r\n flex: 1;\r\n min-width: 0;\r\n }\r\n\r\n .slash-command-title {\r\n font-weight: 500;\r\n color: var(--ate-text);\r\n font-size: 14px;\r\n margin-bottom: 1px;\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n }\r\n\r\n .slash-command-description {\r\n color: var(--ate-text-secondary);\r\n font-size: 11px;\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n }\r\n `,\r\n ],\r\n})\r\nexport class TiptapSlashCommandsComponent implements OnInit, OnDestroy {\r\n readonly i18nService = inject(TiptapI18nService);\r\n editor = input.required<Editor>();\r\n config = input<CustomSlashCommands | undefined>(undefined);\r\n\r\n @ViewChild(\"menuRef\", { static: false }) menuRef!: ElementRef<HTMLDivElement>;\r\n\r\n private tippyInstance: TippyInstance | null = null;\r\n private editorCommands = inject(EditorCommandsService);\r\n\r\n // Local state\r\n private isActive = false;\r\n private currentQuery = signal(\"\");\r\n private slashRange: { from: number; to: number } | null = null;\r\n\r\n // Signal for selected index\r\n selectedIndex = signal(0);\r\n\r\n // Toolbar interaction state (from centralized service)\r\n private readonly isToolbarInteracting = this.editorCommands.isToolbarInteracting;\r\n\r\n commands = computed(() => {\r\n const config = this.config();\r\n if (config && config.commands) {\r\n return config.commands;\r\n }\r\n\r\n // Fallback to default native commands\r\n return createDefaultSlashCommands(this.i18nService, this.editorCommands);\r\n });\r\n\r\n filteredCommands = computed(() => {\r\n const query = this.currentQuery().toLowerCase();\r\n const commands = this.commands();\r\n\r\n if (!query) {\r\n return commands;\r\n }\r\n\r\n return commands.filter(\r\n (command) =>\r\n command.title.toLowerCase().includes(query) ||\r\n command.description.toLowerCase().includes(query) ||\r\n command.keywords.some((keyword) =>\r\n keyword.toLowerCase().includes(query)\r\n )\r\n );\r\n });\r\n\r\n constructor() {\r\n effect(() => {\r\n const ed = this.editor();\r\n if (!ed) return;\r\n\r\n // Clean up old listeners\r\n ed.off(\"selectionUpdate\", this.updateMenu);\r\n ed.off(\"transaction\", this.updateMenu);\r\n ed.off(\"focus\", this.updateMenu);\r\n ed.off(\"blur\", this.handleBlur);\r\n\r\n // Add new listeners\r\n ed.on(\"selectionUpdate\", this.updateMenu);\r\n ed.on(\"transaction\", this.updateMenu);\r\n ed.on(\"focus\", this.updateMenu);\r\n ed.on(\"blur\", this.handleBlur);\r\n\r\n // Use ProseMirror plugin system to intercept keys\r\n this.addKeyboardPlugin(ed);\r\n\r\n // updateMenu() will be called automatically when editor is ready\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n this.initTippy();\r\n }\r\n\r\n ngOnDestroy() {\r\n const ed = this.editor();\r\n if (ed) {\r\n ed.off(\"selectionUpdate\", this.updateMenu);\r\n ed.off(\"transaction\", this.updateMenu);\r\n ed.off(\"focus\", this.updateMenu);\r\n ed.off(\"blur\", this.handleBlur);\r\n }\r\n\r\n if (this.tippyInstance) {\r\n this.tippyInstance.destroy();\r\n this.tippyInstance = null;\r\n }\r\n }\r\n\r\n private initTippy() {\r\n if (!this.menuRef?.nativeElement) {\r\n setTimeout(() => this.initTippy(), 50);\r\n return;\r\n }\r\n\r\n const menuElement = this.menuRef.nativeElement;\r\n\r\n if (this.tippyInstance) {\r\n this.tippyInstance.destroy();\r\n }\r\n\r\n this.tippyInstance = tippy(document.body, {\r\n content: menuElement,\r\n trigger: \"manual\",\r\n placement: \"bottom-start\",\r\n theme: \"slash-menu\",\r\n appendTo: (ref) => {\r\n // Always try to climb up to editor host to inherit CSS variables\r\n const host = this.editor().options.element.closest(\"angular-tiptap-editor\");\r\n return host || document.body;\r\n\r\n },\r\n interactive: true,\r\n arrow: false,\r\n offset: [0, 8],\r\n hideOnClick: true,\r\n plugins: [sticky],\r\n sticky: false,\r\n getReferenceClientRect: () => this.getSlashRect(),\r\n // Improve positioning with scroll\r\n popperOptions: {\r\n modifiers: [\r\n {\r\n name: \"preventOverflow\",\r\n options: {\r\n boundary: this.editor().options.element,\r\n padding: 8,\r\n },\r\n },\r\n {\r\n name: \"flip\",\r\n options: {\r\n fallbackPlacements: [\"top-start\", \"bottom-end\", \"top-end\"],\r\n },\r\n },\r\n {\r\n name: \"hide\",\r\n },\r\n ],\r\n },\r\n });\r\n\r\n // Initial check after Tippy is initialized\r\n this.updateMenu();\r\n }\r\n\r\n private getSlashRect(): DOMRect {\r\n const ed = this.editor();\r\n if (!ed || !this.slashRange) {\r\n return new DOMRect(-9999, -9999, 0, 0);\r\n }\r\n\r\n try {\r\n // Use ProseMirror coordinates for better precision\r\n const coords = ed.view.coordsAtPos(this.slashRange.from);\r\n return new DOMRect(\r\n coords.left,\r\n coords.top,\r\n 0,\r\n coords.bottom - coords.top\r\n );\r\n } catch (error) {\r\n console.warn(\"Error calculating coordinates:\", error);\r\n // Fallback to window.getSelection\r\n const selection = window.getSelection();\r\n if (!selection || selection.rangeCount === 0) {\r\n return new DOMRect(-9999, -9999, 0, 0);\r\n }\r\n const range = selection.getRangeAt(0);\r\n return range.getBoundingClientRect();\r\n }\r\n }\r\n\r\n updateMenu = () => {\r\n const ed = this.editor();\r\n if (!ed) return;\r\n\r\n const { from } = ed.state.selection;\r\n\r\n // Check if '/' was typed at the beginning of a line or after a space\r\n const textBefore = ed.state.doc.textBetween(\r\n Math.max(0, from - 20),\r\n from,\r\n \"\\n\"\r\n );\r\n const slashMatch = textBefore.match(/(?:^|\\s)\\/([^\\/\\s]*)$/);\r\n\r\n if (slashMatch) {\r\n const query = slashMatch[1] || \"\";\r\n const wasActive = this.isActive;\r\n\r\n this.currentQuery.set(query);\r\n this.slashRange = {\r\n from: from - slashMatch[0].length + slashMatch[0].indexOf(\"/\"),\r\n to: from,\r\n };\r\n\r\n // Reset index if menu just became active\r\n if (!wasActive) {\r\n this.selectedIndex.set(0);\r\n }\r\n\r\n this.isActive = true;\r\n\r\n if (this.isToolbarInteracting()) {\r\n this.hideTippy();\r\n } else {\r\n this.showTippy();\r\n }\r\n } else {\r\n this.isActive = false;\r\n this.hideTippy();\r\n }\r\n };\r\n\r\n handleBlur = () => {\r\n setTimeout(() => this.hideTippy(), 100);\r\n };\r\n\r\n handleKeyDown = (event: KeyboardEvent) => {\r\n // Only handle keys if menu is active\r\n if (!this.isActive || this.filteredCommands().length === 0) {\r\n return;\r\n }\r\n\r\n switch (event.key) {\r\n case \"ArrowDown\":\r\n event.preventDefault();\r\n event.stopPropagation();\r\n const nextIndex =\r\n (this.selectedIndex() + 1) % this.filteredCommands().length;\r\n this.selectedIndex.set(nextIndex);\r\n this.scrollToSelected();\r\n break;\r\n\r\n case \"ArrowUp\":\r\n event.preventDefault();\r\n event.stopPropagation();\r\n const prevIndex =\r\n this.selectedIndex() === 0\r\n ? this.filteredCommands().length - 1\r\n : this.selectedIndex() - 1;\r\n this.selectedIndex.set(prevIndex);\r\n this.scrollToSelected();\r\n break;\r\n\r\n case \"Enter\":\r\n event.preventDefault();\r\n event.stopPropagation();\r\n const selectedCommand = this.filteredCommands()[this.selectedIndex()];\r\n if (selectedCommand) {\r\n this.executeCommand(selectedCommand);\r\n }\r\n break;\r\n\r\n case \"Escape\":\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.isActive = false;\r\n this.hideTippy();\r\n // Optional: remove the typed \"/\"\r\n const ed = this.editor();\r\n if (ed && this.slashRange) {\r\n const { tr } = ed.state;\r\n tr.delete(this.slashRange.from, this.slashRange.to);\r\n ed.view.dispatch(tr);\r\n }\r\n break;\r\n }\r\n };\r\n\r\n private scrollToSelected() {\r\n // Scroll to the selected element\r\n if (this.menuRef?.nativeElement) {\r\n const selectedItem = this.menuRef.nativeElement.querySelector(\r\n \".slash-command-item.selected\"\r\n ) as HTMLElement;\r\n if (selectedItem) {\r\n selectedItem.scrollIntoView({ block: \"nearest\", behavior: \"smooth\" });\r\n }\r\n }\r\n }\r\n\r\n private showTippy() {\r\n if (this.tippyInstance && this.filteredCommands().length > 0) {\r\n this.tippyInstance.setProps({ sticky: \"reference\" });\r\n this.tippyInstance.show();\r\n }\r\n }\r\n\r\n private hideTippy() {\r\n if (this.tippyInstance) {\r\n this.tippyInstance.setProps({ sticky: false });\r\n this.tippyInstance.hide();\r\n }\r\n }\r\n\r\n executeCommand(command: SlashCommandItem) {\r\n const ed = this.editor();\r\n if (!ed || !this.slashRange) return;\r\n\r\n // Remove slash text (\"/\")\r\n const { tr } = ed.state;\r\n tr.delete(this.slashRange.from, this.slashRange.to);\r\n ed.view.dispatch(tr);\r\n\r\n // Hide menu immediately\r\n this.hideTippy();\r\n this.isActive = false;\r\n\r\n // Give focus back to editor and execute command\r\n // Use a micro-delay to ensure ProseMirror DOM is stable after removing \"/\"\r\n setTimeout(() => {\r\n ed.commands.focus();\r\n command.command(ed);\r\n }, 10);\r\n }\r\n\r\n\r\n\r\n private addKeyboardPlugin(ed: Editor) {\r\n // Add a ProseMirror plugin to intercept keyboard events\r\n const keyboardPlugin = new Plugin({\r\n key: new PluginKey(\"slash-commands-keyboard\"),\r\n props: {\r\n handleKeyDown: (view: EditorView, event: KeyboardEvent) => {\r\n // Only handle if menu is active\r\n if (!this.isActive || this.filteredCommands().length === 0) {\r\n return false;\r\n }\r\n\r\n switch (event.key) {\r\n case \"ArrowDown\":\r\n event.preventDefault();\r\n const nextIndex =\r\n (this.selectedIndex() + 1) % this.filteredCommands().length;\r\n this.selectedIndex.set(nextIndex);\r\n this.scrollToSelected();\r\n return true;\r\n\r\n case \"ArrowUp\":\r\n event.preventDefault();\r\n const prevIndex =\r\n this.selectedIndex() === 0\r\n ? this.filteredCommands().length - 1\r\n : this.selectedIndex() - 1;\r\n this.selectedIndex.set(prevIndex);\r\n this.scrollToSelected();\r\n return true;\r\n\r\n case \"Enter\":\r\n event.preventDefault();\r\n const selectedCommand =\r\n this.filteredCommands()[this.selectedIndex()];\r\n if (selectedCommand) {\r\n this.executeCommand(selectedCommand);\r\n }\r\n return true;\r\n\r\n case \"Escape\":\r\n event.preventDefault();\r\n this.isActive = false;\r\n this.hideTippy();\r\n // Remove typed \"/\"\r\n if (this.slashRange) {\r\n const { tr } = view.state;\r\n tr.delete(this.slashRange.from, this.slashRange.to);\r\n view.dispatch(tr);\r\n }\r\n return true;\r\n }\r\n\r\n return false;\r\n },\r\n },\r\n });\r\n\r\n // Add plugin to editor\r\n ed.view.updateState(\r\n ed.view.state.reconfigure({\r\n plugins: [keyboardPlugin, ...ed.view.state.plugins],\r\n })\r\n );\r\n }\r\n}\r\n","import { Directive } from \"@angular/core\";\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from \"@angular/forms\";\r\n\r\n@Directive({\r\n standalone: true,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n multi: true,\r\n useExisting: NoopValueAccessorDirective,\r\n },\r\n ],\r\n})\r\nexport class NoopValueAccessorDirective implements ControlValueAccessor {\r\n writeValue(obj: any): void {}\r\n registerOnChange(fn: any): void {}\r\n registerOnTouched(fn: any): void {}\r\n}\r\n","import { TextSelection, NodeSelection } from \"@tiptap/pm/state\";\r\nimport { CellSelection } from \"@tiptap/pm/tables\";\r\nimport { StateCalculator } from \"../../models/editor-state.model\";\r\n\r\nexport const SelectionCalculator: StateCalculator = (editor) => {\r\n const { selection } = editor.state;\r\n const { from, to } = selection;\r\n\r\n let selectionType: 'text' | 'node' | 'cell' | 'none' = 'none';\r\n if (selection instanceof TextSelection) selectionType = 'text';\r\n else if (selection instanceof NodeSelection) selectionType = 'node';\r\n else if (selection instanceof CellSelection) selectionType = 'cell';\r\n\r\n let isSingleCell = false;\r\n if (selection instanceof CellSelection) {\r\n isSingleCell = selection.$anchorCell.pos === selection.$headCell.pos;\r\n }\r\n\r\n return {\r\n isFocused: editor.view.hasFocus(),\r\n isEditable: editor.isEditable,\r\n selection: {\r\n type: selectionType,\r\n from,\r\n to,\r\n empty: selection.empty || (selectionType === 'text' && from === to),\r\n isSingleCell: isSingleCell\r\n },\r\n nodes: {\r\n activeNodeName: editor.state.doc.nodeAt(editor.state.selection.$head.pos)?.type.name || null\r\n }\r\n };\r\n};\r\n","import { StateCalculator } from \"../../models/editor-state.model\";\r\nimport { normalizeColor } from \"../../utils/color.utils\";\r\n\r\nexport const MarksCalculator: StateCalculator = (editor) => {\r\n const isCodeBlock = editor.isActive('codeBlock');\r\n const isCode = editor.isActive('code'); // Inline code mark\r\n const isImage = editor.isActive('image') || editor.isActive('resizableImage');\r\n\r\n // Check if marks are generally allowed based on context\r\n const marksAllowed = !isCodeBlock && !isImage;\r\n // For inline code specifically, we don't allow nesting OTHER marks inside it, \r\n // but the code mark ITSELF must be togglable to be removed.\r\n const isInsideInlineCode = isCode;\r\n\r\n // 1. Resolve target element once for this calculation\r\n const getTargetElement = (): Element | null => {\r\n if (typeof window === 'undefined' || !editor.view?.dom) return null;\r\n try {\r\n const { from } = editor.state.selection;\r\n const { node } = editor.view.domAtPos(from);\r\n return node.nodeType === Node.TEXT_NODE ? node.parentElement : (node as Element);\r\n } catch (e) {\r\n return null;\r\n }\r\n };\r\n\r\n const targetEl = getTargetElement() || (typeof window !== 'undefined' ? editor.view?.dom : null);\r\n const computedStyle = (targetEl && typeof window !== 'undefined')\r\n ? window.getComputedStyle(targetEl)\r\n : null;\r\n\r\n // 2. Lightweight helper to extract properties from the pre-calculated style object\r\n const getStyle = (prop: string): string | null => {\r\n if (!computedStyle) return null;\r\n const val = computedStyle.getPropertyValue(prop);\r\n return normalizeColor(val);\r\n };\r\n\r\n const colorMark = editor.getAttributes('textStyle')['color'] || null;\r\n const backgroundMark = editor.getAttributes('highlight')['color'] || null;\r\n\r\n return {\r\n marks: {\r\n bold: editor.isActive('bold'),\r\n italic: editor.isActive('italic'),\r\n underline: editor.isActive('underline'),\r\n strike: editor.isActive('strike'),\r\n code: isCode,\r\n superscript: editor.isActive('superscript'),\r\n subscript: editor.isActive('subscript'),\r\n highlight: editor.isActive('highlight'),\r\n link: editor.isActive('link'),\r\n linkHref: editor.getAttributes('link')['href'] || null,\r\n color: colorMark,\r\n computedColor: colorMark || getStyle('color'),\r\n background: backgroundMark,\r\n computedBackground: backgroundMark || getStyle('background-color'),\r\n linkOpenOnClick: editor.extensionManager.extensions.find(ext => ext.name === 'link')?.options?.openOnClick ?? false,\r\n },\r\n can: {\r\n toggleBold: marksAllowed && !isInsideInlineCode && editor.can().toggleBold(),\r\n toggleItalic: marksAllowed && !isInsideInlineCode && editor.can().toggleItalic(),\r\n toggleUnderline: marksAllowed && !isInsideInlineCode && editor.can().toggleUnderline(),\r\n toggleStrike: marksAllowed && !isInsideInlineCode && editor.can().toggleStrike(),\r\n toggleCode: marksAllowed && editor.can().toggleCode(),\r\n toggleHighlight: marksAllowed && !isInsideInlineCode && editor.can().toggleHighlight(),\r\n toggleLink: marksAllowed && !isInsideInlineCode && (editor.can().setLink({ href: '' }) || editor.can().unsetLink()),\r\n toggleSuperscript: marksAllowed && !isInsideInlineCode && editor.can().toggleSuperscript(),\r\n toggleSubscript: marksAllowed && !isInsideInlineCode && editor.can().toggleSubscript(),\r\n setColor: marksAllowed && !isInsideInlineCode && editor.can().setColor(''),\r\n setHighlight: marksAllowed && !isInsideInlineCode && editor.can().setHighlight(),\r\n undo: editor.can().undo(),\r\n redo: editor.can().redo(),\r\n }\r\n };\r\n};\r\n","import { NodeSelection } from \"@tiptap/pm/state\";\r\nimport { StateCalculator } from \"../../models/editor-state.model\";\r\n\r\nexport const TableCalculator: StateCalculator = (editor) => {\r\n const isTable = editor.isActive('table');\r\n\r\n if (!isTable) {\r\n return {\r\n nodes: {\r\n isTable: false,\r\n isTableCell: false,\r\n isTableHeaderRow: false,\r\n isTableHeaderColumn: false,\r\n }\r\n };\r\n }\r\n\r\n const { selection } = editor.state;\r\n\r\n return {\r\n nodes: {\r\n isTable: true,\r\n isTableNodeSelected: selection instanceof NodeSelection && selection.node.type.name === 'table',\r\n isTableCell: editor.isActive('tableCell') || editor.isActive('tableHeader'),\r\n isTableHeaderRow: editor.isActive('tableHeader', { row: true }),\r\n isTableHeaderColumn: editor.isActive('tableHeader', { column: true }),\r\n },\r\n can: {\r\n addRowBefore: editor.can().addRowBefore(),\r\n addRowAfter: editor.can().addRowAfter(),\r\n deleteRow: editor.can().deleteRow(),\r\n addColumnBefore: editor.can().addColumnBefore(),\r\n addColumnAfter: editor.can().addColumnAfter(),\r\n deleteColumn: editor.can().deleteColumn(),\r\n deleteTable: editor.can().deleteTable(),\r\n mergeCells: editor.can().mergeCells(),\r\n splitCell: editor.can().splitCell(),\r\n toggleHeaderRow: editor.can().toggleHeaderRow(),\r\n toggleHeaderColumn: editor.can().toggleHeaderColumn(),\r\n }\r\n };\r\n};\r\n","import { StateCalculator } from \"../../models/editor-state.model\";\r\n\r\nexport const ImageCalculator: StateCalculator = (editor) => {\r\n return {\r\n nodes: {\r\n isImage: editor.isActive('image') || editor.isActive('resizableImage'),\r\n } as any\r\n };\r\n};\r\n","import { StateCalculator } from \"../../models/editor-state.model\";\r\n\r\nexport const StructureCalculator: StateCalculator = (editor) => {\r\n return {\r\n nodes: {\r\n isBlockquote: editor.isActive('blockquote'),\r\n isCodeBlock: editor.isActive('codeBlock'),\r\n isBulletList: editor.isActive('bulletList'),\r\n isOrderedList: editor.isActive('orderedList'),\r\n h1: editor.isActive('heading', { level: 1 }),\r\n h2: editor.isActive('heading', { level: 2 }),\r\n h3: editor.isActive('heading', { level: 3 }),\r\n alignLeft: editor.isActive({ textAlign: 'left' }),\r\n alignCenter: editor.isActive({ textAlign: 'center' }),\r\n alignRight: editor.isActive({ textAlign: 'right' }),\r\n alignJustify: editor.isActive({ textAlign: 'justify' }),\r\n },\r\n can: {\r\n toggleHeading1: editor.can().toggleHeading({ level: 1 }),\r\n toggleHeading2: editor.can().toggleHeading({ level: 2 }),\r\n toggleHeading3: editor.can().toggleHeading({ level: 3 }),\r\n toggleBulletList: editor.can().toggleBulletList(),\r\n toggleOrderedList: editor.can().toggleOrderedList(),\r\n toggleBlockquote: editor.can().toggleBlockquote(),\r\n toggleCodeBlock: editor.can().toggleCodeBlock(),\r\n setTextAlignLeft: editor.can().setTextAlign('left'),\r\n setTextAlignCenter: editor.can().setTextAlign('center'),\r\n setTextAlignRight: editor.can().setTextAlign('right'),\r\n setTextAlignJustify: editor.can().setTextAlign('justify'),\r\n insertHorizontalRule: editor.can().setHorizontalRule(),\r\n insertTable: editor.can().insertTable(),\r\n insertImage: editor.can().setResizableImage({ src: '' }),\r\n }\r\n };\r\n};\r\n","import { Editor } from '@tiptap/core';\r\nimport { StateCalculator } from '../../models/editor-state.model';\r\n\r\n/**\r\n * DiscoveryCalculator automatically detects and tracks the state of any TipTap extension.\r\n * It provides a \"fallback\" reactive state for any mark or node not explicitly handled \r\n * by specialized calculators.\r\n */\r\nexport const DiscoveryCalculator: StateCalculator = (editor: Editor) => {\r\n const state: { marks: Record<string, boolean>, nodes: Record<string, boolean> } = { marks: {}, nodes: {} };\r\n\r\n // We skip core extensions that are already handled by specialized calculators\r\n // to avoid redundant calculations and maintain precise attribute tracking.\r\n const handled = [\r\n 'bold', 'italic', 'underline', 'strike', 'code', 'link',\r\n 'highlight', 'superscript', 'subscript', 'table', 'image',\r\n 'resizableImage', 'heading', 'bulletList', 'orderedList',\r\n 'blockquote', 'textAlign', 'textStyle', 'color'\r\n ];\r\n\r\n editor.extensionManager.extensions.forEach(extension => {\r\n const name = extension.name;\r\n const type = extension.type;\r\n\r\n // Skip internal/core extensions or already handled ones\r\n if (['selection', 'editable', 'focus', 'undo', 'redo', 'history', 'placeholder', 'characterCount'].includes(name)) {\r\n return;\r\n }\r\n\r\n if (handled.includes(name)) {\r\n return;\r\n }\r\n\r\n if (type === 'mark') {\r\n state.marks[name] = editor.isActive(name);\r\n } else if (type === 'node') {\r\n state.nodes[name] = editor.isActive(name);\r\n }\r\n });\r\n\r\n return state;\r\n};\r\n","import { Extension, getAttributes } from '@tiptap/core';\r\nimport { Plugin, PluginKey } from '@tiptap/pm/state';\r\n\r\nexport const LinkClickBehavior = Extension.create({\r\n name: 'linkClickBehavior',\r\n\r\n addProseMirrorPlugins() {\r\n return [\r\n new Plugin({\r\n key: new PluginKey('linkClickBehavior'),\r\n props: {\r\n handleClick(view, pos, event) {\r\n // handleClick only runs in the browser, but we guard it for absolute SSR safety\r\n if (typeof window === 'undefined') return false;\r\n\r\n // If editor is editable, let TipTap/BubbleMenu handle it\r\n if (view.editable) return false;\r\n\r\n const attrs = getAttributes(view.state, 'link');\r\n if (attrs['href']) {\r\n window.open(attrs['href'], '_blank', 'noopener,noreferrer');\r\n return true;\r\n }\r\n return false;\r\n }\r\n }\r\n })\r\n ];\r\n }\r\n});\r\n","import { ToolbarConfig } from \"../models/toolbar.model\";\r\nimport {\r\n BubbleMenuConfig,\r\n ImageBubbleMenuConfig,\r\n TableBubbleMenuConfig,\r\n CellBubbleMenuConfig,\r\n} from \"../models/bubble-menu.model\";\r\n\r\n// Default toolbar configuration\r\nexport const DEFAULT_TOOLBAR_CONFIG: ToolbarConfig = {\r\n bold: true,\r\n italic: true,\r\n underline: true,\r\n strike: true,\r\n code: true,\r\n codeBlock: true,\r\n superscript: false, // Disabled by default (opt-in)\r\n subscript: false, // Disabled by default (opt-in)\r\n highlight: false, // Disabled by default (opt-in)\r\n highlightPicker: true,\r\n heading1: true,\r\n heading2: true,\r\n heading3: true,\r\n bulletList: true,\r\n orderedList: true,\r\n blockquote: true,\r\n alignLeft: false, // Disabled by default (opt-in)\r\n alignCenter: false, // Disabled by default (opt-in)\r\n alignRight: false, // Disabled by default (opt-in)\r\n alignJustify: false, // Disabled by default (opt-in)\r\n link: true,\r\n image: true,\r\n horizontalRule: false, // Disabled by default (opt-in)\r\n table: true,\r\n undo: true,\r\n redo: true,\r\n clear: false, // Disabled by default (opt-in)\r\n textColor: true,\r\n separator: true,\r\n};\r\n\r\n// Default bubble menu configuration\r\nexport const DEFAULT_BUBBLE_MENU_CONFIG: BubbleMenuConfig = {\r\n bold: true,\r\n italic: true,\r\n underline: true,\r\n strike: true,\r\n code: true,\r\n superscript: false,\r\n subscript: false,\r\n highlight: false,\r\n highlightPicker: true,\r\n textColor: true,\r\n link: true,\r\n separator: true,\r\n};\r\n\r\n// Default image bubble menu configuration\r\nexport const DEFAULT_IMAGE_BUBBLE_MENU_CONFIG: ImageBubbleMenuConfig = {\r\n changeImage: true,\r\n resizeSmall: true,\r\n resizeMedium: true,\r\n resizeLarge: true,\r\n resizeOriginal: true,\r\n deleteImage: true,\r\n separator: true,\r\n};\r\n\r\n// Default table bubble menu configuration\r\nexport const DEFAULT_TABLE_MENU_CONFIG: TableBubbleMenuConfig = {\r\n addRowBefore: true,\r\n addRowAfter: true,\r\n deleteRow: true,\r\n addColumnBefore: true,\r\n addColumnAfter: true,\r\n deleteColumn: true,\r\n toggleHeaderRow: true,\r\n toggleHeaderColumn: true,\r\n deleteTable: true,\r\n separator: true,\r\n};\r\n\r\n// Default cell bubble menu configuration\r\nexport const DEFAULT_CELL_MENU_CONFIG: CellBubbleMenuConfig = {\r\n mergeCells: true,\r\n splitCell: true,\r\n};\r\n","import {\r\n Component,\r\n ElementRef,\r\n input,\r\n output,\r\n OnDestroy,\r\n viewChild,\r\n effect,\r\n signal,\r\n computed,\r\n AfterViewInit,\r\n inject,\r\n DestroyRef,\r\n ChangeDetectionStrategy,\r\n untracked,\r\n} from \"@angular/core\";\r\nimport { takeUntilDestroyed } from \"@angular/core/rxjs-interop\";\r\nimport { Editor, EditorOptions, Extension, Node, Mark } from \"@tiptap/core\";\r\nimport StarterKit from \"@tiptap/starter-kit\";\r\nimport Placeholder from \"@tiptap/extension-placeholder\";\r\nimport CharacterCount from \"@tiptap/extension-character-count\";\r\nimport Underline from \"@tiptap/extension-underline\";\r\nimport Superscript from \"@tiptap/extension-superscript\";\r\nimport Subscript from \"@tiptap/extension-subscript\";\r\nimport TextAlign from \"@tiptap/extension-text-align\";\r\nimport Link from \"@tiptap/extension-link\";\r\nimport Highlight from \"@tiptap/extension-highlight\";\r\nimport TextStyle from \"@tiptap/extension-text-style\";\r\nimport Color from \"@tiptap/extension-color\";\r\nimport OfficePaste from \"@intevation/tiptap-extension-office-paste\";\r\n\r\nimport { ResizableImage } from \"./extensions/resizable-image.extension\";\r\nimport { UploadProgress } from \"./extensions/upload-progress.extension\";\r\nimport { TableExtension } from \"./extensions/table.extension\";\r\nimport { TiptapStateExtension } from \"./extensions/tiptap-state.extension\";\r\nimport { TiptapToolbarComponent } from \"./tiptap-toolbar.component\";\r\nimport { TiptapBubbleMenuComponent } from \"./tiptap-bubble-menu.component\";\r\nimport { TiptapImageBubbleMenuComponent } from \"./tiptap-image-bubble-menu.component\";\r\nimport { TiptapTableBubbleMenuComponent } from \"./tiptap-table-bubble-menu.component\";\r\nimport { TiptapCellBubbleMenuComponent } from \"./tiptap-cell-bubble-menu.component\";\r\nimport { TiptapLinkBubbleMenuComponent } from \"./tiptap-link-bubble-menu.component\";\r\nimport { TiptapColorBubbleMenuComponent } from \"./tiptap-color-bubble-menu.component\";\r\nimport {\r\n TiptapSlashCommandsComponent,\r\n CustomSlashCommands,\r\n} from \"./tiptap-slash-commands.component\";\r\nimport { ImageService, ImageUploadHandler } from \"./services/image.service\";\r\nimport { TiptapI18nService, SupportedLocale } from \"./services/i18n.service\";\r\nimport { EditorCommandsService } from \"./services/editor-commands.service\";\r\nimport { ColorPickerService } from \"./services/color-picker.service\";\r\nimport { LinkService } from \"./services/link.service\";\r\nimport { NoopValueAccessorDirective } from \"./noop-value-accessor.directive\";\r\nimport {\r\n StateCalculator\r\n} from \"./models/editor-state.model\";\r\nimport { NgControl } from \"@angular/forms\";\r\nimport {\r\n filterSlashCommands,\r\n SlashCommandsConfig,\r\n} from \"./config/slash-commands.config\";\r\n\r\nimport { SelectionCalculator } from \"./extensions/calculators/selection.calculator\";\r\nimport { MarksCalculator } from \"./extensions/calculators/marks.calculator\";\r\nimport { TableCalculator } from \"./extensions/calculators/table.calculator\";\r\nimport { ImageCalculator } from \"./extensions/calculators/image.calculator\";\r\nimport { StructureCalculator } from \"./extensions/calculators/structure.calculator\";\r\nimport { DiscoveryCalculator } from \"./extensions/calculators/discovery.calculator\";\r\n\r\nimport { ToolbarConfig } from \"./models/toolbar.model\";\r\nimport {\r\n BubbleMenuConfig,\r\n ImageBubbleMenuConfig,\r\n TableBubbleMenuConfig,\r\n CellBubbleMenuConfig,\r\n} from \"./models/bubble-menu.model\";\r\nimport { LinkClickBehavior } from \"./extensions/link-click-behavior.extension\";\r\nimport {\r\n DEFAULT_TOOLBAR_CONFIG,\r\n DEFAULT_BUBBLE_MENU_CONFIG,\r\n DEFAULT_IMAGE_BUBBLE_MENU_CONFIG,\r\n DEFAULT_TABLE_MENU_CONFIG,\r\n DEFAULT_CELL_MENU_CONFIG,\r\n} from \"./config/editor.config\";\r\nimport { concat, defer, of, tap } from \"rxjs\";\r\n\r\n// Slash commands configuration is handled dynamically via slashCommandsConfigComputed\r\n\r\n@Component({\r\n selector: \"angular-tiptap-editor\",\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n hostDirectives: [NoopValueAccessorDirective],\r\n host: {\r\n '[class.fill-container]': 'fillContainer()',\r\n '[class.floating-toolbar]': 'floatingToolbar()',\r\n '[class.is-readonly]': '!editable() && !mergedDisabled()',\r\n '[class.is-disabled]': 'mergedDisabled()',\r\n '[style.--ate-border-width]': \"seamless() || mergedDisabled() ? '0' : null\",\r\n '[style.--ate-background]': \"seamless() ? 'transparent' : (mergedDisabled() ? 'var(--ate-surface-tertiary)' : null)\",\r\n '[style.--ate-toolbar-border-color]': \"seamless() ? 'transparent' : null\",\r\n '[style.--ate-counter-background]': \"seamless() ? 'transparent' : null\",\r\n '[style.--ate-counter-border-color]': \"seamless() ? 'transparent' : null\",\r\n },\r\n imports: [\r\n TiptapToolbarComponent,\r\n TiptapBubbleMenuComponent,\r\n TiptapImageBubbleMenuComponent,\r\n TiptapTableBubbleMenuComponent,\r\n TiptapCellBubbleMenuComponent,\r\n TiptapSlashCommandsComponent,\r\n TiptapLinkBubbleMenuComponent,\r\n TiptapColorBubbleMenuComponent,\r\n ],\r\n providers: [\r\n EditorCommandsService,\r\n ImageService,\r\n ColorPickerService,\r\n LinkService,\r\n ],\r\n template: `\r\n <div class=\"tiptap-editor\">\r\n <!-- Toolbar -->\r\n @if (editable() && !mergedDisabled() && showToolbar() && editor()) {\r\n <tiptap-toolbar \r\n [editor]=\"editor()!\" \r\n [config]=\"toolbarConfig()\"\r\n [imageUpload]=\"imageUploadConfig()\"\r\n [floating]=\"floatingToolbar()\"\r\n (mouseenter)=\"hideBubbleMenus()\"\r\n (mouseleave)=\"showBubbleMenus()\"\r\n />\r\n }\r\n\r\n <!-- Editor Content -->\r\n <div\r\n #editorElement\r\n class=\"tiptap-content\"\r\n [class.drag-over]=\"isDragOver()\"\r\n (dragover)=\"onDragOver($event)\"\r\n (drop)=\"onDrop($event)\"\r\n (click)=\"onEditorClick($event)\"\r\n ></div>\r\n\r\n <!-- Text Bubble Menu -->\r\n @if (editable() && showBubbleMenu() && editor()) {\r\n <tiptap-bubble-menu\r\n [editor]=\"editor()!\"\r\n [config]=\"bubbleMenuConfig()\"\r\n [style.display]=\"editorFullyInitialized() ? 'block' : 'none'\"\r\n ></tiptap-bubble-menu>\r\n }\r\n\r\n <!-- Image Bubble Menu -->\r\n @if (editable() && showImageBubbleMenu() && editor()) {\r\n <tiptap-image-bubble-menu\r\n [editor]=\"editor()!\"\r\n [config]=\"imageBubbleMenuConfig()\"\r\n [style.display]=\"editorFullyInitialized() ? 'block' : 'none'\"\r\n ></tiptap-image-bubble-menu>\r\n }\r\n\r\n <!-- Link Bubble Menu -->\r\n @if (editable() && editor()) {\r\n <tiptap-link-bubble-menu\r\n [editor]=\"editor()!\"\r\n [style.display]=\"editorFullyInitialized() ? 'block' : 'none'\"\r\n ></tiptap-link-bubble-menu>\r\n }\r\n\r\n <!-- Color Bubble Menu -->\r\n @if (editable() && editor()) {\r\n <tiptap-color-bubble-menu\r\n [editor]=\"editor()!\"\r\n [style.display]=\"editorFullyInitialized() ? 'block' : 'none'\"\r\n ></tiptap-color-bubble-menu>\r\n }\r\n\r\n <!-- Slash Commands -->\r\n @if (editable() && enableSlashCommands() && editor()) {\r\n <tiptap-slash-commands\r\n [editor]=\"editor()!\"\r\n [config]=\"slashCommandsConfigComputed()\"\r\n [style.display]=\"editorFullyInitialized() ? 'block' : 'none'\"\r\n ></tiptap-slash-commands>\r\n }\r\n\r\n <!-- Table Menu -->\r\n @if (editable() && editor()) {\r\n <tiptap-table-bubble-menu\r\n [editor]=\"editor()!\"\r\n [config]=\"tableBubbleMenuConfig()\"\r\n [style.display]=\"editorFullyInitialized() ? 'block' : 'none'\"\r\n ></tiptap-table-bubble-menu>\r\n }\r\n\r\n <!-- Cell Menu -->\r\n @if (editable() && editor()) {\r\n <tiptap-cell-bubble-menu\r\n [editor]=\"editor()!\"\r\n [config]=\"cellBubbleMenuConfig()\"\r\n [style.display]=\"editorFullyInitialized() ? 'block' : 'none'\"\r\n ></tiptap-cell-bubble-menu>\r\n }\r\n\r\n <!-- Counters -->\r\n @if (editable() && !mergedDisabled() && showFooter() && (showCharacterCount() || showWordCount())) {\r\n <div class=\"character-count\" [class.limit-reached]=\"maxCharacters() && characterCount() >= maxCharacters()!\">\r\n @if (showCharacterCount()) {\r\n {{ characterCount() }}\r\n {{ currentTranslations().editor.character }}{{ characterCount() > 1 ? \"s\" : \"\" }}\r\n @if (maxCharacters()) {\r\n / {{ maxCharacters() }}\r\n }\r\n }\r\n \r\n @if (showCharacterCount() && showWordCount()) {\r\n , \r\n }\r\n\r\n @if (showWordCount()) {\r\n {{ wordCount() }}\r\n {{ currentTranslations().editor.word }}{{ wordCount() > 1 ? \"s\" : \"\" }}\r\n }\r\n </div>\r\n }\r\n </div>\r\n `,\r\n\r\n styles: [\r\n `\r\n /* ========================================\r\n CSS Custom Properties (Variables)\r\n Override these to customize the editor\r\n ======================================== */\r\n :host {\r\n /* ===== BASE TOKENS (customize these for easy theming) ===== */\r\n --ate-primary: #2563eb;\r\n --ate-primary-contrast: #ffffff;\r\n --ate-primary-light: color-mix(in srgb, var(--ate-primary), transparent 90%);\r\n --ate-primary-lighter: color-mix(in srgb, var(--ate-primary), transparent 95%);\r\n --ate-primary-light-alpha: color-mix(in srgb, var(--ate-primary), transparent 85%);\r\n \r\n --ate-surface: #ffffff;\r\n --ate-surface-secondary: #f8f9fa;\r\n --ate-surface-tertiary: #f1f5f9;\r\n \r\n --ate-text: #2d3748;\r\n --ate-text-secondary: #64748b;\r\n --ate-text-muted: #a0aec0;\r\n \r\n --ate-border: #e2e8f0;\r\n \r\n --ate-highlight-bg: #fef08a;\r\n --ate-highlight-color: #854d0e;\r\n \r\n --ate-button-hover: #f1f5f9;\r\n --ate-button-active: #e2e8f0;\r\n\r\n --ate-error-color: #c53030;\r\n --ate-error-bg: #fed7d7;\r\n --ate-error-border: #feb2b2;\r\n \r\n /* ===== COMPONENT TOKENS (use base tokens by default) ===== */\r\n /* Border & Container */\r\n --ate-border-color: var(--ate-border);\r\n --ate-border-width: 2px;\r\n --ate-border-radius: 12px;\r\n --ate-focus-color: var(--ate-primary);\r\n --ate-background: var(--ate-surface);\r\n --ate-sub-border-radius: 8px;\r\n \r\n /* Content */\r\n --ate-text-color: var(--ate-text);\r\n --ate-placeholder-color: var(--ate-text-muted);\r\n --ate-line-height: 1.6;\r\n --ate-content-padding: 16px;\r\n\r\n /* ===== MENUS (Slash/Bubble) ===== */\r\n --ate-menu-bg: var(--ate-surface-secondary);\r\n --ate-menu-border: var(--ate-border);\r\n --ate-menu-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);\r\n --ate-menu-padding: 6px;\r\n \r\n /* Toolbar */\r\n --ate-toolbar-padding: var(--ate-menu-padding);\r\n --ate-toolbar-background: var(--ate-surface-secondary);\r\n --ate-toolbar-border-color: var(--ate-border);\r\n --ate-toolbar-button-color: var(--ate-text-secondary);\r\n --ate-toolbar-button-hover-background: transparent;\r\n --ate-toolbar-button-active-background: var(--ate-primary-light);\r\n --ate-toolbar-button-active-color: var(--ate-primary);\r\n \r\n /* Counter */\r\n --ate-counter-color: var(--ate-text-secondary);\r\n --ate-counter-background: var(--ate-surface-secondary);\r\n --ate-counter-border-color: var(--ate-border);\r\n \r\n /* Drag & Drop */\r\n --ate-drag-background: #f0f8ff;\r\n --ate-drag-border-color: var(--ate-primary);\r\n \r\n /* Blockquote */\r\n --ate-blockquote-border-color: var(--ate-border);\r\n --ate-blockquote-background: var(--ate-surface-secondary);\r\n \r\n /* Code */\r\n --ate-code-background: var(--ate-surface-secondary);\r\n --ate-code-color: var(--ate-text-secondary);\r\n --ate-code-border-color: var(--ate-border);\r\n \r\n --ate-code-block-background: #0f172a;\r\n --ate-code-block-color: #e2e8f0;\r\n --ate-code-block-border-color: var(--ate-border);\r\n \r\n /* Images */\r\n --ate-image-border-radius: var(--ate-sub-border-radius);\r\n --ate-image-selected-color: var(--ate-primary);\r\n \r\n /* Scrollbars */\r\n --ate-scrollbar-width: 10px;\r\n --ate-scrollbar-thumb: var(--ate-border);\r\n --ate-scrollbar-thumb-hover: var(--ate-text-muted);\r\n --ate-scrollbar-track: transparent;\r\n \r\n /* Tables */\r\n --ate-table-border-color: var(--ate-border);\r\n --ate-table-header-background: var(--ate-surface-secondary);\r\n --ate-table-header-color: var(--ate-text);\r\n --ate-table-cell-background: var(--ate-surface);\r\n --ate-table-cell-selected-background: var(--ate-primary-light);\r\n --ate-table-resize-handle-color: var(--ate-primary);\r\n --ate-table-row-hover-background: var(--ate-primary-lighter);\r\n }\r\n\r\n /* Manual dark mode with class or data attribute */\r\n :host(.dark),\r\n :host([data-theme=\"dark\"]) {\r\n /* ===== DARK BASE TOKENS ===== */\r\n --ate-primary: #3b82f6;\r\n --ate-primary-contrast: #ffffff;\r\n --ate-primary-light: color-mix(in srgb, var(--ate-primary), transparent 85%);\r\n --ate-primary-lighter: color-mix(in srgb, var(--ate-primary), transparent 92%);\r\n --ate-primary-light-alpha: color-mix(in srgb, var(--ate-primary), transparent 80%);\r\n \r\n --ate-surface: #020617;\r\n --ate-surface-secondary: #0f172a;\r\n --ate-surface-tertiary: #1e293b;\r\n \r\n --ate-text: #f8fafc;\r\n --ate-text-secondary: #94a3b8;\r\n --ate-text-muted: #64748b;\r\n \r\n --ate-border: #1e293b;\r\n \r\n --ate-highlight-bg: #854d0e;\r\n --ate-highlight-color: #fef08a;\r\n\r\n --ate-button-hover: #1e293b;\r\n --ate-button-active: #0f172a;\r\n\r\n /* ===== MENUS (Slash/Bubble) ===== */\r\n --ate-menu-border: rgba(255, 255, 255, 0.1);\r\n --ate-menu-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.3), 0 10px 10px -5px rgba(0, 0, 0, 0.2);\r\n\r\n --ate-error-color: #f87171;\r\n --ate-error-bg: #450a0a;\r\n --ate-error-border: #7f1d1d;\r\n \r\n /* ===== DARK COMPONENT OVERRIDES ===== */\r\n --ate-drag-background: var(--ate-surface-tertiary);\r\n --ate-drag-border-color: var(--ate-primary);\r\n --ate-blockquote-border-color: var(--ate-primary);\r\n --ate-toolbar-button-active-background: var(--ate-primary-light);\r\n --ate-toolbar-button-active-color: var(--ate-primary);\r\n --ate-button-hover: var(--ate-surface-tertiary);\r\n --ate-button-active: var(--ate-surface-secondary);\r\n --ate-scrollbar-thumb: var(--ate-surface-tertiary);\r\n --ate-scrollbar-thumb-hover: var(--ate-text-muted);\r\n }\r\n\r\n /* Host styles pour fillContainer */\r\n :host(.fill-container) {\r\n display: block;\r\n height: 100%;\r\n }\r\n\r\n /* Main editor container */\r\n .tiptap-editor {\r\n border: var(--ate-border-width) solid var(--ate-border-color);\r\n border-radius: var(--ate-border-radius);\r\n background: var(--ate-background);\r\n overflow: hidden;\r\n transition: border-color 0.2s ease;\r\n position: relative;\r\n }\r\n\r\n /* Floating Toolbar Mode */\r\n :host(.floating-toolbar) .tiptap-editor {\r\n overflow: visible;\r\n }\r\n\r\n /* Fill container mode - editor fills its parent */\r\n :host(.fill-container) .tiptap-editor {\r\n display: flex;\r\n flex-direction: column;\r\n height: 100%;\r\n }\r\n\r\n :host(.fill-container) .tiptap-content {\r\n flex: 1;\r\n min-height: 0;\r\n overflow-y: auto;\r\n }\r\n\r\n .tiptap-editor:focus-within {\r\n border-color: var(--ate-focus-color);\r\n }\r\n\r\n /* Editor content area */\r\n .tiptap-content {\r\n min-height: var(--editor-min-height, 200px);\r\n height: var(--editor-height, auto);\r\n max-height: var(--editor-max-height, none);\r\n overflow-y: var(--editor-overflow, visible);\r\n outline: none;\r\n position: relative;\r\n scrollbar-width: thin;\r\n scrollbar-color: var(--ate-scrollbar-thumb) var(--ate-scrollbar-track);\r\n }\r\n\r\n :host(.is-disabled) .tiptap-content {\r\n cursor: not-allowed;\r\n opacity: 0.7;\r\n user-select: none;\r\n pointer-events: none;\r\n background-color: var(--ate-surface-tertiary);\r\n }\r\n\r\n :host(.is-readonly) .tiptap-content {\r\n cursor: default;\r\n user-select: text;\r\n }\r\n\r\n :host(.is-readonly) .tiptap-content ::ng-deep .tiptap-link {\r\n cursor: pointer;\r\n pointer-events: auto;\r\n }\r\n\r\n .tiptap-content::-webkit-scrollbar {\r\n width: var(--ate-scrollbar-width);\r\n height: var(--ate-scrollbar-width);\r\n }\r\n\r\n .tiptap-content::-webkit-scrollbar-track {\r\n background: var(--ate-scrollbar-track);\r\n }\r\n\r\n .tiptap-content::-webkit-scrollbar-thumb {\r\n background: var(--ate-scrollbar-thumb);\r\n border: 3px solid transparent;\r\n background-clip: content-box;\r\n border-radius: 10px;\r\n }\r\n\r\n .tiptap-content::-webkit-scrollbar-thumb:hover {\r\n background: var(--ate-scrollbar-thumb-hover);\r\n background-clip: content-box;\r\n }\r\n\r\n .tiptap-content.drag-over {\r\n background: var(--ate-drag-background);\r\n border: 2px dashed var(--ate-drag-border-color);\r\n }\r\n\r\n /* Compteur de caractères */\r\n .character-count {\r\n padding: 8px var(--ate-content-padding);\r\n font-size: 12px;\r\n color: var(--ate-counter-color);\r\n text-align: right;\r\n border-top: 1px solid var(--ate-counter-border-color);\r\n background: var(--ate-counter-background);\r\n transition: color 0.2s ease;\r\n border-bottom-left-radius: calc(var(--ate-border-radius) - var(--ate-border-width));\r\n border-bottom-right-radius: calc(var(--ate-border-radius) - var(--ate-border-width));\r\n }\r\n\r\n .character-count.limit-reached {\r\n color: var(--ate-error-color, #ef4444);\r\n font-weight: 600;\r\n }\r\n\r\n /* Styles ProseMirror avec :host ::ng-deep */\r\n :host ::ng-deep .ProseMirror {\r\n padding: var(--ate-content-padding);\r\n outline: none;\r\n line-height: var(--ate-line-height);\r\n color: var(--ate-text-color);\r\n min-height: 100%;\r\n height: 100%;\r\n /* S'assurer que le contenu s'étend correctement dans un conteneur scrollable */\r\n word-wrap: break-word;\r\n overflow-wrap: break-word;\r\n }\r\n\r\n /* Titres */\r\n :host ::ng-deep .ProseMirror h1 {\r\n font-size: 2em;\r\n font-weight: bold;\r\n margin-top: 0;\r\n margin-bottom: 0.5em;\r\n }\r\n\r\n :host ::ng-deep .ProseMirror h2 {\r\n font-size: 1.5em;\r\n font-weight: bold;\r\n margin-top: 1em;\r\n margin-bottom: 0.5em;\r\n }\r\n\r\n :host ::ng-deep .ProseMirror h3 {\r\n font-size: 1.25em;\r\n font-weight: bold;\r\n margin-top: 1em;\r\n margin-bottom: 0.5em;\r\n }\r\n\r\n /* Paragraphes et listes */\r\n :host ::ng-deep .ProseMirror p {\r\n margin: 0.5em 0;\r\n }\r\n\r\n :host ::ng-deep .ProseMirror ul,\r\n :host ::ng-deep .ProseMirror ol {\r\n padding-left: 2em;\r\n margin: 0.5em 0;\r\n }\r\n\r\n /* Citations */\r\n :host ::ng-deep .ProseMirror blockquote {\r\n border-left: 4px solid var(--ate-blockquote-border-color);\r\n padding-left: 1em;\r\n margin: 1em 0;\r\n background: var(--ate-blockquote-background);\r\n padding: 0.5em 1em;\r\n border-radius: 0 4px 4px 0;\r\n }\r\n\r\n /* Code */\r\n :host ::ng-deep .ProseMirror code {\r\n background: var(--ate-code-background);\r\n color: var(--ate-code-color);\r\n border: 1px solid var(--ate-code-border-color);\r\n padding: 0.15em 0.4em;\r\n border-radius: 4px;\r\n font-family: \"JetBrains Mono\", \"Fira Code\", \"Monaco\", \"Consolas\", monospace;\r\n font-size: 0.85em;\r\n font-weight: 500;\r\n }\r\n\r\n :host ::ng-deep .ProseMirror pre {\r\n background: var(--ate-code-block-background);\r\n color: var(--ate-code-block-color);\r\n border: 1px solid var(--ate-code-block-border-color);\r\n padding: 1em;\r\n border-radius: var(--ate-border-radius);\r\n overflow-x: auto;\r\n margin: 1em 0;\r\n }\r\n\r\n :host ::ng-deep .ProseMirror pre code {\r\n background: none;\r\n color: inherit;\r\n border: none;\r\n padding: 0;\r\n }\r\n\r\n /* Placeholder */\r\n :host ::ng-deep .ProseMirror p.is-editor-empty:first-child::before {\r\n content: attr(data-placeholder);\r\n color: var(--ate-placeholder-color);\r\n pointer-events: none;\r\n float: left;\r\n height: 0;\r\n }\r\n\r\n /* Mode lecture seule */\r\n :host ::ng-deep .ProseMirror[contenteditable=\"false\"] {\r\n pointer-events: none;\r\n }\r\n\r\n :host ::ng-deep .ProseMirror[contenteditable=\"false\"] img {\r\n cursor: default;\r\n pointer-events: none;\r\n }\r\n\r\n :host ::ng-deep .ProseMirror[contenteditable=\"false\"] img:hover {\r\n transform: none;\r\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\r\n }\r\n\r\n :host\r\n ::ng-deep\r\n .ProseMirror[contenteditable=\"false\"]\r\n img.ProseMirror-selectednode {\r\n outline: none;\r\n }\r\n\r\n /* Styles pour les images */\r\n :host ::ng-deep .ProseMirror img {\r\n position: relative;\r\n display: inline-block;\r\n max-width: 100%;\r\n height: auto;\r\n cursor: pointer;\r\n transition: all 0.2s ease;\r\n border: 2px solid transparent;\r\n border-radius: var(--ate-image-border-radius);\r\n }\r\n\r\n :host ::ng-deep .ProseMirror img:hover {\r\n border-color: var(--ate-border-color);\r\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\r\n }\r\n\r\n :host ::ng-deep .ProseMirror img.ProseMirror-selectednode {\r\n border-color: var(--ate-image-selected-color);\r\n box-shadow: 0 0 0 3px var(--ate-primary-light-alpha);\r\n transition: all 0.2s ease;\r\n }\r\n\r\n /* Images avec classe tiptap-image */\r\n :host ::ng-deep .ProseMirror .tiptap-image {\r\n max-width: 100%;\r\n height: auto;\r\n border-radius: 16px;\r\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08);\r\n margin: 0.5em 0;\r\n cursor: pointer;\r\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\r\n display: block;\r\n filter: brightness(1) contrast(1);\r\n }\r\n\r\n :host ::ng-deep .ProseMirror .tiptap-image:hover {\r\n box-shadow: 0 8px 30px rgba(0, 0, 0, 0.12);\r\n filter: brightness(1.02) contrast(1.02);\r\n }\r\n\r\n :host ::ng-deep .ProseMirror .tiptap-image.ProseMirror-selectednode {\r\n outline: 2px solid var(--ate-primary);\r\n outline-offset: 2px;\r\n border-radius: 16px;\r\n box-shadow: 0 0 0 4px var(--ate-primary-light-alpha);\r\n }\r\n\r\n /* Conteneurs d'images avec alignement */\r\n :host ::ng-deep .image-container {\r\n margin: 0.5em 0;\r\n text-align: center;\r\n border-radius: 16px;\r\n overflow: hidden;\r\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\r\n }\r\n\r\n :host ::ng-deep .image-container.image-align-left {\r\n text-align: left;\r\n }\r\n\r\n :host ::ng-deep .image-container.image-align-center {\r\n text-align: center;\r\n }\r\n\r\n :host ::ng-deep .image-container.image-align-right {\r\n text-align: right;\r\n }\r\n\r\n :host ::ng-deep .image-container img {\r\n display: inline-block;\r\n max-width: 100%;\r\n height: auto;\r\n border-radius: 16px;\r\n }\r\n\r\n /* Conteneur pour les images redimensionnables */\r\n :host ::ng-deep .resizable-image-container {\r\n position: relative;\r\n display: inline-block;\r\n margin: 0.5em 0;\r\n }\r\n\r\n /* Conteneur des contrôles de redimensionnement */\r\n :host ::ng-deep .resize-controls {\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n bottom: 0;\r\n pointer-events: none;\r\n z-index: 1000;\r\n }\r\n\r\n /* Poignées de redimensionnement */\r\n :host ::ng-deep .resize-handle {\r\n position: absolute;\r\n width: 12px;\r\n height: 12px;\r\n background: var(--ate-primary);\r\n border: 2px solid var(--ate-surface);\r\n border-radius: 50%;\r\n pointer-events: all;\r\n cursor: pointer;\r\n z-index: 1001;\r\n transition: all 0.15s ease;\r\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.2);\r\n }\r\n\r\n :host ::ng-deep .resize-handle:hover {\r\n background: var(--ate-primary);\r\n box-shadow: 0 3px 8px rgba(0, 0, 0, 0.3);\r\n }\r\n\r\n :host ::ng-deep .resize-handle:active {\r\n background: var(--ate-primary);\r\n }\r\n\r\n /* Poignées du milieu avec scale séparé */\r\n :host ::ng-deep .resize-handle-n:hover,\r\n :host ::ng-deep .resize-handle-s:hover {\r\n transform: translateX(-50%) scale(1.2);\r\n }\r\n\r\n :host ::ng-deep .resize-handle-w:hover,\r\n :host ::ng-deep .resize-handle-e:hover {\r\n transform: translateY(-50%) scale(1.2);\r\n }\r\n\r\n :host ::ng-deep .resize-handle-n:active,\r\n :host ::ng-deep .resize-handle-s:active {\r\n transform: translateX(-50%) scale(0.9);\r\n }\r\n\r\n :host ::ng-deep .resize-handle-w:active,\r\n :host ::ng-deep .resize-handle-e:active {\r\n transform: translateY(-50%) scale(0.9);\r\n }\r\n\r\n /* Poignées des coins avec scale simple */\r\n :host ::ng-deep .resize-handle-nw:hover,\r\n :host ::ng-deep .resize-handle-ne:hover,\r\n :host ::ng-deep .resize-handle-sw:hover,\r\n :host ::ng-deep .resize-handle-se:hover {\r\n transform: scale(1.2);\r\n }\r\n\r\n :host ::ng-deep .resize-handle-nw:active,\r\n :host ::ng-deep .resize-handle-ne:active,\r\n :host ::ng-deep .resize-handle-sw:active,\r\n :host ::ng-deep .resize-handle-se:active {\r\n transform: scale(0.9);\r\n }\r\n\r\n /* Positions spécifiques pour chaque poignée */\r\n :host ::ng-deep .resize-handle-nw {\r\n top: 0;\r\n left: -6px;\r\n cursor: nw-resize;\r\n }\r\n :host ::ng-deep .resize-handle-n {\r\n top: 0;\r\n left: 50%;\r\n transform: translateX(-50%);\r\n cursor: n-resize;\r\n }\r\n :host ::ng-deep .resize-handle-ne {\r\n top: 0;\r\n right: -6px;\r\n cursor: ne-resize;\r\n }\r\n :host ::ng-deep .resize-handle-w {\r\n top: 50%;\r\n left: -6px;\r\n transform: translateY(-50%);\r\n cursor: w-resize;\r\n }\r\n :host ::ng-deep .resize-handle-e {\r\n top: 50%;\r\n right: -6px;\r\n transform: translateY(-50%);\r\n cursor: e-resize;\r\n }\r\n :host ::ng-deep .resize-handle-sw {\r\n bottom: 0;\r\n left: -6px;\r\n cursor: sw-resize;\r\n }\r\n :host ::ng-deep .resize-handle-s {\r\n bottom: 0;\r\n left: 50%;\r\n transform: translateX(-50%);\r\n cursor: s-resize;\r\n }\r\n :host ::ng-deep .resize-handle-se {\r\n bottom: 0;\r\n right: -6px;\r\n cursor: se-resize;\r\n }\r\n\r\n /* Styles pour le redimensionnement en cours */\r\n :host ::ng-deep body.resizing {\r\n user-select: none;\r\n cursor: crosshair;\r\n }\r\n\r\n :host ::ng-deep body.resizing .ProseMirror {\r\n pointer-events: none;\r\n }\r\n\r\n :host ::ng-deep body.resizing .ProseMirror .tiptap-image {\r\n pointer-events: none;\r\n }\r\n\r\n /* Styles pour les informations de taille d'image */\r\n :host ::ng-deep .image-size-info {\r\n position: absolute;\r\n bottom: -20px;\r\n left: 50%;\r\n transform: translateX(-50%);\r\n background: rgba(0, 0, 0, 0.8);\r\n color: white;\r\n padding: 2px 6px;\r\n border-radius: 3px;\r\n font-size: 11px;\r\n white-space: nowrap;\r\n opacity: 0;\r\n transition: opacity 0.2s ease;\r\n }\r\n\r\n :host ::ng-deep .image-container:hover .image-size-info {\r\n opacity: 1;\r\n }\r\n /* Styles pour les tables */\r\n :host ::ng-deep .ProseMirror table {\r\n border-collapse: separate;\r\n border-spacing: 0;\r\n margin: 0;\r\n table-layout: fixed;\r\n width: 100%;\r\n border-radius: 8px;\r\n overflow: hidden;\r\n }\r\n\r\n :host ::ng-deep .ProseMirror table td,\r\n :host ::ng-deep .ProseMirror table th {\r\n border: none;\r\n border-right: 1px solid var(--ate-table-border-color);\r\n border-bottom: 1px solid var(--ate-table-border-color);\r\n box-sizing: border-box;\r\n min-width: 1em;\r\n padding: 8px 12px;\r\n position: relative;\r\n vertical-align: top;\r\n text-align: left;\r\n }\r\n\r\n :host ::ng-deep .ProseMirror table td {\r\n background: var(--ate-table-cell-background);\r\n }\r\n\r\n /* Ajouter les bordures externes manquantes pour former la bordure du tableau */\r\n :host ::ng-deep .ProseMirror table td:first-child,\r\n :host ::ng-deep .ProseMirror table th:first-child {\r\n border-left: 1px solid var(--ate-table-border-color);\r\n }\r\n\r\n :host ::ng-deep .ProseMirror table tr:first-child td,\r\n :host ::ng-deep .ProseMirror table tr:first-child th {\r\n border-top: 1px solid var(--ate-table-border-color);\r\n }\r\n\r\n /* Coins arrondis */\r\n :host ::ng-deep .ProseMirror table tr:first-child th:first-child {\r\n border-top-left-radius: 8px;\r\n }\r\n\r\n :host ::ng-deep .ProseMirror table tr:first-child th:last-child {\r\n border-top-right-radius: 8px;\r\n }\r\n\r\n :host ::ng-deep .ProseMirror table tr:last-child td:first-child {\r\n border-bottom-left-radius: 8px;\r\n }\r\n\r\n :host ::ng-deep .ProseMirror table tr:last-child td:last-child {\r\n border-bottom-right-radius: 8px;\r\n }\r\n\r\n /* En-têtes de table */\r\n :host ::ng-deep .ProseMirror table th {\r\n background: var(--ate-table-header-background);\r\n font-weight: 600;\r\n color: var(--ate-table-header-color);\r\n }\r\n\r\n /* Cellules sélectionnées */\r\n :host ::ng-deep .ProseMirror table .selectedCell:after {\r\n background: var(--ate-table-cell-selected-background);\r\n content: \"\";\r\n left: 0;\r\n right: 0;\r\n top: 0;\r\n bottom: 0;\r\n pointer-events: none;\r\n position: absolute;\r\n z-index: 2;\r\n }\r\n\r\n /* Poignées de redimensionnement */\r\n :host ::ng-deep .ProseMirror table .column-resize-handle {\r\n position: absolute;\r\n right: -2px;\r\n top: 0;\r\n bottom: 0;\r\n width: 4px;\r\n background-color: var(--ate-table-resize-handle-color);\r\n opacity: 0;\r\n transition: opacity 0.2s ease;\r\n }\r\n\r\n :host ::ng-deep .ProseMirror table:hover .column-resize-handle {\r\n opacity: 1;\r\n }\r\n\r\n :host ::ng-deep .ProseMirror table .column-resize-handle:hover {\r\n background-color: var(--ate-focus-color);\r\n }\r\n\r\n /* Container avec scroll horizontal */\r\n :host ::ng-deep .ProseMirror .tableWrapper {\r\n overflow-x: auto;\r\n margin: 1em 0;\r\n border-radius: 8px;\r\n }\r\n\r\n :host ::ng-deep .ProseMirror .tableWrapper table {\r\n margin: 0;\r\n border-radius: 8px;\r\n min-width: 600px;\r\n overflow: hidden;\r\n }\r\n\r\n /* Paragraphes dans les tables */\r\n :host ::ng-deep .ProseMirror table p {\r\n margin: 0;\r\n }\r\n\r\n /* Styles pour les lignes avec hover */\r\n :host ::ng-deep .ProseMirror table tbody tr:hover td {\r\n background-color: var(--ate-table-row-hover-background);\r\n }\r\n `,\r\n ],\r\n})\r\nexport class AngularTiptapEditorComponent implements AfterViewInit, OnDestroy {\r\n content = input<string>(\"\");\r\n placeholder = input<string>(\"\");\r\n editable = input<boolean>(true);\r\n disabled = input<boolean>(false);\r\n minHeight = input<number>(200);\r\n height = input<number | undefined>(undefined);\r\n maxHeight = input<number | undefined>(undefined);\r\n fillContainer = input<boolean>(false);\r\n showToolbar = input<boolean>(true);\r\n showFooter = input<boolean>(true);\r\n showCharacterCount = input<boolean>(true);\r\n showWordCount = input<boolean>(true);\r\n maxCharacters = input<number | undefined>(undefined);\r\n enableOfficePaste = input<boolean>(true);\r\n enableSlashCommands = input<boolean>(true);\r\n slashCommands = input<SlashCommandsConfig>({});\r\n customSlashCommands = input<CustomSlashCommands | undefined>(undefined);\r\n locale = input<SupportedLocale | undefined>(undefined);\r\n autofocus = input<boolean | 'start' | 'end' | 'all' | number>(false);\r\n seamless = input<boolean>(false);\r\n floatingToolbar = input<boolean>(false);\r\n\r\n tiptapExtensions = input<(Extension | Node | Mark)[]>([]);\r\n tiptapOptions = input<Partial<EditorOptions>>({});\r\n\r\n // Nouveaux inputs pour les bubble menus\r\n showBubbleMenu = input<boolean>(true);\r\n bubbleMenu = input<Partial<BubbleMenuConfig>>(DEFAULT_BUBBLE_MENU_CONFIG);\r\n showImageBubbleMenu = input<boolean>(true);\r\n imageBubbleMenu = input<Partial<ImageBubbleMenuConfig>>(\r\n DEFAULT_IMAGE_BUBBLE_MENU_CONFIG\r\n );\r\n\r\n // Configuration de la toolbar\r\n toolbar = input<Partial<ToolbarConfig>>({});\r\n\r\n // Configuration des menus de table\r\n showTableBubbleMenu = input<boolean>(true);\r\n tableBubbleMenu = input<Partial<TableBubbleMenuConfig>>(DEFAULT_TABLE_MENU_CONFIG);\r\n showCellBubbleMenu = input<boolean>(true);\r\n cellBubbleMenu = input<Partial<CellBubbleMenuConfig>>(DEFAULT_CELL_MENU_CONFIG);\r\n\r\n /**\r\n * Additionnal state calculators to extend the reactive editor state.\r\n */\r\n stateCalculators = input<StateCalculator[]>([]);\r\n\r\n // Nouveau input pour la configuration de l'upload d'images\r\n imageUpload = input<Partial<any>>({});\r\n\r\n /**\r\n * Custom handler for image uploads.\r\n * When provided, images will be processed through this handler instead of being converted to base64.\r\n * This allows you to upload images to your own server/storage and use the returned URL.\r\n *\r\n * @example\r\n * ```typescript\r\n * myUploadHandler: ImageUploadHandler = async (context) => {\r\n * const formData = new FormData();\r\n * formData.append('image', context.file);\r\n * const response = await fetch('/api/upload', { method: 'POST', body: formData });\r\n * const data = await response.json();\r\n * return { src: data.imageUrl };\r\n * };\r\n *\r\n * // In template:\r\n * // <angular-tiptap-editor [imageUploadHandler]=\"myUploadHandler\" />\r\n * ```\r\n */\r\n imageUploadHandler = input<ImageUploadHandler | undefined>(undefined);\r\n\r\n // Nouveaux outputs\r\n contentChange = output<string>();\r\n editorCreated = output<Editor>();\r\n editorUpdate = output<{ editor: Editor; transaction: any }>();\r\n editorFocus = output<{ editor: Editor; event: FocusEvent }>();\r\n editorBlur = output<{ editor: Editor; event: FocusEvent }>();\r\n\r\n // ViewChild with signal\r\n editorElement = viewChild.required<ElementRef>(\"editorElement\");\r\n\r\n // ============================================\r\n // Toolbar / Bubble Menu Coordination\r\n // ============================================\r\n hideBubbleMenus(): void {\r\n this.editorCommandsService.setToolbarInteracting(true);\r\n }\r\n\r\n showBubbleMenus(): void {\r\n this.editorCommandsService.setToolbarInteracting(false);\r\n }\r\n\r\n\r\n // Private signals for internal state\r\n private _editor = signal<Editor | null>(null);\r\n private _characterCount = signal<number>(0);\r\n private _wordCount = signal<number>(0);\r\n private _isDragOver = signal<boolean>(false);\r\n private _editorFullyInitialized = signal<boolean>(false);\r\n\r\n // Anti-echo: track last emitted HTML to prevent cursor reset on parent echo\r\n private lastEmittedHtml: string | null = null;\r\n\r\n // Read-only access to signals\r\n readonly editor = this._editor.asReadonly();\r\n readonly characterCount = this._characterCount.asReadonly();\r\n readonly wordCount = this._wordCount.asReadonly();\r\n readonly isDragOver = this._isDragOver.asReadonly();\r\n readonly editorFullyInitialized = this._editorFullyInitialized.asReadonly();\r\n \r\n private _isFormControlDisabled = signal<boolean>(false);\r\n readonly isFormControlDisabled = this._isFormControlDisabled.asReadonly();\r\n\r\n // Combined disabled state (Input + FormControl)\r\n readonly mergedDisabled = computed(() => this.disabled() || this.isFormControlDisabled());\r\n\r\n // Computed for editor states\r\n isEditorReady = computed(() => this.editor() !== null);\r\n\r\n // Computed for toolbar configuration\r\n toolbarConfig = computed(() =>\r\n Object.keys(this.toolbar()).length === 0\r\n ? DEFAULT_TOOLBAR_CONFIG\r\n : this.toolbar()\r\n );\r\n\r\n // Computed for bubble menu configuration\r\n bubbleMenuConfig = computed(() =>\r\n Object.keys(this.bubbleMenu()).length === 0\r\n ? DEFAULT_BUBBLE_MENU_CONFIG\r\n : { ...DEFAULT_BUBBLE_MENU_CONFIG, ...this.bubbleMenu() }\r\n );\r\n\r\n // Computed for image bubble menu configuration\r\n imageBubbleMenuConfig = computed(() =>\r\n Object.keys(this.imageBubbleMenu()).length === 0\r\n ? DEFAULT_IMAGE_BUBBLE_MENU_CONFIG\r\n : { ...DEFAULT_IMAGE_BUBBLE_MENU_CONFIG, ...this.imageBubbleMenu() }\r\n );\r\n\r\n // Computed for table bubble menu configuration\r\n tableBubbleMenuConfig = computed(() =>\r\n Object.keys(this.tableBubbleMenu()).length === 0\r\n ? DEFAULT_TABLE_MENU_CONFIG\r\n : { ...DEFAULT_TABLE_MENU_CONFIG, ...this.tableBubbleMenu() }\r\n );\r\n\r\n // Computed for cell bubble menu configuration\r\n cellBubbleMenuConfig = computed(() =>\r\n Object.keys(this.cellBubbleMenu()).length === 0\r\n ? DEFAULT_CELL_MENU_CONFIG\r\n : { ...DEFAULT_CELL_MENU_CONFIG, ...this.cellBubbleMenu() }\r\n );\r\n\r\n // Computed for image upload configuration\r\n imageUploadConfig = computed(() => ({\r\n maxSize: 5,\r\n maxWidth: 1920,\r\n maxHeight: 1080,\r\n allowedTypes: [\"image/jpeg\", \"image/png\", \"image/gif\", \"image/webp\"],\r\n enableDragDrop: true,\r\n showPreview: true,\r\n multiple: false,\r\n compressImages: true,\r\n quality: 0.8,\r\n ...this.imageUpload(),\r\n }));\r\n\r\n // Computed for slash commands configuration\r\n slashCommandsConfigComputed = computed(() => {\r\n const customConfig = this.customSlashCommands();\r\n if (customConfig) {\r\n return customConfig;\r\n }\r\n\r\n // Utilise l'utilitaire filterSlashCommands qui gère maintenant \r\n // les défauts, le filtrage et l'ajout de commandes personnalisées\r\n return {\r\n commands: filterSlashCommands(this.slashCommands(), this.i18nService, this.editorCommandsService, this.imageUploadConfig()),\r\n };\r\n });\r\n\r\n // Computed for current translations (allows per-instance override via [locale] input)\r\n readonly currentTranslations = computed(() => {\r\n const localeOverride = this.locale();\r\n if (localeOverride) {\r\n // If a specific language is provided to this instance, try to retrieve it\r\n const allTranslations = this.i18nService.allTranslations();\r\n return allTranslations[localeOverride] || this.i18nService.translations();\r\n }\r\n // Otherwise, follow the global service language\r\n return this.i18nService.translations();\r\n });\r\n\r\n private _destroyRef = inject(DestroyRef);\r\n // NgControl for management of FormControls\r\n private ngControl = inject(NgControl, { self: true, optional: true });\r\n\r\n readonly i18nService = inject(TiptapI18nService);\r\n readonly editorCommandsService = inject(EditorCommandsService);\r\n // Access editor state via service\r\n readonly editorState = this.editorCommandsService.editorState;\r\n\r\n constructor() {\r\n\r\n // Effect to update editor content (with anti-echo)\r\n effect(() => {\r\n const content = this.content(); // Sole reactive dependency\r\n\r\n untracked(() => {\r\n const editor = this.editor();\r\n const hasFormControl = !!(this.ngControl as any)?.control;\r\n\r\n if (!editor || content === undefined) return;\r\n\r\n // Anti-écho : on ignore ce qu'on vient d'émettre nous-mêmes\r\n if (content === this.lastEmittedHtml) return;\r\n\r\n // Double sécurité : on vérifie le contenu actuel de l'éditeur\r\n if (content === editor.getHTML()) return;\r\n\r\n // Do not overwrite content if we have a FormControl and content is empty\r\n if (hasFormControl && !content) return;\r\n\r\n editor.commands.setContent(content, false);\r\n });\r\n });\r\n\r\n // Effect to update height properties\r\n effect(() => {\r\n const minHeight = this.minHeight();\r\n const height = this.height();\r\n const maxHeight = this.maxHeight();\r\n const element = this.editorElement()?.nativeElement;\r\n\r\n // Automatically calculate if scroll is needed\r\n const needsScroll = height !== undefined || maxHeight !== undefined;\r\n\r\n if (element) {\r\n element.style.setProperty(\"--editor-min-height\", `${minHeight}px`);\r\n element.style.setProperty(\r\n \"--editor-height\",\r\n height ? `${height}px` : \"auto\"\r\n );\r\n element.style.setProperty(\r\n \"--editor-max-height\",\r\n maxHeight ? `${maxHeight}px` : \"none\"\r\n );\r\n element.style.setProperty(\r\n \"--editor-overflow\",\r\n needsScroll ? \"auto\" : \"visible\"\r\n );\r\n }\r\n });\r\n\r\n // Effect to monitor editability changes\r\n effect(() => {\r\n const currentEditor = this.editor();\r\n // An editor is \"editable\" if it's not disabled and editable mode is ON\r\n const isEditable = this.editable() && !this.mergedDisabled();\r\n // An editor is \"readonly\" if it's explicitly non-editable and not disabled\r\n const isReadOnly = !this.editable() && !this.mergedDisabled();\r\n \r\n if (currentEditor) {\r\n this.editorCommandsService.setEditable(currentEditor, isEditable);\r\n }\r\n });\r\n\r\n // Effect to synchronize image upload handler with the service\r\n effect(() => {\r\n const handler = this.imageUploadHandler();\r\n this.editorCommandsService.uploadHandler = handler || null;\r\n });\r\n\r\n // Effect to update character count limit dynamically\r\n effect(() => {\r\n const editor = this.editor();\r\n const limit = this.maxCharacters();\r\n\r\n if (editor && editor.extensionManager) {\r\n const characterCountExtension = editor.extensionManager.extensions.find(\r\n (ext) => ext.name === \"characterCount\"\r\n );\r\n\r\n if (characterCountExtension) {\r\n characterCountExtension.options.limit = limit;\r\n // Force TipTap to recognize the option change if possible\r\n // Some extensions need re-creation, but characterCount plugin \r\n // reads this.options.limit in its filterTransaction.\r\n }\r\n }\r\n });\r\n }\r\n\r\n ngAfterViewInit() {\r\n // La vue est déjà complètement initialisée dans ngAfterViewInit\r\n // Initialiser l'éditeur\r\n this.initEditor();\r\n\r\n // S'abonner aux changements du FormControl\r\n this.setupFormControlSubscription();\r\n }\r\n\r\n ngOnDestroy() {\r\n const currentEditor = this.editor();\r\n if (currentEditor) {\r\n currentEditor.destroy();\r\n }\r\n this._editorFullyInitialized.set(false);\r\n }\r\n\r\n private initEditor() {\r\n const extensions: (Extension | Node | Mark)[] = [\r\n StarterKit,\r\n TextStyle,\r\n Color.configure({\r\n types: [\"textStyle\"],\r\n }),\r\n Placeholder.configure({\r\n placeholder:\r\n this.placeholder() || this.i18nService.editor().placeholder,\r\n }),\r\n Underline,\r\n Superscript,\r\n Subscript,\r\n TextAlign.configure({\r\n types: [\"heading\", \"paragraph\"],\r\n }),\r\n Link.configure({\r\n openOnClick: false,\r\n HTMLAttributes: {\r\n class: \"tiptap-link\",\r\n },\r\n }),\r\n LinkClickBehavior,\r\n Highlight.configure({\r\n multicolor: true,\r\n HTMLAttributes: {\r\n class: \"tiptap-highlight\",\r\n },\r\n }),\r\n ResizableImage.configure({\r\n inline: false,\r\n allowBase64: true,\r\n HTMLAttributes: {\r\n class: \"tiptap-image\",\r\n },\r\n }),\r\n UploadProgress.configure({\r\n isUploading: () => this.editorCommandsService.isUploading(),\r\n uploadProgress: () => this.editorCommandsService.uploadProgress(),\r\n uploadMessage: () => this.editorCommandsService.uploadMessage(),\r\n }),\r\n TableExtension,\r\n TiptapStateExtension.configure({\r\n onUpdate: (state) => this.editorCommandsService.updateState(state),\r\n calculators: [\r\n SelectionCalculator,\r\n MarksCalculator,\r\n TableCalculator,\r\n ImageCalculator,\r\n StructureCalculator,\r\n DiscoveryCalculator,\r\n ...this.stateCalculators(),\r\n ]\r\n }),\r\n ];\r\n\r\n // Ajouter l'extension Office Paste si activée\r\n if (this.enableOfficePaste()) {\r\n extensions.push(\r\n OfficePaste.configure({\r\n // Configuration par défaut pour une meilleure compatibilité\r\n transformPastedHTML: true,\r\n transformPastedText: true,\r\n })\r\n );\r\n }\r\n\r\n if (this.showCharacterCount() || this.showWordCount()) {\r\n extensions.push(\r\n CharacterCount.configure({\r\n limit: this.maxCharacters(),\r\n })\r\n );\r\n }\r\n\r\n // Allow addition of custom extensions, but avoid duplicates by filtering by name\r\n const customExtensions = this.tiptapExtensions();\r\n if (customExtensions.length > 0) {\r\n const existingNames = new Set(\r\n extensions\r\n .map((ext) => (ext as any)?.name as string | undefined)\r\n .filter((name): name is string => !!name)\r\n );\r\n\r\n const filteredCustom = customExtensions.filter((ext) => {\r\n const name = (ext as any)?.name as string | undefined;\r\n return !name || !existingNames.has(name);\r\n });\r\n\r\n extensions.push(...filteredCustom);\r\n }\r\n\r\n // Also allow any tiptap user options\r\n const userOptions = this.tiptapOptions();\r\n\r\n const newEditor = new Editor({\r\n ...userOptions,\r\n element: this.editorElement().nativeElement,\r\n extensions,\r\n content: this.content(),\r\n editable: this.editable() && !this.mergedDisabled(),\r\n autofocus: this.autofocus(),\r\n onUpdate: ({ editor, transaction }) => {\r\n const html = editor.getHTML();\r\n\r\n // Anti-écho : mémoriser ce qu'on émet pour éviter la boucle\r\n this.lastEmittedHtml = html;\r\n\r\n this.contentChange.emit(html);\r\n // Mettre à jour le FormControl si il existe\r\n if ((this.ngControl as any)?.control) {\r\n (this.ngControl as any).control.setValue(html, {\r\n emitEvent: false,\r\n });\r\n }\r\n this.editorUpdate.emit({ editor, transaction });\r\n this.updateCharacterCount(editor);\r\n },\r\n onCreate: ({ editor }) => {\r\n this.editorCreated.emit(editor);\r\n this.updateCharacterCount(editor);\r\n\r\n // Marquer l'éditeur comme complètement initialisé après un court délai\r\n // pour s'assurer que tous les plugins et extensions sont prêts\r\n setTimeout(() => {\r\n this._editorFullyInitialized.set(true);\r\n }, 100);\r\n },\r\n onFocus: ({ editor, event }) => {\r\n this.editorFocus.emit({ editor, event });\r\n },\r\n onBlur: ({ editor, event }) => {\r\n // Marquer le FormControl comme touché si il existe\r\n if ((this.ngControl as any)?.control) {\r\n (this.ngControl as any).control.markAsTouched();\r\n }\r\n this.editorBlur.emit({ editor, event });\r\n },\r\n });\r\n\r\n // Stocker la référence de l'éditeur immédiatement\r\n this._editor.set(newEditor);\r\n }\r\n\r\n private updateCharacterCount(editor: Editor) {\r\n if ((this.showCharacterCount() || this.showWordCount()) && editor.storage[\"characterCount\"]) {\r\n const storage = editor.storage[\"characterCount\"];\r\n this._characterCount.set(storage.characters());\r\n this._wordCount.set(storage.words());\r\n }\r\n }\r\n\r\n\r\n onDragOver(event: DragEvent) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this._isDragOver.set(true);\r\n }\r\n\r\n onDrop(event: DragEvent) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this._isDragOver.set(false);\r\n\r\n const files = event.dataTransfer?.files;\r\n if (files && files.length > 0) {\r\n const file = files[0];\r\n if (file.type.startsWith(\"image/\")) {\r\n this.insertImageFromFile(file);\r\n }\r\n }\r\n }\r\n\r\n private async insertImageFromFile(file: File) {\r\n const currentEditor = this.editor();\r\n if (currentEditor) {\r\n try {\r\n const config = this.imageUploadConfig();\r\n await this.editorCommandsService.uploadImage(currentEditor, file, {\r\n quality: config.quality,\r\n maxWidth: config.maxWidth,\r\n maxHeight: config.maxHeight\r\n });\r\n } catch (error) {\r\n // Gérer l'erreur silencieusement ou afficher une notification\r\n }\r\n }\r\n }\r\n\r\n // Public methods\r\n getHTML(): string {\r\n return this.editor()?.getHTML() || \"\";\r\n }\r\n\r\n getJSON(): any {\r\n return this.editor()?.getJSON();\r\n }\r\n\r\n getText(): string {\r\n return this.editor()?.getText() || \"\";\r\n }\r\n\r\n setContent(content: string, emitUpdate = true) {\r\n const editor = this.editor();\r\n if (editor) {\r\n this.editorCommandsService.setContent(editor, content, emitUpdate);\r\n }\r\n }\r\n\r\n focus() {\r\n const editor = this.editor();\r\n if (editor) {\r\n this.editorCommandsService.focus(editor);\r\n }\r\n }\r\n\r\n blur() {\r\n const editor = this.editor();\r\n if (editor) {\r\n this.editorCommandsService.blur(editor);\r\n }\r\n }\r\n\r\n clearContent() {\r\n const editor = this.editor();\r\n if (editor) {\r\n this.editorCommandsService.clearContent(editor);\r\n }\r\n }\r\n\r\n // Méthode publique pour obtenir l'éditeur\r\n getEditor(): Editor | null {\r\n return this.editor();\r\n }\r\n\r\n private setupFormControlSubscription(): void {\r\n const control = (this.ngControl as any)?.control;\r\n if (control) {\r\n // Synchronize form control value with editor content\r\n const formValue$ = concat(\r\n defer(() => of(control.value)),\r\n control.valueChanges\r\n );\r\n\r\n formValue$\r\n .pipe(\r\n tap((value: any) => {\r\n const editor = this.editor();\r\n if (editor) {\r\n this.setContent(value, false);\r\n }\r\n }),\r\n takeUntilDestroyed(this._destroyRef)\r\n )\r\n .subscribe();\r\n\r\n // Synchronize form control status with editor disabled state\r\n const formStatus$ = concat(\r\n defer(() => of(control.status)),\r\n control.statusChanges\r\n );\r\n\r\n formStatus$\r\n .pipe(\r\n tap((status: string) => {\r\n this._isFormControlDisabled.set(status === 'DISABLED');\r\n }),\r\n takeUntilDestroyed(this._destroyRef)\r\n )\r\n .subscribe();\r\n }\r\n }\r\n\r\n onEditorClick(event: MouseEvent) {\r\n const editor = this.editor();\r\n if (!editor || !this.editable()) return;\r\n\r\n // Verify if click is on the container element and not on the content\r\n const target = event.target as HTMLElement;\r\n const editorElement = this.editorElement()?.nativeElement;\r\n\r\n if (\r\n target === editorElement ||\r\n target.classList.contains(\"tiptap-content\")\r\n ) {\r\n // Click in the empty space, position the cursor at the end\r\n setTimeout(() => {\r\n const { doc } = editor.state;\r\n const endPos = doc.content.size;\r\n editor.commands.setTextSelection(endPos);\r\n editor.commands.focus();\r\n }, 0);\r\n }\r\n }\r\n\r\n // Methods for table edit button - Removed as replaced by bubble menu\r\n}\r\n","/*\r\n * Public API Surface of tiptap-editor\r\n */\r\n\r\n// Main component\r\nexport * from \"./lib/tiptap-editor.component\";\r\n\r\n// Host directive for FormControl integration (Required by Angular)\r\nexport * from \"./lib/noop-value-accessor.directive\";\r\n\r\n// Services\r\nexport * from \"./lib/services/i18n.service\";\r\nexport * from \"./lib/services/editor-commands.service\";\r\nexport * from \"./lib/services/image.service\";\r\nexport * from \"./lib/services/color-picker.service\";\r\nexport * from \"./lib/services/link.service\";\r\n\r\n// State & Calculators (Essential for custom plugins)\r\nexport * from \"./lib/models/editor-state.model\";\r\nexport * from \"./lib/extensions/calculators/discovery.calculator\";\r\nexport * from \"./lib/extensions/calculators/image.calculator\";\r\nexport * from \"./lib/extensions/calculators/marks.calculator\";\r\nexport * from \"./lib/extensions/calculators/selection.calculator\";\r\nexport * from \"./lib/extensions/calculators/structure.calculator\";\r\nexport * from \"./lib/extensions/calculators/table.calculator\";\r\n\r\n// Types and interfaces for configuration\r\nexport * from \"./lib/models/toolbar.model\";\r\nexport * from \"./lib/models/bubble-menu.model\";\r\nexport type {\r\n CustomSlashCommands,\r\n SlashCommandItem,\r\n} from \"./lib/tiptap-slash-commands.component\";\r\n\r\n// Default configurations\r\nexport * from \"./lib/config/editor.config\";\r\n\r\n// Utility functions for slash commands\r\nexport * from \"./lib/config/slash-commands.config\";\r\n\r\n// Translations\r\nexport type { SupportedLocale } from \"./lib/services/i18n.service\";\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["Node","i1.NoopValueAccessorDirective"],"mappings":"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"}
1
+ {"version":3,"file":"flogeez-angular-tiptap-editor.mjs","sources":["../../../projects/angular-tiptap-editor/src/lib/extensions/resizable-image.extension.ts","../../../projects/angular-tiptap-editor/src/lib/extensions/upload-progress.extension.ts","../../../projects/angular-tiptap-editor/src/lib/extensions/table.extension.ts","../../../projects/angular-tiptap-editor/src/lib/models/editor-state.model.ts","../../../projects/angular-tiptap-editor/src/lib/extensions/tiptap-state.extension.ts","../../../projects/angular-tiptap-editor/src/lib/tiptap-button.component.ts","../../../projects/angular-tiptap-editor/src/lib/tiptap-separator.component.ts","../../../projects/angular-tiptap-editor/src/lib/services/i18n.service.ts","../../../projects/angular-tiptap-editor/src/lib/services/image.service.ts","../../../projects/angular-tiptap-editor/src/lib/utils/color.utils.ts","../../../projects/angular-tiptap-editor/src/lib/services/color-picker.service.ts","../../../projects/angular-tiptap-editor/src/lib/services/link.service.ts","../../../projects/angular-tiptap-editor/src/lib/services/editor-commands.service.ts","../../../projects/angular-tiptap-editor/src/lib/components/tiptap-color-picker.component.ts","../../../projects/angular-tiptap-editor/src/lib/tiptap-toolbar.component.ts","../../../projects/angular-tiptap-editor/src/lib/base/tiptap-base-bubble-menu.ts","../../../projects/angular-tiptap-editor/src/lib/tiptap-bubble-menu.component.ts","../../../projects/angular-tiptap-editor/src/lib/tiptap-image-bubble-menu.component.ts","../../../projects/angular-tiptap-editor/src/lib/tiptap-table-bubble-menu.component.ts","../../../projects/angular-tiptap-editor/src/lib/tiptap-cell-bubble-menu.component.ts","../../../projects/angular-tiptap-editor/src/lib/tiptap-link-bubble-menu.component.ts","../../../projects/angular-tiptap-editor/src/lib/tiptap-color-bubble-menu.component.ts","../../../projects/angular-tiptap-editor/src/lib/config/slash-commands.config.ts","../../../projects/angular-tiptap-editor/src/lib/tiptap-slash-commands.component.ts","../../../projects/angular-tiptap-editor/src/lib/tiptap-edit-toggle.component.ts","../../../projects/angular-tiptap-editor/src/lib/noop-value-accessor.directive.ts","../../../projects/angular-tiptap-editor/src/lib/extensions/calculators/selection.calculator.ts","../../../projects/angular-tiptap-editor/src/lib/extensions/calculators/marks.calculator.ts","../../../projects/angular-tiptap-editor/src/lib/extensions/calculators/table.calculator.ts","../../../projects/angular-tiptap-editor/src/lib/extensions/calculators/image.calculator.ts","../../../projects/angular-tiptap-editor/src/lib/extensions/calculators/structure.calculator.ts","../../../projects/angular-tiptap-editor/src/lib/extensions/calculators/discovery.calculator.ts","../../../projects/angular-tiptap-editor/src/lib/extensions/link-click-behavior.extension.ts","../../../projects/angular-tiptap-editor/src/lib/config/editor.config.ts","../../../projects/angular-tiptap-editor/src/lib/tiptap-editor.component.ts","../../../projects/angular-tiptap-editor/src/public-api.ts","../../../projects/angular-tiptap-editor/src/flogeez-angular-tiptap-editor.ts"],"sourcesContent":["import { Node, mergeAttributes, nodeInputRule } from \"@tiptap/core\";\n\nexport interface ResizableImageOptions {\n inline: boolean;\n allowBase64: boolean;\n HTMLAttributes: Record<string, any>;\n}\n\ndeclare module \"@tiptap/core\" {\n interface Commands<ReturnType> {\n resizableImage: {\n setResizableImage: (options: {\n src: string;\n alt?: string;\n title?: string;\n width?: number;\n height?: number;\n }) => ReturnType;\n updateResizableImage: (options: {\n src?: string;\n alt?: string;\n title?: string;\n width?: number;\n height?: number;\n }) => ReturnType;\n };\n }\n}\n\nexport const ResizableImage = Node.create<ResizableImageOptions>({\n name: \"resizableImage\",\n\n addOptions() {\n return {\n inline: false,\n allowBase64: false,\n HTMLAttributes: {},\n };\n },\n\n inline() {\n return this.options.inline;\n },\n\n group() {\n return this.options.inline ? \"inline\" : \"block\";\n },\n\n draggable: true,\n\n addAttributes() {\n return {\n src: {\n default: null,\n },\n alt: {\n default: null,\n },\n title: {\n default: null,\n },\n width: {\n default: null,\n parseHTML: (element) => {\n const width = element.getAttribute(\"width\");\n return width ? parseInt(width, 10) : null;\n },\n renderHTML: (attributes) => {\n if (!attributes[\"width\"]) {\n return {};\n }\n return {\n width: attributes[\"width\"],\n };\n },\n },\n height: {\n default: null,\n parseHTML: (element) => {\n const height = element.getAttribute(\"height\");\n return height ? parseInt(height, 10) : null;\n },\n renderHTML: (attributes) => {\n if (!attributes[\"height\"]) {\n return {};\n }\n return {\n height: attributes[\"height\"],\n };\n },\n },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: \"img[src]\",\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\n \"img\",\n mergeAttributes(this.options.HTMLAttributes, HTMLAttributes),\n ];\n },\n\n addCommands() {\n return {\n setResizableImage:\n (options) =>\n ({ commands }) => {\n return commands.insertContent({\n type: this.name,\n attrs: options,\n }, {\n updateSelection: true,\n });\n },\n updateResizableImage:\n (options) =>\n ({ commands }) => {\n return commands.updateAttributes(this.name, options);\n },\n };\n },\n\n addInputRules() {\n return [\n nodeInputRule({\n find: /!\\[(.+|:?)]\\((\\S+)(?:(?:\\s+)[\"'](\\S+)[\"'])?\\)/,\n type: this.type,\n getAttributes: (match) => {\n const [, alt, src, title] = match;\n return { src, alt, title };\n },\n }),\n ];\n },\n\n addNodeView() {\n return ({ node, getPos, editor }) => {\n const container = document.createElement(\"div\");\n container.className = \"resizable-image-container\";\n container.style.position = \"relative\";\n container.style.display = \"inline-block\";\n\n const img = document.createElement(\"img\");\n img.src = node.attrs[\"src\"];\n img.alt = node.attrs[\"alt\"] || \"\";\n img.title = node.attrs[\"title\"] || \"\";\n img.className = \"tiptap-image\";\n\n if (node.attrs[\"width\"]) img.width = node.attrs[\"width\"];\n if (node.attrs[\"height\"]) img.height = node.attrs[\"height\"];\n\n img.parentNode?.insertBefore(container, img);\n container.appendChild(img);\n\n // Add modern resize controls\n const resizeControls = document.createElement(\"div\");\n resizeControls.className = \"resize-controls\";\n resizeControls.style.display = \"none\";\n\n // Create 8 handles for full resizing capability\n const handles = [\"nw\", \"n\", \"ne\", \"w\", \"e\", \"sw\", \"s\", \"se\"];\n handles.forEach((direction) => {\n const handle = document.createElement(\"div\");\n handle.className = `resize-handle resize-handle-${direction}`;\n handle.setAttribute(\"data-direction\", direction);\n resizeControls.appendChild(handle);\n });\n\n // Attach controls to container\n container.appendChild(resizeControls);\n\n // Variables for resizing\n let isResizing = false;\n let startX = 0;\n let startY = 0;\n let startWidth = 0;\n let startHeight = 0;\n let aspectRatio = 1;\n\n // Calculate aspect ratio\n img.onload = () => {\n aspectRatio = img.naturalWidth / img.naturalHeight;\n };\n\n // Resizing logic\n const handleMouseDown = (e: MouseEvent, direction: string) => {\n e.preventDefault();\n e.stopPropagation();\n\n isResizing = true;\n startX = e.clientX;\n startY = e.clientY;\n\n // Use current image dimensions instead of initial ones\n startWidth =\n parseInt(img.getAttribute(\"width\") || \"0\") ||\n node.attrs[\"width\"] ||\n img.naturalWidth;\n startHeight =\n parseInt(img.getAttribute(\"height\") || \"0\") ||\n node.attrs[\"height\"] ||\n img.naturalHeight;\n\n // Add resizing class to body\n document.body.classList.add(\"resizing\");\n\n const handleMouseMove = (e: MouseEvent) => {\n if (!isResizing) return;\n\n const deltaX = e.clientX - startX;\n const deltaY = e.clientY - startY;\n\n let newWidth = startWidth;\n let newHeight = startHeight;\n\n // Resize according to direction\n switch (direction) {\n case \"e\":\n newWidth = startWidth + deltaX;\n newHeight = newWidth / aspectRatio;\n break;\n case \"w\":\n newWidth = startWidth - deltaX;\n newHeight = newWidth / aspectRatio;\n break;\n case \"s\":\n newHeight = startHeight + deltaY;\n newWidth = newHeight * aspectRatio;\n break;\n case \"n\":\n newHeight = startHeight - deltaY;\n newWidth = newHeight * aspectRatio;\n break;\n case \"se\":\n newWidth = startWidth + deltaX;\n newHeight = startHeight + deltaY;\n break;\n case \"sw\":\n newWidth = startWidth - deltaX;\n newHeight = startHeight + deltaY;\n break;\n case \"ne\":\n newWidth = startWidth + deltaX;\n newHeight = startHeight - deltaY;\n break;\n case \"nw\":\n newWidth = startWidth - deltaX;\n newHeight = startHeight - deltaY;\n break;\n }\n\n // Limits\n newWidth = Math.max(50, Math.min(2000, newWidth));\n newHeight = Math.max(50, Math.min(2000, newHeight));\n\n // Update image attributes directly\n img.setAttribute(\"width\", Math.round(newWidth).toString());\n img.setAttribute(\"height\", Math.round(newHeight).toString());\n };\n\n const handleMouseUp = () => {\n isResizing = false;\n document.body.classList.remove(\"resizing\");\n\n // Update Tiptap node with new dimensions\n if (typeof getPos === \"function\") {\n const finalWidth = parseInt(img.getAttribute(\"width\") || \"0\");\n const finalHeight = parseInt(img.getAttribute(\"height\") || \"0\");\n\n if (finalWidth && finalHeight) {\n editor.commands.updateAttributes(\"resizableImage\", {\n width: finalWidth,\n height: finalHeight,\n });\n }\n }\n\n document.removeEventListener(\"mousemove\", handleMouseMove);\n document.removeEventListener(\"mouseup\", handleMouseUp);\n };\n\n document.addEventListener(\"mousemove\", handleMouseMove);\n document.addEventListener(\"mouseup\", handleMouseUp);\n };\n\n // Add events to handles\n resizeControls.addEventListener(\"mousedown\", (e) => {\n const target = e.target as HTMLElement;\n if (target.classList.contains(\"resize-handle\")) {\n const direction = target.getAttribute(\"data-direction\");\n if (direction) {\n handleMouseDown(e, direction);\n }\n }\n });\n\n // Proper selection management via ProseMirror lifecycle\n const selectNode = () => {\n resizeControls.style.display = \"block\";\n container.classList.add(\"selected\");\n img.classList.add(\"selected\");\n };\n\n const deselectNode = () => {\n resizeControls.style.display = \"none\";\n container.classList.remove(\"selected\");\n img.classList.remove(\"selected\");\n };\n\n return {\n dom: container,\n selectNode,\n deselectNode,\n update: (updatedNode) => {\n if (updatedNode.type.name !== \"resizableImage\") return false;\n\n img.src = updatedNode.attrs[\"src\"];\n img.alt = updatedNode.attrs[\"alt\"] || \"\";\n img.title = updatedNode.attrs[\"title\"] || \"\";\n\n if (updatedNode.attrs[\"width\"])\n img.width = updatedNode.attrs[\"width\"];\n if (updatedNode.attrs[\"height\"])\n img.height = updatedNode.attrs[\"height\"];\n\n return true;\n },\n };\n };\n },\n});\n","import { Extension } from \"@tiptap/core\";\nimport { Plugin, PluginKey } from \"@tiptap/pm/state\";\nimport { Decoration, DecorationSet } from \"@tiptap/pm/view\";\n\nexport interface UploadProgressOptions {\n isUploading: () => boolean;\n uploadProgress: () => number;\n uploadMessage: () => string;\n}\n\nexport const UploadProgress = Extension.create<UploadProgressOptions>({\n name: \"uploadProgress\",\n\n addOptions() {\n return {\n isUploading: () => false,\n uploadProgress: () => 0,\n uploadMessage: () => \"\",\n };\n },\n\n addProseMirrorPlugins() {\n const options = this.options;\n\n return [\n new Plugin({\n key: new PluginKey(\"uploadProgress\"),\n state: {\n init() {\n return {\n decorations: DecorationSet.empty,\n isUploading: false,\n uploadPosition: null as number | null,\n };\n },\n apply: (tr, state) => {\n const isUploading = options.isUploading();\n\n // Si l'upload commence, sauvegarder la position\n if (isUploading && !state.isUploading) {\n const uploadPosition = tr.selection.from;\n const uploadProgress = options.uploadProgress();\n const uploadMessage = options.uploadMessage();\n\n // Créer un élément de progression\n const uploadElement = document.createElement(\"div\");\n uploadElement.className = \"upload-progress-widget\";\n uploadElement.innerHTML = `\n <div class=\"upload-skeleton\">\n <div class=\"upload-content\">\n <div class=\"upload-icon\">\n <span class=\"material-symbols-outlined spinning\">image</span>\n </div>\n <div class=\"upload-info\">\n <div class=\"upload-message\">${uploadMessage}</div>\n <div class=\"progress-bar\">\n <div class=\"progress-fill\" style=\"width: ${uploadProgress}%\"></div>\n </div>\n <div class=\"progress-text\">${uploadProgress}%</div>\n </div>\n </div>\n </div>\n `;\n\n // Ajouter les styles si pas déjà fait\n if (!document.querySelector(\"#upload-progress-styles\")) {\n const style = document.createElement(\"style\");\n style.id = \"upload-progress-styles\";\n style.textContent = `\n .upload-progress-widget {\n display: block;\n margin: 8px 0;\n max-width: 400px;\n }\n .upload-skeleton {\n background: var(--ate-surface-secondary);\n border: 2px dashed var(--ate-border-color);\n border-radius: var(--ate-border-radius);\n padding: 16px;\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 120px;\n animation: pulse 2s infinite;\n }\n @keyframes pulse {\n 0%, 100% { background-color: var(--ate-surface-secondary); }\n 50% { background-color: var(--ate-surface-tertiary); }\n }\n .upload-content {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 12px;\n text-align: center;\n }\n .upload-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 48px;\n height: 48px;\n background: var(--ate-primary-light);\n border-radius: 50%;\n color: var(--ate-primary);\n }\n .upload-icon .material-symbols-outlined {\n font-size: 24px;\n }\n .spinning {\n animation: spin 1s linear infinite;\n }\n @keyframes spin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n .upload-info {\n display: flex;\n flex-direction: column;\n gap: 8px;\n width: 100%;\n max-width: 200px;\n }\n .upload-message {\n font-size: 14px;\n color: var(--ate-text);\n font-weight: 500;\n }\n .progress-bar {\n width: 100%;\n height: 6px;\n background: var(--ate-border-color);\n border-radius: 3px;\n overflow: hidden;\n }\n .progress-fill {\n height: 100%;\n background: var(--ate-primary);\n border-radius: 3px;\n transition: width 0.3s ease;\n }\n .progress-text {\n font-size: 12px;\n color: var(--ate-text-secondary);\n font-weight: 500;\n }\n `;\n document.head.appendChild(style);\n }\n\n // Créer une décoration widget à la position sauvegardée\n const decoration = Decoration.widget(\n uploadPosition,\n uploadElement,\n {\n side: 1,\n key: \"upload-progress\",\n }\n );\n\n return {\n decorations: DecorationSet.create(tr.doc, [decoration]),\n isUploading: true,\n uploadPosition,\n };\n }\n\n // Si l'upload continue, mettre à jour le contenu\n if (\n isUploading &&\n state.isUploading &&\n state.uploadPosition !== null\n ) {\n const uploadProgress = options.uploadProgress();\n const uploadMessage = options.uploadMessage();\n\n // Mettre à jour le contenu de l'élément existant\n const existingElement = document.querySelector(\n \".upload-progress-widget\"\n );\n if (existingElement) {\n existingElement.innerHTML = `\n <div class=\"upload-skeleton\">\n <div class=\"upload-content\">\n <div class=\"upload-icon\">\n <span class=\"material-symbols-outlined spinning\">image</span>\n </div>\n <div class=\"upload-info\">\n <div class=\"upload-message\">${uploadMessage}</div>\n <div class=\"progress-bar\">\n <div class=\"progress-fill\" style=\"width: ${uploadProgress}%\"></div>\n </div>\n <div class=\"progress-text\">${uploadProgress}%</div>\n </div>\n </div>\n </div>\n `;\n }\n\n return state; // Garder les décorations existantes\n }\n\n // Si l'upload se termine, supprimer les décorations\n if (!isUploading && state.isUploading) {\n return {\n decorations: DecorationSet.empty,\n isUploading: false,\n uploadPosition: null,\n };\n }\n\n return state;\n },\n },\n props: {\n decorations(state) {\n const pluginState = this.getState(state);\n return pluginState ? pluginState.decorations : DecorationSet.empty;\n },\n },\n }),\n ];\n },\n});\n","import { Extension } from \"@tiptap/core\";\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\";\n\nexport const TableExtension = Extension.create({\n name: \"tableExtension\",\n\n addExtensions() {\n return [\n Table.configure({\n resizable: true,\n handleWidth: 5,\n cellMinWidth: 100,\n }),\n TableRow,\n TableHeader.configure({\n HTMLAttributes: {\n class: \"table-header\",\n },\n }),\n TableCell.configure({\n HTMLAttributes: {\n class: \"table-cell\",\n },\n }),\n ];\n },\n});\n","import { Editor } from \"@tiptap/core\";\n\nexport type StateCalculator = (editor: Editor) => Partial<{\n [K in keyof EditorStateSnapshot]: EditorStateSnapshot[K] extends object\n ? Partial<EditorStateSnapshot[K]>\n : EditorStateSnapshot[K]\n}>;\n\nexport interface EditorStateSnapshot {\n /** Global editor states */\n isFocused: boolean;\n isEditable: boolean;\n\n /** \n * Detailed selection information to avoid overlap between menus\n */\n selection: {\n type: 'text' | 'node' | 'cell' | 'none';\n from: number;\n to: number;\n empty: boolean;\n /** Specific for CellSelection */\n isSingleCell: boolean;\n };\n\n /** Text formatting states (Marks) */\n marks: {\n bold: boolean;\n italic: boolean;\n underline: boolean;\n strike: boolean;\n code: boolean;\n superscript: boolean;\n subscript: boolean;\n highlight: boolean;\n link: boolean;\n linkHref: string | null;\n color: string | null;\n computedColor: string | null;\n background: string | null;\n computedBackground: string | null;\n linkOpenOnClick: boolean;\n };\n\n /** Capability states (canExecute) */\n can: {\n toggleBold: boolean;\n toggleItalic: boolean;\n toggleUnderline: boolean;\n toggleStrike: boolean;\n toggleCode: boolean;\n toggleHighlight: boolean;\n toggleLink: boolean;\n toggleSuperscript: boolean;\n toggleSubscript: boolean;\n setColor: boolean;\n setHighlight: boolean;\n undo: boolean;\n redo: boolean;\n\n /** Table specific capabilities */\n addRowBefore: boolean;\n addRowAfter: boolean;\n deleteRow: boolean;\n addColumnBefore: boolean;\n addColumnAfter: boolean;\n deleteColumn: boolean;\n deleteTable: boolean;\n mergeCells: boolean;\n splitCell: boolean;\n toggleHeaderRow: boolean;\n toggleHeaderColumn: boolean;\n\n /** Structure/Node capabilities */\n toggleHeading1: boolean;\n toggleHeading2: boolean;\n toggleHeading3: boolean;\n toggleBulletList: boolean;\n toggleOrderedList: boolean;\n toggleBlockquote: boolean;\n toggleCodeBlock: boolean;\n setTextAlignLeft: boolean;\n setTextAlignCenter: boolean;\n setTextAlignRight: boolean;\n setTextAlignJustify: boolean;\n insertHorizontalRule: boolean;\n insertTable: boolean;\n insertImage: boolean;\n };\n\n /** Current node context */\n nodes: {\n isTable: boolean;\n isTableNodeSelected: boolean;\n isTableCell: boolean;\n isImage: boolean;\n isBlockquote: boolean;\n isCodeBlock: boolean;\n isBulletList: boolean;\n isOrderedList: boolean;\n\n /** Headings */\n h1: boolean;\n h2: boolean;\n h3: boolean;\n\n /** Alignment */\n alignLeft: boolean;\n alignCenter: boolean;\n alignRight: boolean;\n alignJustify: boolean;\n\n /** Table specific */\n isTableHeaderRow: boolean;\n isTableHeaderColumn: boolean;\n\n /** Name of the active node at selection head */\n activeNodeName: string | null;\n };\n\n /** Placeholder for custom extension states */\n custom: Record<string, any>;\n}\n\nexport const INITIAL_EDITOR_STATE: EditorStateSnapshot = {\n isFocused: false,\n isEditable: true,\n selection: {\n type: 'none',\n from: 0,\n to: 0,\n empty: true,\n isSingleCell: false\n },\n marks: {\n bold: false,\n italic: false,\n underline: false,\n strike: false,\n code: false,\n superscript: false,\n subscript: false,\n highlight: false,\n link: false,\n linkHref: null,\n color: null,\n computedColor: null,\n background: null,\n computedBackground: null,\n linkOpenOnClick: false,\n },\n can: {\n toggleBold: false,\n toggleItalic: false,\n toggleUnderline: false,\n toggleStrike: false,\n toggleCode: false,\n toggleHighlight: false,\n toggleLink: false,\n toggleSuperscript: false,\n toggleSubscript: false,\n setColor: false,\n setHighlight: false,\n undo: false,\n redo: false,\n addRowBefore: false,\n addRowAfter: false,\n deleteRow: false,\n addColumnBefore: false,\n addColumnAfter: false,\n deleteColumn: false,\n deleteTable: false,\n mergeCells: false,\n splitCell: false,\n toggleHeaderRow: false,\n toggleHeaderColumn: false,\n toggleHeading1: false,\n toggleHeading2: false,\n toggleHeading3: false,\n toggleBulletList: false,\n toggleOrderedList: false,\n toggleBlockquote: false,\n toggleCodeBlock: false,\n setTextAlignLeft: false,\n setTextAlignCenter: false,\n setTextAlignRight: false,\n setTextAlignJustify: false,\n insertHorizontalRule: false,\n insertTable: false,\n insertImage: false,\n },\n nodes: {\n isTable: false,\n isTableNodeSelected: false,\n isTableCell: false,\n isImage: false,\n isBlockquote: false,\n isCodeBlock: false,\n isBulletList: false,\n isOrderedList: false,\n h1: false,\n h2: false,\n h3: false,\n alignLeft: false,\n alignCenter: false,\n alignRight: false,\n alignJustify: false,\n isTableHeaderRow: false,\n isTableHeaderColumn: false,\n activeNodeName: null,\n },\n custom: {}\n};\n","import { Extension } from '@tiptap/core';\nimport { Plugin, PluginKey } from '@tiptap/pm/state';\nimport { EditorStateSnapshot, INITIAL_EDITOR_STATE, StateCalculator } from '../models/editor-state.model';\n\nexport interface TiptapStateOptions {\n onUpdate?: (state: EditorStateSnapshot) => void;\n calculators: StateCalculator[];\n}\n\n/**\n * High-performance flat property merger.\n * Processes sub-objects (marks, can, nodes) property by property.\n */\nfunction fastMerge(target: any, source: any) {\n if (!source) return;\n\n for (const key in source) {\n const sourceVal = source[key];\n\n // If the value is an object (marks, can, nodes, selection)\n if (sourceVal !== null && typeof sourceVal === 'object' && !Array.isArray(sourceVal)) {\n if (!target[key]) target[key] = {};\n\n // Merge internal properties\n for (const subKey in sourceVal) {\n const subVal = sourceVal[subKey];\n // TRUE priority rule for boolean state categories\n if (typeof subVal === 'boolean' && (key === 'marks' || key === 'can' || key === 'nodes')) {\n target[key][subKey] = target[key][subKey] || subVal;\n } else {\n target[key][subKey] = subVal;\n }\n }\n } else {\n // Simple value (isFocused, isEditable)\n target[key] = sourceVal;\n }\n }\n}\n\nfunction createFreshSnapshot(): EditorStateSnapshot {\n return JSON.parse(JSON.stringify(INITIAL_EDITOR_STATE));\n}\n\nexport const TiptapStateExtension = Extension.create<TiptapStateOptions>({\n name: 'tiptapState',\n\n addOptions() {\n return {\n onUpdate: undefined,\n calculators: [],\n };\n },\n\n addProseMirrorPlugins() {\n const extension = this;\n return [\n new Plugin({\n key: new PluginKey('tiptapState'),\n view: () => ({\n update: (view) => {\n const { editor } = extension;\n if (!editor) return;\n\n const snapshot = createFreshSnapshot();\n const calcs = extension.options.calculators;\n\n for (let i = 0; i < calcs.length; i++) {\n try {\n const partial = calcs[i](editor);\n fastMerge(snapshot, partial);\n } catch (e) {\n console.error('TiptapStateExtension: Calculator error', e);\n }\n }\n\n if (extension.options.onUpdate) {\n extension.options.onUpdate(snapshot);\n }\n },\n }),\n }),\n ];\n },\n\n onFocus() {\n this.editor.view.dispatch(this.editor.state.tr.setMeta('tiptapStateForceUpdate', true));\n },\n\n onBlur() {\n this.editor.view.dispatch(this.editor.state.tr.setMeta('tiptapStateForceUpdate', true));\n },\n});\n","import { Component, input, output, ChangeDetectionStrategy } from \"@angular/core\";\n\nexport interface TiptapButtonConfig {\n icon: string;\n title: string;\n active?: boolean;\n disabled?: boolean;\n variant?: \"default\" | \"text\" | \"danger\";\n size?: \"small\" | \"medium\" | \"large\";\n iconSize?: \"small\" | \"medium\" | \"large\";\n}\n\n@Component({\n selector: \"tiptap-button\",\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <button\n class=\"tiptap-button\"\n [class.is-active]=\"active()\"\n [class.is-disabled]=\"disabled()\"\n [class.text-button]=\"variant() === 'text'\"\n [class.danger]=\"variant() === 'danger'\"\n [class.small]=\"size() === 'small'\"\n [class.medium]=\"size() === 'medium'\"\n [class.large]=\"size() === 'large'\"\n [class.has-custom-color]=\"!!color()\"\n [class.has-custom-bg]=\"!!backgroundColor()\"\n [disabled]=\"disabled()\"\n [style.color]=\"color()\"\n [style.background-color]=\"backgroundColor()\"\n [attr.title]=\"title()\"\n [attr.aria-label]=\"title()\"\n (mousedown)=\"onMouseDown($event)\"\n (click)=\"onClick.emit($event)\"\n type=\"button\"\n >\n @if (icon()) {\n <span\n class=\"material-symbols-outlined\"\n [class.icon-small]=\"iconSize() === 'small'\"\n [class.icon-medium]=\"iconSize() === 'medium'\"\n [class.icon-large]=\"iconSize() === 'large'\"\n >{{ icon() }}</span>\n }\n <ng-content></ng-content>\n </button>\n `,\n styles: [\n `\n /* Styles de base pour les boutons Tiptap */\n .tiptap-button {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border: none;\n background: transparent;\n border-radius: var(--ate-sub-border-radius, 8px);\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n color: var(--ate-toolbar-button-color, var(--ate-text-secondary));\n position: relative;\n overflow: hidden;\n }\n\n .tiptap-button::before {\n content: \"\";\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--ate-primary);\n opacity: 0;\n transition: opacity 0.2s ease;\n border-radius: var(--ate-sub-border-radius, 8px);\n }\n\n .tiptap-button:hover:not(.has-custom-color) {\n color: var(--ate-toolbar-button-active-color, var(--ate-primary));\n background: var(--ate-toolbar-button-hover-background, transparent);\n transform: translateY(-1px);\n }\n \n /* If has custom color, we still want the hover background but not the color change */\n .tiptap-button.has-custom-color:hover:not(.has-custom-bg) {\n background: var(--ate-toolbar-button-hover-background, transparent);\n transform: translateY(-1px);\n }\n\n .tiptap-button.has-custom-bg:hover {\n transform: translateY(-1px);\n filter: brightness(0.9);\n }\n\n .tiptap-button:hover::before {\n opacity: 0.1;\n }\n\n .tiptap-button:active {\n transform: translateY(0);\n }\n\n .tiptap-button.is-active:not(.has-custom-color) {\n color: var(--ate-toolbar-button-active-color, var(--ate-primary));\n background: var(--ate-toolbar-button-active-background, var(--ate-primary-light));\n }\n\n /* If has custom color and active, prioritize the custom color */\n .tiptap-button.is-active.has-custom-color {\n background: var(--ate-toolbar-button-active-background, var(--ate-primary-light));\n }\n\n .tiptap-button:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n pointer-events: none;\n }\n\n /* Icônes Material Symbols */\n .tiptap-button .material-symbols-outlined {\n font-size: 20px;\n position: relative;\n z-index: 1;\n }\n\n .tiptap-button .material-symbols-outlined.icon-small {\n font-size: 16px;\n }\n\n .tiptap-button .material-symbols-outlined.icon-medium {\n font-size: 20px;\n }\n\n .tiptap-button .material-symbols-outlined.icon-large {\n font-size: 24px;\n }\n\n /* Boutons avec texte */\n .tiptap-button.text-button {\n width: auto;\n padding: 0 12px;\n font-size: 14px;\n font-weight: 500;\n gap: 8px;\n }\n\n /* Boutons de couleur */\n .tiptap-button.color-button {\n width: 28px;\n height: 28px;\n border-radius: 50%;\n border: 2px solid transparent;\n transition: all 0.2s ease;\n }\n\n .tiptap-button.color-button:hover {\n border-color: var(--ate-border);\n transform: scale(1.1);\n }\n\n .tiptap-button.color-button.is-active {\n border-color: var(--ate-primary);\n box-shadow: 0 0 0 2px var(--ate-primary-light);\n }\n\n /* Boutons avec variantes */\n .tiptap-button.danger {\n color: var(--ate-error-color, #ef4444);\n }\n\n .tiptap-button.danger:hover {\n color: var(--ate-error-color, #ef4444);\n background: var(--ate-error-bg, rgba(239, 68, 68, 0.1));\n }\n\n .tiptap-button.danger::before {\n background: var(--ate-error-color, #ef4444);\n }\n\n /* Boutons de taille différente */\n .tiptap-button.small {\n width: 24px;\n height: 24px;\n }\n\n .tiptap-button.medium {\n width: 32px;\n height: 32px;\n }\n\n .tiptap-button.large {\n width: 40px;\n height: 40px;\n }\n\n /* Animation de pulsation pour les boutons actifs */\n @keyframes pulse {\n 0%,\n 100% {\n box-shadow: 0 0 0 0 var(--ate-primary-light-alpha);\n }\n 50% {\n box-shadow: 0 0 0 4px transparent;\n }\n }\n\n .tiptap-button.is-active.pulse {\n animation: pulse 2s infinite;\n }\n\n /* Responsive */\n @media (max-width: 768px) {\n .tiptap-button {\n width: 32px;\n height: 32px;\n }\n\n .tiptap-button .material-symbols-outlined {\n font-size: 18px;\n }\n\n .tiptap-button.text-button {\n padding: 0 8px;\n font-size: 13px;\n }\n }\n `,\n ],\n})\nexport class TiptapButtonComponent {\n // Inputs\n icon = input<string>(\"\");\n title = input.required<string>();\n active = input(false);\n disabled = input(false);\n color = input<string>();\n backgroundColor = input<string>();\n variant = input<\"default\" | \"text\" | \"danger\">(\"default\");\n size = input<\"small\" | \"medium\" | \"large\">(\"medium\");\n iconSize = input<\"small\" | \"medium\" | \"large\">(\"medium\");\n\n // Outputs\n onClick = output<Event>();\n\n onMouseDown(event: MouseEvent) {\n event.preventDefault();\n }\n}\n","import { Component, input, ChangeDetectionStrategy } from \"@angular/core\";\n\n@Component({\n selector: \"tiptap-separator\",\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div\n class=\"tiptap-separator\"\n [class.vertical]=\"orientation() === 'vertical'\"\n [class.horizontal]=\"orientation() === 'horizontal'\"\n [class.small]=\"size() === 'small'\"\n [class.medium]=\"size() === 'medium'\"\n [class.large]=\"size() === 'large'\"\n ></div>\n `,\n styles: [\n `\n .tiptap-separator {\n background-color: var(--ate-border, #e2e8f0);\n margin: 0;\n }\n\n .tiptap-separator.vertical {\n width: 1px;\n height: 24px;\n margin: 0 8px;\n }\n\n .tiptap-separator.horizontal {\n height: 1px;\n width: 100%;\n margin: 8px 0;\n }\n\n .tiptap-separator.small.vertical {\n height: 16px;\n margin: 0 4px;\n }\n\n .tiptap-separator.small.horizontal {\n margin: 4px 0;\n }\n\n .tiptap-separator.medium.vertical {\n height: 24px;\n margin: 0 8px;\n }\n\n .tiptap-separator.medium.horizontal {\n margin: 8px 0;\n }\n\n .tiptap-separator.large.vertical {\n height: 32px;\n margin: 0 12px;\n }\n\n .tiptap-separator.large.horizontal {\n margin: 12px 0;\n }\n `,\n ],\n})\nexport class TiptapSeparatorComponent {\n orientation = input<\"vertical\" | \"horizontal\">(\"vertical\");\n size = input<\"small\" | \"medium\" | \"large\">(\"medium\");\n}\n","import { Injectable, signal, computed } from \"@angular/core\";\n\nexport type SupportedLocale = \"en\" | \"fr\" | (string & {});\n\nexport interface TiptapTranslations {\n // Toolbar\n toolbar: {\n bold: string;\n italic: string;\n underline: string;\n strike: string;\n code: string;\n codeBlock: string;\n superscript: string;\n subscript: string;\n highlight: string;\n highlightPicker: string;\n heading1: string;\n heading2: string;\n heading3: string;\n bulletList: string;\n orderedList: string;\n blockquote: string;\n alignLeft: string;\n alignCenter: string;\n alignRight: string;\n alignJustify: string;\n link: string;\n image: string;\n horizontalRule: string;\n table: string;\n undo: string;\n redo: string;\n clear: string;\n textColor: string;\n customColor: string;\n presets: string;\n };\n\n // Bubble Menu\n bubbleMenu: {\n bold: string;\n italic: string;\n underline: string;\n strike: string;\n code: string;\n superscript: string;\n subscript: string;\n highlight: string;\n highlightPicker: string;\n textColor: string;\n link: string;\n addLink: string;\n editLink: string;\n removeLink: string;\n linkUrl: string;\n linkText: string;\n openLink: string;\n customColor: string;\n presets: string;\n };\n\n // Slash Commands\n slashCommands: {\n heading1: {\n title: string;\n description: string;\n keywords: string[];\n };\n heading2: {\n title: string;\n description: string;\n keywords: string[];\n };\n heading3: {\n title: string;\n description: string;\n keywords: string[];\n };\n bulletList: {\n title: string;\n description: string;\n keywords: string[];\n };\n orderedList: {\n title: string;\n description: string;\n keywords: string[];\n };\n blockquote: {\n title: string;\n description: string;\n keywords: string[];\n };\n code: {\n title: string;\n description: string;\n keywords: string[];\n };\n image: {\n title: string;\n description: string;\n keywords: string[];\n };\n horizontalRule: {\n title: string;\n description: string;\n keywords: string[];\n };\n table: {\n title: string;\n description: string;\n keywords: string[];\n };\n };\n\n // Table Actions\n table: {\n addRowBefore: string;\n addRowAfter: string;\n deleteRow: string;\n addColumnBefore: string;\n addColumnAfter: string;\n deleteColumn: string;\n deleteTable: string;\n toggleHeaderRow: string;\n toggleHeaderColumn: string;\n mergeCells: string;\n splitCell: string;\n };\n\n // Image Upload\n imageUpload: {\n selectImage: string;\n loadError: string;\n uploadingImage: string;\n uploadProgress: string;\n uploadError: string;\n uploadSuccess: string;\n imageTooLarge: string;\n invalidFileType: string;\n dragDropText: string;\n changeImage: string;\n deleteImage: string;\n resizeSmall: string;\n resizeMedium: string;\n resizeLarge: string;\n resizeOriginal: string;\n resizing: string;\n compressing: string;\n compressionError: string;\n validating: string;\n uploadingToServer: string;\n replacingImage: string;\n insertingImage: string;\n noFileSelected: string;\n selectionCancelled: string;\n };\n\n // Editor\n editor: {\n placeholder: string;\n character: string;\n word: string;\n linkPrompt: string;\n linkUrlPrompt: string;\n confirmDelete: string;\n toggleEdit: string;\n viewMode: string;\n };\n\n // Common\n common: {\n cancel: string;\n confirm: string;\n apply: string;\n delete: string;\n save: string;\n close: string;\n loading: string;\n error: string;\n success: string;\n };\n}\n\nconst ENGLISH_TRANSLATIONS: TiptapTranslations = {\n toolbar: {\n bold: \"Bold\",\n italic: \"Italic\",\n underline: \"Underline\",\n strike: \"Strikethrough\",\n code: \"Inline Code\",\n codeBlock: \"Code Block\",\n superscript: \"Superscript\",\n subscript: \"Subscript\",\n highlight: \"Highlight\",\n highlightPicker: \"Background Color\",\n heading1: \"Heading 1\",\n heading2: \"Heading 2\",\n heading3: \"Heading 3\",\n bulletList: \"Bullet List\",\n orderedList: \"Ordered List\",\n blockquote: \"Blockquote\",\n alignLeft: \"Align Left\",\n alignCenter: \"Align Center\",\n alignRight: \"Align Right\",\n alignJustify: \"Align Justify\",\n link: \"Add Link\",\n image: \"Add Image\",\n horizontalRule: \"Horizontal Rule\",\n table: \"Insert Table\",\n undo: \"Undo\",\n redo: \"Redo\",\n clear: \"Clear\",\n textColor: \"Text Color\",\n customColor: \"Custom Color\",\n presets: \"Presets\",\n },\n bubbleMenu: {\n bold: \"Bold\",\n italic: \"Italic\",\n underline: \"Underline\",\n strike: \"Strikethrough\",\n code: \"Code\",\n superscript: \"Superscript\",\n subscript: \"Subscript\",\n highlight: \"Highlight\",\n highlightPicker: \"Background Color\",\n textColor: \"Text Color\",\n link: \"Link\",\n addLink: \"Add Link\",\n editLink: \"Edit Link\",\n removeLink: \"Remove Link\",\n linkUrl: \"Link URL\",\n linkText: \"Link Text\",\n openLink: \"Open Link\",\n customColor: \"Custom Color\",\n presets: \"Presets\",\n },\n slashCommands: {\n heading1: {\n title: \"Heading 1\",\n description: \"Large section heading\",\n keywords: [\"heading\", \"h1\", \"title\", \"1\", \"header\"],\n },\n heading2: {\n title: \"Heading 2\",\n description: \"Medium section heading\",\n keywords: [\"heading\", \"h2\", \"title\", \"2\", \"header\"],\n },\n heading3: {\n title: \"Heading 3\",\n description: \"Small section heading\",\n keywords: [\"heading\", \"h3\", \"title\", \"3\", \"header\"],\n },\n bulletList: {\n title: \"Bullet List\",\n description: \"Create a bullet list\",\n keywords: [\"bullet\", \"list\", \"ul\", \"unordered\"],\n },\n orderedList: {\n title: \"Ordered List\",\n description: \"Create an ordered list\",\n keywords: [\"ordered\", \"list\", \"ol\", \"numbered\"],\n },\n blockquote: {\n title: \"Blockquote\",\n description: \"Add a blockquote\",\n keywords: [\"quote\", \"blockquote\", \"citation\"],\n },\n code: {\n title: \"Code Block\",\n description: \"Add a code block\",\n keywords: [\"code\", \"codeblock\", \"pre\", \"programming\"],\n },\n image: {\n title: \"Image\",\n description: \"Insert an image\",\n keywords: [\"image\", \"photo\", \"picture\", \"img\"],\n },\n horizontalRule: {\n title: \"Horizontal Rule\",\n description: \"Add a horizontal line\",\n keywords: [\"hr\", \"horizontal\", \"rule\", \"line\", \"separator\"],\n },\n table: {\n title: \"Table\",\n description: \"Insert a table\",\n keywords: [\"table\", \"grid\", \"data\", \"rows\", \"columns\"],\n },\n },\n table: {\n addRowBefore: \"Add row before\",\n addRowAfter: \"Add row after\",\n deleteRow: \"Delete row\",\n addColumnBefore: \"Add column before\",\n addColumnAfter: \"Add column after\",\n deleteColumn: \"Delete column\",\n deleteTable: \"Delete table\",\n toggleHeaderRow: \"Toggle header row\",\n toggleHeaderColumn: \"Toggle header column\",\n mergeCells: \"Merge cells\",\n splitCell: \"Split cell\",\n },\n imageUpload: {\n selectImage: \"Select Image\",\n loadError: \"Error loading image\",\n uploadingImage: \"Uploading image...\",\n uploadProgress: \"Upload Progress\",\n uploadError: \"Upload Error\",\n uploadSuccess: \"Upload Success\",\n imageTooLarge: \"Image too large\",\n invalidFileType: \"Invalid file type\",\n dragDropText: \"Drag and drop images here\",\n changeImage: \"Change Image\",\n deleteImage: \"Delete Image\",\n resizeSmall: \"Small\",\n resizeMedium: \"Medium\",\n resizeLarge: \"Large\",\n resizeOriginal: \"Original\",\n resizing: \"Resizing...\",\n compressing: \"Compressing...\",\n compressionError: \"Error during compression\",\n validating: \"Validating file...\",\n uploadingToServer: \"Uploading to server...\",\n replacingImage: \"Replacing image...\",\n insertingImage: \"Inserting into editor...\",\n noFileSelected: \"No image file selected\",\n selectionCancelled: \"Selection cancelled\",\n },\n editor: {\n placeholder: \"Start typing...\",\n character: \"character\",\n word: \"word\",\n linkPrompt: \"Enter link URL\",\n linkUrlPrompt: \"Enter URL\",\n confirmDelete: \"Are you sure you want to delete this?\",\n toggleEdit: \"Switch to Edit Mode\",\n viewMode: \"Switch to View Mode\",\n },\n common: {\n cancel: \"Cancel\",\n confirm: \"Confirm\",\n apply: \"Apply\",\n delete: \"Delete\",\n save: \"Save\",\n close: \"Close\",\n loading: \"Loading\",\n error: \"Error\",\n success: \"Success\",\n },\n};\n\nconst FRENCH_TRANSLATIONS: TiptapTranslations = {\n toolbar: {\n bold: \"Gras\",\n italic: \"Italique\",\n underline: \"Souligné\",\n strike: \"Barré\",\n code: \"Code en ligne\",\n codeBlock: \"Bloc de code\",\n superscript: \"Exposant\",\n subscript: \"Indice\",\n highlight: \"Surligner\",\n highlightPicker: \"Couleur de fond\",\n heading1: \"Titre 1\",\n heading2: \"Titre 2\",\n heading3: \"Titre 3\",\n bulletList: \"Liste à puces\",\n orderedList: \"Liste numérotée\",\n blockquote: \"Citation\",\n alignLeft: \"Aligner à gauche\",\n alignCenter: \"Centrer\",\n alignRight: \"Aligner à droite\",\n alignJustify: \"Justifier\",\n link: \"Ajouter un lien\",\n image: \"Ajouter une image\",\n horizontalRule: \"Ligne horizontale\",\n table: \"Insérer un tableau\",\n undo: \"Annuler\",\n redo: \"Refaire\",\n clear: \"Vider\",\n textColor: \"Couleur texte\",\n customColor: \"Couleur personnalisée\",\n presets: \"Préréglages\",\n },\n bubbleMenu: {\n bold: \"Gras\",\n italic: \"Italique\",\n underline: \"Souligné\",\n strike: \"Barré\",\n code: \"Code\",\n superscript: \"Exposant\",\n subscript: \"Indice\",\n highlight: \"Surligner\",\n highlightPicker: \"Couleur de fond\",\n textColor: \"Couleur texte\",\n link: \"Lien\",\n addLink: \"Ajouter un lien\",\n editLink: \"Modifier le lien\",\n removeLink: \"Supprimer le lien\",\n linkUrl: \"URL du lien\",\n linkText: \"Texte du lien\",\n openLink: \"Ouvrir le lien\",\n customColor: \"Couleur personnalisée\",\n presets: \"Préréglages\",\n },\n slashCommands: {\n heading1: {\n title: \"Titre 1\",\n description: \"Grand titre de section\",\n keywords: [\"heading\", \"h1\", \"titre\", \"title\", \"1\", \"header\"],\n },\n heading2: {\n title: \"Titre 2\",\n description: \"Titre de sous-section\",\n keywords: [\"heading\", \"h2\", \"titre\", \"title\", \"2\", \"header\"],\n },\n heading3: {\n title: \"Titre 3\",\n description: \"Petit titre\",\n keywords: [\"heading\", \"h3\", \"titre\", \"title\", \"3\", \"header\"],\n },\n bulletList: {\n title: \"Liste à puces\",\n description: \"Créer une liste à puces\",\n keywords: [\"bullet\", \"list\", \"liste\", \"puces\", \"ul\"],\n },\n orderedList: {\n title: \"Liste numérotée\",\n description: \"Créer une liste numérotée\",\n keywords: [\"numbered\", \"list\", \"liste\", \"numérotée\", \"ol\", \"ordered\"],\n },\n blockquote: {\n title: \"Citation\",\n description: \"Ajouter une citation\",\n keywords: [\"quote\", \"blockquote\", \"citation\"],\n },\n code: {\n title: \"Bloc de code\",\n description: \"Ajouter un bloc de code\",\n keywords: [\"code\", \"codeblock\", \"pre\", \"programmation\"],\n },\n image: {\n title: \"Image\",\n description: \"Insérer une image\",\n keywords: [\"image\", \"photo\", \"picture\", \"img\"],\n },\n horizontalRule: {\n title: \"Ligne horizontale\",\n description: \"Ajouter une ligne de séparation\",\n keywords: [\"hr\", \"horizontal\", \"rule\", \"ligne\", \"séparation\"],\n },\n table: {\n title: \"Tableau\",\n description: \"Insérer un tableau\",\n keywords: [\n \"table\",\n \"tableau\",\n \"grid\",\n \"grille\",\n \"data\",\n \"données\",\n \"rows\",\n \"colonnes\",\n ],\n },\n },\n table: {\n addRowBefore: \"Ajouter une ligne avant\",\n addRowAfter: \"Ajouter une ligne après\",\n deleteRow: \"Supprimer la ligne\",\n addColumnBefore: \"Ajouter une colonne avant\",\n addColumnAfter: \"Ajouter une colonne après\",\n deleteColumn: \"Supprimer la colonne\",\n deleteTable: \"Supprimer le tableau\",\n toggleHeaderRow: \"Basculer ligne d'en-tête\",\n toggleHeaderColumn: \"Basculer colonne d'en-tête\",\n mergeCells: \"Fusionner les cellules\",\n splitCell: \"Diviser la cellule\",\n },\n imageUpload: {\n selectImage: \"Sélectionner une image\",\n loadError: \"Erreur de chargement de l'image\",\n uploadingImage: \"Téléchargement de l'image...\",\n uploadProgress: \"Progression du téléchargement\",\n uploadError: \"Erreur de téléchargement\",\n uploadSuccess: \"Téléchargement réussi\",\n imageTooLarge: \"Image trop volumineuse\",\n invalidFileType: \"Type de fichier invalide\",\n dragDropText: \"Glissez et déposez des images ici\",\n changeImage: \"Changer l'image\",\n deleteImage: \"Supprimer l'image\",\n resizeSmall: \"Petit\",\n resizeMedium: \"Moyen\",\n resizeLarge: \"Grand\",\n resizeOriginal: \"Original\",\n resizing: \"Redimensionnement...\",\n compressing: \"Compression...\",\n compressionError: \"Erreur lors de la compression\",\n validating: \"Validation du fichier...\",\n uploadingToServer: \"Upload vers le serveur...\",\n replacingImage: \"Remplacement de l'image...\",\n insertingImage: \"Insertion dans l'éditeur...\",\n noFileSelected: \"Aucun fichier image sélectionné\",\n selectionCancelled: \"Sélection annulée\",\n },\n editor: {\n placeholder: \"Commencez à écrire...\",\n character: \"caractère\",\n word: \"mot\",\n linkPrompt: \"Entrez l'URL du lien\",\n linkUrlPrompt: \"Entrez l'URL\",\n confirmDelete: \"Êtes-vous sûr de vouloir supprimer ceci ?\",\n toggleEdit: \"Passer en mode édition\",\n viewMode: \"Passer en mode affichage\",\n },\n common: {\n cancel: \"Annuler\",\n confirm: \"Confirmer\",\n apply: \"Appliquer\",\n delete: \"Supprimer\",\n save: \"Sauvegarder\",\n close: \"Fermer\",\n loading: \"Chargement\",\n error: \"Erreur\",\n success: \"Succès\",\n },\n};\n\n@Injectable({\n providedIn: \"root\",\n})\nexport class TiptapI18nService {\n private _currentLocale = signal<SupportedLocale>(\"en\");\n private _translations = signal<Record<SupportedLocale, TiptapTranslations>>({\n en: ENGLISH_TRANSLATIONS,\n fr: FRENCH_TRANSLATIONS,\n });\n\n // Public signals\n readonly currentLocale = this._currentLocale.asReadonly();\n /** All loaded translations (useful for dynamic key access) */\n readonly allTranslations = this._translations.asReadonly();\n \n readonly translations = computed(\n () => this._translations()[this._currentLocale()]\n );\n\n // Fast translation methods\n readonly t = computed(() => this.translations());\n readonly toolbar = computed(() => this.translations().toolbar);\n readonly bubbleMenu = computed(() => this.translations().bubbleMenu);\n readonly slashCommands = computed(() => this.translations().slashCommands);\n readonly table = computed(() => this.translations().table);\n readonly imageUpload = computed(() => this.translations().imageUpload);\n readonly editor = computed(() => this.translations().editor);\n readonly common = computed(() => this.translations().common);\n\n constructor() {\n // Automatically detect browser language\n this.detectBrowserLanguage();\n }\n\n setLocale(locale: SupportedLocale): void {\n this._currentLocale.set(locale);\n }\n\n autoDetectLocale(): void {\n this.detectBrowserLanguage();\n }\n\n getSupportedLocales(): SupportedLocale[] {\n return Object.keys(this._translations()) as SupportedLocale[];\n }\n\n addTranslations(\n locale: string,\n translations: TiptapTranslations | Partial<TiptapTranslations>\n ): void {\n this._translations.update((current) => {\n const existing = current[locale] || ENGLISH_TRANSLATIONS;\n return {\n ...current,\n [locale]: {\n ...existing,\n ...translations,\n },\n };\n });\n }\n\n private detectBrowserLanguage(): void {\n const browserLang = navigator.language.toLowerCase();\n if (browserLang.startsWith(\"fr\")) {\n this._currentLocale.set(\"fr\");\n } else {\n this._currentLocale.set(\"en\");\n }\n }\n\n // Utility methods for components\n getToolbarTitle(key: keyof TiptapTranslations[\"toolbar\"]): string {\n return this.translations().toolbar[key];\n }\n\n getBubbleMenuTitle(key: keyof TiptapTranslations[\"bubbleMenu\"]): string {\n return this.translations().bubbleMenu[key];\n }\n\n getSlashCommand(key: keyof TiptapTranslations[\"slashCommands\"]) {\n return this.translations().slashCommands[key];\n }\n}\n","import { Injectable, signal, computed, inject } from \"@angular/core\";\nimport { Editor } from \"@tiptap/core\";\nimport { Observable, isObservable, firstValueFrom } from \"rxjs\";\nimport { TiptapI18nService } from \"./i18n.service\";\n\nexport interface ImageData {\n src: string;\n alt?: string;\n title?: string;\n width?: number;\n height?: number;\n}\n\nexport interface ImageUploadResult {\n src: string;\n name: string;\n size: number;\n type: string;\n width?: number;\n height?: number;\n originalSize?: number;\n}\n\nexport interface ResizeOptions {\n width?: number;\n height?: number;\n maintainAspectRatio?: boolean;\n}\n\n/**\n * Context passed to the image upload handler containing information about the image\n */\nexport interface ImageUploadContext {\n /** Original file being uploaded */\n file: File;\n /** Width of the processed image */\n width: number;\n /** Height of the processed image */\n height: number;\n /** MIME type of the image */\n type: string;\n /** Base64 data URL of the processed image (after compression/resize) */\n base64: string;\n}\n\n/**\n * Result expected from a custom image upload handler.\n * Must contain at least the `src` property with the image URL.\n */\nexport interface ImageUploadHandlerResult {\n /** URL of the uploaded image (can be a remote URL or any string) */\n src: string;\n /** Optional custom alt text */\n alt?: string;\n /** Optional custom title */\n title?: string;\n}\n\n/**\n * Custom handler function for image uploads.\n * Allows users to implement their own image storage logic (e.g., upload to S3, Cloudinary, etc.)\n *\n * Can return either a Promise or an Observable (Angular-friendly).\n *\n * @param context - Context containing the image file and metadata\n * @returns Promise or Observable resolving to ImageUploadHandlerResult\n *\n * @example Using Promise (async/await)\n * ```typescript\n * uploadHandler: ImageUploadHandler = async (ctx) => {\n * const formData = new FormData();\n * formData.append('image', ctx.file);\n * const result = await firstValueFrom(this.http.post<{url: string}>('/api/upload', formData));\n * return { src: result.url };\n * };\n * ```\n *\n * @example Using Observable (Angular HttpClient)\n * ```typescript\n * uploadHandler: ImageUploadHandler = (ctx) => {\n * const formData = new FormData();\n * formData.append('image', ctx.file);\n * return this.http.post<{url: string}>('/api/upload', formData).pipe(\n * map(result => ({ src: result.url }))\n * );\n * };\n * ```\n */\nexport type ImageUploadHandler = (\n context: ImageUploadContext\n) => Promise<ImageUploadHandlerResult> | Observable<ImageUploadHandlerResult>;\n\n\n@Injectable()\nexport class ImageService {\n /** Signals for image state */\n selectedImage = signal<ImageData | null>(null);\n isImageSelected = computed(() => this.selectedImage() !== null);\n\n /** Resizing state */\n isResizing = signal(false);\n\n private i18n = inject(TiptapI18nService);\n private readonly t = this.i18n.imageUpload;\n\n /** Upload state signals */\n isUploading = signal(false);\n uploadProgress = signal(0);\n uploadMessage = signal(\"\");\n\n /**\n * Custom upload handler.\n * If set, this handler replaces the default base64 conversion.\n */\n uploadHandler: ImageUploadHandler | null = null;\n\n private currentEditor: Editor | null = null;\n\n /** Select and track an image from the editor */\n selectImage(editor: Editor): void {\n if (editor.isActive(\"resizableImage\")) {\n const attrs = editor.getAttributes(\"resizableImage\");\n this.selectedImage.set({\n src: attrs[\"src\"],\n alt: attrs[\"alt\"],\n title: attrs[\"title\"],\n width: attrs[\"width\"],\n height: attrs[\"height\"],\n });\n } else {\n this.selectedImage.set(null);\n }\n }\n\n clearSelection(): void {\n this.selectedImage.set(null);\n }\n\n /** Insert a new image and ensure it's selected */\n insertImage(editor: Editor, imageData: ImageData): void {\n const { from } = editor.state.selection;\n editor.chain()\n .focus()\n .setResizableImage(imageData)\n .setNodeSelection(from)\n .run();\n }\n\n /** Update attributes of the currently active image */\n updateImageAttributes(editor: Editor, attributes: Partial<ImageData>): void {\n if (editor.isActive(\"resizableImage\")) {\n const pos = editor.state.selection.from;\n editor\n .chain()\n .focus()\n .updateAttributes(\"resizableImage\", attributes)\n .setNodeSelection(pos)\n .run();\n this.updateSelectedImage(attributes);\n }\n }\n\n /** Resize image with optional aspect ratio maintenance */\n resizeImage(editor: Editor, options: ResizeOptions): void {\n if (!editor.isActive(\"resizableImage\")) return;\n\n const currentAttrs = editor.getAttributes(\"resizableImage\");\n let newWidth = options.width;\n let newHeight = options.height;\n\n // Maintain aspect ratio if requested\n if (\n options.maintainAspectRatio !== false &&\n currentAttrs[\"width\"] &&\n currentAttrs[\"height\"]\n ) {\n const aspectRatio = currentAttrs[\"width\"] / currentAttrs[\"height\"];\n\n if (newWidth && !newHeight) {\n newHeight = Math.round(newWidth / aspectRatio);\n } else if (newHeight && !newWidth) {\n newWidth = Math.round(newHeight * aspectRatio);\n }\n }\n\n // Apply minimum limits\n if (newWidth) newWidth = Math.max(50, newWidth);\n if (newHeight) newHeight = Math.max(50, newHeight);\n\n this.updateImageAttributes(editor, {\n width: newWidth,\n height: newHeight,\n });\n }\n\n /** Predetermined resize helpers used by UI */\n resizeImageToSmall(editor: Editor): void {\n this.resizeImage(editor, { width: 300, height: 200, maintainAspectRatio: true });\n }\n\n resizeImageToMedium(editor: Editor): void {\n this.resizeImage(editor, { width: 500, height: 350, maintainAspectRatio: true });\n }\n\n resizeImageToLarge(editor: Editor): void {\n this.resizeImage(editor, { width: 800, height: 600, maintainAspectRatio: true });\n }\n\n resizeImageToOriginal(editor: Editor): void {\n if (!editor.isActive(\"resizableImage\")) return;\n const img = new Image();\n img.onload = () => {\n this.resizeImage(editor, { width: img.naturalWidth, height: img.naturalHeight });\n };\n img.src = editor.getAttributes(\"resizableImage\")[\"src\"];\n }\n\n /** Get current image dimensions */\n getImageDimensions(editor: Editor): { width: number; height: number } | null {\n if (!editor.isActive(\"resizableImage\")) return null;\n const attrs = editor.getAttributes(\"resizableImage\");\n return {\n width: attrs[\"width\"] || 0,\n height: attrs[\"height\"] || 0,\n };\n }\n\n /** Remove the selected image */\n deleteImage(editor: Editor): void {\n if (editor.isActive(\"resizableImage\")) {\n editor.chain().focus().deleteSelection().run();\n this.clearSelection();\n }\n }\n\n private updateSelectedImage(attributes: Partial<ImageData>): void {\n const current = this.selectedImage();\n if (current) {\n this.selectedImage.set({ ...current, ...attributes });\n }\n }\n\n /** Validate file type and size */\n validateImage(file: File, maxSize: number = 10 * 1024 * 1024): { valid: boolean; error?: string } {\n if (!file.type.startsWith(\"image/\")) {\n return { valid: false, error: this.t().invalidFileType };\n }\n if (file.size > maxSize) {\n return {\n valid: false,\n error: `${this.t().imageTooLarge} (max ${maxSize / 1024 / 1024}MB)`,\n };\n }\n return { valid: true };\n }\n\n /** Compress and process image on client side */\n async compressImage(\n file: File,\n quality: number = 0.8,\n maxWidth: number = 1920,\n maxHeight: number = 1200\n ): Promise<ImageUploadResult> {\n return new Promise((resolve, reject) => {\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n const img = new Image();\n\n img.onload = () => {\n if (this.isUploading()) {\n this.uploadProgress.set(40);\n this.uploadMessage.set(this.t().resizing);\n }\n\n let { width, height } = img;\n if (width > maxWidth || height > maxHeight) {\n const ratio = Math.min(maxWidth / width, maxHeight / height);\n width *= ratio;\n height *= ratio;\n }\n\n canvas.width = width;\n canvas.height = height;\n ctx?.drawImage(img, 0, 0, width, height);\n\n if (this.isUploading()) {\n this.uploadProgress.set(60);\n this.uploadMessage.set(this.t().compressing);\n }\n\n canvas.toBlob(\n (blob) => {\n if (blob) {\n const reader = new FileReader();\n reader.onload = (e) => {\n const base64 = e.target?.result as string;\n resolve({\n src: base64,\n name: file.name,\n size: blob.size,\n type: file.type,\n width: Math.round(width),\n height: Math.round(height),\n originalSize: file.size,\n });\n };\n reader.readAsDataURL(blob);\n } else {\n reject(new Error(this.t().compressionError));\n }\n },\n file.type,\n quality\n );\n };\n\n img.onerror = () => reject(new Error(this.t().loadError));\n img.src = URL.createObjectURL(file);\n });\n }\n\n /** Core upload logic with progress tracking */\n private async uploadImageWithProgress(\n editor: Editor,\n file: File,\n insertionStrategy: (editor: Editor, result: ImageUploadResult) => void,\n actionMessage: string,\n options?: { quality?: number; maxWidth?: number; maxHeight?: number }\n ): Promise<void> {\n try {\n this.currentEditor = editor;\n this.isUploading.set(true);\n this.uploadProgress.set(10);\n this.uploadMessage.set(this.t().validating);\n this.forceEditorUpdate();\n\n const validation = this.validateImage(file);\n if (!validation.valid) throw new Error(validation.error);\n\n this.uploadProgress.set(30);\n this.uploadMessage.set(this.t().compressing);\n this.forceEditorUpdate();\n\n const result = await this.compressImage(\n file,\n options?.quality || 0.8,\n options?.maxWidth || 1920,\n options?.maxHeight || 1200\n );\n\n this.uploadProgress.set(70);\n\n // Handle custom upload if handler is provided\n if (this.uploadHandler) {\n this.uploadMessage.set(this.t().uploadingToServer);\n this.forceEditorUpdate();\n\n try {\n const handlerResponse = this.uploadHandler({\n file,\n width: result.width || 0,\n height: result.height || 0,\n type: result.type,\n base64: result.src,\n });\n\n const handlerResult = isObservable(handlerResponse)\n ? await firstValueFrom(handlerResponse)\n : await handlerResponse;\n\n result.src = handlerResult.src;\n if (handlerResult.alt) result.name = handlerResult.alt;\n } catch (handlerError) {\n console.error(this.t().uploadError, handlerError);\n throw handlerError;\n }\n }\n\n this.uploadProgress.set(90);\n this.uploadMessage.set(actionMessage);\n this.forceEditorUpdate();\n\n // Final insertion\n insertionStrategy(editor, result);\n\n this.resetUploadState();\n } catch (error) {\n this.resetUploadState();\n console.error(this.t().uploadError, error);\n throw error;\n }\n }\n\n private resetUploadState() {\n this.isUploading.set(false);\n this.uploadProgress.set(0);\n this.uploadMessage.set(\"\");\n this.forceEditorUpdate();\n this.currentEditor = null;\n }\n\n /** Main entry point for file upload and insertion */\n async uploadAndInsertImage(editor: Editor, file: File, options?: Record<string, any>): Promise<void> {\n return this.uploadImageWithProgress(\n editor,\n file,\n (ed, result) => {\n this.insertImage(ed, {\n src: result.src,\n alt: result.name,\n title: `${result.name} (${result.width}×${result.height})`,\n width: result.width,\n height: result.height,\n });\n },\n this.t().insertingImage,\n options\n );\n }\n\n /** Trigger an editor transaction to force decoration update */\n private forceEditorUpdate() {\n if (this.currentEditor) {\n const { tr } = this.currentEditor.state;\n this.currentEditor.view.dispatch(tr);\n }\n }\n\n /** Generic helper to open file picker and process selection */\n private async selectFileAndProcess(\n editor: Editor,\n uploadMethod: (editor: Editor, file: File, options?: Record<string, any>) => Promise<void>,\n options?: Record<string, any>\n ): Promise<void> {\n return new Promise((resolve, reject) => {\n const input = document.createElement(\"input\");\n input.type = \"file\";\n input.accept = options?.['accept'] || \"image/*\";\n input.style.display = \"none\";\n\n input.addEventListener(\"change\", async (e) => {\n const file = (e.target as HTMLInputElement).files?.[0];\n if (file && file.type.startsWith(\"image/\")) {\n try {\n await uploadMethod(editor, file, options);\n resolve();\n } catch (error) { reject(error); }\n } else {\n reject(new Error(this.t().noFileSelected));\n }\n document.body.removeChild(input);\n });\n\n input.addEventListener(\"cancel\", () => {\n document.body.removeChild(input);\n reject(new Error(this.t().selectionCancelled));\n });\n\n document.body.appendChild(input);\n input.click();\n });\n }\n\n /** Select file and upload as new image */\n async selectAndUploadImage(editor: Editor, options?: Record<string, any>): Promise<void> {\n return this.selectFileAndProcess(editor, this.uploadAndInsertImage.bind(this), options);\n }\n\n /** Select file and replace currently selected image */\n async selectAndReplaceImage(editor: Editor, options?: Record<string, any>): Promise<void> {\n // No need for complicated backup/restore now that we don't delete prematurely.\n // The uploadAndReplaceImage will handle the atomic replacement.\n return this.selectFileAndProcess(editor, this.uploadAndReplaceImage.bind(this), options);\n }\n\n /** Internal helper used by replacement logic */\n async uploadAndReplaceImage(editor: Editor, file: File, options?: Record<string, any>): Promise<void> {\n // Store current position to ensure we can re-select the image even if selection blurs during upload\n const pos = editor.state.selection.from;\n const wasActive = editor.isActive(\"resizableImage\");\n\n await this.uploadImageWithProgress(\n editor,\n file,\n (ed, result) => {\n const imageData = {\n src: result.src,\n alt: result.name,\n title: `${result.name} (${result.width}×${result.height})`,\n width: result.width,\n height: result.height,\n };\n\n // If the image was active or is still active, update it atomically\n if (wasActive || ed.isActive(\"resizableImage\")) {\n ed.chain()\n .focus()\n .updateAttributes(\"resizableImage\", imageData)\n .setNodeSelection(pos)\n .run();\n this.updateSelectedImage(imageData);\n } else {\n // Otherwise replace whatever is selected (or insert at cursor)\n this.insertImage(ed, imageData);\n }\n\n // After replacement, ensure the image is tracked in our signals\n this.selectImage(ed);\n },\n this.t().replacingImage,\n options\n );\n }\n}\n","/**\n * Normalizes color values (rgb/rgba to hex).\n */\nexport function normalizeColor(color: string | null | undefined): string | null {\n if (!color || color === 'transparent' || color === 'rgba(0, 0, 0, 0)') return null;\n if (color.startsWith(\"#\")) return color;\n\n // Support both comma-separated (legacy) and space-separated (modern) rgb/rgba\n const rgbMatch = color\n .trim()\n .match(\n /^rgba?\\(\\s*([\\d.]+)[,\\s]+([\\d.]+)[,\\s]+([\\d.]+)(?:[,\\s/]+([\\d.]+))?\\s*\\)$/i\n );\n\n // If it's a named color or something else we don't recognize, \n // we can't easily normalize it to hex without a heavy dictionary.\n // However, getComputedStyle usually returns rgb() which we handle above.\n if (!rgbMatch) {\n // Simple fallback for common named colors if getComputedStyle fails to return rgb\n const named: Record<string, string> = { 'black': '#000000', 'white': '#ffffff', 'red': '#ff0000' };\n if (named[color.toLowerCase()]) return named[color.toLowerCase()]!;\n return null;\n }\n\n const r = Math.max(0, Math.min(255, Math.round(parseFloat(rgbMatch[1]!))));\n const g = Math.max(0, Math.min(255, Math.round(parseFloat(rgbMatch[2]!))));\n const b = Math.max(0, Math.min(255, Math.round(parseFloat(rgbMatch[3]!))));\n const a = rgbMatch[4] ? parseFloat(rgbMatch[4]) : 1;\n\n // If completely transparent, return null\n if (a === 0) return null;\n\n return (\n \"#\" +\n [r, g, b]\n .map((n) => n.toString(16).padStart(2, \"0\"))\n .join(\"\")\n .toLowerCase()\n );\n}\n\n/**\n * Calculate luminance (0-255).\n */\nexport function getLuminance(color: string | null | undefined): number {\n const normalized = normalizeColor(color);\n if (!normalized) return 0; // Default to dark (luminance 0) if no color\n const hex = normalized.replace(\"#\", \"\");\n const r = parseInt(hex.substring(0, 2), 16);\n const g = parseInt(hex.substring(2, 4), 16);\n const b = parseInt(hex.substring(4, 6), 16);\n return (r * 299 + g * 587 + b * 114) / 1000;\n}\n\n/**\n * Returns contrast color for readability.\n */\nexport function getContrastColor(color: string): \"black\" | \"white\" {\n return getLuminance(color) > 128 ? \"black\" : \"white\";\n}\n","import { Injectable, signal } from \"@angular/core\";\nimport type { Editor } from \"@tiptap/core\";\nimport { normalizeColor, getLuminance, getContrastColor } from \"../utils/color.utils\";\n\nexport interface ColorPickerSelection {\n from: number;\n to: number;\n}\n\nexport type ColorEditMode = 'text' | 'highlight';\n\n@Injectable()\nexport class ColorPickerService {\n private storedSelection: ColorPickerSelection | null = null;\n\n // ============================================\n // State Signals (owned by this service)\n // ============================================\n\n /** Current edit mode: null when closed, 'text' or 'highlight' when open */\n readonly editMode = signal<ColorEditMode | null>(null);\n\n /** Reference to the element that triggered the menu (for anchoring) */\n readonly menuTrigger = signal<HTMLElement | null>(null);\n\n /** Whether the user is currently interacting with the picker UI (e.g. typing) */\n readonly isInteracting = signal<boolean>(false);\n\n\n // ============================================\n // Menu Lifecycle Methods\n // ============================================\n\n /**\n * Open the color picker menu in the specified mode.\n */\n open(mode: ColorEditMode, trigger?: HTMLElement): void {\n this.menuTrigger.set(trigger || null);\n this.editMode.set(mode);\n }\n\n /**\n * Close the color picker menu.\n */\n close(): void {\n this.editMode.set(null);\n this.isInteracting.set(false);\n }\n\n\n /**\n * Set interaction state (prevents premature closing when blurring editor)\n */\n setInteracting(value: boolean): void {\n this.isInteracting.set(value);\n }\n\n\n /**\n * Toggle color picker from UI (extracts trigger from event).\n */\n toggle(editor: Editor, mode: ColorEditMode, event?: Event): void {\n if (!editor) return;\n\n let trigger: HTMLElement | undefined;\n if (event && typeof event !== 'string') {\n const target = event.target as HTMLElement;\n trigger = (event.currentTarget as HTMLElement) || target?.closest('button') || target;\n }\n\n this.open(mode, trigger);\n }\n\n // ============================================\n // Selection Capture (for reliable color application)\n // ============================================\n\n /**\n * Capture current editor selection.\n */\n captureSelection(editor: Editor): void {\n if (!editor) return;\n this.storedSelection = {\n from: editor.state.selection.from,\n to: editor.state.selection.to,\n };\n }\n\n /**\n * Get last captured selection.\n */\n getStoredSelection(): ColorPickerSelection | null {\n return this.storedSelection;\n }\n\n /**\n * Clear captured selection.\n */\n done(): void {\n this.storedSelection = null;\n this.menuTrigger.set(null);\n }\n\n\n // ============================================\n // Color Application Commands\n // ============================================\n\n /**\n * Apply text color to selection.\n */\n applyColor(editor: Editor, color: string, addToHistory: boolean = true, focus: boolean = true): void {\n if (!editor) return;\n\n const stored = this.storedSelection;\n let chain = editor.chain();\n if (focus) chain = chain.focus();\n\n if (stored && (editor.state.selection.empty || !editor.isFocused)) {\n chain = chain.setTextSelection(stored);\n } else if (editor.state.selection.empty && !stored) {\n chain = chain.extendMarkRange(\"textStyle\");\n }\n\n (chain as any).setColor(color);\n if (addToHistory === false) chain = (chain as any).setMeta(\"addToHistory\", false);\n chain.run();\n }\n\n /**\n * Remove text color from selection.\n */\n unsetColor(editor: Editor, focus: boolean = true): void {\n if (!editor) return;\n\n const stored = this.storedSelection;\n let chain = editor.chain();\n if (focus) chain = chain.focus();\n\n if (stored) {\n chain = chain.setTextSelection(stored);\n } else if (editor.state.selection.empty) {\n chain = chain.extendMarkRange(\"textStyle\");\n }\n\n (chain as any).unsetColor();\n chain.run();\n }\n\n /**\n * Apply highlight color to selection.\n */\n applyHighlight(editor: Editor, color: string, addToHistory: boolean = true, focus: boolean = true): void {\n if (!editor) return;\n\n const stored = this.storedSelection;\n let chain = editor.chain();\n if (focus) chain = chain.focus();\n\n if (stored && (editor.state.selection.empty || !editor.isFocused)) {\n chain = chain.setTextSelection(stored);\n } else if (editor.state.selection.empty && !stored) {\n chain = chain.extendMarkRange(\"highlight\");\n }\n\n (chain as any).setHighlight({ color });\n if (addToHistory === false) chain = (chain as any).setMeta(\"addToHistory\", false);\n chain.run();\n }\n\n /**\n * Remove highlight from selection.\n */\n unsetHighlight(editor: Editor, focus: boolean = true): void {\n if (!editor) return;\n\n const stored = this.storedSelection;\n let chain = editor.chain();\n if (focus) chain = chain.focus();\n\n if (stored) {\n chain = chain.setTextSelection(stored);\n } else if (editor.state.selection.empty) {\n chain = chain.extendMarkRange(\"highlight\");\n }\n\n (chain as any).unsetHighlight();\n chain.run();\n }\n\n\n // ============================================\n // Color Utilities (Delegated to color.utils.ts)\n // ============================================\n\n normalizeColor(color: string | null | undefined): string {\n return normalizeColor(color) || \"#000000\";\n }\n\n getLuminance(color: string): number {\n return getLuminance(color);\n }\n\n getContrastColor(color: string): \"black\" | \"white\" {\n return getContrastColor(color);\n }\n}\n\n\n","import { Injectable, signal } from \"@angular/core\";\nimport type { Editor } from \"@tiptap/core\";\n\n@Injectable()\nexport class LinkService {\n\n // ============================================\n // State Signals (owned by this service)\n // ============================================\n\n /** Whether link edit mode is active */\n readonly editMode = signal<boolean>(false);\n\n /** Reference to the element that triggered the menu (for anchoring) */\n readonly menuTrigger = signal<HTMLElement | null>(null);\n\n /** Whether the user is currently interacting with the link UI (input focus) */\n readonly isInteracting = signal<boolean>(false);\n\n\n // ============================================\n // Menu Lifecycle Methods\n // ============================================\n\n /**\n * Open the link edit menu.\n */\n open(trigger?: HTMLElement): void {\n this.menuTrigger.set(trigger || null);\n this.editMode.set(true);\n }\n\n /**\n * Close the link edit menu.\n */\n close(): void {\n this.editMode.set(false);\n this.isInteracting.set(false);\n }\n\n /**\n * Final cleanup (called after UI is hidden)\n */\n done(): void {\n this.menuTrigger.set(null);\n }\n\n\n /**\n * Set interaction state\n */\n setInteracting(value: boolean): void {\n this.isInteracting.set(value);\n }\n\n /**\n * Toggle link mode from UI.\n * If a URL string is provided, applies the link and closes.\n * If an Event is provided, extracts the trigger for anchoring.\n */\n toggle(editor: Editor, urlOrEvent?: string | Event): void {\n if (!editor) return;\n\n // If a string URL is provided, set the link and close\n if (urlOrEvent && typeof urlOrEvent === 'string') {\n this.setLink(editor, urlOrEvent);\n return;\n }\n\n // If an Event is provided, extract the trigger element\n let trigger: HTMLElement | undefined;\n if (urlOrEvent && typeof urlOrEvent !== 'string') {\n const target = (urlOrEvent as Event).target as HTMLElement;\n trigger = ((urlOrEvent as Event).currentTarget as HTMLElement) || target?.closest('button') || target;\n }\n\n // Open the edit menu\n this.open(trigger);\n }\n\n // ============================================\n // Link Commands\n // ============================================\n\n /**\n * Apply a link to the current selection.\n */\n setLink(editor: Editor, url: string): void {\n if (!editor) return;\n editor.chain().focus().extendMarkRange(\"link\").setLink({ href: url }).run();\n this.close();\n }\n\n /**\n * Remove link from the current selection.\n */\n unsetLink(editor: Editor): void {\n if (!editor) return;\n editor.chain().focus().extendMarkRange(\"link\").unsetLink().run();\n this.close();\n }\n}\n","import { Injectable, inject, signal } from \"@angular/core\";\nimport { Editor } from \"@tiptap/core\";\nimport { ImageService, ImageUploadHandler } from \"./image.service\";\nimport { ColorPickerService } from \"./color-picker.service\";\nimport { LinkService } from \"./link.service\";\nimport { EditorStateSnapshot, INITIAL_EDITOR_STATE } from \"../models/editor-state.model\";\n\n@Injectable()\nexport class EditorCommandsService {\n private imageService = inject(ImageService);\n private colorPickerSvc = inject(ColorPickerService);\n private linkSvc = inject(LinkService);\n private readonly _editorState = signal<EditorStateSnapshot>(INITIAL_EDITOR_STATE, {\n equal: (a, b) => {\n // 1. Primitive global states\n if (a.isFocused !== b.isFocused || a.isEditable !== b.isEditable) return false;\n\n // 2. Detailed selection comparison\n if (\n a.selection.from !== b.selection.from ||\n a.selection.to !== b.selection.to ||\n a.selection.type !== b.selection.type ||\n a.selection.empty !== b.selection.empty ||\n a.selection.isSingleCell !== b.selection.isSingleCell\n ) return false;\n\n // Helper for object comparison\n const isRecordEqual = (objA: Record<string, any>, objB: Record<string, any>) => {\n const keysA = Object.keys(objA);\n const keysB = Object.keys(objB);\n if (keysA.length !== keysB.length) return false;\n return keysA.every(key => objA[key] === objB[key]);\n };\n\n // 3. Compare sub-states (marks, can, nodes)\n if (!isRecordEqual(a.marks, b.marks)) return false;\n if (!isRecordEqual(a.can, b.can)) return false;\n if (!isRecordEqual(a.nodes, b.nodes)) return false;\n\n // 4. Compare custom extension states\n if (!isRecordEqual(a.custom, b.custom)) return false;\n\n return true;\n }\n });\n\n /** Exposed editor state as a readonly signal */\n readonly editorState = this._editorState.asReadonly();\n\n // ============================================\n // Toolbar Interaction State\n // ============================================\n\n /** Signal to track when the toolbar is being hovered/interacted with */\n private readonly _isToolbarInteracting = signal(false);\n readonly isToolbarInteracting = this._isToolbarInteracting.asReadonly();\n\n /** Set toolbar interaction state (called by editor component) */\n setToolbarInteracting(value: boolean): void {\n this._isToolbarInteracting.set(value);\n }\n\n // Access to ImageService states as readonly signals for UI binding\n readonly isUploading = this.imageService.isUploading.asReadonly();\n readonly uploadProgress = this.imageService.uploadProgress.asReadonly();\n readonly uploadMessage = this.imageService.uploadMessage.asReadonly();\n set uploadHandler(handler: ImageUploadHandler | null) { this.imageService.uploadHandler = handler; }\n\n /** Update state (called by TiptapStateExtension) */\n updateState(state: EditorStateSnapshot) {\n this._editorState.set(state);\n }\n\n // ============================================\n // Link State (proxied from LinkService)\n // ============================================\n\n /** Signal to toggle link edit mode from UI (Toolbar) - Immediate response */\n readonly linkEditMode = this.linkSvc.editMode.asReadonly();\n\n /** Reference to the element that triggered the link menu (for anchoring) */\n readonly linkMenuTrigger = this.linkSvc.menuTrigger.asReadonly();\n\n // ============================================\n // Color Picker State (proxied from ColorPickerService)\n // ============================================\n\n /** Signal to toggle color picker mode from UI (text or highlight) */\n readonly colorEditMode = this.colorPickerSvc.editMode.asReadonly();\n\n /** Reference to the element that triggered the color menu (for anchoring) */\n readonly colorMenuTrigger = this.colorPickerSvc.menuTrigger.asReadonly();\n\n // ============================================\n // Link Edit Methods (delegated to LinkService)\n // ============================================\n\n // ============================================\n // Command Execution\n // ============================================\n\n /** Generic method to execute any command by name */\n execute(editor: Editor, command: string, ...args: any[]): void {\n if (!editor) return;\n\n switch (command) {\n case \"toggleBold\": this.toggleBold(editor); break;\n case \"toggleItalic\": this.toggleItalic(editor); break;\n case \"toggleStrike\": this.toggleStrike(editor); break;\n case \"toggleCode\": this.toggleCode(editor); break;\n case \"toggleCodeBlock\": this.toggleCodeBlock(editor); break;\n case \"toggleUnderline\": this.toggleUnderline(editor); break;\n case \"toggleSuperscript\": this.toggleSuperscript(editor); break;\n case \"toggleSubscript\": this.toggleSubscript(editor); break;\n case \"toggleHeading\": this.toggleHeading(editor, args[0] as 1 | 2 | 3); break;\n case \"toggleBulletList\": this.toggleBulletList(editor); break;\n case \"toggleOrderedList\": this.toggleOrderedList(editor); break;\n case \"toggleBlockquote\": this.toggleBlockquote(editor); break;\n case \"setTextAlign\": this.setTextAlign(editor, args[0] as any); break;\n case \"toggleLink\": this.linkSvc.toggle(editor, args[0]); break;\n case \"unsetLink\": this.linkSvc.unsetLink(editor); break;\n case \"toggleColorPicker\": this.colorPickerSvc.toggle(editor, args[0] as 'text' | 'highlight', args[1] as Event); break;\n case \"insertHorizontalRule\": this.insertHorizontalRule(editor); break;\n case \"insertImage\": this.insertImage(editor, args[0]); break;\n case \"uploadImage\": this.uploadImage(editor, args[0], args[1]); break;\n case \"toggleHighlight\": this.toggleHighlight(editor, args[0] as string); break;\n case \"undo\": this.undo(editor); break;\n case \"redo\": this.redo(editor); break;\n case \"insertTable\": this.insertTable(editor, args[0], args[1]); break;\n case \"addColumnBefore\": this.addColumnBefore(editor); break;\n case \"addColumnAfter\": this.addColumnAfter(editor); break;\n case \"deleteColumn\": this.deleteColumn(editor); break;\n case \"addRowBefore\": this.addRowBefore(editor); break;\n case \"addRowAfter\": this.addRowAfter(editor); break;\n case \"deleteRow\": this.deleteRow(editor); break;\n case \"deleteTable\": this.deleteTable(editor); break;\n case \"mergeCells\": this.mergeCells(editor); break;\n case \"splitCell\": this.splitCell(editor); break;\n case \"toggleHeaderColumn\": this.toggleHeaderColumn(editor); break;\n case \"toggleHeaderRow\": this.toggleHeaderRow(editor); break;\n case \"applyColor\": this.colorPickerSvc.applyColor(editor, args[0], args[1], args[2]); break;\n case \"applyHighlight\": this.colorPickerSvc.applyHighlight(editor, args[0], args[1], args[2]); break;\n case \"unsetColor\": this.colorPickerSvc.unsetColor(editor, args[0]); break;\n case \"unsetHighlight\": this.colorPickerSvc.unsetHighlight(editor, args[0]); break;\n\n case \"clearContent\": this.clearContent(editor); break;\n }\n\n }\n\n // --- Formatting Commands ---\n\n toggleBold(editor: Editor): void {\n if (!editor) return;\n editor.chain().focus().toggleBold().run();\n }\n\n toggleItalic(editor: Editor): void {\n if (!editor) return;\n editor.chain().focus().toggleItalic().run();\n }\n\n toggleStrike(editor: Editor): void {\n if (!editor) return;\n editor.chain().focus().toggleStrike().run();\n }\n\n toggleCode(editor: Editor): void {\n if (!editor) return;\n editor.chain().focus().toggleCode().run();\n }\n\n toggleCodeBlock(editor: Editor): void {\n if (!editor) return;\n editor.chain().focus().toggleCodeBlock().run();\n }\n\n toggleUnderline(editor: Editor): void {\n if (!editor) return;\n editor.chain().focus().toggleUnderline().run();\n }\n\n toggleSuperscript(editor: Editor): void {\n if (!editor) return;\n editor.chain().focus().toggleSuperscript().run();\n }\n\n toggleSubscript(editor: Editor): void {\n if (!editor) return;\n editor.chain().focus().toggleSubscript().run();\n }\n\n toggleHeading(editor: Editor, level: 1 | 2 | 3): void {\n if (!editor) return;\n editor.chain().focus().toggleHeading({ level }).run();\n }\n\n toggleHighlight(editor: Editor, color?: string): void {\n if (!editor) return;\n if (color) {\n editor.chain().focus().setHighlight({ color }).run();\n } else {\n editor.chain().focus().toggleHighlight().run();\n }\n }\n\n\n // --- Structure Commands ---\n\n toggleBulletList(editor: Editor): void {\n if (!editor) return;\n editor.chain().focus().toggleBulletList().run();\n }\n\n toggleOrderedList(editor: Editor): void {\n if (!editor) return;\n editor.chain().focus().toggleOrderedList().run();\n }\n\n toggleBlockquote(editor: Editor): void {\n if (!editor) return;\n editor.chain().focus().toggleBlockquote().run();\n }\n\n setTextAlign(editor: Editor, alignment: \"left\" | \"center\" | \"right\" | \"justify\"): void {\n if (!editor) return;\n editor.chain().focus().setTextAlign(alignment).run();\n }\n\n insertHorizontalRule(editor: Editor): void {\n if (!editor) return;\n editor.chain().focus().setHorizontalRule().run();\n }\n\n // --- History Commands ---\n\n undo(editor: Editor): void {\n if (!editor) return;\n editor.chain().focus().undo().run();\n }\n\n redo(editor: Editor): void {\n if (!editor) return;\n editor.chain().focus().redo().run();\n }\n\n // --- Table Commands ---\n\n insertTable(editor: Editor, rows: number = 3, cols: number = 3): void {\n if (!editor) return;\n editor.chain().focus().insertTable({ rows, cols }).run();\n }\n\n addColumnBefore(editor: Editor): void {\n if (!editor) return;\n editor.chain().focus().addColumnBefore().run();\n }\n\n addColumnAfter(editor: Editor): void {\n if (!editor) return;\n editor.chain().focus().addColumnAfter().run();\n }\n\n deleteColumn(editor: Editor): void {\n if (!editor) return;\n editor.chain().focus().deleteColumn().run();\n }\n\n addRowBefore(editor: Editor): void {\n if (!editor) return;\n editor.chain().focus().addRowBefore().run();\n }\n\n addRowAfter(editor: Editor): void {\n if (!editor) return;\n editor.chain().focus().addRowAfter().run();\n }\n\n deleteRow(editor: Editor): void {\n if (!editor) return;\n editor.chain().focus().deleteRow().run();\n }\n\n deleteTable(editor: Editor): void {\n if (!editor) return;\n editor.chain().focus().deleteTable().run();\n }\n\n mergeCells(editor: Editor): void {\n if (!editor) return;\n editor.chain().focus().mergeCells().run();\n }\n\n splitCell(editor: Editor): void {\n if (!editor) return;\n editor.chain().focus().splitCell().run();\n }\n\n toggleHeaderColumn(editor: Editor): void {\n if (!editor) return;\n editor.chain().focus().toggleHeaderColumn().run();\n }\n\n toggleHeaderRow(editor: Editor): void {\n if (!editor) return;\n editor.chain().focus().toggleHeaderRow().run();\n }\n\n // --- Utility Commands ---\n\n clearContent(editor: Editor): void {\n if (!editor) return;\n editor.commands.clearContent(true);\n }\n\n focus(editor: Editor): void {\n if (!editor) return;\n editor.chain().focus().run();\n }\n\n blur(editor: Editor): void {\n if (!editor) return;\n editor.chain().blur().run();\n }\n\n setContent(editor: Editor, content: string, emitUpdate = true): void {\n if (!editor) return;\n editor.commands.setContent(content, emitUpdate);\n }\n\n setEditable(editor: Editor, editable: boolean): void {\n if (!editor) return;\n editor.setEditable(editable);\n }\n\n insertContent(editor: Editor, content: string): void {\n if (!editor) return;\n editor.chain().focus().insertContent(content).run();\n }\n\n async insertImage(\n editor: Editor,\n options?: {\n quality?: number;\n maxWidth?: number;\n maxHeight?: number;\n accept?: string;\n }\n ): Promise<void> {\n try {\n await this.imageService.selectAndUploadImage(editor, options);\n } catch (error) {\n console.error(\"Error inserting image:\", error);\n throw error;\n }\n }\n\n async uploadImage(\n editor: Editor,\n file: File,\n options?: {\n quality?: number;\n maxWidth?: number;\n maxHeight?: number;\n }\n ): Promise<void> {\n try {\n await this.imageService.uploadAndInsertImage(editor, file, options);\n } catch (error) {\n console.error(\"Error uploading image:\", error);\n throw error;\n }\n }\n}\n","import {\n Component,\n computed,\n inject,\n input,\n ChangeDetectionStrategy,\n} from \"@angular/core\";\nimport { CommonModule } from \"@angular/common\";\nimport type { Editor } from \"@tiptap/core\";\nimport { ColorPickerService } from \"../services/color-picker.service\";\nimport { TiptapButtonComponent } from \"../tiptap-button.component\";\nimport { TiptapI18nService } from \"../services/i18n.service\";\nimport { EditorCommandsService } from \"../services/editor-commands.service\";\n\nexport type ColorPickerMode = \"text\" | \"highlight\";\n\n@Component({\n selector: \"tiptap-color-picker\",\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [TiptapButtonComponent, CommonModule],\n template: `\n <div class=\"color-picker-wrapper\">\n <div class=\"color-picker-container\" [class.is-highlight]=\"mode() === 'highlight'\">\n <tiptap-button\n [icon]=\"buttonIcon()\"\n [title]=\"mode() === 'text' ? t().textColor : t().highlight\"\n [color]=\"buttonTextColor()\"\n [backgroundColor]=\"buttonBgColor()\"\n [disabled]=\"disabled() || !state().isEditable\"\n (onClick)=\"onToggle($event)\"\n />\n\n @if (hasColorApplied()) {\n <button\n class=\"btn-clear-badge\"\n type=\"button\"\n [title]=\"t().clear\"\n [attr.aria-label]=\"t().clear\"\n (click)=\"onClear($event)\"\n >\n <span class=\"material-symbols-outlined\">close</span>\n </button>\n }\n </div>\n </div>\n `,\n styles: [\n `\n .color-picker-wrapper {\n position: relative;\n display: inline-block;\n }\n\n .color-picker-container {\n position: relative;\n display: inline-flex;\n align-items: center;\n }\n\n .btn-clear-badge {\n position: absolute;\n top: -4px;\n right: -4px;\n width: 14px;\n height: 14px;\n padding: 0;\n border: none;\n border-radius: 999px;\n background: rgba(15, 23, 42, 0.75);\n color: #ffffff;\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 10;\n opacity: 0;\n pointer-events: none;\n transition: opacity 120ms ease;\n }\n\n .color-picker-container:hover .btn-clear-badge {\n opacity: 1;\n pointer-events: auto;\n }\n\n .btn-clear-badge .material-symbols-outlined {\n font-size: 10px;\n line-height: 1;\n }\n `,\n ],\n})\nexport class TiptapColorPickerComponent {\n editor = input.required<Editor>();\n mode = input<ColorPickerMode>(\"text\");\n disabled = input<boolean>(false);\n anchorToText = input<boolean>(false);\n\n private colorPickerSvc = inject(ColorPickerService);\n private i18nService = inject(TiptapI18nService);\n private editorCommands = inject(EditorCommandsService);\n\n readonly t = this.i18nService.toolbar;\n readonly state = this.editorCommands.editorState;\n\n readonly currentColor = computed(() => {\n const marks = this.state().marks;\n const color = this.mode() === \"text\" ? marks.computedColor : marks.computedBackground;\n return color || (this.mode() === \"text\" ? \"#000000\" : \"#ffff00\");\n });\n\n readonly hasColorApplied = computed(() => {\n const marks = this.state().marks;\n return (this.mode() === \"text\" ? marks.color : marks.background) !== null;\n });\n\n readonly buttonIcon = computed(() => {\n return this.mode() === \"text\" ? \"format_color_text\" : \"format_color_fill\";\n });\n\n readonly buttonBgColor = computed(() => {\n const color = this.currentColor();\n if (this.mode() === \"highlight\") {\n return this.hasColorApplied() ? color : \"\";\n }\n // For text mode, add contrast background if current color is too light\n if (this.colorPickerSvc.getLuminance(color) > 200) {\n return \"#030617\";\n }\n return \"\";\n });\n\n readonly buttonTextColor = computed(() => {\n const color = this.currentColor();\n if (this.mode() === \"text\") {\n return color;\n }\n if (this.hasColorApplied()) {\n return this.colorPickerSvc.getLuminance(color) > 128 ? \"#000000\" : \"#ffffff\";\n }\n return \"var(--ate-text-secondary)\";\n });\n\n onToggle(event: Event) {\n // If anchorToText is true, we don't pass the event so it defaults to text selection anchoring\n this.colorPickerSvc.toggle(this.editor(), this.mode(), this.anchorToText() ? undefined : event);\n }\n\n onClear(event: MouseEvent) {\n event.preventDefault();\n event.stopPropagation();\n\n const editor = this.editor();\n if (this.mode() === \"text\") {\n this.colorPickerSvc.unsetColor(editor);\n } else {\n this.colorPickerSvc.unsetHighlight(editor);\n }\n\n this.colorPickerSvc.close();\n }\n}\n","import { Component, input, inject, ChangeDetectionStrategy } from \"@angular/core\";\nimport { Editor } from \"@tiptap/core\";\nimport { TiptapButtonComponent } from \"./tiptap-button.component\";\nimport { TiptapSeparatorComponent } from \"./tiptap-separator.component\";\nimport { EditorCommandsService } from \"./services/editor-commands.service\";\nimport { TiptapI18nService } from \"./services/i18n.service\";\nimport { EditorStateSnapshot } from \"./models/editor-state.model\";\nimport { TiptapColorPickerComponent } from \"./components/tiptap-color-picker.component\";\n\nimport { ToolbarConfig } from \"./models/toolbar.model\";\n\n@Component({\n selector: \"tiptap-toolbar\",\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n TiptapButtonComponent,\n TiptapSeparatorComponent,\n TiptapColorPickerComponent,\n ],\n template: `\n <div class=\"tiptap-toolbar\" [class.floating]=\"floating()\">\n @if (config().bold) {\n <tiptap-button\n icon=\"format_bold\"\n [title]=\"t().bold\"\n [active]=\"state().marks.bold\"\n [disabled]=\"!state().can.toggleBold\"\n (onClick)=\"onCommand('toggleBold')\"\n />\n } @if (config().italic) {\n <tiptap-button\n icon=\"format_italic\"\n [title]=\"t().italic\"\n [active]=\"state().marks.italic\"\n [disabled]=\"!state().can.toggleItalic\"\n (onClick)=\"onCommand('toggleItalic')\"\n />\n } @if (config().underline) {\n <tiptap-button\n icon=\"format_underlined\"\n [title]=\"t().underline\"\n [active]=\"state().marks.underline\"\n [disabled]=\"!state().can.toggleUnderline\"\n (onClick)=\"onCommand('toggleUnderline')\"\n />\n } @if (config().strike) {\n <tiptap-button\n icon=\"strikethrough_s\"\n [title]=\"t().strike\"\n [active]=\"state().marks.strike\"\n [disabled]=\"!state().can.toggleStrike\"\n (onClick)=\"onCommand('toggleStrike')\"\n />\n } @if (config().code) {\n <tiptap-button\n icon=\"code\"\n [title]=\"t().code\"\n [active]=\"state().marks.code\"\n [disabled]=\"!state().can.toggleCode\"\n (onClick)=\"onCommand('toggleCode')\"\n />\n } @if (config().codeBlock) {\n <tiptap-button\n icon=\"terminal\"\n [title]=\"t().codeBlock\"\n [active]=\"state().nodes.isCodeBlock\"\n [disabled]=\"!state().can.toggleCodeBlock\"\n (onClick)=\"onCommand('toggleCodeBlock')\"\n />\n } @if (config().superscript) {\n <tiptap-button\n icon=\"superscript\"\n [title]=\"t().superscript\"\n [active]=\"state().marks.superscript\"\n [disabled]=\"!state().can.toggleSuperscript\"\n (onClick)=\"onCommand('toggleSuperscript')\"\n />\n } @if (config().subscript) {\n <tiptap-button\n icon=\"subscript\"\n [title]=\"t().subscript\"\n [active]=\"state().marks.subscript\"\n [disabled]=\"!state().can.toggleSubscript\"\n (onClick)=\"onCommand('toggleSubscript')\"\n />\n } @if (config().highlight) {\n <tiptap-button\n icon=\"highlight\"\n [title]=\"t().highlight\"\n [active]=\"state().marks.highlight\"\n [disabled]=\"!state().can.toggleHighlight\"\n (onClick)=\"onCommand('toggleHighlight')\"\n />\n } @if (config().highlightPicker) {\n <tiptap-color-picker \n mode=\"highlight\" \n [editor]=\"editor()\" \n [disabled]=\"!state().can.setHighlight\"\n />\n } @if (config().textColor) {\n <tiptap-color-picker \n mode=\"text\" \n [editor]=\"editor()\" \n [disabled]=\"!state().can.setColor\"\n />\n }\n \n @if (config().separator && (config().heading1 || config().heading2 || config().heading3)) {\n <tiptap-separator />\n } @if (config().heading1) {\n <tiptap-button\n icon=\"format_h1\"\n [title]=\"t().heading1\"\n [active]=\"state().nodes.h1\"\n [disabled]=\"!state().can.toggleHeading1\"\n (onClick)=\"onCommand('toggleHeading', 1)\"\n />\n } @if (config().heading2) {\n <tiptap-button\n icon=\"format_h2\"\n [title]=\"t().heading2\"\n [active]=\"state().nodes.h2\"\n [disabled]=\"!state().can.toggleHeading2\"\n (onClick)=\"onCommand('toggleHeading', 2)\"\n />\n } @if (config().heading3) {\n <tiptap-button\n icon=\"format_h3\"\n [title]=\"t().heading3\"\n [active]=\"state().nodes.h3\"\n [disabled]=\"!state().can.toggleHeading3\"\n (onClick)=\"onCommand('toggleHeading', 3)\"\n />\n } @if (config().separator && (config().bulletList || config().orderedList || config().blockquote)) {\n <tiptap-separator />\n } @if (config().bulletList) {\n <tiptap-button\n icon=\"format_list_bulleted\"\n [title]=\"t().bulletList\"\n [active]=\"state().nodes.isBulletList\"\n [disabled]=\"!state().can.toggleBulletList\"\n (onClick)=\"onCommand('toggleBulletList')\"\n />\n } @if (config().orderedList) {\n <tiptap-button\n icon=\"format_list_numbered\"\n [title]=\"t().orderedList\"\n [active]=\"state().nodes.isOrderedList\"\n [disabled]=\"!state().can.toggleOrderedList\"\n (onClick)=\"onCommand('toggleOrderedList')\"\n />\n } @if (config().blockquote) {\n <tiptap-button\n icon=\"format_quote\"\n [title]=\"t().blockquote\"\n [active]=\"state().nodes.isBlockquote\"\n [disabled]=\"!state().can.toggleBlockquote\"\n (onClick)=\"onCommand('toggleBlockquote')\"\n />\n } @if (config().separator && (config().alignLeft || config().alignCenter || config().alignRight || config().alignJustify)) {\n <tiptap-separator />\n } @if (config().alignLeft) {\n <tiptap-button\n icon=\"format_align_left\"\n [title]=\"t().alignLeft\"\n [active]=\"state().nodes.alignLeft\"\n [disabled]=\"!state().can.setTextAlignLeft\"\n (onClick)=\"onCommand('setTextAlign', 'left')\"\n />\n } @if (config().alignCenter) {\n <tiptap-button\n icon=\"format_align_center\"\n [title]=\"t().alignCenter\"\n [active]=\"state().nodes.alignCenter\"\n [disabled]=\"!state().can.setTextAlignCenter\"\n (onClick)=\"onCommand('setTextAlign', 'center')\"\n />\n } @if (config().alignRight) {\n <tiptap-button\n icon=\"format_align_right\"\n [title]=\"t().alignRight\"\n [active]=\"state().nodes.alignRight\"\n [disabled]=\"!state().can.setTextAlignRight\"\n (onClick)=\"onCommand('setTextAlign', 'right')\"\n />\n } @if (config().alignJustify) {\n <tiptap-button\n icon=\"format_align_justify\"\n [title]=\"t().alignJustify\"\n [active]=\"state().nodes.alignJustify\"\n [disabled]=\"!state().can.setTextAlignJustify\"\n (onClick)=\"onCommand('setTextAlign', 'justify')\"\n />\n } @if (config().separator && (config().link || config().horizontalRule)) {\n <tiptap-separator />\n } @if (config().link) {\n <tiptap-button\n icon=\"link\"\n [title]=\"t().link\"\n [active]=\"state().marks.link\"\n [disabled]=\"!state().can.toggleLink\"\n (onClick)=\"onCommand('toggleLink', $event)\"\n />\n } @if (config().horizontalRule) {\n <tiptap-button\n icon=\"horizontal_rule\"\n [title]=\"t().horizontalRule\"\n [disabled]=\"!state().can.insertHorizontalRule\"\n (onClick)=\"onCommand('insertHorizontalRule')\"\n />\n } @if (config().table) {\n <tiptap-button\n icon=\"table_view\"\n [title]=\"t().table\"\n [disabled]=\"!state().can.insertTable\"\n (onClick)=\"onCommand('insertTable')\"\n />\n } @if (config().separator && config().image) {\n <tiptap-separator />\n } @if (config().image) {\n <tiptap-button\n icon=\"image\"\n [title]=\"t().image\"\n [disabled]=\"!state().can.insertImage\"\n (onClick)=\"onCommand('insertImage', imageUpload())\"\n />\n } @if (config().separator && (config().undo || config().redo)) {\n <tiptap-separator />\n } @if (config().undo) {\n <tiptap-button\n icon=\"undo\"\n [title]=\"t().undo\"\n [disabled]=\"!state().can.undo\"\n (onClick)=\"onCommand('undo')\"\n />\n } @if (config().redo) {\n <tiptap-button\n icon=\"redo\"\n [title]=\"t().redo\"\n [disabled]=\"!state().can.redo\"\n (onClick)=\"onCommand('redo')\"\n />\n } @if (config().separator && config().clear) {\n <tiptap-separator />\n } @if (config().clear) {\n <tiptap-button\n icon=\"delete\"\n [title]=\"t().clear\"\n [disabled]=\"!state().isEditable\"\n (onClick)=\"onCommand('clearContent')\"\n />\n }\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n transition: opacity 0.3s ease;\n }\n\n :host-context(.floating-toolbar) {\n position: sticky;\n top: 3rem;\n left: 0;\n right: 0;\n z-index: 100;\n display: flex;\n height: 0;\n overflow: visible;\n pointer-events: none; /* Let clicks pass through to content if not on toolbar */\n opacity: 0;\n }\n\n :host-context(.floating-toolbar:focus-within),\n :host-context(.floating-toolbar:hover) {\n opacity: 1;\n }\n\n .tiptap-toolbar {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: var(--ate-toolbar-padding);\n background: var(--ate-toolbar-background);\n border-bottom: 1px solid var(--ate-toolbar-border-color);\n flex-wrap: wrap;\n min-height: 32px;\n position: relative;\n z-index: 50;\n border-top-left-radius: calc(var(--ate-menu-border-radius, 12px) - var(--ate-border-width, 2px));\n border-top-right-radius: calc(var(--ate-menu-border-radius, 12px) - var(--ate-border-width, 2px));\n }\n\n /* Floating Toolbar Mode */\n .tiptap-toolbar.floating {\n pointer-events: auto;\n border-radius: var(--ate-menu-border-radius, 12px);\n border: 1px solid var(--ate-menu-border) !important;\n box-shadow: var(--ate-menu-shadow) !important;\n background: var(--ate-menu-bg) !important;\n padding: var(--ate-menu-padding) !important;\n flex-wrap: nowrap;\n overflow-x: auto;\n max-width: 95vw;\n scrollbar-width: none;\n \n transform: translateY(0);\n transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n .tiptap-toolbar.floating::-webkit-scrollbar {\n display: none;\n }\n\n :host-context(.floating-toolbar:focus-within) .tiptap-toolbar.floating,\n :host-context(.floating-toolbar:hover) .tiptap-toolbar.floating {\n transform: translateY(-2rem);\n }\n\n @media (max-width: 768px) {\n .tiptap-toolbar {\n padding: 6px 8px;\n gap: 2px;\n }\n }\n\n @keyframes toolbarSlideIn {\n from {\n opacity: 0;\n transform: translateY(-10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n\n .tiptap-toolbar {\n animation: toolbarSlideIn 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n `,\n ],\n})\nexport class TiptapToolbarComponent {\n editor = input.required<Editor>();\n config = input.required<ToolbarConfig>();\n imageUpload = input<any>({});\n floating = input<boolean>(false);\n\n private i18nService = inject(TiptapI18nService);\n private editorCommands = inject(EditorCommandsService);\n\n readonly t = this.i18nService.toolbar;\n readonly state = this.editorCommands.editorState;\n\n onCommand(command: string, ...args: any[]) {\n const editor = this.editor();\n if (!editor) return;\n this.editorCommands.execute(editor, command, ...args);\n }\n}\n\n","import {\n Directive,\n input,\n ViewChild,\n ElementRef,\n OnInit,\n OnDestroy,\n inject,\n effect,\n} from \"@angular/core\";\nimport tippy, { Instance as TippyInstance, sticky } from \"tippy.js\";\nimport { Editor } from \"@tiptap/core\";\nimport { EditorCommandsService } from \"../services/editor-commands.service\";\nimport { TiptapI18nService } from \"../services/i18n.service\";\n\n/**\n * Base abstract class for all Bubble Menus (Text, Image, Table, Cell).\n * Handles common logic for Tippy.js initialization, positioning, and visibility.\n */\n@Directive()\nexport abstract class TiptapBaseBubbleMenu implements OnInit, OnDestroy {\n protected readonly i18nService = inject(TiptapI18nService);\n protected readonly editorCommands = inject(EditorCommandsService);\n\n // Core Inputs\n editor = input.required<Editor>();\n\n // Required ViewChild for the menu container\n @ViewChild(\"menuRef\", { static: false }) menuRef!: ElementRef<HTMLDivElement>;\n\n // Internal State\n protected tippyInstance: TippyInstance | null = null;\n protected updateTimeout: any = null;\n\n // Toolbar interaction state (from centralized service)\n protected readonly isToolbarInteracting = this.editorCommands.isToolbarInteracting;\n\n // Reactive state alias for templates\n readonly state = this.editorCommands.editorState;\n\n constructor() {\n // Effect to reactively update the menu when editor state\n // or toolbar interaction changes.\n effect(() => {\n this.state();\n this.isToolbarInteracting();\n // Also react to link/color edit modes to hide when sub-menus activate\n this.editorCommands.linkEditMode();\n this.editorCommands.colorEditMode();\n\n this.updateMenu();\n });\n }\n\n ngOnInit() {\n this.initTippy();\n }\n\n ngOnDestroy() {\n if (this.updateTimeout) {\n clearTimeout(this.updateTimeout);\n }\n if (this.tippyInstance) {\n this.tippyInstance.destroy();\n this.tippyInstance = null;\n }\n }\n\n /**\n * Initializes the Tippy instance.\n * Can be overridden for specific Tippy configurations.\n */\n protected initTippy() {\n if (!this.menuRef?.nativeElement) {\n // Re-try if the view child is not yet available\n setTimeout(() => this.initTippy(), 50);\n return;\n }\n\n const ed = this.editor();\n if (this.tippyInstance) {\n this.tippyInstance.destroy();\n }\n\n this.tippyInstance = tippy(document.body, {\n content: this.menuRef.nativeElement,\n trigger: \"manual\",\n placement: \"top-start\",\n appendTo: () => (ed ? ed.options.element : document.body),\n interactive: true,\n hideOnClick: false,\n arrow: false,\n offset: [0, 8],\n plugins: [sticky],\n sticky: false,\n getReferenceClientRect: () => this.getSelectionRect(),\n popperOptions: {\n modifiers: [\n {\n name: \"preventOverflow\",\n options: {\n boundary: this.editor().options.element,\n padding: 8,\n },\n },\n {\n name: \"flip\",\n options: {\n fallbackPlacements: [\"bottom-start\", \"top-end\", \"bottom-end\"],\n },\n },\n ],\n },\n onShow: (instance) => this.onTippyShow(instance),\n onHide: (instance) => this.onTippyHide(instance),\n });\n\n this.updateMenu();\n\n }\n\n /**\n * Core logic to decide whether to show or hide the menu.\n */\n updateMenu = () => {\n if (this.updateTimeout) {\n clearTimeout(this.updateTimeout);\n }\n\n this.updateTimeout = setTimeout(() => {\n const ed = this.editor();\n if (!ed) return;\n\n // Hide when interacting with the main toolbar\n if (this.isToolbarInteracting()) {\n this.hideTippy();\n return;\n }\n\n if (this.shouldShow()) {\n this.showTippy();\n } else {\n this.hideTippy();\n }\n }, 10);\n };\n\n /**\n * Helper to show the Tippy instance with updated positioning.\n */\n showTippy() {\n if (!this.tippyInstance) return;\n\n // Update position before showing\n this.tippyInstance.setProps({\n getReferenceClientRect: () => this.getSelectionRect(),\n sticky: \"reference\",\n });\n this.tippyInstance.show();\n }\n\n /**\n * Helper to hide the Tippy instance.\n */\n hideTippy() {\n if (this.tippyInstance) {\n this.tippyInstance.setProps({ sticky: false });\n this.tippyInstance.hide();\n }\n }\n\n /**\n * Common command handler for buttons in the menu.\n */\n onCommand(command: string, event?: Event) {\n if (event) {\n event.preventDefault();\n event.stopPropagation();\n }\n const ed = this.editor();\n if (ed) {\n this.executeCommand(ed, command);\n this.updateMenu();\n }\n }\n\n\n\n /**\n * Shared helper to get the bounding rect of the current selection.\n * Uses a combination of native selection and ProseMirror coordinates.\n */\n protected getRectForSelection(ed: Editor): DOMRect {\n if (!ed) return new DOMRect(0, 0, 0, 0);\n\n const { from, to, empty } = ed.state.selection;\n if (empty) return new DOMRect(-9999, -9999, 0, 0);\n\n // 1. Try native selection for multi-line accuracy\n const selection = window.getSelection();\n if (selection && selection.rangeCount > 0) {\n const range = selection.getRangeAt(0);\n const rect = range.getBoundingClientRect();\n\n // Ensure the rect is valid and belongs to the editor\n if (rect.width > 0 && rect.height > 0) {\n return rect;\n }\n }\n\n // 2. Fallback to Tiptap coordinates for precision (single line / edge cases)\n const start = ed.view.coordsAtPos(from);\n const end = ed.view.coordsAtPos(to);\n\n const top = Math.min(start.top, end.top);\n const bottom = Math.max(start.bottom, end.bottom);\n const left = Math.min(start.left, end.left);\n const right = Math.max(start.right, end.right);\n\n return new DOMRect(left, top, right - left, bottom - top);\n }\n\n // --- Abstract methods to be implemented by sub-components ---\n\n /**\n * Returns the Rect representing the target for positioning the menu.\n */\n abstract getSelectionRect(): DOMRect;\n\n /**\n * Returns whether the menu should be displayed based on current state.\n */\n abstract shouldShow(): boolean;\n\n /**\n * Executes the given command on the editor.\n */\n protected abstract executeCommand(editor: Editor, command: string): void;\n\n /**\n * Optional hook called when Tippy is about to be shown.\n */\n protected onTippyShow(instance: TippyInstance) { }\n\n /**\n * Optional hook called when Tippy is about to be hidden.\n */\n protected onTippyHide(instance: TippyInstance) { }\n}\n","import {\n Component,\n input,\n ChangeDetectionStrategy,\n computed,\n OnInit,\n OnDestroy,\n} from \"@angular/core\";\nimport { type Editor } from \"@tiptap/core\";\nimport { TiptapButtonComponent } from \"./tiptap-button.component\";\nimport { TiptapColorPickerComponent } from \"./components/tiptap-color-picker.component\";\nimport { BubbleMenuConfig } from \"./models/bubble-menu.model\";\nimport { TiptapBaseBubbleMenu } from \"./base/tiptap-base-bubble-menu\";\n\n@Component({\n selector: \"tiptap-bubble-menu\",\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n TiptapButtonComponent,\n TiptapColorPickerComponent,\n ],\n template: `\n <div #menuRef class=\"bubble-menu\" (mousedown)=\"$event.preventDefault()\">\n @if (bubbleMenuConfig().bold) {\n <tiptap-button\n icon=\"format_bold\"\n [title]=\"t().bold\"\n [active]=\"state().marks.bold\"\n [disabled]=\"!state().can.toggleBold\"\n (onClick)=\"onCommand('toggleBold', $event)\"\n ></tiptap-button>\n } @if (bubbleMenuConfig().italic) {\n <tiptap-button\n icon=\"format_italic\"\n [title]=\"t().italic\"\n [active]=\"state().marks.italic\"\n [disabled]=\"!state().can.toggleItalic\"\n (onClick)=\"onCommand('toggleItalic', $event)\"\n ></tiptap-button>\n } @if (bubbleMenuConfig().underline) {\n <tiptap-button\n icon=\"format_underlined\"\n [title]=\"t().underline\"\n [active]=\"state().marks.underline\"\n [disabled]=\"!state().can.toggleUnderline\"\n (onClick)=\"onCommand('toggleUnderline', $event)\"\n ></tiptap-button>\n } @if (bubbleMenuConfig().strike) {\n <tiptap-button\n icon=\"strikethrough_s\"\n [title]=\"t().strike\"\n [active]=\"state().marks.strike\"\n [disabled]=\"!state().can.toggleStrike\"\n (onClick)=\"onCommand('toggleStrike', $event)\"\n ></tiptap-button>\n } @if (bubbleMenuConfig().code) {\n <tiptap-button\n icon=\"code\"\n [title]=\"t().code\"\n [active]=\"state().marks.code\"\n [disabled]=\"!state().can.toggleCode\"\n (onClick)=\"onCommand('toggleCode', $event)\"\n ></tiptap-button>\n } @if (bubbleMenuConfig().superscript) {\n <tiptap-button\n icon=\"superscript\"\n [title]=\"t().superscript\"\n [active]=\"state().marks.superscript\"\n [disabled]=\"!state().can.toggleSuperscript\"\n (onClick)=\"onCommand('toggleSuperscript', $event)\"\n ></tiptap-button>\n } @if (bubbleMenuConfig().subscript) {\n <tiptap-button\n icon=\"subscript\"\n [title]=\"t().subscript\"\n [active]=\"state().marks.subscript\"\n [disabled]=\"!state().can.toggleSubscript\"\n (onClick)=\"onCommand('toggleSubscript', $event)\"\n ></tiptap-button>\n } @if (bubbleMenuConfig().highlight) {\n <tiptap-button\n icon=\"highlight\"\n [title]=\"t().highlight\"\n [active]=\"state().marks.highlight\"\n [disabled]=\"!state().can.toggleHighlight\"\n (onClick)=\"onCommand('toggleHighlight', $event)\"\n ></tiptap-button>\n } @if (bubbleMenuConfig().highlightPicker) {\n <tiptap-color-picker\n mode=\"highlight\"\n [editor]=\"editor()\"\n [disabled]=\"!state().can.setHighlight\"\n [anchorToText]=\"true\"\n />\n } @if (bubbleMenuConfig().textColor) {\n <tiptap-color-picker\n mode=\"text\"\n [editor]=\"editor()\"\n [disabled]=\"!state().can.setColor\"\n [anchorToText]=\"true\"\n />\n } @if (bubbleMenuConfig().link) {\n <tiptap-button\n icon=\"link\"\n [title]=\"t().link\"\n [active]=\"state().marks.link\"\n [disabled]=\"!state().can.toggleLink\"\n (onClick)=\"onCommand('toggleLink', $event)\"\n ></tiptap-button>\n }\n </div>\n `,\n})\nexport class TiptapBubbleMenuComponent extends TiptapBaseBubbleMenu implements OnInit, OnDestroy {\n readonly t = this.i18nService.bubbleMenu;\n\n override ngOnInit() {\n super.ngOnInit();\n const ed = this.editor();\n // Specialized mousedown listener for the text bubble menu:\n // This is necessary to hide the menu immediately when clicking elsewhere,\n // avoiding a 'jumping' effect where the menu moves to the new cursor position\n // before the reactive state has time to hide it.\n if (ed?.view?.dom) {\n ed.view.dom.addEventListener(\"mousedown\", this.onMouseDown, { capture: true });\n }\n }\n\n override ngOnDestroy() {\n super.ngOnDestroy();\n const ed = this.editor();\n if (ed?.view?.dom) {\n ed.view.dom.removeEventListener(\"mousedown\", this.onMouseDown, { capture: true });\n }\n }\n\n private onMouseDown = () => {\n this.hideTippy();\n };\n\n config = input<BubbleMenuConfig>({\n bold: true,\n italic: true,\n underline: true,\n strike: true,\n code: true,\n superscript: false,\n subscript: false,\n highlight: true,\n textColor: false,\n link: true,\n separator: true,\n });\n\n bubbleMenuConfig = computed(() => ({\n bold: true,\n italic: true,\n underline: true,\n strike: true,\n code: true,\n superscript: false,\n subscript: false,\n highlight: true,\n textColor: false,\n link: true,\n separator: true,\n ...this.config(),\n }));\n\n override shouldShow(): boolean {\n const { selection, nodes, isEditable, isFocused } = this.state();\n\n if (!isEditable) {\n return false;\n }\n\n // PRIORITY: If we are editing a link or color, HIDE this main bubble menu\n // to give full priority to the specialized sub-menus.\n if (this.editorCommands.linkEditMode() || this.editorCommands.colorEditMode()) {\n return false;\n }\n\n // Now we can check focus for the standard text selection menu\n if (!isFocused) {\n return false;\n }\n\n // Only show text bubble menu if there is a non-empty text selection\n // and no higher-priority node (image, table) is selected.\n return (\n selection.type === 'text' &&\n !selection.empty &&\n !nodes.isImage &&\n !nodes.isTableNodeSelected\n );\n }\n\n override getSelectionRect(): DOMRect {\n return this.getRectForSelection(this.editor());\n }\n\n protected override executeCommand(editor: Editor, command: string, ...args: any[]): void {\n this.editorCommands.execute(editor, command, ...args);\n }\n\n protected override onTippyHide() {\n // Sub-menus now manage their own state. Clearing them here causes \n // premature closing when clicking between 'sibling' menu instances.\n }\n}\n","import {\n Component,\n input,\n ChangeDetectionStrategy,\n computed,\n inject,\n} from \"@angular/core\";\nimport { type Editor } from \"@tiptap/core\";\nimport { TiptapButtonComponent } from \"./tiptap-button.component\";\nimport { TiptapSeparatorComponent } from \"./tiptap-separator.component\";\nimport { ImageService } from \"./services/image.service\";\nimport { ImageBubbleMenuConfig } from \"./models/bubble-menu.model\";\nimport { TiptapBaseBubbleMenu } from \"./base/tiptap-base-bubble-menu\";\n\n@Component({\n selector: \"tiptap-image-bubble-menu\",\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [TiptapButtonComponent, TiptapSeparatorComponent],\n template: `\n <div #menuRef class=\"bubble-menu\" (mousedown)=\"$event.preventDefault()\">\n @if (imageBubbleMenuConfig().changeImage) {\n <tiptap-button\n icon=\"drive_file_rename_outline\"\n [title]=\"t().changeImage\"\n (onClick)=\"onCommand('changeImage', $event)\"\n ></tiptap-button>\n } @if (imageBubbleMenuConfig().separator && hasResizeButtons()) {\n <tiptap-separator />\n } @if (imageBubbleMenuConfig().resizeSmall) {\n <tiptap-button\n icon=\"crop_square\"\n iconSize=\"small\"\n [title]=\"t().resizeSmall\"\n (onClick)=\"onCommand('resizeSmall', $event)\"\n ></tiptap-button>\n } @if (imageBubbleMenuConfig().resizeMedium) {\n <tiptap-button\n icon=\"crop_square\"\n iconSize=\"medium\"\n [title]=\"t().resizeMedium\"\n (onClick)=\"onCommand('resizeMedium', $event)\"\n ></tiptap-button>\n } @if (imageBubbleMenuConfig().resizeLarge) {\n <tiptap-button\n icon=\"crop_square\"\n iconSize=\"large\"\n [title]=\"t().resizeLarge\"\n (onClick)=\"onCommand('resizeLarge', $event)\"\n ></tiptap-button>\n } @if (imageBubbleMenuConfig().resizeOriginal) {\n <tiptap-button\n icon=\"photo_size_select_actual\"\n [title]=\"t().resizeOriginal\"\n (onClick)=\"onCommand('resizeOriginal', $event)\"\n ></tiptap-button>\n } @if (imageBubbleMenuConfig().separator &&\n imageBubbleMenuConfig().deleteImage) {\n <tiptap-separator />\n } @if (imageBubbleMenuConfig().deleteImage) {\n <tiptap-button\n icon=\"delete\"\n [title]=\"t().deleteImage\"\n variant=\"danger\"\n (onClick)=\"onCommand('deleteImage', $event)\"\n ></tiptap-button>\n }\n </div>\n `,\n})\nexport class TiptapImageBubbleMenuComponent extends TiptapBaseBubbleMenu {\n readonly t = this.i18nService.imageUpload;\n private readonly imageService = inject(ImageService);\n\n config = input<ImageBubbleMenuConfig>({\n changeImage: true,\n resizeSmall: true,\n resizeMedium: true,\n resizeLarge: true,\n resizeOriginal: true,\n deleteImage: true,\n separator: true,\n });\n\n imageBubbleMenuConfig = computed(() => ({\n changeImage: this.config().changeImage ?? true,\n resizeSmall: this.config().resizeSmall ?? true,\n resizeMedium: this.config().resizeMedium ?? true,\n resizeLarge: this.config().resizeLarge ?? true,\n resizeOriginal: this.config().resizeOriginal ?? true,\n deleteImage: this.config().deleteImage ?? true,\n separator: this.config().separator ?? true,\n }));\n\n hasResizeButtons = computed(() => {\n const c = this.imageBubbleMenuConfig();\n return (\n c.resizeSmall ||\n c.resizeMedium ||\n c.resizeLarge ||\n c.resizeOriginal\n );\n });\n\n override shouldShow(): boolean {\n const { nodes, isEditable, isFocused } = this.state();\n\n if (this.editorCommands.linkEditMode() || this.editorCommands.colorEditMode()) {\n return false;\n }\n\n return nodes.isImage && isEditable && isFocused;\n }\n\n override getSelectionRect(): DOMRect {\n const ed = this.editor();\n if (!ed) return new DOMRect(0, 0, 0, 0);\n\n const { from } = ed.state.selection;\n\n try {\n // 1. Direct ProseMirror approach: get DOM node at position\n const dom = ed.view.nodeDOM(from);\n if (dom instanceof HTMLElement) {\n // If it's a resizable container, look for the image inside\n if (dom.classList.contains(\"resizable-image-container\")) {\n const img = dom.querySelector(\"img\");\n if (img) return img.getBoundingClientRect();\n }\n return dom.getBoundingClientRect();\n }\n } catch (e) {\n // Fallback if nodeDOM fails\n }\n\n // 2. Ultimate fallback: find selected image in DOM\n const selectedImg = ed.view.dom.querySelector('img.selected, .resizable-image-container.selected img');\n if (selectedImg) {\n return selectedImg.getBoundingClientRect();\n }\n\n // If nothing found at all\n return new DOMRect(-9999, -9999, 0, 0);\n }\n\n protected override executeCommand(editor: Editor, command: string): void {\n switch (command) {\n case \"changeImage\":\n this.changeImage();\n break;\n case \"resizeSmall\":\n this.imageService.resizeImageToSmall(editor);\n break;\n case \"resizeMedium\":\n this.imageService.resizeImageToMedium(editor);\n break;\n case \"resizeLarge\":\n this.imageService.resizeImageToLarge(editor);\n break;\n case \"resizeOriginal\":\n this.imageService.resizeImageToOriginal(editor);\n break;\n case \"deleteImage\":\n this.deleteImage();\n break;\n }\n }\n\n private async changeImage() {\n const ed = this.editor();\n if (!ed) return;\n\n try {\n // Use dedicated method to replace an existing image\n await this.imageService.selectAndReplaceImage(ed, {\n quality: 0.8,\n maxWidth: 1920,\n maxHeight: 1080,\n accept: \"image/*\",\n });\n } catch (error) {\n console.error(this.i18nService.imageUpload().uploadError, error);\n }\n }\n\n private deleteImage() {\n const ed = this.editor();\n if (ed) {\n ed.chain().focus().deleteSelection().run();\n }\n }\n}\n","import {\n Component,\n input,\n ChangeDetectionStrategy,\n} from \"@angular/core\";\nimport { CommonModule } from \"@angular/common\";\nimport { type Editor } from \"@tiptap/core\";\nimport { TiptapButtonComponent } from \"./tiptap-button.component\";\nimport { TiptapSeparatorComponent } from \"./tiptap-separator.component\";\nimport { TiptapBaseBubbleMenu } from \"./base/tiptap-base-bubble-menu\";\n\n@Component({\n selector: \"tiptap-table-bubble-menu\",\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, TiptapButtonComponent, TiptapSeparatorComponent],\n template: `\n <div #menuRef class=\"bubble-menu\" (mousedown)=\"$event.preventDefault()\">\n <!-- Row actions -->\n @if (config().addRowBefore !== false) {\n <tiptap-button\n icon=\"add_row_above\"\n [title]=\"t().addRowBefore\"\n [disabled]=\"!state().can.addRowBefore\"\n (onClick)=\"onCommand('addRowBefore', $event)\"\n ></tiptap-button>\n } @if (config().addRowAfter !== false) {\n <tiptap-button\n icon=\"add_row_below\"\n [title]=\"t().addRowAfter\"\n [disabled]=\"!state().can.addRowAfter\"\n (onClick)=\"onCommand('addRowAfter', $event)\"\n ></tiptap-button>\n } @if (config().deleteRow !== false) {\n <tiptap-button\n icon=\"delete\"\n [title]=\"t().deleteRow\"\n variant=\"danger\"\n [disabled]=\"!state().can.deleteRow\"\n (onClick)=\"onCommand('deleteRow', $event)\"\n ></tiptap-button>\n } @if (config().separator !== false) {\n <tiptap-separator />\n }\n\n <!-- Column actions -->\n @if (config().addColumnBefore !== false) {\n <tiptap-button\n icon=\"add_column_left\"\n [title]=\"t().addColumnBefore\"\n [disabled]=\"!state().can.addColumnBefore\"\n (onClick)=\"onCommand('addColumnBefore', $event)\"\n ></tiptap-button>\n } @if (config().addColumnAfter !== false) {\n <tiptap-button\n icon=\"add_column_right\"\n [title]=\"t().addColumnAfter\"\n [disabled]=\"!state().can.addColumnAfter\"\n (onClick)=\"onCommand('addColumnAfter', $event)\"\n ></tiptap-button>\n } @if (config().deleteColumn !== false) {\n <tiptap-button\n icon=\"delete\"\n [title]=\"t().deleteColumn\"\n variant=\"danger\"\n [disabled]=\"!state().can.deleteColumn\"\n (onClick)=\"onCommand('deleteColumn', $event)\"\n ></tiptap-button>\n } @if (config().separator !== false) {\n <tiptap-separator />\n }\n\n <!-- Cell actions -->\n @if (config().toggleHeaderRow !== false) {\n <tiptap-button\n icon=\"toolbar\"\n [title]=\"t().toggleHeaderRow\"\n [active]=\"state().nodes.isTableHeaderRow\"\n [disabled]=\"!state().can.toggleHeaderRow\"\n (onClick)=\"onCommand('toggleHeaderRow', $event)\"\n ></tiptap-button>\n } @if (config().toggleHeaderColumn !== false) {\n <tiptap-button\n icon=\"dock_to_right\"\n [title]=\"t().toggleHeaderColumn\"\n [active]=\"state().nodes.isTableHeaderColumn\"\n [disabled]=\"!state().can.toggleHeaderColumn\"\n (onClick)=\"onCommand('toggleHeaderColumn', $event)\"\n ></tiptap-button>\n } @if (config().separator !== false && config().deleteTable !== false) {\n <tiptap-separator />\n }\n\n <!-- Table actions -->\n @if (config().deleteTable !== false) {\n <tiptap-button\n icon=\"delete_forever\"\n [title]=\"t().deleteTable\"\n variant=\"danger\"\n [disabled]=\"!state().can.deleteTable\"\n (onClick)=\"onCommand('deleteTable', $event)\"\n ></tiptap-button>\n }\n </div>\n `,\n})\nexport class TiptapTableBubbleMenuComponent extends TiptapBaseBubbleMenu {\n // Alias for template\n readonly t = this.i18nService.table;\n\n config = input<any>({\n addRowBefore: true,\n addRowAfter: true,\n deleteRow: true,\n addColumnBefore: true,\n addColumnAfter: true,\n deleteColumn: true,\n deleteTable: true,\n toggleHeaderRow: true,\n toggleHeaderColumn: true,\n separator: true,\n });\n\n override shouldShow(): boolean {\n const { selection, nodes, isEditable, isFocused } = this.state();\n\n if (this.editorCommands.linkEditMode() || this.editorCommands.colorEditMode()) {\n return false;\n }\n\n // Only show table bubble menu if:\n // 1. We are inside a table (nodes.isTable)\n // 2. Editor is editable and focused\n // 3. Selection is EMPTY (cursor) OR the Table node itself is selected\n // 4. It's NOT a CellSelection (cell bubble menu takes priority)\n return (\n nodes.isTable &&\n isEditable &&\n isFocused &&\n (selection.empty || nodes.isTableNodeSelected) &&\n selection.type !== 'cell'\n );\n }\n\n override getSelectionRect(): DOMRect {\n const ed = this.editor();\n if (!ed) return new DOMRect(0, 0, 0, 0);\n\n const { from } = ed.state.selection;\n\n try {\n // 1. Direct ProseMirror approach: get DOM node at position\n const dom = ed.view.domAtPos(from).node;\n\n // Find closest table element\n const tableElement = dom instanceof HTMLElement\n ? dom.closest('table')\n : dom.parentElement?.closest('table');\n\n if (tableElement) {\n return tableElement.getBoundingClientRect();\n }\n } catch (e) {\n // Fallback\n }\n\n // 2. Fallback via coordinates\n const coords = ed.view.coordsAtPos(from);\n if (coords) {\n // Search for table element at these coordinates\n const element = document.elementFromPoint(coords.left, coords.top);\n const table = element?.closest('table');\n if (table) return table.getBoundingClientRect();\n }\n\n // 3. Ultimate fallback if selection is ambiguous\n const activeTable = ed.view.dom.querySelector('table.selected, table:has(.selected), table:has(.selected-cell), table:has(.selected-node)');\n if (activeTable) {\n return activeTable.getBoundingClientRect();\n }\n\n return new DOMRect(-9999, -9999, 0, 0);\n }\n\n protected override executeCommand(editor: Editor, command: string): void {\n this.editorCommands.execute(editor, command);\n }\n}\n","import {\n Component,\n input,\n ChangeDetectionStrategy,\n} from \"@angular/core\";\nimport { CommonModule } from \"@angular/common\";\nimport { type Editor } from \"@tiptap/core\";\nimport { TiptapButtonComponent } from \"./tiptap-button.component\";\nimport { TiptapBaseBubbleMenu } from \"./base/tiptap-base-bubble-menu\";\n\nimport { CellBubbleMenuConfig } from \"./models/bubble-menu.model\";\n\n@Component({\n selector: \"tiptap-cell-bubble-menu\",\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, TiptapButtonComponent],\n template: `\n <div #menuRef class=\"bubble-menu\" (mousedown)=\"$event.preventDefault()\">\n <!-- Cell specific actions -->\n @if (config().mergeCells !== false && !state().selection.isSingleCell) {\n <tiptap-button\n icon=\"cell_merge\"\n [title]=\"i18n().table().mergeCells\"\n [disabled]=\"!state().can.mergeCells\"\n (onClick)=\"onCommand('mergeCells', $event)\"\n ></tiptap-button>\n } @if (config().splitCell !== false && state().selection.isSingleCell) {\n <tiptap-button\n icon=\"split_scene\"\n [title]=\"i18n().table().splitCell\"\n [disabled]=\"!state().can.splitCell\"\n (onClick)=\"onCommand('splitCell', $event)\"\n ></tiptap-button>\n }\n </div>\n `,\n})\nexport class TiptapCellBubbleMenuComponent extends TiptapBaseBubbleMenu {\n // Inputs\n config = input<CellBubbleMenuConfig>({});\n\n // Signals\n readonly i18n = () => this.i18nService;\n\n override shouldShow(): boolean {\n const { selection, nodes, isEditable, isFocused } = this.state();\n\n if (this.editorCommands.linkEditMode() || this.editorCommands.colorEditMode()) {\n return false;\n }\n\n // Only show cell bubble menu for CellSelection\n return (\n selection.type === 'cell' &&\n nodes.isTableCell &&\n isEditable &&\n isFocused\n );\n }\n\n override getSelectionRect(): DOMRect {\n const ed = this.editor();\n if (!ed) return new DOMRect(0, 0, 0, 0);\n\n // CellSelection\n const selection = ed.state.selection as any;\n\n // 1. Multiple cells selected\n if (selection.$anchorCell && selection.$headCell) {\n const cells: HTMLElement[] = [];\n\n // Try to find all selected cell nodes\n ed.view.dom.querySelectorAll('.selectedCell').forEach(el => {\n if (el instanceof HTMLElement) cells.push(el);\n });\n\n if (cells.length > 0) {\n let top = Infinity, bottom = -Infinity, left = Infinity, right = -Infinity;\n\n cells.forEach(cell => {\n const r = cell.getBoundingClientRect();\n top = Math.min(top, r.top);\n bottom = Math.max(bottom, r.bottom);\n left = Math.min(left, r.left);\n right = Math.max(right, r.right);\n });\n\n return new DOMRect(left, top, right - left, bottom - top);\n }\n\n // Fallback to anchor/head if no .selectedCell (rare)\n const anchor = ed.view.nodeDOM(selection.$anchorCell.pos) as HTMLElement;\n const head = ed.view.nodeDOM(selection.$headCell.pos) as HTMLElement;\n\n if (anchor && head) {\n const anchorRect = anchor.getBoundingClientRect();\n const headRect = head.getBoundingClientRect();\n\n const top = Math.min(anchorRect.top, headRect.top);\n const bottom = Math.max(anchorRect.bottom, headRect.bottom);\n const left = Math.min(anchorRect.left, headRect.left);\n const right = Math.max(anchorRect.right, headRect.right);\n\n return new DOMRect(left, top, right - left, bottom - top);\n }\n }\n\n // 2. Ultimate fallback via ProseMirror class\n const singleCell = ed.view.dom.querySelector('.selectedCell');\n if (singleCell) {\n return singleCell.getBoundingClientRect();\n }\n\n return new DOMRect(-9999, -9999, 0, 0);\n }\n\n protected override executeCommand(editor: Editor, command: string): void {\n this.editorCommands.execute(editor, command);\n }\n}\n","import {\n Component,\n ChangeDetectionStrategy,\n ViewChild,\n ElementRef,\n signal,\n effect,\n inject,\n OnInit,\n OnDestroy,\n input,\n} from \"@angular/core\";\nimport { FormsModule } from \"@angular/forms\";\nimport { type Editor } from \"@tiptap/core\";\nimport tippy, { Instance as TippyInstance, sticky } from \"tippy.js\";\nimport { TiptapButtonComponent } from \"./tiptap-button.component\";\nimport { EditorCommandsService } from \"./services/editor-commands.service\";\nimport { TiptapI18nService } from \"./services/i18n.service\";\nimport { LinkService } from \"./services/link.service\";\nimport { TiptapSeparatorComponent } from \"./tiptap-separator.component\";\n\n@Component({\n selector: \"tiptap-link-bubble-menu\",\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [TiptapButtonComponent, TiptapSeparatorComponent, FormsModule],\n template: `\n <div \n #menuRef \n class=\"bubble-menu\"\n (mousedown)=\"onMouseDown($event)\"\n (click)=\"$event.stopPropagation()\"\n >\n <div class=\"link-input-row\">\n <div class=\"url-input-container\">\n <span class=\"material-symbols-outlined icon-link\">link</span>\n <input\n #linkInput\n type=\"text\"\n class=\"url-field\"\n [placeholder]=\"t().linkUrl\"\n [ngModel]=\"editUrl()\"\n (ngModelChange)=\"editUrl.set($event)\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n (keydown.enter)=\"onApply($event)\"\n (keydown.escape)=\"onCancel($event)\"\n />\n </div>\n\n <div class=\"action-buttons\">\n <tiptap-button\n icon=\"check\"\n [title]=\"common().apply\"\n color=\"var(--ate-primary)\"\n [disabled]=\"!editUrl().trim()\"\n (onClick)=\"onApply($event)\"\n ></tiptap-button>\n <tiptap-button\n icon=\"open_in_new\"\n [title]=\"t().openLink\"\n [disabled]=\"!currentUrl()\"\n (onClick)=\"onOpenLink($event)\"\n ></tiptap-button>\n <tiptap-separator />\n <tiptap-button\n icon=\"link_off\"\n [title]=\"t().removeLink\"\n variant=\"danger\"\n [disabled]=\"!currentUrl()\"\n (onClick)=\"onRemove($event)\"\n ></tiptap-button>\n </div>\n </div>\n </div>\n `,\n styles: [`\n\n .link-input-row {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n\n .url-input-container {\n flex: 1;\n display: flex;\n align-items: center;\n background: var(--ate-surface-secondary, #f8fafc);\n border: 1px solid var(--ate-border, #e2e8f0);\n border-radius: 8px;\n padding: 0 10px;\n height: 32px;\n transition: all 150ms ease;\n }\n\n .url-input-container:focus-within {\n border-color: var(--ate-primary, #3b82f6);\n background: var(--ate-surface, #ffffff);\n box-shadow: 0 0 0 2px var(--ate-primary-light, rgba(59, 130, 246, 0.1));\n }\n\n .icon-link {\n font-size: 16px;\n color: var(--ate-text-muted, #94a3b8);\n margin-right: 6px;\n }\n\n .url-field {\n background: transparent;\n border: none;\n outline: none;\n color: var(--ate-text, #1e293b);\n font-size: 13px;\n width: 100%;\n font-family: inherit;\n }\n\n .action-buttons {\n display: flex;\n align-items: center;\n gap: 2px;\n }\n `]\n})\nexport class TiptapLinkBubbleMenuComponent implements OnInit, OnDestroy {\n private readonly i18nService = inject(TiptapI18nService);\n private readonly editorCommands = inject(EditorCommandsService);\n private readonly linkSvc = inject(LinkService);\n\n readonly t = this.i18nService.bubbleMenu;\n readonly common = this.i18nService.common;\n readonly state = this.editorCommands.editorState;\n\n editor = input.required<Editor>();\n\n @ViewChild('linkInput') linkInput?: ElementRef<HTMLInputElement>;\n @ViewChild('menuRef', { static: false }) menuRef!: ElementRef<HTMLDivElement>;\n\n protected tippyInstance: TippyInstance | null = null;\n protected updateTimeout: any = null;\n\n editUrl = signal('');\n\n constructor() {\n // Reactive effect for URL sync and focus\n effect(() => {\n const state = this.state();\n const isInteracting = this.linkSvc.isInteracting();\n const currentLinkHref = state.marks.linkHref || '';\n\n // SYNC LOGIC:\n // If we are NOT currently typing (interacting), \n // always keep the input in sync with the current editor selection.\n if (!isInteracting) {\n this.editUrl.set(currentLinkHref);\n }\n });\n\n // Reactive effect for menu updates (re-positioning)\n effect(() => {\n this.state();\n this.linkSvc.editMode();\n this.linkSvc.menuTrigger();\n this.linkSvc.isInteracting();\n\n this.updateMenu();\n });\n }\n\n ngOnInit() {\n this.initTippy();\n }\n\n ngOnDestroy() {\n if (this.updateTimeout) clearTimeout(this.updateTimeout);\n if (this.tippyInstance) {\n this.tippyInstance.destroy();\n this.tippyInstance = null;\n }\n }\n\n private initTippy() {\n if (!this.menuRef?.nativeElement) {\n setTimeout(() => this.initTippy(), 50);\n return;\n }\n\n const ed = this.editor();\n this.tippyInstance = tippy(document.body, {\n content: this.menuRef.nativeElement,\n trigger: \"manual\",\n placement: \"bottom-start\",\n appendTo: () => ed.options.element,\n interactive: true,\n arrow: false,\n offset: [0, 8],\n hideOnClick: true,\n plugins: [sticky],\n sticky: false,\n getReferenceClientRect: () => this.getSelectionRect(),\n popperOptions: {\n modifiers: [\n {\n name: \"preventOverflow\",\n options: { boundary: ed.options.element, padding: 8 },\n },\n {\n name: \"flip\",\n options: { fallbackPlacements: [\"top-start\", \"bottom-end\", \"top-end\"] },\n },\n ],\n },\n onShow: () => {\n // We no longer auto-focus the input here to keep the editor selection visible.\n // The user can click the input if they want to type, but for swatches/preview, \n // staying in the editor is better for UX.\n },\n onHide: () => {\n // Clear trigger only AFTER the menu is hidden to maintain anchor stability during animation\n this.linkSvc.done();\n this.linkSvc.close();\n },\n\n });\n\n this.updateMenu();\n }\n\n updateMenu = () => {\n if (this.updateTimeout) clearTimeout(this.updateTimeout);\n this.updateTimeout = setTimeout(() => {\n if (this.shouldShow()) {\n this.showTippy();\n } else {\n this.hideTippy();\n }\n }, 10);\n }\n\n private showTippy() {\n if (this.tippyInstance) {\n this.tippyInstance.setProps({ getReferenceClientRect: () => this.getSelectionRect() });\n this.tippyInstance.show();\n }\n }\n\n private hideTippy() {\n this.tippyInstance?.hide();\n }\n\n private focusInput() {\n setTimeout(() => {\n this.linkInput?.nativeElement?.focus();\n this.linkInput?.nativeElement?.select();\n }, 50);\n }\n\n currentUrl() {\n return this.state().marks.linkHref || '';\n }\n\n shouldShow(): boolean {\n const { selection, marks, isEditable, isFocused } = this.state();\n if (!isEditable) return false;\n\n // Show if explicitly in edit mode (from toolbar/bubble menu) or interacting with input\n if (this.linkSvc.editMode() || this.linkSvc.isInteracting()) {\n return true;\n }\n\n // Show if cursor is on an existing link (read/preview mode)\n return isFocused && marks.link && selection.empty;\n }\n\n\n getSelectionRect(): DOMRect {\n const trigger = this.linkSvc.menuTrigger();\n const ed = this.editor();\n if (!ed) return new DOMRect(0, 0, 0, 0);\n\n // 1. If we have a stable trigger from service (toolbar or parent menu), anchor to it\n if (trigger) {\n const rect = trigger.getBoundingClientRect();\n // Only use if it's still visible/in DOM (width > 0)\n if (rect.width > 0) return rect;\n }\n\n // 2. Otherwise (bubble menu / relay), anchor to text selection\n const { from } = ed.state.selection;\n\n try {\n const { node } = ed.view.domAtPos(from);\n const element = node instanceof Element ? node : node.parentElement;\n const linkElement = element?.closest(\"a\");\n if (linkElement) return linkElement.getBoundingClientRect();\n } catch (e) { }\n\n // Use native selection for multi-line accuracy\n const selection = window.getSelection();\n if (selection && selection.rangeCount > 0) {\n const range = selection.getRangeAt(0);\n const rect = range.getBoundingClientRect();\n if (rect.width > 0 && rect.height > 0) return rect;\n }\n\n // Final fallback to coordinates at cursor\n const { top, bottom, left, right } = ed.view.coordsAtPos(from);\n return new DOMRect(left, top, right - left, bottom - top);\n }\n\n onMouseDown(event: MouseEvent) {\n event.stopPropagation();\n const target = event.target as HTMLElement;\n if (target.tagName !== 'INPUT') {\n event.preventDefault();\n }\n }\n\n onFocus() {\n this.linkSvc.setInteracting(true);\n }\n\n onBlur() {\n setTimeout(() => {\n this.linkSvc.setInteracting(false);\n this.updateMenu();\n }, 150);\n }\n\n onOpenLink(event: Event) {\n event.preventDefault();\n event.stopPropagation();\n const url = this.currentUrl();\n if (url) window.open(url, \"_blank\", \"noopener,noreferrer\");\n }\n\n onRemove(event: Event) {\n event.preventDefault();\n event.stopPropagation();\n this.linkSvc.unsetLink(this.editor());\n }\n\n onApply(event: Event) {\n event.preventDefault();\n event.stopPropagation();\n const url = this.editUrl().trim();\n if (url) {\n this.linkSvc.setLink(this.editor(), url);\n this.editUrl.set('');\n this.linkSvc.setInteracting(false);\n this.hideTippy();\n } else {\n this.onRemove(event);\n }\n }\n\n onCancel(event: Event) {\n event.preventDefault();\n event.stopPropagation();\n this.linkSvc.close();\n this.hideTippy();\n }\n}\n","import {\n Component,\n ChangeDetectionStrategy,\n ViewChild,\n ElementRef,\n signal,\n effect,\n inject,\n OnInit,\n OnDestroy,\n input,\n computed,\n viewChild,\n} from \"@angular/core\";\nimport { CommonModule } from \"@angular/common\";\nimport { FormsModule } from \"@angular/forms\";\nimport { type Editor } from \"@tiptap/core\";\nimport tippy, { Instance as TippyInstance, sticky } from \"tippy.js\";\nimport { EditorCommandsService } from \"./services/editor-commands.service\";\nimport { TiptapI18nService } from \"./services/i18n.service\";\nimport { ColorPickerService } from \"./services/color-picker.service\";\nimport { TiptapButtonComponent } from \"./tiptap-button.component\";\nimport { TiptapSeparatorComponent } from \"./tiptap-separator.component\";\n\nconst PRESET_COLORS = [\n \"#000000\", \"#666666\", \"#CCCCCC\", \"#FFFFFF\",\n \"#F44336\", \"#FF9800\", \"#FFEB3B\", \"#4CAF50\",\n \"#00BCD4\", \"#2196F3\", \"#9C27B0\", \"#E91E63\"\n];\n\n@Component({\n selector: \"tiptap-color-bubble-menu\",\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, FormsModule, TiptapButtonComponent, TiptapSeparatorComponent],\n template: `\n <div \n #menuRef \n class=\"bubble-menu color-bubble-menu\"\n (mousedown)=\"onMouseDown($event)\"\n (click)=\"$event.stopPropagation()\"\n >\n <div class=\"color-picker-container\">\n <div class=\"dropdown-row presets\">\n <div class=\"color-grid\">\n @for (color of presets; track color) {\n <tiptap-button \n class=\"color-swatch-btn\" \n size=\"small\"\n [title]=\"color\"\n [active]=\"isColorActive(color)\"\n [backgroundColor]=\"color\"\n (onClick)=\"applyColor(color, true, $event)\"\n ></tiptap-button>\n }\n </div>\n </div>\n\n <div class=\"dropdown-row controls\">\n <div class=\"hex-input-wrapper\">\n <span class=\"hex-hash\">#</span>\n <input \n #hexInput\n type=\"text\" \n class=\"hex-input\" \n [value]=\"hexValue()\"\n [attr.aria-label]=\"t().customColor\"\n (input)=\"onHexInput($event)\"\n (change)=\"onHexChange($event)\"\n (keydown.enter)=\"onApply($event)\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n maxlength=\"6\"\n placeholder=\"000000\"\n />\n </div>\n \n <div class=\"native-trigger-wrapper\">\n <tiptap-button \n class=\"btn-native-picker-trigger\" \n icon=\"colorize\"\n [title]=\"t().customColor\"\n [backgroundColor]=\"currentColor()\"\n (onClick)=\"triggerNativePicker($event)\" \n ></tiptap-button>\n <input\n #colorInput\n type=\"color\"\n class=\"hidden-native-input\"\n [value]=\"currentColor()\"\n [attr.aria-label]=\"t().customColor\"\n (input)=\"onNativeInput($event)\"\n (change)=\"onNativeChange($event)\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n />\n </div>\n\n <tiptap-button \n icon=\"check\"\n [title]=\"common().apply\"\n color=\"var(--ate-primary)\"\n (onClick)=\"onApply($event)\"\n ></tiptap-button>\n\n <tiptap-separator />\n\n <tiptap-button \n icon=\"format_color_reset\"\n [title]=\"t().clear\"\n variant=\"danger\"\n (onClick)=\"onClearColor($event)\" \n ></tiptap-button>\n </div>\n\n </div>\n </div>\n `,\n styles: [`\n .color-picker-container {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .dropdown-row {\n display: flex;\n align-items: center;\n width: 100%;\n }\n\n .dropdown-row.presets {\n justify-content: center;\n }\n\n .dropdown-row.controls {\n gap: 8px;\n justify-content: space-between;\n padding-top: 4px;\n border-top: 1px solid var(--ate-border, #e2e8f0);\n }\n\n .color-grid {\n display: grid;\n grid-template-columns: repeat(12, 1fr);\n gap: 4px;\n width: 100%;\n }\n\n :host ::ng-deep .color-swatch-btn .tiptap-button {\n width: 100%;\n aspect-ratio: 1;\n height: auto;\n border-radius: 4px;\n border: 1px solid rgba(0, 0, 0, 0.1);\n padding: 0;\n }\n\n :host ::ng-deep .color-swatch-btn .tiptap-button.is-active {\n border-color: var(--ate-primary, #3b82f6);\n box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.3);\n }\n \n :host ::ng-deep .btn-native-picker-trigger .tiptap-button {\n color: #ffffff;\n text-shadow: 0 1px 2px rgba(0,0,0,0.2);\n }\n\n .divider-v {\n width: 1px;\n height: 24px;\n background: var(--ate-border, #e2e8f0);\n }\n\n .hex-input-wrapper {\n flex: 1;\n display: flex;\n align-items: center;\n background: var(--ate-surface-secondary, #f8fafc);\n border: 1px solid var(--ate-border, #e2e8f0);\n border-radius: 8px;\n padding: 0 10px;\n height: 32px;\n transition: border-color 150ms ease;\n }\n\n .hex-input-wrapper:focus-within {\n border-color: var(--ate-primary, #3b82f6);\n background: var(--ate-menu-bg, #ffffff);\n }\n\n .hex-hash {\n color: var(--ate-text-muted, #94a3b8);\n font-family: monospace;\n font-size: 0.875rem;\n }\n\n .hex-input {\n background: transparent;\n border: none;\n outline: none;\n color: var(--ate-text, #1e293b);\n font-family: monospace;\n font-size: 0.875rem;\n width: 100%;\n padding-left: 4px;\n }\n\n .native-trigger-wrapper {\n position: relative;\n width: 32px;\n height: 32px;\n }\n\n .hidden-native-input {\n position: absolute;\n inset: 0;\n opacity: 0;\n width: 100%;\n height: 100%;\n cursor: pointer;\n }\n `]\n})\nexport class TiptapColorBubbleMenuComponent implements OnInit, OnDestroy {\n private readonly i18nService = inject(TiptapI18nService);\n private readonly editorCommands = inject(EditorCommandsService);\n private readonly colorPickerSvc = inject(ColorPickerService);\n\n readonly t = this.i18nService.toolbar;\n readonly common = this.i18nService.common;\n readonly state = this.editorCommands.editorState;\n readonly presets = PRESET_COLORS;\n\n editor = input.required<Editor>();\n\n @ViewChild('menuRef', { static: false }) menuRef!: ElementRef<HTMLDivElement>;\n private colorInputRef = viewChild<ElementRef<HTMLInputElement>>(\"colorInput\");\n\n protected tippyInstance: TippyInstance | null = null;\n protected updateTimeout: any = null;\n\n\n /** \n * LOCAL MODE: We lock the mode when the menu is shown to avoid race conditions \n * where the parent (bubble menu) clears the global signal before we apply the color.\n */\n activeMode = signal<'text' | 'highlight'>('text');\n\n constructor() {\n effect(() => {\n this.state();\n this.colorPickerSvc.editMode();\n this.colorPickerSvc.menuTrigger();\n this.colorPickerSvc.isInteracting();\n\n\n this.updateMenu();\n });\n }\n\n ngOnInit() {\n this.initTippy();\n }\n\n ngOnDestroy() {\n if (this.updateTimeout) clearTimeout(this.updateTimeout);\n if (this.tippyInstance) {\n this.tippyInstance.destroy();\n this.tippyInstance = null;\n }\n }\n\n private initTippy() {\n if (!this.menuRef?.nativeElement) {\n setTimeout(() => this.initTippy(), 50);\n return;\n }\n\n const ed = this.editor();\n this.tippyInstance = tippy(document.body, {\n content: this.menuRef.nativeElement,\n trigger: \"manual\",\n placement: \"bottom-start\",\n appendTo: () => ed.options.element,\n interactive: true,\n arrow: false,\n offset: [0, 8],\n hideOnClick: true,\n plugins: [sticky],\n sticky: false,\n getReferenceClientRect: () => this.getSelectionRect(),\n popperOptions: {\n modifiers: [\n {\n name: \"preventOverflow\",\n options: { boundary: ed.options.element, padding: 8 },\n },\n {\n name: \"flip\",\n options: { fallbackPlacements: [\"top-start\", \"bottom-end\", \"top-end\"] },\n },\n ],\n },\n onShow: () => {\n // 1. Lock the mode immediately to be immune to external signal changes\n const currentMode = this.colorPickerSvc.editMode() || 'text';\n this.activeMode.set(currentMode);\n\n // 2. Capture selection for the command fallback\n this.colorPickerSvc.captureSelection(this.editor());\n\n\n // Note: We don't auto-focus the Hex input anymore to keep the \n // visual selection (blue highlight) active in the editor.\n },\n onHide: () => {\n // Clear trigger only AFTER the menu is hidden to maintain anchor stability during animation\n this.colorPickerSvc.done();\n this.colorPickerSvc.close();\n },\n\n });\n\n this.updateMenu();\n }\n\n updateMenu = () => {\n if (this.updateTimeout) clearTimeout(this.updateTimeout);\n this.updateTimeout = setTimeout(() => {\n if (this.shouldShow()) {\n this.showTippy();\n } else {\n this.hideTippy();\n }\n }, 10);\n }\n\n private showTippy() {\n if (this.tippyInstance) {\n this.tippyInstance.setProps({ getReferenceClientRect: () => this.getSelectionRect() });\n this.tippyInstance.show();\n }\n }\n\n private hideTippy() {\n this.tippyInstance?.hide();\n }\n\n shouldShow(): boolean {\n const { isEditable } = this.state();\n if (!isEditable) return false;\n\n if (this.colorPickerSvc.editMode() !== null || this.colorPickerSvc.isInteracting()) {\n return true;\n }\n\n\n return false;\n }\n\n getSelectionRect(): DOMRect {\n const trigger = this.colorPickerSvc.menuTrigger();\n const ed = this.editor();\n if (!ed) return new DOMRect(0, 0, 0, 0);\n\n // 1. If we have a stable trigger from service (toolbar or parent menu), anchor to it\n if (trigger) {\n const rect = trigger.getBoundingClientRect();\n // Only use if it's still visible/in DOM (width > 0)\n if (rect.width > 0) return rect;\n }\n\n // 2. Otherwise (bubble menu / relay), anchor to text selection\n const { from } = ed.state.selection;\n\n try {\n const { node } = ed.view.domAtPos(from);\n const element = node instanceof Element ? node : node.parentElement;\n const colorElement = element?.closest('[style*=\"color\"], [style*=\"background\"], mark');\n if (colorElement) return colorElement.getBoundingClientRect();\n } catch (e) { /* ignore */ }\n\n // Use native selection for multi-line accuracy\n const selection = window.getSelection();\n if (selection && selection.rangeCount > 0) {\n const range = selection.getRangeAt(0);\n const rect = range.getBoundingClientRect();\n if (rect.width > 0 && rect.height > 0) return rect;\n }\n\n // Final fallback to coordinates at cursor\n const { top, bottom, left, right } = ed.view.coordsAtPos(from);\n return new DOMRect(left, top, right - left, bottom - top);\n }\n\n readonly currentColor = computed(() => {\n const marks = this.state().marks;\n const color = this.activeMode() === \"text\" ? marks.computedColor : marks.computedBackground;\n return color || (this.activeMode() === \"text\" ? \"#000000\" : \"#ffff00\");\n });\n\n readonly hexValue = computed(() => {\n const color = this.currentColor();\n return color.replace('#', '').toUpperCase();\n });\n\n isColorActive(color: string): boolean {\n return this.colorPickerSvc.normalizeColor(this.currentColor()) === this.colorPickerSvc.normalizeColor(color);\n }\n\n applyColor(color: string, addToHistory: boolean = true, event?: Event) {\n if (event) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n const editor = this.editor();\n // Use our LOCKED mode instead of the global signal\n const cmd = this.activeMode() === \"text\" ? \"applyColor\" : \"applyHighlight\";\n\n // Determine if we should focus back to the editor.\n // If we're interacting with an input (live typing), we DON'T want to focus back yet.\n const shouldFocus = !this.colorPickerSvc.isInteracting();\n\n if (this.activeMode() === \"text\") {\n this.colorPickerSvc.applyColor(editor, color, addToHistory, shouldFocus);\n } else {\n this.colorPickerSvc.applyHighlight(editor, color, addToHistory, shouldFocus);\n }\n }\n\n\n\n onApply(event?: Event) {\n if (event) {\n event.preventDefault();\n event.stopPropagation();\n }\n this.colorPickerSvc.close();\n }\n\n onHexInput(event: Event) {\n const input = event.target as HTMLInputElement;\n let value = input.value.trim();\n if (!value.startsWith(\"#\")) value = \"#\" + value;\n if (/^#?[0-9A-Fa-f]{3,6}$/.test(value)) {\n this.applyColor(value, false);\n }\n }\n\n onHexChange(event: Event) {\n const input = event.target as HTMLInputElement;\n let value = input.value.trim();\n if (!value.startsWith(\"#\")) value = \"#\" + value;\n if (/^#?[0-9A-Fa-f]{3,6}$/.test(value)) {\n this.applyColor(value, true, event);\n }\n }\n\n triggerNativePicker(event?: Event) {\n if (event) {\n event.preventDefault();\n event.stopPropagation();\n }\n this.colorInputRef()?.nativeElement.click();\n }\n\n onNativeInput(event: Event) {\n this.applyColor((event.target as HTMLInputElement).value, false);\n }\n\n onNativeChange(event: Event) {\n this.applyColor((event.target as HTMLInputElement).value, true, event);\n }\n\n onClearColor(event?: Event) {\n if (event) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n const editor = this.editor();\n if (this.activeMode() === \"text\") {\n this.colorPickerSvc.unsetColor(editor);\n } else {\n this.colorPickerSvc.unsetHighlight(editor);\n }\n }\n\n onMouseDown(event: MouseEvent) {\n event.stopPropagation();\n const target = event.target as HTMLElement;\n if (target.tagName !== 'INPUT') {\n event.preventDefault();\n }\n }\n\n onFocus() {\n this.colorPickerSvc.setInteracting(true);\n }\n\n onBlur() {\n setTimeout(() => {\n this.colorPickerSvc.setInteracting(false);\n this.updateMenu();\n }, 150);\n }\n}\n","import { Editor } from \"@tiptap/core\";\nimport { SlashCommandItem } from \"../tiptap-slash-commands.component\";\nimport { TiptapI18nService } from \"../services/i18n.service\";\nimport { EditorCommandsService } from \"../services/editor-commands.service\";\n\n/**\n * Clés des commandes natives dans l'ordre d'affichage\n */\nexport const SLASH_COMMAND_KEYS = [\n \"heading1\",\n \"heading2\",\n \"heading3\",\n \"bulletList\",\n \"orderedList\",\n \"blockquote\",\n \"code\",\n \"image\",\n \"horizontalRule\",\n \"table\",\n] as const;\n\nexport type SlashCommandKey = (typeof SLASH_COMMAND_KEYS)[number];\n\n/**\n * Configuration simplifiée pour activer/désactiver les slash commands natives.\n * Permet aussi d'ajouter des commandes personnalisées.\n */\nexport interface SlashCommandsConfig extends Partial<Record<SlashCommandKey, boolean>> {\n /**\n * Liste de commandes supplémentaires à ajouter à la fin du menu\n */\n custom?: SlashCommandItem[];\n}\n\n/**\n * Configuration par défaut : toutes les commandes natives sont activées\n */\nexport const DEFAULT_SLASH_COMMANDS_CONFIG: Record<SlashCommandKey, boolean> = {\n heading1: true,\n heading2: true,\n heading3: true,\n bulletList: true,\n orderedList: true,\n blockquote: true,\n code: true,\n image: true,\n horizontalRule: true,\n table: true,\n};\n\n/**\n * Factory pour créer les commandes natives avec leurs traductions et leur logique d'exécution.\n * Utilise les services de l'éditeur pour garantir une cohérence de comportement.\n */\nexport function createDefaultSlashCommands(\n i18n: TiptapI18nService,\n commands: EditorCommandsService,\n imageOptions?: { quality?: number; maxWidth?: number; maxHeight?: number; allowedTypes?: string[] }\n): SlashCommandItem[] {\n const t = i18n.slashCommands();\n\n return [\n {\n title: t.heading1.title,\n description: t.heading1.description,\n icon: \"format_h1\",\n keywords: t.heading1.keywords,\n command: (editor: Editor) => commands.toggleHeading(editor, 1),\n },\n {\n title: t.heading2.title,\n description: t.heading2.description,\n icon: \"format_h2\",\n keywords: t.heading2.keywords,\n command: (editor: Editor) => commands.toggleHeading(editor, 2),\n },\n {\n title: t.heading3.title,\n description: t.heading3.description,\n icon: \"format_h3\",\n keywords: t.heading3.keywords,\n command: (editor: Editor) => commands.toggleHeading(editor, 3),\n },\n {\n title: t.bulletList.title,\n description: t.bulletList.description,\n icon: \"format_list_bulleted\",\n keywords: t.bulletList.keywords,\n command: (editor: Editor) => commands.toggleBulletList(editor),\n },\n {\n title: t.orderedList.title,\n description: t.orderedList.description,\n icon: \"format_list_numbered\",\n keywords: t.orderedList.keywords,\n command: (editor: Editor) => commands.toggleOrderedList(editor),\n },\n {\n title: t.blockquote.title,\n description: t.blockquote.description,\n icon: \"format_quote\",\n keywords: t.blockquote.keywords,\n command: (editor: Editor) => commands.toggleBlockquote(editor),\n },\n {\n title: t.code.title,\n description: t.code.description,\n icon: \"code\",\n keywords: t.code.keywords,\n command: (editor: Editor) => commands.toggleCodeBlock(editor),\n },\n {\n title: t.image.title,\n description: t.image.description,\n icon: \"image\",\n keywords: t.image.keywords,\n command: (editor: Editor) => commands.execute(editor, \"insertImage\", {\n quality: imageOptions?.quality,\n maxWidth: imageOptions?.maxWidth,\n maxHeight: imageOptions?.maxHeight,\n accept: imageOptions?.allowedTypes?.join(',')\n }),\n },\n {\n title: t.horizontalRule.title,\n description: t.horizontalRule.description,\n icon: \"horizontal_rule\",\n keywords: t.horizontalRule.keywords,\n command: (editor: Editor) => commands.insertHorizontalRule(editor),\n },\n {\n title: t.table.title,\n description: t.table.description,\n icon: \"table_view\",\n keywords: t.table.keywords,\n command: (editor: Editor) => commands.insertTable(editor),\n },\n ];\n}\n\n/**\n * Filtre et assemble les commandes selon la configuration fournie.\n */\nexport function filterSlashCommands(\n config: SlashCommandsConfig,\n i18n: TiptapI18nService,\n commands: EditorCommandsService,\n imageOptions?: { quality?: number; maxWidth?: number; maxHeight?: number; allowedTypes?: string[] }\n): SlashCommandItem[] {\n const allNatives = createDefaultSlashCommands(i18n, commands, imageOptions);\n const activeConfig = { ...DEFAULT_SLASH_COMMANDS_CONFIG, ...config };\n\n const filtered = allNatives.filter((_, index) => {\n const key = SLASH_COMMAND_KEYS[index];\n return key && activeConfig[key] !== false;\n });\n\n if (config.custom && Array.isArray(config.custom)) {\n return [...filtered, ...config.custom];\n }\n\n return filtered;\n}\n","import {\n Component,\n input,\n output,\n ViewChild,\n ElementRef,\n OnInit,\n OnDestroy,\n effect,\n computed,\n inject,\n signal,\n ChangeDetectionStrategy,\n} from \"@angular/core\";\nimport tippy, { Instance as TippyInstance, sticky } from \"tippy.js\";\nimport { Editor } from \"@tiptap/core\";\nimport { TiptapI18nService } from \"./services/i18n.service\";\nimport { EditorCommandsService } from \"./services/editor-commands.service\";\nimport {\n filterSlashCommands,\n createDefaultSlashCommands\n} from \"./config/slash-commands.config\";\nimport { Plugin, PluginKey } from \"@tiptap/pm/state\";\nimport { EditorView } from \"@tiptap/pm/view\";\n\nexport interface SlashCommandItem {\n title: string;\n description: string;\n icon: string;\n keywords: string[];\n command: (editor: Editor) => void;\n}\n\nexport interface CustomSlashCommands {\n commands?: SlashCommandItem[];\n}\n\n// Default command definitions are now centralized in src/lib/config/slash-commands.config.ts\n\n@Component({\n selector: \"tiptap-slash-commands\",\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div #menuRef class=\"slash-commands-menu\">\n @for (command of filteredCommands(); track command.title) {\n <div\n class=\"slash-command-item\"\n [class.selected]=\"$index === selectedIndex()\"\n (mousedown)=\"executeCommand(command); $event.preventDefault(); $event.stopPropagation()\"\n (mouseenter)=\"selectedIndex.set($index)\"\n >\n <div class=\"slash-command-icon\">\n <span class=\"material-symbols-outlined\">{{ command.icon }}</span>\n </div>\n <div class=\"slash-command-content\">\n <div class=\"slash-command-title\">{{ command.title }}</div>\n <div class=\"slash-command-description\">{{ command.description }}</div>\n </div>\n </div>\n }\n </div>\n `,\n styles: [\n `\n .slash-commands-menu {\n background: var(--ate-menu-bg);\n border: 1px solid var(--ate-menu-border);\n border-radius: var(--ate-menu-border-radius, 12px);\n box-shadow: var(--ate-menu-shadow);\n padding: var(--ate-menu-padding);\n max-height: 320px;\n overflow-y: auto;\n min-width: 280px;\n outline: none;\n animation: slashMenuFadeIn 0.2s cubic-bezier(0, 0, 0.2, 1);\n scrollbar-width: thin;\n scrollbar-color: var(--ate-scrollbar-thumb) var(--ate-scrollbar-track);\n }\n\n .slash-commands-menu::-webkit-scrollbar {\n width: var(--ate-scrollbar-width);\n }\n\n .slash-commands-menu::-webkit-scrollbar-track {\n background: var(--ate-scrollbar-track);\n }\n\n .slash-commands-menu::-webkit-scrollbar-thumb {\n background: var(--ate-scrollbar-thumb);\n border: 3px solid transparent;\n background-clip: content-box;\n border-radius: 10px;\n }\n\n .slash-commands-menu::-webkit-scrollbar-thumb:hover {\n background: var(--ate-scrollbar-thumb-hover);\n background-clip: content-box;\n }\n\n @keyframes slashMenuFadeIn {\n from { opacity: 0; transform: translateY(4px); }\n to { opacity: 1; transform: translateY(0); }\n }\n\n .slash-command-item {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: var(--ate-menu-padding);\n border-radius: var(--ate-menu-border-radius, 8px);\n cursor: pointer;\n transition: all 0.15s ease;\n border: var(--ate-border-width, 1px) solid transparent;\n outline: none;\n margin-bottom: 2px;\n }\n\n .slash-command-item:last-child {\n margin-bottom: 0;\n }\n\n .slash-command-item:hover {\n background: var(--ate-surface-secondary);\n }\n\n .slash-command-item.selected {\n background: var(--ate-primary-light);\n border-color: var(--ate-primary-light-alpha);\n }\n\n .slash-command-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n background: var(--ate-surface-tertiary);\n border-radius: var(--ate-sub-border-radius, 8px);\n color: var(--ate-primary);\n flex-shrink: 0;\n transition: all 0.15s ease;\n }\n\n .slash-command-item.selected .slash-command-icon {\n background: var(--ate-primary);\n color: var(--ate-primary-contrast, #ffffff);\n }\n\n .slash-command-icon .material-symbols-outlined {\n font-size: 18px;\n }\n\n .slash-command-content {\n flex: 1;\n min-width: 0;\n }\n\n .slash-command-title {\n font-weight: 500;\n color: var(--ate-text);\n font-size: 14px;\n margin-bottom: 1px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .slash-command-description {\n color: var(--ate-text-secondary);\n font-size: 11px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n `,\n ],\n})\nexport class TiptapSlashCommandsComponent implements OnInit, OnDestroy {\n readonly i18nService = inject(TiptapI18nService);\n editor = input.required<Editor>();\n config = input<CustomSlashCommands | undefined>(undefined);\n\n @ViewChild(\"menuRef\", { static: false }) menuRef!: ElementRef<HTMLDivElement>;\n\n private tippyInstance: TippyInstance | null = null;\n private editorCommands = inject(EditorCommandsService);\n\n // Local state\n private isActive = false;\n private currentQuery = signal(\"\");\n private slashRange: { from: number; to: number } | null = null;\n\n // Signal for selected index\n selectedIndex = signal(0);\n\n // Toolbar interaction state (from centralized service)\n private readonly isToolbarInteracting = this.editorCommands.isToolbarInteracting;\n\n commands = computed(() => {\n const config = this.config();\n if (config && config.commands) {\n return config.commands;\n }\n\n // Fallback to default native commands\n return createDefaultSlashCommands(this.i18nService, this.editorCommands);\n });\n\n filteredCommands = computed(() => {\n const query = this.currentQuery().toLowerCase();\n const commands = this.commands();\n\n if (!query) {\n return commands;\n }\n\n return commands.filter(\n (command) =>\n command.title.toLowerCase().includes(query) ||\n command.description.toLowerCase().includes(query) ||\n command.keywords.some((keyword) =>\n keyword.toLowerCase().includes(query)\n )\n );\n });\n\n constructor() {\n effect(() => {\n const ed = this.editor();\n if (!ed) return;\n\n // Clean up old listeners\n ed.off(\"selectionUpdate\", this.updateMenu);\n ed.off(\"transaction\", this.updateMenu);\n ed.off(\"focus\", this.updateMenu);\n ed.off(\"blur\", this.handleBlur);\n\n // Add new listeners\n ed.on(\"selectionUpdate\", this.updateMenu);\n ed.on(\"transaction\", this.updateMenu);\n ed.on(\"focus\", this.updateMenu);\n ed.on(\"blur\", this.handleBlur);\n\n // Use ProseMirror plugin system to intercept keys\n this.addKeyboardPlugin(ed);\n\n // updateMenu() will be called automatically when editor is ready\n });\n }\n\n ngOnInit() {\n this.initTippy();\n }\n\n ngOnDestroy() {\n const ed = this.editor();\n if (ed) {\n ed.off(\"selectionUpdate\", this.updateMenu);\n ed.off(\"transaction\", this.updateMenu);\n ed.off(\"focus\", this.updateMenu);\n ed.off(\"blur\", this.handleBlur);\n }\n\n if (this.tippyInstance) {\n this.tippyInstance.destroy();\n this.tippyInstance = null;\n }\n }\n\n private initTippy() {\n if (!this.menuRef?.nativeElement) {\n setTimeout(() => this.initTippy(), 50);\n return;\n }\n\n const menuElement = this.menuRef.nativeElement;\n\n if (this.tippyInstance) {\n this.tippyInstance.destroy();\n }\n\n this.tippyInstance = tippy(document.body, {\n content: menuElement,\n trigger: \"manual\",\n placement: \"bottom-start\",\n theme: \"slash-menu\",\n appendTo: (ref) => {\n // Always try to climb up to editor host to inherit CSS variables\n const host = this.editor().options.element.closest(\"angular-tiptap-editor\");\n return host || document.body;\n\n },\n interactive: true,\n arrow: false,\n offset: [0, 8],\n hideOnClick: true,\n plugins: [sticky],\n sticky: false,\n getReferenceClientRect: () => this.getSlashRect(),\n // Improve positioning with scroll\n popperOptions: {\n modifiers: [\n {\n name: \"preventOverflow\",\n options: {\n boundary: this.editor().options.element,\n padding: 8,\n },\n },\n {\n name: \"flip\",\n options: {\n fallbackPlacements: [\"top-start\", \"bottom-end\", \"top-end\"],\n },\n },\n {\n name: \"hide\",\n },\n ],\n },\n });\n\n // Initial check after Tippy is initialized\n this.updateMenu();\n }\n\n private getSlashRect(): DOMRect {\n const ed = this.editor();\n if (!ed || !this.slashRange) {\n return new DOMRect(-9999, -9999, 0, 0);\n }\n\n try {\n // Use ProseMirror coordinates for better precision\n const coords = ed.view.coordsAtPos(this.slashRange.from);\n return new DOMRect(\n coords.left,\n coords.top,\n 0,\n coords.bottom - coords.top\n );\n } catch (error) {\n console.warn(\"Error calculating coordinates:\", error);\n // Fallback to window.getSelection\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) {\n return new DOMRect(-9999, -9999, 0, 0);\n }\n const range = selection.getRangeAt(0);\n return range.getBoundingClientRect();\n }\n }\n\n updateMenu = () => {\n const ed = this.editor();\n if (!ed) return;\n\n const { from } = ed.state.selection;\n\n // Check if '/' was typed at the beginning of a line or after a space\n const textBefore = ed.state.doc.textBetween(\n Math.max(0, from - 20),\n from,\n \"\\n\"\n );\n const slashMatch = textBefore.match(/(?:^|\\s)\\/([^\\/\\s]*)$/);\n\n if (slashMatch) {\n const query = slashMatch[1] || \"\";\n const wasActive = this.isActive;\n\n this.currentQuery.set(query);\n this.slashRange = {\n from: from - slashMatch[0].length + slashMatch[0].indexOf(\"/\"),\n to: from,\n };\n\n // Reset index if menu just became active\n if (!wasActive) {\n this.selectedIndex.set(0);\n }\n\n this.isActive = true;\n\n if (this.isToolbarInteracting()) {\n this.hideTippy();\n } else {\n this.showTippy();\n }\n } else {\n this.isActive = false;\n this.hideTippy();\n }\n };\n\n handleBlur = () => {\n setTimeout(() => this.hideTippy(), 100);\n };\n\n handleKeyDown = (event: KeyboardEvent) => {\n // Only handle keys if menu is active\n if (!this.isActive || this.filteredCommands().length === 0) {\n return;\n }\n\n switch (event.key) {\n case \"ArrowDown\":\n event.preventDefault();\n event.stopPropagation();\n const nextIndex =\n (this.selectedIndex() + 1) % this.filteredCommands().length;\n this.selectedIndex.set(nextIndex);\n this.scrollToSelected();\n break;\n\n case \"ArrowUp\":\n event.preventDefault();\n event.stopPropagation();\n const prevIndex =\n this.selectedIndex() === 0\n ? this.filteredCommands().length - 1\n : this.selectedIndex() - 1;\n this.selectedIndex.set(prevIndex);\n this.scrollToSelected();\n break;\n\n case \"Enter\":\n event.preventDefault();\n event.stopPropagation();\n const selectedCommand = this.filteredCommands()[this.selectedIndex()];\n if (selectedCommand) {\n this.executeCommand(selectedCommand);\n }\n break;\n\n case \"Escape\":\n event.preventDefault();\n event.stopPropagation();\n this.isActive = false;\n this.hideTippy();\n // Optional: remove the typed \"/\"\n const ed = this.editor();\n if (ed && this.slashRange) {\n const { tr } = ed.state;\n tr.delete(this.slashRange.from, this.slashRange.to);\n ed.view.dispatch(tr);\n }\n break;\n }\n };\n\n private scrollToSelected() {\n // Scroll to the selected element\n if (this.menuRef?.nativeElement) {\n const selectedItem = this.menuRef.nativeElement.querySelector(\n \".slash-command-item.selected\"\n ) as HTMLElement;\n if (selectedItem) {\n selectedItem.scrollIntoView({ block: \"nearest\", behavior: \"smooth\" });\n }\n }\n }\n\n private showTippy() {\n if (this.tippyInstance && this.filteredCommands().length > 0) {\n this.tippyInstance.setProps({ sticky: \"reference\" });\n this.tippyInstance.show();\n }\n }\n\n private hideTippy() {\n if (this.tippyInstance) {\n this.tippyInstance.setProps({ sticky: false });\n this.tippyInstance.hide();\n }\n }\n\n executeCommand(command: SlashCommandItem) {\n const ed = this.editor();\n if (!ed || !this.slashRange) return;\n\n // Remove slash text (\"/\")\n const { tr } = ed.state;\n tr.delete(this.slashRange.from, this.slashRange.to);\n ed.view.dispatch(tr);\n\n // Hide menu immediately\n this.hideTippy();\n this.isActive = false;\n\n // Give focus back to editor and execute command\n // Use a micro-delay to ensure ProseMirror DOM is stable after removing \"/\"\n setTimeout(() => {\n ed.commands.focus();\n command.command(ed);\n }, 10);\n }\n\n\n\n private addKeyboardPlugin(ed: Editor) {\n // Add a ProseMirror plugin to intercept keyboard events\n const keyboardPlugin = new Plugin({\n key: new PluginKey(\"slash-commands-keyboard\"),\n props: {\n handleKeyDown: (view: EditorView, event: KeyboardEvent) => {\n // Only handle if menu is active\n if (!this.isActive || this.filteredCommands().length === 0) {\n return false;\n }\n\n switch (event.key) {\n case \"ArrowDown\":\n event.preventDefault();\n const nextIndex =\n (this.selectedIndex() + 1) % this.filteredCommands().length;\n this.selectedIndex.set(nextIndex);\n this.scrollToSelected();\n return true;\n\n case \"ArrowUp\":\n event.preventDefault();\n const prevIndex =\n this.selectedIndex() === 0\n ? this.filteredCommands().length - 1\n : this.selectedIndex() - 1;\n this.selectedIndex.set(prevIndex);\n this.scrollToSelected();\n return true;\n\n case \"Enter\":\n event.preventDefault();\n const selectedCommand =\n this.filteredCommands()[this.selectedIndex()];\n if (selectedCommand) {\n this.executeCommand(selectedCommand);\n }\n return true;\n\n case \"Escape\":\n event.preventDefault();\n this.isActive = false;\n this.hideTippy();\n // Remove typed \"/\"\n if (this.slashRange) {\n const { tr } = view.state;\n tr.delete(this.slashRange.from, this.slashRange.to);\n view.dispatch(tr);\n }\n return true;\n }\n\n return false;\n },\n },\n });\n\n // Add plugin to editor\n ed.view.updateState(\n ed.view.state.reconfigure({\n plugins: [keyboardPlugin, ...ed.view.state.plugins],\n })\n );\n }\n}\n","import { Component, input, output, ChangeDetectionStrategy, computed } from \"@angular/core\";\nimport { CommonModule } from \"@angular/common\";\nimport { TiptapButtonComponent } from \"./tiptap-button.component\";\nimport { TiptapTranslations } from \"./services/i18n.service\";\n\n/**\n * Edit Toggle Component\n * Allows switching between editable and readonly modes\n */\n@Component({\n selector: \"tiptap-edit-toggle\",\n standalone: true,\n imports: [CommonModule, TiptapButtonComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"ate-edit-toggle-container\" [class.is-editable]=\"editable()\">\n <tiptap-button\n [icon]=\"editable() ? 'visibility' : 'edit'\"\n [title]=\"editable() ? translations().editor.viewMode : translations().editor.toggleEdit\"\n (onClick)=\"toggle.emit($event)\"\n size=\"medium\"\n iconSize=\"small\"\n backgroundColor=\"var(--ate-primary-lighter)\"\n />\n </div>\n `,\n styles: [\n `\n .ate-edit-toggle-container {\n position: absolute;\n margin-top: 16px;\n right: 16px;\n z-index: 50;\n }\n `,\n ],\n})\nexport class TiptapEditToggleComponent {\n editable = input.required<boolean>();\n translations = input.required<TiptapTranslations>();\n toggle = output<Event>();\n}\n","import { Directive } from \"@angular/core\";\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from \"@angular/forms\";\n\n@Directive({\n standalone: true,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n multi: true,\n useExisting: NoopValueAccessorDirective,\n },\n ],\n})\nexport class NoopValueAccessorDirective implements ControlValueAccessor {\n writeValue(obj: any): void {}\n registerOnChange(fn: any): void {}\n registerOnTouched(fn: any): void {}\n}\n","import { TextSelection, NodeSelection } from \"@tiptap/pm/state\";\nimport { CellSelection } from \"@tiptap/pm/tables\";\nimport { StateCalculator } from \"../../models/editor-state.model\";\n\nexport const SelectionCalculator: StateCalculator = (editor) => {\n const { selection } = editor.state;\n const { from, to } = selection;\n\n let selectionType: 'text' | 'node' | 'cell' | 'none' = 'none';\n if (selection instanceof TextSelection) selectionType = 'text';\n else if (selection instanceof NodeSelection) selectionType = 'node';\n else if (selection instanceof CellSelection) selectionType = 'cell';\n\n let isSingleCell = false;\n if (selection instanceof CellSelection) {\n isSingleCell = selection.$anchorCell.pos === selection.$headCell.pos;\n }\n\n return {\n isFocused: editor.view.hasFocus(),\n isEditable: editor.isEditable,\n selection: {\n type: selectionType,\n from,\n to,\n empty: selection.empty || (selectionType === 'text' && from === to),\n isSingleCell: isSingleCell\n },\n nodes: {\n activeNodeName: editor.state.doc.nodeAt(editor.state.selection.$head.pos)?.type.name || null\n }\n };\n};\n","import { StateCalculator } from \"../../models/editor-state.model\";\nimport { normalizeColor } from \"../../utils/color.utils\";\n\nexport const MarksCalculator: StateCalculator = (editor) => {\n const isCodeBlock = editor.isActive('codeBlock');\n const isCode = editor.isActive('code'); // Inline code mark\n const isImage = editor.isActive('image') || editor.isActive('resizableImage');\n\n // Check if marks are generally allowed based on context\n const marksAllowed = !isCodeBlock && !isImage;\n // For inline code specifically, we don't allow nesting OTHER marks inside it, \n // but the code mark ITSELF must be togglable to be removed.\n const isInsideInlineCode = isCode;\n\n // 1. Resolve target element once for this calculation\n const getTargetElement = (): Element | null => {\n if (typeof window === 'undefined' || !editor.view?.dom) return null;\n try {\n const { from } = editor.state.selection;\n const { node } = editor.view.domAtPos(from);\n return node.nodeType === Node.TEXT_NODE ? node.parentElement : (node as Element);\n } catch (e) {\n return null;\n }\n };\n\n const targetEl = getTargetElement() || (typeof window !== 'undefined' ? editor.view?.dom : null);\n const computedStyle = (targetEl && typeof window !== 'undefined')\n ? window.getComputedStyle(targetEl)\n : null;\n\n // 2. Lightweight helper to extract properties from the pre-calculated style object\n const getStyle = (prop: string): string | null => {\n if (!computedStyle) return null;\n const val = computedStyle.getPropertyValue(prop);\n return normalizeColor(val);\n };\n\n const colorMark = editor.getAttributes('textStyle')['color'] || null;\n const backgroundMark = editor.getAttributes('highlight')['color'] || null;\n\n return {\n marks: {\n bold: editor.isActive('bold'),\n italic: editor.isActive('italic'),\n underline: editor.isActive('underline'),\n strike: editor.isActive('strike'),\n code: isCode,\n superscript: editor.isActive('superscript'),\n subscript: editor.isActive('subscript'),\n highlight: editor.isActive('highlight'),\n link: editor.isActive('link'),\n linkHref: editor.getAttributes('link')['href'] || null,\n color: colorMark,\n computedColor: colorMark || getStyle('color'),\n background: backgroundMark,\n computedBackground: backgroundMark || getStyle('background-color'),\n linkOpenOnClick: editor.extensionManager.extensions.find(ext => ext.name === 'link')?.options?.openOnClick ?? false,\n },\n can: {\n toggleBold: marksAllowed && !isInsideInlineCode && editor.can().toggleBold(),\n toggleItalic: marksAllowed && !isInsideInlineCode && editor.can().toggleItalic(),\n toggleUnderline: marksAllowed && !isInsideInlineCode && editor.can().toggleUnderline(),\n toggleStrike: marksAllowed && !isInsideInlineCode && editor.can().toggleStrike(),\n toggleCode: marksAllowed && editor.can().toggleCode(),\n toggleHighlight: marksAllowed && !isInsideInlineCode && editor.can().toggleHighlight(),\n toggleLink: marksAllowed && !isInsideInlineCode && (editor.can().setLink({ href: '' }) || editor.can().unsetLink()),\n toggleSuperscript: marksAllowed && !isInsideInlineCode && editor.can().toggleSuperscript(),\n toggleSubscript: marksAllowed && !isInsideInlineCode && editor.can().toggleSubscript(),\n setColor: marksAllowed && !isInsideInlineCode && editor.can().setColor(''),\n setHighlight: marksAllowed && !isInsideInlineCode && editor.can().setHighlight(),\n undo: editor.can().undo(),\n redo: editor.can().redo(),\n }\n };\n};\n","import { NodeSelection } from \"@tiptap/pm/state\";\nimport { StateCalculator } from \"../../models/editor-state.model\";\n\nexport const TableCalculator: StateCalculator = (editor) => {\n const isTable = editor.isActive('table');\n\n if (!isTable) {\n return {\n nodes: {\n isTable: false,\n isTableCell: false,\n isTableHeaderRow: false,\n isTableHeaderColumn: false,\n }\n };\n }\n\n const { selection } = editor.state;\n\n return {\n nodes: {\n isTable: true,\n isTableNodeSelected: selection instanceof NodeSelection && selection.node.type.name === 'table',\n isTableCell: editor.isActive('tableCell') || editor.isActive('tableHeader'),\n isTableHeaderRow: editor.isActive('tableHeader', { row: true }),\n isTableHeaderColumn: editor.isActive('tableHeader', { column: true }),\n },\n can: {\n addRowBefore: editor.can().addRowBefore(),\n addRowAfter: editor.can().addRowAfter(),\n deleteRow: editor.can().deleteRow(),\n addColumnBefore: editor.can().addColumnBefore(),\n addColumnAfter: editor.can().addColumnAfter(),\n deleteColumn: editor.can().deleteColumn(),\n deleteTable: editor.can().deleteTable(),\n mergeCells: editor.can().mergeCells(),\n splitCell: editor.can().splitCell(),\n toggleHeaderRow: editor.can().toggleHeaderRow(),\n toggleHeaderColumn: editor.can().toggleHeaderColumn(),\n }\n };\n};\n","import { StateCalculator } from \"../../models/editor-state.model\";\n\nexport const ImageCalculator: StateCalculator = (editor) => {\n return {\n nodes: {\n isImage: editor.isActive('image') || editor.isActive('resizableImage'),\n } as any\n };\n};\n","import { StateCalculator } from \"../../models/editor-state.model\";\n\nexport const StructureCalculator: StateCalculator = (editor) => {\n return {\n nodes: {\n isBlockquote: editor.isActive('blockquote'),\n isCodeBlock: editor.isActive('codeBlock'),\n isBulletList: editor.isActive('bulletList'),\n isOrderedList: editor.isActive('orderedList'),\n h1: editor.isActive('heading', { level: 1 }),\n h2: editor.isActive('heading', { level: 2 }),\n h3: editor.isActive('heading', { level: 3 }),\n alignLeft: editor.isActive({ textAlign: 'left' }),\n alignCenter: editor.isActive({ textAlign: 'center' }),\n alignRight: editor.isActive({ textAlign: 'right' }),\n alignJustify: editor.isActive({ textAlign: 'justify' }),\n },\n can: {\n toggleHeading1: editor.can().toggleHeading({ level: 1 }),\n toggleHeading2: editor.can().toggleHeading({ level: 2 }),\n toggleHeading3: editor.can().toggleHeading({ level: 3 }),\n toggleBulletList: editor.can().toggleBulletList(),\n toggleOrderedList: editor.can().toggleOrderedList(),\n toggleBlockquote: editor.can().toggleBlockquote(),\n toggleCodeBlock: editor.can().toggleCodeBlock(),\n setTextAlignLeft: editor.can().setTextAlign('left'),\n setTextAlignCenter: editor.can().setTextAlign('center'),\n setTextAlignRight: editor.can().setTextAlign('right'),\n setTextAlignJustify: editor.can().setTextAlign('justify'),\n insertHorizontalRule: editor.can().setHorizontalRule(),\n insertTable: editor.can().insertTable(),\n insertImage: editor.can().setResizableImage({ src: '' }),\n }\n };\n};\n","import { Editor } from '@tiptap/core';\nimport { StateCalculator } from '../../models/editor-state.model';\n\n/**\n * DiscoveryCalculator automatically detects and tracks the state of any TipTap extension.\n * It provides a \"fallback\" reactive state for any mark or node not explicitly handled \n * by specialized calculators.\n */\nexport const DiscoveryCalculator: StateCalculator = (editor: Editor) => {\n const state: { marks: Record<string, boolean>, nodes: Record<string, boolean> } = { marks: {}, nodes: {} };\n\n // We skip core extensions that are already handled by specialized calculators\n // to avoid redundant calculations and maintain precise attribute tracking.\n const handled = [\n 'bold', 'italic', 'underline', 'strike', 'code', 'link',\n 'highlight', 'superscript', 'subscript', 'table', 'image',\n 'resizableImage', 'heading', 'bulletList', 'orderedList',\n 'blockquote', 'textAlign', 'textStyle', 'color'\n ];\n\n editor.extensionManager.extensions.forEach(extension => {\n const name = extension.name;\n const type = extension.type;\n\n // Skip internal/core extensions or already handled ones\n if (['selection', 'editable', 'focus', 'undo', 'redo', 'history', 'placeholder', 'characterCount'].includes(name)) {\n return;\n }\n\n if (handled.includes(name)) {\n return;\n }\n\n if (type === 'mark') {\n state.marks[name] = editor.isActive(name);\n } else if (type === 'node') {\n state.nodes[name] = editor.isActive(name);\n }\n });\n\n return state;\n};\n","import { Extension, getAttributes } from '@tiptap/core';\nimport { Plugin, PluginKey } from '@tiptap/pm/state';\n\nexport const LinkClickBehavior = Extension.create({\n name: 'linkClickBehavior',\n\n addProseMirrorPlugins() {\n return [\n new Plugin({\n key: new PluginKey('linkClickBehavior'),\n props: {\n handleClick(view, pos, event) {\n // handleClick only runs in the browser, but we guard it for absolute SSR safety\n if (typeof window === 'undefined') return false;\n\n // If editor is editable, let TipTap/BubbleMenu handle it\n if (view.editable) return false;\n\n const attrs = getAttributes(view.state, 'link');\n if (attrs['href']) {\n window.open(attrs['href'], '_blank', 'noopener,noreferrer');\n return true;\n }\n return false;\n }\n }\n })\n ];\n }\n});\n","import { ToolbarConfig } from \"../models/toolbar.model\";\nimport {\n BubbleMenuConfig,\n ImageBubbleMenuConfig,\n TableBubbleMenuConfig,\n CellBubbleMenuConfig,\n} from \"../models/bubble-menu.model\";\n\n// Default toolbar configuration\nexport const DEFAULT_TOOLBAR_CONFIG: ToolbarConfig = {\n bold: true,\n italic: true,\n underline: true,\n strike: true,\n code: true,\n codeBlock: true,\n superscript: false, // Disabled by default (opt-in)\n subscript: false, // Disabled by default (opt-in)\n highlight: false, // Disabled by default (opt-in)\n highlightPicker: true,\n heading1: true,\n heading2: true,\n heading3: true,\n bulletList: true,\n orderedList: true,\n blockquote: true,\n alignLeft: false, // Disabled by default (opt-in)\n alignCenter: false, // Disabled by default (opt-in)\n alignRight: false, // Disabled by default (opt-in)\n alignJustify: false, // Disabled by default (opt-in)\n link: true,\n image: true,\n horizontalRule: false, // Disabled by default (opt-in)\n table: true,\n undo: true,\n redo: true,\n clear: false, // Disabled by default (opt-in)\n textColor: true,\n separator: true,\n};\n\n// Default bubble menu configuration\nexport const DEFAULT_BUBBLE_MENU_CONFIG: BubbleMenuConfig = {\n bold: true,\n italic: true,\n underline: true,\n strike: true,\n code: true,\n superscript: false,\n subscript: false,\n highlight: false,\n highlightPicker: true,\n textColor: true,\n link: true,\n separator: true,\n};\n\n// Default image bubble menu configuration\nexport const DEFAULT_IMAGE_BUBBLE_MENU_CONFIG: ImageBubbleMenuConfig = {\n changeImage: true,\n resizeSmall: true,\n resizeMedium: true,\n resizeLarge: true,\n resizeOriginal: true,\n deleteImage: true,\n separator: true,\n};\n\n// Default table bubble menu configuration\nexport const DEFAULT_TABLE_MENU_CONFIG: TableBubbleMenuConfig = {\n addRowBefore: true,\n addRowAfter: true,\n deleteRow: true,\n addColumnBefore: true,\n addColumnAfter: true,\n deleteColumn: true,\n toggleHeaderRow: true,\n toggleHeaderColumn: true,\n deleteTable: true,\n separator: true,\n};\n\n// Default cell bubble menu configuration\nexport const DEFAULT_CELL_MENU_CONFIG: CellBubbleMenuConfig = {\n mergeCells: true,\n splitCell: true,\n};\n","import {\n Component,\n ElementRef,\n input,\n output,\n OnDestroy,\n viewChild,\n effect,\n signal,\n computed,\n AfterViewInit,\n inject,\n DestroyRef,\n ChangeDetectionStrategy,\n untracked,\n} from \"@angular/core\";\nimport { takeUntilDestroyed } from \"@angular/core/rxjs-interop\";\nimport { Editor, EditorOptions, Extension, Node, Mark } from \"@tiptap/core\";\nimport StarterKit from \"@tiptap/starter-kit\";\nimport Placeholder from \"@tiptap/extension-placeholder\";\nimport CharacterCount from \"@tiptap/extension-character-count\";\nimport Underline from \"@tiptap/extension-underline\";\nimport Superscript from \"@tiptap/extension-superscript\";\nimport Subscript from \"@tiptap/extension-subscript\";\nimport TextAlign from \"@tiptap/extension-text-align\";\nimport Link from \"@tiptap/extension-link\";\nimport Highlight from \"@tiptap/extension-highlight\";\nimport TextStyle from \"@tiptap/extension-text-style\";\nimport Color from \"@tiptap/extension-color\";\nimport OfficePaste from \"@intevation/tiptap-extension-office-paste\";\n\nimport { ResizableImage } from \"./extensions/resizable-image.extension\";\nimport { UploadProgress } from \"./extensions/upload-progress.extension\";\nimport { TableExtension } from \"./extensions/table.extension\";\nimport { TiptapStateExtension } from \"./extensions/tiptap-state.extension\";\nimport { TiptapToolbarComponent } from \"./tiptap-toolbar.component\";\nimport { TiptapBubbleMenuComponent } from \"./tiptap-bubble-menu.component\";\nimport { TiptapImageBubbleMenuComponent } from \"./tiptap-image-bubble-menu.component\";\nimport { TiptapTableBubbleMenuComponent } from \"./tiptap-table-bubble-menu.component\";\nimport { TiptapCellBubbleMenuComponent } from \"./tiptap-cell-bubble-menu.component\";\nimport { TiptapLinkBubbleMenuComponent } from \"./tiptap-link-bubble-menu.component\";\nimport { TiptapColorBubbleMenuComponent } from \"./tiptap-color-bubble-menu.component\";\nimport {\n TiptapSlashCommandsComponent,\n CustomSlashCommands,\n} from \"./tiptap-slash-commands.component\";\nimport { TiptapEditToggleComponent } from \"./tiptap-edit-toggle.component\";\nimport { ImageService, ImageUploadHandler } from \"./services/image.service\";\nimport { TiptapI18nService, SupportedLocale } from \"./services/i18n.service\";\nimport { EditorCommandsService } from \"./services/editor-commands.service\";\nimport { ColorPickerService } from \"./services/color-picker.service\";\nimport { LinkService } from \"./services/link.service\";\nimport { NoopValueAccessorDirective } from \"./noop-value-accessor.directive\";\nimport {\n StateCalculator\n} from \"./models/editor-state.model\";\nimport { NgControl } from \"@angular/forms\";\nimport {\n filterSlashCommands,\n SlashCommandsConfig,\n} from \"./config/slash-commands.config\";\n\nimport { SelectionCalculator } from \"./extensions/calculators/selection.calculator\";\nimport { MarksCalculator } from \"./extensions/calculators/marks.calculator\";\nimport { TableCalculator } from \"./extensions/calculators/table.calculator\";\nimport { ImageCalculator } from \"./extensions/calculators/image.calculator\";\nimport { StructureCalculator } from \"./extensions/calculators/structure.calculator\";\nimport { DiscoveryCalculator } from \"./extensions/calculators/discovery.calculator\";\n\nimport { ToolbarConfig } from \"./models/toolbar.model\";\nimport {\n BubbleMenuConfig,\n ImageBubbleMenuConfig,\n TableBubbleMenuConfig,\n CellBubbleMenuConfig,\n} from \"./models/bubble-menu.model\";\nimport { LinkClickBehavior } from \"./extensions/link-click-behavior.extension\";\nimport {\n DEFAULT_TOOLBAR_CONFIG,\n DEFAULT_BUBBLE_MENU_CONFIG,\n DEFAULT_IMAGE_BUBBLE_MENU_CONFIG,\n DEFAULT_TABLE_MENU_CONFIG,\n DEFAULT_CELL_MENU_CONFIG,\n} from \"./config/editor.config\";\nimport { concat, defer, of, tap } from \"rxjs\";\n\n// Slash commands configuration is handled dynamically via slashCommandsConfigComputed\n\n@Component({\n selector: \"angular-tiptap-editor\",\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n hostDirectives: [NoopValueAccessorDirective],\n host: {\n '[class.fill-container]': 'fillContainer()',\n '[class.floating-toolbar]': 'floatingToolbar()',\n '[class.is-readonly]': '!editable() && !mergedDisabled()',\n '[class.is-disabled]': 'mergedDisabled()',\n '[style.--ate-border-width]': \"seamless() || mergedDisabled() ? '0' : null\",\n '[style.--ate-background]': \"seamless() ? 'transparent' : (mergedDisabled() ? 'var(--ate-surface-tertiary)' : null)\",\n '[style.--ate-toolbar-border-color]': \"seamless() ? 'transparent' : null\",\n '[style.--ate-counter-background]': \"seamless() ? 'transparent' : null\",\n '[style.--ate-counter-border-color]': \"seamless() ? 'transparent' : null\",\n },\n imports: [\n TiptapToolbarComponent,\n TiptapBubbleMenuComponent,\n TiptapImageBubbleMenuComponent,\n TiptapTableBubbleMenuComponent,\n TiptapCellBubbleMenuComponent,\n TiptapSlashCommandsComponent,\n TiptapLinkBubbleMenuComponent,\n TiptapColorBubbleMenuComponent,\n TiptapEditToggleComponent,\n ],\n providers: [\n EditorCommandsService,\n ImageService,\n ColorPickerService,\n LinkService,\n ],\n template: `\n <div class=\"tiptap-editor\">\n <!-- Toolbar -->\n @if (editable() && !mergedDisabled() && showToolbar() && editor()) {\n <tiptap-toolbar \n [editor]=\"editor()!\" \n [config]=\"toolbarConfig()\"\n [imageUpload]=\"imageUploadConfig()\"\n [floating]=\"floatingToolbar()\"\n (mouseenter)=\"hideBubbleMenus()\"\n (mouseleave)=\"showBubbleMenus()\"\n />\n }\n\n @if (showEditToggle() && !mergedDisabled()) {\n <tiptap-edit-toggle \n [editable]=\"editable()\" \n [translations]=\"currentTranslations()\"\n (toggle)=\"toggleEditMode($event)\"\n />\n }\n\n <!-- Editor Content -->\n <div\n #editorElement\n class=\"tiptap-content\"\n [class.drag-over]=\"isDragOver()\"\n (dragover)=\"onDragOver($event)\"\n (drop)=\"onDrop($event)\"\n (click)=\"onEditorClick($event)\"\n ></div>\n\n <!-- Text Bubble Menu -->\n @if (editable() && showBubbleMenu() && editor()) {\n <tiptap-bubble-menu\n [editor]=\"editor()!\"\n [config]=\"bubbleMenuConfig()\"\n [style.display]=\"editorFullyInitialized() ? 'block' : 'none'\"\n ></tiptap-bubble-menu>\n }\n\n <!-- Image Bubble Menu -->\n @if (editable() && showImageBubbleMenu() && editor()) {\n <tiptap-image-bubble-menu\n [editor]=\"editor()!\"\n [config]=\"imageBubbleMenuConfig()\"\n [style.display]=\"editorFullyInitialized() ? 'block' : 'none'\"\n ></tiptap-image-bubble-menu>\n }\n\n <!-- Link Bubble Menu -->\n @if (editable() && editor()) {\n <tiptap-link-bubble-menu\n [editor]=\"editor()!\"\n [style.display]=\"editorFullyInitialized() ? 'block' : 'none'\"\n ></tiptap-link-bubble-menu>\n }\n\n <!-- Color Bubble Menu -->\n @if (editable() && editor()) {\n <tiptap-color-bubble-menu\n [editor]=\"editor()!\"\n [style.display]=\"editorFullyInitialized() ? 'block' : 'none'\"\n ></tiptap-color-bubble-menu>\n }\n\n <!-- Slash Commands -->\n @if (editable() && enableSlashCommands() && editor()) {\n <tiptap-slash-commands\n [editor]=\"editor()!\"\n [config]=\"slashCommandsConfigComputed()\"\n [style.display]=\"editorFullyInitialized() ? 'block' : 'none'\"\n ></tiptap-slash-commands>\n }\n\n <!-- Table Menu -->\n @if (editable() && editor()) {\n <tiptap-table-bubble-menu\n [editor]=\"editor()!\"\n [config]=\"tableBubbleMenuConfig()\"\n [style.display]=\"editorFullyInitialized() ? 'block' : 'none'\"\n ></tiptap-table-bubble-menu>\n }\n\n <!-- Cell Menu -->\n @if (editable() && editor()) {\n <tiptap-cell-bubble-menu\n [editor]=\"editor()!\"\n [config]=\"cellBubbleMenuConfig()\"\n [style.display]=\"editorFullyInitialized() ? 'block' : 'none'\"\n ></tiptap-cell-bubble-menu>\n }\n\n <!-- Counters -->\n @if (editable() && !mergedDisabled() && showFooter() && (showCharacterCount() || showWordCount())) {\n <div class=\"character-count\" [class.limit-reached]=\"maxCharacters() && characterCount() >= maxCharacters()!\">\n @if (showCharacterCount()) {\n {{ characterCount() }}\n {{ currentTranslations().editor.character }}{{ characterCount() > 1 ? \"s\" : \"\" }}\n @if (maxCharacters()) {\n / {{ maxCharacters() }}\n }\n }\n \n @if (showCharacterCount() && showWordCount()) {\n , \n }\n\n @if (showWordCount()) {\n {{ wordCount() }}\n {{ currentTranslations().editor.word }}{{ wordCount() > 1 ? \"s\" : \"\" }}\n }\n </div>\n }\n </div>\n `,\n\n styles: [\n `\n /* ========================================\n CSS Custom Properties (Variables)\n Override these to customize the editor\n ======================================== */\n :host {\n /* ===== BASE TOKENS (customize these for easy theming) ===== */\n --ate-primary: #2563eb;\n --ate-primary-contrast: #ffffff;\n --ate-primary-light: color-mix(in srgb, var(--ate-primary), transparent 90%);\n --ate-primary-lighter: color-mix(in srgb, var(--ate-primary), transparent 95%);\n --ate-primary-light-alpha: color-mix(in srgb, var(--ate-primary), transparent 85%);\n \n --ate-surface: #ffffff;\n --ate-surface-secondary: #f8f9fa;\n --ate-surface-tertiary: #f1f5f9;\n \n --ate-text: #2d3748;\n --ate-text-secondary: #64748b;\n --ate-text-muted: #a0aec0;\n \n --ate-border: #e2e8f0;\n \n --ate-highlight-bg: #fef08a;\n --ate-highlight-color: #854d0e;\n \n --ate-button-hover: #f1f5f9;\n --ate-button-active: #e2e8f0;\n\n --ate-error-color: #c53030;\n --ate-error-bg: #fed7d7;\n --ate-error-border: #feb2b2;\n \n /* ===== COMPONENT TOKENS (use base tokens by default) ===== */\n /* Border & Container */\n --ate-border-color: var(--ate-border);\n --ate-border-width: 2px;\n --ate-border-radius: 12px;\n --ate-focus-color: var(--ate-primary);\n --ate-background: var(--ate-surface);\n --ate-sub-border-radius: 8px;\n \n /* Content */\n --ate-text-color: var(--ate-text);\n --ate-placeholder-color: var(--ate-text-muted);\n --ate-line-height: 1.6;\n --ate-content-padding: 16px;\n\n /* ===== MENUS (Slash/Bubble) ===== */\n --ate-menu-bg: var(--ate-surface);\n --ate-menu-border-radius: var(--ate-border-radius);\n --ate-menu-border: var(--ate-border);\n --ate-menu-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);\n --ate-menu-padding: 6px;\n \n /* Toolbar */\n --ate-toolbar-padding: var(--ate-menu-padding);\n --ate-toolbar-background: var(--ate-surface-secondary);\n --ate-toolbar-border-color: var(--ate-border);\n --ate-toolbar-button-color: var(--ate-text-secondary);\n --ate-toolbar-button-hover-background: transparent;\n --ate-toolbar-button-active-background: var(--ate-primary-light);\n --ate-toolbar-button-active-color: var(--ate-primary);\n \n /* Counter */\n --ate-counter-color: var(--ate-text-secondary);\n --ate-counter-background: var(--ate-surface-secondary);\n --ate-counter-border-color: var(--ate-border);\n \n /* Drag & Drop */\n --ate-drag-background: #f0f8ff;\n --ate-drag-border-color: var(--ate-primary);\n \n /* Blockquote */\n --ate-blockquote-border-color: var(--ate-border);\n --ate-blockquote-background: var(--ate-surface-secondary);\n \n /* Code */\n --ate-code-background: var(--ate-surface-secondary);\n --ate-code-color: var(--ate-text-secondary);\n --ate-code-border-color: var(--ate-border);\n \n --ate-code-block-background: #0f172a;\n --ate-code-block-color: #e2e8f0;\n --ate-code-block-border-color: var(--ate-border);\n \n /* Images */\n --ate-image-border-radius: 16px;\n --ate-image-selected-color: var(--ate-primary);\n \n /* Scrollbars */\n --ate-scrollbar-width: 10px;\n --ate-scrollbar-thumb: var(--ate-border);\n --ate-scrollbar-thumb-hover: var(--ate-text-muted);\n --ate-scrollbar-track: transparent;\n \n /* Tables */\n --ate-table-border-color: var(--ate-border);\n --ate-table-header-background: var(--ate-surface-secondary);\n --ate-table-header-color: var(--ate-text);\n --ate-table-cell-background: var(--ate-surface);\n --ate-table-cell-selected-background: var(--ate-primary-light);\n --ate-table-resize-handle-color: var(--ate-primary);\n --ate-table-row-hover-background: var(--ate-primary-lighter);\n }\n\n /* Manual dark mode with class or data attribute */\n :host(.dark),\n :host([data-theme=\"dark\"]) {\n /* ===== DARK BASE TOKENS ===== */\n --ate-primary: #3b82f6;\n --ate-primary-contrast: #ffffff;\n --ate-primary-light: color-mix(in srgb, var(--ate-primary), transparent 85%);\n --ate-primary-lighter: color-mix(in srgb, var(--ate-primary), transparent 92%);\n --ate-primary-light-alpha: color-mix(in srgb, var(--ate-primary), transparent 80%);\n \n --ate-surface: #020617;\n --ate-surface-secondary: #0f172a;\n --ate-surface-tertiary: #1e293b;\n \n --ate-text: #f8fafc;\n --ate-text-secondary: #94a3b8;\n --ate-text-muted: #64748b;\n \n --ate-border: #1e293b;\n \n --ate-highlight-bg: #854d0e;\n --ate-highlight-color: #fef08a;\n\n --ate-button-hover: #1e293b;\n --ate-button-active: #0f172a;\n\n /* ===== MENUS (Slash/Bubble) ===== */\n --ate-menu-border: rgba(255, 255, 255, 0.1);\n --ate-menu-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.3), 0 10px 10px -5px rgba(0, 0, 0, 0.2);\n\n --ate-error-color: #f87171;\n --ate-error-bg: #450a0a;\n --ate-error-border: #7f1d1d;\n \n /* ===== DARK COMPONENT OVERRIDES ===== */\n --ate-drag-background: var(--ate-surface-tertiary);\n --ate-drag-border-color: var(--ate-primary);\n --ate-blockquote-border-color: var(--ate-primary);\n --ate-toolbar-button-active-background: var(--ate-primary-light);\n --ate-toolbar-button-active-color: var(--ate-primary);\n --ate-button-hover: var(--ate-surface-tertiary);\n --ate-button-active: var(--ate-surface-secondary);\n --ate-scrollbar-thumb: var(--ate-surface-tertiary);\n --ate-scrollbar-thumb-hover: var(--ate-text-muted);\n }\n\n /* Host styles pour fillContainer */\n :host(.fill-container) {\n display: block;\n height: 100%;\n }\n\n /* Main editor container */\n .tiptap-editor {\n border: var(--ate-border-width) solid var(--ate-border-color);\n border-radius: var(--ate-border-radius);\n background: var(--ate-background);\n overflow: hidden;\n transition: border-color 0.2s ease;\n position: relative;\n }\n\n /* Floating Toolbar Mode */\n :host(.floating-toolbar) .tiptap-editor {\n overflow: visible;\n }\n\n /* Fill container mode - editor fills its parent */\n :host(.fill-container) .tiptap-editor {\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n\n :host(.fill-container) .tiptap-content-wrapper {\n flex: 1;\n min-height: 0;\n }\n\n :host(.fill-container) .tiptap-content {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n }\n\n .tiptap-editor:focus-within {\n border-color: var(--ate-focus-color);\n }\n\n /* Editor content area */\n .tiptap-content {\n min-height: var(--editor-min-height, 200px);\n height: var(--editor-height, auto);\n max-height: var(--editor-max-height, none);\n overflow-y: var(--editor-overflow, visible);\n outline: none;\n position: relative;\n scrollbar-width: thin;\n scrollbar-color: var(--ate-scrollbar-thumb) var(--ate-scrollbar-track);\n }\n\n :host(.is-disabled) .tiptap-content {\n cursor: not-allowed;\n opacity: 0.7;\n user-select: none;\n pointer-events: none;\n background-color: var(--ate-surface-tertiary);\n }\n\n :host(.is-readonly) .tiptap-content {\n cursor: default;\n user-select: text;\n }\n\n :host(.is-readonly) .tiptap-content ::ng-deep .tiptap-link {\n cursor: pointer;\n pointer-events: auto;\n }\n\n .tiptap-content::-webkit-scrollbar {\n width: var(--ate-scrollbar-width);\n }\n\n .tiptap-content-wrapper {\n position: relative;\n display: flex;\n flex-direction: column;\n min-height: 0;\n }\n\n .tiptap-content-wrapper .tiptap-content {\n flex: 1;\n }\n\n .tiptap-content::-webkit-scrollbar-track {\n background: var(--ate-scrollbar-track);\n }\n\n .tiptap-content::-webkit-scrollbar-thumb {\n background: var(--ate-scrollbar-thumb);\n border: 3px solid transparent;\n background-clip: content-box;\n border-radius: 10px;\n }\n\n .tiptap-content::-webkit-scrollbar-thumb:hover {\n background: var(--ate-scrollbar-thumb-hover);\n background-clip: content-box;\n }\n\n .tiptap-content.drag-over {\n background: var(--ate-drag-background);\n border: 2px dashed var(--ate-drag-border-color);\n }\n\n /* Compteur de caractères */\n .character-count {\n padding: 8px var(--ate-content-padding);\n font-size: 12px;\n color: var(--ate-counter-color);\n text-align: right;\n border-top: 1px solid var(--ate-counter-border-color);\n background: var(--ate-counter-background);\n transition: color 0.2s ease;\n border-bottom-left-radius: calc(var(--ate-border-radius) - var(--ate-border-width));\n border-bottom-right-radius: calc(var(--ate-border-radius) - var(--ate-border-width));\n }\n\n .character-count.limit-reached {\n color: var(--ate-error-color, #ef4444);\n font-weight: 600;\n }\n\n /* Styles ProseMirror avec :host ::ng-deep */\n :host ::ng-deep .ProseMirror {\n padding: var(--ate-content-padding);\n outline: none;\n line-height: var(--ate-line-height);\n color: var(--ate-text-color);\n min-height: 100%;\n height: 100%;\n /* S'assurer que le contenu s'étend correctement dans un conteneur scrollable */\n word-wrap: break-word;\n overflow-wrap: break-word;\n }\n\n /* Titres */\n :host ::ng-deep .ProseMirror h1 {\n font-size: 2em;\n font-weight: bold;\n margin-top: 0;\n margin-bottom: 0.5em;\n }\n\n :host ::ng-deep .ProseMirror h2 {\n font-size: 1.5em;\n font-weight: bold;\n margin-top: 1em;\n margin-bottom: 0.5em;\n }\n\n :host ::ng-deep .ProseMirror h3 {\n font-size: 1.25em;\n font-weight: bold;\n margin-top: 1em;\n margin-bottom: 0.5em;\n }\n\n /* Paragraphes et listes */\n :host ::ng-deep .ProseMirror p {\n margin: 0.5em 0;\n }\n\n :host ::ng-deep .ProseMirror ul,\n :host ::ng-deep .ProseMirror ol {\n padding-left: 2em;\n margin: 0.5em 0;\n }\n\n /* Citations */\n :host ::ng-deep .ProseMirror blockquote {\n border-left: 4px solid var(--ate-blockquote-border-color);\n padding-left: 1em;\n margin: 1em 0;\n background: var(--ate-blockquote-background);\n padding: 0.5em 1em;\n border-radius: 0 4px 4px 0;\n }\n\n /* Code */\n :host ::ng-deep .ProseMirror code {\n background: var(--ate-code-background);\n color: var(--ate-code-color);\n border: 1px solid var(--ate-code-border-color);\n padding: 0.15em 0.4em;\n border-radius: 4px;\n font-family: \"JetBrains Mono\", \"Fira Code\", \"Monaco\", \"Consolas\", monospace;\n font-size: 0.85em;\n font-weight: 500;\n }\n\n :host ::ng-deep .ProseMirror pre {\n background: var(--ate-code-block-background);\n color: var(--ate-code-block-color);\n border: 1px solid var(--ate-code-block-border-color);\n padding: 1em;\n border-radius: var(--ate-border-radius);\n overflow-x: auto;\n margin: 1em 0;\n }\n\n :host ::ng-deep .ProseMirror pre code {\n background: none;\n color: inherit;\n border: none;\n padding: 0;\n }\n\n /* Placeholder */\n :host ::ng-deep .ProseMirror p.is-editor-empty:first-child::before {\n content: attr(data-placeholder);\n color: var(--ate-placeholder-color);\n pointer-events: none;\n float: left;\n height: 0;\n }\n\n /* Mode lecture seule */\n :host ::ng-deep .ProseMirror[contenteditable=\"false\"] {\n pointer-events: none;\n }\n\n :host ::ng-deep .ProseMirror[contenteditable=\"false\"] img {\n cursor: default;\n pointer-events: none;\n }\n\n :host ::ng-deep .ProseMirror[contenteditable=\"false\"] img:hover {\n transform: none;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n }\n\n :host\n ::ng-deep\n .ProseMirror[contenteditable=\"false\"]\n img.ProseMirror-selectednode {\n outline: none;\n }\n\n /* Styles pour les images */\n :host ::ng-deep .ProseMirror img {\n position: relative;\n display: inline-block;\n max-width: 100%;\n height: auto;\n cursor: pointer;\n transition: all 0.2s ease;\n border: 2px solid transparent;\n border-radius: var(--ate-image-border-radius);\n }\n\n :host ::ng-deep .ProseMirror img:hover {\n border-color: var(--ate-border-color);\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n }\n\n :host ::ng-deep .ProseMirror img.ProseMirror-selectednode {\n border-color: var(--ate-image-selected-color);\n box-shadow: 0 0 0 3px var(--ate-primary-light-alpha);\n transition: all 0.2s ease;\n }\n\n /* Images avec classe tiptap-image */\n :host ::ng-deep .ProseMirror .tiptap-image {\n max-width: 100%;\n height: auto;\n border-radius: var(--ate-image-border-radius);\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08);\n margin: 0.5em 0;\n cursor: pointer;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n display: block;\n filter: brightness(1) contrast(1);\n }\n\n :host ::ng-deep .ProseMirror .tiptap-image:hover {\n box-shadow: 0 8px 30px rgba(0, 0, 0, 0.12);\n filter: brightness(1.02) contrast(1.02);\n }\n\n :host ::ng-deep .ProseMirror .tiptap-image.ProseMirror-selectednode {\n outline: 2px solid var(--ate-primary);\n outline-offset: 2px;\n border-radius: var(--ate-image-border-radius);\n box-shadow: 0 0 0 4px var(--ate-primary-light-alpha);\n }\n\n /* Conteneurs d'images avec alignement */\n :host ::ng-deep .image-container {\n margin: 0.5em 0;\n text-align: center;\n border-radius: 16px;\n overflow: hidden;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n :host ::ng-deep .image-container.image-align-left {\n text-align: left;\n }\n\n :host ::ng-deep .image-container.image-align-center {\n text-align: center;\n }\n\n :host ::ng-deep .image-container.image-align-right {\n text-align: right;\n }\n\n :host ::ng-deep .image-container img {\n display: inline-block;\n max-width: 100%;\n height: auto;\n border-radius: 16px;\n }\n\n /* Conteneur pour les images redimensionnables */\n :host ::ng-deep .resizable-image-container {\n position: relative;\n display: inline-block;\n margin: 0.5em 0;\n }\n\n /* Conteneur des contrôles de redimensionnement */\n :host ::ng-deep .resize-controls {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n pointer-events: none;\n z-index: 1000;\n }\n\n /* Poignées de redimensionnement */\n :host ::ng-deep .resize-handle {\n position: absolute;\n width: 12px;\n height: 12px;\n background: var(--ate-primary);\n border: 2px solid var(--ate-surface);\n border-radius: 50%;\n pointer-events: all;\n cursor: pointer;\n z-index: 1001;\n transition: all 0.15s ease;\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.2);\n }\n\n :host ::ng-deep .resize-handle:hover {\n background: var(--ate-primary);\n box-shadow: 0 3px 8px rgba(0, 0, 0, 0.3);\n }\n\n :host ::ng-deep .resize-handle:active {\n background: var(--ate-primary);\n }\n\n /* Poignées du milieu avec scale séparé */\n :host ::ng-deep .resize-handle-n:hover,\n :host ::ng-deep .resize-handle-s:hover {\n transform: translateX(-50%) scale(1.2);\n }\n\n :host ::ng-deep .resize-handle-w:hover,\n :host ::ng-deep .resize-handle-e:hover {\n transform: translateY(-50%) scale(1.2);\n }\n\n :host ::ng-deep .resize-handle-n:active,\n :host ::ng-deep .resize-handle-s:active {\n transform: translateX(-50%) scale(0.9);\n }\n\n :host ::ng-deep .resize-handle-w:active,\n :host ::ng-deep .resize-handle-e:active {\n transform: translateY(-50%) scale(0.9);\n }\n\n /* Poignées des coins avec scale simple */\n :host ::ng-deep .resize-handle-nw:hover,\n :host ::ng-deep .resize-handle-ne:hover,\n :host ::ng-deep .resize-handle-sw:hover,\n :host ::ng-deep .resize-handle-se:hover {\n transform: scale(1.2);\n }\n\n :host ::ng-deep .resize-handle-nw:active,\n :host ::ng-deep .resize-handle-ne:active,\n :host ::ng-deep .resize-handle-sw:active,\n :host ::ng-deep .resize-handle-se:active {\n transform: scale(0.9);\n }\n\n /* Positions spécifiques pour chaque poignée */\n :host ::ng-deep .resize-handle-nw {\n top: 0;\n left: -6px;\n cursor: nw-resize;\n }\n :host ::ng-deep .resize-handle-n {\n top: 0;\n left: 50%;\n transform: translateX(-50%);\n cursor: n-resize;\n }\n :host ::ng-deep .resize-handle-ne {\n top: 0;\n right: -6px;\n cursor: ne-resize;\n }\n :host ::ng-deep .resize-handle-w {\n top: 50%;\n left: -6px;\n transform: translateY(-50%);\n cursor: w-resize;\n }\n :host ::ng-deep .resize-handle-e {\n top: 50%;\n right: -6px;\n transform: translateY(-50%);\n cursor: e-resize;\n }\n :host ::ng-deep .resize-handle-sw {\n bottom: 0;\n left: -6px;\n cursor: sw-resize;\n }\n :host ::ng-deep .resize-handle-s {\n bottom: 0;\n left: 50%;\n transform: translateX(-50%);\n cursor: s-resize;\n }\n :host ::ng-deep .resize-handle-se {\n bottom: 0;\n right: -6px;\n cursor: se-resize;\n }\n\n /* Styles pour le redimensionnement en cours */\n :host ::ng-deep body.resizing {\n user-select: none;\n cursor: crosshair;\n }\n\n :host ::ng-deep body.resizing .ProseMirror {\n pointer-events: none;\n }\n\n :host ::ng-deep body.resizing .ProseMirror .tiptap-image {\n pointer-events: none;\n }\n\n /* Styles pour les informations de taille d'image */\n :host ::ng-deep .image-size-info {\n position: absolute;\n bottom: -20px;\n left: 50%;\n transform: translateX(-50%);\n background: rgba(0, 0, 0, 0.8);\n color: white;\n padding: 2px 6px;\n border-radius: 3px;\n font-size: 11px;\n white-space: nowrap;\n opacity: 0;\n transition: opacity 0.2s ease;\n }\n\n :host ::ng-deep .image-container:hover .image-size-info {\n opacity: 1;\n }\n /* Styles pour les tables */\n :host ::ng-deep .ProseMirror table {\n border-collapse: separate;\n border-spacing: 0;\n margin: 0;\n table-layout: fixed;\n width: 100%;\n border-radius: 8px;\n overflow: hidden;\n }\n\n :host ::ng-deep .ProseMirror table td,\n :host ::ng-deep .ProseMirror table th {\n border: none;\n border-right: 1px solid var(--ate-table-border-color);\n border-bottom: 1px solid var(--ate-table-border-color);\n box-sizing: border-box;\n min-width: 1em;\n padding: 8px 12px;\n position: relative;\n vertical-align: top;\n text-align: left;\n }\n\n :host ::ng-deep .ProseMirror table td {\n background: var(--ate-table-cell-background);\n }\n\n /* Ajouter les bordures externes manquantes pour former la bordure du tableau */\n :host ::ng-deep .ProseMirror table td:first-child,\n :host ::ng-deep .ProseMirror table th:first-child {\n border-left: 1px solid var(--ate-table-border-color);\n }\n\n :host ::ng-deep .ProseMirror table tr:first-child td,\n :host ::ng-deep .ProseMirror table tr:first-child th {\n border-top: 1px solid var(--ate-table-border-color);\n }\n\n /* Coins arrondis */\n :host ::ng-deep .ProseMirror table tr:first-child th:first-child {\n border-top-left-radius: 8px;\n }\n\n :host ::ng-deep .ProseMirror table tr:first-child th:last-child {\n border-top-right-radius: 8px;\n }\n\n :host ::ng-deep .ProseMirror table tr:last-child td:first-child {\n border-bottom-left-radius: 8px;\n }\n\n :host ::ng-deep .ProseMirror table tr:last-child td:last-child {\n border-bottom-right-radius: 8px;\n }\n\n /* En-têtes de table */\n :host ::ng-deep .ProseMirror table th {\n background: var(--ate-table-header-background);\n font-weight: 600;\n color: var(--ate-table-header-color);\n }\n\n /* Cellules sélectionnées */\n :host ::ng-deep .ProseMirror table .selectedCell:after {\n background: var(--ate-table-cell-selected-background);\n content: \"\";\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n pointer-events: none;\n position: absolute;\n z-index: 2;\n }\n\n /* Poignées de redimensionnement */\n :host ::ng-deep .ProseMirror table .column-resize-handle {\n position: absolute;\n right: -2px;\n top: 0;\n bottom: 0;\n width: 4px;\n background-color: var(--ate-table-resize-handle-color);\n opacity: 0;\n transition: opacity 0.2s ease;\n }\n\n :host ::ng-deep .ProseMirror table:hover .column-resize-handle {\n opacity: 1;\n }\n\n :host ::ng-deep .ProseMirror table .column-resize-handle:hover {\n background-color: var(--ate-focus-color);\n }\n\n /* Container avec scroll horizontal */\n :host ::ng-deep .ProseMirror .tableWrapper {\n overflow-x: auto;\n margin: 1em 0;\n border-radius: 8px;\n }\n\n :host ::ng-deep .ProseMirror .tableWrapper table {\n margin: 0;\n border-radius: 8px;\n min-width: 600px;\n overflow: hidden;\n }\n\n /* Paragraphes dans les tables */\n :host ::ng-deep .ProseMirror table p {\n margin: 0;\n }\n\n /* Styles pour les lignes avec hover */\n :host ::ng-deep .ProseMirror table tbody tr:hover td {\n background-color: var(--ate-table-row-hover-background);\n }\n `,\n ],\n})\nexport class AngularTiptapEditorComponent implements AfterViewInit, OnDestroy {\n content = input<string>(\"\");\n placeholder = input<string>(\"\");\n editable = input<boolean>(true);\n disabled = input<boolean>(false);\n minHeight = input<number>(200);\n height = input<number | undefined>(undefined);\n maxHeight = input<number | undefined>(undefined);\n fillContainer = input<boolean>(false);\n showToolbar = input<boolean>(true);\n showFooter = input<boolean>(true);\n showCharacterCount = input<boolean>(true);\n showWordCount = input<boolean>(true);\n maxCharacters = input<number | undefined>(undefined);\n enableOfficePaste = input<boolean>(true);\n enableSlashCommands = input<boolean>(true);\n slashCommands = input<SlashCommandsConfig>({});\n customSlashCommands = input<CustomSlashCommands | undefined>(undefined);\n locale = input<SupportedLocale | undefined>(undefined);\n autofocus = input<boolean | 'start' | 'end' | 'all' | number>(false);\n seamless = input<boolean>(false);\n floatingToolbar = input<boolean>(false);\n showEditToggle = input<boolean>(false);\n\n tiptapExtensions = input<(Extension | Node | Mark)[]>([]);\n tiptapOptions = input<Partial<EditorOptions>>({});\n\n // Nouveaux inputs pour les bubble menus\n showBubbleMenu = input<boolean>(true);\n bubbleMenu = input<Partial<BubbleMenuConfig>>(DEFAULT_BUBBLE_MENU_CONFIG);\n showImageBubbleMenu = input<boolean>(true);\n imageBubbleMenu = input<Partial<ImageBubbleMenuConfig>>(\n DEFAULT_IMAGE_BUBBLE_MENU_CONFIG\n );\n\n // Configuration de la toolbar\n toolbar = input<Partial<ToolbarConfig>>({});\n\n // Configuration des menus de table\n showTableBubbleMenu = input<boolean>(true);\n tableBubbleMenu = input<Partial<TableBubbleMenuConfig>>(DEFAULT_TABLE_MENU_CONFIG);\n showCellBubbleMenu = input<boolean>(true);\n cellBubbleMenu = input<Partial<CellBubbleMenuConfig>>(DEFAULT_CELL_MENU_CONFIG);\n\n /**\n * Additionnal state calculators to extend the reactive editor state.\n */\n stateCalculators = input<StateCalculator[]>([]);\n\n // Nouveau input pour la configuration de l'upload d'images\n imageUpload = input<Partial<any>>({});\n\n /**\n * Custom handler for image uploads.\n * When provided, images will be processed through this handler instead of being converted to base64.\n * This allows you to upload images to your own server/storage and use the returned URL.\n *\n * @example\n * ```typescript\n * myUploadHandler: ImageUploadHandler = async (context) => {\n * const formData = new FormData();\n * formData.append('image', context.file);\n * const response = await fetch('/api/upload', { method: 'POST', body: formData });\n * const data = await response.json();\n * return { src: data.imageUrl };\n * };\n *\n * // In template:\n * // <angular-tiptap-editor [imageUploadHandler]=\"myUploadHandler\" />\n * ```\n */\n imageUploadHandler = input<ImageUploadHandler | undefined>(undefined);\n\n // Nouveaux outputs\n contentChange = output<string>();\n editorCreated = output<Editor>();\n editorUpdate = output<{ editor: Editor; transaction: any }>();\n editorFocus = output<{ editor: Editor; event: FocusEvent }>();\n editorBlur = output<{ editor: Editor; event: FocusEvent }>();\n editableChange = output<boolean>();\n\n // ViewChild with signal\n editorElement = viewChild.required<ElementRef>(\"editorElement\");\n\n // ============================================\n // Toolbar / Bubble Menu Coordination\n // ============================================\n hideBubbleMenus(): void {\n this.editorCommandsService.setToolbarInteracting(true);\n }\n\n showBubbleMenus(): void {\n this.editorCommandsService.setToolbarInteracting(false);\n }\n\n\n // Private signals for internal state\n private _editor = signal<Editor | null>(null);\n private _characterCount = signal<number>(0);\n private _wordCount = signal<number>(0);\n private _isDragOver = signal<boolean>(false);\n private _editorFullyInitialized = signal<boolean>(false);\n\n // Anti-echo: track last emitted HTML to prevent cursor reset on parent echo\n private lastEmittedHtml: string | null = null;\n\n // Read-only access to signals\n readonly editor = this._editor.asReadonly();\n readonly characterCount = this._characterCount.asReadonly();\n readonly wordCount = this._wordCount.asReadonly();\n readonly isDragOver = this._isDragOver.asReadonly();\n readonly editorFullyInitialized = this._editorFullyInitialized.asReadonly();\n \n private _isFormControlDisabled = signal<boolean>(false);\n readonly isFormControlDisabled = this._isFormControlDisabled.asReadonly();\n\n // Combined disabled state (Input + FormControl)\n readonly mergedDisabled = computed(() => this.disabled() || this.isFormControlDisabled());\n\n // Computed for editor states\n isEditorReady = computed(() => this.editor() !== null);\n\n // Computed for toolbar configuration\n toolbarConfig = computed(() =>\n Object.keys(this.toolbar()).length === 0\n ? DEFAULT_TOOLBAR_CONFIG\n : this.toolbar()\n );\n\n // Computed for bubble menu configuration\n bubbleMenuConfig = computed(() =>\n Object.keys(this.bubbleMenu()).length === 0\n ? DEFAULT_BUBBLE_MENU_CONFIG\n : { ...DEFAULT_BUBBLE_MENU_CONFIG, ...this.bubbleMenu() }\n );\n\n // Computed for image bubble menu configuration\n imageBubbleMenuConfig = computed(() =>\n Object.keys(this.imageBubbleMenu()).length === 0\n ? DEFAULT_IMAGE_BUBBLE_MENU_CONFIG\n : { ...DEFAULT_IMAGE_BUBBLE_MENU_CONFIG, ...this.imageBubbleMenu() }\n );\n\n // Computed for table bubble menu configuration\n tableBubbleMenuConfig = computed(() =>\n Object.keys(this.tableBubbleMenu()).length === 0\n ? DEFAULT_TABLE_MENU_CONFIG\n : { ...DEFAULT_TABLE_MENU_CONFIG, ...this.tableBubbleMenu() }\n );\n\n // Computed for cell bubble menu configuration\n cellBubbleMenuConfig = computed(() =>\n Object.keys(this.cellBubbleMenu()).length === 0\n ? DEFAULT_CELL_MENU_CONFIG\n : { ...DEFAULT_CELL_MENU_CONFIG, ...this.cellBubbleMenu() }\n );\n\n // Computed for image upload configuration\n imageUploadConfig = computed(() => ({\n maxSize: 5,\n maxWidth: 1920,\n maxHeight: 1080,\n allowedTypes: [\"image/jpeg\", \"image/png\", \"image/gif\", \"image/webp\"],\n enableDragDrop: true,\n showPreview: true,\n multiple: false,\n compressImages: true,\n quality: 0.8,\n ...this.imageUpload(),\n }));\n\n // Computed for slash commands configuration\n slashCommandsConfigComputed = computed(() => {\n const customConfig = this.customSlashCommands();\n if (customConfig) {\n return customConfig;\n }\n\n // Utilise l'utilitaire filterSlashCommands qui gère maintenant \n // les défauts, le filtrage et l'ajout de commandes personnalisées\n return {\n commands: filterSlashCommands(this.slashCommands(), this.i18nService, this.editorCommandsService, this.imageUploadConfig()),\n };\n });\n\n // Computed for current translations (allows per-instance override via [locale] input)\n readonly currentTranslations = computed(() => {\n const localeOverride = this.locale();\n if (localeOverride) {\n // If a specific language is provided to this instance, try to retrieve it\n const allTranslations = this.i18nService.allTranslations();\n return allTranslations[localeOverride] || this.i18nService.translations();\n }\n // Otherwise, follow the global service language\n return this.i18nService.translations();\n });\n\n private _destroyRef = inject(DestroyRef);\n // NgControl for management of FormControls\n private ngControl = inject(NgControl, { self: true, optional: true });\n\n readonly i18nService = inject(TiptapI18nService);\n readonly editorCommandsService = inject(EditorCommandsService);\n // Access editor state via service\n readonly editorState = this.editorCommandsService.editorState;\n\n constructor() {\n\n // Effect to update editor content (with anti-echo)\n effect(() => {\n const content = this.content(); // Sole reactive dependency\n\n untracked(() => {\n const editor = this.editor();\n const hasFormControl = !!(this.ngControl as any)?.control;\n\n if (!editor || content === undefined) return;\n\n // Anti-écho : on ignore ce qu'on vient d'émettre nous-mêmes\n if (content === this.lastEmittedHtml) return;\n\n // Double sécurité : on vérifie le contenu actuel de l'éditeur\n if (content === editor.getHTML()) return;\n\n // Do not overwrite content if we have a FormControl and content is empty\n if (hasFormControl && !content) return;\n\n editor.commands.setContent(content, false);\n });\n });\n\n // Effect to update height properties\n effect(() => {\n const minHeight = this.minHeight();\n const height = this.height();\n const maxHeight = this.maxHeight();\n const element = this.editorElement()?.nativeElement;\n\n // Automatically calculate if scroll is needed\n const needsScroll = height !== undefined || maxHeight !== undefined;\n\n if (element) {\n element.style.setProperty(\"--editor-min-height\", `${minHeight}px`);\n element.style.setProperty(\n \"--editor-height\",\n height ? `${height}px` : \"auto\"\n );\n element.style.setProperty(\n \"--editor-max-height\",\n maxHeight ? `${maxHeight}px` : \"none\"\n );\n element.style.setProperty(\n \"--editor-overflow\",\n needsScroll ? \"auto\" : \"visible\"\n );\n }\n });\n\n // Effect to monitor editability changes\n effect(() => {\n const currentEditor = this.editor();\n // An editor is \"editable\" if it's not disabled and editable mode is ON\n const isEditable = this.editable() && !this.mergedDisabled();\n // An editor is \"readonly\" if it's explicitly non-editable and not disabled\n const isReadOnly = !this.editable() && !this.mergedDisabled();\n \n if (currentEditor) {\n this.editorCommandsService.setEditable(currentEditor, isEditable);\n }\n });\n\n // Effect to synchronize image upload handler with the service\n effect(() => {\n const handler = this.imageUploadHandler();\n this.editorCommandsService.uploadHandler = handler || null;\n });\n\n // Effect to update character count limit dynamically\n effect(() => {\n const editor = this.editor();\n const limit = this.maxCharacters();\n\n if (editor && editor.extensionManager) {\n const characterCountExtension = editor.extensionManager.extensions.find(\n (ext) => ext.name === \"characterCount\"\n );\n\n if (characterCountExtension) {\n characterCountExtension.options.limit = limit;\n // Force TipTap to recognize the option change if possible\n // Some extensions need re-creation, but characterCount plugin \n // reads this.options.limit in its filterTransaction.\n }\n }\n });\n }\n\n ngAfterViewInit() {\n // La vue est déjà complètement initialisée dans ngAfterViewInit\n // Initialiser l'éditeur\n this.initEditor();\n\n // S'abonner aux changements du FormControl\n this.setupFormControlSubscription();\n }\n\n ngOnDestroy() {\n const currentEditor = this.editor();\n if (currentEditor) {\n currentEditor.destroy();\n }\n this._editorFullyInitialized.set(false);\n }\n\n private initEditor() {\n const extensions: (Extension | Node | Mark)[] = [\n StarterKit,\n TextStyle,\n Color.configure({\n types: [\"textStyle\"],\n }),\n Placeholder.configure({\n placeholder:\n this.placeholder() || this.i18nService.editor().placeholder,\n }),\n Underline,\n Superscript,\n Subscript,\n TextAlign.configure({\n types: [\"heading\", \"paragraph\"],\n }),\n Link.configure({\n openOnClick: false,\n HTMLAttributes: {\n class: \"tiptap-link\",\n },\n }),\n LinkClickBehavior,\n Highlight.configure({\n multicolor: true,\n HTMLAttributes: {\n class: \"tiptap-highlight\",\n },\n }),\n ResizableImage.configure({\n inline: false,\n allowBase64: true,\n HTMLAttributes: {\n class: \"tiptap-image\",\n },\n }),\n UploadProgress.configure({\n isUploading: () => this.editorCommandsService.isUploading(),\n uploadProgress: () => this.editorCommandsService.uploadProgress(),\n uploadMessage: () => this.editorCommandsService.uploadMessage(),\n }),\n TableExtension,\n TiptapStateExtension.configure({\n onUpdate: (state) => this.editorCommandsService.updateState(state),\n calculators: [\n SelectionCalculator,\n MarksCalculator,\n TableCalculator,\n ImageCalculator,\n StructureCalculator,\n DiscoveryCalculator,\n ...this.stateCalculators(),\n ]\n }),\n ];\n\n // Ajouter l'extension Office Paste si activée\n if (this.enableOfficePaste()) {\n extensions.push(\n OfficePaste.configure({\n // Configuration par défaut pour une meilleure compatibilité\n transformPastedHTML: true,\n transformPastedText: true,\n })\n );\n }\n\n if (this.showCharacterCount() || this.showWordCount()) {\n extensions.push(\n CharacterCount.configure({\n limit: this.maxCharacters(),\n })\n );\n }\n\n // Allow addition of custom extensions, but avoid duplicates by filtering by name\n const customExtensions = this.tiptapExtensions();\n if (customExtensions.length > 0) {\n const existingNames = new Set(\n extensions\n .map((ext) => (ext as any)?.name as string | undefined)\n .filter((name): name is string => !!name)\n );\n\n const filteredCustom = customExtensions.filter((ext) => {\n const name = (ext as any)?.name as string | undefined;\n return !name || !existingNames.has(name);\n });\n\n extensions.push(...filteredCustom);\n }\n\n // Also allow any tiptap user options\n const userOptions = this.tiptapOptions();\n\n const newEditor = new Editor({\n ...userOptions,\n element: this.editorElement().nativeElement,\n extensions,\n content: this.content(),\n editable: this.editable() && !this.mergedDisabled(),\n autofocus: this.autofocus(),\n onUpdate: ({ editor, transaction }) => {\n const html = editor.getHTML();\n\n // Anti-écho : mémoriser ce qu'on émet pour éviter la boucle\n this.lastEmittedHtml = html;\n\n this.contentChange.emit(html);\n // Mettre à jour le FormControl si il existe\n if ((this.ngControl as any)?.control) {\n (this.ngControl as any).control.setValue(html, {\n emitEvent: false,\n });\n }\n this.editorUpdate.emit({ editor, transaction });\n this.updateCharacterCount(editor);\n },\n onCreate: ({ editor }) => {\n this.editorCreated.emit(editor);\n this.updateCharacterCount(editor);\n\n // Marquer l'éditeur comme complètement initialisé après un court délai\n // pour s'assurer que tous les plugins et extensions sont prêts\n setTimeout(() => {\n this._editorFullyInitialized.set(true);\n }, 100);\n },\n onFocus: ({ editor, event }) => {\n this.editorFocus.emit({ editor, event });\n },\n onBlur: ({ editor, event }) => {\n // Marquer le FormControl comme touché si il existe\n if ((this.ngControl as any)?.control) {\n (this.ngControl as any).control.markAsTouched();\n }\n this.editorBlur.emit({ editor, event });\n },\n });\n\n // Stocker la référence de l'éditeur immédiatement\n this._editor.set(newEditor);\n }\n\n toggleEditMode(event: Event): void {\n event.preventDefault();\n event.stopPropagation();\n const newEditable = !this.editable();\n this.editableChange.emit(newEditable);\n }\n\n private updateCharacterCount(editor: Editor) {\n if ((this.showCharacterCount() || this.showWordCount()) && editor.storage[\"characterCount\"]) {\n const storage = editor.storage[\"characterCount\"];\n this._characterCount.set(storage.characters());\n this._wordCount.set(storage.words());\n }\n }\n\n\n onDragOver(event: DragEvent) {\n event.preventDefault();\n event.stopPropagation();\n this._isDragOver.set(true);\n }\n\n onDrop(event: DragEvent) {\n event.preventDefault();\n event.stopPropagation();\n this._isDragOver.set(false);\n\n const files = event.dataTransfer?.files;\n if (files && files.length > 0) {\n const file = files[0];\n if (file.type.startsWith(\"image/\")) {\n this.insertImageFromFile(file);\n }\n }\n }\n\n private async insertImageFromFile(file: File) {\n const currentEditor = this.editor();\n if (currentEditor) {\n try {\n const config = this.imageUploadConfig();\n await this.editorCommandsService.uploadImage(currentEditor, file, {\n quality: config.quality,\n maxWidth: config.maxWidth,\n maxHeight: config.maxHeight\n });\n } catch (error) {\n // Gérer l'erreur silencieusement ou afficher une notification\n }\n }\n }\n\n // Public methods\n getHTML(): string {\n return this.editor()?.getHTML() || \"\";\n }\n\n getJSON(): any {\n return this.editor()?.getJSON();\n }\n\n getText(): string {\n return this.editor()?.getText() || \"\";\n }\n\n setContent(content: string, emitUpdate = true) {\n const editor = this.editor();\n if (editor) {\n this.editorCommandsService.setContent(editor, content, emitUpdate);\n }\n }\n\n focus() {\n const editor = this.editor();\n if (editor) {\n this.editorCommandsService.focus(editor);\n }\n }\n\n blur() {\n const editor = this.editor();\n if (editor) {\n this.editorCommandsService.blur(editor);\n }\n }\n\n clearContent() {\n const editor = this.editor();\n if (editor) {\n this.editorCommandsService.clearContent(editor);\n }\n }\n\n // Méthode publique pour obtenir l'éditeur\n getEditor(): Editor | null {\n return this.editor();\n }\n\n private setupFormControlSubscription(): void {\n const control = (this.ngControl as any)?.control;\n if (control) {\n // Synchronize form control value with editor content\n const formValue$ = concat(\n defer(() => of(control.value)),\n control.valueChanges\n );\n\n formValue$\n .pipe(\n tap((value: any) => {\n const editor = this.editor();\n if (editor) {\n this.setContent(value, false);\n }\n }),\n takeUntilDestroyed(this._destroyRef)\n )\n .subscribe();\n\n // Synchronize form control status with editor disabled state\n const formStatus$ = concat(\n defer(() => of(control.status)),\n control.statusChanges\n );\n\n formStatus$\n .pipe(\n tap((status: string) => {\n this._isFormControlDisabled.set(status === 'DISABLED');\n }),\n takeUntilDestroyed(this._destroyRef)\n )\n .subscribe();\n }\n }\n\n onEditorClick(event: MouseEvent) {\n const editor = this.editor();\n if (!editor || !this.editable()) return;\n\n // Verify if click is on the container element and not on the content\n const target = event.target as HTMLElement;\n const editorElement = this.editorElement()?.nativeElement;\n\n if (\n target === editorElement ||\n target.classList.contains(\"tiptap-content\")\n ) {\n // Click in the empty space, position the cursor at the end\n setTimeout(() => {\n const { doc } = editor.state;\n const endPos = doc.content.size;\n editor.commands.setTextSelection(endPos);\n editor.commands.focus();\n }, 0);\n }\n }\n\n // Methods for table edit button - Removed as replaced by bubble menu\n}\n","/*\n * Public API Surface of tiptap-editor\n */\n\n// Main component\nexport * from \"./lib/tiptap-editor.component\";\n\n// Host directive for FormControl integration (Required by Angular)\nexport * from \"./lib/noop-value-accessor.directive\";\n\n// Services\nexport * from \"./lib/services/i18n.service\";\nexport * from \"./lib/services/editor-commands.service\";\nexport * from \"./lib/services/image.service\";\nexport * from \"./lib/services/color-picker.service\";\nexport * from \"./lib/services/link.service\";\n\n// State & Calculators (Essential for custom plugins)\nexport * from \"./lib/models/editor-state.model\";\nexport * from \"./lib/extensions/calculators/discovery.calculator\";\nexport * from \"./lib/extensions/calculators/image.calculator\";\nexport * from \"./lib/extensions/calculators/marks.calculator\";\nexport * from \"./lib/extensions/calculators/selection.calculator\";\nexport * from \"./lib/extensions/calculators/structure.calculator\";\nexport * from \"./lib/extensions/calculators/table.calculator\";\n\n// Types and interfaces for configuration\nexport * from \"./lib/models/toolbar.model\";\nexport * from \"./lib/models/bubble-menu.model\";\nexport type {\n CustomSlashCommands,\n SlashCommandItem,\n} from \"./lib/tiptap-slash-commands.component\";\n\n// Default configurations\nexport * from \"./lib/config/editor.config\";\n\n// Utility functions for slash commands\nexport * from \"./lib/config/slash-commands.config\";\n\n// Translations\nexport type { SupportedLocale } from \"./lib/services/i18n.service\";\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["Node","i1.NoopValueAccessorDirective"],"mappings":"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"}