@flogeez/angular-tiptap-editor 2.2.3 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"flogeez-angular-tiptap-editor.mjs","sources":["../../../projects/angular-tiptap-editor/src/lib/extensions/ate-resizable-image.extension.ts","../../../projects/angular-tiptap-editor/src/lib/extensions/ate-upload-progress.extension.ts","../../../projects/angular-tiptap-editor/src/lib/extensions/ate-table.extension.ts","../../../projects/angular-tiptap-editor/src/lib/models/ate-editor-state.model.ts","../../../projects/angular-tiptap-editor/src/lib/extensions/ate-tiptap-state.extension.ts","../../../projects/angular-tiptap-editor/src/lib/components/ui/ate-button.component.ts","../../../projects/angular-tiptap-editor/src/lib/components/ui/ate-separator.component.ts","../../../projects/angular-tiptap-editor/src/lib/services/ate-i18n.service.ts","../../../projects/angular-tiptap-editor/src/lib/services/ate-image.service.ts","../../../projects/angular-tiptap-editor/src/lib/utils/ate-color.utils.ts","../../../projects/angular-tiptap-editor/src/lib/services/ate-color-picker.service.ts","../../../projects/angular-tiptap-editor/src/lib/services/ate-link.service.ts","../../../projects/angular-tiptap-editor/src/lib/services/ate-editor-commands.service.ts","../../../projects/angular-tiptap-editor/src/lib/components/color-picker/ate-color-picker.component.ts","../../../projects/angular-tiptap-editor/src/lib/components/toolbar/ate-toolbar.component.ts","../../../projects/angular-tiptap-editor/src/lib/components/bubble-menus/base/ate-base-bubble-menu.ts","../../../projects/angular-tiptap-editor/src/lib/components/bubble-menus/text/ate-bubble-menu.component.ts","../../../projects/angular-tiptap-editor/src/lib/components/bubble-menus/image/ate-image-bubble-menu.component.ts","../../../projects/angular-tiptap-editor/src/lib/components/bubble-menus/table/ate-table-bubble-menu.component.ts","../../../projects/angular-tiptap-editor/src/lib/components/bubble-menus/table/ate-cell-bubble-menu.component.ts","../../../projects/angular-tiptap-editor/src/lib/components/bubble-menus/base/ate-base-sub-bubble-menu.ts","../../../projects/angular-tiptap-editor/src/lib/components/bubble-menus/link/ate-link-bubble-menu.component.ts","../../../projects/angular-tiptap-editor/src/lib/components/bubble-menus/color/ate-color-bubble-menu.component.ts","../../../projects/angular-tiptap-editor/src/lib/config/ate-slash-commands.config.ts","../../../projects/angular-tiptap-editor/src/lib/components/slash-commands/ate-slash-commands.component.ts","../../../projects/angular-tiptap-editor/src/lib/components/edit-toggle/ate-edit-toggle.component.ts","../../../projects/angular-tiptap-editor/src/lib/directives/ate-noop-value-accessor.directive.ts","../../../projects/angular-tiptap-editor/src/lib/extensions/calculators/ate-selection.calculator.ts","../../../projects/angular-tiptap-editor/src/lib/extensions/calculators/ate-marks.calculator.ts","../../../projects/angular-tiptap-editor/src/lib/extensions/calculators/ate-table.calculator.ts","../../../projects/angular-tiptap-editor/src/lib/extensions/calculators/ate-image.calculator.ts","../../../projects/angular-tiptap-editor/src/lib/extensions/calculators/ate-structure.calculator.ts","../../../projects/angular-tiptap-editor/src/lib/extensions/calculators/ate-discovery.calculator.ts","../../../projects/angular-tiptap-editor/src/lib/extensions/ate-link-click-behavior.extension.ts","../../../projects/angular-tiptap-editor/src/lib/config/ate-editor.config.ts","../../../projects/angular-tiptap-editor/src/lib/components/editor/angular-tiptap-editor.component.ts","../../../projects/angular-tiptap-editor/src/lib/models/ate-toolbar.model.ts","../../../projects/angular-tiptap-editor/src/lib/models/ate-bubble-menu.model.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 AteResizableImageOptions {\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 AteResizableImage = Node.create<AteResizableImageOptions>({\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 = \"ate-image\";\n\n if (node.attrs[\"width\"]) {\n img.width = node.attrs[\"width\"];\n }\n if (node.attrs[\"height\"]) {\n img.height = node.attrs[\"height\"];\n }\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\") || node.attrs[\"width\"] || img.naturalWidth;\n startHeight =\n 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) {\n return;\n }\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\") {\n return false;\n }\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 }\n if (updatedNode.attrs[\"height\"]) {\n img.height = updatedNode.attrs[\"height\"];\n }\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 AteUploadProgressOptions {\n isUploading: () => boolean;\n uploadProgress: () => number;\n uploadMessage: () => string;\n}\n\nexport const AteUploadProgress = Extension.create<AteUploadProgressOptions>({\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 AteTableExtension = 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 AteStateCalculator = (editor: Editor) => Partial<{\n [K in keyof AteEditorStateSnapshot]: AteEditorStateSnapshot[K] extends object\n ? Partial<AteEditorStateSnapshot[K]>\n : AteEditorStateSnapshot[K];\n}>;\n\nexport interface AteEditorStateSnapshot {\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 ATE_INITIAL_EDITOR_STATE: AteEditorStateSnapshot = {\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 {\n AteEditorStateSnapshot,\n ATE_INITIAL_EDITOR_STATE,\n AteStateCalculator,\n} from \"../models/ate-editor-state.model\";\n\nexport interface AteTiptapStateOptions {\n onUpdate?: (state: AteEditorStateSnapshot) => void;\n calculators: AteStateCalculator[];\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) {\n return;\n }\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]) {\n target[key] = {};\n }\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(): AteEditorStateSnapshot {\n return JSON.parse(JSON.stringify(ATE_INITIAL_EDITOR_STATE));\n}\n\nexport const AteTiptapStateExtension = Extension.create<AteTiptapStateOptions>({\n name: \"ateTiptapState\",\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) {\n return;\n }\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 AteButtonConfig {\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: \"ate-button\",\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <button\n class=\"ate-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 .ate-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 .ate-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 .ate-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 .ate-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 .ate-button.has-custom-bg:hover {\n transform: translateY(-1px);\n filter: brightness(0.9);\n }\n\n .ate-button:hover::before {\n opacity: 0.1;\n }\n\n .ate-button:active {\n transform: translateY(0);\n }\n\n .ate-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 .ate-button.is-active.has-custom-color {\n background: var(--ate-toolbar-button-active-background, var(--ate-primary-light));\n }\n\n .ate-button:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n pointer-events: none;\n }\n\n /* Icônes Material Symbols */\n .ate-button .material-symbols-outlined {\n font-size: 20px;\n position: relative;\n z-index: 1;\n }\n\n .ate-button .material-symbols-outlined.icon-small {\n font-size: 16px;\n }\n\n .ate-button .material-symbols-outlined.icon-medium {\n font-size: 20px;\n }\n\n .ate-button .material-symbols-outlined.icon-large {\n font-size: 24px;\n }\n\n /* Boutons avec texte */\n .ate-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 .ate-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 .ate-button.color-button:hover {\n border-color: var(--ate-border);\n transform: scale(1.1);\n }\n\n .ate-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 .ate-button.danger {\n color: var(--ate-error-color, #ef4444);\n }\n\n .ate-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 .ate-button.danger::before {\n background: var(--ate-error-color, #ef4444);\n }\n\n /* Boutons de taille différente */\n .ate-button.small {\n width: 24px;\n height: 24px;\n }\n\n .ate-button.medium {\n width: 32px;\n height: 32px;\n }\n\n .ate-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 .ate-button.is-active.pulse {\n animation: pulse 2s infinite;\n }\n\n /* Responsive */\n @media (max-width: 768px) {\n .ate-button {\n width: 32px;\n height: 32px;\n }\n\n .ate-button .material-symbols-outlined {\n font-size: 18px;\n }\n\n .ate-button.text-button {\n padding: 0 8px;\n font-size: 13px;\n }\n }\n `,\n ],\n})\nexport class AteButtonComponent {\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: \"ate-separator\",\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div\n class=\"ate-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 .ate-separator {\n background-color: var(--ate-border, #e2e8f0);\n margin: 0;\n }\n\n .ate-separator.vertical {\n width: 1px;\n height: 24px;\n margin: 0 8px;\n }\n\n .ate-separator.horizontal {\n height: 1px;\n width: 100%;\n margin: 8px 0;\n }\n\n .ate-separator.small.vertical {\n height: 16px;\n margin: 0 4px;\n }\n\n .ate-separator.small.horizontal {\n margin: 4px 0;\n }\n\n .ate-separator.medium.vertical {\n height: 24px;\n margin: 0 8px;\n }\n\n .ate-separator.medium.horizontal {\n margin: 8px 0;\n }\n\n .ate-separator.large.vertical {\n height: 32px;\n margin: 0 12px;\n }\n\n .ate-separator.large.horizontal {\n margin: 12px 0;\n }\n `,\n ],\n})\nexport class AteSeparatorComponent {\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 AteTranslations {\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: AteTranslations = {\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: AteTranslations = {\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 AteI18nService {\n private _currentLocale = signal<SupportedLocale>(\"en\");\n private _translations = signal<Record<SupportedLocale, AteTranslations>>({\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: AteTranslations | Partial<AteTranslations>): 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 AteTranslations[\"toolbar\"]): string {\n return this.translations().toolbar[key];\n }\n\n getBubbleMenuTitle(key: keyof AteTranslations[\"bubbleMenu\"]): string {\n return this.translations().bubbleMenu[key];\n }\n\n getSlashCommand(key: keyof AteTranslations[\"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 { AteI18nService } from \"./ate-i18n.service\";\nimport {\n AteResizeOptions,\n AteImageUploadOptions,\n AteImageUploadHandler,\n AteImageUploadResult,\n AteImageData,\n} from \"../models/ate-image.model\";\n\n@Injectable()\nexport class AteImageService {\n /** Signals for image state */\n selectedImage = signal<AteImageData | null>(null);\n isImageSelected = computed(() => this.selectedImage() !== null);\n\n /** Resizing state */\n isResizing = signal(false);\n\n private i18n = inject(AteI18nService);\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: AteImageUploadHandler | 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: AteImageData): 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<AteImageData>): 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: AteResizeOptions): void {\n if (!editor.isActive(\"resizableImage\")) {\n return;\n }\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) {\n newWidth = Math.max(50, newWidth);\n }\n if (newHeight) {\n newHeight = Math.max(50, newHeight);\n }\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\")) {\n return;\n }\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\")) {\n return null;\n }\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<AteImageData>): 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(\n file: File,\n quality = 0.8,\n maxWidth = 1920,\n maxHeight = 1200\n ): Promise<AteImageUploadResult> {\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: AteImageUploadResult) => void,\n actionMessage: string,\n options?: AteImageUploadOptions\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) {\n throw new Error(validation.error);\n }\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) {\n result.name = handlerResult.alt;\n }\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(\n editor: Editor,\n file: File,\n options?: AteImageUploadOptions\n ): 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?: AteImageUploadOptions) => Promise<void>,\n options?: AteImageUploadOptions\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?: AteImageUploadOptions): 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?: AteImageUploadOptions): 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(\n editor: Editor,\n file: File,\n options?: AteImageUploadOptions\n ): 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)\") {\n return null;\n }\n if (color.startsWith(\"#\")) {\n return color;\n }\n\n // Support both comma-separated (legacy) and space-separated (modern) rgb/rgba\n const rgbMatch = color\n .trim()\n .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()]) {\n return named[color.toLowerCase()]!;\n }\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) {\n return null;\n }\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) {\n return 0;\n } // 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/ate-color.utils\";\n\nexport interface AteColorPickerSelection {\n from: number;\n to: number;\n}\n\nexport type AteColorEditMode = \"text\" | \"highlight\";\n\n@Injectable()\nexport class AteColorPickerService {\n private storedSelection: AteColorPickerSelection | 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<AteColorEditMode | 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: AteColorEditMode, 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: AteColorEditMode, event?: Event): void {\n if (!editor) {\n return;\n }\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) {\n return;\n }\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(): AteColorPickerSelection | 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) {\n return;\n }\n\n const stored = this.storedSelection;\n let chain = editor.chain();\n if (focus) {\n chain = chain.focus();\n }\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.setColor(color);\n\n if (addToHistory === false) {\n chain = chain.setMeta(\"addToHistory\", false);\n }\n chain.run();\n }\n\n /**\n * Remove text color from selection.\n */\n unsetColor(editor: Editor, focus = true): void {\n if (!editor) {\n return;\n }\n\n const stored = this.storedSelection;\n let chain = editor.chain();\n if (focus) {\n chain = chain.focus();\n }\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.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) {\n return;\n }\n\n const stored = this.storedSelection;\n let chain = editor.chain();\n if (focus) {\n chain = chain.focus();\n }\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.setHighlight({ color });\n\n if (addToHistory === false) {\n chain = chain.setMeta(\"addToHistory\", false);\n }\n chain.run();\n }\n\n /**\n * Remove highlight from selection.\n */\n unsetHighlight(editor: Editor, focus = true): void {\n if (!editor) {\n return;\n }\n\n const stored = this.storedSelection;\n let chain = editor.chain();\n if (focus) {\n chain = chain.focus();\n }\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.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 AteLinkService {\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) {\n return;\n }\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 =\n ((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) {\n return;\n }\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) {\n return;\n }\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 { AteImageService } from \"./ate-image.service\";\nimport { AteColorPickerService } from \"./ate-color-picker.service\";\nimport { AteLinkService } from \"./ate-link.service\";\nimport { AteEditorStateSnapshot, ATE_INITIAL_EDITOR_STATE } from \"../models/ate-editor-state.model\";\nimport { AteImageUploadHandler, AteImageUploadOptions } from \"../models/ate-image.model\";\n\n@Injectable()\nexport class AteEditorCommandsService {\n private imageService = inject(AteImageService);\n private colorPickerSvc = inject(AteColorPickerService);\n private linkSvc = inject(AteLinkService);\n private readonly _editorState = signal<AteEditorStateSnapshot>(ATE_INITIAL_EDITOR_STATE, {\n equal: (a, b) => {\n // 1. Primitive global states\n if (a.isFocused !== b.isFocused || a.isEditable !== b.isEditable) {\n return false;\n }\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\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) {\n return false;\n }\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)) {\n return false;\n }\n if (!isRecordEqual(a.can, b.can)) {\n return false;\n }\n if (!isRecordEqual(a.nodes, b.nodes)) {\n return false;\n }\n\n // 4. Compare custom extension states\n if (!isRecordEqual(a.custom, b.custom)) {\n return false;\n }\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: AteImageUploadHandler | null) {\n this.imageService.uploadHandler = handler;\n }\n\n /** Update state (called by TiptapStateExtension) */\n updateState(state: AteEditorStateSnapshot) {\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) {\n return;\n }\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 AteImageUploadOptions);\n break;\n case \"uploadImage\":\n this.uploadImage(editor, args[0] as File, args[1] as AteImageUploadOptions | 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) {\n return;\n }\n editor.chain().focus().toggleBold().run();\n }\n\n toggleItalic(editor: Editor): void {\n if (!editor) {\n return;\n }\n editor.chain().focus().toggleItalic().run();\n }\n\n toggleStrike(editor: Editor): void {\n if (!editor) {\n return;\n }\n editor.chain().focus().toggleStrike().run();\n }\n\n toggleCode(editor: Editor): void {\n if (!editor) {\n return;\n }\n editor.chain().focus().toggleCode().run();\n }\n\n toggleCodeBlock(editor: Editor): void {\n if (!editor) {\n return;\n }\n editor.chain().focus().toggleCodeBlock().run();\n }\n\n toggleUnderline(editor: Editor): void {\n if (!editor) {\n return;\n }\n editor.chain().focus().toggleUnderline().run();\n }\n\n toggleSuperscript(editor: Editor): void {\n if (!editor) {\n return;\n }\n editor.chain().focus().toggleSuperscript().run();\n }\n\n toggleSubscript(editor: Editor): void {\n if (!editor) {\n return;\n }\n editor.chain().focus().toggleSubscript().run();\n }\n\n toggleHeading(editor: Editor, level: 1 | 2 | 3): void {\n if (!editor) {\n return;\n }\n editor.chain().focus().toggleHeading({ level }).run();\n }\n\n toggleHighlight(editor: Editor, color?: string): void {\n if (!editor) {\n return;\n }\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) {\n return;\n }\n editor.chain().focus().toggleBulletList().run();\n }\n\n toggleOrderedList(editor: Editor): void {\n if (!editor) {\n return;\n }\n editor.chain().focus().toggleOrderedList().run();\n }\n\n toggleBlockquote(editor: Editor): void {\n if (!editor) {\n return;\n }\n editor.chain().focus().toggleBlockquote().run();\n }\n\n setTextAlign(editor: Editor, alignment: \"left\" | \"center\" | \"right\" | \"justify\"): void {\n if (!editor) {\n return;\n }\n editor.chain().focus().setTextAlign(alignment).run();\n }\n\n insertHorizontalRule(editor: Editor): void {\n if (!editor) {\n return;\n }\n editor.chain().focus().setHorizontalRule().run();\n }\n\n // --- History Commands ---\n\n undo(editor: Editor): void {\n if (!editor) {\n return;\n }\n editor.chain().focus().undo().run();\n }\n\n redo(editor: Editor): void {\n if (!editor) {\n return;\n }\n editor.chain().focus().redo().run();\n }\n\n // --- Table Commands ---\n\n insertTable(editor: Editor, rows = 3, cols = 3): void {\n if (!editor) {\n return;\n }\n editor.chain().focus().insertTable({ rows, cols }).run();\n }\n\n addColumnBefore(editor: Editor): void {\n if (!editor) {\n return;\n }\n editor.chain().focus().addColumnBefore().run();\n }\n\n addColumnAfter(editor: Editor): void {\n if (!editor) {\n return;\n }\n editor.chain().focus().addColumnAfter().run();\n }\n\n deleteColumn(editor: Editor): void {\n if (!editor) {\n return;\n }\n editor.chain().focus().deleteColumn().run();\n }\n\n addRowBefore(editor: Editor): void {\n if (!editor) {\n return;\n }\n editor.chain().focus().addRowBefore().run();\n }\n\n addRowAfter(editor: Editor): void {\n if (!editor) {\n return;\n }\n editor.chain().focus().addRowAfter().run();\n }\n\n deleteRow(editor: Editor): void {\n if (!editor) {\n return;\n }\n editor.chain().focus().deleteRow().run();\n }\n\n deleteTable(editor: Editor): void {\n if (!editor) {\n return;\n }\n editor.chain().focus().deleteTable().run();\n }\n\n mergeCells(editor: Editor): void {\n if (!editor) {\n return;\n }\n editor.chain().focus().mergeCells().run();\n }\n\n splitCell(editor: Editor): void {\n if (!editor) {\n return;\n }\n editor.chain().focus().splitCell().run();\n }\n\n toggleHeaderColumn(editor: Editor): void {\n if (!editor) {\n return;\n }\n editor.chain().focus().toggleHeaderColumn().run();\n }\n\n toggleHeaderRow(editor: Editor): void {\n if (!editor) {\n return;\n }\n editor.chain().focus().toggleHeaderRow().run();\n }\n\n // --- Utility Commands ---\n\n clearContent(editor: Editor): void {\n if (!editor) {\n return;\n }\n editor.commands.clearContent(true);\n }\n\n focus(editor: Editor): void {\n if (!editor) {\n return;\n }\n editor.chain().focus().run();\n }\n\n blur(editor: Editor): void {\n if (!editor) {\n return;\n }\n editor.chain().blur().run();\n }\n\n setContent(editor: Editor, content: string, emitUpdate = true): void {\n if (!editor) {\n return;\n }\n editor.commands.setContent(content, emitUpdate);\n }\n\n setEditable(editor: Editor, editable: boolean): void {\n if (!editor) {\n return;\n }\n editor.setEditable(editable);\n }\n\n insertContent(editor: Editor, content: string): void {\n if (!editor) {\n return;\n }\n editor.chain().focus().insertContent(content).run();\n }\n\n async insertImage(editor: Editor, options?: AteImageUploadOptions): 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?: AteImageUploadOptions): 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 { AteColorPickerService } from \"../../services/ate-color-picker.service\";\nimport { AteButtonComponent } from \"../ui/ate-button.component\";\nimport { AteI18nService } from \"../../services/ate-i18n.service\";\nimport { AteEditorCommandsService } from \"../../services/ate-editor-commands.service\";\n\nexport type ColorPickerMode = \"text\" | \"highlight\";\n\n@Component({\n selector: \"ate-color-picker\",\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AteButtonComponent, CommonModule],\n template: `\n <div class=\"color-picker-wrapper\">\n <div class=\"color-picker-container\" [class.is-highlight]=\"mode() === 'highlight'\">\n <ate-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 AteColorPickerComponent {\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(AteColorPickerService);\n private i18nService = inject(AteI18nService);\n private editorCommands = inject(AteEditorCommandsService);\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 { AteButtonComponent } from \"../ui/ate-button.component\";\nimport { AteSeparatorComponent } from \"../ui/ate-separator.component\";\nimport { AteEditorCommandsService } from \"../../services/ate-editor-commands.service\";\nimport { AteI18nService } from \"../../services/ate-i18n.service\";\nimport { AteColorPickerComponent } from \"../color-picker/ate-color-picker.component\";\n\nimport { AteToolbarConfig } from \"../../models/ate-toolbar.model\";\n\n@Component({\n selector: \"ate-toolbar\",\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AteButtonComponent, AteSeparatorComponent, AteColorPickerComponent],\n template: `\n <div class=\"ate-toolbar\" [class.floating]=\"floating()\">\n @if (config().bold) {\n <ate-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 <ate-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 <ate-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 <ate-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 <ate-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 <ate-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 <ate-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 <ate-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 <ate-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 <ate-color-picker\n mode=\"highlight\"\n [editor]=\"editor()\"\n [disabled]=\"!state().can.setHighlight\" />\n }\n @if (config().textColor) {\n <ate-color-picker mode=\"text\" [editor]=\"editor()\" [disabled]=\"!state().can.setColor\" />\n }\n\n @if (config().separator && (config().heading1 || config().heading2 || config().heading3)) {\n <ate-separator />\n }\n @if (config().heading1) {\n <ate-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 <ate-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 <ate-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 (\n config().separator && (config().bulletList || config().orderedList || config().blockquote)\n ) {\n <ate-separator />\n }\n @if (config().bulletList) {\n <ate-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 <ate-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 <ate-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 <ate-separator />\n }\n @if (config().alignLeft) {\n <ate-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 <ate-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 <ate-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 <ate-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 <ate-separator />\n }\n @if (config().link) {\n <ate-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 <ate-button\n icon=\"horizontal_rule\"\n [title]=\"t().horizontalRule\"\n [disabled]=\"!state().can.insertHorizontalRule\"\n (buttonClick)=\"onCommand('insertHorizontalRule')\" />\n }\n @if (config().table) {\n <ate-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 <ate-separator />\n }\n @if (config().image) {\n <ate-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 <ate-separator />\n }\n @if (config().undo) {\n <ate-button\n icon=\"undo\"\n [title]=\"t().undo\"\n [disabled]=\"!state().can.undo\"\n (buttonClick)=\"onCommand('undo')\" />\n }\n @if (config().redo) {\n <ate-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 <ate-separator />\n }\n @if (config().clear) {\n <ate-button\n icon=\"delete\"\n [title]=\"t().clear\"\n [disabled]=\"!state().isEditable\"\n (buttonClick)=\"onCommand('clearContent')\" />\n }\n @if (config().custom?.length) {\n @for (item of config().custom; track item.key) {\n <ate-button\n [icon]=\"item.icon\"\n [title]=\"item.label\"\n (buttonClick)=\"item.command(editor())\"></ate-button>\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 .ate-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(\n var(--ate-menu-border-radius, 12px) - var(--ate-border-width, 2px)\n );\n border-top-right-radius: calc(\n var(--ate-menu-border-radius, 12px) - var(--ate-border-width, 2px)\n );\n }\n\n /* Floating Toolbar Mode */\n .ate-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 .ate-toolbar.floating::-webkit-scrollbar {\n display: none;\n }\n\n :host-context(.floating-toolbar:focus-within) .ate-toolbar.floating,\n :host-context(.floating-toolbar:hover) .ate-toolbar.floating {\n transform: translateY(-2rem);\n }\n\n @media (max-width: 768px) {\n .ate-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 .ate-toolbar {\n animation: toolbarSlideIn 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n `,\n ],\n})\nexport class AteToolbarComponent {\n editor = input.required<Editor>();\n config = input.required<AteToolbarConfig>();\n imageUpload = input<Record<string, unknown>>({});\n floating = input<boolean>(false);\n\n private i18nService = inject(AteI18nService);\n private editorCommands = inject(AteEditorCommandsService);\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) {\n return;\n }\n this.editorCommands.execute(editor, command, ...args);\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 { AteEditorCommandsService } from \"../../../services/ate-editor-commands.service\";\nimport { AteI18nService } from \"../../../services/ate-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 AteBaseBubbleMenu implements OnInit, OnDestroy {\n protected readonly i18nService = inject(AteI18nService);\n protected readonly editorCommands = inject(AteEditorCommandsService);\n\n // Core Inputs\n editor = input.required<Editor>();\n\n // Required viewChild for the menu container\n menuRef = viewChild.required<ElementRef<HTMLDivElement>>(\"menuRef\");\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) {\n return;\n }\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) {\n return;\n }\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) {\n return new DOMRect(0, 0, 0, 0);\n }\n\n const { from, to, empty } = ed.state.selection;\n if (empty) {\n return new DOMRect(-9999, -9999, 0, 0);\n }\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 {\n Component,\n input,\n ChangeDetectionStrategy,\n computed,\n OnInit,\n OnDestroy,\n} from \"@angular/core\";\nimport { type Editor } from \"@tiptap/core\";\nimport { AteButtonComponent } from \"../../ui/ate-button.component\";\nimport { AteColorPickerComponent } from \"../../color-picker/ate-color-picker.component\";\nimport { AteBubbleMenuConfig } from \"../../../models/ate-bubble-menu.model\";\nimport { AteBaseBubbleMenu } from \"../base/ate-base-bubble-menu\";\n\n@Component({\n selector: \"ate-bubble-menu\",\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AteButtonComponent, AteColorPickerComponent],\n template: `\n <div #menuRef class=\"bubble-menu\" (mousedown)=\"$event.preventDefault()\">\n @if (bubbleMenuConfig().bold) {\n <ate-button\n icon=\"format_bold\"\n [title]=\"t().bold\"\n [active]=\"state().marks.bold\"\n [disabled]=\"!state().can.toggleBold\"\n (buttonClick)=\"onCommand('toggleBold', $event)\"></ate-button>\n }\n @if (bubbleMenuConfig().italic) {\n <ate-button\n icon=\"format_italic\"\n [title]=\"t().italic\"\n [active]=\"state().marks.italic\"\n [disabled]=\"!state().can.toggleItalic\"\n (buttonClick)=\"onCommand('toggleItalic', $event)\"></ate-button>\n }\n @if (bubbleMenuConfig().underline) {\n <ate-button\n icon=\"format_underlined\"\n [title]=\"t().underline\"\n [active]=\"state().marks.underline\"\n [disabled]=\"!state().can.toggleUnderline\"\n (buttonClick)=\"onCommand('toggleUnderline', $event)\"></ate-button>\n }\n @if (bubbleMenuConfig().strike) {\n <ate-button\n icon=\"strikethrough_s\"\n [title]=\"t().strike\"\n [active]=\"state().marks.strike\"\n [disabled]=\"!state().can.toggleStrike\"\n (buttonClick)=\"onCommand('toggleStrike', $event)\"></ate-button>\n }\n @if (bubbleMenuConfig().code) {\n <ate-button\n icon=\"code\"\n [title]=\"t().code\"\n [active]=\"state().marks.code\"\n [disabled]=\"!state().can.toggleCode\"\n (buttonClick)=\"onCommand('toggleCode', $event)\"></ate-button>\n }\n @if (bubbleMenuConfig().superscript) {\n <ate-button\n icon=\"superscript\"\n [title]=\"t().superscript\"\n [active]=\"state().marks.superscript\"\n [disabled]=\"!state().can.toggleSuperscript\"\n (buttonClick)=\"onCommand('toggleSuperscript', $event)\"></ate-button>\n }\n @if (bubbleMenuConfig().subscript) {\n <ate-button\n icon=\"subscript\"\n [title]=\"t().subscript\"\n [active]=\"state().marks.subscript\"\n [disabled]=\"!state().can.toggleSubscript\"\n (buttonClick)=\"onCommand('toggleSubscript', $event)\"></ate-button>\n }\n @if (bubbleMenuConfig().highlight) {\n <ate-button\n icon=\"highlight\"\n [title]=\"t().highlight\"\n [active]=\"state().marks.highlight\"\n [disabled]=\"!state().can.toggleHighlight\"\n (buttonClick)=\"onCommand('toggleHighlight', $event)\"></ate-button>\n }\n @if (bubbleMenuConfig().highlightPicker) {\n <ate-color-picker\n mode=\"highlight\"\n [editor]=\"editor()\"\n [disabled]=\"!state().can.setHighlight\"\n [anchorToText]=\"true\" />\n }\n @if (bubbleMenuConfig().textColor) {\n <ate-color-picker\n mode=\"text\"\n [editor]=\"editor()\"\n [disabled]=\"!state().can.setColor\"\n [anchorToText]=\"true\" />\n }\n @if (bubbleMenuConfig().link) {\n <ate-button\n icon=\"link\"\n [title]=\"t().link\"\n [active]=\"state().marks.link\"\n [disabled]=\"!state().can.toggleLink\"\n (buttonClick)=\"onCommand('toggleLink', $event)\"></ate-button>\n }\n @if (bubbleMenuConfig().custom?.length) {\n @for (item of bubbleMenuConfig().custom; track item.key) {\n <ate-button\n [icon]=\"item.icon\"\n [title]=\"item.label\"\n (buttonClick)=\"item.command(editor())\"></ate-button>\n }\n }\n </div>\n `,\n})\nexport class AteBubbleMenuComponent extends AteBaseBubbleMenu 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<AteBubbleMenuConfig>({\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\" && !selection.empty && !nodes.isImage && !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: 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 { AteButtonComponent } from \"../../ui/ate-button.component\";\nimport { AteSeparatorComponent } from \"../../ui/ate-separator.component\";\nimport { AteImageService } from \"../../../services/ate-image.service\";\nimport { AteImageBubbleMenuConfig } from \"../../../models/ate-bubble-menu.model\";\nimport { AteBaseBubbleMenu } from \"../base/ate-base-bubble-menu\";\nimport { AteImageUploadOptions } from \"../../../models/ate-image.model\";\n\n@Component({\n selector: \"ate-image-bubble-menu\",\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AteButtonComponent, AteSeparatorComponent],\n template: `\n <div #menuRef class=\"bubble-menu\" (mousedown)=\"$event.preventDefault()\">\n @if (imageBubbleMenuConfig().changeImage) {\n <ate-button\n icon=\"drive_file_rename_outline\"\n [title]=\"t().changeImage\"\n (buttonClick)=\"onCommand('changeImage', $event)\"></ate-button>\n }\n @if (imageBubbleMenuConfig().separator && hasResizeButtons()) {\n <ate-separator />\n }\n @if (imageBubbleMenuConfig().resizeSmall) {\n <ate-button\n icon=\"crop_square\"\n iconSize=\"small\"\n [title]=\"t().resizeSmall\"\n (buttonClick)=\"onCommand('resizeSmall', $event)\"></ate-button>\n }\n @if (imageBubbleMenuConfig().resizeMedium) {\n <ate-button\n icon=\"crop_square\"\n iconSize=\"medium\"\n [title]=\"t().resizeMedium\"\n (buttonClick)=\"onCommand('resizeMedium', $event)\"></ate-button>\n }\n @if (imageBubbleMenuConfig().resizeLarge) {\n <ate-button\n icon=\"crop_square\"\n iconSize=\"large\"\n [title]=\"t().resizeLarge\"\n (buttonClick)=\"onCommand('resizeLarge', $event)\"></ate-button>\n }\n @if (imageBubbleMenuConfig().resizeOriginal) {\n <ate-button\n icon=\"photo_size_select_actual\"\n [title]=\"t().resizeOriginal\"\n (buttonClick)=\"onCommand('resizeOriginal', $event)\"></ate-button>\n }\n @if (imageBubbleMenuConfig().separator && imageBubbleMenuConfig().deleteImage) {\n <ate-separator />\n }\n @if (imageBubbleMenuConfig().deleteImage) {\n <ate-button\n icon=\"delete\"\n [title]=\"t().deleteImage\"\n variant=\"danger\"\n (buttonClick)=\"onCommand('deleteImage', $event)\"></ate-button>\n }\n </div>\n `,\n})\nexport class AteImageBubbleMenuComponent extends AteBaseBubbleMenu {\n readonly t = this.i18nService.imageUpload;\n private readonly imageService = inject(AteImageService);\n\n config = input<AteImageBubbleMenuConfig>({\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<AteImageUploadOptions>({});\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) {\n return new DOMRect(0, 0, 0, 0);\n }\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) {\n return img.getBoundingClientRect();\n }\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(\n \"img.selected, .resizable-image-container.selected img\"\n );\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) {\n return;\n }\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 { AteButtonComponent } from \"../../ui/ate-button.component\";\nimport { AteSeparatorComponent } from \"../../ui/ate-separator.component\";\nimport { AteBaseBubbleMenu } from \"../base/ate-base-bubble-menu\";\n\nimport { AteTableBubbleMenuConfig } from \"../../../models/ate-bubble-menu.model\";\n\n@Component({\n selector: \"ate-table-bubble-menu\",\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, AteButtonComponent, AteSeparatorComponent],\n template: `\n <div #menuRef class=\"bubble-menu\" (mousedown)=\"$event.preventDefault()\">\n <!-- Row actions -->\n @if (config().addRowBefore !== false) {\n <ate-button\n icon=\"add_row_above\"\n [title]=\"t().addRowBefore\"\n [disabled]=\"!state().can.addRowBefore\"\n (buttonClick)=\"onCommand('addRowBefore', $event)\"></ate-button>\n }\n @if (config().addRowAfter !== false) {\n <ate-button\n icon=\"add_row_below\"\n [title]=\"t().addRowAfter\"\n [disabled]=\"!state().can.addRowAfter\"\n (buttonClick)=\"onCommand('addRowAfter', $event)\"></ate-button>\n }\n @if (config().deleteRow !== false) {\n <ate-button\n icon=\"delete\"\n [title]=\"t().deleteRow\"\n variant=\"danger\"\n [disabled]=\"!state().can.deleteRow\"\n (buttonClick)=\"onCommand('deleteRow', $event)\"></ate-button>\n }\n @if (config().separator !== false) {\n <ate-separator />\n }\n\n <!-- Column actions -->\n @if (config().addColumnBefore !== false) {\n <ate-button\n icon=\"add_column_left\"\n [title]=\"t().addColumnBefore\"\n [disabled]=\"!state().can.addColumnBefore\"\n (buttonClick)=\"onCommand('addColumnBefore', $event)\"></ate-button>\n }\n @if (config().addColumnAfter !== false) {\n <ate-button\n icon=\"add_column_right\"\n [title]=\"t().addColumnAfter\"\n [disabled]=\"!state().can.addColumnAfter\"\n (buttonClick)=\"onCommand('addColumnAfter', $event)\"></ate-button>\n }\n @if (config().deleteColumn !== false) {\n <ate-button\n icon=\"delete\"\n [title]=\"t().deleteColumn\"\n variant=\"danger\"\n [disabled]=\"!state().can.deleteColumn\"\n (buttonClick)=\"onCommand('deleteColumn', $event)\"></ate-button>\n }\n @if (config().separator !== false) {\n <ate-separator />\n }\n\n <!-- Cell actions -->\n @if (config().toggleHeaderRow !== false) {\n <ate-button\n icon=\"toolbar\"\n [title]=\"t().toggleHeaderRow\"\n [active]=\"state().nodes.isTableHeaderRow\"\n [disabled]=\"!state().can.toggleHeaderRow\"\n (buttonClick)=\"onCommand('toggleHeaderRow', $event)\"></ate-button>\n }\n @if (config().toggleHeaderColumn !== false) {\n <ate-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)\"></ate-button>\n }\n @if (config().separator !== false && config().deleteTable !== false) {\n <ate-separator />\n }\n\n <!-- Table actions -->\n @if (config().deleteTable !== false) {\n <ate-button\n icon=\"delete_forever\"\n [title]=\"t().deleteTable\"\n variant=\"danger\"\n [disabled]=\"!state().can.deleteTable\"\n (buttonClick)=\"onCommand('deleteTable', $event)\"></ate-button>\n }\n </div>\n `,\n})\nexport class AteTableBubbleMenuComponent extends AteBaseBubbleMenu {\n // Alias for template\n readonly t = this.i18nService.table;\n\n config = input<AteTableBubbleMenuConfig>({\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) {\n return new DOMRect(0, 0, 0, 0);\n }\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 =\n 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) {\n return table.getBoundingClientRect();\n }\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 { AteButtonComponent } from \"../../ui/ate-button.component\";\nimport { AteBaseBubbleMenu } from \"../base/ate-base-bubble-menu\";\n\nimport { AteCellBubbleMenuConfig } from \"../../../models/ate-bubble-menu.model\";\n\n@Component({\n selector: \"ate-cell-bubble-menu\",\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, AteButtonComponent],\n template: `\n <div #menuRef class=\"bubble-menu\" (mousedown)=\"$event.preventDefault()\">\n <!-- Cell specific actions -->\n @if (config().mergeCells !== false && !state().selection.isSingleCell) {\n <ate-button\n icon=\"cell_merge\"\n [title]=\"i18n().table().mergeCells\"\n [disabled]=\"!state().can.mergeCells\"\n (buttonClick)=\"onCommand('mergeCells', $event)\"></ate-button>\n }\n @if (config().splitCell !== false && state().selection.isSingleCell) {\n <ate-button\n icon=\"split_scene\"\n [title]=\"i18n().table().splitCell\"\n [disabled]=\"!state().can.splitCell\"\n (buttonClick)=\"onCommand('splitCell', $event)\"></ate-button>\n }\n </div>\n `,\n})\nexport class AteCellBubbleMenuComponent extends AteBaseBubbleMenu {\n // Inputs\n config = input<AteCellBubbleMenuConfig>({});\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) {\n return new DOMRect(0, 0, 0, 0);\n }\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) {\n cells.push(el);\n }\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 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 { AteEditorCommandsService } from \"../../../services/ate-editor-commands.service\";\nimport { AteI18nService } from \"../../../services/ate-i18n.service\";\n\n/**\n * Base abstract class for Sub-Bubble Menus (Link, Color).\n * These menus are \"sub-menus\" of the main bubble menu or triggered/anchored by specific UI elements.\n */\n@Directive()\nexport abstract class AteBaseSubBubbleMenu implements OnInit, OnDestroy {\n protected readonly i18nService = inject(AteI18nService);\n protected readonly editorCommands = inject(AteEditorCommandsService);\n\n // Core Inputs\n editor = input.required<Editor>();\n\n // Required viewChild for the menu container\n menuRef = viewChild.required<ElementRef<HTMLDivElement>>(\"menuRef\");\n\n // Internal State\n protected tippyInstance: TippyInstance | null = null;\n protected updateTimeout: number | null = null;\n\n // Reactive state alias for templates\n readonly state = this.editorCommands.editorState;\n\n constructor() {\n // Reactive effect for menu updates (re-positioning)\n effect(() => {\n // Monitor editor state and specific sub-menu states\n this.state();\n this.onStateChange();\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 with sub-menu defaults.\n */\n protected initTippy() {\n if (!this.menuRef()?.nativeElement) {\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: \"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: 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 this.updateTimeout = setTimeout(() => {\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 protected showTippy() {\n if (this.tippyInstance) {\n this.tippyInstance.setProps({ getReferenceClientRect: () => this.getSelectionRect() });\n this.tippyInstance.show();\n }\n }\n\n /**\n * Helper to hide the Tippy instance.\n */\n protected hideTippy() {\n this.tippyInstance?.hide();\n }\n\n // --- Abstract methods & Hooks ---\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 * Hook to add reactive dependencies to the update cycle.\n */\n protected abstract onStateChange(): 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 {\n Component,\n ChangeDetectionStrategy,\n viewChild,\n ElementRef,\n signal,\n effect,\n inject,\n} from \"@angular/core\";\nimport { FormsModule } from \"@angular/forms\";\nimport { AteButtonComponent } from \"../../ui/ate-button.component\";\nimport { AteLinkService } from \"../../../services/ate-link.service\";\nimport { AteSeparatorComponent } from \"../../ui/ate-separator.component\";\nimport { AteBaseSubBubbleMenu } from \"../base/ate-base-sub-bubble-menu\";\n\n@Component({\n selector: \"ate-link-bubble-menu\",\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AteButtonComponent, AteSeparatorComponent, 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 <ate-button\n icon=\"check\"\n [title]=\"common().apply\"\n color=\"var(--ate-primary)\"\n [disabled]=\"!editUrl().trim()\"\n (buttonClick)=\"onApply($event)\"></ate-button>\n <ate-button\n icon=\"open_in_new\"\n [title]=\"t().openLink\"\n [disabled]=\"!currentUrl()\"\n (buttonClick)=\"onOpenLink($event)\"></ate-button>\n <ate-separator />\n <ate-button\n icon=\"link_off\"\n [title]=\"t().removeLink\"\n variant=\"danger\"\n [disabled]=\"!currentUrl()\"\n (buttonClick)=\"onRemove($event)\"></ate-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 AteLinkBubbleMenuComponent extends AteBaseSubBubbleMenu {\n private readonly linkSvc = inject(AteLinkService);\n\n readonly t = this.i18nService.bubbleMenu;\n readonly common = this.i18nService.common;\n\n linkInput = viewChild<ElementRef<HTMLInputElement>>(\"linkInput\");\n\n editUrl = signal(\"\");\n\n constructor() {\n super();\n\n // Reactive effect for URL sync\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\n protected override onStateChange() {\n this.linkSvc.editMode();\n this.linkSvc.menuTrigger();\n this.linkSvc.isInteracting();\n }\n\n override shouldShow(): boolean {\n const { selection, marks, isEditable, isFocused } = this.state();\n if (!isEditable) {\n return false;\n }\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 override getSelectionRect(): DOMRect {\n const trigger = this.linkSvc.menuTrigger();\n const ed = this.editor();\n if (!ed) {\n return new DOMRect(0, 0, 0, 0);\n }\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) {\n return rect;\n }\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) {\n return linkElement.getBoundingClientRect();\n }\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) {\n return rect;\n }\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 protected override onTippyHide() {\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 currentUrl() {\n return this.state().marks.linkHref || \"\";\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) {\n window.open(url, \"_blank\", \"noopener,noreferrer\");\n }\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 ElementRef,\n signal,\n inject,\n computed,\n viewChild,\n} from \"@angular/core\";\nimport { CommonModule } from \"@angular/common\";\nimport { FormsModule } from \"@angular/forms\";\nimport { Instance as TippyInstance } from \"tippy.js\";\nimport { AteColorPickerService } from \"../../../services/ate-color-picker.service\";\nimport { AteButtonComponent } from \"../../ui/ate-button.component\";\nimport { AteSeparatorComponent } from \"../../ui/ate-separator.component\";\nimport { AteBaseSubBubbleMenu } from \"../base/ate-base-sub-bubble-menu\";\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: \"ate-color-bubble-menu\",\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, FormsModule, AteButtonComponent, AteSeparatorComponent],\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 <ate-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)\"></ate-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 <ate-button\n class=\"btn-native-picker-trigger\"\n icon=\"colorize\"\n [title]=\"t().customColor\"\n [backgroundColor]=\"currentColor()\"\n (buttonClick)=\"triggerNativePicker($event)\"></ate-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 <ate-button\n icon=\"check\"\n [title]=\"common().apply\"\n color=\"var(--ate-primary)\"\n (buttonClick)=\"onApply($event)\"></ate-button>\n\n <ate-separator />\n\n <ate-button\n icon=\"format_color_reset\"\n [title]=\"t().clear\"\n variant=\"danger\"\n (buttonClick)=\"onClearColor($event)\"></ate-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 .ate-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 .ate-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 .ate-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 AteColorBubbleMenuComponent extends AteBaseSubBubbleMenu {\n private readonly colorPickerSvc = inject(AteColorPickerService);\n\n readonly t = this.i18nService.toolbar;\n readonly common = this.i18nService.common;\n readonly presets = PRESET_COLORS;\n\n private colorInputRef = viewChild<ElementRef<HTMLInputElement>>(\"colorInput\");\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 protected override onStateChange() {\n this.colorPickerSvc.editMode();\n this.colorPickerSvc.menuTrigger();\n this.colorPickerSvc.isInteracting();\n }\n\n override shouldShow(): boolean {\n const { isEditable } = this.state();\n if (!isEditable) {\n return false;\n }\n\n if (this.colorPickerSvc.editMode() !== null || this.colorPickerSvc.isInteracting()) {\n return true;\n }\n\n return false;\n }\n\n override getSelectionRect(): DOMRect {\n const trigger = this.colorPickerSvc.menuTrigger();\n const ed = this.editor();\n if (!ed) {\n return new DOMRect(0, 0, 0, 0);\n }\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) {\n return rect;\n }\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) {\n return colorElement.getBoundingClientRect();\n }\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) {\n return rect;\n }\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 protected override onTippyShow(_instance: TippyInstance) {\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 protected override onTippyHide(_instance: TippyInstance) {\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 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 (\n this.colorPickerSvc.normalizeColor(this.currentColor()) ===\n this.colorPickerSvc.normalizeColor(color)\n );\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(\"#\")) {\n value = \"#\" + value;\n }\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(\"#\")) {\n value = \"#\" + value;\n }\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 { AteSlashCommandItem } from \"../components/slash-commands/ate-slash-commands.component\";\nimport { AteI18nService } from \"../services/ate-i18n.service\";\nimport { AteEditorCommandsService } from \"../services/ate-editor-commands.service\";\n\n/**\n * Clés des commandes natives dans l'ordre d'affichage\n */\nexport const ATE_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 AteSlashCommandKey = (typeof ATE_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 AteSlashCommandsConfig extends Partial<Record<AteSlashCommandKey, boolean>> {\n /**\n * Liste de commandes supplémentaires à ajouter à la fin du menu\n */\n custom?: AteSlashCommandItem[];\n}\n\n/**\n * Configuration par défaut : toutes les commandes natives sont activées\n */\nexport const ATE_DEFAULT_SLASH_COMMANDS_CONFIG: AteSlashCommandsConfig = {\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: AteI18nService,\n commands: AteEditorCommandsService,\n imageOptions?: {\n quality?: number;\n maxWidth?: number;\n maxHeight?: number;\n allowedTypes?: string[];\n }\n): AteSlashCommandItem[] {\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: AteSlashCommandsConfig,\n i18n: AteI18nService,\n commands: AteEditorCommandsService,\n imageOptions?: {\n quality?: number;\n maxWidth?: number;\n maxHeight?: number;\n allowedTypes?: string[];\n }\n): AteSlashCommandItem[] {\n const allNatives = createDefaultSlashCommands(i18n, commands, imageOptions);\n const activeConfig = { ...ATE_DEFAULT_SLASH_COMMANDS_CONFIG, ...config };\n\n const filtered = allNatives.filter((_, index) => {\n const key = ATE_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 { AteI18nService } from \"../../services/ate-i18n.service\";\nimport { AteEditorCommandsService } from \"../../services/ate-editor-commands.service\";\nimport { createDefaultSlashCommands } from \"../../config/ate-slash-commands.config\";\nimport { Plugin, PluginKey } from \"@tiptap/pm/state\";\nimport { EditorView } from \"@tiptap/pm/view\";\n\nexport interface AteSlashCommandItem {\n title: string;\n description: string;\n icon: string;\n keywords: string[];\n command: (editor: Editor) => void;\n}\n\nexport interface AteCustomSlashCommands {\n commands?: AteSlashCommandItem[];\n}\n\n// Default command definitions are now centralized in src/lib/config/slash-commands.config.ts\n\n@Component({\n selector: \"ate-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 AteSlashCommandsComponent implements OnInit, OnDestroy {\n readonly i18nService = inject(AteI18nService);\n editor = input.required<Editor>();\n config = input<AteCustomSlashCommands | undefined>(undefined);\n\n menuRef = viewChild.required<ElementRef<HTMLDivElement>>(\"menuRef\");\n\n private tippyInstance: TippyInstance | null = null;\n private editorCommands = inject(AteEditorCommandsService);\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) {\n return;\n }\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) {\n return;\n }\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 private scrollToSelected() {\n // Scroll to the selected element\n const menuEl = this.menuRef()?.nativeElement;\n if (menuEl) {\n const selectedItem = menuEl.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: AteSlashCommandItem) {\n const ed = this.editor();\n if (!ed || !this.slashRange) {\n return;\n }\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\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 = 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 { AteButtonComponent } from \"../ui/ate-button.component\";\nimport { AteTranslations } from \"../../services/ate-i18n.service\";\n\n/**\n * Edit Toggle Component\n * Allows switching between editable and readonly modes\n */\n@Component({\n selector: \"ate-edit-toggle\",\n standalone: true,\n imports: [CommonModule, AteButtonComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"ate-edit-toggle-container\" [class.is-editable]=\"editable()\">\n <ate-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 AteEditToggleComponent {\n editable = input.required<boolean>();\n translations = input.required<AteTranslations>();\n editToggle = output<Event>();\n}\n","import { Directive } from \"@angular/core\";\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from \"@angular/forms\";\n\n/**\n * Noop Value Accessor Directive\n * @link https://medium.com/netanelbasal/forwarding-form-controls-to-custom-control-components-in-angular-701e8406cc55\n */\n@Directive({\n standalone: true,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n multi: true,\n useExisting: AteNoopValueAccessorDirective,\n },\n ],\n})\nexport class AteNoopValueAccessorDirective 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 { AteStateCalculator } from \"../../models/ate-editor-state.model\";\n\nexport const AteSelectionCalculator: AteStateCalculator = 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) {\n selectionType = \"text\";\n } else if (selection instanceof NodeSelection) {\n selectionType = \"node\";\n } else if (selection instanceof CellSelection) {\n selectionType = \"cell\";\n }\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 { AteStateCalculator } from \"../../models/ate-editor-state.model\";\nimport { normalizeColor } from \"../../utils/ate-color.utils\";\n\nexport const AteMarksCalculator: AteStateCalculator = 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) {\n return null;\n }\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 =\n 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) {\n return null;\n }\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 ??\n 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 &&\n !isInsideInlineCode &&\n (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 { AteStateCalculator } from \"../../models/ate-editor-state.model\";\n\nexport const AteTableCalculator: AteStateCalculator = 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:\n 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 { AteStateCalculator } from \"../../models/ate-editor-state.model\";\n\nexport const AteImageCalculator: AteStateCalculator = editor => {\n return {\n nodes: {\n isImage: editor.isActive(\"image\") || editor.isActive(\"resizableImage\"),\n },\n };\n};\n","import { AteStateCalculator } from \"../../models/ate-editor-state.model\";\n\nexport const AteStructureCalculator: AteStateCalculator = 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 { AteStateCalculator } from \"../../models/ate-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 AteDiscoveryCalculator: AteStateCalculator = (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 (\n [\n \"selection\",\n \"editable\",\n \"focus\",\n \"undo\",\n \"redo\",\n \"history\",\n \"placeholder\",\n \"characterCount\",\n ].includes(name)\n ) {\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 AteLinkClickBehavior = 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\") {\n return false;\n }\n\n const isModKey = event.ctrlKey || event.metaKey;\n\n // If editor is editable, only proceed if Ctrl/Cmd is pressed\n if (view.editable && !isModKey) {\n return false;\n }\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 { AteToolbarConfig } from \"../models/ate-toolbar.model\";\nimport {\n AteBubbleMenuConfig,\n AteImageBubbleMenuConfig,\n AteTableBubbleMenuConfig,\n AteCellBubbleMenuConfig,\n} from \"../models/ate-bubble-menu.model\";\n\n// Default toolbar configuration\nexport const ATE_DEFAULT_TOOLBAR_CONFIG: AteToolbarConfig = {\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 ATE_DEFAULT_BUBBLE_MENU_CONFIG: AteBubbleMenuConfig = {\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 ATE_DEFAULT_IMAGE_BUBBLE_MENU_CONFIG: AteImageBubbleMenuConfig = {\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 ATE_DEFAULT_TABLE_MENU_CONFIG: AteTableBubbleMenuConfig = {\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 ATE_DEFAULT_CELL_MENU_CONFIG: AteCellBubbleMenuConfig = {\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 { AteResizableImage } from \"../../extensions/ate-resizable-image.extension\";\nimport { AteUploadProgress } from \"../../extensions/ate-upload-progress.extension\";\nimport { AteTableExtension } from \"../../extensions/ate-table.extension\";\nimport { AteTiptapStateExtension } from \"../../extensions/ate-tiptap-state.extension\";\nimport { AteToolbarComponent } from \"../toolbar/ate-toolbar.component\";\nimport { AteBubbleMenuComponent } from \"../bubble-menus/text/ate-bubble-menu.component\";\nimport { AteImageBubbleMenuComponent } from \"../bubble-menus/image/ate-image-bubble-menu.component\";\nimport { AteTableBubbleMenuComponent } from \"../bubble-menus/table/ate-table-bubble-menu.component\";\nimport { AteCellBubbleMenuComponent } from \"../bubble-menus/table/ate-cell-bubble-menu.component\";\nimport { AteLinkBubbleMenuComponent } from \"../bubble-menus/link/ate-link-bubble-menu.component\";\nimport { AteColorBubbleMenuComponent } from \"../bubble-menus/color/ate-color-bubble-menu.component\";\nimport {\n AteSlashCommandsComponent,\n AteCustomSlashCommands,\n} from \"../slash-commands/ate-slash-commands.component\";\nimport { AteEditToggleComponent } from \"../edit-toggle/ate-edit-toggle.component\";\nimport { AteImageService } from \"../../services/ate-image.service\";\nimport { AteI18nService, SupportedLocale } from \"../../services/ate-i18n.service\";\nimport { AteEditorCommandsService } from \"../../services/ate-editor-commands.service\";\nimport { AteColorPickerService } from \"../../services/ate-color-picker.service\";\nimport { AteLinkService } from \"../../services/ate-link.service\";\nimport { AteNoopValueAccessorDirective } from \"../../directives/ate-noop-value-accessor.directive\";\nimport { AteStateCalculator } from \"../../models/ate-editor-state.model\";\nimport { NgControl } from \"@angular/forms\";\nimport {\n filterSlashCommands,\n AteSlashCommandsConfig,\n} from \"../../config/ate-slash-commands.config\";\n\nimport { AteSelectionCalculator } from \"../../extensions/calculators/ate-selection.calculator\";\nimport { AteMarksCalculator } from \"../../extensions/calculators/ate-marks.calculator\";\nimport { AteTableCalculator } from \"../../extensions/calculators/ate-table.calculator\";\nimport { AteImageCalculator } from \"../../extensions/calculators/ate-image.calculator\";\nimport { AteStructureCalculator } from \"../../extensions/calculators/ate-structure.calculator\";\nimport { AteDiscoveryCalculator } from \"../../extensions/calculators/ate-discovery.calculator\";\n\nimport { AteToolbarConfig } from \"../../models/ate-toolbar.model\";\nimport {\n AteBubbleMenuConfig,\n AteImageBubbleMenuConfig,\n AteTableBubbleMenuConfig,\n AteCellBubbleMenuConfig,\n} from \"../../models/ate-bubble-menu.model\";\nimport { AteEditorConfig } from \"../../models/ate-editor-config.model\";\nimport { AteLinkClickBehavior } from \"../../extensions/ate-link-click-behavior.extension\";\nimport {\n ATE_DEFAULT_TOOLBAR_CONFIG,\n ATE_DEFAULT_BUBBLE_MENU_CONFIG,\n ATE_DEFAULT_IMAGE_BUBBLE_MENU_CONFIG,\n ATE_DEFAULT_TABLE_MENU_CONFIG,\n ATE_DEFAULT_CELL_MENU_CONFIG,\n} from \"../../config/ate-editor.config\";\nimport { concat, defer, Observable, of, tap } from \"rxjs\";\nimport { AteImageUploadHandler, AteImageUploadOptions } from \"../../models/ate-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: [AteNoopValueAccessorDirective],\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 AteToolbarComponent,\n AteBubbleMenuComponent,\n AteImageBubbleMenuComponent,\n AteTableBubbleMenuComponent,\n AteCellBubbleMenuComponent,\n AteSlashCommandsComponent,\n AteLinkBubbleMenuComponent,\n AteColorBubbleMenuComponent,\n AteEditToggleComponent,\n ],\n providers: [AteEditorCommandsService, AteImageService, AteColorPickerService, AteLinkService],\n template: `\n <div class=\"ate-editor\">\n <!-- Toolbar -->\n @if (finalEditable() && !mergedDisabled() && finalShowToolbar() && editor()) {\n <ate-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 <ate-edit-toggle\n [editable]=\"finalEditable()\"\n [translations]=\"currentTranslations()\"\n (editToggle)=\"toggleEditMode($event)\" />\n }\n\n <!-- Editor Content -->\n <div\n #editorElement\n class=\"ate-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 <ate-bubble-menu\n [editor]=\"editor()!\"\n [config]=\"finalBubbleMenuConfig()\"\n [style.display]=\"editorFullyInitialized() ? 'block' : 'none'\"></ate-bubble-menu>\n }\n\n <!-- Image Bubble Menu -->\n @if (finalEditable() && finalShowImageBubbleMenu() && editor()) {\n <ate-image-bubble-menu\n [editor]=\"editor()!\"\n [config]=\"finalImageBubbleMenuConfig()\"\n [imageUpload]=\"finalImageUploadConfig()\"\n [style.display]=\"editorFullyInitialized() ? 'block' : 'none'\"></ate-image-bubble-menu>\n }\n\n <!-- Link Bubble Menu -->\n @if (finalEditable() && editor()) {\n <ate-link-bubble-menu\n [editor]=\"editor()!\"\n [style.display]=\"editorFullyInitialized() ? 'block' : 'none'\"></ate-link-bubble-menu>\n }\n\n <!-- Color Bubble Menu -->\n @if (finalEditable() && editor()) {\n <ate-color-bubble-menu\n [editor]=\"editor()!\"\n [style.display]=\"editorFullyInitialized() ? 'block' : 'none'\"></ate-color-bubble-menu>\n }\n\n <!-- Slash Commands -->\n @if (finalEditable() && finalEnableSlashCommands() && editor()) {\n <ate-slash-commands\n [editor]=\"editor()!\"\n [config]=\"finalSlashCommandsConfig()\"\n [style.display]=\"editorFullyInitialized() ? 'block' : 'none'\"></ate-slash-commands>\n }\n\n <!-- Table Menu -->\n @if (finalEditable() && finalShowTableBubbleMenu() && editor()) {\n <ate-table-bubble-menu\n [editor]=\"editor()!\"\n [config]=\"finalTableBubbleMenuConfig()\"\n [style.display]=\"editorFullyInitialized() ? 'block' : 'none'\"></ate-table-bubble-menu>\n }\n\n <!-- Cell Menu -->\n @if (finalEditable() && finalShowCellBubbleMenu() && editor()) {\n <ate-cell-bubble-menu\n [editor]=\"editor()!\"\n [config]=\"finalCellBubbleMenuConfig()\"\n [style.display]=\"editorFullyInitialized() ? 'block' : 'none'\"></ate-cell-bubble-menu>\n }\n\n <!-- Counters -->\n @if (\n finalEditable() &&\n !mergedDisabled() &&\n finalShowFooter() &&\n (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 .ate-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) .ate-editor {\n overflow: visible;\n }\n\n /* Fill container mode - editor fills its parent */\n :host(.fill-container) .ate-editor {\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n\n :host(.fill-container) .ate-content-wrapper {\n flex: 1;\n min-height: 0;\n }\n\n :host(.fill-container) .ate-content {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n }\n\n .ate-editor:focus-within {\n border-color: var(--ate-focus-color);\n }\n\n /* Editor content area */\n .ate-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) .ate-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) .ate-content {\n cursor: default;\n user-select: text;\n }\n\n :host(.is-readonly) .ate-content ::ng-deep .ate-link {\n cursor: pointer;\n pointer-events: auto;\n }\n\n .ate-content::-webkit-scrollbar {\n width: var(--ate-scrollbar-width);\n }\n\n .ate-content-wrapper {\n position: relative;\n display: flex;\n flex-direction: column;\n min-height: 0;\n }\n\n .ate-content-wrapper .ate-content {\n flex: 1;\n }\n\n .ate-content::-webkit-scrollbar-track {\n background: var(--ate-scrollbar-track);\n }\n\n .ate-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 .ate-content::-webkit-scrollbar-thumb:hover {\n background: var(--ate-scrollbar-thumb-hover);\n background-clip: content-box;\n }\n\n .ate-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<AteSlashCommandsConfig>({});\n customSlashCommands = input<AteCustomSlashCommands | 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<AteBubbleMenuConfig>>(ATE_DEFAULT_BUBBLE_MENU_CONFIG);\n showImageBubbleMenu = input<boolean>(true);\n imageBubbleMenu = input<Partial<AteImageBubbleMenuConfig>>(ATE_DEFAULT_IMAGE_BUBBLE_MENU_CONFIG);\n\n // Configuration de la toolbar\n toolbar = input<Partial<AteToolbarConfig>>({});\n\n // Configuration des menus de table\n showTableBubbleMenu = input<boolean>(true);\n tableBubbleMenu = input<Partial<AteTableBubbleMenuConfig>>(ATE_DEFAULT_TABLE_MENU_CONFIG);\n showCellBubbleMenu = input<boolean>(true);\n cellBubbleMenu = input<Partial<AteCellBubbleMenuConfig>>(ATE_DEFAULT_CELL_MENU_CONFIG);\n\n /**\n * Additionnal state calculators to extend the reactive editor state.\n */\n stateCalculators = input<AteStateCalculator[]>([]);\n\n // Nouveau input pour la configuration de l'upload d'images\n imageUpload = input<Partial<AteImageUploadOptions>>({});\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<AteImageUploadHandler | 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(\n () => (this.config().disabled ?? this.disabled()) || this.isFormControlDisabled()\n );\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) {\n return fromConfig === \"seamless\";\n }\n return this.seamless();\n });\n\n readonly finalEditable = computed(() => this.config().editable ?? this.editable());\n readonly finalPlaceholder = computed(\n () =>\n this.config().placeholder ??\n (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(\n () => this.config().showEditToggle ?? this.showEditToggle()\n );\n\n readonly finalHeight = computed(\n () => this.config().height ?? (this.height() ? `${this.height()}px` : undefined)\n );\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(\n () => this.config().enableOfficePaste ?? this.enableOfficePaste()\n );\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 = ATE_DEFAULT_TOOLBAR_CONFIG;\n if (fromConfig) {\n return { ...base, ...fromConfig };\n }\n const fromInput = this.toolbar();\n return Object.keys(fromInput).length === 0 ? base : { ...base, ...fromInput };\n });\n\n readonly finalFloatingToolbar = computed(\n () => this.config().floatingToolbar ?? this.floatingToolbar()\n );\n\n readonly finalShowBubbleMenu = computed(\n () => this.config().showBubbleMenu ?? this.showBubbleMenu()\n );\n\n readonly finalBubbleMenuConfig = computed(() => {\n const fromConfig = this.config().bubbleMenu;\n const base = ATE_DEFAULT_BUBBLE_MENU_CONFIG;\n if (fromConfig) {\n return { ...base, ...fromConfig };\n }\n return Object.keys(this.bubbleMenu()).length === 0 ? base : { ...base, ...this.bubbleMenu() };\n });\n\n readonly finalShowImageBubbleMenu = computed(\n () => this.config().showImageBubbleMenu ?? this.showImageBubbleMenu()\n );\n\n readonly finalImageBubbleMenuConfig = computed(() => {\n const fromConfig = this.config().imageBubbleMenu;\n const base = ATE_DEFAULT_IMAGE_BUBBLE_MENU_CONFIG;\n if (fromConfig) {\n return { ...base, ...fromConfig };\n }\n return Object.keys(this.imageBubbleMenu()).length === 0\n ? base\n : { ...base, ...this.imageBubbleMenu() };\n });\n\n readonly finalShowTableBubbleMenu = computed(\n () => this.config().showTableMenu ?? this.showTableBubbleMenu()\n );\n\n readonly finalTableBubbleMenuConfig = computed(() => {\n const fromConfig = this.config().tableBubbleMenu;\n const base = ATE_DEFAULT_TABLE_MENU_CONFIG;\n if (fromConfig) {\n return { ...base, ...fromConfig };\n }\n return Object.keys(this.tableBubbleMenu()).length === 0\n ? base\n : { ...base, ...this.tableBubbleMenu() };\n });\n\n readonly finalShowCellBubbleMenu = computed(\n () => this.config().showCellMenu ?? this.showCellBubbleMenu()\n );\n\n readonly finalCellBubbleMenuConfig = computed(() => {\n const fromConfig = this.config().cellBubbleMenu;\n const base = ATE_DEFAULT_CELL_MENU_CONFIG;\n if (fromConfig) {\n return { ...base, ...fromConfig };\n }\n return Object.keys(this.cellBubbleMenu()).length === 0\n ? base\n : { ...base, ...this.cellBubbleMenu() };\n });\n\n readonly finalEnableSlashCommands = computed(\n () => this.config().enableSlashCommands ?? this.enableSlashCommands()\n );\n\n readonly finalSlashCommandsConfig = computed(() => {\n const fromConfig = this.config().slashCommands;\n const customConfig = this.customSlashCommands();\n\n if (customConfig) {\n return customConfig;\n }\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(\n () => this.config().showCharacterCount ?? this.showCharacterCount()\n );\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(\n () => this.config().imageUpload?.handler ?? this.imageUploadHandler()\n );\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(AteI18nService);\n readonly editorCommandsService = inject(AteEditorCommandsService);\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) {\n return;\n }\n\n // Anti-écho : on ignore ce qu'on vient d'émettre nous-mêmes\n if (content === this.lastEmittedHtml) {\n return;\n }\n\n // Double sécurité : on vérifie le contenu actuel de l'éditeur\n if (content === editor.getHTML()) {\n return;\n }\n\n // Do not overwrite content if we have a FormControl and content is empty\n if (hasFormControl && !content) {\n return;\n }\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(\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: \"ate-link\",\n },\n }),\n AteLinkClickBehavior,\n Highlight.configure({\n multicolor: true,\n HTMLAttributes: {\n class: \"ate-highlight\",\n },\n }),\n AteResizableImage.configure({\n inline: false,\n allowBase64: true,\n HTMLAttributes: {\n class: \"ate-image\",\n },\n }),\n AteUploadProgress.configure({\n isUploading: () => this.editorCommandsService.isUploading(),\n uploadProgress: () => this.editorCommandsService.uploadProgress(),\n uploadMessage: () => this.editorCommandsService.uploadMessage(),\n }),\n AteTableExtension,\n AteTiptapStateExtension.configure({\n onUpdate: state => this.editorCommandsService.updateState(state),\n calculators: [\n AteSelectionCalculator,\n AteMarksCalculator,\n AteTableCalculator,\n AteImageCalculator,\n AteStructureCalculator,\n AteDiscoveryCalculator,\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 { name?: string })?.name)\n .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 (\n (this.finalShowCharacterCount() || this.finalShowWordCount()) &&\n editor.storage[\"characterCount\"]\n ) {\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()) {\n return;\n }\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(\"ate-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","import { Editor } from \"@tiptap/core\";\n\n/**\n * Clés des boutons de la barre d'outils native\n */\nexport const ATE_TOOLBAR_KEYS = [\n \"bold\",\n \"italic\",\n \"underline\",\n \"strike\",\n \"code\",\n \"codeBlock\",\n \"superscript\",\n \"subscript\",\n \"highlight\",\n \"highlightPicker\",\n \"heading1\",\n \"heading2\",\n \"heading3\",\n \"bulletList\",\n \"orderedList\",\n \"blockquote\",\n \"alignLeft\",\n \"alignCenter\",\n \"alignRight\",\n \"alignJustify\",\n \"link\",\n \"image\",\n \"horizontalRule\",\n \"table\",\n \"undo\",\n \"redo\",\n \"clear\",\n \"textColor\",\n \"separator\",\n] as const;\n\nexport type AteToolbarKey = (typeof ATE_TOOLBAR_KEYS)[number];\n\nexport interface AteToolbarConfig extends Partial<Record<AteToolbarKey, boolean>> {\n /**\n * Boutons personnalisés à ajouter\n */\n custom?: AteCustomToolbarItem[];\n}\n\nexport interface AteCustomToolbarItem {\n key: string;\n label: string;\n icon: string;\n command: (editor: Editor) => void | Promise<void>;\n}\n","import { Editor } from \"@tiptap/core\";\n\n/**\n * Clés des options du menu bulle de texte\n */\nexport const ATE_BUBBLE_MENU_KEYS = [\n \"bold\",\n \"italic\",\n \"underline\",\n \"strike\",\n \"code\",\n \"superscript\",\n \"subscript\",\n \"highlight\",\n \"highlightPicker\",\n \"textColor\",\n \"link\",\n \"separator\",\n] as const;\n\nexport type AteBubbleMenuKey = (typeof ATE_BUBBLE_MENU_KEYS)[number];\n\nexport interface AteBubbleMenuConfig extends Partial<Record<AteBubbleMenuKey, boolean>> {\n custom?: AteCustomBubbleMenuItem[];\n}\n\nexport interface AteCustomBubbleMenuItem {\n key: string;\n label: string;\n icon: string;\n command: (editor: Editor) => void | Promise<void>;\n}\n\n/**\n * Clés des options du menu bulle d'image\n */\nexport const ATE_IMAGE_BUBBLE_MENU_KEYS = [\n \"changeImage\",\n \"resizeSmall\",\n \"resizeMedium\",\n \"resizeLarge\",\n \"resizeOriginal\",\n \"deleteImage\",\n \"separator\",\n] as const;\n\nexport type AteImageBubbleMenuKey = (typeof ATE_IMAGE_BUBBLE_MENU_KEYS)[number];\n\nexport type AteImageBubbleMenuConfig = Partial<Record<AteImageBubbleMenuKey, boolean>>;\n\n/**\n * Clés des options du menu de table\n */\nexport const ATE_TABLE_BUBBLE_MENU_KEYS = [\n \"addRowBefore\",\n \"addRowAfter\",\n \"deleteRow\",\n \"addColumnBefore\",\n \"addColumnAfter\",\n \"deleteColumn\",\n \"deleteTable\",\n \"toggleHeaderRow\",\n \"toggleHeaderColumn\",\n \"separator\",\n] as const;\n\nexport type AteTableBubbleMenuKey = (typeof ATE_TABLE_BUBBLE_MENU_KEYS)[number];\n\nexport type AteTableBubbleMenuConfig = Partial<Record<AteTableBubbleMenuKey, boolean>>;\n\n/**\n * Clés des options du menu de cellule\n */\nexport const ATE_CELL_BUBBLE_MENU_KEYS = [\"mergeCells\", \"splitCell\"] as const;\n\nexport type AteCellBubbleMenuKey = (typeof ATE_CELL_BUBBLE_MENU_KEYS)[number];\n\nexport type AteCellBubbleMenuConfig = Partial<Record<AteCellBubbleMenuKey, boolean>>;\n","/*\n * Public API Surface of tiptap-editor\n */\n\n// Main component\nexport * from \"./lib/components/editor/angular-tiptap-editor.component\";\n\n// Host directive for FormControl integration (Required by Angular)\nexport * from \"./lib/directives/ate-noop-value-accessor.directive\";\n\n// Services\nexport * from \"./lib/services/ate-i18n.service\";\nexport * from \"./lib/services/ate-editor-commands.service\";\nexport * from \"./lib/services/ate-image.service\";\nexport * from \"./lib/services/ate-color-picker.service\";\nexport * from \"./lib/services/ate-link.service\";\n\n// State & Calculators (Essential for custom plugins)\nexport * from \"./lib/models/ate-editor-state.model\";\nexport * from \"./lib/extensions/calculators/ate-discovery.calculator\";\nexport * from \"./lib/extensions/calculators/ate-image.calculator\";\nexport * from \"./lib/extensions/calculators/ate-marks.calculator\";\nexport * from \"./lib/extensions/calculators/ate-selection.calculator\";\nexport * from \"./lib/extensions/calculators/ate-structure.calculator\";\nexport * from \"./lib/extensions/calculators/ate-table.calculator\";\n\n// Types and interfaces for configuration\nexport * from \"./lib/models/ate-toolbar.model\";\nexport * from \"./lib/models/ate-image.model\";\nexport * from \"./lib/models/ate-bubble-menu.model\";\nexport * from \"./lib/models/ate-editor-config.model\";\nexport type {\n AteCustomSlashCommands,\n AteSlashCommandItem,\n} from \"./lib/components/slash-commands/ate-slash-commands.component\";\n\n// Default configurations\nexport * from \"./lib/config/ate-editor.config\";\n\n// Utility functions for slash commands\nexport * from \"./lib/config/ate-slash-commands.config\";\n\n// Translations\nexport type { SupportedLocale } from \"./lib/services/ate-i18n.service\";\n\n// ============================================\n// Deprecated Aliases (to be removed in v3.0.0)\n// ============================================\n\nimport { AteI18nService } from \"./lib/services/ate-i18n.service\";\nimport { AteEditorCommandsService } from \"./lib/services/ate-editor-commands.service\";\nimport { AteImageService } from \"./lib/services/ate-image.service\";\nimport { AteColorPickerService } from \"./lib/services/ate-color-picker.service\";\nimport { AteLinkService } from \"./lib/services/ate-link.service\";\nimport {\n AteEditorStateSnapshot,\n ATE_INITIAL_EDITOR_STATE,\n} from \"./lib/models/ate-editor-state.model\";\nimport { AteToolbarConfig } from \"./lib/models/ate-toolbar.model\";\nimport {\n AteBubbleMenuConfig,\n AteTableBubbleMenuConfig,\n AteCellBubbleMenuConfig,\n AteImageBubbleMenuConfig,\n} from \"./lib/models/ate-bubble-menu.model\";\nimport {\n AteSlashCommandsConfig,\n AteSlashCommandKey,\n ATE_SLASH_COMMAND_KEYS,\n ATE_DEFAULT_SLASH_COMMANDS_CONFIG,\n} from \"./lib/config/ate-slash-commands.config\";\nimport { AteEditorConfig } from \"./lib/models/ate-editor-config.model\";\nimport {\n AteImageUploadOptions,\n AteImageUploadHandler,\n AteImageUploadResult,\n AteImageData,\n AteResizeOptions,\n} from \"./lib/models/ate-image.model\";\nimport {\n AteCustomSlashCommands,\n AteSlashCommandItem,\n} from \"./lib/components/slash-commands/ate-slash-commands.component\";\nimport { AteDiscoveryCalculator } from \"./lib/extensions/calculators/ate-discovery.calculator\";\nimport { AteImageCalculator } from \"./lib/extensions/calculators/ate-image.calculator\";\nimport { AteMarksCalculator } from \"./lib/extensions/calculators/ate-marks.calculator\";\nimport { AteSelectionCalculator } from \"./lib/extensions/calculators/ate-selection.calculator\";\nimport { AteStructureCalculator } from \"./lib/extensions/calculators/ate-structure.calculator\";\nimport { AteTableCalculator } from \"./lib/extensions/calculators/ate-table.calculator\";\nimport {\n ATE_DEFAULT_TOOLBAR_CONFIG,\n ATE_DEFAULT_BUBBLE_MENU_CONFIG,\n ATE_DEFAULT_IMAGE_BUBBLE_MENU_CONFIG,\n ATE_DEFAULT_TABLE_MENU_CONFIG,\n ATE_DEFAULT_CELL_MENU_CONFIG,\n} from \"./lib/config/ate-editor.config\";\n\n/** @deprecated Renamed to `AteI18nService`. This alias will be removed in v3.0.0. */\nexport { AteI18nService as TiptapI18nService };\n/** @deprecated Renamed to `AteEditorCommandsService`. This alias will be removed in v3.0.0. */\nexport { AteEditorCommandsService as EditorCommandsService };\n/** @deprecated Renamed to `AteImageService`. This alias will be removed in v3.0.0. */\nexport { AteImageService as ImageService };\n/** @deprecated Renamed to `AteColorPickerService`. This alias will be removed in v3.0.0. */\nexport { AteColorPickerService as ColorPickerService };\n/** @deprecated Renamed to `AteLinkService`. This alias will be removed in v3.0.0. */\nexport { AteLinkService as LinkService };\n\n/** @deprecated Renamed to `AteEditorStateSnapshot`. This alias will be removed in v3.0.0. */\nexport type { AteEditorStateSnapshot as EditorStateSnapshot };\n/** @deprecated Renamed to `ATE_INITIAL_EDITOR_STATE`. This alias will be removed in v3.0.0. */\nexport const INITIAL_EDITOR_STATE = ATE_INITIAL_EDITOR_STATE;\n\n/** @deprecated Renamed to `AteToolbarConfig`. This alias will be removed in v3.0.0. */\nexport type { AteToolbarConfig as ToolbarConfig };\n/** @deprecated Renamed to `AteBubbleMenuConfig`. This alias will be removed in v3.0.0. */\nexport type { AteBubbleMenuConfig as BubbleMenuConfig };\n/** @deprecated Renamed to `AteTableBubbleMenuConfig`. This alias will be removed in v3.0.0. */\nexport type { AteTableBubbleMenuConfig as TableBubbleMenuConfig };\n/** @deprecated Renamed to `AteCellBubbleMenuConfig`. This alias will be removed in v3.0.0. */\nexport type { AteCellBubbleMenuConfig as CellBubbleMenuConfig };\n/** @deprecated Renamed to `AteImageBubbleMenuConfig`. This alias will be removed in v3.0.0. */\nexport type { AteImageBubbleMenuConfig as ImageBubbleMenuConfig };\n\n/** @deprecated Renamed to `AteSlashCommandsConfig`. This alias will be removed in v3.0.0. */\nexport type { AteSlashCommandsConfig as SlashCommandsConfig };\n/** @deprecated Renamed to `AteSlashCommandKey`. This alias will be removed in v3.0.0. */\nexport type { AteSlashCommandKey as SlashCommandKey };\n/** @deprecated Renamed to `ATE_SLASH_COMMAND_KEYS`. This alias will be removed in v3.0.0. */\nexport const SLASH_COMMAND_KEYS = ATE_SLASH_COMMAND_KEYS;\n/** @deprecated Renamed to `ATE_DEFAULT_SLASH_COMMANDS_CONFIG`. This alias will be removed in v3.0.0. */\nexport const DEFAULT_SLASH_COMMANDS_CONFIG = ATE_DEFAULT_SLASH_COMMANDS_CONFIG;\n\n/** @deprecated Renamed to `AteEditorConfig`. This alias will be removed in v3.0.0. */\nexport type { AteEditorConfig as EditorConfig };\n\n/** @deprecated Renamed to `AteImageUploadOptions`. This alias will be removed in v3.0.0. */\nexport type { AteImageUploadOptions as ImageUploadOptions };\n/** @deprecated Renamed to `AteImageUploadHandler`. This alias will be removed in v3.0.0. */\nexport type { AteImageUploadHandler as ImageUploadHandler };\n/** @deprecated Renamed to `AteImageUploadResult`. This alias will be removed in v3.0.0. */\nexport type { AteImageUploadResult as ImageUploadResult };\n/** @deprecated Renamed to `AteImageData`. This alias will be removed in v3.0.0. */\nexport type { AteImageData as ImageData };\n/** @deprecated Renamed to `AteResizeOptions`. This alias will be removed in v3.0.0. */\nexport type { AteResizeOptions as ResizeOptions };\n\n/** @deprecated Renamed to `AteCustomSlashCommands`. This alias will be removed in v3.0.0. */\nexport type { AteCustomSlashCommands as CustomSlashCommands };\n/** @deprecated Renamed to `AteSlashCommandItem`. This alias will be removed in v3.0.0. */\nexport type { AteSlashCommandItem as SlashCommandItem };\n\n/** @deprecated Renamed to `AteDiscoveryCalculator`. This alias will be removed in v3.0.0. */\nexport const DiscoveryCalculator = AteDiscoveryCalculator;\n/** @deprecated Renamed to `AteImageCalculator`. This alias will be removed in v3.0.0. */\nexport const ImageCalculator = AteImageCalculator;\n/** @deprecated Renamed to `AteMarksCalculator`. This alias will be removed in v3.0.0. */\nexport const MarksCalculator = AteMarksCalculator;\n/** @deprecated Renamed to `AteSelectionCalculator`. This alias will be removed in v3.0.0. */\nexport const SelectionCalculator = AteSelectionCalculator;\n/** @deprecated Renamed to `AteStructureCalculator`. This alias will be removed in v3.0.0. */\nexport const StructureCalculator = AteStructureCalculator;\n/** @deprecated Renamed to `AteTableCalculator`. This alias will be removed in v3.0.0. */\nexport const TableCalculator = AteTableCalculator;\n\n/** @deprecated Renamed to `ATE_DEFAULT_TOOLBAR_CONFIG`. This alias will be removed in v3.0.0. */\nexport const DEFAULT_TOOLBAR_CONFIG = ATE_DEFAULT_TOOLBAR_CONFIG;\n/** @deprecated Renamed to `ATE_DEFAULT_BUBBLE_MENU_CONFIG`. This alias will be removed in v3.0.0. */\nexport const DEFAULT_BUBBLE_MENU_CONFIG = ATE_DEFAULT_BUBBLE_MENU_CONFIG;\n/** @deprecated Renamed to `ATE_DEFAULT_IMAGE_BUBBLE_MENU_CONFIG`. This alias will be removed in v3.0.0. */\nexport const DEFAULT_IMAGE_BUBBLE_MENU_CONFIG = ATE_DEFAULT_IMAGE_BUBBLE_MENU_CONFIG;\n/** @deprecated Renamed to `ATE_DEFAULT_TABLE_MENU_CONFIG`. This alias will be removed in v3.0.0. */\nexport const DEFAULT_TABLE_MENU_CONFIG = ATE_DEFAULT_TABLE_MENU_CONFIG;\n/** @deprecated Renamed to `ATE_DEFAULT_CELL_MENU_CONFIG`. This alias will be removed in v3.0.0. */\nexport const DEFAULT_CELL_MENU_CONFIG = ATE_DEFAULT_CELL_MENU_CONFIG;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["Node","i1.AteNoopValueAccessorDirective"],"mappings":"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"}
1
+ {"version":3,"file":"flogeez-angular-tiptap-editor.mjs","sources":["../../../projects/angular-tiptap-editor/src/lib/extensions/ate-resizable-image.extension.ts","../../../projects/angular-tiptap-editor/src/lib/extensions/ate-upload-progress.extension.ts","../../../projects/angular-tiptap-editor/src/lib/extensions/ate-table.extension.ts","../../../projects/angular-tiptap-editor/src/lib/models/ate-editor-state.model.ts","../../../projects/angular-tiptap-editor/src/lib/extensions/ate-tiptap-state.extension.ts","../../../projects/angular-tiptap-editor/src/lib/components/ui/ate-button.component.ts","../../../projects/angular-tiptap-editor/src/lib/components/ui/ate-separator.component.ts","../../../projects/angular-tiptap-editor/src/lib/services/ate-i18n.service.ts","../../../projects/angular-tiptap-editor/src/lib/services/ate-image.service.ts","../../../projects/angular-tiptap-editor/src/lib/utils/ate-color.utils.ts","../../../projects/angular-tiptap-editor/src/lib/services/ate-color-picker.service.ts","../../../projects/angular-tiptap-editor/src/lib/services/ate-link.service.ts","../../../projects/angular-tiptap-editor/src/lib/services/ate-editor-commands.service.ts","../../../projects/angular-tiptap-editor/src/lib/components/color-picker/ate-color-picker.component.ts","../../../projects/angular-tiptap-editor/src/lib/components/toolbar/ate-toolbar.component.ts","../../../projects/angular-tiptap-editor/src/lib/components/bubble-menus/base/ate-base-bubble-menu.ts","../../../projects/angular-tiptap-editor/src/lib/components/bubble-menus/text/ate-bubble-menu.component.ts","../../../projects/angular-tiptap-editor/src/lib/components/bubble-menus/image/ate-image-bubble-menu.component.ts","../../../projects/angular-tiptap-editor/src/lib/components/bubble-menus/table/ate-table-bubble-menu.component.ts","../../../projects/angular-tiptap-editor/src/lib/components/bubble-menus/table/ate-cell-bubble-menu.component.ts","../../../projects/angular-tiptap-editor/src/lib/components/bubble-menus/base/ate-base-sub-bubble-menu.ts","../../../projects/angular-tiptap-editor/src/lib/components/bubble-menus/link/ate-link-bubble-menu.component.ts","../../../projects/angular-tiptap-editor/src/lib/components/bubble-menus/color/ate-color-bubble-menu.component.ts","../../../projects/angular-tiptap-editor/src/lib/config/ate-slash-commands.config.ts","../../../projects/angular-tiptap-editor/src/lib/components/slash-commands/ate-slash-commands.component.ts","../../../projects/angular-tiptap-editor/src/lib/components/edit-toggle/ate-edit-toggle.component.ts","../../../projects/angular-tiptap-editor/src/lib/directives/ate-noop-value-accessor.directive.ts","../../../projects/angular-tiptap-editor/src/lib/extensions/calculators/ate-selection.calculator.ts","../../../projects/angular-tiptap-editor/src/lib/extensions/calculators/ate-marks.calculator.ts","../../../projects/angular-tiptap-editor/src/lib/extensions/calculators/ate-table.calculator.ts","../../../projects/angular-tiptap-editor/src/lib/extensions/calculators/ate-image.calculator.ts","../../../projects/angular-tiptap-editor/src/lib/extensions/calculators/ate-structure.calculator.ts","../../../projects/angular-tiptap-editor/src/lib/extensions/calculators/ate-discovery.calculator.ts","../../../projects/angular-tiptap-editor/src/lib/extensions/ate-link-click-behavior.extension.ts","../../../projects/angular-tiptap-editor/src/lib/config/ate-editor.config.ts","../../../projects/angular-tiptap-editor/src/lib/components/editor/angular-tiptap-editor.component.ts","../../../projects/angular-tiptap-editor/src/lib/models/ate-toolbar.model.ts","../../../projects/angular-tiptap-editor/src/lib/models/ate-bubble-menu.model.ts","../../../projects/angular-tiptap-editor/src/lib/node-view/ate-angular-node-view.ts","../../../projects/angular-tiptap-editor/src/lib/node-view/ate-node-view.renderer.ts","../../../projects/angular-tiptap-editor/src/lib/node-view/ate-node-view.factory.ts","../../../projects/angular-tiptap-editor/src/lib/node-view/ate-register-angular-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 AteResizableImageOptions {\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 AteResizableImage = Node.create<AteResizableImageOptions>({\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 = \"ate-image\";\n\n if (node.attrs[\"width\"]) {\n img.width = node.attrs[\"width\"];\n }\n if (node.attrs[\"height\"]) {\n img.height = node.attrs[\"height\"];\n }\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\") || node.attrs[\"width\"] || img.naturalWidth;\n startHeight =\n 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) {\n return;\n }\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\") {\n return false;\n }\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 }\n if (updatedNode.attrs[\"height\"]) {\n img.height = updatedNode.attrs[\"height\"];\n }\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 AteUploadProgressOptions {\n isUploading: () => boolean;\n uploadProgress: () => number;\n uploadMessage: () => string;\n}\n\nexport const AteUploadProgress = Extension.create<AteUploadProgressOptions>({\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 AteTableExtension = 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 AteStateCalculator = (editor: Editor) => Partial<{\n [K in keyof AteEditorStateSnapshot]: AteEditorStateSnapshot[K] extends object\n ? Partial<AteEditorStateSnapshot[K]>\n : AteEditorStateSnapshot[K];\n}>;\n\nexport interface AteEditorStateSnapshot {\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 ATE_INITIAL_EDITOR_STATE: AteEditorStateSnapshot = {\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 {\n AteEditorStateSnapshot,\n ATE_INITIAL_EDITOR_STATE,\n AteStateCalculator,\n} from \"../models/ate-editor-state.model\";\n\nexport interface AteTiptapStateOptions {\n onUpdate?: (state: AteEditorStateSnapshot) => void;\n calculators: AteStateCalculator[];\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) {\n return;\n }\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]) {\n target[key] = {};\n }\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(): AteEditorStateSnapshot {\n return JSON.parse(JSON.stringify(ATE_INITIAL_EDITOR_STATE));\n}\n\nexport const AteTiptapStateExtension = Extension.create<AteTiptapStateOptions>({\n name: \"ateTiptapState\",\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) {\n return;\n }\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 AteButtonConfig {\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: \"ate-button\",\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <button\n class=\"ate-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 .ate-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 .ate-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 .ate-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 .ate-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 .ate-button.has-custom-bg:hover {\n transform: translateY(-1px);\n filter: brightness(0.9);\n }\n\n .ate-button:hover::before {\n opacity: 0.1;\n }\n\n .ate-button:active {\n transform: translateY(0);\n }\n\n .ate-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 .ate-button.is-active.has-custom-color {\n background: var(--ate-toolbar-button-active-background, var(--ate-primary-light));\n }\n\n .ate-button:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n pointer-events: none;\n }\n\n /* Icônes Material Symbols */\n .ate-button .material-symbols-outlined {\n font-size: 20px;\n position: relative;\n z-index: 1;\n }\n\n .ate-button .material-symbols-outlined.icon-small {\n font-size: 16px;\n }\n\n .ate-button .material-symbols-outlined.icon-medium {\n font-size: 20px;\n }\n\n .ate-button .material-symbols-outlined.icon-large {\n font-size: 24px;\n }\n\n /* Boutons avec texte */\n .ate-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 .ate-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 .ate-button.color-button:hover {\n border-color: var(--ate-border);\n transform: scale(1.1);\n }\n\n .ate-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 .ate-button.danger {\n color: var(--ate-error-color, #ef4444);\n }\n\n .ate-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 .ate-button.danger::before {\n background: var(--ate-error-color, #ef4444);\n }\n\n /* Boutons de taille différente */\n .ate-button.small {\n width: 24px;\n height: 24px;\n }\n\n .ate-button.medium {\n width: 32px;\n height: 32px;\n }\n\n .ate-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 .ate-button.is-active.pulse {\n animation: pulse 2s infinite;\n }\n\n /* Responsive */\n @media (max-width: 768px) {\n .ate-button {\n width: 32px;\n height: 32px;\n }\n\n .ate-button .material-symbols-outlined {\n font-size: 18px;\n }\n\n .ate-button.text-button {\n padding: 0 8px;\n font-size: 13px;\n }\n }\n `,\n ],\n})\nexport class AteButtonComponent {\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: \"ate-separator\",\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div\n class=\"ate-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 .ate-separator {\n background-color: var(--ate-border, #e2e8f0);\n margin: 0;\n }\n\n .ate-separator.vertical {\n width: 1px;\n height: 24px;\n margin: 0 8px;\n }\n\n .ate-separator.horizontal {\n height: 1px;\n width: 100%;\n margin: 8px 0;\n }\n\n .ate-separator.small.vertical {\n height: 16px;\n margin: 0 4px;\n }\n\n .ate-separator.small.horizontal {\n margin: 4px 0;\n }\n\n .ate-separator.medium.vertical {\n height: 24px;\n margin: 0 8px;\n }\n\n .ate-separator.medium.horizontal {\n margin: 8px 0;\n }\n\n .ate-separator.large.vertical {\n height: 32px;\n margin: 0 12px;\n }\n\n .ate-separator.large.horizontal {\n margin: 12px 0;\n }\n `,\n ],\n})\nexport class AteSeparatorComponent {\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 AteTranslations {\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: AteTranslations = {\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: AteTranslations = {\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 AteI18nService {\n private _currentLocale = signal<SupportedLocale>(\"en\");\n private _translations = signal<Record<SupportedLocale, AteTranslations>>({\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: AteTranslations | Partial<AteTranslations>): 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 AteTranslations[\"toolbar\"]): string {\n return this.translations().toolbar[key];\n }\n\n getBubbleMenuTitle(key: keyof AteTranslations[\"bubbleMenu\"]): string {\n return this.translations().bubbleMenu[key];\n }\n\n getSlashCommand(key: keyof AteTranslations[\"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 { AteI18nService } from \"./ate-i18n.service\";\nimport {\n AteResizeOptions,\n AteImageUploadOptions,\n AteImageUploadHandler,\n AteImageUploadResult,\n AteImageData,\n} from \"../models/ate-image.model\";\n\n@Injectable()\nexport class AteImageService {\n /** Signals for image state */\n selectedImage = signal<AteImageData | null>(null);\n isImageSelected = computed(() => this.selectedImage() !== null);\n\n /** Resizing state */\n isResizing = signal(false);\n\n private i18n = inject(AteI18nService);\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: AteImageUploadHandler | 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: AteImageData): 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<AteImageData>): 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: AteResizeOptions): void {\n if (!editor.isActive(\"resizableImage\")) {\n return;\n }\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) {\n newWidth = Math.max(50, newWidth);\n }\n if (newHeight) {\n newHeight = Math.max(50, newHeight);\n }\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\")) {\n return;\n }\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\")) {\n return null;\n }\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<AteImageData>): 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(\n file: File,\n quality = 0.8,\n maxWidth = 1920,\n maxHeight = 1200\n ): Promise<AteImageUploadResult> {\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: AteImageUploadResult) => void,\n actionMessage: string,\n options?: AteImageUploadOptions\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) {\n throw new Error(validation.error);\n }\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) {\n result.name = handlerResult.alt;\n }\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(\n editor: Editor,\n file: File,\n options?: AteImageUploadOptions\n ): 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?: AteImageUploadOptions) => Promise<void>,\n options?: AteImageUploadOptions\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?: AteImageUploadOptions): 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?: AteImageUploadOptions): 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(\n editor: Editor,\n file: File,\n options?: AteImageUploadOptions\n ): 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)\") {\n return null;\n }\n if (color.startsWith(\"#\")) {\n return color;\n }\n\n // Support both comma-separated (legacy) and space-separated (modern) rgb/rgba\n const rgbMatch = color\n .trim()\n .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()]) {\n return named[color.toLowerCase()]!;\n }\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) {\n return null;\n }\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) {\n return 0;\n } // 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/ate-color.utils\";\n\nexport interface AteColorPickerSelection {\n from: number;\n to: number;\n}\n\nexport type AteColorEditMode = \"text\" | \"highlight\";\n\n@Injectable()\nexport class AteColorPickerService {\n private storedSelection: AteColorPickerSelection | 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<AteColorEditMode | 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: AteColorEditMode, 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: AteColorEditMode, event?: Event): void {\n if (!editor) {\n return;\n }\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) {\n return;\n }\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(): AteColorPickerSelection | 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) {\n return;\n }\n\n const stored = this.storedSelection;\n let chain = editor.chain();\n if (focus) {\n chain = chain.focus();\n }\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.setColor(color);\n\n if (addToHistory === false) {\n chain = chain.setMeta(\"addToHistory\", false);\n }\n chain.run();\n }\n\n /**\n * Remove text color from selection.\n */\n unsetColor(editor: Editor, focus = true): void {\n if (!editor) {\n return;\n }\n\n const stored = this.storedSelection;\n let chain = editor.chain();\n if (focus) {\n chain = chain.focus();\n }\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.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) {\n return;\n }\n\n const stored = this.storedSelection;\n let chain = editor.chain();\n if (focus) {\n chain = chain.focus();\n }\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.setHighlight({ color });\n\n if (addToHistory === false) {\n chain = chain.setMeta(\"addToHistory\", false);\n }\n chain.run();\n }\n\n /**\n * Remove highlight from selection.\n */\n unsetHighlight(editor: Editor, focus = true): void {\n if (!editor) {\n return;\n }\n\n const stored = this.storedSelection;\n let chain = editor.chain();\n if (focus) {\n chain = chain.focus();\n }\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.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 AteLinkService {\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) {\n return;\n }\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 =\n ((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) {\n return;\n }\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) {\n return;\n }\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 { AteImageService } from \"./ate-image.service\";\nimport { AteColorPickerService } from \"./ate-color-picker.service\";\nimport { AteLinkService } from \"./ate-link.service\";\nimport { AteEditorStateSnapshot, ATE_INITIAL_EDITOR_STATE } from \"../models/ate-editor-state.model\";\nimport { AteImageUploadHandler, AteImageUploadOptions } from \"../models/ate-image.model\";\n\n@Injectable()\nexport class AteEditorCommandsService {\n private imageService = inject(AteImageService);\n private colorPickerSvc = inject(AteColorPickerService);\n private linkSvc = inject(AteLinkService);\n private readonly _editorState = signal<AteEditorStateSnapshot>(ATE_INITIAL_EDITOR_STATE, {\n equal: (a, b) => {\n // 1. Primitive global states\n if (a.isFocused !== b.isFocused || a.isEditable !== b.isEditable) {\n return false;\n }\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\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) {\n return false;\n }\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)) {\n return false;\n }\n if (!isRecordEqual(a.can, b.can)) {\n return false;\n }\n if (!isRecordEqual(a.nodes, b.nodes)) {\n return false;\n }\n\n // 4. Compare custom extension states\n if (!isRecordEqual(a.custom, b.custom)) {\n return false;\n }\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: AteImageUploadHandler | null) {\n this.imageService.uploadHandler = handler;\n }\n\n /** Update state (called by TiptapStateExtension) */\n updateState(state: AteEditorStateSnapshot) {\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) {\n return;\n }\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 AteImageUploadOptions);\n break;\n case \"uploadImage\":\n this.uploadImage(editor, args[0] as File, args[1] as AteImageUploadOptions | 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) {\n return;\n }\n editor.chain().focus().toggleBold().run();\n }\n\n toggleItalic(editor: Editor): void {\n if (!editor) {\n return;\n }\n editor.chain().focus().toggleItalic().run();\n }\n\n toggleStrike(editor: Editor): void {\n if (!editor) {\n return;\n }\n editor.chain().focus().toggleStrike().run();\n }\n\n toggleCode(editor: Editor): void {\n if (!editor) {\n return;\n }\n editor.chain().focus().toggleCode().run();\n }\n\n toggleCodeBlock(editor: Editor): void {\n if (!editor) {\n return;\n }\n editor.chain().focus().toggleCodeBlock().run();\n }\n\n toggleUnderline(editor: Editor): void {\n if (!editor) {\n return;\n }\n editor.chain().focus().toggleUnderline().run();\n }\n\n toggleSuperscript(editor: Editor): void {\n if (!editor) {\n return;\n }\n editor.chain().focus().toggleSuperscript().run();\n }\n\n toggleSubscript(editor: Editor): void {\n if (!editor) {\n return;\n }\n editor.chain().focus().toggleSubscript().run();\n }\n\n toggleHeading(editor: Editor, level: 1 | 2 | 3): void {\n if (!editor) {\n return;\n }\n editor.chain().focus().toggleHeading({ level }).run();\n }\n\n toggleHighlight(editor: Editor, color?: string): void {\n if (!editor) {\n return;\n }\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) {\n return;\n }\n editor.chain().focus().toggleBulletList().run();\n }\n\n toggleOrderedList(editor: Editor): void {\n if (!editor) {\n return;\n }\n editor.chain().focus().toggleOrderedList().run();\n }\n\n toggleBlockquote(editor: Editor): void {\n if (!editor) {\n return;\n }\n editor.chain().focus().toggleBlockquote().run();\n }\n\n setTextAlign(editor: Editor, alignment: \"left\" | \"center\" | \"right\" | \"justify\"): void {\n if (!editor) {\n return;\n }\n editor.chain().focus().setTextAlign(alignment).run();\n }\n\n insertHorizontalRule(editor: Editor): void {\n if (!editor) {\n return;\n }\n editor.chain().focus().setHorizontalRule().run();\n }\n\n // --- History Commands ---\n\n undo(editor: Editor): void {\n if (!editor) {\n return;\n }\n editor.chain().focus().undo().run();\n }\n\n redo(editor: Editor): void {\n if (!editor) {\n return;\n }\n editor.chain().focus().redo().run();\n }\n\n // --- Table Commands ---\n\n insertTable(editor: Editor, rows = 3, cols = 3): void {\n if (!editor) {\n return;\n }\n editor.chain().focus().insertTable({ rows, cols }).run();\n }\n\n addColumnBefore(editor: Editor): void {\n if (!editor) {\n return;\n }\n editor.chain().focus().addColumnBefore().run();\n }\n\n addColumnAfter(editor: Editor): void {\n if (!editor) {\n return;\n }\n editor.chain().focus().addColumnAfter().run();\n }\n\n deleteColumn(editor: Editor): void {\n if (!editor) {\n return;\n }\n editor.chain().focus().deleteColumn().run();\n }\n\n addRowBefore(editor: Editor): void {\n if (!editor) {\n return;\n }\n editor.chain().focus().addRowBefore().run();\n }\n\n addRowAfter(editor: Editor): void {\n if (!editor) {\n return;\n }\n editor.chain().focus().addRowAfter().run();\n }\n\n deleteRow(editor: Editor): void {\n if (!editor) {\n return;\n }\n editor.chain().focus().deleteRow().run();\n }\n\n deleteTable(editor: Editor): void {\n if (!editor) {\n return;\n }\n editor.chain().focus().deleteTable().run();\n }\n\n mergeCells(editor: Editor): void {\n if (!editor) {\n return;\n }\n editor.chain().focus().mergeCells().run();\n }\n\n splitCell(editor: Editor): void {\n if (!editor) {\n return;\n }\n editor.chain().focus().splitCell().run();\n }\n\n toggleHeaderColumn(editor: Editor): void {\n if (!editor) {\n return;\n }\n editor.chain().focus().toggleHeaderColumn().run();\n }\n\n toggleHeaderRow(editor: Editor): void {\n if (!editor) {\n return;\n }\n editor.chain().focus().toggleHeaderRow().run();\n }\n\n // --- Utility Commands ---\n\n clearContent(editor: Editor): void {\n if (!editor) {\n return;\n }\n editor.commands.clearContent(true);\n }\n\n focus(editor: Editor): void {\n if (!editor) {\n return;\n }\n editor.chain().focus().run();\n }\n\n blur(editor: Editor): void {\n if (!editor) {\n return;\n }\n editor.chain().blur().run();\n }\n\n setContent(editor: Editor, content: string, emitUpdate = true): void {\n if (!editor) {\n return;\n }\n editor.commands.setContent(content, emitUpdate);\n }\n\n setEditable(editor: Editor, editable: boolean): void {\n if (!editor) {\n return;\n }\n editor.setEditable(editable);\n }\n\n insertContent(editor: Editor, content: string): void {\n if (!editor) {\n return;\n }\n editor.chain().focus().insertContent(content).run();\n }\n\n async insertImage(editor: Editor, options?: AteImageUploadOptions): 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?: AteImageUploadOptions): 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 { AteColorPickerService } from \"../../services/ate-color-picker.service\";\nimport { AteButtonComponent } from \"../ui/ate-button.component\";\nimport { AteI18nService } from \"../../services/ate-i18n.service\";\nimport { AteEditorCommandsService } from \"../../services/ate-editor-commands.service\";\n\nexport type ColorPickerMode = \"text\" | \"highlight\";\n\n@Component({\n selector: \"ate-color-picker\",\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AteButtonComponent, CommonModule],\n template: `\n <div class=\"color-picker-wrapper\">\n <div class=\"color-picker-container\" [class.is-highlight]=\"mode() === 'highlight'\">\n <ate-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 AteColorPickerComponent {\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(AteColorPickerService);\n private i18nService = inject(AteI18nService);\n private editorCommands = inject(AteEditorCommandsService);\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 { AteButtonComponent } from \"../ui/ate-button.component\";\nimport { AteSeparatorComponent } from \"../ui/ate-separator.component\";\nimport { AteEditorCommandsService } from \"../../services/ate-editor-commands.service\";\nimport { AteI18nService } from \"../../services/ate-i18n.service\";\nimport { AteColorPickerComponent } from \"../color-picker/ate-color-picker.component\";\n\nimport { AteToolbarConfig } from \"../../models/ate-toolbar.model\";\n\n@Component({\n selector: \"ate-toolbar\",\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AteButtonComponent, AteSeparatorComponent, AteColorPickerComponent],\n template: `\n <div class=\"ate-toolbar\" [class.floating]=\"floating()\">\n @if (config().bold) {\n <ate-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 <ate-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 <ate-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 <ate-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 <ate-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 <ate-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 <ate-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 <ate-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 <ate-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 <ate-color-picker\n mode=\"highlight\"\n [editor]=\"editor()\"\n [disabled]=\"!state().can.setHighlight\" />\n }\n @if (config().textColor) {\n <ate-color-picker mode=\"text\" [editor]=\"editor()\" [disabled]=\"!state().can.setColor\" />\n }\n\n @if (config().separator && (config().heading1 || config().heading2 || config().heading3)) {\n <ate-separator />\n }\n @if (config().heading1) {\n <ate-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 <ate-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 <ate-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 (\n config().separator && (config().bulletList || config().orderedList || config().blockquote)\n ) {\n <ate-separator />\n }\n @if (config().bulletList) {\n <ate-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 <ate-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 <ate-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 <ate-separator />\n }\n @if (config().alignLeft) {\n <ate-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 <ate-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 <ate-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 <ate-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 <ate-separator />\n }\n @if (config().link) {\n <ate-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 <ate-button\n icon=\"horizontal_rule\"\n [title]=\"t().horizontalRule\"\n [disabled]=\"!state().can.insertHorizontalRule\"\n (buttonClick)=\"onCommand('insertHorizontalRule')\" />\n }\n @if (config().table) {\n <ate-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 <ate-separator />\n }\n @if (config().image) {\n <ate-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 <ate-separator />\n }\n @if (config().undo) {\n <ate-button\n icon=\"undo\"\n [title]=\"t().undo\"\n [disabled]=\"!state().can.undo\"\n (buttonClick)=\"onCommand('undo')\" />\n }\n @if (config().redo) {\n <ate-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 <ate-separator />\n }\n @if (config().clear) {\n <ate-button\n icon=\"delete\"\n [title]=\"t().clear\"\n [disabled]=\"!state().isEditable\"\n (buttonClick)=\"onCommand('clearContent')\" />\n }\n @if (config().custom?.length) {\n @for (item of config().custom; track item.key) {\n <ate-button\n [icon]=\"item.icon\"\n [title]=\"item.label\"\n (buttonClick)=\"item.command(editor())\"></ate-button>\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 .ate-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(\n var(--ate-menu-border-radius, 12px) - var(--ate-border-width, 2px)\n );\n border-top-right-radius: calc(\n var(--ate-menu-border-radius, 12px) - var(--ate-border-width, 2px)\n );\n }\n\n /* Floating Toolbar Mode */\n .ate-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 .ate-toolbar.floating::-webkit-scrollbar {\n display: none;\n }\n\n :host-context(.floating-toolbar:focus-within) .ate-toolbar.floating,\n :host-context(.floating-toolbar:hover) .ate-toolbar.floating {\n transform: translateY(-2rem);\n }\n\n @media (max-width: 768px) {\n .ate-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 .ate-toolbar {\n animation: toolbarSlideIn 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n `,\n ],\n})\nexport class AteToolbarComponent {\n editor = input.required<Editor>();\n config = input.required<AteToolbarConfig>();\n imageUpload = input<Record<string, unknown>>({});\n floating = input<boolean>(false);\n\n private i18nService = inject(AteI18nService);\n private editorCommands = inject(AteEditorCommandsService);\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) {\n return;\n }\n this.editorCommands.execute(editor, command, ...args);\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 { AteEditorCommandsService } from \"../../../services/ate-editor-commands.service\";\nimport { AteI18nService } from \"../../../services/ate-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 AteBaseBubbleMenu implements OnInit, OnDestroy {\n protected readonly i18nService = inject(AteI18nService);\n protected readonly editorCommands = inject(AteEditorCommandsService);\n\n // Core Inputs\n editor = input.required<Editor>();\n\n // Required viewChild for the menu container\n menuRef = viewChild.required<ElementRef<HTMLDivElement>>(\"menuRef\");\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) {\n return;\n }\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) {\n return;\n }\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) {\n return new DOMRect(0, 0, 0, 0);\n }\n\n const { from, to, empty } = ed.state.selection;\n if (empty) {\n return new DOMRect(-9999, -9999, 0, 0);\n }\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 {\n Component,\n input,\n ChangeDetectionStrategy,\n computed,\n OnInit,\n OnDestroy,\n} from \"@angular/core\";\nimport { type Editor } from \"@tiptap/core\";\nimport { AteButtonComponent } from \"../../ui/ate-button.component\";\nimport { AteColorPickerComponent } from \"../../color-picker/ate-color-picker.component\";\nimport { AteBubbleMenuConfig } from \"../../../models/ate-bubble-menu.model\";\nimport { AteBaseBubbleMenu } from \"../base/ate-base-bubble-menu\";\n\n@Component({\n selector: \"ate-bubble-menu\",\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AteButtonComponent, AteColorPickerComponent],\n template: `\n <div #menuRef class=\"bubble-menu\" (mousedown)=\"$event.preventDefault()\">\n @if (bubbleMenuConfig().bold) {\n <ate-button\n icon=\"format_bold\"\n [title]=\"t().bold\"\n [active]=\"state().marks.bold\"\n [disabled]=\"!state().can.toggleBold\"\n (buttonClick)=\"onCommand('toggleBold', $event)\"></ate-button>\n }\n @if (bubbleMenuConfig().italic) {\n <ate-button\n icon=\"format_italic\"\n [title]=\"t().italic\"\n [active]=\"state().marks.italic\"\n [disabled]=\"!state().can.toggleItalic\"\n (buttonClick)=\"onCommand('toggleItalic', $event)\"></ate-button>\n }\n @if (bubbleMenuConfig().underline) {\n <ate-button\n icon=\"format_underlined\"\n [title]=\"t().underline\"\n [active]=\"state().marks.underline\"\n [disabled]=\"!state().can.toggleUnderline\"\n (buttonClick)=\"onCommand('toggleUnderline', $event)\"></ate-button>\n }\n @if (bubbleMenuConfig().strike) {\n <ate-button\n icon=\"strikethrough_s\"\n [title]=\"t().strike\"\n [active]=\"state().marks.strike\"\n [disabled]=\"!state().can.toggleStrike\"\n (buttonClick)=\"onCommand('toggleStrike', $event)\"></ate-button>\n }\n @if (bubbleMenuConfig().code) {\n <ate-button\n icon=\"code\"\n [title]=\"t().code\"\n [active]=\"state().marks.code\"\n [disabled]=\"!state().can.toggleCode\"\n (buttonClick)=\"onCommand('toggleCode', $event)\"></ate-button>\n }\n @if (bubbleMenuConfig().superscript) {\n <ate-button\n icon=\"superscript\"\n [title]=\"t().superscript\"\n [active]=\"state().marks.superscript\"\n [disabled]=\"!state().can.toggleSuperscript\"\n (buttonClick)=\"onCommand('toggleSuperscript', $event)\"></ate-button>\n }\n @if (bubbleMenuConfig().subscript) {\n <ate-button\n icon=\"subscript\"\n [title]=\"t().subscript\"\n [active]=\"state().marks.subscript\"\n [disabled]=\"!state().can.toggleSubscript\"\n (buttonClick)=\"onCommand('toggleSubscript', $event)\"></ate-button>\n }\n @if (bubbleMenuConfig().highlight) {\n <ate-button\n icon=\"highlight\"\n [title]=\"t().highlight\"\n [active]=\"state().marks.highlight\"\n [disabled]=\"!state().can.toggleHighlight\"\n (buttonClick)=\"onCommand('toggleHighlight', $event)\"></ate-button>\n }\n @if (bubbleMenuConfig().highlightPicker) {\n <ate-color-picker\n mode=\"highlight\"\n [editor]=\"editor()\"\n [disabled]=\"!state().can.setHighlight\"\n [anchorToText]=\"true\" />\n }\n @if (bubbleMenuConfig().textColor) {\n <ate-color-picker\n mode=\"text\"\n [editor]=\"editor()\"\n [disabled]=\"!state().can.setColor\"\n [anchorToText]=\"true\" />\n }\n @if (bubbleMenuConfig().link) {\n <ate-button\n icon=\"link\"\n [title]=\"t().link\"\n [active]=\"state().marks.link\"\n [disabled]=\"!state().can.toggleLink\"\n (buttonClick)=\"onCommand('toggleLink', $event)\"></ate-button>\n }\n @if (bubbleMenuConfig().custom?.length) {\n @for (item of bubbleMenuConfig().custom; track item.key) {\n <ate-button\n [icon]=\"item.icon\"\n [title]=\"item.label\"\n (buttonClick)=\"item.command(editor())\"></ate-button>\n }\n }\n </div>\n `,\n})\nexport class AteBubbleMenuComponent extends AteBaseBubbleMenu 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<AteBubbleMenuConfig>({\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\" && !selection.empty && !nodes.isImage && !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: 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 { AteButtonComponent } from \"../../ui/ate-button.component\";\nimport { AteSeparatorComponent } from \"../../ui/ate-separator.component\";\nimport { AteImageService } from \"../../../services/ate-image.service\";\nimport { AteImageBubbleMenuConfig } from \"../../../models/ate-bubble-menu.model\";\nimport { AteBaseBubbleMenu } from \"../base/ate-base-bubble-menu\";\nimport { AteImageUploadOptions } from \"../../../models/ate-image.model\";\n\n@Component({\n selector: \"ate-image-bubble-menu\",\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AteButtonComponent, AteSeparatorComponent],\n template: `\n <div #menuRef class=\"bubble-menu\" (mousedown)=\"$event.preventDefault()\">\n @if (imageBubbleMenuConfig().changeImage) {\n <ate-button\n icon=\"drive_file_rename_outline\"\n [title]=\"t().changeImage\"\n (buttonClick)=\"onCommand('changeImage', $event)\"></ate-button>\n }\n @if (imageBubbleMenuConfig().separator && hasResizeButtons()) {\n <ate-separator />\n }\n @if (imageBubbleMenuConfig().resizeSmall) {\n <ate-button\n icon=\"crop_square\"\n iconSize=\"small\"\n [title]=\"t().resizeSmall\"\n (buttonClick)=\"onCommand('resizeSmall', $event)\"></ate-button>\n }\n @if (imageBubbleMenuConfig().resizeMedium) {\n <ate-button\n icon=\"crop_square\"\n iconSize=\"medium\"\n [title]=\"t().resizeMedium\"\n (buttonClick)=\"onCommand('resizeMedium', $event)\"></ate-button>\n }\n @if (imageBubbleMenuConfig().resizeLarge) {\n <ate-button\n icon=\"crop_square\"\n iconSize=\"large\"\n [title]=\"t().resizeLarge\"\n (buttonClick)=\"onCommand('resizeLarge', $event)\"></ate-button>\n }\n @if (imageBubbleMenuConfig().resizeOriginal) {\n <ate-button\n icon=\"photo_size_select_actual\"\n [title]=\"t().resizeOriginal\"\n (buttonClick)=\"onCommand('resizeOriginal', $event)\"></ate-button>\n }\n @if (imageBubbleMenuConfig().separator && imageBubbleMenuConfig().deleteImage) {\n <ate-separator />\n }\n @if (imageBubbleMenuConfig().deleteImage) {\n <ate-button\n icon=\"delete\"\n [title]=\"t().deleteImage\"\n variant=\"danger\"\n (buttonClick)=\"onCommand('deleteImage', $event)\"></ate-button>\n }\n </div>\n `,\n})\nexport class AteImageBubbleMenuComponent extends AteBaseBubbleMenu {\n readonly t = this.i18nService.imageUpload;\n private readonly imageService = inject(AteImageService);\n\n config = input<AteImageBubbleMenuConfig>({\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<AteImageUploadOptions>({});\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) {\n return new DOMRect(0, 0, 0, 0);\n }\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) {\n return img.getBoundingClientRect();\n }\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(\n \"img.selected, .resizable-image-container.selected img\"\n );\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) {\n return;\n }\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 { AteButtonComponent } from \"../../ui/ate-button.component\";\nimport { AteSeparatorComponent } from \"../../ui/ate-separator.component\";\nimport { AteBaseBubbleMenu } from \"../base/ate-base-bubble-menu\";\n\nimport { AteTableBubbleMenuConfig } from \"../../../models/ate-bubble-menu.model\";\n\n@Component({\n selector: \"ate-table-bubble-menu\",\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, AteButtonComponent, AteSeparatorComponent],\n template: `\n <div #menuRef class=\"bubble-menu\" (mousedown)=\"$event.preventDefault()\">\n <!-- Row actions -->\n @if (config().addRowBefore !== false) {\n <ate-button\n icon=\"add_row_above\"\n [title]=\"t().addRowBefore\"\n [disabled]=\"!state().can.addRowBefore\"\n (buttonClick)=\"onCommand('addRowBefore', $event)\"></ate-button>\n }\n @if (config().addRowAfter !== false) {\n <ate-button\n icon=\"add_row_below\"\n [title]=\"t().addRowAfter\"\n [disabled]=\"!state().can.addRowAfter\"\n (buttonClick)=\"onCommand('addRowAfter', $event)\"></ate-button>\n }\n @if (config().deleteRow !== false) {\n <ate-button\n icon=\"delete\"\n [title]=\"t().deleteRow\"\n variant=\"danger\"\n [disabled]=\"!state().can.deleteRow\"\n (buttonClick)=\"onCommand('deleteRow', $event)\"></ate-button>\n }\n @if (config().separator !== false) {\n <ate-separator />\n }\n\n <!-- Column actions -->\n @if (config().addColumnBefore !== false) {\n <ate-button\n icon=\"add_column_left\"\n [title]=\"t().addColumnBefore\"\n [disabled]=\"!state().can.addColumnBefore\"\n (buttonClick)=\"onCommand('addColumnBefore', $event)\"></ate-button>\n }\n @if (config().addColumnAfter !== false) {\n <ate-button\n icon=\"add_column_right\"\n [title]=\"t().addColumnAfter\"\n [disabled]=\"!state().can.addColumnAfter\"\n (buttonClick)=\"onCommand('addColumnAfter', $event)\"></ate-button>\n }\n @if (config().deleteColumn !== false) {\n <ate-button\n icon=\"delete\"\n [title]=\"t().deleteColumn\"\n variant=\"danger\"\n [disabled]=\"!state().can.deleteColumn\"\n (buttonClick)=\"onCommand('deleteColumn', $event)\"></ate-button>\n }\n @if (config().separator !== false) {\n <ate-separator />\n }\n\n <!-- Cell actions -->\n @if (config().toggleHeaderRow !== false) {\n <ate-button\n icon=\"toolbar\"\n [title]=\"t().toggleHeaderRow\"\n [active]=\"state().nodes.isTableHeaderRow\"\n [disabled]=\"!state().can.toggleHeaderRow\"\n (buttonClick)=\"onCommand('toggleHeaderRow', $event)\"></ate-button>\n }\n @if (config().toggleHeaderColumn !== false) {\n <ate-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)\"></ate-button>\n }\n @if (config().separator !== false && config().deleteTable !== false) {\n <ate-separator />\n }\n\n <!-- Table actions -->\n @if (config().deleteTable !== false) {\n <ate-button\n icon=\"delete_forever\"\n [title]=\"t().deleteTable\"\n variant=\"danger\"\n [disabled]=\"!state().can.deleteTable\"\n (buttonClick)=\"onCommand('deleteTable', $event)\"></ate-button>\n }\n </div>\n `,\n})\nexport class AteTableBubbleMenuComponent extends AteBaseBubbleMenu {\n // Alias for template\n readonly t = this.i18nService.table;\n\n config = input<AteTableBubbleMenuConfig>({\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) {\n return new DOMRect(0, 0, 0, 0);\n }\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 =\n 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) {\n return table.getBoundingClientRect();\n }\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 { AteButtonComponent } from \"../../ui/ate-button.component\";\nimport { AteBaseBubbleMenu } from \"../base/ate-base-bubble-menu\";\n\nimport { AteCellBubbleMenuConfig } from \"../../../models/ate-bubble-menu.model\";\n\n@Component({\n selector: \"ate-cell-bubble-menu\",\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, AteButtonComponent],\n template: `\n <div #menuRef class=\"bubble-menu\" (mousedown)=\"$event.preventDefault()\">\n <!-- Cell specific actions -->\n @if (config().mergeCells !== false && !state().selection.isSingleCell) {\n <ate-button\n icon=\"cell_merge\"\n [title]=\"i18n().table().mergeCells\"\n [disabled]=\"!state().can.mergeCells\"\n (buttonClick)=\"onCommand('mergeCells', $event)\"></ate-button>\n }\n @if (config().splitCell !== false && state().selection.isSingleCell) {\n <ate-button\n icon=\"split_scene\"\n [title]=\"i18n().table().splitCell\"\n [disabled]=\"!state().can.splitCell\"\n (buttonClick)=\"onCommand('splitCell', $event)\"></ate-button>\n }\n </div>\n `,\n})\nexport class AteCellBubbleMenuComponent extends AteBaseBubbleMenu {\n // Inputs\n config = input<AteCellBubbleMenuConfig>({});\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) {\n return new DOMRect(0, 0, 0, 0);\n }\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) {\n cells.push(el);\n }\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 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 { AteEditorCommandsService } from \"../../../services/ate-editor-commands.service\";\nimport { AteI18nService } from \"../../../services/ate-i18n.service\";\n\n/**\n * Base abstract class for Sub-Bubble Menus (Link, Color).\n * These menus are \"sub-menus\" of the main bubble menu or triggered/anchored by specific UI elements.\n */\n@Directive()\nexport abstract class AteBaseSubBubbleMenu implements OnInit, OnDestroy {\n protected readonly i18nService = inject(AteI18nService);\n protected readonly editorCommands = inject(AteEditorCommandsService);\n\n // Core Inputs\n editor = input.required<Editor>();\n\n // Required viewChild for the menu container\n menuRef = viewChild.required<ElementRef<HTMLDivElement>>(\"menuRef\");\n\n // Internal State\n protected tippyInstance: TippyInstance | null = null;\n protected updateTimeout: number | null = null;\n\n // Reactive state alias for templates\n readonly state = this.editorCommands.editorState;\n\n constructor() {\n // Reactive effect for menu updates (re-positioning)\n effect(() => {\n // Monitor editor state and specific sub-menu states\n this.state();\n this.onStateChange();\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 with sub-menu defaults.\n */\n protected initTippy() {\n if (!this.menuRef()?.nativeElement) {\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: \"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: 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 this.updateTimeout = setTimeout(() => {\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 protected showTippy() {\n if (this.tippyInstance) {\n this.tippyInstance.setProps({ getReferenceClientRect: () => this.getSelectionRect() });\n this.tippyInstance.show();\n }\n }\n\n /**\n * Helper to hide the Tippy instance.\n */\n protected hideTippy() {\n this.tippyInstance?.hide();\n }\n\n // --- Abstract methods & Hooks ---\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 * Hook to add reactive dependencies to the update cycle.\n */\n protected abstract onStateChange(): 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 {\n Component,\n ChangeDetectionStrategy,\n viewChild,\n ElementRef,\n signal,\n effect,\n inject,\n} from \"@angular/core\";\nimport { FormsModule } from \"@angular/forms\";\nimport { AteButtonComponent } from \"../../ui/ate-button.component\";\nimport { AteLinkService } from \"../../../services/ate-link.service\";\nimport { AteSeparatorComponent } from \"../../ui/ate-separator.component\";\nimport { AteBaseSubBubbleMenu } from \"../base/ate-base-sub-bubble-menu\";\n\n@Component({\n selector: \"ate-link-bubble-menu\",\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AteButtonComponent, AteSeparatorComponent, 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 <ate-button\n icon=\"check\"\n [title]=\"common().apply\"\n color=\"var(--ate-primary)\"\n [disabled]=\"!editUrl().trim()\"\n (buttonClick)=\"onApply($event)\"></ate-button>\n <ate-button\n icon=\"open_in_new\"\n [title]=\"t().openLink\"\n [disabled]=\"!currentUrl()\"\n (buttonClick)=\"onOpenLink($event)\"></ate-button>\n <ate-separator />\n <ate-button\n icon=\"link_off\"\n [title]=\"t().removeLink\"\n variant=\"danger\"\n [disabled]=\"!currentUrl()\"\n (buttonClick)=\"onRemove($event)\"></ate-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 AteLinkBubbleMenuComponent extends AteBaseSubBubbleMenu {\n private readonly linkSvc = inject(AteLinkService);\n\n readonly t = this.i18nService.bubbleMenu;\n readonly common = this.i18nService.common;\n\n linkInput = viewChild<ElementRef<HTMLInputElement>>(\"linkInput\");\n\n editUrl = signal(\"\");\n\n constructor() {\n super();\n\n // Reactive effect for URL sync\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\n protected override onStateChange() {\n this.linkSvc.editMode();\n this.linkSvc.menuTrigger();\n this.linkSvc.isInteracting();\n }\n\n override shouldShow(): boolean {\n const { selection, marks, isEditable, isFocused } = this.state();\n if (!isEditable) {\n return false;\n }\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 override getSelectionRect(): DOMRect {\n const trigger = this.linkSvc.menuTrigger();\n const ed = this.editor();\n if (!ed) {\n return new DOMRect(0, 0, 0, 0);\n }\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) {\n return rect;\n }\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) {\n return linkElement.getBoundingClientRect();\n }\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) {\n return rect;\n }\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 protected override onTippyHide() {\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 currentUrl() {\n return this.state().marks.linkHref || \"\";\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) {\n window.open(url, \"_blank\", \"noopener,noreferrer\");\n }\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 ElementRef,\n signal,\n inject,\n computed,\n viewChild,\n} from \"@angular/core\";\nimport { CommonModule } from \"@angular/common\";\nimport { FormsModule } from \"@angular/forms\";\nimport { Instance as TippyInstance } from \"tippy.js\";\nimport { AteColorPickerService } from \"../../../services/ate-color-picker.service\";\nimport { AteButtonComponent } from \"../../ui/ate-button.component\";\nimport { AteSeparatorComponent } from \"../../ui/ate-separator.component\";\nimport { AteBaseSubBubbleMenu } from \"../base/ate-base-sub-bubble-menu\";\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: \"ate-color-bubble-menu\",\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, FormsModule, AteButtonComponent, AteSeparatorComponent],\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 <ate-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)\"></ate-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 <ate-button\n class=\"btn-native-picker-trigger\"\n icon=\"colorize\"\n [title]=\"t().customColor\"\n [backgroundColor]=\"currentColor()\"\n (buttonClick)=\"triggerNativePicker($event)\"></ate-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 <ate-button\n icon=\"check\"\n [title]=\"common().apply\"\n color=\"var(--ate-primary)\"\n (buttonClick)=\"onApply($event)\"></ate-button>\n\n <ate-separator />\n\n <ate-button\n icon=\"format_color_reset\"\n [title]=\"t().clear\"\n variant=\"danger\"\n (buttonClick)=\"onClearColor($event)\"></ate-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 .ate-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 .ate-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 .ate-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 AteColorBubbleMenuComponent extends AteBaseSubBubbleMenu {\n private readonly colorPickerSvc = inject(AteColorPickerService);\n\n readonly t = this.i18nService.toolbar;\n readonly common = this.i18nService.common;\n readonly presets = PRESET_COLORS;\n\n private colorInputRef = viewChild<ElementRef<HTMLInputElement>>(\"colorInput\");\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 protected override onStateChange() {\n this.colorPickerSvc.editMode();\n this.colorPickerSvc.menuTrigger();\n this.colorPickerSvc.isInteracting();\n }\n\n override shouldShow(): boolean {\n const { isEditable } = this.state();\n if (!isEditable) {\n return false;\n }\n\n if (this.colorPickerSvc.editMode() !== null || this.colorPickerSvc.isInteracting()) {\n return true;\n }\n\n return false;\n }\n\n override getSelectionRect(): DOMRect {\n const trigger = this.colorPickerSvc.menuTrigger();\n const ed = this.editor();\n if (!ed) {\n return new DOMRect(0, 0, 0, 0);\n }\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) {\n return rect;\n }\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) {\n return colorElement.getBoundingClientRect();\n }\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) {\n return rect;\n }\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 protected override onTippyShow(_instance: TippyInstance) {\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 protected override onTippyHide(_instance: TippyInstance) {\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 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 (\n this.colorPickerSvc.normalizeColor(this.currentColor()) ===\n this.colorPickerSvc.normalizeColor(color)\n );\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(\"#\")) {\n value = \"#\" + value;\n }\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(\"#\")) {\n value = \"#\" + value;\n }\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 { AteSlashCommandItem } from \"../components/slash-commands/ate-slash-commands.component\";\nimport { AteI18nService } from \"../services/ate-i18n.service\";\nimport { AteEditorCommandsService } from \"../services/ate-editor-commands.service\";\n\n/**\n * Clés des commandes natives dans l'ordre d'affichage\n */\nexport const ATE_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 AteSlashCommandKey = (typeof ATE_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 AteSlashCommandsConfig extends Partial<Record<AteSlashCommandKey, boolean>> {\n /**\n * Liste de commandes supplémentaires à ajouter à la fin du menu\n */\n custom?: AteSlashCommandItem[];\n}\n\n/**\n * Configuration par défaut : toutes les commandes natives sont activées\n */\nexport const ATE_DEFAULT_SLASH_COMMANDS_CONFIG: AteSlashCommandsConfig = {\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: AteI18nService,\n commands: AteEditorCommandsService,\n imageOptions?: {\n quality?: number;\n maxWidth?: number;\n maxHeight?: number;\n allowedTypes?: string[];\n }\n): AteSlashCommandItem[] {\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: AteSlashCommandsConfig,\n i18n: AteI18nService,\n commands: AteEditorCommandsService,\n imageOptions?: {\n quality?: number;\n maxWidth?: number;\n maxHeight?: number;\n allowedTypes?: string[];\n }\n): AteSlashCommandItem[] {\n const allNatives = createDefaultSlashCommands(i18n, commands, imageOptions);\n const activeConfig = { ...ATE_DEFAULT_SLASH_COMMANDS_CONFIG, ...config };\n\n const filtered = allNatives.filter((_, index) => {\n const key = ATE_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 { AteI18nService } from \"../../services/ate-i18n.service\";\nimport { AteEditorCommandsService } from \"../../services/ate-editor-commands.service\";\nimport { createDefaultSlashCommands } from \"../../config/ate-slash-commands.config\";\nimport { Plugin, PluginKey } from \"@tiptap/pm/state\";\nimport { EditorView } from \"@tiptap/pm/view\";\n\nexport interface AteSlashCommandItem {\n title: string;\n description: string;\n icon: string;\n keywords: string[];\n command: (editor: Editor) => void;\n}\n\nexport interface AteCustomSlashCommands {\n commands?: AteSlashCommandItem[];\n}\n\n// Default command definitions are now centralized in src/lib/config/slash-commands.config.ts\n\n@Component({\n selector: \"ate-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 AteSlashCommandsComponent implements OnInit, OnDestroy {\n readonly i18nService = inject(AteI18nService);\n editor = input.required<Editor>();\n config = input<AteCustomSlashCommands | undefined>(undefined);\n\n menuRef = viewChild.required<ElementRef<HTMLDivElement>>(\"menuRef\");\n\n private tippyInstance: TippyInstance | null = null;\n private editorCommands = inject(AteEditorCommandsService);\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) {\n return;\n }\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) {\n return;\n }\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 private scrollToSelected() {\n // Scroll to the selected element\n const menuEl = this.menuRef()?.nativeElement;\n if (menuEl) {\n const selectedItem = menuEl.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: AteSlashCommandItem) {\n const ed = this.editor();\n if (!ed || !this.slashRange) {\n return;\n }\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\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 = 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 { AteButtonComponent } from \"../ui/ate-button.component\";\nimport { AteTranslations } from \"../../services/ate-i18n.service\";\n\n/**\n * Edit Toggle Component\n * Allows switching between editable and readonly modes\n */\n@Component({\n selector: \"ate-edit-toggle\",\n standalone: true,\n imports: [CommonModule, AteButtonComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"ate-edit-toggle-container\" [class.is-editable]=\"editable()\">\n <ate-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 AteEditToggleComponent {\n editable = input.required<boolean>();\n translations = input.required<AteTranslations>();\n editToggle = output<Event>();\n}\n","import { Directive } from \"@angular/core\";\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from \"@angular/forms\";\n\n/**\n * Noop Value Accessor Directive\n * @link https://medium.com/netanelbasal/forwarding-form-controls-to-custom-control-components-in-angular-701e8406cc55\n */\n@Directive({\n standalone: true,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n multi: true,\n useExisting: AteNoopValueAccessorDirective,\n },\n ],\n})\nexport class AteNoopValueAccessorDirective 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 { AteStateCalculator } from \"../../models/ate-editor-state.model\";\n\nexport const AteSelectionCalculator: AteStateCalculator = 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) {\n selectionType = \"text\";\n } else if (selection instanceof NodeSelection) {\n selectionType = \"node\";\n } else if (selection instanceof CellSelection) {\n selectionType = \"cell\";\n }\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 { AteStateCalculator } from \"../../models/ate-editor-state.model\";\nimport { normalizeColor } from \"../../utils/ate-color.utils\";\n\nexport const AteMarksCalculator: AteStateCalculator = 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) {\n return null;\n }\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 =\n 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) {\n return null;\n }\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 ??\n 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 &&\n !isInsideInlineCode &&\n (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 { AteStateCalculator } from \"../../models/ate-editor-state.model\";\n\nexport const AteTableCalculator: AteStateCalculator = 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:\n 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 { AteStateCalculator } from \"../../models/ate-editor-state.model\";\n\nexport const AteImageCalculator: AteStateCalculator = editor => {\n return {\n nodes: {\n isImage: editor.isActive(\"image\") || editor.isActive(\"resizableImage\"),\n },\n };\n};\n","import { AteStateCalculator } from \"../../models/ate-editor-state.model\";\n\nexport const AteStructureCalculator: AteStateCalculator = 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 { AteStateCalculator } from \"../../models/ate-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 AteDiscoveryCalculator: AteStateCalculator = (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 (\n [\n \"selection\",\n \"editable\",\n \"focus\",\n \"undo\",\n \"redo\",\n \"history\",\n \"placeholder\",\n \"characterCount\",\n ].includes(name)\n ) {\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 AteLinkClickBehavior = 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\") {\n return false;\n }\n\n const isModKey = event.ctrlKey || event.metaKey;\n\n // If editor is editable, only proceed if Ctrl/Cmd is pressed\n if (view.editable && !isModKey) {\n return false;\n }\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 { AteToolbarConfig } from \"../models/ate-toolbar.model\";\nimport {\n AteBubbleMenuConfig,\n AteImageBubbleMenuConfig,\n AteTableBubbleMenuConfig,\n AteCellBubbleMenuConfig,\n} from \"../models/ate-bubble-menu.model\";\n\n// Default toolbar configuration\nexport const ATE_DEFAULT_TOOLBAR_CONFIG: AteToolbarConfig = {\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 ATE_DEFAULT_BUBBLE_MENU_CONFIG: AteBubbleMenuConfig = {\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 ATE_DEFAULT_IMAGE_BUBBLE_MENU_CONFIG: AteImageBubbleMenuConfig = {\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 ATE_DEFAULT_TABLE_MENU_CONFIG: AteTableBubbleMenuConfig = {\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 ATE_DEFAULT_CELL_MENU_CONFIG: AteCellBubbleMenuConfig = {\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 { AteResizableImage } from \"../../extensions/ate-resizable-image.extension\";\nimport { AteUploadProgress } from \"../../extensions/ate-upload-progress.extension\";\nimport { AteTableExtension } from \"../../extensions/ate-table.extension\";\nimport { AteTiptapStateExtension } from \"../../extensions/ate-tiptap-state.extension\";\nimport { AteToolbarComponent } from \"../toolbar/ate-toolbar.component\";\nimport { AteBubbleMenuComponent } from \"../bubble-menus/text/ate-bubble-menu.component\";\nimport { AteImageBubbleMenuComponent } from \"../bubble-menus/image/ate-image-bubble-menu.component\";\nimport { AteTableBubbleMenuComponent } from \"../bubble-menus/table/ate-table-bubble-menu.component\";\nimport { AteCellBubbleMenuComponent } from \"../bubble-menus/table/ate-cell-bubble-menu.component\";\nimport { AteLinkBubbleMenuComponent } from \"../bubble-menus/link/ate-link-bubble-menu.component\";\nimport { AteColorBubbleMenuComponent } from \"../bubble-menus/color/ate-color-bubble-menu.component\";\nimport {\n AteSlashCommandsComponent,\n AteCustomSlashCommands,\n} from \"../slash-commands/ate-slash-commands.component\";\nimport { AteEditToggleComponent } from \"../edit-toggle/ate-edit-toggle.component\";\nimport { AteImageService } from \"../../services/ate-image.service\";\nimport { AteI18nService, SupportedLocale } from \"../../services/ate-i18n.service\";\nimport { AteEditorCommandsService } from \"../../services/ate-editor-commands.service\";\nimport { AteColorPickerService } from \"../../services/ate-color-picker.service\";\nimport { AteLinkService } from \"../../services/ate-link.service\";\nimport { AteNoopValueAccessorDirective } from \"../../directives/ate-noop-value-accessor.directive\";\nimport { AteStateCalculator } from \"../../models/ate-editor-state.model\";\nimport { NgControl } from \"@angular/forms\";\nimport {\n filterSlashCommands,\n AteSlashCommandsConfig,\n} from \"../../config/ate-slash-commands.config\";\n\nimport { AteSelectionCalculator } from \"../../extensions/calculators/ate-selection.calculator\";\nimport { AteMarksCalculator } from \"../../extensions/calculators/ate-marks.calculator\";\nimport { AteTableCalculator } from \"../../extensions/calculators/ate-table.calculator\";\nimport { AteImageCalculator } from \"../../extensions/calculators/ate-image.calculator\";\nimport { AteStructureCalculator } from \"../../extensions/calculators/ate-structure.calculator\";\nimport { AteDiscoveryCalculator } from \"../../extensions/calculators/ate-discovery.calculator\";\n\nimport { AteToolbarConfig } from \"../../models/ate-toolbar.model\";\nimport {\n AteBubbleMenuConfig,\n AteImageBubbleMenuConfig,\n AteTableBubbleMenuConfig,\n AteCellBubbleMenuConfig,\n} from \"../../models/ate-bubble-menu.model\";\nimport { AteEditorConfig } from \"../../models/ate-editor-config.model\";\nimport { AteLinkClickBehavior } from \"../../extensions/ate-link-click-behavior.extension\";\nimport {\n ATE_DEFAULT_TOOLBAR_CONFIG,\n ATE_DEFAULT_BUBBLE_MENU_CONFIG,\n ATE_DEFAULT_IMAGE_BUBBLE_MENU_CONFIG,\n ATE_DEFAULT_TABLE_MENU_CONFIG,\n ATE_DEFAULT_CELL_MENU_CONFIG,\n} from \"../../config/ate-editor.config\";\nimport { concat, defer, Observable, of, tap } from \"rxjs\";\nimport { AteImageUploadHandler, AteImageUploadOptions } from \"../../models/ate-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: [AteNoopValueAccessorDirective],\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 AteToolbarComponent,\n AteBubbleMenuComponent,\n AteImageBubbleMenuComponent,\n AteTableBubbleMenuComponent,\n AteCellBubbleMenuComponent,\n AteSlashCommandsComponent,\n AteLinkBubbleMenuComponent,\n AteColorBubbleMenuComponent,\n AteEditToggleComponent,\n ],\n providers: [AteEditorCommandsService, AteImageService, AteColorPickerService, AteLinkService],\n template: `\n <div class=\"ate-editor\">\n <!-- Toolbar -->\n @if (finalEditable() && !mergedDisabled() && finalShowToolbar() && editor()) {\n <ate-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 <ate-edit-toggle\n [editable]=\"finalEditable()\"\n [translations]=\"currentTranslations()\"\n (editToggle)=\"toggleEditMode($event)\" />\n }\n\n <!-- Editor Content -->\n <div\n #editorElement\n class=\"ate-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 <ate-bubble-menu\n [editor]=\"editor()!\"\n [config]=\"finalBubbleMenuConfig()\"\n [style.display]=\"editorFullyInitialized() ? 'block' : 'none'\"></ate-bubble-menu>\n }\n\n <!-- Image Bubble Menu -->\n @if (finalEditable() && finalShowImageBubbleMenu() && editor()) {\n <ate-image-bubble-menu\n [editor]=\"editor()!\"\n [config]=\"finalImageBubbleMenuConfig()\"\n [imageUpload]=\"finalImageUploadConfig()\"\n [style.display]=\"editorFullyInitialized() ? 'block' : 'none'\"></ate-image-bubble-menu>\n }\n\n <!-- Link Bubble Menu -->\n @if (finalEditable() && editor()) {\n <ate-link-bubble-menu\n [editor]=\"editor()!\"\n [style.display]=\"editorFullyInitialized() ? 'block' : 'none'\"></ate-link-bubble-menu>\n }\n\n <!-- Color Bubble Menu -->\n @if (finalEditable() && editor()) {\n <ate-color-bubble-menu\n [editor]=\"editor()!\"\n [style.display]=\"editorFullyInitialized() ? 'block' : 'none'\"></ate-color-bubble-menu>\n }\n\n <!-- Slash Commands -->\n @if (finalEditable() && finalEnableSlashCommands() && editor()) {\n <ate-slash-commands\n [editor]=\"editor()!\"\n [config]=\"finalSlashCommandsConfig()\"\n [style.display]=\"editorFullyInitialized() ? 'block' : 'none'\"></ate-slash-commands>\n }\n\n <!-- Table Menu -->\n @if (finalEditable() && finalShowTableBubbleMenu() && editor()) {\n <ate-table-bubble-menu\n [editor]=\"editor()!\"\n [config]=\"finalTableBubbleMenuConfig()\"\n [style.display]=\"editorFullyInitialized() ? 'block' : 'none'\"></ate-table-bubble-menu>\n }\n\n <!-- Cell Menu -->\n @if (finalEditable() && finalShowCellBubbleMenu() && editor()) {\n <ate-cell-bubble-menu\n [editor]=\"editor()!\"\n [config]=\"finalCellBubbleMenuConfig()\"\n [style.display]=\"editorFullyInitialized() ? 'block' : 'none'\"></ate-cell-bubble-menu>\n }\n\n <!-- Counters -->\n @if (\n finalEditable() &&\n !mergedDisabled() &&\n finalShowFooter() &&\n (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 .ate-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) .ate-editor {\n overflow: visible;\n }\n\n /* Fill container mode - editor fills its parent */\n :host(.fill-container) .ate-editor {\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n\n :host(.fill-container) .ate-content-wrapper {\n flex: 1;\n min-height: 0;\n }\n\n :host(.fill-container) .ate-content {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n }\n\n .ate-editor:focus-within {\n border-color: var(--ate-focus-color);\n }\n\n /* Editor content area */\n .ate-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) .ate-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) .ate-content {\n cursor: default;\n user-select: text;\n }\n\n :host(.is-readonly) .ate-content ::ng-deep .ate-link {\n cursor: pointer;\n pointer-events: auto;\n }\n\n .ate-content::-webkit-scrollbar {\n width: var(--ate-scrollbar-width);\n }\n\n .ate-content-wrapper {\n position: relative;\n display: flex;\n flex-direction: column;\n min-height: 0;\n }\n\n .ate-content-wrapper .ate-content {\n flex: 1;\n }\n\n .ate-content::-webkit-scrollbar-track {\n background: var(--ate-scrollbar-track);\n }\n\n .ate-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 .ate-content::-webkit-scrollbar-thumb:hover {\n background: var(--ate-scrollbar-thumb-hover);\n background-clip: content-box;\n }\n\n .ate-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<AteSlashCommandsConfig>({});\n customSlashCommands = input<AteCustomSlashCommands | 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<AteBubbleMenuConfig>>(ATE_DEFAULT_BUBBLE_MENU_CONFIG);\n showImageBubbleMenu = input<boolean>(true);\n imageBubbleMenu = input<Partial<AteImageBubbleMenuConfig>>(ATE_DEFAULT_IMAGE_BUBBLE_MENU_CONFIG);\n\n // Configuration de la toolbar\n toolbar = input<Partial<AteToolbarConfig>>({});\n\n // Configuration des menus de table\n showTableBubbleMenu = input<boolean>(true);\n tableBubbleMenu = input<Partial<AteTableBubbleMenuConfig>>(ATE_DEFAULT_TABLE_MENU_CONFIG);\n showCellBubbleMenu = input<boolean>(true);\n cellBubbleMenu = input<Partial<AteCellBubbleMenuConfig>>(ATE_DEFAULT_CELL_MENU_CONFIG);\n\n /**\n * Additionnal state calculators to extend the reactive editor state.\n */\n stateCalculators = input<AteStateCalculator[]>([]);\n\n // Nouveau input pour la configuration de l'upload d'images\n imageUpload = input<Partial<AteImageUploadOptions>>({});\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<AteImageUploadHandler | 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(\n () => (this.config().disabled ?? this.disabled()) || this.isFormControlDisabled()\n );\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) {\n return fromConfig === \"seamless\";\n }\n return this.seamless();\n });\n\n readonly finalEditable = computed(() => this.config().editable ?? this.editable());\n readonly finalPlaceholder = computed(\n () =>\n this.config().placeholder ??\n (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(\n () => this.config().showEditToggle ?? this.showEditToggle()\n );\n\n readonly finalHeight = computed(\n () => this.config().height ?? (this.height() ? `${this.height()}px` : undefined)\n );\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(\n () => this.config().enableOfficePaste ?? this.enableOfficePaste()\n );\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 = ATE_DEFAULT_TOOLBAR_CONFIG;\n if (fromConfig) {\n return { ...base, ...fromConfig };\n }\n const fromInput = this.toolbar();\n return Object.keys(fromInput).length === 0 ? base : { ...base, ...fromInput };\n });\n\n readonly finalFloatingToolbar = computed(\n () => this.config().floatingToolbar ?? this.floatingToolbar()\n );\n\n readonly finalShowBubbleMenu = computed(\n () => this.config().showBubbleMenu ?? this.showBubbleMenu()\n );\n\n readonly finalBubbleMenuConfig = computed(() => {\n const fromConfig = this.config().bubbleMenu;\n const base = ATE_DEFAULT_BUBBLE_MENU_CONFIG;\n if (fromConfig) {\n return { ...base, ...fromConfig };\n }\n return Object.keys(this.bubbleMenu()).length === 0 ? base : { ...base, ...this.bubbleMenu() };\n });\n\n readonly finalShowImageBubbleMenu = computed(\n () => this.config().showImageBubbleMenu ?? this.showImageBubbleMenu()\n );\n\n readonly finalImageBubbleMenuConfig = computed(() => {\n const fromConfig = this.config().imageBubbleMenu;\n const base = ATE_DEFAULT_IMAGE_BUBBLE_MENU_CONFIG;\n if (fromConfig) {\n return { ...base, ...fromConfig };\n }\n return Object.keys(this.imageBubbleMenu()).length === 0\n ? base\n : { ...base, ...this.imageBubbleMenu() };\n });\n\n readonly finalShowTableBubbleMenu = computed(\n () => this.config().showTableMenu ?? this.showTableBubbleMenu()\n );\n\n readonly finalTableBubbleMenuConfig = computed(() => {\n const fromConfig = this.config().tableBubbleMenu;\n const base = ATE_DEFAULT_TABLE_MENU_CONFIG;\n if (fromConfig) {\n return { ...base, ...fromConfig };\n }\n return Object.keys(this.tableBubbleMenu()).length === 0\n ? base\n : { ...base, ...this.tableBubbleMenu() };\n });\n\n readonly finalShowCellBubbleMenu = computed(\n () => this.config().showCellMenu ?? this.showCellBubbleMenu()\n );\n\n readonly finalCellBubbleMenuConfig = computed(() => {\n const fromConfig = this.config().cellBubbleMenu;\n const base = ATE_DEFAULT_CELL_MENU_CONFIG;\n if (fromConfig) {\n return { ...base, ...fromConfig };\n }\n return Object.keys(this.cellBubbleMenu()).length === 0\n ? base\n : { ...base, ...this.cellBubbleMenu() };\n });\n\n readonly finalEnableSlashCommands = computed(\n () => this.config().enableSlashCommands ?? this.enableSlashCommands()\n );\n\n readonly finalSlashCommandsConfig = computed(() => {\n const fromConfig = this.config().slashCommands;\n const customConfig = this.customSlashCommands();\n\n if (customConfig) {\n return customConfig;\n }\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(\n () => this.config().showCharacterCount ?? this.showCharacterCount()\n );\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(\n () => this.config().imageUpload?.handler ?? this.imageUploadHandler()\n );\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(AteI18nService);\n readonly editorCommandsService = inject(AteEditorCommandsService);\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) {\n return;\n }\n\n // Anti-écho : on ignore ce qu'on vient d'émettre nous-mêmes\n if (content === this.lastEmittedHtml) {\n return;\n }\n\n // Double sécurité : on vérifie le contenu actuel de l'éditeur\n if (content === editor.getHTML()) {\n return;\n }\n\n // Do not overwrite content if we have a FormControl and content is empty\n if (hasFormControl && !content) {\n return;\n }\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(\n ext => ext.name === \"characterCount\"\n );\n\n if (characterCountExtension) {\n characterCountExtension.options.limit = limit;\n }\n }\n });\n\n // Effect to re-initialize editor when extensions or options change\n effect(() => {\n // Monitor extensions and options\n this.tiptapExtensions();\n this.tiptapOptions();\n\n untracked(() => {\n // Only if already initialized (post AfterViewInit)\n if (this.editorFullyInitialized()) {\n const currentEditor = this.editor();\n if (currentEditor) {\n currentEditor.destroy();\n this._editorFullyInitialized.set(false);\n this.initEditor();\n }\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: \"ate-link\",\n },\n }),\n AteLinkClickBehavior,\n Highlight.configure({\n multicolor: true,\n HTMLAttributes: {\n class: \"ate-highlight\",\n },\n }),\n AteResizableImage.configure({\n inline: false,\n allowBase64: true,\n HTMLAttributes: {\n class: \"ate-image\",\n },\n }),\n AteUploadProgress.configure({\n isUploading: () => this.editorCommandsService.isUploading(),\n uploadProgress: () => this.editorCommandsService.uploadProgress(),\n uploadMessage: () => this.editorCommandsService.uploadMessage(),\n }),\n AteTableExtension,\n AteTiptapStateExtension.configure({\n onUpdate: state => this.editorCommandsService.updateState(state),\n calculators: [\n AteSelectionCalculator,\n AteMarksCalculator,\n AteTableCalculator,\n AteImageCalculator,\n AteStructureCalculator,\n AteDiscoveryCalculator,\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 { name?: string })?.name)\n .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 (\n (this.finalShowCharacterCount() || this.finalShowWordCount()) &&\n editor.storage[\"characterCount\"]\n ) {\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()) {\n return;\n }\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(\"ate-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","import { Editor } from \"@tiptap/core\";\n\n/**\n * Clés des boutons de la barre d'outils native\n */\nexport const ATE_TOOLBAR_KEYS = [\n \"bold\",\n \"italic\",\n \"underline\",\n \"strike\",\n \"code\",\n \"codeBlock\",\n \"superscript\",\n \"subscript\",\n \"highlight\",\n \"highlightPicker\",\n \"heading1\",\n \"heading2\",\n \"heading3\",\n \"bulletList\",\n \"orderedList\",\n \"blockquote\",\n \"alignLeft\",\n \"alignCenter\",\n \"alignRight\",\n \"alignJustify\",\n \"link\",\n \"image\",\n \"horizontalRule\",\n \"table\",\n \"undo\",\n \"redo\",\n \"clear\",\n \"textColor\",\n \"separator\",\n] as const;\n\nexport type AteToolbarKey = (typeof ATE_TOOLBAR_KEYS)[number];\n\nexport interface AteToolbarConfig extends Partial<Record<AteToolbarKey, boolean>> {\n /**\n * Boutons personnalisés à ajouter\n */\n custom?: AteCustomToolbarItem[];\n}\n\nexport interface AteCustomToolbarItem {\n key: string;\n label: string;\n icon: string;\n command: (editor: Editor) => void | Promise<void>;\n}\n","import { Editor } from \"@tiptap/core\";\n\n/**\n * Clés des options du menu bulle de texte\n */\nexport const ATE_BUBBLE_MENU_KEYS = [\n \"bold\",\n \"italic\",\n \"underline\",\n \"strike\",\n \"code\",\n \"superscript\",\n \"subscript\",\n \"highlight\",\n \"highlightPicker\",\n \"textColor\",\n \"link\",\n \"separator\",\n] as const;\n\nexport type AteBubbleMenuKey = (typeof ATE_BUBBLE_MENU_KEYS)[number];\n\nexport interface AteBubbleMenuConfig extends Partial<Record<AteBubbleMenuKey, boolean>> {\n custom?: AteCustomBubbleMenuItem[];\n}\n\nexport interface AteCustomBubbleMenuItem {\n key: string;\n label: string;\n icon: string;\n command: (editor: Editor) => void | Promise<void>;\n}\n\n/**\n * Clés des options du menu bulle d'image\n */\nexport const ATE_IMAGE_BUBBLE_MENU_KEYS = [\n \"changeImage\",\n \"resizeSmall\",\n \"resizeMedium\",\n \"resizeLarge\",\n \"resizeOriginal\",\n \"deleteImage\",\n \"separator\",\n] as const;\n\nexport type AteImageBubbleMenuKey = (typeof ATE_IMAGE_BUBBLE_MENU_KEYS)[number];\n\nexport type AteImageBubbleMenuConfig = Partial<Record<AteImageBubbleMenuKey, boolean>>;\n\n/**\n * Clés des options du menu de table\n */\nexport const ATE_TABLE_BUBBLE_MENU_KEYS = [\n \"addRowBefore\",\n \"addRowAfter\",\n \"deleteRow\",\n \"addColumnBefore\",\n \"addColumnAfter\",\n \"deleteColumn\",\n \"deleteTable\",\n \"toggleHeaderRow\",\n \"toggleHeaderColumn\",\n \"separator\",\n] as const;\n\nexport type AteTableBubbleMenuKey = (typeof ATE_TABLE_BUBBLE_MENU_KEYS)[number];\n\nexport type AteTableBubbleMenuConfig = Partial<Record<AteTableBubbleMenuKey, boolean>>;\n\n/**\n * Clés des options du menu de cellule\n */\nexport const ATE_CELL_BUBBLE_MENU_KEYS = [\"mergeCells\", \"splitCell\"] as const;\n\nexport type AteCellBubbleMenuKey = (typeof ATE_CELL_BUBBLE_MENU_KEYS)[number];\n\nexport type AteCellBubbleMenuConfig = Partial<Record<AteCellBubbleMenuKey, boolean>>;\n","import { Directive, signal, Signal, WritableSignal } from \"@angular/core\";\nimport { Node as ProseMirrorNode } from \"@tiptap/pm/model\";\nimport { Decoration } from \"@tiptap/pm/view\";\nimport { Editor } from \"@tiptap/core\";\n\n/**\n * Props that are injected into Angular NodeView components\n */\nexport interface AteAngularNodeViewProps {\n editor: Editor;\n node: ProseMirrorNode;\n decorations: readonly Decoration[];\n selected: boolean;\n extension: unknown;\n getPos: () => number | undefined;\n updateAttributes: (attrs: Record<string, unknown>) => void;\n deleteNode: () => void;\n}\n\n/**\n * Base abstract class for Angular components used as TipTap NodeViews.\n *\n * Extend this class in your custom components to get access to the TipTap node properties.\n *\n * @example\n * ```typescript\n * @Component({\n * selector: 'app-counter',\n * template: `\n * <div>\n * <button (click)=\"increment()\">Count: {{ node().attrs['count'] }}</button>\n * </div>\n * `\n * })\n * export class CounterComponent extends AteAngularNodeView {\n * increment() {\n * const count = this.node().attrs['count'] || 0;\n * this.updateAttributes({ count: count + 1 });\n * }\n * }\n * ```\n */\n@Directive()\nexport abstract class AteAngularNodeView {\n /**\n * The TipTap editor instance\n */\n public editor!: Signal<Editor>;\n\n /**\n * The ProseMirror node\n */\n public node!: Signal<ProseMirrorNode>;\n\n /**\n * Decorations applied to this node\n */\n public decorations!: Signal<readonly Decoration[]>;\n\n /**\n * Whether the node is currently selected\n */\n public selected!: Signal<boolean>;\n\n /**\n * The extension instance that created this node\n */\n public extension!: Signal<unknown>;\n\n /**\n * Function to get the current position of this node in the document\n */\n public getPos!: () => number | undefined;\n\n /**\n * Update the attributes of this node\n *\n * @param attrs - Partial attributes to update\n *\n * @example\n * ```typescript\n * this.updateAttributes({ count: 5, color: 'blue' });\n * ```\n */\n public updateAttributes!: (attrs: Record<string, unknown>) => void;\n\n /**\n * Delete this node from the document\n */\n public deleteNode!: () => void;\n\n /** @internal */\n private _writableSignals?: {\n node: WritableSignal<ProseMirrorNode>;\n decorations: WritableSignal<readonly Decoration[]>;\n selected: WritableSignal<boolean>;\n };\n\n /**\n * Internal method to initialize the component with NodeView props.\n * This is called by the AngularNodeViewRenderer.\n *\n * @internal\n */\n _initNodeView(props: AteAngularNodeViewProps): void {\n // Create signals from the props\n const editorSignal = signal(props.editor);\n const nodeSignal = signal(props.node);\n const decorationsSignal = signal(props.decorations);\n const selectedSignal = signal(props.selected);\n const extensionSignal = signal(props.extension);\n\n // Assign to the component\n this.editor = editorSignal.asReadonly();\n this.node = nodeSignal.asReadonly();\n this.decorations = decorationsSignal.asReadonly();\n this.selected = selectedSignal.asReadonly();\n this.extension = extensionSignal.asReadonly();\n this.getPos = props.getPos;\n this.updateAttributes = props.updateAttributes;\n this.deleteNode = props.deleteNode;\n\n // Store writable signals for updates\n this._writableSignals = {\n node: nodeSignal,\n decorations: decorationsSignal,\n selected: selectedSignal,\n };\n }\n\n /**\n * Internal method to update the component when the node changes.\n * This is called by the AngularNodeViewRenderer.\n *\n * @internal\n */\n _updateNodeView(node: ProseMirrorNode, decorations: readonly Decoration[]): void {\n if (this._writableSignals) {\n this._writableSignals.node.set(node);\n this._writableSignals.decorations.set(decorations);\n }\n }\n\n /**\n * Internal method to update the selection state.\n * This is called by the AngularNodeViewRenderer.\n *\n * @internal\n */\n _selectNodeView(): void {\n if (this._writableSignals) {\n this._writableSignals.selected.set(true);\n }\n }\n\n /**\n * Internal method to update the deselection state.\n * This is called by the AngularNodeViewRenderer.\n *\n * @internal\n */\n _deselectNodeView(): void {\n if (this._writableSignals) {\n this._writableSignals.selected.set(false);\n }\n }\n}\n","import {\n ApplicationRef,\n createComponent,\n EnvironmentInjector,\n Type,\n ComponentRef,\n} from \"@angular/core\";\nimport { NodeView, Decoration, EditorView } from \"@tiptap/pm/view\";\nimport { Node as ProseMirrorNode } from \"@tiptap/pm/model\";\nimport { Editor } from \"@tiptap/core\";\nimport { AteAngularNodeView } from \"./ate-angular-node-view\";\nimport { AteComponentRenderOptions } from \"./ate-node-view.models\";\nimport { Subscription } from \"rxjs\";\n\n/**\n * Universal Renderer for Angular Components as TipTap NodeViews.\n *\n * Supports:\n * - TipTap-Aware components (extending AteAngularNodeView)\n * - Standard library components (automatic @Input() sync)\n * - Signal-based inputs and outputs (Angular 18+)\n * - Content projection (editableContent)\n * - Unified lifecycle and event management\n */\nexport function AteNodeViewRenderer<T>(\n component: Type<T>,\n options: AteComponentRenderOptions\n): (props: {\n node: ProseMirrorNode;\n view: EditorView;\n getPos: () => number | undefined;\n decorations: readonly Decoration[];\n editor: Editor;\n extension: unknown;\n}) => NodeView {\n return props => {\n const { node, view: _view, getPos, decorations, editor, extension } = props;\n const {\n injector,\n inputs = {},\n wrapperTag = \"div\",\n wrapperClass,\n editableContent = false,\n contentSelector,\n onOutput,\n ignoreMutation = true,\n } = options;\n\n const dom = document.createElement(wrapperTag);\n if (wrapperClass) {\n dom.className = wrapperClass;\n }\n\n const applicationRef = injector.get(ApplicationRef);\n const environmentInjector = injector.get(EnvironmentInjector);\n\n // 1. Setup Content Projection (ng-content)\n let initialNodes: Node[][] = [];\n let contentDOM: HTMLElement | null = null;\n\n if (editableContent && !contentSelector) {\n contentDOM = document.createElement(\"div\");\n contentDOM.setAttribute(\"data-node-view-content\", \"\");\n initialNodes = [[contentDOM]];\n }\n\n // 2. Create the Angular Component\n const componentRef: ComponentRef<T> = createComponent(component, {\n environmentInjector,\n elementInjector: injector,\n projectableNodes: initialNodes,\n });\n\n const instance = componentRef.instance;\n const subscriptions: Subscription[] = [];\n\n // 3. Initialize TipTap-Aware instances\n if (instance instanceof AteAngularNodeView) {\n instance._initNodeView({\n editor,\n node,\n decorations,\n selected: false,\n extension,\n getPos,\n updateAttributes: attrs => editor.commands.updateAttributes(node.type.name, attrs),\n deleteNode: () => {\n const pos = getPos();\n if (pos !== undefined) {\n editor.commands.deleteRange({ from: pos, to: pos + node.nodeSize });\n }\n },\n });\n }\n\n // 4. Synchronize Inputs (Handles standard @Input and Signal-based inputs)\n const syncInputs = (nodeToSync: ProseMirrorNode) => {\n // Combine base inputs from options with dynamic node attributes\n const mergedInputs = { ...inputs, ...nodeToSync.attrs };\n Object.entries(mergedInputs).forEach(([key, value]) => {\n if (key !== \"id\" && value !== null && value !== undefined) {\n try {\n componentRef.setInput(key, value);\n } catch {\n // Silently ignore inputs that don't exist on the component\n }\n }\n });\n };\n\n syncInputs(node);\n\n // 5. Setup Outputs (Handles EventEmitter and OutputRef)\n if (onOutput) {\n Object.entries(instance as Record<string, unknown>).forEach(([key, potentialOutput]) => {\n if (\n potentialOutput &&\n typeof (potentialOutput as { subscribe?: (cb: (val: unknown) => void) => void })\n .subscribe === \"function\"\n ) {\n const sub = (\n potentialOutput as { subscribe: (cb: (val: unknown) => void) => Subscription }\n ).subscribe((value: unknown) => {\n onOutput(key, value);\n });\n if (sub instanceof Subscription) {\n subscriptions.push(sub);\n }\n }\n });\n }\n\n // 6. Attach to DOM and ApplicationRef\n applicationRef.attachView(componentRef.hostView);\n const componentElement = componentRef.location.nativeElement;\n\n // Target specific element for content if selector provided\n if (editableContent && contentSelector) {\n contentDOM = componentElement.querySelector(contentSelector);\n }\n\n dom.appendChild(componentElement);\n\n // Initial detection to ensure the component is rendered\n componentRef.changeDetectorRef.detectChanges();\n\n // 7. Return the TipTap NodeView Interface\n return {\n dom,\n contentDOM,\n\n update: (updatedNode, updatedDecorations) => {\n if (updatedNode.type !== node.type) {\n return false;\n }\n\n // Update Aware component signals\n if (instance instanceof AteAngularNodeView) {\n instance._updateNodeView(updatedNode, updatedDecorations);\n }\n\n // Update inputs\n syncInputs(updatedNode);\n\n // Notify and Detect changes\n componentRef.changeDetectorRef.detectChanges();\n if (options.onUpdate) {\n options.onUpdate(updatedNode);\n }\n\n return true;\n },\n\n selectNode: () => {\n if (instance instanceof AteAngularNodeView) {\n instance._selectNodeView();\n }\n dom.classList.add(\"ProseMirror-selectednode\");\n },\n\n deselectNode: () => {\n if (instance instanceof AteAngularNodeView) {\n instance._deselectNodeView();\n }\n dom.classList.remove(\"ProseMirror-selectednode\");\n },\n\n destroy: () => {\n if (options.onDestroy) {\n options.onDestroy();\n }\n subscriptions.forEach(s => s.unsubscribe());\n applicationRef.detachView(componentRef.hostView);\n componentRef.destroy();\n },\n\n stopEvent: event => {\n const target = event.target as HTMLElement;\n const isEditable =\n target.tagName === \"INPUT\" || target.tagName === \"TEXTAREA\" || target.isContentEditable;\n return isEditable;\n },\n\n ignoreMutation: mutation => {\n if (typeof ignoreMutation === \"function\") {\n return ignoreMutation(mutation);\n }\n return ignoreMutation;\n },\n };\n };\n}\n","import { Injector, Type } from \"@angular/core\";\nimport { Node, mergeAttributes } from \"@tiptap/core\";\nimport { AteAngularNodeView } from \"./ate-angular-node-view\";\nimport { RegisterAngularComponentOptions } from \"./ate-node-view.models\";\nimport { AteNodeViewRenderer } from \"./ate-node-view.renderer\";\n\nconst RESERVED_NAMES = [\n \"doc\",\n \"paragraph\",\n \"text\",\n \"hardBreak\",\n \"bulletList\",\n \"orderedList\",\n \"listItem\",\n \"blockquote\",\n \"codeBlock\",\n \"heading\",\n \"horizontalRule\",\n];\n\n/**\n * Derives the TipTap node name and HTML tag from a component class.\n */\nfunction deriveMetadata(component: Type<unknown>, customName?: string) {\n let nodeName = customName;\n\n if (!nodeName) {\n nodeName = component.name\n .replace(/Component$/, \"\")\n .replace(/Node$/, \"\")\n .replace(/^([A-Z])/, m => m.toLowerCase());\n\n console.warn(\n `[ATE] Auto-deriving node name '${nodeName}' for component ${component.name}. ` +\n `Provide an explicit 'name' in options to avoid potential naming collisions.`\n );\n }\n\n if (RESERVED_NAMES.includes(nodeName)) {\n throw new Error(\n `[ATE] The name '${nodeName}' is a reserved TipTap node name. ` +\n `Please provide a unique name for your custom component.`\n );\n }\n\n const tag = nodeName.toLowerCase().replace(/([A-Z])/g, \"-$1\");\n return { nodeName, tag };\n}\n\n/**\n * Creates TipTap attributes from component inputs (Standard Mode).\n */\nfunction createStandardAttributes(defaultInputs: Record<string, unknown> = {}) {\n const tiptapAttributes: Record<string, unknown> = {};\n\n Object.entries(defaultInputs).forEach(([key, defaultValue]) => {\n tiptapAttributes[key] = {\n default: defaultValue,\n parseHTML: (element: HTMLElement) => {\n const attr = element.getAttribute(`data-${key}`);\n if (attr === null) {\n return defaultValue;\n }\n try {\n return JSON.parse(attr);\n } catch {\n return attr;\n }\n },\n renderHTML: (attrs: Record<string, unknown>) => {\n const value = attrs[key];\n if (value === undefined || value === null) {\n return {};\n }\n const serialized = typeof value === \"object\" ? JSON.stringify(value) : String(value);\n return { [`data-${key}`]: serialized };\n },\n };\n });\n\n return tiptapAttributes;\n}\n\n/**\n * Factory to transform an Angular component into a TipTap Node extension.\n * Supports both \"TipTap-Aware\" and \"Standard\" modes.\n *\n * @internal\n */\nexport function createAngularComponentExtension<T = unknown>(\n injector: Injector,\n options: RegisterAngularComponentOptions<T>\n): Node {\n const {\n component,\n name: customName,\n attributes,\n defaultInputs,\n contentSelector,\n contentMode = \"block\",\n editableContent = false,\n group = \"block\",\n draggable = true,\n ignoreMutation = true,\n onOutput,\n HTMLAttributes = {},\n parseHTML: customParseHTML,\n renderHTML: customRenderHTML,\n } = options;\n\n const { nodeName, tag } = deriveMetadata(component, customName);\n const isTipTapAware = Object.prototype.isPrototypeOf.call(AteAngularNodeView, component);\n const atom = !editableContent;\n\n // 1. Prepare Attributes\n const tiptapAttributes = isTipTapAware\n ? attributes || {}\n : createStandardAttributes(defaultInputs);\n\n // 2. Create Node Extension\n return Node.create({\n name: nodeName,\n group,\n inline: group === \"inline\",\n atom,\n draggable,\n content: editableContent ? (contentMode === \"inline\" ? \"inline*\" : \"block*\") : undefined,\n\n addAttributes() {\n return tiptapAttributes;\n },\n\n parseHTML() {\n if (customParseHTML) {\n return customParseHTML.call(this);\n }\n return [{ tag }, { tag: `div[data-component=\"${nodeName}\"]` }];\n },\n\n renderHTML({ node, HTMLAttributes: attrs }) {\n if (customRenderHTML) {\n return customRenderHTML.call(this, { node, HTMLAttributes: attrs });\n }\n return [tag, mergeAttributes(HTMLAttributes, attrs, { \"data-component\": nodeName })];\n },\n\n addNodeView() {\n return AteNodeViewRenderer(component, {\n injector,\n inputs: defaultInputs,\n wrapperTag: group === \"inline\" ? \"span\" : \"div\",\n wrapperClass: isTipTapAware\n ? `ate-node-${nodeName}`\n : `embedded-component embedded-${nodeName}`,\n atom,\n editableContent,\n contentSelector,\n contentMode,\n onOutput,\n ignoreMutation,\n });\n },\n });\n}\n","import { Injector } from \"@angular/core\";\nimport { Node } from \"@tiptap/core\";\nimport { RegisterAngularComponentOptions } from \"./ate-node-view.models\";\nimport { createAngularComponentExtension } from \"./ate-node-view.factory\";\n\n/**\n * Registers ANY Angular component as a TipTap node extension.\n *\n * This function is the single public entry point for adding custom components.\n * It supports two distinct modes:\n *\n * 1. **TipTap-Aware Mode** (the component extends `AteAngularNodeView`):\n * Grants direct access to the TipTap API (`editor`, `node`, `updateAttributes`, etc.) within the component.\n *\n * 2. **Standard Mode** (library or legacy components):\n * Allows using any existing Angular component. Its `@Input()` properties are automatically\n * synchronized with TipTap node attributes.\n *\n * @param injector - The Angular Injector (obtained via `inject(Injector)`)\n * @param options - Configuration options for the component extension\n * @returns A TipTap Node extension ready to be used\n *\n * @example\n * ```typescript\n * registerAngularComponent(injector, {\n * component: MyComponent,\n * name: 'myComponent',\n * defaultInputs: { color: 'blue' }\n * });\n * ```\n */\nexport function registerAngularComponent<T = unknown>(\n injector: Injector,\n options: RegisterAngularComponentOptions<T>\n): Node {\n return createAngularComponentExtension(injector, options);\n}\n","/*\n * Public API Surface of tiptap-editor\n */\n\n// Main component\nexport * from \"./lib/components/editor/angular-tiptap-editor.component\";\n\n// Host directive for FormControl integration (Required by Angular)\nexport * from \"./lib/directives/ate-noop-value-accessor.directive\";\n\n// Services\nexport * from \"./lib/services/ate-i18n.service\";\nexport * from \"./lib/services/ate-editor-commands.service\";\nexport * from \"./lib/services/ate-image.service\";\nexport * from \"./lib/services/ate-color-picker.service\";\nexport * from \"./lib/services/ate-link.service\";\n\n// State & Calculators (Essential for custom plugins)\nexport * from \"./lib/models/ate-editor-state.model\";\nexport * from \"./lib/extensions/calculators/ate-discovery.calculator\";\nexport * from \"./lib/extensions/calculators/ate-image.calculator\";\nexport * from \"./lib/extensions/calculators/ate-marks.calculator\";\nexport * from \"./lib/extensions/calculators/ate-selection.calculator\";\nexport * from \"./lib/extensions/calculators/ate-structure.calculator\";\nexport * from \"./lib/extensions/calculators/ate-table.calculator\";\n\n// Types and interfaces for configuration\nexport * from \"./lib/models/ate-toolbar.model\";\nexport * from \"./lib/models/ate-image.model\";\nexport * from \"./lib/models/ate-bubble-menu.model\";\nexport * from \"./lib/models/ate-editor-config.model\";\nexport type {\n AteCustomSlashCommands,\n AteSlashCommandItem,\n} from \"./lib/components/slash-commands/ate-slash-commands.component\";\n\n// Default configurations\nexport * from \"./lib/config/ate-editor.config\";\n\n// Utility functions for slash commands\nexport * from \"./lib/config/ate-slash-commands.config\";\n\n// Translations\nexport type { SupportedLocale } from \"./lib/services/ate-i18n.service\";\n\n// Angular NodeView Integration\nexport * from \"./lib/node-view/ate-angular-node-view\";\nexport * from \"./lib/node-view/ate-node-view.models\";\nexport * from \"./lib/node-view/ate-node-view.renderer\";\nexport * from \"./lib/node-view/ate-node-view.factory\";\nexport * from \"./lib/node-view/ate-register-angular-component\"; // Simplified API\n\n// ============================================\n// Deprecated Aliases (to be removed in v3.0.0)\n// ============================================\n\nimport { AteI18nService } from \"./lib/services/ate-i18n.service\";\nimport { AteEditorCommandsService } from \"./lib/services/ate-editor-commands.service\";\nimport { AteImageService } from \"./lib/services/ate-image.service\";\nimport { AteColorPickerService } from \"./lib/services/ate-color-picker.service\";\nimport { AteLinkService } from \"./lib/services/ate-link.service\";\nimport {\n AteEditorStateSnapshot,\n ATE_INITIAL_EDITOR_STATE,\n} from \"./lib/models/ate-editor-state.model\";\nimport { AteToolbarConfig } from \"./lib/models/ate-toolbar.model\";\nimport {\n AteBubbleMenuConfig,\n AteTableBubbleMenuConfig,\n AteCellBubbleMenuConfig,\n AteImageBubbleMenuConfig,\n} from \"./lib/models/ate-bubble-menu.model\";\nimport {\n AteSlashCommandsConfig,\n AteSlashCommandKey,\n ATE_SLASH_COMMAND_KEYS,\n ATE_DEFAULT_SLASH_COMMANDS_CONFIG,\n} from \"./lib/config/ate-slash-commands.config\";\nimport { AteEditorConfig } from \"./lib/models/ate-editor-config.model\";\nimport {\n AteImageUploadOptions,\n AteImageUploadHandler,\n AteImageUploadResult,\n AteImageData,\n AteResizeOptions,\n} from \"./lib/models/ate-image.model\";\nimport {\n AteCustomSlashCommands,\n AteSlashCommandItem,\n} from \"./lib/components/slash-commands/ate-slash-commands.component\";\nimport { AteDiscoveryCalculator } from \"./lib/extensions/calculators/ate-discovery.calculator\";\nimport { AteImageCalculator } from \"./lib/extensions/calculators/ate-image.calculator\";\nimport { AteMarksCalculator } from \"./lib/extensions/calculators/ate-marks.calculator\";\nimport { AteSelectionCalculator } from \"./lib/extensions/calculators/ate-selection.calculator\";\nimport { AteStructureCalculator } from \"./lib/extensions/calculators/ate-structure.calculator\";\nimport { AteTableCalculator } from \"./lib/extensions/calculators/ate-table.calculator\";\nimport {\n ATE_DEFAULT_TOOLBAR_CONFIG,\n ATE_DEFAULT_BUBBLE_MENU_CONFIG,\n ATE_DEFAULT_IMAGE_BUBBLE_MENU_CONFIG,\n ATE_DEFAULT_TABLE_MENU_CONFIG,\n ATE_DEFAULT_CELL_MENU_CONFIG,\n} from \"./lib/config/ate-editor.config\";\n\n/** @deprecated Renamed to `AteI18nService`. This alias will be removed in v3.0.0. */\nexport { AteI18nService as TiptapI18nService };\n/** @deprecated Renamed to `AteEditorCommandsService`. This alias will be removed in v3.0.0. */\nexport { AteEditorCommandsService as EditorCommandsService };\n/** @deprecated Renamed to `AteImageService`. This alias will be removed in v3.0.0. */\nexport { AteImageService as ImageService };\n/** @deprecated Renamed to `AteColorPickerService`. This alias will be removed in v3.0.0. */\nexport { AteColorPickerService as ColorPickerService };\n/** @deprecated Renamed to `AteLinkService`. This alias will be removed in v3.0.0. */\nexport { AteLinkService as LinkService };\n\n/** @deprecated Renamed to `AteEditorStateSnapshot`. This alias will be removed in v3.0.0. */\nexport type { AteEditorStateSnapshot as EditorStateSnapshot };\n/** @deprecated Renamed to `ATE_INITIAL_EDITOR_STATE`. This alias will be removed in v3.0.0. */\nexport const INITIAL_EDITOR_STATE = ATE_INITIAL_EDITOR_STATE;\n\n/** @deprecated Renamed to `AteToolbarConfig`. This alias will be removed in v3.0.0. */\nexport type { AteToolbarConfig as ToolbarConfig };\n/** @deprecated Renamed to `AteBubbleMenuConfig`. This alias will be removed in v3.0.0. */\nexport type { AteBubbleMenuConfig as BubbleMenuConfig };\n/** @deprecated Renamed to `AteTableBubbleMenuConfig`. This alias will be removed in v3.0.0. */\nexport type { AteTableBubbleMenuConfig as TableBubbleMenuConfig };\n/** @deprecated Renamed to `AteCellBubbleMenuConfig`. This alias will be removed in v3.0.0. */\nexport type { AteCellBubbleMenuConfig as CellBubbleMenuConfig };\n/** @deprecated Renamed to `AteImageBubbleMenuConfig`. This alias will be removed in v3.0.0. */\nexport type { AteImageBubbleMenuConfig as ImageBubbleMenuConfig };\n\n/** @deprecated Renamed to `AteSlashCommandsConfig`. This alias will be removed in v3.0.0. */\nexport type { AteSlashCommandsConfig as SlashCommandsConfig };\n/** @deprecated Renamed to `AteSlashCommandKey`. This alias will be removed in v3.0.0. */\nexport type { AteSlashCommandKey as SlashCommandKey };\n/** @deprecated Renamed to `ATE_SLASH_COMMAND_KEYS`. This alias will be removed in v3.0.0. */\nexport const SLASH_COMMAND_KEYS = ATE_SLASH_COMMAND_KEYS;\n/** @deprecated Renamed to `ATE_DEFAULT_SLASH_COMMANDS_CONFIG`. This alias will be removed in v3.0.0. */\nexport const DEFAULT_SLASH_COMMANDS_CONFIG = ATE_DEFAULT_SLASH_COMMANDS_CONFIG;\n\n/** @deprecated Renamed to `AteEditorConfig`. This alias will be removed in v3.0.0. */\nexport type { AteEditorConfig as EditorConfig };\n\n/** @deprecated Renamed to `AteImageUploadOptions`. This alias will be removed in v3.0.0. */\nexport type { AteImageUploadOptions as ImageUploadOptions };\n/** @deprecated Renamed to `AteImageUploadHandler`. This alias will be removed in v3.0.0. */\nexport type { AteImageUploadHandler as ImageUploadHandler };\n/** @deprecated Renamed to `AteImageUploadResult`. This alias will be removed in v3.0.0. */\nexport type { AteImageUploadResult as ImageUploadResult };\n/** @deprecated Renamed to `AteImageData`. This alias will be removed in v3.0.0. */\nexport type { AteImageData as ImageData };\n/** @deprecated Renamed to `AteResizeOptions`. This alias will be removed in v3.0.0. */\nexport type { AteResizeOptions as ResizeOptions };\n\n/** @deprecated Renamed to `AteCustomSlashCommands`. This alias will be removed in v3.0.0. */\nexport type { AteCustomSlashCommands as CustomSlashCommands };\n/** @deprecated Renamed to `AteSlashCommandItem`. This alias will be removed in v3.0.0. */\nexport type { AteSlashCommandItem as SlashCommandItem };\n\n/** @deprecated Renamed to `AteDiscoveryCalculator`. This alias will be removed in v3.0.0. */\nexport const DiscoveryCalculator = AteDiscoveryCalculator;\n/** @deprecated Renamed to `AteImageCalculator`. This alias will be removed in v3.0.0. */\nexport const ImageCalculator = AteImageCalculator;\n/** @deprecated Renamed to `AteMarksCalculator`. This alias will be removed in v3.0.0. */\nexport const MarksCalculator = AteMarksCalculator;\n/** @deprecated Renamed to `AteSelectionCalculator`. This alias will be removed in v3.0.0. */\nexport const SelectionCalculator = AteSelectionCalculator;\n/** @deprecated Renamed to `AteStructureCalculator`. This alias will be removed in v3.0.0. */\nexport const StructureCalculator = AteStructureCalculator;\n/** @deprecated Renamed to `AteTableCalculator`. This alias will be removed in v3.0.0. */\nexport const TableCalculator = AteTableCalculator;\n\n/** @deprecated Renamed to `ATE_DEFAULT_TOOLBAR_CONFIG`. This alias will be removed in v3.0.0. */\nexport const DEFAULT_TOOLBAR_CONFIG = ATE_DEFAULT_TOOLBAR_CONFIG;\n/** @deprecated Renamed to `ATE_DEFAULT_BUBBLE_MENU_CONFIG`. This alias will be removed in v3.0.0. */\nexport const DEFAULT_BUBBLE_MENU_CONFIG = ATE_DEFAULT_BUBBLE_MENU_CONFIG;\n/** @deprecated Renamed to `ATE_DEFAULT_IMAGE_BUBBLE_MENU_CONFIG`. This alias will be removed in v3.0.0. */\nexport const DEFAULT_IMAGE_BUBBLE_MENU_CONFIG = ATE_DEFAULT_IMAGE_BUBBLE_MENU_CONFIG;\n/** @deprecated Renamed to `ATE_DEFAULT_TABLE_MENU_CONFIG`. This alias will be removed in v3.0.0. */\nexport const DEFAULT_TABLE_MENU_CONFIG = ATE_DEFAULT_TABLE_MENU_CONFIG;\n/** @deprecated Renamed to `ATE_DEFAULT_CELL_MENU_CONFIG`. This alias will be removed in v3.0.0. */\nexport const DEFAULT_CELL_MENU_CONFIG = ATE_DEFAULT_CELL_MENU_CONFIG;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["Node","i1.AteNoopValueAccessorDirective"],"mappings":"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"}