@flogeez/angular-tiptap-editor 2.1.2 → 2.1.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/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 { isObservable, firstValueFrom } from \"rxjs\";\nimport { TiptapI18nService } from \"./i18n.service\";\nimport { ResizeOptions, ImageUploadOptions, ImageUploadHandler, ImageUploadResult, ImageData } from \"../models/image.model\";\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, options?: { maxSize?: number; allowedTypes?: string[] }): { valid: boolean; error?: string } {\n const maxSize = options?.maxSize || 10 * 1024 * 1024;\n const allowedTypes = options?.allowedTypes || [];\n\n if (allowedTypes.length > 0 && !allowedTypes.includes(file.type)) {\n return { valid: false, error: this.t().invalidFileType };\n }\n\n if (file.size > maxSize) {\n return {\n valid: false,\n error: `${this.t().imageTooLarge} (max ${Math.round(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?: ImageUploadOptions\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 maxSize: options?.maxSize,\n allowedTypes: options?.allowedTypes\n });\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?: ImageUploadOptions): 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?: ImageUploadOptions) => Promise<void>,\n options?: ImageUploadOptions\n ): Promise<void> {\n return new Promise((resolve, reject) => {\n const input = document.createElement(\"input\");\n input.type = \"file\";\n\n // Use allowedTypes if provided, otherwise default to image/*\n if (options?.allowedTypes && options.allowedTypes.length > 0) {\n input.accept = options.allowedTypes.join(\",\");\n } else {\n input.accept = \"image/*\";\n }\n\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?: ImageUploadOptions): 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?: ImageUploadOptions): 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?: ImageUploadOptions): 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 } from \"./image.service\";\nimport { ColorPickerService } from \"./color-picker.service\";\nimport { LinkService } from \"./link.service\";\nimport { EditorStateSnapshot, INITIAL_EDITOR_STATE } from \"../models/editor-state.model\";\nimport { ImageUploadHandler, ImageUploadOptions } from \"../models/image.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?: ImageUploadOptions\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?: ImageUploadOptions\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\";\nimport { ImageUploadOptions } from \"./models/image.model\";\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 imageUpload = input<ImageUploadOptions>({});\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, this.imageUpload());\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 allowedTypes: imageOptions?.allowedTypes\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 {\n ImageService,\n} 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 { AteEditorConfig } from \"./models/editor-config.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\";\nimport { ImageUploadHandler, ImageUploadOptions } from \"./models/image.model\";\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]': 'finalFillContainer()',\n '[class.floating-toolbar]': 'finalFloatingToolbar()',\n '[class.is-readonly]': '!finalEditable() && !mergedDisabled()',\n '[class.is-disabled]': 'mergedDisabled()',\n '[style.--ate-border-width]': \"finalSeamless() || mergedDisabled() ? '0' : null\",\n '[style.--ate-background]': \"finalSeamless() ? 'transparent' : (mergedDisabled() ? 'var(--ate-surface-tertiary)' : null)\",\n '[style.--ate-toolbar-border-color]': \"finalSeamless() ? 'transparent' : null\",\n '[style.--ate-counter-background]': \"finalSeamless() ? 'transparent' : null\",\n '[style.--ate-counter-border-color]': \"finalSeamless() ? 'transparent' : null\",\n '[class.dark]': \"config().theme === 'dark'\",\n '[attr.data-theme]': \"config().theme\",\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 (finalEditable() && !mergedDisabled() && finalShowToolbar() && editor()) {\n <tiptap-toolbar \n [editor]=\"editor()!\" \n [config]=\"finalToolbarConfig()\"\n [imageUpload]=\"finalImageUploadConfig()\"\n [floating]=\"finalFloatingToolbar()\"\n (mouseenter)=\"hideBubbleMenus()\"\n (mouseleave)=\"showBubbleMenus()\"\n />\n }\n\n @if (finalShowEditToggle() && !mergedDisabled()) {\n <tiptap-edit-toggle \n [editable]=\"finalEditable()\" \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 (finalEditable() && finalShowBubbleMenu() && editor()) {\n <tiptap-bubble-menu\n [editor]=\"editor()!\"\n [config]=\"finalBubbleMenuConfig()\"\n [style.display]=\"editorFullyInitialized() ? 'block' : 'none'\"\n ></tiptap-bubble-menu>\n }\n\n <!-- Image Bubble Menu -->\n @if (finalEditable() && finalShowImageBubbleMenu() && editor()) {\n <tiptap-image-bubble-menu\n [editor]=\"editor()!\"\n [config]=\"finalImageBubbleMenuConfig()\"\n [imageUpload]=\"finalImageUploadConfig()\"\n [style.display]=\"editorFullyInitialized() ? 'block' : 'none'\"\n ></tiptap-image-bubble-menu>\n }\n\n <!-- Link Bubble Menu -->\n @if (finalEditable() && 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 (finalEditable() && 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 (finalEditable() && finalEnableSlashCommands() && editor()) {\n <tiptap-slash-commands\n [editor]=\"editor()!\"\n [config]=\"finalSlashCommandsConfig()\"\n [style.display]=\"editorFullyInitialized() ? 'block' : 'none'\"\n ></tiptap-slash-commands>\n }\n\n <!-- Table Menu -->\n @if (finalEditable() && finalShowTableBubbleMenu() && editor()) {\n <tiptap-table-bubble-menu\n [editor]=\"editor()!\"\n [config]=\"finalTableBubbleMenuConfig()\"\n [style.display]=\"editorFullyInitialized() ? 'block' : 'none'\"\n ></tiptap-table-bubble-menu>\n }\n\n <!-- Cell Menu -->\n @if (finalEditable() && finalShowCellBubbleMenu() && editor()) {\n <tiptap-cell-bubble-menu\n [editor]=\"editor()!\"\n [config]=\"finalCellBubbleMenuConfig()\"\n [style.display]=\"editorFullyInitialized() ? 'block' : 'none'\"\n ></tiptap-cell-bubble-menu>\n }\n\n <!-- Counters -->\n @if (finalEditable() && !mergedDisabled() && finalShowFooter() && (finalShowCharacterCount() || finalShowWordCount())) {\n <div class=\"character-count\" [class.limit-reached]=\"finalMaxCharacters() && characterCount() >= finalMaxCharacters()!\">\n @if (finalShowCharacterCount()) {\n {{ characterCount() }}\n {{ currentTranslations().editor.character }}{{ characterCount() > 1 ? \"s\" : \"\" }}\n @if (finalMaxCharacters()) {\n / {{ finalMaxCharacters() }}\n }\n }\n \n @if (finalShowCharacterCount() && finalShowWordCount()) {\n , \n }\n\n @if (finalShowWordCount()) {\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: visible;\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: 6px 8px;\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 /** Configuration globale de l'éditeur */\n config = input<AteEditorConfig>({});\n\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 spellcheck = input<boolean>(true);\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<ImageUploadOptions>>({});\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.config().disabled ?? this.disabled()) || this.isFormControlDisabled());\n\n // Computed for editor states\n isEditorReady = computed(() => this.editor() !== null);\n\n // ============================================\n // UNIFIED CONFIGURATION COMPUTED PROPERTIES\n // ============================================\n\n // Appearance & Fundamentals\n readonly finalSeamless = computed(() => {\n const fromConfig = this.config().mode;\n if (fromConfig !== undefined) return fromConfig === 'seamless';\n return this.seamless();\n });\n\n readonly finalEditable = computed(() => this.config().editable ?? this.editable());\n readonly finalPlaceholder = computed(() => this.config().placeholder ?? (this.placeholder() || this.currentTranslations().editor.placeholder));\n readonly finalFillContainer = computed(() => this.config().fillContainer ?? this.fillContainer());\n readonly finalShowFooter = computed(() => this.config().showFooter ?? this.showFooter());\n readonly finalShowEditToggle = computed(() => this.config().showEditToggle ?? this.showEditToggle());\n\n readonly finalHeight = computed(() => this.config().height ?? (this.height() ? `${this.height()}px` : undefined));\n readonly finalMinHeight = computed(() => this.config().minHeight ?? (this.minHeight() ? `${this.minHeight()}px` : undefined));\n readonly finalMaxHeight = computed(() => this.config().maxHeight ?? (this.maxHeight() ? `${this.maxHeight()}px` : undefined));\n\n readonly finalSpellcheck = computed(() => this.config().spellcheck ?? this.spellcheck());\n readonly finalEnableOfficePaste = computed(() => this.config().enableOfficePaste ?? this.enableOfficePaste());\n\n // Features\n readonly finalShowToolbar = computed(() => this.config().showToolbar ?? this.showToolbar());\n\n readonly finalToolbarConfig = computed(() => {\n const fromConfig = this.config().toolbar;\n const base = DEFAULT_TOOLBAR_CONFIG;\n if (fromConfig) return { ...base, ...fromConfig };\n const fromInput = this.toolbar();\n return Object.keys(fromInput).length === 0 ? base : { ...base, ...fromInput };\n });\n\n readonly finalFloatingToolbar = computed(() => this.config().floatingToolbar ?? this.floatingToolbar());\n\n readonly finalShowBubbleMenu = computed(() => this.config().showBubbleMenu ?? this.showBubbleMenu());\n\n readonly finalBubbleMenuConfig = computed(() => {\n const fromConfig = this.config().bubbleMenu;\n const base = DEFAULT_BUBBLE_MENU_CONFIG;\n if (fromConfig) return { ...base, ...fromConfig };\n return Object.keys(this.bubbleMenu()).length === 0 ? base : { ...base, ...this.bubbleMenu() };\n });\n\n readonly finalShowImageBubbleMenu = computed(() => this.config().showImageBubbleMenu ?? this.showImageBubbleMenu());\n\n readonly finalImageBubbleMenuConfig = computed(() => {\n const fromConfig = this.config().imageBubbleMenu;\n const base = DEFAULT_IMAGE_BUBBLE_MENU_CONFIG;\n if (fromConfig) return { ...base, ...fromConfig };\n return Object.keys(this.imageBubbleMenu()).length === 0 ? base : { ...base, ...this.imageBubbleMenu() };\n });\n\n readonly finalShowTableBubbleMenu = computed(() => this.config().showTableMenu ?? this.showTableBubbleMenu());\n\n readonly finalTableBubbleMenuConfig = computed(() => {\n const fromConfig = this.config().tableBubbleMenu;\n const base = DEFAULT_TABLE_MENU_CONFIG;\n if (fromConfig) return { ...base, ...fromConfig };\n return Object.keys(this.tableBubbleMenu()).length === 0 ? base : { ...base, ...this.tableBubbleMenu() };\n });\n\n readonly finalShowCellBubbleMenu = computed(() => this.config().showCellMenu ?? this.showCellBubbleMenu());\n\n readonly finalCellBubbleMenuConfig = computed(() => {\n const fromConfig = this.config().cellBubbleMenu;\n const base = DEFAULT_CELL_MENU_CONFIG;\n if (fromConfig) return { ...base, ...fromConfig };\n return Object.keys(this.cellBubbleMenu()).length === 0 ? base : { ...base, ...this.cellBubbleMenu() };\n });\n\n readonly finalEnableSlashCommands = computed(() => this.config().enableSlashCommands ?? this.enableSlashCommands());\n\n readonly finalSlashCommandsConfig = computed(() => {\n const fromConfig = this.config().slashCommands;\n const customConfig = this.customSlashCommands();\n\n if (customConfig) return customConfig;\n\n let baseConfig = this.slashCommands();\n if (fromConfig) {\n baseConfig = fromConfig;\n }\n\n return {\n commands: filterSlashCommands(baseConfig, this.i18nService, this.editorCommandsService, this.finalImageUploadConfig()),\n };\n });\n\n // Behavior\n readonly finalAutofocus = computed(() => this.config().autofocus ?? this.autofocus());\n readonly finalMaxCharacters = computed(() => this.config().maxCharacters ?? this.maxCharacters());\n readonly finalShowCharacterCount = computed(() => this.config().showCharacterCount ?? this.showCharacterCount());\n readonly finalShowWordCount = computed(() => this.config().showWordCount ?? this.showWordCount());\n readonly finalLocale = computed(() => (this.config().locale as SupportedLocale) ?? this.locale());\n\n // Image Upload\n readonly finalImageUploadConfig = computed(() => {\n const fromConfig = this.config().imageUpload;\n const fromInput = this.imageUpload();\n\n const merged = {\n maxSize: 5, // Default 5MB\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 ...fromInput,\n ...fromConfig,\n };\n\n return {\n ...merged,\n maxSize: merged.maxSize * 1024 * 1024 // Convert MB to bytes for internal service\n };\n });\n\n readonly finalImageUploadHandler = computed(() => this.config().imageUpload?.handler ?? this.imageUploadHandler());\n\n // Computed for current translations (allows per-instance override via config or input)\n readonly currentTranslations = computed(() => {\n const localeOverride = this.finalLocale();\n if (localeOverride) {\n const allTranslations = this.i18nService.allTranslations();\n return allTranslations[localeOverride] || this.i18nService.translations();\n }\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.finalMinHeight();\n const height = this.finalHeight();\n const maxHeight = this.finalMaxHeight();\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 ?? \"auto\");\n element.style.setProperty(\n \"--editor-height\",\n height ?? \"auto\"\n );\n element.style.setProperty(\n \"--editor-max-height\",\n maxHeight ?? \"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.finalEditable() && !this.mergedDisabled();\n // An editor is \"readonly\" if it's explicitly non-editable and not disabled\n const isReadOnly = !this.finalEditable() && !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.finalImageUploadHandler();\n this.editorCommandsService.uploadHandler = (handler as any) || null;\n });\n\n // Effect to update character count limit dynamically\n effect(() => {\n const editor = this.editor();\n const limit = this.finalMaxCharacters();\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 }\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: this.finalPlaceholder(),\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.finalEnableOfficePaste()) {\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.finalShowCharacterCount() || this.finalShowWordCount()) {\n extensions.push(\n CharacterCount.configure({\n limit: this.finalMaxCharacters(),\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: extensions,\n content: this.content(),\n editable: this.finalEditable() && !this.mergedDisabled(),\n autofocus: this.finalAutofocus(),\n editorProps: {\n attributes: {\n spellcheck: this.finalSpellcheck().toString(),\n },\n },\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.finalEditable();\n this.editableChange.emit(newEditable);\n }\n\n private updateCharacterCount(editor: Editor) {\n if ((this.finalShowCharacterCount() || this.finalShowWordCount()) && 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.finalImageUploadConfig();\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.finalEditable()) 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/image.model\";\nexport * from \"./lib/models/bubble-menu.model\";\nexport * from \"./lib/models/editor-config.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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"}
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, unknown>;\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 [\"img\", mergeAttributes(this.options.HTMLAttributes, HTMLAttributes)];\n },\n\n addCommands() {\n return {\n setResizableImage:\n options =>\n ({ commands }) => {\n return commands.insertContent(\n {\n type: this.name,\n attrs: options,\n },\n {\n updateSelection: true,\n }\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 = parseInt(img.getAttribute(\"width\") || \"0\") || node.attrs[\"width\"] || img.naturalWidth;\n startHeight = parseInt(img.getAttribute(\"height\") || \"0\") || node.attrs[\"height\"] || 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\"]) img.width = updatedNode.attrs[\"width\"];\n if (updatedNode.attrs[\"height\"]) 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(uploadPosition, uploadElement, {\n side: 1,\n key: \"upload-progress\",\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 (isUploading && state.isUploading && state.uploadPosition !== null) {\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(\".upload-progress-widget\");\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, unknown>;\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 */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\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 return [\n new Plugin({\n key: new PluginKey(\"tiptapState\"),\n view: () => ({\n update: _view => {\n const { editor } = this;\n if (!editor) return;\n\n const snapshot = createFreshSnapshot();\n const calcs = this.options.calculators;\n\n for (const calculator of calcs) {\n try {\n const partial = calculator(editor);\n fastMerge(snapshot, partial);\n } catch (e) {\n console.error(\"TiptapStateExtension: Calculator error\", e);\n }\n }\n\n if (this.options.onUpdate) {\n this.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)=\"buttonClick.emit($event)\"\n type=\"button\">\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 }\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 buttonClick = 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'\"></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: [\"table\", \"tableau\", \"grid\", \"grille\", \"data\", \"données\", \"rows\", \"colonnes\"],\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(() => this._translations()[this._currentLocale()]);\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(locale: string, translations: TiptapTranslations | Partial<TiptapTranslations>): 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 { isObservable, firstValueFrom } from \"rxjs\";\nimport { TiptapI18nService } from \"./i18n.service\";\nimport {\n ResizeOptions,\n ImageUploadOptions,\n ImageUploadHandler,\n ImageUploadResult,\n ImageData,\n} from \"../models/image.model\";\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().focus().setResizableImage(imageData).setNodeSelection(from).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.chain().focus().updateAttributes(\"resizableImage\", attributes).setNodeSelection(pos).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 (options.maintainAspectRatio !== false && currentAttrs[\"width\"] && currentAttrs[\"height\"]) {\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(\n file: File,\n options?: { maxSize?: number; allowedTypes?: string[] }\n ): { valid: boolean; error?: string } {\n const maxSize = options?.maxSize || 10 * 1024 * 1024;\n const allowedTypes = options?.allowedTypes || [];\n\n if (allowedTypes.length > 0 && !allowedTypes.includes(file.type)) {\n return { valid: false, error: this.t().invalidFileType };\n }\n\n if (file.size > maxSize) {\n return {\n valid: false,\n error: `${this.t().imageTooLarge} (max ${Math.round(maxSize / 1024 / 1024)}MB)`,\n };\n }\n return { valid: true };\n }\n\n /** Compress and process image on client side */\n async compressImage(file: File, quality = 0.8, maxWidth = 1920, maxHeight = 1200): 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?: ImageUploadOptions\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 maxSize: options?.maxSize,\n allowedTypes: options?.allowedTypes,\n });\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?: ImageUploadOptions): 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?: ImageUploadOptions) => Promise<void>,\n options?: ImageUploadOptions\n ): Promise<void> {\n return new Promise((resolve, reject) => {\n const input = document.createElement(\"input\");\n input.type = \"file\";\n\n // Use allowedTypes if provided, otherwise default to image/*\n if (options?.allowedTypes && options.allowedTypes.length > 0) {\n input.accept = options.allowedTypes.join(\",\");\n } else {\n input.accept = \"image/*\";\n }\n\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) {\n reject(error);\n }\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?: ImageUploadOptions): 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?: ImageUploadOptions): 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?: ImageUploadOptions): 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().focus().updateAttributes(\"resizableImage\", imageData).setNodeSelection(pos).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.trim().match(/^rgba?\\(\\s*([\\d.]+)[,\\s]+([\\d.]+)[,\\s]+([\\d.]+)(?:[,\\s/]+([\\d.]+))?\\s*\\)$/i);\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 // 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 * Set interaction state (prevents premature closing when blurring editor)\n */\n setInteracting(value: boolean): void {\n this.isInteracting.set(value);\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 // Color Application Commands\n // ============================================\n\n /**\n * Apply text color to selection.\n */\n applyColor(editor: Editor, color: string, addToHistory = true, focus = 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 // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (chain as any).setColor(color);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\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 = 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 // eslint-disable-next-line @typescript-eslint/no-explicit-any\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 = true, focus = 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 // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (chain as any).setHighlight({ color });\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\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 = 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 // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (chain as any).unsetHighlight();\n chain.run();\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","import { Injectable, signal } from \"@angular/core\";\nimport type { Editor } from \"@tiptap/core\";\n\n@Injectable()\nexport class LinkService {\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 // 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 * 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 } from \"./image.service\";\nimport { ColorPickerService } from \"./color-picker.service\";\nimport { LinkService } from \"./link.service\";\nimport { EditorStateSnapshot, INITIAL_EDITOR_STATE } from \"../models/editor-state.model\";\nimport { ImageUploadHandler, ImageUploadOptions } from \"../models/image.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 )\n return false;\n\n // Helper for object comparison\n const isRecordEqual = (objA: Record<string, unknown>, objB: Record<string, unknown>) => {\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) {\n this.imageService.uploadHandler = handler;\n }\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: unknown[]): void {\n if (!editor) return;\n\n switch (command) {\n case \"toggleBold\":\n this.toggleBold(editor);\n break;\n case \"toggleItalic\":\n this.toggleItalic(editor);\n break;\n case \"toggleStrike\":\n this.toggleStrike(editor);\n break;\n case \"toggleCode\":\n this.toggleCode(editor);\n break;\n case \"toggleCodeBlock\":\n this.toggleCodeBlock(editor);\n break;\n case \"toggleUnderline\":\n this.toggleUnderline(editor);\n break;\n case \"toggleSuperscript\":\n this.toggleSuperscript(editor);\n break;\n case \"toggleSubscript\":\n this.toggleSubscript(editor);\n break;\n case \"toggleHeading\":\n this.toggleHeading(editor, args[0] as 1 | 2 | 3);\n break;\n case \"toggleBulletList\":\n this.toggleBulletList(editor);\n break;\n case \"toggleOrderedList\":\n this.toggleOrderedList(editor);\n break;\n case \"toggleBlockquote\":\n this.toggleBlockquote(editor);\n break;\n case \"setTextAlign\":\n this.setTextAlign(editor, args[0] as \"left\" | \"center\" | \"right\" | \"justify\");\n break;\n case \"toggleLink\":\n this.linkSvc.toggle(editor, args[0] as Event | undefined);\n break;\n case \"unsetLink\":\n this.linkSvc.unsetLink(editor);\n break;\n case \"toggleColorPicker\":\n this.colorPickerSvc.toggle(editor, args[0] as \"text\" | \"highlight\", args[1] as Event);\n break;\n case \"insertHorizontalRule\":\n this.insertHorizontalRule(editor);\n break;\n case \"insertImage\":\n this.insertImage(editor, args[0] as ImageUploadOptions);\n break;\n case \"uploadImage\":\n this.uploadImage(editor, args[0] as File, args[1] as ImageUploadOptions | undefined);\n break;\n case \"toggleHighlight\":\n this.toggleHighlight(editor, args[0] as string);\n break;\n case \"undo\":\n this.undo(editor);\n break;\n case \"redo\":\n this.redo(editor);\n break;\n case \"insertTable\":\n this.insertTable(editor, args[0] as number | undefined, args[1] as number | undefined);\n break;\n case \"addColumnBefore\":\n this.addColumnBefore(editor);\n break;\n case \"addColumnAfter\":\n this.addColumnAfter(editor);\n break;\n case \"deleteColumn\":\n this.deleteColumn(editor);\n break;\n case \"addRowBefore\":\n this.addRowBefore(editor);\n break;\n case \"addRowAfter\":\n this.addRowAfter(editor);\n break;\n case \"deleteRow\":\n this.deleteRow(editor);\n break;\n case \"deleteTable\":\n this.deleteTable(editor);\n break;\n case \"mergeCells\":\n this.mergeCells(editor);\n break;\n case \"splitCell\":\n this.splitCell(editor);\n break;\n case \"toggleHeaderColumn\":\n this.toggleHeaderColumn(editor);\n break;\n case \"toggleHeaderRow\":\n this.toggleHeaderRow(editor);\n break;\n case \"applyColor\":\n this.colorPickerSvc.applyColor(\n editor,\n args[0] as string,\n args[1] as boolean | undefined,\n args[2] as boolean | undefined\n );\n break;\n case \"applyHighlight\":\n this.colorPickerSvc.applyHighlight(\n editor,\n args[0] as string,\n args[1] as boolean | undefined,\n args[2] as boolean | undefined\n );\n break;\n case \"unsetColor\":\n this.colorPickerSvc.unsetColor(editor, args[0] as boolean);\n break;\n case \"unsetHighlight\":\n this.colorPickerSvc.unsetHighlight(editor, args[0] as boolean);\n break;\n\n case \"clearContent\":\n this.clearContent(editor);\n break;\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 // --- 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 = 3, cols = 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(editor: Editor, options?: ImageUploadOptions): 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(editor: Editor, file: File, options?: ImageUploadOptions): 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 { Component, computed, inject, input, ChangeDetectionStrategy } 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 (buttonClick)=\"onToggle($event)\" />\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 <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 { 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: [TiptapButtonComponent, TiptapSeparatorComponent, TiptapColorPickerComponent],\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 (buttonClick)=\"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 (buttonClick)=\"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 (buttonClick)=\"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 (buttonClick)=\"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 (buttonClick)=\"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 (buttonClick)=\"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 (buttonClick)=\"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 (buttonClick)=\"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 (buttonClick)=\"onCommand('toggleHighlight')\" />\n }\n @if (config().highlightPicker) {\n <tiptap-color-picker mode=\"highlight\" [editor]=\"editor()\" [disabled]=\"!state().can.setHighlight\" />\n }\n @if (config().textColor) {\n <tiptap-color-picker mode=\"text\" [editor]=\"editor()\" [disabled]=\"!state().can.setColor\" />\n }\n\n @if (config().separator && (config().heading1 || config().heading2 || config().heading3)) {\n <tiptap-separator />\n }\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 (buttonClick)=\"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 (buttonClick)=\"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 (buttonClick)=\"onCommand('toggleHeading', 3)\" />\n }\n @if (config().separator && (config().bulletList || config().orderedList || config().blockquote)) {\n <tiptap-separator />\n }\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 (buttonClick)=\"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 (buttonClick)=\"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 (buttonClick)=\"onCommand('toggleBlockquote')\" />\n }\n @if (\n config().separator &&\n (config().alignLeft || config().alignCenter || config().alignRight || config().alignJustify)\n ) {\n <tiptap-separator />\n }\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 (buttonClick)=\"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 (buttonClick)=\"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 (buttonClick)=\"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 (buttonClick)=\"onCommand('setTextAlign', 'justify')\" />\n }\n @if (config().separator && (config().link || config().horizontalRule)) {\n <tiptap-separator />\n }\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 (buttonClick)=\"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 (buttonClick)=\"onCommand('insertHorizontalRule')\" />\n }\n @if (config().table) {\n <tiptap-button\n icon=\"table_view\"\n [title]=\"t().table\"\n [disabled]=\"!state().can.insertTable\"\n (buttonClick)=\"onCommand('insertTable')\" />\n }\n @if (config().separator && config().image) {\n <tiptap-separator />\n }\n @if (config().image) {\n <tiptap-button\n icon=\"image\"\n [title]=\"t().image\"\n [disabled]=\"!state().can.insertImage\"\n (buttonClick)=\"onCommand('insertImage', imageUpload())\" />\n }\n @if (config().separator && (config().undo || config().redo)) {\n <tiptap-separator />\n }\n @if (config().undo) {\n <tiptap-button\n icon=\"undo\"\n [title]=\"t().undo\"\n [disabled]=\"!state().can.undo\"\n (buttonClick)=\"onCommand('undo')\" />\n }\n @if (config().redo) {\n <tiptap-button\n icon=\"redo\"\n [title]=\"t().redo\"\n [disabled]=\"!state().can.redo\"\n (buttonClick)=\"onCommand('redo')\" />\n }\n @if (config().separator && config().clear) {\n <tiptap-separator />\n }\n @if (config().clear) {\n <tiptap-button\n icon=\"delete\"\n [title]=\"t().clear\"\n [disabled]=\"!state().isEditable\"\n (buttonClick)=\"onCommand('clearContent')\" />\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<Record<string, unknown>>({});\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: unknown[]) {\n const editor = this.editor();\n if (!editor) return;\n this.editorCommands.execute(editor, command, ...args);\n }\n}\n","import { Directive, input, ViewChild, ElementRef, OnInit, OnDestroy, inject, effect } 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: number | null = 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 * 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 = window.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 * 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, ...args: unknown[]): void;\n\n /**\n * Optional hook called when Tippy is about to be shown.\n */\n protected onTippyShow(_instance: TippyInstance) {\n /* empty */\n }\n\n /**\n * Optional hook called when Tippy is about to be hidden.\n */\n protected onTippyHide(_instance: TippyInstance) {\n /* empty */\n }\n}\n","import { Component, input, ChangeDetectionStrategy, computed, OnInit, OnDestroy } 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: [TiptapButtonComponent, TiptapColorPickerComponent],\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 (buttonClick)=\"onCommand('toggleBold', $event)\"></tiptap-button>\n }\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 (buttonClick)=\"onCommand('toggleItalic', $event)\"></tiptap-button>\n }\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 (buttonClick)=\"onCommand('toggleUnderline', $event)\"></tiptap-button>\n }\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 (buttonClick)=\"onCommand('toggleStrike', $event)\"></tiptap-button>\n }\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 (buttonClick)=\"onCommand('toggleCode', $event)\"></tiptap-button>\n }\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 (buttonClick)=\"onCommand('toggleSuperscript', $event)\"></tiptap-button>\n }\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 (buttonClick)=\"onCommand('toggleSubscript', $event)\"></tiptap-button>\n }\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 (buttonClick)=\"onCommand('toggleHighlight', $event)\"></tiptap-button>\n }\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 mode=\"text\" [editor]=\"editor()\" [disabled]=\"!state().can.setColor\" [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 (buttonClick)=\"onCommand('toggleLink', $event)\"></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 selection.type === \"text\" && !selection.empty && !nodes.isImage && !nodes.isTableNodeSelected;\n }\n\n override getSelectionRect(): DOMRect {\n return this.getRectForSelection(this.editor());\n }\n\n protected override executeCommand(editor: Editor, command: string, ...args: unknown[]): 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 { Component, input, ChangeDetectionStrategy, computed, inject } 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\";\nimport { ImageUploadOptions } from \"./models/image.model\";\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 (buttonClick)=\"onCommand('changeImage', $event)\"></tiptap-button>\n }\n @if (imageBubbleMenuConfig().separator && hasResizeButtons()) {\n <tiptap-separator />\n }\n @if (imageBubbleMenuConfig().resizeSmall) {\n <tiptap-button\n icon=\"crop_square\"\n iconSize=\"small\"\n [title]=\"t().resizeSmall\"\n (buttonClick)=\"onCommand('resizeSmall', $event)\"></tiptap-button>\n }\n @if (imageBubbleMenuConfig().resizeMedium) {\n <tiptap-button\n icon=\"crop_square\"\n iconSize=\"medium\"\n [title]=\"t().resizeMedium\"\n (buttonClick)=\"onCommand('resizeMedium', $event)\"></tiptap-button>\n }\n @if (imageBubbleMenuConfig().resizeLarge) {\n <tiptap-button\n icon=\"crop_square\"\n iconSize=\"large\"\n [title]=\"t().resizeLarge\"\n (buttonClick)=\"onCommand('resizeLarge', $event)\"></tiptap-button>\n }\n @if (imageBubbleMenuConfig().resizeOriginal) {\n <tiptap-button\n icon=\"photo_size_select_actual\"\n [title]=\"t().resizeOriginal\"\n (buttonClick)=\"onCommand('resizeOriginal', $event)\"></tiptap-button>\n }\n @if (imageBubbleMenuConfig().separator && imageBubbleMenuConfig().deleteImage) {\n <tiptap-separator />\n }\n @if (imageBubbleMenuConfig().deleteImage) {\n <tiptap-button\n icon=\"delete\"\n [title]=\"t().deleteImage\"\n variant=\"danger\"\n (buttonClick)=\"onCommand('deleteImage', $event)\"></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 imageUpload = input<ImageUploadOptions>({});\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 c.resizeSmall || c.resizeMedium || c.resizeLarge || c.resizeOriginal;\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, ..._args: unknown[]): 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, this.imageUpload());\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 { Component, input, ChangeDetectionStrategy } 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\nimport { TableBubbleMenuConfig } from \"./models/bubble-menu.model\";\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 (buttonClick)=\"onCommand('addRowBefore', $event)\"></tiptap-button>\n }\n @if (config().addRowAfter !== false) {\n <tiptap-button\n icon=\"add_row_below\"\n [title]=\"t().addRowAfter\"\n [disabled]=\"!state().can.addRowAfter\"\n (buttonClick)=\"onCommand('addRowAfter', $event)\"></tiptap-button>\n }\n @if (config().deleteRow !== false) {\n <tiptap-button\n icon=\"delete\"\n [title]=\"t().deleteRow\"\n variant=\"danger\"\n [disabled]=\"!state().can.deleteRow\"\n (buttonClick)=\"onCommand('deleteRow', $event)\"></tiptap-button>\n }\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 (buttonClick)=\"onCommand('addColumnBefore', $event)\"></tiptap-button>\n }\n @if (config().addColumnAfter !== false) {\n <tiptap-button\n icon=\"add_column_right\"\n [title]=\"t().addColumnAfter\"\n [disabled]=\"!state().can.addColumnAfter\"\n (buttonClick)=\"onCommand('addColumnAfter', $event)\"></tiptap-button>\n }\n @if (config().deleteColumn !== false) {\n <tiptap-button\n icon=\"delete\"\n [title]=\"t().deleteColumn\"\n variant=\"danger\"\n [disabled]=\"!state().can.deleteColumn\"\n (buttonClick)=\"onCommand('deleteColumn', $event)\"></tiptap-button>\n }\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 (buttonClick)=\"onCommand('toggleHeaderRow', $event)\"></tiptap-button>\n }\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 (buttonClick)=\"onCommand('toggleHeaderColumn', $event)\"></tiptap-button>\n }\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 (buttonClick)=\"onCommand('deleteTable', $event)\"></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<TableBubbleMenuConfig>({\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 ? dom.closest(\"table\") : 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(\n \"table.selected, table:has(.selected), table:has(.selected-cell), table:has(.selected-node)\"\n );\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, ...args: unknown[]): void {\n this.editorCommands.execute(editor, command, ...args);\n }\n}\n","import { Component, input, ChangeDetectionStrategy } 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 (buttonClick)=\"onCommand('mergeCells', $event)\"></tiptap-button>\n }\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 (buttonClick)=\"onCommand('splitCell', $event)\"></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 selection.type === \"cell\" && nodes.isTableCell && 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 // CellSelection\n const selection = ed.state.selection as unknown as {\n $anchorCell?: { pos: number };\n $headCell?: { pos: number };\n };\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,\n bottom = -Infinity,\n left = Infinity,\n 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, ...args: unknown[]): void {\n this.editorCommands.execute(editor, command, ...args);\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 (keydown)=\"$event.stopPropagation()\"\n (keydown.escape)=\"onCancel($event)\"\n tabindex=\"-1\"\n role=\"dialog\">\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 </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 (buttonClick)=\"onApply($event)\"></tiptap-button>\n <tiptap-button\n icon=\"open_in_new\"\n [title]=\"t().openLink\"\n [disabled]=\"!currentUrl()\"\n (buttonClick)=\"onOpenLink($event)\"></tiptap-button>\n <tiptap-separator />\n <tiptap-button\n icon=\"link_off\"\n [title]=\"t().removeLink\"\n variant=\"danger\"\n [disabled]=\"!currentUrl()\"\n (buttonClick)=\"onRemove($event)\"></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 ],\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: number | null = 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 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 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 /* ignore */\n }\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\",\n \"#666666\",\n \"#CCCCCC\",\n \"#FFFFFF\",\n \"#F44336\",\n \"#FF9800\",\n \"#FFEB3B\",\n \"#4CAF50\",\n \"#00BCD4\",\n \"#2196F3\",\n \"#9C27B0\",\n \"#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 (keydown)=\"$event.stopPropagation()\"\n (keydown.escape)=\"onApply($event)\"\n tabindex=\"-1\"\n role=\"dialog\">\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 (buttonClick)=\"applyColor(color, true, $event)\"></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 </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 (buttonClick)=\"triggerNativePicker($event)\"></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 </div>\n\n <tiptap-button\n icon=\"check\"\n [title]=\"common().apply\"\n color=\"var(--ate-primary)\"\n (buttonClick)=\"onApply($event)\"></tiptap-button>\n\n <tiptap-separator />\n\n <tiptap-button\n icon=\"format_color_reset\"\n [title]=\"t().clear\"\n variant=\"danger\"\n (buttonClick)=\"onClearColor($event)\"></tiptap-button>\n </div>\n </div>\n </div>\n `,\n styles: [\n `\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 ],\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: number | null = null;\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 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 // 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 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 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) {\n /* ignore */\n }\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 = 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 // Determine if we should focus back to the editor.\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 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?: {\n quality?: number;\n maxWidth?: number;\n maxHeight?: number;\n allowedTypes?: string[];\n }\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) =>\n commands.execute(editor, \"insertImage\", {\n quality: imageOptions?.quality,\n maxWidth: imageOptions?.maxWidth,\n maxHeight: imageOptions?.maxHeight,\n allowedTypes: imageOptions?.allowedTypes,\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?: {\n quality?: number;\n maxWidth?: number;\n maxHeight?: number;\n allowedTypes?: string[];\n }\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 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 { createDefaultSlashCommands } 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 <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 {\n opacity: 0;\n transform: translateY(4px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\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 => keyword.toLowerCase().includes(query))\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 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(coords.left, coords.top, 0, coords.bottom - coords.top);\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(Math.max(0, from - 20), from, \"\\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 = (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 = this.selectedIndex() === 0 ? this.filteredCommands().length - 1 : 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\n private scrollToSelected() {\n // Scroll to the selected element\n if (this.menuRef?.nativeElement) {\n const selectedItem = this.menuRef.nativeElement.querySelector(\".slash-command-item.selected\") 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 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 = (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 ? this.filteredCommands().length - 1 : this.selectedIndex() - 1;\n this.selectedIndex.set(prevIndex);\n this.scrollToSelected();\n return true;\n }\n case \"Enter\": {\n event.preventDefault();\n const selectedCommand = 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\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 } 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 (buttonClick)=\"editToggle.emit($event)\"\n size=\"medium\"\n iconSize=\"small\"\n backgroundColor=\"var(--ate-primary-lighter)\" />\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 editToggle = 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: unknown): void {\n /* empty */\n }\n registerOnChange(_fn: unknown): void {\n /* empty */\n }\n registerOnTouched(_fn: unknown): void {\n /* empty */\n }\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\" ? window.getComputedStyle(targetEl) : 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:\n 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:\n 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 },\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> } = {\n marks: {},\n nodes: {},\n };\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\",\n \"italic\",\n \"underline\",\n \"strike\",\n \"code\",\n \"link\",\n \"highlight\",\n \"superscript\",\n \"subscript\",\n \"table\",\n \"image\",\n \"resizableImage\",\n \"heading\",\n \"bulletList\",\n \"orderedList\",\n \"blockquote\",\n \"textAlign\",\n \"textStyle\",\n \"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, JSONContent } 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 { TiptapSlashCommandsComponent, CustomSlashCommands } from \"./tiptap-slash-commands.component\";\nimport { TiptapEditToggleComponent } from \"./tiptap-edit-toggle.component\";\nimport { ImageService } 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 { StateCalculator } from \"./models/editor-state.model\";\nimport { NgControl } from \"@angular/forms\";\nimport { filterSlashCommands, SlashCommandsConfig } 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 { AteEditorConfig } from \"./models/editor-config.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, Observable, of, tap } from \"rxjs\";\nimport { ImageUploadHandler, ImageUploadOptions } from \"./models/image.model\";\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]\": \"finalFillContainer()\",\n \"[class.floating-toolbar]\": \"finalFloatingToolbar()\",\n \"[class.is-readonly]\": \"!finalEditable() && !mergedDisabled()\",\n \"[class.is-disabled]\": \"mergedDisabled()\",\n \"[style.--ate-border-width]\": \"finalSeamless() || mergedDisabled() ? '0' : null\",\n \"[style.--ate-background]\":\n \"finalSeamless() ? 'transparent' : (mergedDisabled() ? 'var(--ate-surface-tertiary)' : null)\",\n \"[style.--ate-toolbar-border-color]\": \"finalSeamless() ? 'transparent' : null\",\n \"[style.--ate-counter-background]\": \"finalSeamless() ? 'transparent' : null\",\n \"[style.--ate-counter-border-color]\": \"finalSeamless() ? 'transparent' : null\",\n \"[class.dark]\": \"config().theme === 'dark'\",\n \"[attr.data-theme]\": \"config().theme\",\n },\n imports: [\n TiptapToolbarComponent,\n TiptapBubbleMenuComponent,\n TiptapImageBubbleMenuComponent,\n TiptapTableBubbleMenuComponent,\n TiptapCellBubbleMenuComponent,\n TiptapSlashCommandsComponent,\n TiptapLinkBubbleMenuComponent,\n TiptapColorBubbleMenuComponent,\n TiptapEditToggleComponent,\n ],\n providers: [EditorCommandsService, ImageService, ColorPickerService, LinkService],\n template: `\n <div class=\"tiptap-editor\">\n <!-- Toolbar -->\n @if (finalEditable() && !mergedDisabled() && finalShowToolbar() && editor()) {\n <tiptap-toolbar\n [editor]=\"editor()!\"\n [config]=\"finalToolbarConfig()\"\n [imageUpload]=\"finalImageUploadConfig()\"\n [floating]=\"finalFloatingToolbar()\"\n (mouseenter)=\"hideBubbleMenus()\"\n (mouseleave)=\"showBubbleMenus()\" />\n }\n\n @if (finalShowEditToggle() && !mergedDisabled()) {\n <tiptap-edit-toggle\n [editable]=\"finalEditable()\"\n [translations]=\"currentTranslations()\"\n (editToggle)=\"toggleEditMode($event)\" />\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 (keydown.enter)=\"onEditorClick($event)\"\n (keydown.space)=\"onEditorClick($event)\"\n tabindex=\"0\"\n role=\"application\"\n [attr.aria-label]=\"currentTranslations().editor.placeholder\"></div>\n\n <!-- Text Bubble Menu -->\n @if (finalEditable() && finalShowBubbleMenu() && editor()) {\n <tiptap-bubble-menu\n [editor]=\"editor()!\"\n [config]=\"finalBubbleMenuConfig()\"\n [style.display]=\"editorFullyInitialized() ? 'block' : 'none'\"></tiptap-bubble-menu>\n }\n\n <!-- Image Bubble Menu -->\n @if (finalEditable() && finalShowImageBubbleMenu() && editor()) {\n <tiptap-image-bubble-menu\n [editor]=\"editor()!\"\n [config]=\"finalImageBubbleMenuConfig()\"\n [imageUpload]=\"finalImageUploadConfig()\"\n [style.display]=\"editorFullyInitialized() ? 'block' : 'none'\"></tiptap-image-bubble-menu>\n }\n\n <!-- Link Bubble Menu -->\n @if (finalEditable() && editor()) {\n <tiptap-link-bubble-menu\n [editor]=\"editor()!\"\n [style.display]=\"editorFullyInitialized() ? 'block' : 'none'\"></tiptap-link-bubble-menu>\n }\n\n <!-- Color Bubble Menu -->\n @if (finalEditable() && editor()) {\n <tiptap-color-bubble-menu\n [editor]=\"editor()!\"\n [style.display]=\"editorFullyInitialized() ? 'block' : 'none'\"></tiptap-color-bubble-menu>\n }\n\n <!-- Slash Commands -->\n @if (finalEditable() && finalEnableSlashCommands() && editor()) {\n <tiptap-slash-commands\n [editor]=\"editor()!\"\n [config]=\"finalSlashCommandsConfig()\"\n [style.display]=\"editorFullyInitialized() ? 'block' : 'none'\"></tiptap-slash-commands>\n }\n\n <!-- Table Menu -->\n @if (finalEditable() && finalShowTableBubbleMenu() && editor()) {\n <tiptap-table-bubble-menu\n [editor]=\"editor()!\"\n [config]=\"finalTableBubbleMenuConfig()\"\n [style.display]=\"editorFullyInitialized() ? 'block' : 'none'\"></tiptap-table-bubble-menu>\n }\n\n <!-- Cell Menu -->\n @if (finalEditable() && finalShowCellBubbleMenu() && editor()) {\n <tiptap-cell-bubble-menu\n [editor]=\"editor()!\"\n [config]=\"finalCellBubbleMenuConfig()\"\n [style.display]=\"editorFullyInitialized() ? 'block' : 'none'\"></tiptap-cell-bubble-menu>\n }\n\n <!-- Counters -->\n @if (\n finalEditable() && !mergedDisabled() && finalShowFooter() && (finalShowCharacterCount() || finalShowWordCount())\n ) {\n <div\n class=\"character-count\"\n [class.limit-reached]=\"finalMaxCharacters() && characterCount() >= finalMaxCharacters()!\">\n @if (finalShowCharacterCount()) {\n {{ characterCount() }}\n {{ currentTranslations().editor.character }}{{ characterCount() > 1 ? \"s\" : \"\" }}\n @if (finalMaxCharacters()) {\n / {{ finalMaxCharacters() }}\n }\n }\n\n @if (finalShowCharacterCount() && finalShowWordCount()) {\n ,\n }\n\n @if (finalShowWordCount()) {\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-code-color);\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: visible;\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: 6px 8px;\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 ::ng-deep .ProseMirror[contenteditable=\"false\"] 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 /** Configuration globale de l'éditeur */\n config = input<AteEditorConfig>({});\n\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 spellcheck = input<boolean>(true);\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>>(DEFAULT_IMAGE_BUBBLE_MENU_CONFIG);\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<ImageUploadOptions>>({});\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: unknown }>();\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 // 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.config().disabled ?? this.disabled()) || this.isFormControlDisabled());\n\n // Computed for editor states\n isEditorReady = computed(() => this.editor() !== null);\n\n // ============================================\n // UNIFIED CONFIGURATION COMPUTED PROPERTIES\n // ============================================\n\n // Appearance & Fundamentals\n readonly finalSeamless = computed(() => {\n const fromConfig = this.config().mode;\n if (fromConfig !== undefined) return fromConfig === \"seamless\";\n return this.seamless();\n });\n\n readonly finalEditable = computed(() => this.config().editable ?? this.editable());\n readonly finalPlaceholder = computed(\n () => this.config().placeholder ?? (this.placeholder() || this.currentTranslations().editor.placeholder)\n );\n readonly finalFillContainer = computed(() => this.config().fillContainer ?? this.fillContainer());\n readonly finalShowFooter = computed(() => this.config().showFooter ?? this.showFooter());\n readonly finalShowEditToggle = computed(() => this.config().showEditToggle ?? this.showEditToggle());\n\n readonly finalHeight = computed(() => this.config().height ?? (this.height() ? `${this.height()}px` : undefined));\n readonly finalMinHeight = computed(\n () => this.config().minHeight ?? (this.minHeight() ? `${this.minHeight()}px` : undefined)\n );\n readonly finalMaxHeight = computed(\n () => this.config().maxHeight ?? (this.maxHeight() ? `${this.maxHeight()}px` : undefined)\n );\n\n readonly finalSpellcheck = computed(() => this.config().spellcheck ?? this.spellcheck());\n readonly finalEnableOfficePaste = computed(() => this.config().enableOfficePaste ?? this.enableOfficePaste());\n\n // Features\n readonly finalShowToolbar = computed(() => this.config().showToolbar ?? this.showToolbar());\n\n readonly finalToolbarConfig = computed(() => {\n const fromConfig = this.config().toolbar;\n const base = DEFAULT_TOOLBAR_CONFIG;\n if (fromConfig) return { ...base, ...fromConfig };\n const fromInput = this.toolbar();\n return Object.keys(fromInput).length === 0 ? base : { ...base, ...fromInput };\n });\n\n readonly finalFloatingToolbar = computed(() => this.config().floatingToolbar ?? this.floatingToolbar());\n\n readonly finalShowBubbleMenu = computed(() => this.config().showBubbleMenu ?? this.showBubbleMenu());\n\n readonly finalBubbleMenuConfig = computed(() => {\n const fromConfig = this.config().bubbleMenu;\n const base = DEFAULT_BUBBLE_MENU_CONFIG;\n if (fromConfig) return { ...base, ...fromConfig };\n return Object.keys(this.bubbleMenu()).length === 0 ? base : { ...base, ...this.bubbleMenu() };\n });\n\n readonly finalShowImageBubbleMenu = computed(() => this.config().showImageBubbleMenu ?? this.showImageBubbleMenu());\n\n readonly finalImageBubbleMenuConfig = computed(() => {\n const fromConfig = this.config().imageBubbleMenu;\n const base = DEFAULT_IMAGE_BUBBLE_MENU_CONFIG;\n if (fromConfig) return { ...base, ...fromConfig };\n return Object.keys(this.imageBubbleMenu()).length === 0 ? base : { ...base, ...this.imageBubbleMenu() };\n });\n\n readonly finalShowTableBubbleMenu = computed(() => this.config().showTableMenu ?? this.showTableBubbleMenu());\n\n readonly finalTableBubbleMenuConfig = computed(() => {\n const fromConfig = this.config().tableBubbleMenu;\n const base = DEFAULT_TABLE_MENU_CONFIG;\n if (fromConfig) return { ...base, ...fromConfig };\n return Object.keys(this.tableBubbleMenu()).length === 0 ? base : { ...base, ...this.tableBubbleMenu() };\n });\n\n readonly finalShowCellBubbleMenu = computed(() => this.config().showCellMenu ?? this.showCellBubbleMenu());\n\n readonly finalCellBubbleMenuConfig = computed(() => {\n const fromConfig = this.config().cellBubbleMenu;\n const base = DEFAULT_CELL_MENU_CONFIG;\n if (fromConfig) return { ...base, ...fromConfig };\n return Object.keys(this.cellBubbleMenu()).length === 0 ? base : { ...base, ...this.cellBubbleMenu() };\n });\n\n readonly finalEnableSlashCommands = computed(() => this.config().enableSlashCommands ?? this.enableSlashCommands());\n\n readonly finalSlashCommandsConfig = computed(() => {\n const fromConfig = this.config().slashCommands;\n const customConfig = this.customSlashCommands();\n\n if (customConfig) return customConfig;\n\n let baseConfig = this.slashCommands();\n if (fromConfig) {\n baseConfig = fromConfig;\n }\n\n return {\n commands: filterSlashCommands(\n baseConfig,\n this.i18nService,\n this.editorCommandsService,\n this.finalImageUploadConfig()\n ),\n };\n });\n\n // Behavior\n readonly finalAutofocus = computed(() => this.config().autofocus ?? this.autofocus());\n readonly finalMaxCharacters = computed(() => this.config().maxCharacters ?? this.maxCharacters());\n readonly finalShowCharacterCount = computed(() => this.config().showCharacterCount ?? this.showCharacterCount());\n readonly finalShowWordCount = computed(() => this.config().showWordCount ?? this.showWordCount());\n readonly finalLocale = computed(() => (this.config().locale as SupportedLocale) ?? this.locale());\n\n // Image Upload\n readonly finalImageUploadConfig = computed(() => {\n const fromConfig = this.config().imageUpload;\n const fromInput = this.imageUpload();\n\n const merged = {\n maxSize: 5, // Default 5MB\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 ...fromInput,\n ...fromConfig,\n };\n\n return {\n ...merged,\n maxSize: merged.maxSize * 1024 * 1024, // Convert MB to bytes for internal service\n };\n });\n\n readonly finalImageUploadHandler = computed(() => this.config().imageUpload?.handler ?? this.imageUploadHandler());\n\n // Computed for current translations (allows per-instance override via config or input)\n readonly currentTranslations = computed(() => {\n const localeOverride = this.finalLocale();\n if (localeOverride) {\n const allTranslations = this.i18nService.allTranslations();\n return allTranslations[localeOverride] || this.i18nService.translations();\n }\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 // 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 { control?: unknown })?.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.finalMinHeight();\n const height = this.finalHeight();\n const maxHeight = this.finalMaxHeight();\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 ?? \"auto\");\n element.style.setProperty(\"--editor-height\", height ?? \"auto\");\n element.style.setProperty(\"--editor-max-height\", maxHeight ?? \"none\");\n element.style.setProperty(\"--editor-overflow\", needsScroll ? \"auto\" : \"visible\");\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.finalEditable() && !this.mergedDisabled();\n // An editor is \"readonly\" if it's explicitly non-editable and not disabled\n // const isReadOnly = !this.finalEditable() && !this.mergedDisabled(); // Unused variable\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.finalImageUploadHandler();\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.finalMaxCharacters();\n\n if (editor && editor.extensionManager) {\n const characterCountExtension = editor.extensionManager.extensions.find(ext => ext.name === \"characterCount\");\n\n if (characterCountExtension) {\n characterCountExtension.options.limit = limit;\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: this.finalPlaceholder(),\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.finalEnableOfficePaste()) {\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.finalShowCharacterCount() || this.finalShowWordCount()) {\n extensions.push(\n CharacterCount.configure({\n limit: this.finalMaxCharacters(),\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.map(ext => (ext as { name?: string })?.name).filter((name): name is string => !!name)\n );\n\n const toAdd = customExtensions.filter(ext => {\n const name = (ext as { name?: string })?.name;\n return !name || !existingNames.has(name);\n });\n\n extensions.push(...toAdd);\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: extensions,\n content: this.content(),\n editable: this.finalEditable() && !this.mergedDisabled(),\n autofocus: this.finalAutofocus(),\n editorProps: {\n attributes: {\n spellcheck: this.finalSpellcheck().toString(),\n },\n },\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 (\n (\n this.ngControl as {\n control?: { setValue: (value: string, options: { emitEvent: boolean }) => void };\n }\n )?.control\n ) {\n (\n this.ngControl as {\n control: { setValue: (value: string, options: { emitEvent: boolean }) => void };\n }\n ).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 { control?: { markAsTouched: () => void } })?.control) {\n (this.ngControl as { control: { markAsTouched: () => void } }).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.finalEditable();\n this.editableChange.emit(newEditable);\n }\n\n private updateCharacterCount(editor: Editor) {\n if ((this.finalShowCharacterCount() || this.finalShowWordCount()) && 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 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.finalImageUploadConfig();\n await this.editorCommandsService.uploadImage(currentEditor, file, {\n quality: config.quality,\n maxWidth: config.maxWidth,\n maxHeight: config.maxHeight,\n });\n } catch (_e) {\n /* ignore */\n }\n }\n }\n\n // Public methods\n getHTML(): string {\n return this.editor()?.getHTML() || \"\";\n }\n\n getJSON(): JSONContent | undefined {\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 = (\n this.ngControl as {\n control?: {\n value: string;\n valueChanges: Observable<string>;\n status: string;\n statusChanges: Observable<string>;\n };\n }\n )?.control;\n if (control) {\n // Synchronize form control value with editor content\n const formValue$: Observable<string> = concat(\n defer(() => of(control.value)),\n control.valueChanges\n );\n\n formValue$\n .pipe(\n tap((value: string) => {\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$: Observable<string> = 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: Event) {\n const editor = this.editor();\n if (!editor || !this.finalEditable()) return;\n\n // Verify if interaction 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 (target === editorElement || target.classList.contains(\"tiptap-content\")) {\n // Interaction 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/image.model\";\nexport * from \"./lib/models/bubble-menu.model\";\nexport * from \"./lib/models/editor-config.model\";\nexport type { CustomSlashCommands, SlashCommandItem } 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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"}