@flogeez/angular-tiptap-editor 3.8.0 → 3.9.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/utils/ate-image-src-resolver.utils.ts","../../../projects/angular-tiptap-editor/src/lib/extensions/ate-resizable-image.extension.ts","../../../projects/angular-tiptap-editor/src/lib/icons/ate-default-icons.ts","../../../projects/angular-tiptap-editor/src/lib/services/ate-icon-registry.service.ts","../../../projects/angular-tiptap-editor/src/lib/extensions/ate-upload-progress.extension.ts","../../../projects/angular-tiptap-editor/src/lib/models/ate-image.model.ts","../../../projects/angular-tiptap-editor/src/lib/extensions/ate-pasted-image.extension.ts","../../../projects/angular-tiptap-editor/src/lib/extensions/ate-link-shortcut.extension.ts","../../../projects/angular-tiptap-editor/src/lib/extensions/ate-block-shortcuts.extension.ts","../../../projects/angular-tiptap-editor/src/lib/extensions/ate-paste.extension.ts","../../../projects/angular-tiptap-editor/src/lib/extensions/ate-table.extension.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-injector.registry.ts","../../../projects/angular-tiptap-editor/src/lib/node-view/ate-register-angular-component.ts","../../../projects/angular-tiptap-editor/src/lib/models/ate-editor-ref.ts","../../../projects/angular-tiptap-editor/src/lib/services/ate-editor-registry.service.ts","../../../projects/angular-tiptap-editor/src/lib/i18n/en_ateTranslations.ts","../../../projects/angular-tiptap-editor/src/lib/i18n/fr_ateTranslations.ts","../../../projects/angular-tiptap-editor/src/lib/i18n/de_ateTranslations.ts","../../../projects/angular-tiptap-editor/src/lib/i18n/pt_ateTranslations.ts","../../../projects/angular-tiptap-editor/src/lib/i18n/es_ateTranslations.ts","../../../projects/angular-tiptap-editor/src/lib/services/ate-i18n.service.ts","../../../projects/angular-tiptap-editor/src/lib/services/ate-editor-i18n.service.ts","../../../projects/angular-tiptap-editor/src/lib/components/table-of-contents/ate-table-of-contents.component.ts","../../../projects/angular-tiptap-editor/src/lib/components/table-of-contents/ate-toc-node.component.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/directives/ate-tooltip.directive.ts","../../../projects/angular-tiptap-editor/src/lib/components/ui/ate-icon.component.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-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/utils/ate-markdown.utils.ts","../../../projects/angular-tiptap-editor/src/lib/services/ate-export.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/config/ate-editor.config.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/models/ate-bubble-menu.model.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/editor/ate-block-controls.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/config/ate-global-config.token.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/extensions/ate-block-controls.extension.ts","../../../projects/angular-tiptap-editor/src/lib/utils/ate-equality.utils.ts","../../../projects/angular-tiptap-editor/src/lib/utils/ate-extensions.utils.ts","../../../projects/angular-tiptap-editor/src/lib/components/editor/angular-tiptap-editor.component.ts","../../../projects/angular-tiptap-editor/src/lib/ate-editor.provider.ts","../../../projects/angular-tiptap-editor/src/lib/icons/ate-stroke-icons.ts","../../../projects/angular-tiptap-editor/src/lib/models/ate-toolbar.model.ts","../../../projects/angular-tiptap-editor/src/lib/config/ate-toc.config.ts","../../../projects/angular-tiptap-editor/src/public-api.ts","../../../projects/angular-tiptap-editor/src/flogeez-angular-tiptap-editor.ts"],"sourcesContent":["import { isDevMode } from \"@angular/core\";\nimport { firstValueFrom, isObservable } from \"rxjs\";\nimport { AteImageSrcResolver } from \"../models/ate-image.model\";\n\nexport async function ateResolveImageSrc(\n resolver: AteImageSrcResolver | null | undefined,\n src: string\n): Promise<string> {\n if (!resolver || !src) {\n return src;\n }\n try {\n const result = resolver(src);\n const resolved = isObservable(result) ? await firstValueFrom(result) : await result;\n if (typeof resolved === \"string\" && resolved) {\n return resolved;\n }\n } catch (error) {\n if (isDevMode()) {\n console.warn(\"[ATE] imageSrcResolver failed, showing the original src instead.\", src, error);\n }\n }\n return src;\n}\n","import { Node, mergeAttributes, nodeInputRule } from \"@tiptap/core\";\nimport { AteImageSrcResolver } from \"../models/ate-image.model\";\nimport { ateResolveImageSrc } from \"../utils/ate-image-src-resolver.utils\";\n\nexport interface AteResizableImageOptions {\n inline: boolean;\n allowBase64: boolean;\n HTMLAttributes: Record<string, unknown>;\n srcResolver: () => AteImageSrcResolver | null | undefined;\n}\n\nexport interface AteResizableImageStorage {\n /** One callback per image node view: re-applies the resolver when it changes */\n srcRefreshers: Set<() => void>;\n}\n\ndeclare module \"@tiptap/core\" {\n interface Storage {\n resizableImage: AteResizableImageStorage;\n }\n\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, AteResizableImageStorage>({\n name: \"resizableImage\",\n\n addOptions() {\n return {\n inline: false,\n allowBase64: false,\n HTMLAttributes: {},\n srcResolver: () => null,\n };\n },\n\n addStorage() {\n return {\n srcRefreshers: new Set(),\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 const options = this.options;\n const storage = this.storage;\n return ({ node, getPos, editor }) => {\n let currentNode = node;\n let requestedSrc: string | null = null;\n let requestedWith: AteImageSrcResolver | null = null;\n let destroyed = false;\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"resizable-image-wrapper\";\n wrapper.style.display = \"block\";\n if (currentNode.attrs[\"textAlign\"]) {\n wrapper.style.textAlign = currentNode.attrs[\"textAlign\"];\n wrapper.setAttribute(\"data-align\", currentNode.attrs[\"textAlign\"]);\n }\n\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.alt = currentNode.attrs[\"alt\"] || \"\";\n img.title = currentNode.attrs[\"title\"] || \"\";\n img.className = \"ate-image\";\n img.style.display = \"inline-block\"; // Ensure it respects container text-align\n\n if (currentNode.attrs[\"width\"]) {\n img.width = currentNode.attrs[\"width\"];\n }\n if (currentNode.attrs[\"height\"]) {\n img.height = currentNode.attrs[\"height\"];\n }\n\n const applySrc = (src: string | null) => {\n const resolver = options.srcResolver() ?? null;\n if (!resolver || !src) {\n requestedSrc = null;\n requestedWith = null;\n img.src = src ?? \"\";\n return;\n }\n if (src === requestedSrc && resolver === requestedWith) {\n return;\n }\n // A new resolver for the same src keeps the current image until the new URL is ready, so it does not blink\n if (src !== requestedSrc) {\n img.removeAttribute(\"src\");\n }\n requestedSrc = src;\n requestedWith = resolver;\n ateResolveImageSrc(resolver, src).then(resolved => {\n if (!destroyed && requestedSrc === src && requestedWith === resolver) {\n img.src = resolved;\n }\n });\n };\n const refreshSrc = () => applySrc(currentNode.attrs[\"src\"]);\n refreshSrc();\n storage.srcRefreshers.add(refreshSrc);\n\n wrapper.appendChild(container);\n container.appendChild(img);\n\n // Allow selection in read-only mode to show bubble menu/download\n img.addEventListener(\"click\", e => {\n if (!editor.isEditable) {\n e.preventDefault();\n e.stopPropagation();\n const pos = getPos();\n if (typeof pos === \"number\") {\n editor.commands.setNodeSelection(pos);\n editor.view.focus();\n }\n }\n });\n\n // Add modern resize controls\n const resizeControls = document.createElement(\"div\");\n resizeControls.className = \"resize-controls\";\n\n // Create 2 handles (sides only) for a minimalist UI\n const handles = [\"w\", \"e\"];\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 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\n // Use current image dimensions instead of initial ones\n startWidth =\n parseInt(img.getAttribute(\"width\") || \"0\") ||\n currentNode.attrs[\"width\"] ||\n img.naturalWidth;\n startHeight =\n parseInt(img.getAttribute(\"height\") || \"0\") ||\n currentNode.attrs[\"height\"] ||\n img.naturalHeight;\n\n // Add resizing class to body\n document.body.classList.add(\"resizing\");\n\n const handleMouseMove = (e: MouseEvent) => {\n if (!isResizing) {\n return;\n }\n\n const deltaX = e.clientX - startX;\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 }\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 at the specific position\n const pos = typeof getPos === \"function\" ? getPos() : undefined;\n if (typeof pos === \"number\") {\n const finalWidth = parseInt(img.getAttribute(\"width\") || \"0\");\n const finalHeight = parseInt(img.getAttribute(\"height\") || \"0\");\n\n if (finalWidth && finalHeight) {\n editor.view.dispatch(\n editor.view.state.tr.setNodeMarkup(pos, undefined, {\n ...currentNode.attrs,\n width: finalWidth,\n height: finalHeight,\n })\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 wrapper.classList.add(\"selected\");\n container.classList.add(\"selected\");\n img.classList.add(\"selected\");\n };\n\n const deselectNode = () => {\n wrapper.classList.remove(\"selected\");\n container.classList.remove(\"selected\");\n img.classList.remove(\"selected\");\n };\n\n return {\n dom: wrapper,\n selectNode,\n deselectNode,\n update: updatedNode => {\n if (updatedNode.type.name !== \"resizableImage\") {\n return false;\n }\n\n currentNode = updatedNode;\n\n applySrc(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 if (updatedNode.attrs[\"textAlign\"]) {\n wrapper.style.textAlign = updatedNode.attrs[\"textAlign\"];\n wrapper.setAttribute(\"data-align\", updatedNode.attrs[\"textAlign\"]);\n } else {\n wrapper.style.textAlign = \"\";\n wrapper.removeAttribute(\"data-align\");\n }\n\n return true;\n },\n stopEvent: (event: Event) => {\n const target = event.target as HTMLElement;\n return !!target.closest(\".resize-controls\");\n },\n ignoreMutation: () => true,\n destroy: () => {\n destroyed = true;\n storage.srcRefreshers.delete(refreshSrc);\n },\n };\n };\n },\n});\n","// Generated by scripts/generate-ate-icons.mjs, do not edit by hand.\n// Material Symbols Outlined (weight 400) by Google, Apache License 2.0 (see THIRD_PARTY_LICENSES).\n\n/** ViewBox shared by every Material Symbols SVG */\nexport const ATE_MATERIAL_SYMBOLS_VIEWBOX = \"0 -960 960 960\";\n\nconst ADD = \"<path d=\\\"M440-440H200v-80h240v-240h80v240h240v80H520v240h-80v-240Z\\\"/>\";\nconst ADD_COLUMN_LEFT = \"<path d=\\\"M800-200v-560H560v560h240Zm-640 80v-160h80v80h240v-560H240v80h-80v-160h720v720H160Zm320-360Zm80 0h-80 80Zm0 0ZM160-360v-80H80v-80h80v-80h80v80h80v80h-80v80h-80Z\\\"/>\";\nconst ADD_COLUMN_RIGHT = \"<path d=\\\"M160-760v560h240v-560H160ZM80-120v-720h720v160h-80v-80H480v560h240v-80h80v160H80Zm400-360Zm-80 0h80-80Zm0 0Zm320 120v-80h-80v-80h80v-80h80v80h80v80h-80v80h-80Z\\\"/>\";\nconst ADD_ROW_ABOVE = \"<path d=\\\"M200-160h560v-240H200v240Zm640 80H120v-720h160v80h-80v240h560v-240h-80v-80h160v720ZM480-480Zm0 80v-80 80Zm0 0Zm-40-240v-80h-80v-80h80v-80h80v80h80v80h-80v80h-80Z\\\"/>\";\nconst ADD_ROW_BELOW = \"<path d=\\\"M200-560h560v-240H200v240Zm-80 400v-720h720v720H680v-80h80v-240H200v240h80v80H120Zm360-320Zm0-80v80-80Zm0 0ZM440-80v-80h-80v-80h80v-80h80v80h80v80h-80v80h-80Z\\\"/>\";\nconst CELL_MERGE = \"<path d=\\\"M120-120v-240h80v160h160v80H120Zm480 0v-80h160v-160h80v240H600ZM287-327l-57-56 57-57H80v-80h207l-57-57 57-56 153 153-153 153Zm386 0L520-480l153-153 57 56-57 57h207v80H673l57 57-57 56ZM120-600v-240h240v80H200v160h-80Zm640 0v-160H600v-80h240v240h-80Z\\\"/>\";\nconst CHECK = \"<path d=\\\"M382-240 154-468l57-57 171 171 367-367 57 57-424 424Z\\\"/>\";\nconst CLOSE = \"<path d=\\\"m256-200-56-56 224-224-224-224 56-56 224 224 224-224 56 56-224 224 224 224-56 56-224-224-224 224Z\\\"/>\";\nconst CODE = \"<path d=\\\"M320-240 80-480l240-240 57 57-184 184 183 183-56 56Zm320 0-57-57 184-184-183-183 56-56 240 240-240 240Z\\\"/>\";\nconst COLORIZE = \"<path d=\\\"M120-120v-190l358-358-58-56 58-56 76 76 124-124q5-5 12.5-8t15.5-3q8 0 15 3t13 8l94 94q5 6 8 13t3 15q0 8-3 15.5t-8 12.5L705-555l76 78-57 57-56-58-358 358H120Zm80-80h78l332-334-76-76-334 332v78Zm447-410 96-96-37-37-96 96 37 37Zm0 0-37-37 37 37Z\\\"/>\";\nconst CROP_SQUARE = \"<path d=\\\"M200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v560q0 33-23.5 56.5T760-120H200Zm0-80h560v-560H200v560Zm0 0v-560 560Z\\\"/>\";\nconst DELETE = \"<path d=\\\"M280-120q-33 0-56.5-23.5T200-200v-520h-40v-80h200v-40h240v40h200v80h-40v520q0 33-23.5 56.5T680-120H280Zm400-600H280v520h400v-520ZM360-280h80v-360h-80v360Zm160 0h80v-360h-80v360ZM280-720v520-520Z\\\"/>\";\nconst DELETE_FOREVER = \"<path d=\\\"m376-300 104-104 104 104 56-56-104-104 104-104-56-56-104 104-104-104-56 56 104 104-104 104 56 56Zm-96 180q-33 0-56.5-23.5T200-200v-520h-40v-80h200v-40h240v40h200v80h-40v520q0 33-23.5 56.5T680-120H280Zm400-600H280v520h400v-520Zm-400 0v520-520Z\\\"/>\";\nconst DOCK_TO_RIGHT = \"<path d=\\\"M200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v560q0 33-23.5 56.5T760-120H200Zm120-80v-560H200v560h120Zm80 0h360v-560H400v560Zm-80 0H200h120Z\\\"/>\";\nconst DOWNLOAD = \"<path d=\\\"M480-320 280-520l56-58 104 104v-326h80v326l104-104 56 58-200 200ZM240-160q-33 0-56.5-23.5T160-240v-120h80v120h480v-120h80v120q0 33-23.5 56.5T720-160H240Z\\\"/>\";\nconst DRAG_INDICATOR = \"<path d=\\\"M360-160q-33 0-56.5-23.5T280-240q0-33 23.5-56.5T360-320q33 0 56.5 23.5T440-240q0 33-23.5 56.5T360-160Zm240 0q-33 0-56.5-23.5T520-240q0-33 23.5-56.5T600-320q33 0 56.5 23.5T680-240q0 33-23.5 56.5T600-160ZM360-400q-33 0-56.5-23.5T280-480q0-33 23.5-56.5T360-560q33 0 56.5 23.5T440-480q0 33-23.5 56.5T360-400Zm240 0q-33 0-56.5-23.5T520-480q0-33 23.5-56.5T600-560q33 0 56.5 23.5T680-480q0 33-23.5 56.5T600-400ZM360-640q-33 0-56.5-23.5T280-720q0-33 23.5-56.5T360-800q33 0 56.5 23.5T440-720q0 33-23.5 56.5T360-640Zm240 0q-33 0-56.5-23.5T520-720q0-33 23.5-56.5T600-800q33 0 56.5 23.5T680-720q0 33-23.5 56.5T600-640Z\\\"/>\";\nconst DRIVE_FILE_RENAME_OUTLINE = \"<path d=\\\"m400-120 160-160h320v160H400Zm-240-80h57l391-391-57-57-391 391v57Zm-80 80v-170l528-527q12-11 26.5-17t30.5-6q16 0 31 6t26 18l55 56q12 11 17.5 26t5.5 30q0 16-5.5 30.5T777-647L250-120H80Zm640-584-56-56 56 56Zm-141 85-28-29 57 57-29-28Z\\\"/>\";\nconst EDIT = \"<path d=\\\"M200-200h57l391-391-57-57-391 391v57Zm-80 80v-170l528-527q12-11 26.5-17t30.5-6q16 0 31 6t26 18l55 56q12 11 17.5 26t5.5 30q0 16-5.5 30.5T817-647L290-120H120Zm640-584-56-56 56 56Zm-141 85-28-29 57 57-29-28Z\\\"/>\";\nconst FORMAT_ALIGN_CENTER = \"<path d=\\\"M120-120v-80h720v80H120Zm160-160v-80h400v80H280ZM120-440v-80h720v80H120Zm160-160v-80h400v80H280ZM120-760v-80h720v80H120Z\\\"/>\";\nconst FORMAT_ALIGN_JUSTIFY = \"<path d=\\\"M120-120v-80h720v80H120Zm0-160v-80h720v80H120Zm0-160v-80h720v80H120Zm0-160v-80h720v80H120Zm0-160v-80h720v80H120Z\\\"/>\";\nconst FORMAT_ALIGN_LEFT = \"<path d=\\\"M120-120v-80h720v80H120Zm0-160v-80h480v80H120Zm0-160v-80h720v80H120Zm0-160v-80h480v80H120Zm0-160v-80h720v80H120Z\\\"/>\";\nconst FORMAT_ALIGN_RIGHT = \"<path d=\\\"M120-760v-80h720v80H120Zm240 160v-80h480v80H360ZM120-440v-80h720v80H120Zm240 160v-80h480v80H360ZM120-120v-80h720v80H120Z\\\"/>\";\nconst FORMAT_BOLD = \"<path d=\\\"M272-200v-560h221q65 0 120 40t55 111q0 51-23 78.5T602-491q25 11 55.5 41t30.5 90q0 89-65 124.5T501-200H272Zm121-112h104q48 0 58.5-24.5T566-372q0-11-10.5-35.5T494-432H393v120Zm0-228h93q33 0 48-17t15-38q0-24-17-39t-44-15h-95v109Z\\\"/>\";\nconst FORMAT_COLOR_FILL = \"<path d=\\\"m247-904 57-56 343 343q23 23 23 57t-23 57L457-313q-23 23-57 23t-57-23L153-503q-23-23-23-57t23-57l190-191-96-96Zm153 153L209-560h382L400-751Zm303.5 447.5Q680-327 680-360q0-21 12.5-45t27.5-45q9-12 19-25t21-25q11 12 21 25t19 25q15 21 27.5 45t12.5 45q0 33-23.5 56.5T760-280q-33 0-56.5-23.5ZM80 0v-160h800V0H80Z\\\"/>\";\nconst FORMAT_COLOR_RESET = \"<path d=\\\"M800-436q0 36-8 69t-22 63l-62-60q6-17 9-34.5t3-37.5q0-47-17.5-89T650-600L480-768l-88 86-56-56 144-142 226 222q44 42 69 99.5T800-436Zm-8 380L668-180q-41 29-88 44.5T480-120q-133 0-226.5-92.5T160-436q0-51 16-98t48-90L56-792l56-56 736 736-56 56ZM480-200q36 0 68.5-10t61.5-28L280-566q-21 32-30.5 64t-9.5 66q0 98 70 167t170 69Zm-37-204Zm110-116Z\\\"/>\";\nconst FORMAT_COLOR_TEXT = \"<path d=\\\"M80 0v-160h800V0H80Zm140-280 210-560h100l210 560h-96l-50-144H368l-52 144h-96Zm176-224h168l-82-232h-4l-82 232Z\\\"/>\";\nconst FORMAT_H1 = \"<path d=\\\"M200-280v-400h80v160h160v-160h80v400h-80v-160H280v160h-80Zm480 0v-320h-80v-80h160v400h-80Z\\\"/>\";\nconst FORMAT_H2 = \"<path d=\\\"M120-280v-400h80v160h160v-160h80v400h-80v-160H200v160h-80Zm400 0v-160q0-33 23.5-56.5T600-520h160v-80H520v-80h240q33 0 56.5 23.5T840-600v80q0 33-23.5 56.5T760-440H600v80h240v80H520Z\\\"/>\";\nconst FORMAT_H3 = \"<path d=\\\"M120-280v-400h80v160h160v-160h80v400h-80v-160H200v160h-80Zm400 0v-80h240v-80H600v-80h160v-80H520v-80h240q33 0 56.5 23.5T840-600v240q0 33-23.5 56.5T760-280H520Z\\\"/>\";\nconst FORMAT_ITALIC = \"<path d=\\\"M200-200v-100h160l120-360H320v-100h400v100H580L460-300h140v100H200Z\\\"/>\";\nconst FORMAT_LIST_BULLETED = \"<path d=\\\"M360-200v-80h480v80H360Zm0-240v-80h480v80H360Zm0-240v-80h480v80H360ZM200-160q-33 0-56.5-23.5T120-240q0-33 23.5-56.5T200-320q33 0 56.5 23.5T280-240q0 33-23.5 56.5T200-160Zm0-240q-33 0-56.5-23.5T120-480q0-33 23.5-56.5T200-560q33 0 56.5 23.5T280-480q0 33-23.5 56.5T200-400Zm-56.5-263.5Q120-687 120-720t23.5-56.5Q167-800 200-800t56.5 23.5Q280-753 280-720t-23.5 56.5Q233-640 200-640t-56.5-23.5Z\\\"/>\";\nconst FORMAT_LIST_NUMBERED = \"<path d=\\\"M120-80v-60h100v-30h-60v-60h60v-30H120v-60h120q17 0 28.5 11.5T280-280v40q0 17-11.5 28.5T240-200q17 0 28.5 11.5T280-160v40q0 17-11.5 28.5T240-80H120Zm0-280v-110q0-17 11.5-28.5T160-510h60v-30H120v-60h120q17 0 28.5 11.5T280-560v70q0 17-11.5 28.5T240-450h-60v30h100v60H120Zm60-280v-180h-60v-60h120v240h-60Zm180 440v-80h480v80H360Zm0-240v-80h480v80H360Zm0-240v-80h480v80H360Z\\\"/>\";\nconst FORMAT_QUOTE = \"<path d=\\\"m228-240 92-160q-66 0-113-47t-47-113q0-66 47-113t113-47q66 0 113 47t47 113q0 23-5.5 42.5T458-480L320-240h-92Zm360 0 92-160q-66 0-113-47t-47-113q0-66 47-113t113-47q66 0 113 47t47 113q0 23-5.5 42.5T818-480L680-240h-92ZM362.5-517.5Q380-535 380-560t-17.5-42.5Q345-620 320-620t-42.5 17.5Q260-585 260-560t17.5 42.5Q295-500 320-500t42.5-17.5Zm360 0Q740-535 740-560t-17.5-42.5Q705-620 680-620t-42.5 17.5Q620-585 620-560t17.5 42.5Q655-500 680-500t42.5-17.5ZM680-560Zm-360 0Z\\\"/>\";\nconst FORMAT_UNDERLINED = \"<path d=\\\"M200-120v-80h560v80H200Zm123-223q-56-63-56-167v-330h103v336q0 56 28 91t82 35q54 0 82-35t28-91v-336h103v330q0 104-56 167t-157 63q-101 0-157-63Z\\\"/>\";\nconst HIGHLIGHT = \"<path d=\\\"m226-640-86-84 56-58 86 86-56 56Zm214-120v-120h80v120h-80Zm296 120-58-56 86-84 56 56-84 84ZM360-80v-200L240-400v-200h480v200L600-280v200H360Zm80-80h80v-153l120-120v-87H320v87l120 120v153Zm40-180Z\\\"/>\";\nconst HORIZONTAL_RULE = \"<path d=\\\"M160-440v-80h640v80H160Z\\\"/>\";\nconst IMAGE = \"<path d=\\\"M200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v560q0 33-23.5 56.5T760-120H200Zm0-80h560v-560H200v560Zm40-80h480L570-480 450-320l-90-120-120 160Zm-40 80v-560 560Z\\\"/>\";\nconst LINK = \"<path d=\\\"M440-280H280q-83 0-141.5-58.5T80-480q0-83 58.5-141.5T280-680h160v80H280q-50 0-85 35t-35 85q0 50 35 85t85 35h160v80ZM320-440v-80h320v80H320Zm200 160v-80h160q50 0 85-35t35-85q0-50-35-85t-85-35H520v-80h160q83 0 141.5 58.5T880-480q0 83-58.5 141.5T680-280H520Z\\\"/>\";\nconst LINK_OFF = \"<path d=\\\"m770-302-60-62q40-11 65-42.5t25-73.5q0-50-35-85t-85-35H520v-80h160q83 0 141.5 58.5T880-480q0 57-29.5 105T770-302ZM634-440l-80-80h86v80h-6ZM792-56 56-792l56-56 736 736-56 56ZM440-280H280q-83 0-141.5-58.5T80-480q0-69 42-123t108-71l74 74h-24q-50 0-85 35t-35 85q0 50 35 85t85 35h160v80ZM320-440v-80h65l79 80H320Z\\\"/>\";\nconst OPEN_IN_NEW = \"<path d=\\\"M200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h280v80H200v560h560v-280h80v280q0 33-23.5 56.5T760-120H200Zm188-212-56-56 372-372H560v-80h280v280h-80v-144L388-332Z\\\"/>\";\nconst PHOTO = \"<path d=\\\"M200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v560q0 33-23.5 56.5T760-120H200Zm0-80h560v-560H200v560Zm40-80h480L570-480 450-320l-90-120-120 160Zm-40 80v-560 560Z\\\"/>\";\nconst REDO = \"<path d=\\\"M396-200q-97 0-166.5-63T160-420q0-94 69.5-157T396-640h252L544-744l56-56 200 200-200 200-56-56 104-104H396q-63 0-109.5 40T240-420q0 60 46.5 100T396-280h284v80H396Z\\\"/>\";\nconst SPLIT_SCENE = \"<path d=\\\"M200-160q-33 0-56.5-23.5T120-240v-480q0-33 23.5-56.5T200-800h160v80H200v480h160v80H200Zm240 80v-800h80v80h240q33 0 56.5 23.5T840-720v480q0 33-23.5 56.5T760-160H520v80h-80Zm80-160h240v-480H520v480Zm-320 0v-480 480Zm560 0v-480 480Z\\\"/>\";\nconst STRIKETHROUGH_S = \"<path d=\\\"M486-160q-76 0-135-45t-85-123l88-38q14 48 48.5 79t85.5 31q42 0 76-20t34-64q0-18-7-33t-19-27h112q5 14 7.5 28.5T694-340q0 86-61.5 133T486-160ZM80-480v-80h800v80H80Zm402-326q66 0 115.5 32.5T674-674l-88 39q-9-29-33.5-52T484-710q-41 0-68 18.5T386-640h-96q2-69 54.5-117.5T482-806Z\\\"/>\";\nconst SUBSCRIPT = \"<path d=\\\"M760-160v-80q0-17 11.5-28.5T800-280h80v-40H760v-40h120q17 0 28.5 11.5T920-320v40q0 17-11.5 28.5T880-240h-80v40h120v40H760Zm-525-80 185-291-172-269h106l124 200h4l123-200h107L539-531l186 291H618L482-457h-4L342-240H235Z\\\"/>\";\nconst SUPERSCRIPT = \"<path d=\\\"M760-600v-80q0-17 11.5-28.5T800-720h80v-40H760v-40h120q17 0 28.5 11.5T920-760v40q0 17-11.5 28.5T880-680h-80v40h120v40H760ZM235-160l185-291-172-269h106l124 200h4l123-200h107L539-451l186 291H618L482-377h-4L342-160H235Z\\\"/>\";\nconst TABLE_VIEW = \"<path d=\\\"M320-80q-33 0-56.5-23.5T240-160v-480q0-33 23.5-56.5T320-720h480q33 0 56.5 23.5T880-640v480q0 33-23.5 56.5T800-80H320Zm0-80h200v-120H320v120Zm280 0h200v-120H600v120ZM80-240v-560q0-33 23.5-56.5T160-880h560v80H160v560H80Zm240-120h200v-120H320v120Zm280 0h200v-120H600v120ZM320-560h480v-80H320v80Z\\\"/>\";\nconst TERMINAL = \"<path d=\\\"M160-160q-33 0-56.5-23.5T80-240v-480q0-33 23.5-56.5T160-800h640q33 0 56.5 23.5T880-720v480q0 33-23.5 56.5T800-160H160Zm0-80h640v-400H160v400Zm140-40-56-56 103-104-104-104 57-56 160 160-160 160Zm180 0v-80h240v80H480Z\\\"/>\";\nconst TOOLBAR = \"<path d=\\\"M200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v560q0 33-23.5 56.5T760-120H200Zm0-520h560v-120H200v120Zm560 80H200v360h560v-360Zm-560-80v80-80Zm0 0v-120 120Zm0 80v360-360Z\\\"/>\";\nconst UNDO = \"<path d=\\\"M280-200v-80h284q63 0 109.5-40T720-420q0-60-46.5-100T564-560H312l104 104-56 56-200-200 200-200 56 56-104 104h252q97 0 166.5 63T800-420q0 94-69.5 157T564-200H280Z\\\"/>\";\nconst VISIBILITY = \"<path d=\\\"M607.5-372.5Q660-425 660-500t-52.5-127.5Q555-680 480-680t-127.5 52.5Q300-575 300-500t52.5 127.5Q405-320 480-320t127.5-52.5Zm-204-51Q372-455 372-500t31.5-76.5Q435-608 480-608t76.5 31.5Q588-545 588-500t-31.5 76.5Q525-392 480-392t-76.5-31.5ZM214-281.5Q94-363 40-500q54-137 174-218.5T480-800q146 0 266 81.5T920-500q-54 137-174 218.5T480-200q-146 0-266-81.5ZM480-500Zm207.5 160.5Q782-399 832-500q-50-101-144.5-160.5T480-720q-113 0-207.5 59.5T128-500q50 101 144.5 160.5T480-280q113 0 207.5-59.5Z\\\"/>\";\n\n/** Inner SVG markup of the library icons, keyed by what they do */\nexport const ATE_DEFAULT_ICONS = {\n bold: FORMAT_BOLD,\n italic: FORMAT_ITALIC,\n underline: FORMAT_UNDERLINED,\n strike: STRIKETHROUGH_S,\n code: CODE,\n superscript: SUPERSCRIPT,\n subscript: SUBSCRIPT,\n highlight: HIGHLIGHT,\n link: LINK,\n heading1: FORMAT_H1,\n heading2: FORMAT_H2,\n heading3: FORMAT_H3,\n bulletList: FORMAT_LIST_BULLETED,\n orderedList: FORMAT_LIST_NUMBERED,\n blockquote: FORMAT_QUOTE,\n codeBlock: TERMINAL,\n horizontalRule: HORIZONTAL_RULE,\n image: IMAGE,\n table: TABLE_VIEW,\n tableOfContents: FORMAT_LIST_BULLETED,\n alignLeft: FORMAT_ALIGN_LEFT,\n alignCenter: FORMAT_ALIGN_CENTER,\n alignRight: FORMAT_ALIGN_RIGHT,\n alignJustify: FORMAT_ALIGN_JUSTIFY,\n textColor: FORMAT_COLOR_TEXT,\n highlightColor: FORMAT_COLOR_FILL,\n customColor: COLORIZE,\n unsetColor: FORMAT_COLOR_RESET,\n openLink: OPEN_IN_NEW,\n unsetLink: LINK_OFF,\n changeImage: DRIVE_FILE_RENAME_OUTLINE,\n downloadImage: DOWNLOAD,\n resizeSmall: CROP_SQUARE,\n resizeMedium: CROP_SQUARE,\n resizeLarge: CROP_SQUARE,\n resizeOriginal: PHOTO,\n deleteImage: DELETE,\n imageUpload: IMAGE,\n addRowBefore: ADD_ROW_ABOVE,\n addRowAfter: ADD_ROW_BELOW,\n deleteRow: DELETE,\n addColumnBefore: ADD_COLUMN_LEFT,\n addColumnAfter: ADD_COLUMN_RIGHT,\n deleteColumn: DELETE,\n toggleHeaderRow: TOOLBAR,\n toggleHeaderColumn: DOCK_TO_RIGHT,\n deleteTable: DELETE_FOREVER,\n mergeCells: CELL_MERGE,\n splitCell: SPLIT_SCENE,\n undo: UNDO,\n redo: REDO,\n clearContent: DELETE,\n blockAdd: ADD,\n blockDrag: DRAG_INDICATOR,\n edit: EDIT,\n preview: VISIBILITY,\n apply: CHECK,\n clear: CLOSE,\n} as const satisfies Record<string, string>;\n\n/** Name of an icon used by the library */\nexport type AteIconName = keyof typeof ATE_DEFAULT_ICONS;\n","import { Injectable, InjectionToken, inject, signal } from \"@angular/core\";\nimport {\n ATE_DEFAULT_ICONS,\n ATE_MATERIAL_SYMBOLS_VIEWBOX,\n AteIconName,\n} from \"../icons/ate-default-icons\";\n\n/**\n * An icon name: a library icon (autocompleted), a custom registered icon,\n * or any Material Symbols name rendered with the font.\n */\nexport type AteIconKey = AteIconName | (string & {});\n\n/**\n * Icons keyed by name. Library icons are keyed by what they do (`bold`, `addRowBefore`…).\n * Each value is SVG markup:\n * - a full `<svg>` element (any viewBox), used as-is: it keeps its own `fill` and `stroke`\n * (use `currentColor` in them to follow the text color, e.g. stroke icons like Lucide);\n * - or only its inner markup (`<path d=\"…\"/>`), drawn in the Material Symbols viewBox\n * (`0 -960 960 960`) and filled with `currentColor`.\n *\n * Icons are sized with `1em`.\n */\nexport type AteIcons = Partial<Record<AteIconName, string>> & Record<string, string>;\n\n/**\n * Injection Token for the icons registered with `provideAteIcons()`.\n */\nexport const ATE_ICONS = new InjectionToken<AteIcons[]>(\"ATE_ICONS\");\n\n/**\n * A root-level registry resolving icon names to SVG markup.\n *\n * The library ships the SVG of every icon it uses, so the Material Symbols font is not required.\n * Names that are not registered fall back to the Material Symbols font ligature: load the font\n * to use any Material Symbols name in custom toolbar items, bubble menus or slash commands.\n */\n@Injectable({\n providedIn: \"root\",\n})\nexport class AteIconRegistry {\n private readonly _icons = signal<Record<string, string>>(\n Object.assign({}, ATE_DEFAULT_ICONS, ...(inject(ATE_ICONS, { optional: true }) ?? []))\n );\n\n /**\n * Register or override icons at runtime.\n */\n register(icons: AteIcons): void {\n this._icons.update(current => ({ ...current, ...icons }));\n }\n\n /**\n * Full SVG markup of an icon, or null when it is not registered.\n * Reactive when called inside a computed or an effect.\n */\n svg(name: AteIconKey): string | null {\n const icon = this._icons()[name];\n if (!icon) {\n return null;\n }\n return icon.trimStart().startsWith(\"<svg\")\n ? icon\n : `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"${ATE_MATERIAL_SYMBOLS_VIEWBOX}\" fill=\"currentColor\">${icon}</svg>`;\n }\n\n /**\n * Markup drawing an icon: its SVG, or the Material Symbols font ligature when it is not registered.\n */\n markup(name: AteIconKey): string {\n return this.svg(name) ?? `<span class=\"material-symbols-outlined\">${escapeHtml(name)}</span>`;\n }\n\n /**\n * HTML of an icon for contexts outside Angular templates (ProseMirror widgets, raw HTML).\n */\n html(name: AteIconKey, className = \"\"): string {\n const classes = escapeHtml(`ate-icon ${className}`.trim());\n return `<span class=\"${classes}\" aria-hidden=\"true\">${this.markup(name)}</span>`;\n }\n}\n\nfunction escapeHtml(value: string): string {\n return value.replace(\n /[&<>\"']/g,\n char => ({ \"&\": \"&amp;\", \"<\": \"&lt;\", \">\": \"&gt;\", '\"': \"&quot;\", \"'\": \"&#39;\" })[char]!\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 /** HTML of the icon shown while uploading */\n iconHtml: () => 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 iconHtml: () => \"\",\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 ${options.iconHtml()}\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 .ate-icon {\n display: inline-flex;\n width: 1em;\n height: 1em;\n font-size: 24px;\n }\n .upload-icon .ate-icon > svg {\n width: 100%;\n height: 100%;\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 ${options.iconHtml()}\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 { Observable } from \"rxjs\";\n\nexport interface AteImageData {\n src: string;\n alt?: string;\n title?: string;\n width?: number;\n height?: number;\n}\n\nexport interface AteImageUploadResult {\n src: string;\n name: string;\n size: number;\n type: string;\n width?: number;\n height?: number;\n originalSize?: number;\n}\n\n/** Why an image failed validation: its type is not in `allowedTypes`, or it exceeds `maxSize` */\nexport type AteImageValidationReason = \"invalid-type\" | \"too-large\";\n\n/**\n * Thrown when an image fails validation, before compression and before `imageUploadHandler` runs.\n * `message` is the translated, user-facing text.\n */\nexport class AteImageValidationError extends Error {\n constructor(\n readonly reason: AteImageValidationReason,\n message: string\n ) {\n super(message);\n this.name = \"AteImageValidationError\";\n }\n}\n\n/** Where a rejected image file came from */\nexport type AteImageSource = \"paste\" | \"drop\" | \"picker\" | \"api\";\n\n/**\n * Emitted when an image file cannot be inserted.\n * - `invalid-type`: the file type is not in `allowedTypes`\n * - `too-large`: the file exceeds `maxSize`\n * - `upload-failed`: processing or `imageUploadHandler` failed\n *\n * `source` is `paste` (clipboard file), `drop`, `picker` (toolbar, slash menu, image bubble menu)\n * or `api` (`uploadImage`).\n */\nexport interface AteImageRejection {\n reason: AteImageValidationReason | \"upload-failed\";\n file: File;\n source: AteImageSource;\n}\n\n/**\n * Emitted when an image found in pasted HTML cannot be kept.\n * - `unreachable`: the page cannot load its source (e.g. `attachment:`, `file:`, `cid:`, foreign `blob:`, malformed base64)\n * - `invalid-type`: a pasted base64 image has a type that is not in `allowedTypes`\n * - `too-large`: a pasted base64 image exceeds `maxSize`\n * - `upload-failed`: a pasted base64 image was rejected by the upload handler\n */\nexport interface AtePastedImageRejection {\n reason: \"unreachable\" | AteImageValidationReason | \"upload-failed\";\n src: string;\n}\n\nexport interface AteResizeOptions {\n width?: number;\n height?: number;\n maintainAspectRatio?: boolean;\n}\n\nexport interface AteImageUploadOptions {\n quality?: number;\n maxWidth?: number;\n maxHeight?: number;\n maxSize?: number; // in bytes\n allowedTypes?: string[];\n}\n\n/**\n * Context passed to the image upload handler containing information about the image\n */\nexport interface AteImageUploadContext {\n /** Original file being uploaded */\n file: File;\n /** Width of the processed image */\n width: number;\n /** Height of the processed image */\n height: number;\n /** MIME type of the image */\n type: string;\n /** Base64 data URL of the processed image (after compression/resize) */\n base64: string;\n}\n\n/**\n * Result expected from a custom image upload handler.\n * Must contain at least the `src` property with the image URL.\n */\nexport interface AteImageUploadHandlerResult {\n /** URL of the uploaded image (can be a remote URL or any string) */\n src: string;\n /** Optional custom alt text */\n alt?: string;\n /** Optional custom title */\n title?: string;\n}\n\n/**\n * Custom handler function for image uploads.\n * Allows users to implement their own image storage logic (e.g., upload to S3, Cloudinary, etc.)\n *\n * Can return either a Promise or an Observable (Angular-friendly).\n *\n * @param context - Context containing the image file and metadata\n * @returns Promise or Observable resolving to ImageUploadHandlerResult\n *\n * @example Using Promise (async/await)\n * ```typescript\n * uploadHandler: ImageUploadHandler = async (ctx) => {\n * const formData = new FormData();\n * formData.append('image', ctx.file);\n * const result = await firstValueFrom(this.http.post<{url: string}>('/api/upload', formData));\n * return { src: result.url };\n * };\n * ```\n *\n * @example Using Observable (Angular HttpClient)\n * ```typescript\n * uploadHandler: ImageUploadHandler = (ctx) => {\n * const formData = new FormData();\n * formData.append('image', ctx.file);\n * return this.http.post<{url: string}>('/api/upload', formData).pipe(\n * map(result => ({ src: result.url }))\n * );\n * };\n * ```\n */\nexport type AteImageUploadHandler = (\n context: AteImageUploadContext\n) => Promise<AteImageUploadHandlerResult> | Observable<AteImageUploadHandlerResult>;\n\n/**\n * Interface dedicated to image upload configuration.\n */\nexport interface AteImageUploadConfig {\n /** Callback function to handle upload (Promise or Observable) */\n handler?: AteImageUploadHandler;\n /** Compression quality (0 to 1) */\n quality?: number;\n /** Maximum allowed width in pixels */\n maxWidth?: number;\n /** Maximum allowed height in pixels */\n maxHeight?: number;\n /** Maximum allowed size in MB */\n maxSize?: number;\n /** Accepted file types (e.g., ['image/jpeg', 'image/png']) */\n allowedTypes?: string[];\n}\n\n/**\n * Maps the `src` stored in the document to the URL the editor displays (and downloads).\n * The document, `getHTML()`, `getJSON()` and exports always keep the original `src`.\n *\n * Use it for images that cannot be loaded by a plain `<img src>`, e.g. endpoints that need an\n * authorization header: fetch the image and resolve to a `blob:` URL.\n *\n * Can return a string, a Promise or an Observable (only the first emission is used).\n * When it throws, rejects or emits nothing, the original `src` is displayed instead.\n * The library never revokes the URLs it returns: if you create `blob:` URLs, you own their lifetime.\n */\nexport type AteImageSrcResolver = (src: string) => string | Promise<string> | Observable<string>;\n","import { Editor, Extension } from \"@tiptap/core\";\nimport { Fragment, Node as ProseMirrorNode, Slice } from \"@tiptap/pm/model\";\nimport { Plugin, PluginKey } from \"@tiptap/pm/state\";\nimport { AteImageValidationError, AtePastedImageRejection } from \"../models/ate-image.model\";\n\nconst IMAGE_NODE_NAMES = new Set([\"resizableImage\", \"image\"]);\nconst REMOTE_SRC = /^(https?:)?\\/\\//i;\nconst INLINE_SRC = /^data:(image\\/[\\w.+-]+);base64,(.*)$/is;\nconst PASTED_IMAGE_BASENAME = \"pasted-image\";\n\nexport type AtePastedImageSource = \"remote\" | \"inline\" | \"unreachable\";\n\nexport interface AtePastedImageOptions {\n /** Whether pasted base64 images should be sent to the upload handler */\n shouldRehost: () => boolean;\n /** Uploads a pasted base64 image and resolves to its hosted URL */\n rehost: (file: File) => Promise<string>;\n /** Called for every pasted image that could not be kept */\n onRejected: (rejection: AtePastedImageRejection) => void;\n}\n\n/**\n * Classifies the `src` of an image found in pasted HTML.\n * `unreachable` sources (e.g. `attachment:`, `file:`, `cid:`, foreign `blob:`) cannot be fetched by the page.\n */\nexport function classifyPastedImageSrc(\n src: string | null | undefined,\n origin: string = typeof location !== \"undefined\" ? location.origin : \"\"\n): AtePastedImageSource {\n if (!src) {\n return \"unreachable\";\n }\n if (REMOTE_SRC.test(src) || (src.startsWith(\"/\") && !src.startsWith(\"//\"))) {\n return \"remote\";\n }\n if (origin && src.startsWith(`blob:${origin}/`)) {\n return \"remote\";\n }\n return INLINE_SRC.test(src) ? \"inline\" : \"unreachable\";\n}\n\n/** Decodes a base64 image data URI into a `File`, or returns `null` when it is malformed */\nexport function dataUriToFile(src: string): File | null {\n const match = INLINE_SRC.exec(src);\n if (!match) {\n return null;\n }\n const mimeType = match[1].toLowerCase();\n try {\n const binary = atob(match[2].replace(/\\s/g, \"\"));\n const bytes = Uint8Array.from(binary, char => char.codePointAt(0) ?? 0);\n const extension = mimeType.split(\"/\")[1].split(\"+\")[0];\n return new File([bytes], `${PASTED_IMAGE_BASENAME}.${extension}`, { type: mimeType });\n } catch {\n return null;\n }\n}\n\nfunction isImageNode(node: ProseMirrorNode): boolean {\n return IMAGE_NODE_NAMES.has(node.type.name);\n}\n\n/** Removes unreachable images from a pasted slice and lists the base64 sources it keeps */\nexport function sanitizePastedImages(slice: Slice): {\n slice: Slice;\n inlineSources: string[];\n droppedSources: string[];\n} {\n const inlineSources = new Set<string>();\n const droppedSources: string[] = [];\n\n const sanitize = (fragment: Fragment): Fragment => {\n const kept: ProseMirrorNode[] = [];\n fragment.forEach(child => {\n if (isImageNode(child)) {\n const src = child.attrs[\"src\"] as string | null;\n const source = classifyPastedImageSrc(src);\n if (source === \"unreachable\") {\n droppedSources.push(src ?? \"\");\n return;\n }\n if (source === \"inline\" && src) {\n inlineSources.add(src);\n }\n kept.push(child);\n return;\n }\n kept.push(child.isLeaf ? child : child.copy(sanitize(child.content)));\n });\n return Fragment.fromArray(kept);\n };\n\n const content = sanitize(slice.content);\n if (!droppedSources.length) {\n return { slice, inlineSources: [...inlineSources], droppedSources };\n }\n const openStart = content.firstChild === slice.content.firstChild ? slice.openStart : 0;\n const openEnd = content.lastChild === slice.content.lastChild ? slice.openEnd : 0;\n return {\n slice: new Slice(content, openStart, openEnd),\n inlineSources: [...inlineSources],\n droppedSources,\n };\n}\n\nfunction replaceImageSrc(editor: Editor, previousSrc: string, nextSrc: string | null): void {\n if (editor.isDestroyed) {\n return;\n }\n const { state } = editor;\n const matches: { pos: number; node: ProseMirrorNode }[] = [];\n state.doc.descendants((node, pos) => {\n if (isImageNode(node) && node.attrs[\"src\"] === previousSrc) {\n matches.push({ pos, node });\n }\n });\n if (!matches.length) {\n return;\n }\n const tr = state.tr;\n for (const { pos, node } of [...matches].reverse()) {\n if (nextSrc) {\n tr.setNodeMarkup(pos, undefined, { ...node.attrs, src: nextSrc });\n } else {\n tr.delete(pos, pos + node.nodeSize);\n }\n }\n editor.view.dispatch(tr);\n}\n\n/**\n * Cleans images coming from pasted HTML (e.g. Notion, Google Docs, Office):\n * - drops images whose source the page cannot load, instead of inserting broken images;\n * - sends base64 images through the upload handler (when one is configured) and swaps in the hosted URL.\n *\n * File-based clipboard images keep going through the regular paste upload flow.\n */\nexport const AtePastedImage = Extension.create<AtePastedImageOptions>({\n name: \"atePastedImage\",\n\n addOptions() {\n return {\n shouldRehost: () => false,\n rehost: () => Promise.reject(new Error(\"No upload handler configured\")),\n onRejected: () => undefined,\n };\n },\n\n addProseMirrorPlugins() {\n const editor = this.editor;\n const options = this.options;\n\n const rehost = (src: string): void => {\n const file = dataUriToFile(src);\n if (!file) {\n replaceImageSrc(editor, src, null);\n options.onRejected({ reason: \"unreachable\", src });\n return;\n }\n options\n .rehost(file)\n .then(url => replaceImageSrc(editor, src, url))\n .catch((error: unknown) => {\n replaceImageSrc(editor, src, null);\n options.onRejected({\n reason: error instanceof AteImageValidationError ? error.reason : \"upload-failed\",\n src,\n });\n });\n };\n\n return [\n new Plugin({\n key: new PluginKey(\"atePastedImage\"),\n props: {\n transformPasted: slice => {\n const { slice: sanitized, inlineSources, droppedSources } = sanitizePastedImages(slice);\n droppedSources.forEach(src => options.onRejected({ reason: \"unreachable\", src }));\n if (inlineSources.length && options.shouldRehost()) {\n queueMicrotask(() => inlineSources.forEach(rehost));\n }\n return sanitized;\n },\n },\n }),\n ];\n },\n});\n","import { Editor, Extension } from \"@tiptap/core\";\nimport { Plugin, PluginKey } from \"@tiptap/pm/state\";\n\nexport interface AteLinkShortcutOptions {\n /** Whether a link can be set or edited at the current selection */\n canOpen: () => boolean;\n /** Opens the link editor */\n open: (editor: Editor) => void;\n}\n\n/** Matches the bare `Mod+K` chord (`Cmd+K` on macOS, `Ctrl+K` elsewhere) */\nexport function isLinkShortcut(event: KeyboardEvent): boolean {\n return (\n (event.metaKey || event.ctrlKey) &&\n !event.shiftKey &&\n !event.altKey &&\n event.key.toLowerCase() === \"k\"\n );\n}\n\n/**\n * `Mod+K` opens the link editor when text is selected or the cursor is on a link.\n * With an empty selection outside a link the event is left alone, so host-level `Mod+K`\n * shortcuts (search, command palettes) keep working.\n */\nexport const AteLinkShortcut = Extension.create<AteLinkShortcutOptions>({\n name: \"ateLinkShortcut\",\n\n addOptions() {\n return {\n canOpen: () => true,\n open: () => undefined,\n };\n },\n\n addProseMirrorPlugins() {\n const editor = this.editor;\n const options = this.options;\n\n return [\n new Plugin({\n key: new PluginKey(\"ateLinkShortcut\"),\n props: {\n handleKeyDown: (view, event) => {\n if (!isLinkShortcut(event) || !view.editable) {\n return false;\n }\n if (view.state.selection.empty && !editor.isActive(\"link\")) {\n return false;\n }\n if (!options.canOpen()) {\n return false;\n }\n event.preventDefault();\n event.stopPropagation();\n options.open(editor);\n return true;\n },\n },\n }),\n ];\n },\n});\n","import { Extension } from \"@tiptap/core\";\nimport { Node as ProseMirrorNode } from \"@tiptap/pm/model\";\nimport { EditorState, NodeSelection, Selection, Transaction } from \"@tiptap/pm/state\";\n\nconst LIST_ITEM_NODE_NAMES = new Set([\"listItem\", \"taskItem\"]);\n\nexport interface AteBlockShortcutsOptions {\n /** Whether the shortcuts are active. Evaluated on every key press, so it can change at runtime */\n enabled: () => boolean;\n}\n\nexport interface AteBlockAtSelection {\n node: ProseMirrorNode;\n /** Document position right before the block */\n pos: number;\n parent: ProseMirrorNode;\n /** Index of the block among its parent's children */\n index: number;\n}\n\n/**\n * Resolves the block the shortcuts act on: a selected block node, the list or task item\n * holding the cursor, or else the top-level block holding the cursor.\n */\nexport function findBlockAtSelection(selection: Selection): AteBlockAtSelection | null {\n const { $from } = selection;\n if (selection instanceof NodeSelection && selection.node.isBlock) {\n return {\n node: selection.node,\n pos: selection.from,\n parent: $from.parent,\n index: $from.index(),\n };\n }\n if ($from.depth < 1) {\n return null;\n }\n let depth = 1;\n for (let current = $from.depth; current > 0; current--) {\n if (LIST_ITEM_NODE_NAMES.has($from.node(current).type.name)) {\n depth = current;\n break;\n }\n }\n return {\n node: $from.node(depth),\n pos: $from.before(depth),\n parent: $from.node(depth - 1),\n index: $from.index(depth - 1),\n };\n}\n\n/** Inserts a copy of the current block right after it */\nexport function duplicateBlock(state: EditorState): Transaction | null {\n const block = findBlockAtSelection(state.selection);\n if (!block) {\n return null;\n }\n return state.tr.insert(block.pos, block.node).scrollIntoView();\n}\n\n/** Swaps the current block with its previous sibling, or returns `null` at the first position */\nexport function moveBlockUp(state: EditorState): Transaction | null {\n const block = findBlockAtSelection(state.selection);\n if (!block || block.index === 0) {\n return null;\n }\n const previous = block.parent.child(block.index - 1);\n const end = block.pos + block.node.nodeSize;\n return state.tr\n .insert(end, previous)\n .delete(block.pos - previous.nodeSize, block.pos)\n .scrollIntoView();\n}\n\n/** Swaps the current block with its next sibling, or returns `null` at the last position */\nexport function moveBlockDown(state: EditorState): Transaction | null {\n const block = findBlockAtSelection(state.selection);\n if (!block || block.index >= block.parent.childCount - 1) {\n return null;\n }\n const next = block.parent.child(block.index + 1);\n const end = block.pos + block.node.nodeSize;\n return state.tr\n .delete(end, end + next.nodeSize)\n .insert(block.pos, next)\n .scrollIntoView();\n}\n\n/**\n * Notion-style block shortcuts: `Mod+D` duplicates the current block, `Mod+Shift+ArrowUp` and\n * `Mod+Shift+ArrowDown` move it one sibling up or down. Inside a list the block is the list\n * or task item, which moves within its list. At the edges the key event is left alone.\n */\nexport const AteBlockShortcuts = Extension.create<AteBlockShortcutsOptions>({\n name: \"ateBlockShortcuts\",\n\n addOptions() {\n return {\n enabled: () => true,\n };\n },\n\n addKeyboardShortcuts() {\n const run = (build: (state: EditorState) => Transaction | null) => (): boolean => {\n if (!this.options.enabled() || !this.editor.isEditable) {\n return false;\n }\n const transaction = build(this.editor.state);\n if (!transaction) {\n return false;\n }\n this.editor.view.dispatch(transaction);\n return true;\n };\n\n return {\n \"Mod-d\": run(duplicateBlock),\n \"Mod-Shift-ArrowUp\": run(moveBlockUp),\n \"Mod-Shift-ArrowDown\": run(moveBlockDown),\n };\n },\n});\n","import { isDevMode } from \"@angular/core\";\nimport { Extension } from \"@tiptap/core\";\nimport { DOMSerializer, Fragment } from \"@tiptap/pm/model\";\nimport { Plugin, PluginKey } from \"@tiptap/pm/state\";\nimport { AtePasteConfig, AtePasteSource } from \"../models/ate-paste.model\";\n\n/** Set on HTML copied from an editor, so a later paste knows it comes from an editor */\nconst EDITOR_CLIPBOARD_MARKER = \"data-ate-copy\";\nconst OFFICE_HTML = /urn:schemas-microsoft-com:office|class=\"?Mso|mso-/i;\n\nexport interface AtePasteOptions {\n /** Paste settings, read on every paste so they can change at runtime */\n config: () => AtePasteConfig;\n}\n\nexport interface AtePasteStorage {\n /** Source of the paste being processed, detected before any cleanup */\n source: AtePasteSource;\n}\n\ndeclare module \"@tiptap/core\" {\n interface Storage {\n atePaste: AtePasteStorage;\n }\n}\n\n/** Detects where clipboard HTML comes from. Must run on the HTML as copied, before any cleanup */\nexport function detectPasteSource(html: string): AtePasteSource {\n if (html.includes(EDITOR_CLIPBOARD_MARKER)) {\n return \"editor\";\n }\n return OFFICE_HTML.test(html) ? \"office\" : \"external\";\n}\n\n/** Removes the formats turned off in `config` (`colors`, `highlights`) from pasted HTML */\nexport function stripPastedFormats(html: string, config: AtePasteConfig): string {\n const keepColors = config.colors !== false;\n const keepHighlights = config.highlights !== false;\n if (keepColors && keepHighlights) {\n return html;\n }\n const template = document.createElement(\"template\");\n template.innerHTML = html;\n const content = template.content;\n const styleProperties = [\n ...(keepColors ? [] : [\"color\"]),\n ...(keepHighlights ? [] : [\"background-color\", \"background\"]),\n ];\n content.querySelectorAll<HTMLElement>(\"[style]\").forEach(element => {\n styleProperties.forEach(property => element.style.removeProperty(property));\n if (!element.getAttribute(\"style\")?.trim()) {\n element.removeAttribute(\"style\");\n }\n });\n if (!keepColors) {\n content.querySelectorAll(\"font[color]\").forEach(font => font.removeAttribute(\"color\"));\n }\n if (!keepHighlights) {\n content.querySelectorAll(\"[bgcolor]\").forEach(element => element.removeAttribute(\"bgcolor\"));\n content\n .querySelectorAll(\"mark\")\n .forEach(mark => mark.replaceWith(...Array.from(mark.childNodes)));\n }\n return template.innerHTML;\n}\n\n/**\n * Runs before every other paste cleanup (the Office cleanup removes the markers it relies on):\n * records the source of each paste, and marks HTML copied from the editor.\n */\nconst AtePasteSourceTracker = Extension.create({\n name: \"atePasteSourceTracker\",\n priority: 100000,\n\n addProseMirrorPlugins() {\n const editor = this.editor;\n const serializer = DOMSerializer.fromSchema(editor.schema);\n return [\n new Plugin({\n key: new PluginKey(\"atePasteSourceTracker\"),\n props: {\n transformPastedHTML: html => {\n editor.storage.atePaste.source = detectPasteSource(html);\n return html;\n },\n clipboardSerializer: {\n serializeFragment: (fragment: Fragment, options?: { document?: Document }) => {\n const dom = serializer.serializeFragment(fragment, options);\n dom.firstElementChild?.setAttribute(EDITOR_CLIPBOARD_MARKER, \"\");\n return dom;\n },\n } as DOMSerializer,\n },\n }),\n ];\n },\n});\n\n/**\n * Applies `AtePasteConfig` to pasted and dropped HTML, after the Office cleanup:\n * removes the formats turned off for content from other apps, then calls `transformHTML`.\n */\nexport const AtePaste = Extension.create<AtePasteOptions, AtePasteStorage>({\n name: \"atePaste\",\n\n addOptions() {\n return {\n config: () => ({}),\n };\n },\n\n addStorage() {\n return {\n source: \"external\",\n };\n },\n\n addExtensions() {\n return [AtePasteSourceTracker];\n },\n\n addProseMirrorPlugins() {\n const options = this.options;\n const storage = this.storage;\n return [\n new Plugin({\n key: new PluginKey(\"atePaste\"),\n props: {\n transformPastedHTML: html => {\n const config = options.config();\n const source = storage.source;\n const stripped = source === \"editor\" ? html : stripPastedFormats(html, config);\n if (!config.transformHTML) {\n return stripped;\n }\n try {\n const transformed = config.transformHTML(stripped, { source });\n return typeof transformed === \"string\" ? transformed : stripped;\n } catch (error) {\n if (isDevMode()) {\n console.warn(\n \"[ATE] paste.transformHTML failed, inserting the HTML unchanged.\",\n error\n );\n }\n return stripped;\n }\n },\n },\n }),\n ];\n },\n});\n","import { Extension } from \"@tiptap/core\";\nimport { Table, TableRow, TableCell, TableHeader } from \"@tiptap/extension-table\";\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 allowTableNodeSelection: true,\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 { Directive, signal, Signal, WritableSignal, computed } 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 custom 'Angular Nodes'.\n *\n * Extend this class in your custom components to automatically receive TipTap editor\n * properties (node attributes, selection state, etc.) as reactive Signals.\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 * Helper signal to directly access node attributes\n */\n public attributes: Signal<Record<string, unknown>> = computed(() => this.node()?.attrs || {});\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 const declaredInputs =\n (componentRef.componentType as unknown as { ɵcmp?: { inputs?: Record<string, string> } })\n ?.ɵcmp?.inputs || {};\n\n Object.entries(mergedInputs).forEach(([key, value]) => {\n if (key !== \"id\" && value !== null && value !== undefined) {\n // Only invoke setInput if the key is a declared @Input() / input() signal or in explicit options\n if (key in declaredInputs || key in inputs) {\n try {\n componentRef.setInput(key, value);\n } catch {\n // Silently ignore inputs that fail to set\n }\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\";\n\n/**\n * Internal registry to store the root injector for the editor.\n * This allows registerAngularComponent to work without explicitly passing the injector.\n * @internal\n */\nlet globalInjector: Injector | null = null;\n\nexport function setGlobalInjector(injector: Injector): void {\n globalInjector = injector;\n}\n\nexport function getGlobalInjector(): Injector {\n if (!globalInjector) {\n throw new Error(\n \"[ATE] Global Injector not found. Make sure to call provideAteEditor() in your app.config.ts or main.ts.\"\n );\n }\n return globalInjector;\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\";\nimport { getGlobalInjector } from \"./ate-injector.registry\";\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 injectorOrOptions - The Angular Injector OR the configuration options\n * @param maybeOptions - Configuration options (if the first param was an injector)\n * @returns A TipTap Node extension ready to be used\n *\n * @example\n * ```typescript\n * // Modern way (requires provideAteEditor())\n * registerAngularComponent({\n * component: MyComponent,\n * name: 'myComponent'\n * });\n *\n * // Classic way\n * registerAngularComponent(injector, {\n * component: MyComponent\n * });\n * ```\n */\nexport function registerAngularComponent<T = unknown>(\n injectorOrOptions: Injector | RegisterAngularComponentOptions<T>,\n maybeOptions?: RegisterAngularComponentOptions<T>\n): Node {\n let injector: Injector;\n let options: RegisterAngularComponentOptions<T>;\n\n // Duck-typing check: Injectors have a 'get' method\n const isInjector = (obj: unknown): obj is Injector =>\n obj !== null && typeof obj === \"object\" && typeof (obj as Injector).get === \"function\";\n\n if (isInjector(injectorOrOptions)) {\n injector = injectorOrOptions;\n options = maybeOptions!;\n } else {\n injector = getGlobalInjector();\n options = injectorOrOptions as RegisterAngularComponentOptions<T>;\n }\n\n return createAngularComponentExtension(injector, options);\n}\n","import { Signal } from \"@angular/core\";\nimport { Editor, JSONContent } from \"@tiptap/core\";\nimport { AteEditorCommandsService } from \"../services/ate-editor-commands.service\";\nimport { AteEditorStateSnapshot } from \"./ate-editor-state.model\";\nimport { AteImageUploadOptions } from \"./ate-image.model\";\nimport { AteExportFormat, AteExportOptions } from \"../services/ate-export.service\";\n\n/**\n * A wrapper class that holds a reference to a registered editor component.\n * It provides direct, type-safe facade methods to interact with the editor\n * and execute formatting/utility commands without needing to manage the raw\n * TipTap editor instance directly.\n */\nexport class AteEditorRef {\n constructor(\n public readonly id: string,\n private readonly getEditorInstance: () => Editor | null,\n public readonly commandsService: AteEditorCommandsService\n ) {}\n\n /** Get the raw TipTap Editor instance. */\n get editor(): Editor | null {\n return this.getEditorInstance();\n }\n\n /** Get the current editor state snapshot. */\n get state(): AteEditorStateSnapshot {\n return this.commandsService.editorState();\n }\n\n /** Get the reactive editor state as a Signal. */\n get stateSignal(): Signal<AteEditorStateSnapshot> {\n return this.commandsService.editorState;\n }\n\n /** Execute a generic command by name. */\n execute(command: string, ...args: unknown[]): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.execute(editor, command, ...args);\n }\n }\n\n // ============================================\n // Facade Formatting Commands\n // ============================================\n\n toggleBold(): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.toggleBold(editor);\n }\n }\n\n toggleItalic(): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.toggleItalic(editor);\n }\n }\n\n toggleStrike(): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.toggleStrike(editor);\n }\n }\n\n toggleCode(): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.toggleCode(editor);\n }\n }\n\n toggleCodeBlock(): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.toggleCodeBlock(editor);\n }\n }\n\n toggleUnderline(): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.toggleUnderline(editor);\n }\n }\n\n toggleSuperscript(): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.toggleSuperscript(editor);\n }\n }\n\n toggleSubscript(): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.toggleSubscript(editor);\n }\n }\n\n toggleHeading(level: 1 | 2 | 3): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.toggleHeading(editor, level);\n }\n }\n\n toggleBulletList(): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.toggleBulletList(editor);\n }\n }\n\n toggleOrderedList(): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.toggleOrderedList(editor);\n }\n }\n\n toggleBlockquote(): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.toggleBlockquote(editor);\n }\n }\n\n setTextAlign(alignment: \"left\" | \"center\" | \"right\" | \"justify\"): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.setTextAlign(editor, alignment);\n }\n }\n\n insertHorizontalRule(): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.insertHorizontalRule(editor);\n }\n }\n\n insertImage(options: AteImageUploadOptions): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.insertImage(editor, options).catch(() => undefined);\n }\n }\n\n uploadImage(file: File, options?: AteImageUploadOptions): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.uploadImage(editor, file, options).catch(() => undefined);\n }\n }\n\n toggleHighlight(color: string): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.toggleHighlight(editor, color);\n }\n }\n\n undo(): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.undo(editor);\n }\n }\n\n redo(): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.redo(editor);\n }\n }\n\n // ============================================\n // Table Commands\n // ============================================\n\n insertTable(rows?: number, cols?: number): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.insertTable(editor, rows, cols);\n }\n }\n\n addColumnBefore(): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.addColumnBefore(editor);\n }\n }\n\n addColumnAfter(): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.addColumnAfter(editor);\n }\n }\n\n deleteColumn(): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.deleteColumn(editor);\n }\n }\n\n addRowBefore(): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.addRowBefore(editor);\n }\n }\n\n addRowAfter(): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.addRowAfter(editor);\n }\n }\n\n deleteRow(): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.deleteRow(editor);\n }\n }\n\n deleteTable(): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.deleteTable(editor);\n }\n }\n\n mergeCells(): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.mergeCells(editor);\n }\n }\n\n splitCell(): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.splitCell(editor);\n }\n }\n\n toggleHeaderColumn(): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.toggleHeaderColumn(editor);\n }\n }\n\n toggleHeaderRow(): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.toggleHeaderRow(editor);\n }\n }\n\n // ============================================\n // Color Picker & Link Commands\n // ============================================\n\n applyColor(color: string, selectionOnly?: boolean, closeMenu?: boolean): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.execute(editor, \"applyColor\", color, selectionOnly, closeMenu);\n }\n }\n\n applyHighlight(color: string, selectionOnly?: boolean, closeMenu?: boolean): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.execute(editor, \"applyHighlight\", color, selectionOnly, closeMenu);\n }\n }\n\n unsetColor(selectionOnly?: boolean): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.execute(editor, \"unsetColor\", selectionOnly);\n }\n }\n\n unsetHighlight(selectionOnly?: boolean): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.execute(editor, \"unsetHighlight\", selectionOnly);\n }\n }\n\n toggleLink(event?: Event): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.execute(editor, \"toggleLink\", event);\n }\n }\n\n unsetLink(): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.execute(editor, \"unsetLink\");\n }\n }\n\n toggleColorPicker(mode: \"text\" | \"highlight\", event: Event): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.execute(editor, \"toggleColorPicker\", mode, event);\n }\n }\n\n // ============================================\n // General Controls & Content\n // ============================================\n\n clearContent(): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.clearContent(editor);\n }\n }\n\n setContent(content: string, emitUpdate = true): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.setContent(editor, content, emitUpdate);\n }\n }\n\n getContent(format: AteExportFormat): string {\n const editor = this.editor;\n return editor ? this.commandsService.getContent(editor, format) : \"\";\n }\n\n getHTML(): string {\n const editor = this.editor;\n return editor ? editor.getHTML() : \"\";\n }\n\n getJSON(): JSONContent | undefined {\n const editor = this.editor;\n return editor ? editor.getJSON() : undefined;\n }\n\n getText(): string {\n const editor = this.editor;\n return editor ? editor.getText() : \"\";\n }\n\n async exportAs(\n format: AteExportFormat,\n method: \"clipboard\" | \"download\",\n options?: AteExportOptions\n ): Promise<void> {\n const editor = this.editor;\n if (editor) {\n await this.commandsService.exportAs(editor, format, method, options);\n }\n }\n\n focus(): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.focus(editor);\n }\n }\n\n blur(): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.blur(editor);\n }\n }\n}\n","import { Injectable, signal, computed } from \"@angular/core\";\nimport { Editor } from \"@tiptap/core\";\nimport { AteEditorRef } from \"../models/ate-editor-ref\";\nimport { AteEditorCommandsService } from \"./ate-editor-commands.service\";\n\n/**\n * A root-level registry service to register, unregister, and manage active editor instances.\n * This service is provided in 'root' and can be injected anywhere in the application.\n */\n@Injectable({\n providedIn: \"root\",\n})\nexport class AteEditorRegistry {\n private static counter = 0;\n\n // Map of registered editors\n private readonly _editors = signal<Map<string, AteEditorRef>>(new Map());\n readonly editors = this._editors.asReadonly();\n\n // Active (last focused or last registered) editor ID\n private readonly _activeEditorId = signal<string | null>(null);\n readonly activeEditorId = this._activeEditorId.asReadonly();\n\n // List of all active editor IDs reactively\n readonly editorIds = computed(() => Array.from(this._editors().keys()));\n\n // Active AteEditorRef reactively\n readonly activeEditor = computed(() => {\n const activeId = this._activeEditorId();\n if (!activeId) {\n return null;\n }\n return this._editors().get(activeId) || null;\n });\n\n /**\n * Register an editor instance.\n * Returns the final registered ID.\n */\n register(\n id: string | undefined,\n getEditor: () => Editor | null,\n commandsService: AteEditorCommandsService\n ): string {\n const finalId = id || `ate-editor-${++AteEditorRegistry.counter}`;\n const editorRef = new AteEditorRef(finalId, getEditor, commandsService);\n\n this._editors.update(map => {\n const newMap = new Map(map);\n newMap.set(finalId, editorRef);\n return newMap;\n });\n\n // If there is no active editor, make this one active\n if (!this._activeEditorId()) {\n this._activeEditorId.set(finalId);\n }\n\n return finalId;\n }\n\n /**\n * Unregister an editor instance by ID.\n */\n unregister(id: string): void {\n this._editors.update(map => {\n const newMap = new Map(map);\n newMap.delete(id);\n return newMap;\n });\n\n // If the active editor is the one being unregistered, find a fallback\n if (this._activeEditorId() === id) {\n const remainingIds = this.editorIds();\n if (remainingIds.length > 0) {\n // Set active to the last registered one remaining\n this._activeEditorId.set(remainingIds[remainingIds.length - 1]);\n } else {\n this._activeEditorId.set(null);\n }\n }\n }\n\n /**\n * Mark an editor as active (usually on focus).\n */\n setActive(id: string): void {\n if (this._editors().has(id)) {\n this._activeEditorId.set(id);\n }\n }\n\n /**\n * Retrieve an editor reference by ID, or the active editor if ID is not specified.\n */\n get(id?: string): AteEditorRef | undefined {\n if (id) {\n return this._editors().get(id);\n }\n const activeId = this._activeEditorId();\n return activeId ? this._editors().get(activeId) : undefined;\n }\n}\n","import { AteTranslations } from \"./ateTranslationsModel\";\n\nexport const ENGLISH_TRANSLATIONS: AteTranslations = {\n toolbar: {\n bold: \"Bold\\nCtrl+B\",\n italic: \"Italic\\nCtrl+I\",\n underline: \"Underline\\nCtrl+U\",\n strike: \"Strikethrough\\nCtrl+Shift+X\",\n code: \"Inline Code\\nCtrl+E\",\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\\nCtrl+Z\",\n redo: \"Redo\\nCtrl+Shift+Z\",\n clear: \"Clear\",\n textColor: \"Text Color\",\n customColor: \"Custom Color\",\n presets: \"Presets\",\n },\n bubbleMenu: {\n bold: \"Bold\\nCtrl+B\",\n italic: \"Italic\\nCtrl+I\",\n underline: \"Underline\\nCtrl+U\",\n strike: \"Strikethrough\\nCtrl+Shift+X\",\n code: \"Code\\nCtrl+E\",\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 tableOfContents: {\n title: \"Table of Contents\",\n description: \"Insert a table of contents\",\n keywords: [\"toc\", \"table\", \"contents\", \"summary\", \"index\", \"headings\", \"outline\"],\n },\n filterPlaceholder: \"Filter...\",\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 downloadImage: \"Download Image\",\n deleteImage: \"Delete Image\",\n resizeSmall: \"Small\",\n resizeMedium: \"Medium\",\n resizeLarge: \"Large\",\n resizeOriginal: \"Original\",\n alignLeft: \"Align Left\",\n alignCenter: \"Align Center\",\n alignRight: \"Align Right\",\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 characterPlural: \"characters\",\n word: \"word\",\n wordPlural: \"words\",\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 blockAdd: \"Click to add a block\",\n blockDrag: \"Drag to move this block\",\n tableOfContents: \"Table of Contents\",\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 export: {\n export: \"Export\",\n html: \"HTML\",\n markdown: \"Markdown\",\n text: \"Plain Text\",\n copyHtml: \"Copy as HTML\",\n copyMarkdown: \"Copy as Markdown\",\n copyText: \"Copy as plain text\",\n downloadHtml: \"Download .html\",\n downloadMarkdown: \"Download .md\",\n downloadText: \"Download .txt\",\n copiedSuccess: \"Copied to clipboard!\",\n },\n};\n","import { AteTranslations } from \"./ateTranslationsModel\";\n\nexport const FRENCH_TRANSLATIONS: AteTranslations = {\n toolbar: {\n bold: \"Gras\\nCtrl+B\",\n italic: \"Italique\\nCtrl+I\",\n underline: \"Souligné\\nCtrl+U\",\n strike: \"Barré\\nCtrl+Shift+X\",\n code: \"Code en ligne\\nCtrl+E\",\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\\nCtrl+Z\",\n redo: \"Refaire\\nCtrl+Shift+Z\",\n clear: \"Vider\",\n textColor: \"Couleur du texte\",\n customColor: \"Couleur personnalisée\",\n presets: \"Préréglages\",\n },\n bubbleMenu: {\n bold: \"Gras\\nCtrl+B\",\n italic: \"Italique\\nCtrl+I\",\n underline: \"Souligné\\nCtrl+U\",\n strike: \"Barré\\nCtrl+Shift+X\",\n code: \"Code\\nCtrl+E\",\n superscript: \"Exposant\",\n subscript: \"Indice\",\n highlight: \"Surligner\",\n highlightPicker: \"Couleur de fond\",\n textColor: \"Couleur du 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 tableOfContents: {\n title: \"Table des matières\",\n description: \"Insérer une table des matières\",\n keywords: [\"toc\", \"table\", \"matières\", \"sommaire\", \"index\", \"headings\", \"titres\"],\n },\n filterPlaceholder: \"Filtrer...\",\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 downloadImage: \"Télécharger l'image\",\n deleteImage: \"Supprimer l'image\",\n resizeSmall: \"Petit\",\n resizeMedium: \"Moyen\",\n resizeLarge: \"Grand\",\n resizeOriginal: \"Original\",\n alignLeft: \"Aligner à gauche\",\n alignCenter: \"Aligner au centre\",\n alignRight: \"Aligner à droite\",\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 characterPlural: \"caractères\",\n word: \"mot\",\n wordPlural: \"mots\",\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 blockAdd: \"Cliquer pour ajouter un bloc\",\n blockDrag: \"Faire glisser pour déplacer ce bloc\",\n tableOfContents: \"Sommaire\",\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 export: {\n export: \"Exporter\",\n html: \"HTML\",\n markdown: \"Markdown\",\n text: \"Texte brut\",\n copyHtml: \"Copier en HTML\",\n copyMarkdown: \"Copier en Markdown\",\n copyText: \"Copier en texte brut\",\n downloadHtml: \"Télécharger .html\",\n downloadMarkdown: \"Télécharger .md\",\n downloadText: \"Télécharger .txt\",\n copiedSuccess: \"Copié dans le presse-papiers !\",\n },\n};\n","import { AteTranslations } from \"./ateTranslationsModel\";\n\nexport const GERMAN_TRANSLATIONS: AteTranslations = {\n toolbar: {\n bold: \"Fett\\nStrg+B\",\n italic: \"Kursiv\\nStrg+I\",\n underline: \"Unterstrichen\\nStrg+U\",\n strike: \"Durchgestrichen\\nStrg+Shift+X\",\n code: \"Inline-Code\\nStrg+E\",\n codeBlock: \"Codeblock\",\n superscript: \"Hochgestellt\",\n subscript: \"Tiefgestellt\",\n highlight: \"Hervorheben\",\n highlightPicker: \"Hintergrundfarbe\",\n heading1: \"Überschrift 1\",\n heading2: \"Überschrift 2\",\n heading3: \"Überschrift 3\",\n bulletList: \"Aufzählungsliste\",\n orderedList: \"Nummerierte Liste\",\n blockquote: \"Zitatblock\",\n alignLeft: \"Links ausrichten\",\n alignCenter: \"Zentrieren\",\n alignRight: \"Rechts ausrichten\",\n alignJustify: \"Blocksatz\",\n link: \"Link hinzufügen\",\n image: \"Bild hinzufügen\",\n horizontalRule: \"Horizontale Linie\",\n table: \"Tabelle einfügen\",\n undo: \"Rückgängig\\nStrg+Z\",\n redo: \"Wiederholen\\nStrg+Shift+Z\",\n clear: \"Leeren\",\n textColor: \"Textfarbe\",\n customColor: \"Benutzerdefinierte Farbe\",\n presets: \"Voreinstellungen\",\n },\n\n bubbleMenu: {\n bold: \"Fett\\nStrg+B\",\n italic: \"Kursiv\\nStrg+I\",\n underline: \"Unterstrichen\\nStrg+U\",\n strike: \"Durchgestrichen\\nStrg+Shift+X\",\n code: \"Code\\nStrg+E\",\n superscript: \"Hochgestellt\",\n subscript: \"Tiefgestellt\",\n highlight: \"Hervorheben\",\n highlightPicker: \"Hintergrundfarbe\",\n textColor: \"Textfarbe\",\n link: \"Link\",\n addLink: \"Link hinzufügen\",\n editLink: \"Link bearbeiten\",\n removeLink: \"Link entfernen\",\n linkUrl: \"Link-URL\",\n linkText: \"Link-Text\",\n openLink: \"Link öffnen\",\n customColor: \"Benutzerdefinierte Farbe\",\n presets: \"Voreinstellungen\",\n },\n\n slashCommands: {\n heading1: {\n title: \"Überschrift 1\",\n description: \"Große Abschnittsüberschrift\",\n keywords: [\"überschrift\", \"heading\", \"h1\", \"titel\", \"1\", \"header\"],\n },\n heading2: {\n title: \"Überschrift 2\",\n description: \"Mittlere Abschnittsüberschrift\",\n keywords: [\"überschrift\", \"heading\", \"h2\", \"titel\", \"2\", \"header\"],\n },\n heading3: {\n title: \"Überschrift 3\",\n description: \"Kleine Abschnittsüberschrift\",\n keywords: [\"überschrift\", \"heading\", \"h3\", \"titel\", \"3\", \"header\"],\n },\n bulletList: {\n title: \"Aufzählungsliste\",\n description: \"Eine Aufzählungsliste erstellen\",\n keywords: [\"aufzählung\", \"liste\", \"bullet\", \"ul\", \"unordered\"],\n },\n orderedList: {\n title: \"Nummerierte Liste\",\n description: \"Eine nummerierte Liste erstellen\",\n keywords: [\"nummeriert\", \"liste\", \"ordered\", \"ol\", \"zahlen\"],\n },\n blockquote: {\n title: \"Zitatblock\",\n description: \"Einen Zitatblock hinzufügen\",\n keywords: [\"zitat\", \"blockquote\", \"quote\", \"citation\"],\n },\n code: {\n title: \"Codeblock\",\n description: \"Einen Codeblock hinzufügen\",\n keywords: [\"code\", \"codeblock\", \"pre\", \"programmierung\"],\n },\n image: {\n title: \"Bild\",\n description: \"Ein Bild einfügen\",\n keywords: [\"bild\", \"image\", \"foto\", \"photo\", \"picture\", \"img\"],\n },\n horizontalRule: {\n title: \"Horizontale Linie\",\n description: \"Eine horizontale Trennlinie hinzufügen\",\n keywords: [\"linie\", \"horizontal\", \"rule\", \"hr\", \"trennlinie\", \"separator\"],\n },\n table: {\n title: \"Tabelle\",\n description: \"Eine Tabelle einfügen\",\n keywords: [\"tabelle\", \"table\", \"grid\", \"raster\", \"daten\", \"zeilen\", \"spalten\"],\n },\n tableOfContents: {\n title: \"Inhaltsverzeichnis\",\n description: \"Ein Inhaltsverzeichnis einfügen\",\n keywords: [\"toc\", \"inhaltsverzeichnis\", \"tabelle\", \"inhalte\", \"index\", \"überschriften\"],\n },\n filterPlaceholder: \"Filtern...\",\n },\n\n table: {\n addRowBefore: \"Zeile davor einfügen\",\n addRowAfter: \"Zeile danach einfügen\",\n deleteRow: \"Zeile löschen\",\n addColumnBefore: \"Spalte davor einfügen\",\n addColumnAfter: \"Spalte danach einfügen\",\n deleteColumn: \"Spalte löschen\",\n deleteTable: \"Tabelle löschen\",\n toggleHeaderRow: \"Kopfzeile umschalten\",\n toggleHeaderColumn: \"Kopfspalte umschalten\",\n mergeCells: \"Zellen verbinden\",\n splitCell: \"Zelle teilen\",\n },\n\n imageUpload: {\n selectImage: \"Bild auswählen\",\n loadError: \"Fehler beim Laden des Bildes\",\n uploadingImage: \"Bild wird hochgeladen...\",\n uploadProgress: \"Upload-Fortschritt\",\n uploadError: \"Upload-Fehler\",\n uploadSuccess: \"Upload erfolgreich\",\n imageTooLarge: \"Bild ist zu groß\",\n invalidFileType: \"Ungültiger Dateityp\",\n dragDropText: \"Bilder hierher ziehen und ablegen\",\n changeImage: \"Bild ändern\",\n downloadImage: \"Bild herunterladen\",\n deleteImage: \"Bild löschen\",\n resizeSmall: \"Klein\",\n resizeMedium: \"Mittel\",\n resizeLarge: \"Groß\",\n resizeOriginal: \"Originalgröße\",\n alignLeft: \"Links ausrichten\",\n alignCenter: \"Zentrieren\",\n alignRight: \"Rechts ausrichten\",\n resizing: \"Größe wird angepasst...\",\n compressing: \"Bild wird komprimiert...\",\n compressionError: \"Fehler bei der Komprimierung\",\n validating: \"Datei wird geprüft...\",\n uploadingToServer: \"Upload zum Server...\",\n replacingImage: \"Bild wird ersetzt...\",\n insertingImage: \"Bild wird in den Editor eingefügt...\",\n noFileSelected: \"Keine Bilddatei ausgewählt\",\n selectionCancelled: \"Auswahl abgebrochen\",\n },\n\n editor: {\n placeholder: \"Beginne zu schreiben...\",\n character: \"Zeichen\",\n characterPlural: \"Zeichen\",\n word: \"Wort\",\n wordPlural: \"Wörter\",\n linkPrompt: \"Link-URL eingeben\",\n linkUrlPrompt: \"URL eingeben\",\n confirmDelete: \"Möchtest du dies wirklich löschen?\",\n toggleEdit: \"In den Bearbeitungsmodus wechseln\",\n viewMode: \"In den Ansichtsmodus wechseln\",\n blockAdd: \"Klicken, um einen Block hinzuzufügen\",\n blockDrag: \"Ziehen, um diesen Block zu verschieben\",\n tableOfContents: \"Inhaltsverzeichnis\",\n },\n\n common: {\n cancel: \"Abbrechen\",\n confirm: \"Bestätigen\",\n apply: \"Anwenden\",\n delete: \"Löschen\",\n save: \"Speichern\",\n close: \"Schließen\",\n loading: \"Lädt\",\n error: \"Fehler\",\n success: \"Erfolg\",\n },\n\n export: {\n export: \"Exportieren\",\n html: \"HTML\",\n markdown: \"Markdown\",\n text: \"Nur Text\",\n copyHtml: \"Als HTML kopieren\",\n copyMarkdown: \"Als Markdown kopieren\",\n copyText: \"Als reinen Text kopieren\",\n downloadHtml: \".html herunterladen\",\n downloadMarkdown: \".md herunterladen\",\n downloadText: \".txt herunterladen\",\n copiedSuccess: \"In die Zwischenablage kopiert!\",\n },\n};\n","import { AteTranslations } from \"./ateTranslationsModel\";\n\nexport const PORTUGUESE_TRANSLATIONS: AteTranslations = {\n toolbar: {\n bold: \"Negrito\\nCtrl+B\",\n italic: \"Itálico\\nCtrl+I\",\n underline: \"Sublinhado\\nCtrl+U\",\n strike: \"Tachado\\nCtrl+Shift+X\",\n code: \"Código em linha\\nCtrl+E\",\n codeBlock: \"Bloco de código\",\n superscript: \"Sobrescrito\",\n subscript: \"Subscrito\",\n highlight: \"Destacar\",\n highlightPicker: \"Cor de destaque\",\n heading1: \"Título 1\",\n heading2: \"Título 2\",\n heading3: \"Título 3\",\n bulletList: \"Lista com marcadores\",\n orderedList: \"Lista numerada\",\n blockquote: \"Citação\",\n alignLeft: \"Alinhar à esquerda\",\n alignCenter: \"Centralizar\",\n alignRight: \"Alinhar à direita\",\n alignJustify: \"Justificar\",\n link: \"Inserir link\",\n image: \"Inserir imagem\",\n horizontalRule: \"Linha horizontal\",\n table: \"Inserir tabela\",\n undo: \"Desfazer\\nCtrl+Z\",\n redo: \"Refazer\\nCtrl+Shift+Z\",\n clear: \"Limpar\",\n textColor: \"Cor do texto\",\n customColor: \"Cor personalizada\",\n presets: \"Predefinições\",\n },\n bubbleMenu: {\n bold: \"Negrito\\nCtrl+B\",\n italic: \"Itálico\\nCtrl+I\",\n underline: \"Sublinhado\\nCtrl+U\",\n strike: \"Tachado\\nCtrl+Shift+X\",\n code: \"Código\\nCtrl+E\",\n superscript: \"Sobrescrito\",\n subscript: \"Subscrito\",\n highlight: \"Destacar\",\n highlightPicker: \"Cor de destaque\",\n textColor: \"Cor do texto\",\n link: \"Link\",\n addLink: \"Inserir link\",\n editLink: \"Editar link\",\n removeLink: \"Remover link\",\n linkUrl: \"URL do link\",\n linkText: \"Texto do link\",\n openLink: \"Abrir link\",\n customColor: \"Cor personalizada\",\n presets: \"Predefinições\",\n },\n slashCommands: {\n heading1: {\n title: \"Título 1\",\n description: \"Título de seção grande\",\n keywords: [\"heading\", \"h1\", \"title\", \"1\", \"header\", \"título\", \"titulo\", \"cabeçalho\"],\n },\n heading2: {\n title: \"Título 2\",\n description: \"Título de seção médio\",\n keywords: [\"heading\", \"h2\", \"title\", \"2\", \"header\", \"título\", \"titulo\", \"subtítulo\"],\n },\n heading3: {\n title: \"Título 3\",\n description: \"Título de seção pequeno\",\n keywords: [\"heading\", \"h3\", \"title\", \"3\", \"header\", \"título\", \"titulo\", \"subtítulo\"],\n },\n bulletList: {\n title: \"Lista com marcadores\",\n description: \"Criar uma lista com marcadores\",\n keywords: [\"bullet\", \"list\", \"ul\", \"unordered\", \"lista\", \"marcadores\", \"tópicos\"],\n },\n orderedList: {\n title: \"Lista numerada\",\n description: \"Criar uma lista numerada\",\n keywords: [\"ordered\", \"list\", \"ol\", \"numbered\", \"lista\", \"numerada\", \"ordenada\"],\n },\n blockquote: {\n title: \"Citação\",\n description: \"Adicionar uma citação\",\n keywords: [\"quote\", \"blockquote\", \"citation\", \"citação\", \"citacao\", \"aspas\"],\n },\n code: {\n title: \"Bloco de código\",\n description: \"Adicionar um bloco de código\",\n keywords: [\"code\", \"codeblock\", \"pre\", \"programming\", \"código\", \"codigo\", \"programação\"],\n },\n image: {\n title: \"Imagem\",\n description: \"Inserir uma imagem\",\n keywords: [\"image\", \"photo\", \"picture\", \"img\", \"imagem\", \"foto\"],\n },\n horizontalRule: {\n title: \"Linha horizontal\",\n description: \"Adicionar uma linha divisória\",\n keywords: [\"hr\", \"horizontal\", \"rule\", \"line\", \"separator\", \"linha\", \"divisor\", \"separador\"],\n },\n table: {\n title: \"Tabela\",\n description: \"Inserir uma tabela\",\n keywords: [\n \"table\",\n \"grid\",\n \"data\",\n \"rows\",\n \"columns\",\n \"tabela\",\n \"grade\",\n \"dados\",\n \"linhas\",\n \"colunas\",\n ],\n },\n tableOfContents: {\n title: \"Sumário\",\n description: \"Inserir um sumário\",\n keywords: [\n \"toc\",\n \"table\",\n \"contents\",\n \"summary\",\n \"index\",\n \"headings\",\n \"outline\",\n \"sumário\",\n \"sumario\",\n \"índice\",\n \"indice\",\n \"títulos\",\n ],\n },\n filterPlaceholder: \"Filtrar...\",\n },\n table: {\n addRowBefore: \"Inserir linha acima\",\n addRowAfter: \"Inserir linha abaixo\",\n deleteRow: \"Excluir linha\",\n addColumnBefore: \"Inserir coluna à esquerda\",\n addColumnAfter: \"Inserir coluna à direita\",\n deleteColumn: \"Excluir coluna\",\n deleteTable: \"Excluir tabela\",\n toggleHeaderRow: \"Alternar linha de cabeçalho\",\n toggleHeaderColumn: \"Alternar coluna de cabeçalho\",\n mergeCells: \"Mesclar células\",\n splitCell: \"Dividir célula\",\n },\n imageUpload: {\n selectImage: \"Selecionar imagem\",\n loadError: \"Erro ao carregar a imagem\",\n uploadingImage: \"Enviando imagem...\",\n uploadProgress: \"Progresso do envio\",\n uploadError: \"Erro no envio\",\n uploadSuccess: \"Envio concluído\",\n imageTooLarge: \"Imagem muito grande\",\n invalidFileType: \"Tipo de arquivo inválido\",\n dragDropText: \"Arraste e solte imagens aqui\",\n changeImage: \"Trocar imagem\",\n downloadImage: \"Baixar imagem\",\n deleteImage: \"Excluir imagem\",\n resizeSmall: \"Pequena\",\n resizeMedium: \"Média\",\n resizeLarge: \"Grande\",\n resizeOriginal: \"Original\",\n alignLeft: \"Alinhar à esquerda\",\n alignCenter: \"Centralizar\",\n alignRight: \"Alinhar à direita\",\n resizing: \"Redimensionando...\",\n compressing: \"Comprimindo...\",\n compressionError: \"Erro ao comprimir a imagem\",\n validating: \"Validando arquivo...\",\n uploadingToServer: \"Enviando para o servidor...\",\n replacingImage: \"Substituindo imagem...\",\n insertingImage: \"Inserindo no editor...\",\n noFileSelected: \"Nenhum arquivo de imagem selecionado\",\n selectionCancelled: \"Seleção cancelada\",\n },\n editor: {\n placeholder: \"Comece a escrever...\",\n character: \"caractere\",\n characterPlural: \"caracteres\",\n word: \"palavra\",\n wordPlural: \"palavras\",\n linkPrompt: \"Digite a URL do link\",\n linkUrlPrompt: \"Digite a URL\",\n confirmDelete: \"Tem certeza de que deseja excluir?\",\n toggleEdit: \"Mudar para o modo de edição\",\n viewMode: \"Mudar para o modo de leitura\",\n blockAdd: \"Clique para adicionar um bloco\",\n blockDrag: \"Arraste para mover este bloco\",\n tableOfContents: \"Sumário\",\n },\n common: {\n cancel: \"Cancelar\",\n confirm: \"Confirmar\",\n apply: \"Aplicar\",\n delete: \"Excluir\",\n save: \"Salvar\",\n close: \"Fechar\",\n loading: \"Carregando\",\n error: \"Erro\",\n success: \"Sucesso\",\n },\n export: {\n export: \"Exportar\",\n html: \"HTML\",\n markdown: \"Markdown\",\n text: \"Texto simples\",\n copyHtml: \"Copiar como HTML\",\n copyMarkdown: \"Copiar como Markdown\",\n copyText: \"Copiar como texto simples\",\n downloadHtml: \"Baixar .html\",\n downloadMarkdown: \"Baixar .md\",\n downloadText: \"Baixar .txt\",\n copiedSuccess: \"Copiado para a área de transferência!\",\n },\n};\n","import { AteTranslations } from \"./ateTranslationsModel\";\n\nexport const SPANISH_TRANSLATIONS: AteTranslations = {\n toolbar: {\n bold: \"Negrita\\nCtrl+B\",\n italic: \"Cursiva\\nCtrl+I\",\n underline: \"Subrayado\\nCtrl+U\",\n strike: \"Tachado\\nCtrl+Shift+X\",\n code: \"Código en línea\\nCtrl+E\",\n codeBlock: \"Bloque de código\",\n superscript: \"Superíndice\",\n subscript: \"Subíndice\",\n highlight: \"Resaltar\",\n highlightPicker: \"Color de resaltado\",\n heading1: \"Título 1\",\n heading2: \"Título 2\",\n heading3: \"Título 3\",\n bulletList: \"Lista con viñetas\",\n orderedList: \"Lista numerada\",\n blockquote: \"Cita\",\n alignLeft: \"Alinear a la izquierda\",\n alignCenter: \"Centrar\",\n alignRight: \"Alinear a la derecha\",\n alignJustify: \"Justificar\",\n link: \"Insertar enlace\",\n image: \"Insertar imagen\",\n horizontalRule: \"Línea horizontal\",\n table: \"Insertar tabla\",\n undo: \"Deshacer\\nCtrl+Z\",\n redo: \"Rehacer\\nCtrl+Shift+Z\",\n clear: \"Limpiar\",\n textColor: \"Color del texto\",\n customColor: \"Color personalizado\",\n presets: \"Predefinidos\",\n },\n bubbleMenu: {\n bold: \"Negrita\\nCtrl+B\",\n italic: \"Cursiva\\nCtrl+I\",\n underline: \"Subrayado\\nCtrl+U\",\n strike: \"Tachado\\nCtrl+Shift+X\",\n code: \"Código\\nCtrl+E\",\n superscript: \"Superíndice\",\n subscript: \"Subíndice\",\n highlight: \"Resaltar\",\n highlightPicker: \"Color de resaltado\",\n textColor: \"Color del texto\",\n link: \"Enlace\",\n addLink: \"Insertar enlace\",\n editLink: \"Editar enlace\",\n removeLink: \"Quitar enlace\",\n linkUrl: \"URL del enlace\",\n linkText: \"Texto del enlace\",\n openLink: \"Abrir enlace\",\n customColor: \"Color personalizado\",\n presets: \"Predefinidos\",\n },\n slashCommands: {\n heading1: {\n title: \"Título 1\",\n description: \"Título de sección grande\",\n keywords: [\"heading\", \"h1\", \"title\", \"1\", \"header\", \"título\", \"titulo\", \"encabezado\"],\n },\n heading2: {\n title: \"Título 2\",\n description: \"Título de sección mediano\",\n keywords: [\"heading\", \"h2\", \"title\", \"2\", \"header\", \"título\", \"titulo\", \"subtítulo\"],\n },\n heading3: {\n title: \"Título 3\",\n description: \"Título de sección pequeño\",\n keywords: [\"heading\", \"h3\", \"title\", \"3\", \"header\", \"título\", \"titulo\", \"subtítulo\"],\n },\n bulletList: {\n title: \"Lista con viñetas\",\n description: \"Crear una lista con viñetas\",\n keywords: [\"bullet\", \"list\", \"ul\", \"unordered\", \"lista\", \"viñetas\", \"puntos\"],\n },\n orderedList: {\n title: \"Lista numerada\",\n description: \"Crear una lista numerada\",\n keywords: [\"ordered\", \"list\", \"ol\", \"numbered\", \"lista\", \"numerada\", \"ordenada\"],\n },\n blockquote: {\n title: \"Cita\",\n description: \"Añadir una cita\",\n keywords: [\"quote\", \"blockquote\", \"citation\", \"cita\", \"citar\", \"comillas\"],\n },\n code: {\n title: \"Bloque de código\",\n description: \"Añadir un bloque de código\",\n keywords: [\"code\", \"codeblock\", \"pre\", \"programming\", \"código\", \"codigo\", \"programación\"],\n },\n image: {\n title: \"Imagen\",\n description: \"Insertar una imagen\",\n keywords: [\"image\", \"photo\", \"picture\", \"img\", \"imagen\", \"foto\"],\n },\n horizontalRule: {\n title: \"Línea horizontal\",\n description: \"Añadir una línea divisoria\",\n keywords: [\n \"hr\",\n \"horizontal\",\n \"rule\",\n \"line\",\n \"separator\",\n \"línea\",\n \"linea\",\n \"divisor\",\n \"separador\",\n ],\n },\n table: {\n title: \"Tabla\",\n description: \"Insertar una tabla\",\n keywords: [\n \"table\",\n \"grid\",\n \"data\",\n \"rows\",\n \"columns\",\n \"tabla\",\n \"cuadrícula\",\n \"datos\",\n \"filas\",\n \"columnas\",\n ],\n },\n tableOfContents: {\n title: \"Índice\",\n description: \"Insertar un índice\",\n keywords: [\n \"toc\",\n \"table\",\n \"contents\",\n \"summary\",\n \"index\",\n \"headings\",\n \"outline\",\n \"índice\",\n \"indice\",\n \"contenido\",\n \"sumario\",\n \"títulos\",\n ],\n },\n filterPlaceholder: \"Filtrar...\",\n },\n table: {\n addRowBefore: \"Insertar fila arriba\",\n addRowAfter: \"Insertar fila abajo\",\n deleteRow: \"Eliminar fila\",\n addColumnBefore: \"Insertar columna a la izquierda\",\n addColumnAfter: \"Insertar columna a la derecha\",\n deleteColumn: \"Eliminar columna\",\n deleteTable: \"Eliminar tabla\",\n toggleHeaderRow: \"Alternar fila de encabezado\",\n toggleHeaderColumn: \"Alternar columna de encabezado\",\n mergeCells: \"Combinar celdas\",\n splitCell: \"Dividir celda\",\n },\n imageUpload: {\n selectImage: \"Seleccionar imagen\",\n loadError: \"Error al cargar la imagen\",\n uploadingImage: \"Subiendo imagen...\",\n uploadProgress: \"Progreso de la subida\",\n uploadError: \"Error al subir\",\n uploadSuccess: \"Subida completada\",\n imageTooLarge: \"Imagen demasiado grande\",\n invalidFileType: \"Tipo de archivo no válido\",\n dragDropText: \"Arrastra y suelta imágenes aquí\",\n changeImage: \"Cambiar imagen\",\n downloadImage: \"Descargar imagen\",\n deleteImage: \"Eliminar imagen\",\n resizeSmall: \"Pequeña\",\n resizeMedium: \"Mediana\",\n resizeLarge: \"Grande\",\n resizeOriginal: \"Original\",\n alignLeft: \"Alinear a la izquierda\",\n alignCenter: \"Centrar\",\n alignRight: \"Alinear a la derecha\",\n resizing: \"Redimensionando...\",\n compressing: \"Comprimiendo...\",\n compressionError: \"Error al comprimir la imagen\",\n validating: \"Validando archivo...\",\n uploadingToServer: \"Subiendo al servidor...\",\n replacingImage: \"Reemplazando imagen...\",\n insertingImage: \"Insertando en el editor...\",\n noFileSelected: \"Ningún archivo de imagen seleccionado\",\n selectionCancelled: \"Selección cancelada\",\n },\n editor: {\n placeholder: \"Empieza a escribir...\",\n character: \"carácter\",\n characterPlural: \"caracteres\",\n word: \"palabra\",\n wordPlural: \"palabras\",\n linkPrompt: \"Introduce la URL del enlace\",\n linkUrlPrompt: \"Introduce la URL\",\n confirmDelete: \"¿Seguro que quieres eliminar esto?\",\n toggleEdit: \"Cambiar al modo de edición\",\n viewMode: \"Cambiar al modo de lectura\",\n blockAdd: \"Haz clic para añadir un bloque\",\n blockDrag: \"Arrastra para mover este bloque\",\n tableOfContents: \"Índice\",\n },\n common: {\n cancel: \"Cancelar\",\n confirm: \"Confirmar\",\n apply: \"Aplicar\",\n delete: \"Eliminar\",\n save: \"Guardar\",\n close: \"Cerrar\",\n loading: \"Cargando\",\n error: \"Error\",\n success: \"Éxito\",\n },\n export: {\n export: \"Exportar\",\n html: \"HTML\",\n markdown: \"Markdown\",\n text: \"Texto sin formato\",\n copyHtml: \"Copiar como HTML\",\n copyMarkdown: \"Copiar como Markdown\",\n copyText: \"Copiar como texto sin formato\",\n downloadHtml: \"Descargar .html\",\n downloadMarkdown: \"Descargar .md\",\n downloadText: \"Descargar .txt\",\n copiedSuccess: \"¡Copiado al portapapeles!\",\n },\n};\n","import { Injectable, signal, computed } from \"@angular/core\";\nimport { ENGLISH_TRANSLATIONS } from \"../i18n/en_ateTranslations\";\nimport { FRENCH_TRANSLATIONS } from \"../i18n/fr_ateTranslations\";\nimport { GERMAN_TRANSLATIONS } from \"../i18n/de_ateTranslations\";\nimport { PORTUGUESE_TRANSLATIONS } from \"../i18n/pt_ateTranslations\";\nimport { SPANISH_TRANSLATIONS } from \"../i18n/es_ateTranslations\";\nimport { AteTranslations, SupportedLocale } from \"../i18n/ateTranslationsModel\";\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 de: GERMAN_TRANSLATIONS,\n pt: PORTUGUESE_TRANSLATIONS,\n es: SPANISH_TRANSLATIONS,\n });\n\n // Public signals\n readonly currentLocale = this._currentLocale.asReadonly();\n /** All loaded translations (useful for dynamic key access) */\n readonly allTranslations = this._translations.asReadonly();\n\n readonly translations = computed(\n () => this.getTranslations(this._currentLocale()) ?? this._translations().en\n );\n\n // Fast translation methods\n readonly t = computed(() => this.translations());\n readonly toolbar = computed(() => this.translations().toolbar);\n readonly bubbleMenu = computed(() => this.translations().bubbleMenu);\n readonly slashCommands = computed(() => this.translations().slashCommands);\n readonly table = computed(() => this.translations().table);\n readonly imageUpload = computed(() => this.translations().imageUpload);\n readonly editor = computed(() => this.translations().editor);\n readonly common = computed(() => this.translations().common);\n readonly export = computed(() => this.translations().export);\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 getTranslations(locale: SupportedLocale): AteTranslations | undefined {\n const resolved = this.resolveLocale(locale);\n return resolved ? this._translations()[resolved] : undefined;\n }\n\n private resolveLocale(locale: string): string | undefined {\n const all = this._translations();\n if (all[locale]) {\n return locale;\n }\n const language = locale.toLowerCase().split(/[-_]/)[0];\n return all[language] ? language : undefined;\n }\n\n private detectBrowserLanguage(): void {\n this._currentLocale.set(this.resolveLocale(navigator.language) ?? \"en\");\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, computed, inject, signal } from \"@angular/core\";\nimport { AteTranslations, SupportedLocale } from \"../i18n/ateTranslationsModel\";\nimport { AteI18nService } from \"./ate-i18n.service\";\n\n/**\n * Translations seen by one editor instance. The editor provides its own copy and binds its\n * `locale` input to it; without a locale (or outside an editor) it follows the global\n * `AteI18nService` locale. Internal: not part of the public API.\n */\n@Injectable({ providedIn: \"root\" })\nexport class AteEditorI18n {\n private readonly global = inject(AteI18nService);\n private readonly localeSource = signal<() => SupportedLocale | undefined>(() => undefined);\n\n readonly translations = computed<AteTranslations>(() => {\n const locale = this.localeSource()();\n return (locale && this.global.getTranslations(locale)) || this.global.translations();\n });\n\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 readonly export = computed(() => this.translations().export);\n\n bindLocale(source: () => SupportedLocale | undefined): void {\n this.localeSource.set(source);\n }\n}\n","import {\n Component,\n input,\n inject,\n signal,\n computed,\n effect,\n untracked,\n ChangeDetectionStrategy,\n OnDestroy,\n HostListener,\n booleanAttribute,\n} from \"@angular/core\";\nimport { Editor } from \"@tiptap/core\";\nimport { AteEditorRef } from \"../../models/ate-editor-ref\";\nimport { AteEditorRegistry } from \"../../services/ate-editor-registry.service\";\nimport { AteEditorI18n } from \"../../services/ate-editor-i18n.service\";\n\nimport { AteTocItem, AteTocVariant } from \"../../models/ate-toc.model\";\n\n/**\n * Table of Contents Component (Notion-style)\n * Dynamically extracts headings from the active editor and displays them.\n * Configurable via inputs (floating, position, variants, hover expansion) and CSS variables.\n */\n@Component({\n selector: \"ate-table-of-contents\",\n standalone: true,\n imports: [],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n \"[class.ate-toc-host-floating]\": \"floating()\",\n \"[style.--ate-toc-position-mode]\": \"floating() ? positionMode() : null\",\n \"[class.ate-toc-host-absolute]\": \"floating() && positionMode() === 'absolute'\",\n \"[class.ate-toc-host-fixed]\": \"floating() && positionMode() === 'fixed'\",\n },\n template: `\n <div\n class=\"ate-toc-wrapper\"\n [class.ate-toc-floating]=\"floating()\"\n [class.ate-toc-position-absolute]=\"floating() && positionMode() === 'absolute'\"\n [class.ate-toc-position-fixed]=\"floating() && positionMode() === 'fixed'\"\n [class.ate-toc-position-left]=\"position() === 'left'\"\n [class.ate-toc-position-right]=\"position() === 'right'\"\n (mouseenter)=\"setMouseHover(true)\"\n (mouseleave)=\"setMouseHover(false)\"\n (focusin)=\"setFocused(true)\"\n (focusout)=\"setFocused(false)\">\n <div\n class=\"ate-toc\"\n [class.ate-toc-floating]=\"floating()\"\n [class.ate-toc-position-left]=\"position() === 'left'\"\n [class.ate-toc-position-right]=\"position() === 'right'\"\n [class.ate-toc-variant-card]=\"variant() === 'card'\"\n [class.ate-toc-variant-transparent]=\"variant() === 'transparent'\"\n [class.ate-toc-variant-minimal]=\"variant() === 'minimal'\"\n [class.ate-toc-hover-expand]=\"floating() && hoverExpand()\"\n [class.ate-toc-hovered]=\"floating() && hoverExpand() && isExpanded()\"\n role=\"navigation\"\n aria-label=\"Table of Contents\">\n @if (items().length > 0) {\n @if (showTitle()) {\n <div class=\"ate-toc-header\">{{ headerTitle() }}</div>\n }\n <div class=\"ate-toc-list\">\n @for (item of items(); track item.id) {\n <button\n type=\"button\"\n class=\"ate-toc-item\"\n [class.ate-toc-active]=\"item.active\"\n [attr.aria-current]=\"item.active ? 'true' : null\"\n [attr.data-level]=\"item.level\"\n (click)=\"scrollToHeading(item, $event)\"\n [title]=\"item.text\">\n <!-- Perfect native vector SVG dash with level-adapted viewBox & width -->\n <svg\n [attr.width]=\"dashWidth(item.level)\"\n height=\"2\"\n [attr.viewBox]=\"'0 0 ' + dashWidth(item.level) + ' 2'\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"ate-toc-dash\">\n <rect\n [attr.width]=\"dashWidth(item.level)\"\n height=\"2\"\n rx=\"1\"\n ry=\"1\"\n fill=\"currentColor\"></rect>\n </svg>\n\n <!-- Full heading text -->\n <span class=\"ate-toc-text\">{{ item.text }}</span>\n </button>\n }\n </div>\n }\n </div>\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n }\n\n /* Outer Hitbox Container Positioning */\n .ate-toc-wrapper.ate-toc-floating {\n position: var(--ate-toc-position-mode, fixed);\n top: var(--ate-toc-top, 50%);\n transform: translateY(-50%);\n z-index: var(--ate-toc-z-index, 95);\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n }\n\n .ate-toc-wrapper.ate-toc-floating.ate-toc-position-absolute,\n :host(.ate-toc-host-absolute) .ate-toc-wrapper.ate-toc-floating {\n position: absolute;\n }\n\n .ate-toc-wrapper.ate-toc-floating.ate-toc-position-fixed,\n :host(.ate-toc-host-fixed) .ate-toc-wrapper.ate-toc-floating {\n position: fixed;\n }\n\n .ate-toc-wrapper.ate-toc-floating.ate-toc-position-right {\n right: var(--ate-toc-right, 2rem);\n left: auto;\n padding-left: var(--ate-toc-hitbox-padding, 16px);\n padding-right: 0;\n padding-top: var(--ate-toc-hitbox-padding-vertical, 8px);\n padding-bottom: var(--ate-toc-hitbox-padding-vertical, 8px);\n }\n\n .ate-toc-wrapper.ate-toc-floating.ate-toc-position-left {\n left: var(--ate-toc-left, 2rem);\n right: auto;\n padding-right: var(--ate-toc-hitbox-padding, 16px);\n padding-left: 0;\n padding-top: var(--ate-toc-hitbox-padding-vertical, 8px);\n padding-bottom: var(--ate-toc-hitbox-padding-vertical, 8px);\n }\n\n .ate-toc {\n font-family: inherit;\n user-select: none;\n width: 100%;\n box-sizing: border-box;\n transition: all 0.3s cubic-bezier(0.25, 0.46, 0.45, 0.94);\n }\n\n /* Floating Mode Container Positioning */\n .ate-toc.ate-toc-floating {\n max-height: var(--ate-toc-max-height, 400px);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n }\n\n /* Floating mode width & padding */\n .ate-toc.ate-toc-floating:not(.ate-toc-hover-expand),\n .ate-toc.ate-toc-floating.ate-toc-hover-expand:hover,\n .ate-toc.ate-toc-floating.ate-toc-hover-expand.ate-toc-hovered {\n width: var(--ate-toc-width, 240px);\n border-radius: var(--ate-toc-border-radius, var(--ate-border-radius, 16px));\n padding: var(--ate-toc-padding);\n }\n\n .ate-toc.ate-toc-floating.ate-toc-hover-expand:not(.ate-toc-hovered):not(:hover) {\n width: var(--ate-toc-collapsed-width, 32px);\n border-radius: var(--ate-toc-collapsed-radius, 16px);\n padding: var(--ate-toc-padding);\n }\n\n /* Variant: card */\n .ate-toc.ate-toc-variant-card {\n background: var(--ate-toc-bg, var(--ate-surface, #ffffff));\n border: 1px solid var(--ate-toc-border, var(--ate-border, #e2e8f0));\n border-radius: var(--ate-toc-border-radius, var(--ate-border-radius, 12px));\n box-shadow: var(--ate-toc-shadow, 0 4px 20px rgba(0, 0, 0, 0.06));\n padding: var(--ate-toc-padding);\n }\n\n /* Variant: minimal */\n .ate-toc.ate-toc-variant-minimal {\n background: transparent;\n border: 1px solid transparent;\n box-shadow: none;\n border-radius: var(--ate-toc-border-radius, var(--ate-border-radius, 12px));\n padding: 10px 12px;\n }\n\n .ate-toc.ate-toc-variant-minimal:hover {\n background: var(--ate-toc-hover-bg, var(--ate-surface, rgba(255, 255, 255, 0.95)));\n border-color: var(--ate-toc-hover-border, var(--ate-border, #e2e8f0));\n box-shadow: var(--ate-toc-hover-shadow, 0 4px 20px rgba(0, 0, 0, 0.06));\n }\n\n /* Variant: transparent */\n .ate-toc.ate-toc-variant-transparent {\n background: transparent;\n border: none;\n box-shadow: none;\n padding: 0;\n }\n\n /* Header styling */\n .ate-toc-header {\n font-size: 0.65rem;\n text-transform: uppercase;\n letter-spacing: 0.08em;\n font-weight: 700;\n color: var(--ate-text-muted, #9ca3af);\n margin-bottom: 10px;\n margin-top: 6px;\n padding-left: 12px;\n padding-right: 0;\n text-align: left;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n transition: opacity 0.2s ease;\n }\n\n /* List container */\n .ate-toc-list {\n display: flex;\n flex-direction: column;\n gap: var(--ate-toc-text-gap, var(--ate-toc-gap, 2px));\n position: relative;\n transition: gap 0.2s ease;\n }\n\n /* Base Item (Expanded / Text mode default) */\n .ate-toc-item {\n display: flex;\n align-items: center;\n justify-content: flex-start;\n text-align: left;\n position: relative;\n text-decoration: none;\n background: transparent;\n border: none;\n padding-right: 0;\n cursor: pointer;\n font: inherit;\n width: 100%;\n height: var(--ate-toc-item-hover-height, 22px);\n color: var(--ate-toolbar-button-color, var(--ate-text-secondary, #64748b));\n outline: none;\n box-sizing: border-box;\n border-radius: var(--ate-sub-border-radius, 8px);\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n overflow: hidden;\n }\n\n .ate-toc-item:focus-visible {\n outline: 2px solid var(--ate-primary, #2563eb);\n outline-offset: 1px;\n }\n\n /* Level Indentations in Text mode */\n .ate-toc-item[data-level=\"1\"] {\n padding-left: 8px;\n }\n .ate-toc-item[data-level=\"2\"] {\n padding-left: 16px;\n }\n .ate-toc-item[data-level=\"3\"] {\n padding-left: 24px;\n }\n .ate-toc-item[data-level=\"4\"] {\n padding-left: 32px;\n }\n .ate-toc-item[data-level=\"5\"] {\n padding-left: 40px;\n }\n .ate-toc-item[data-level=\"6\"] {\n padding-left: 48px;\n }\n\n /* Item hover overlay & active state (Expanded / Text mode) */\n .ate-toc-item::before {\n content: \"\";\n position: absolute;\n inset: 0;\n background: var(--ate-primary, #2563eb);\n opacity: 0;\n transition: opacity 0.2s ease;\n border-radius: var(--ate-sub-border-radius, 8px);\n pointer-events: none;\n }\n\n .ate-toc-item:hover {\n color: var(--ate-toolbar-button-active-color, var(--ate-primary, #2563eb));\n background: var(--ate-toolbar-button-hover-background, transparent);\n }\n\n .ate-toc-item:hover::before {\n opacity: 0.1;\n }\n\n .ate-toc-item.ate-toc-active {\n color: var(--ate-toolbar-button-active-color, var(--ate-primary, #2563eb));\n background: var(\n --ate-toolbar-button-active-background,\n var(--ate-primary-light, color-mix(in srgb, var(--ate-primary, #2563eb), transparent 90%))\n );\n font-weight: 600;\n }\n\n /* Heading Text styling */\n .ate-toc-text {\n font-size: 0.8rem;\n font-weight: 500;\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n flex: 1;\n min-width: 0;\n opacity: 1;\n max-width: 250px;\n transform: translateX(0);\n margin-left: 4px;\n margin-right: 0;\n transition:\n opacity 0.25s cubic-bezier(0.25, 0.46, 0.45, 0.94),\n max-width 0.3s cubic-bezier(0.25, 0.46, 0.45, 0.94),\n transform 0.25s cubic-bezier(0.25, 0.46, 0.45, 0.94),\n margin 0.25s ease;\n }\n\n /* SVG Rect Dash styling (Hidden in Text mode) */\n .ate-toc-dash {\n display: none;\n height: 3px;\n color: var(--ate-toc-dash-color, var(--ate-border, #cbd5e1));\n flex-shrink: 0;\n vertical-align: middle;\n overflow: visible;\n transition: all 0.3s cubic-bezier(0.25, 0.46, 0.45, 0.94);\n }\n\n /* --- COLLAPSED NOTION MODE (Dashes only, when hover-expand is active & not hovered) --- */\n .ate-toc.ate-toc-hover-expand:not(.ate-toc-hovered) .ate-toc-header {\n display: none;\n }\n\n .ate-toc.ate-toc-hover-expand:not(.ate-toc-hovered) .ate-toc-dash {\n display: inline-block;\n }\n\n .ate-toc.ate-toc-hover-expand:not(.ate-toc-hovered) .ate-toc-item {\n height: var(--ate-toc-item-height, 18px);\n padding-left: 0;\n padding-right: 0;\n background: transparent;\n }\n\n .ate-toc.ate-toc-hover-expand:not(.ate-toc-hovered) .ate-toc-item::before {\n opacity: 0;\n }\n\n .ate-toc.ate-toc-hover-expand:not(.ate-toc-hovered) .ate-toc-item:hover .ate-toc-dash,\n .ate-toc.ate-toc-hover-expand:not(.ate-toc-hovered)\n .ate-toc-item.ate-toc-active\n .ate-toc-dash {\n color: var(--ate-primary, #2563eb);\n opacity: 1;\n }\n\n /* Direction & text collapse for Collapsed RIGHT position */\n .ate-toc.ate-toc-hover-expand.ate-toc-position-right:not(.ate-toc-hovered) .ate-toc-item {\n flex-direction: row-reverse;\n justify-content: flex-start;\n }\n\n .ate-toc.ate-toc-hover-expand.ate-toc-position-right:not(.ate-toc-hovered) .ate-toc-text {\n opacity: 0;\n max-width: 0;\n transform: translateX(4px);\n margin-right: 0;\n }\n\n /* Direction & text collapse for Collapsed LEFT position */\n .ate-toc.ate-toc-hover-expand:not(.ate-toc-position-right):not(.ate-toc-hovered)\n .ate-toc-item,\n .ate-toc.ate-toc-hover-expand.ate-toc-position-left:not(.ate-toc-hovered) .ate-toc-item {\n flex-direction: row;\n justify-content: flex-start;\n }\n\n .ate-toc.ate-toc-hover-expand:not(.ate-toc-position-right):not(.ate-toc-hovered)\n .ate-toc-text,\n .ate-toc.ate-toc-hover-expand.ate-toc-position-left:not(.ate-toc-hovered) .ate-toc-text {\n opacity: 0;\n max-width: 0;\n transform: translateX(-4px);\n margin-left: 0;\n }\n `,\n ],\n})\nexport class AteTableOfContentsComponent implements OnDestroy {\n // Input accepts raw Editor, AteEditorRef, or ID of registered editor\n editor = input<Editor | AteEditorRef | string | null | undefined>(null);\n\n // Optional custom title (if not provided, uses i18n translation)\n title = input<string | null>(null);\n\n // Whether to show the header title\n showTitle = input(true, { transform: booleanAttribute });\n\n // Layout mode: floating on fixed position or inline inside parent container\n floating = input(true, { transform: booleanAttribute });\n\n // Positioning mode when floating: 'fixed' (relative to viewport, default) or 'absolute' (relative to parent container)\n positionMode = input<\"absolute\" | \"fixed\">(\"fixed\");\n\n // Floating position: 'right' | 'left'\n position = input<\"left\" | \"right\">(\"right\");\n\n // Visual variant: 'minimal' | 'card' | 'transparent'\n variant = input<AteTocVariant>(\"minimal\");\n\n // Notion-style hover expansion (collapses text into dashes until hovered)\n hoverExpand = input(true, { transform: booleanAttribute });\n\n // Maximum heading level depth to include (1-6, default: 6)\n maxDepth = input<number, number | string>(6, {\n transform: (v: number | string) => {\n const parsed = typeof v === \"string\" ? parseInt(v, 10) : v;\n if (isNaN(parsed)) {\n return 6;\n }\n return Math.min(Math.max(1, parsed), 6);\n },\n });\n\n private readonly registry = inject(AteEditorRegistry);\n private readonly i18n = inject(AteEditorI18n);\n\n // Helper method for exact native SVG dash width per heading level\n dashWidth(level: number): number {\n switch (level) {\n case 1:\n return 16;\n case 2:\n return 12;\n case 3:\n return 8;\n case 4:\n return 6;\n case 5:\n return 4;\n default:\n return 3;\n }\n }\n\n // Computed header title with fallback to i18n\n readonly headerTitle = computed(() => {\n const custom = this.title();\n if (custom !== null && custom !== undefined) {\n return custom;\n }\n return this.i18n.editor().tableOfContents;\n });\n\n // Resolved editor instance\n readonly resolvedEditor = computed(() => {\n const val = this.editor();\n if (!val) {\n return this.registry.activeEditor()?.editor || null;\n }\n if (val instanceof AteEditorRef) {\n return val.editor;\n }\n if (typeof val === \"string\") {\n return this.registry.get(val)?.editor || null;\n }\n return val;\n });\n\n // Table of Contents items\n readonly items = signal<AteTocItem[]>([]);\n\n // Distinct mouse hover and keyboard focus state tracking\n isMouseHovered = signal<boolean>(false);\n isFocused = signal<boolean>(false);\n readonly isExpanded = computed(() => this.isMouseHovered() || this.isFocused());\n\n constructor() {\n // React strictly to editor instance changes without tracking internal signal updates\n effect(() => {\n const editor = this.resolvedEditor();\n untracked(() => {\n if (editor) {\n this.bindEditorEvents(editor);\n this.updateHeadings(editor);\n } else {\n this.items.set([]);\n }\n });\n });\n }\n\n ngOnDestroy() {\n const editor = this.resolvedEditor();\n if (editor) {\n this.unbindEditorEvents(editor);\n }\n }\n\n @HostListener(\"window:scroll\", [])\n @HostListener(\"window:resize\", [])\n onScroll() {\n this.checkActiveHeading();\n }\n\n // Handle mouse hover state independently\n setMouseHover(hovered: boolean) {\n this.isMouseHovered.set(hovered);\n }\n\n // Handle keyboard focus state independently\n setFocused(focused: boolean) {\n this.isFocused.set(focused);\n }\n\n // Navigate to heading on click\n scrollToHeading(item: AteTocItem, event: MouseEvent) {\n event.preventDefault();\n event.stopPropagation();\n\n const editor = this.resolvedEditor();\n if (!editor || !editor.view) {\n return;\n }\n\n try {\n // 1. Position cursor inside the heading text (item.pos + 1 points to inline text)\n const targetPos = Math.min(item.pos + 1, editor.state.doc.content.size);\n editor.commands.setTextSelection(targetPos);\n editor.commands.focus();\n } catch (_e) {\n // Safe-guard against position selection errors\n }\n\n // 2. Smoothly scroll DOM node into view\n setTimeout(() => {\n try {\n const domNode = editor.view.nodeDOM(item.pos) as HTMLElement;\n if (domNode) {\n domNode.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\n }\n } catch (_e) {\n // Safe-guard\n }\n }, 10);\n }\n\n private bindEditorEvents(editor: Editor) {\n this.unbindEditorEvents(editor);\n editor.on(\"update\", this.onEditorUpdate);\n editor.on(\"selectionUpdate\", this.onEditorUpdate);\n }\n\n private unbindEditorEvents(editor: Editor) {\n editor.off(\"update\", this.onEditorUpdate);\n editor.off(\"selectionUpdate\", this.onEditorUpdate);\n }\n\n private readonly onEditorUpdate = () => {\n const editor = this.resolvedEditor();\n if (editor) {\n this.updateHeadings(editor);\n }\n };\n\n private updateHeadings(editor: Editor) {\n const nextItems: AteTocItem[] = [];\n\n try {\n editor.state.doc.descendants((node, pos) => {\n if (node.type.name === \"heading\") {\n const text = node.textContent.trim();\n const level = node.attrs[\"level\"] || 1;\n\n const maxDepthLevel = this.maxDepth();\n if (text && level <= maxDepthLevel) {\n nextItems.push({\n text,\n level,\n pos,\n id: `heading-${pos}`,\n active: false,\n });\n }\n }\n });\n } catch (_e) {\n // Safe guard against document access issues\n }\n\n untracked(() => {\n this.items.set(nextItems);\n this.checkActiveHeading();\n });\n }\n\n private checkActiveHeading() {\n // Active heading scroll tracking only applies to floating TOC mode\n if (!this.floating()) {\n return;\n }\n\n const editor = this.resolvedEditor();\n if (!editor || !editor.view) {\n return;\n }\n\n untracked(() => {\n const currentItems = this.items();\n if (currentItems.length === 0) {\n return;\n }\n\n const headingsWithDom = currentItems\n .map(item => {\n try {\n const dom = editor.view.nodeDOM(item.pos) as HTMLElement;\n return { item, dom };\n } catch (_e) {\n return { item, dom: null };\n }\n })\n .filter((entry): entry is { item: AteTocItem; dom: HTMLElement } => entry.dom !== null);\n\n if (headingsWithDom.length === 0) {\n return;\n }\n\n const windowHeight = typeof window !== \"undefined\" ? window.innerHeight : 800;\n let activeItem: AteTocItem | null = null;\n\n for (let i = headingsWithDom.length - 1; i >= 0; i--) {\n const { item, dom } = headingsWithDom[i];\n const rect = dom.getBoundingClientRect();\n\n if (rect.top <= windowHeight * 0.35) {\n activeItem = item;\n break;\n }\n }\n\n if (!activeItem && headingsWithDom.length > 0) {\n activeItem = headingsWithDom[0].item;\n }\n\n if (activeItem) {\n const updated = currentItems.map(item => ({\n ...item,\n active: item.id === activeItem!.id,\n }));\n\n const isDifferent = updated.some((item, idx) => item.active !== currentItems[idx].active);\n if (isDifferent) {\n this.items.set(updated);\n }\n }\n });\n }\n}\n","import { Component, ChangeDetectionStrategy } from \"@angular/core\";\nimport { Injector } from \"@angular/core\";\nimport { AteAngularNodeView } from \"../../node-view/ate-angular-node-view\";\nimport { registerAngularComponent } from \"../../node-view/ate-register-angular-component\";\nimport { RegisterAngularComponentOptions } from \"../../node-view/ate-node-view.models\";\nimport { AteTableOfContentsComponent } from \"./ate-table-of-contents.component\";\n\n/**\n * Custom Angular NodeView wrapper for displaying Table of Contents directly inside the editor content.\n */\n@Component({\n selector: \"ate-toc-node\",\n standalone: true,\n imports: [AteTableOfContentsComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"ate-toc-node-wrapper\">\n <ate-table-of-contents\n [editor]=\"editor()\"\n [floating]=\"false\"\n [variant]=\"node().attrs['variant'] || 'minimal'\"\n [showTitle]=\"node().attrs['showTitle'] !== false\"\n [maxDepth]=\"node().attrs['maxDepth'] || 6\" />\n </div>\n `,\n styles: [\n `\n .ate-toc-node-wrapper {\n margin: 1rem 0;\n user-select: none;\n }\n `,\n ],\n})\nexport class AteTocNodeComponent extends AteAngularNodeView {}\n\n/**\n * Registration options for the Table of Contents Angular NodeView\n */\nexport const AteTocNodeOptions: RegisterAngularComponentOptions<AteTocNodeComponent> = {\n component: AteTocNodeComponent,\n name: \"tableOfContents\",\n group: \"block\",\n draggable: true,\n attributes: {\n variant: {\n default: \"minimal\",\n },\n showTitle: {\n default: true,\n },\n maxDepth: {\n default: 6,\n },\n },\n};\n\n/**\n * Creates the Table of Contents TipTap Node Extension instance.\n */\nexport function getAteTocNodeExtension(injector?: Injector) {\n if (injector) {\n return registerAngularComponent(injector, AteTocNodeOptions);\n }\n return registerAngularComponent(AteTocNodeOptions);\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 { Directive, ElementRef, input, OnDestroy, inject, effect, computed } from \"@angular/core\";\nimport tippy, { Instance as TippyInstance, Placement } from \"tippy.js\";\n\n// Pre-calculate platform once to avoid repeated checks\nconst IS_MAC = typeof window !== \"undefined\" && /Mac|iPod|iPhone|iPad/.test(navigator.platform);\n\nconst DURATION: [number, number] = [100, 100];\n// After a tooltip closes, the next one still opens at once if hovered within this gap\nconst WARM_GAP = 300;\n\n// Shared by every tooltip: the first one waits for its delay, the next ones open at once,\n// without animation, as long as the pointer moves from one control to the next.\nlet openTooltip: TippyInstance | null = null;\nlet warm = false;\nlet coolTimeout: ReturnType<typeof setTimeout> | undefined;\n\n@Directive({\n selector: \"[ateTooltip]\",\n standalone: true,\n host: {\n \"[attr.aria-keyshortcuts]\": \"ariaShortcut()\",\n },\n})\nexport class AteTooltipDirective implements OnDestroy {\n private readonly el = inject(ElementRef);\n private tippyInstance: TippyInstance | null = null;\n\n // Signal Inputs\n content = input<string | null>(null, { alias: \"ateTooltip\" });\n placement = input<Placement>(\"top\", { alias: \"ateTooltipPlacement\" });\n delay = input<number | [number, number]>([200, 50], { alias: \"ateTooltipDelay\" });\n disabled = input<boolean>(false, { alias: \"ateTooltipDisabled\" });\n\n /**\n * Computed logic for ARIA shortcuts.\n */\n protected readonly ariaShortcut = computed(() => {\n const text = this.content();\n if (!text || !text.includes(\"\\n\")) {\n return null;\n }\n return text.split(\"\\n\")[1].replace(/\\+/g, \" \");\n });\n\n /**\n * Computed logic for Tippy content.\n * Includes strict escaping of dynamic content to prevent XSS.\n */\n private readonly processedTooltip = computed(() => {\n const text = this.content();\n if (!text) {\n return { content: \"\", isHTML: false };\n }\n\n if (text.includes(\"\\n\")) {\n const [label, shortcut] = text.split(\"\\n\");\n\n // Escape dynamic parts to prevent XSS before wrapping in safe HTML\n const safeLabel = this.escapeHtml(label);\n let safeShortcut = this.escapeHtml(shortcut);\n\n if (IS_MAC) {\n safeShortcut = safeShortcut.replace(/Ctrl\\+/g, \"⌘\").replace(/Mod\\+/g, \"⌘\");\n } else {\n safeShortcut = safeShortcut.replace(/Mod\\+/g, \"Ctrl+\");\n }\n\n return {\n content: `<div class=\"ate-tooltip-label\">${safeLabel}</div><div class=\"ate-tooltip-shortcut\"><kbd>${safeShortcut}</kbd></div>`,\n isHTML: true,\n };\n }\n\n // No newline? Keep it as plain text (Tippy handles string as text by default)\n return { content: text, isHTML: false };\n });\n\n constructor() {\n effect(() => {\n const { content, isHTML } = this.processedTooltip();\n const placement = this.placement();\n const delay = this.delay();\n const isDisabled = this.disabled();\n\n if (isDisabled || !content) {\n this.destroyTippy();\n return;\n }\n\n if (!this.tippyInstance) {\n this.initTippy(content, isHTML, placement, delay);\n } else {\n this.tippyInstance.setProps({\n content,\n allowHTML: isHTML,\n placement,\n delay,\n });\n }\n });\n }\n\n ngOnDestroy(): void {\n this.destroyTippy();\n }\n\n /**\n * Basic HTML escaping for security.\n * Effectively neutralizes scripts or malicious HTML tags.\n */\n private escapeHtml(unsafe: string): string {\n return unsafe\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#039;\");\n }\n\n private initTippy(\n content: string,\n allowHTML: boolean,\n placement: Placement,\n delay: number | [number, number]\n ): void {\n const container = this.el.nativeElement.closest(\".ate-editor\") || document.body;\n\n this.tippyInstance = tippy(this.el.nativeElement, {\n content,\n allowHTML,\n placement,\n delay,\n duration: DURATION,\n offset: [0, 6],\n theme: \"ate-tooltip\",\n touch: [\"hold\", 500],\n maxWidth: 250,\n appendTo: () => container,\n aria: {\n content: \"describedby\",\n },\n onTrigger: (instance, event) => {\n const base = this.delay();\n const instant = warm && event.type === \"mouseenter\";\n instance.setProps({\n delay: instant ? [0, Array.isArray(base) ? base[1] : base] : base,\n duration: instant ? [0, DURATION[1]] : DURATION,\n });\n },\n onShow: instance => {\n // Only one tooltip at a time: the previous one goes away at once\n if (openTooltip && openTooltip !== instance) {\n openTooltip.unmount();\n }\n openTooltip = instance;\n warm = true;\n clearTimeout(coolTimeout);\n },\n onHidden: instance => {\n if (openTooltip !== instance) {\n return;\n }\n openTooltip = null;\n coolTimeout = setTimeout(() => (warm = false), WARM_GAP);\n },\n popperOptions: {\n modifiers: [\n {\n name: \"preventOverflow\",\n options: {\n boundary: document.body,\n padding: 8,\n },\n },\n ],\n },\n }) as unknown as TippyInstance;\n }\n\n private destroyTippy(): void {\n if (this.tippyInstance) {\n if (openTooltip === this.tippyInstance) {\n openTooltip = null;\n }\n this.tippyInstance.destroy();\n this.tippyInstance = null;\n }\n }\n}\n","import {\n Component,\n ChangeDetectionStrategy,\n ViewEncapsulation,\n computed,\n inject,\n input,\n} from \"@angular/core\";\nimport { DomSanitizer } from \"@angular/platform-browser\";\nimport { AteIconKey, AteIconRegistry } from \"../../services/ate-icon-registry.service\";\n\n/**\n * Renders an icon from the AteIconRegistry as inline SVG,\n * or with the Material Symbols font when the name is not registered.\n * Its size follows the `font-size` (1em). Library icons are filled with `currentColor`;\n * a full custom `<svg>` keeps its own `fill` and `stroke` attributes.\n */\n@Component({\n selector: \"ate-icon\",\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n // The SVG is injected as HTML: its styles cannot be scoped to the component\n encapsulation: ViewEncapsulation.None,\n host: {\n class: \"ate-icon\",\n \"aria-hidden\": \"true\",\n \"[innerHTML]\": \"content()\",\n },\n template: \"\",\n styles: [\n `\n .ate-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 1em;\n height: 1em;\n font-size: 24px;\n line-height: 1;\n }\n\n .ate-icon > svg {\n display: block;\n width: 100%;\n height: 100%;\n }\n\n .ate-icon > .material-symbols-outlined {\n font-size: inherit;\n }\n `,\n ],\n})\nexport class AteIconComponent {\n private readonly registry = inject(AteIconRegistry);\n private readonly sanitizer = inject(DomSanitizer);\n\n /** Library icon, icon registered with provideAteIcons, or Material Symbols name (font) */\n name = input.required<AteIconKey>();\n\n // Icons come from the library or from the developer, never from user content\n readonly content = computed(() =>\n this.sanitizer.bypassSecurityTrustHtml(this.registry.markup(this.name()))\n );\n}\n","import { Component, input, output, ChangeDetectionStrategy, booleanAttribute } from \"@angular/core\";\nimport { AteTooltipDirective } from \"../../directives/ate-tooltip.directive\";\nimport { AteIconComponent } from \"./ate-icon.component\";\nimport { AteIconKey } from \"../../services/ate-icon-registry.service\";\n\nexport interface AteButtonConfig {\n icon: AteIconKey;\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 imports: [AteTooltipDirective, AteIconComponent],\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 [ateTooltip]=\"title()\"\n [attr.aria-label]=\"title()\"\n (mousedown)=\"onMouseDown($event)\"\n (click)=\"buttonClick.emit($event)\"\n type=\"button\">\n @if (icon()) {\n <ate-icon\n [name]=\"icon()\"\n [class.icon-small]=\"iconSize() === 'small'\"\n [class.icon-medium]=\"iconSize() === 'medium'\"\n [class.icon-large]=\"iconSize() === 'large'\" />\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 .ate-icon {\n font-size: 20px;\n position: relative;\n z-index: 1;\n }\n\n .ate-button .ate-icon.icon-small {\n font-size: 16px;\n }\n\n .ate-button .ate-icon.icon-medium {\n font-size: 20px;\n }\n\n .ate-button .ate-icon.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 .ate-icon {\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<AteIconKey>(\"\");\n title = input.required<string>();\n active = input(false, { transform: booleanAttribute });\n disabled = input(false, { transform: booleanAttribute });\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, ChangeDetectionStrategy } from \"@angular/core\";\n\n@Component({\n selector: \"ate-separator\",\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `<div class=\"ate-separator\"></div>`,\n styles: [\n `\n .ate-separator {\n width: 1px;\n height: 24px;\n background-color: var(--ate-border, #e2e8f0);\n margin: 0 var(--ate-menu-gap, 2px);\n flex-shrink: 0;\n }\n `,\n ],\n})\nexport class AteSeparatorComponent {}\n","import { Injectable, signal, computed, inject } from \"@angular/core\";\nimport { Editor } from \"@tiptap/core\";\nimport { isObservable, firstValueFrom } from \"rxjs\";\nimport { AteEditorI18n } from \"./ate-editor-i18n.service\";\nimport { ateResolveImageSrc } from \"../utils/ate-image-src-resolver.utils\";\nimport {\n AteResizeOptions,\n AteImageUploadOptions,\n AteImageUploadHandler,\n AteImageSrcResolver,\n AteImageUploadResult,\n AteImageData,\n AteImageRejection,\n AteImageSource,\n AteImageValidationError,\n AteImageValidationReason,\n} from \"../models/ate-image.model\";\n\n@Injectable()\nexport class AteImageService {\n onImageUploadedCallback?: (result: AteImageUploadResult) => void;\n onImageRejectedCallback?: (rejection: AteImageRejection) => void;\n\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(AteEditorI18n);\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 srcResolver: AteImageSrcResolver | 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 editor\n .chain()\n .focus()\n .setResizableImage(imageData)\n .command(({ tr, commands }) => {\n // Selection is usually after the node. Node is at tr.selection.from - 1.\n const { from } = tr.selection;\n // Try to select node at current pos (if it was already selected) or previous pos\n return commands.setNodeSelection(from) || commands.setNodeSelection(from - 1) || true;\n })\n .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 const storedSrc = editor.getAttributes(\"resizableImage\")[\"src\"];\n ateResolveImageSrc(this.srcResolver, storedSrc).then(src => {\n img.src = src;\n });\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 /** Download the current image */\n downloadImage(editor: Editor): void {\n const attrs = editor.getAttributes(\"resizableImage\");\n if (!attrs || !attrs[\"src\"]) {\n return;\n }\n\n const fileName = attrs[\"alt\"] || \"image\";\n\n ateResolveImageSrc(this.srcResolver, attrs[\"src\"]).then(src =>\n this.downloadResolvedImage(src, fileName)\n );\n }\n\n private downloadResolvedImage(src: string, fileName: string): void {\n // Detect if it's base64 or remote URL\n if (\n src.startsWith(\"data:\") ||\n src.startsWith(\"blob:\") ||\n (typeof window !== \"undefined\" && src.startsWith(window.location.origin))\n ) {\n const link = document.createElement(\"a\");\n link.href = src;\n link.download = fileName;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n } else {\n // For remote URLs, we try to fetch it to bypass cross-origin restrictions on 'download' attribute\n fetch(src)\n .then(response => response.blob())\n .then(blob => {\n const url = window.URL.createObjectURL(blob);\n const link = document.createElement(\"a\");\n link.href = url;\n link.download = fileName;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n window.URL.revokeObjectURL(url);\n })\n .catch(err => {\n console.error(\"Error downloading image:\", err);\n // Fallback to opening in new tab\n window.open(src, \"_blank\");\n });\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; reason?: AteImageValidationReason } {\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, reason: \"invalid-type\" };\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 reason: \"too-large\",\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 | undefined,\n source: AteImageSource\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 result = await this.processImage(file, options, (progress, message) => {\n if (progress !== undefined) {\n this.uploadProgress.set(progress);\n }\n if (message !== undefined) {\n this.uploadMessage.set(message);\n this.forceEditorUpdate();\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 if (this.onImageUploadedCallback) {\n this.onImageUploadedCallback(result);\n }\n\n this.resetUploadState();\n } catch (error) {\n this.resetUploadState();\n console.error(this.t().uploadError, error);\n this.onImageRejectedCallback?.({\n reason: error instanceof AteImageValidationError ? error.reason : \"upload-failed\",\n file,\n source,\n });\n throw error;\n }\n }\n\n /** Validate, compress and (when configured) send an image to the upload handler */\n private async processImage(\n file: File,\n options?: AteImageUploadOptions,\n onStep?: (progress?: number, message?: string) => void\n ): Promise<AteImageUploadResult> {\n const validation = this.validateImage(file, {\n maxSize: options?.maxSize,\n allowedTypes: options?.allowedTypes,\n });\n if (!validation.valid) {\n throw new AteImageValidationError(\n validation.reason ?? \"invalid-type\",\n validation.error ?? \"\"\n );\n }\n\n onStep?.(30, this.t().compressing);\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 onStep?.(70);\n\n // Handle custom upload if handler is provided\n if (this.uploadHandler) {\n onStep?.(undefined, this.t().uploadingToServer);\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 return result;\n }\n\n /**\n * Run an image that is already in the document (e.g. base64 from pasted HTML)\n * through validation, compression and the upload handler, and resolve to its new `src`.\n */\n async rehostImage(file: File, options?: AteImageUploadOptions): Promise<string> {\n try {\n const result = await this.processImage(file, options);\n if (this.onImageUploadedCallback) {\n this.onImageUploadedCallback(result);\n }\n return result.src;\n } catch (error) {\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 source: AteImageSource = \"api\"\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 source\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: (\n editor: Editor,\n file: File,\n options: AteImageUploadOptions | undefined,\n source: AteImageSource\n ) => 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, \"picker\");\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 source: AteImageSource = \"api\"\n ): Promise<void> {\n // Store current position to ensure we can re-select the image even if selection blurs during upload\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 .command(({ tr, commands }) => {\n const { from } = tr.selection;\n // Re-select the node at its mapped position or current selection\n return commands.setNodeSelection(from) || commands.setNodeSelection(from - 1) || true;\n })\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 source\n );\n }\n\n /**\n * Handle image drop event.\n * Calculates the position from coordinates and sets the selection accordingly.\n */\n handleDrop(editor: Editor, event: DragEvent, options?: AteImageUploadOptions): boolean {\n const files = event.dataTransfer?.files;\n if (!files || files.length === 0) {\n return false;\n }\n\n const file = Array.from(files).find(f => f.type.startsWith(\"image/\"));\n if (!file) {\n return false;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n // Try to find the drop position from coordinates\n const pos = editor.view.posAtCoords({ left: event.clientX, top: event.clientY });\n if (pos) {\n editor.commands.setTextSelection(pos.pos);\n }\n\n this.uploadAndInsertImage(editor, file, options, \"drop\").catch(() => undefined);\n return true;\n }\n\n /**\n * Handle image paste event.\n */\n handlePaste(editor: Editor, event: ClipboardEvent, options?: AteImageUploadOptions): boolean {\n const clipboardFiles = event.clipboardData?.files;\n if (!clipboardFiles || clipboardFiles.length === 0) {\n return false;\n }\n\n const imageFile = Array.from(clipboardFiles).find(file => file.type.startsWith(\"image/\"));\n if (!imageFile) {\n return false;\n }\n\n event.preventDefault();\n this.uploadAndInsertImage(editor, imageFile, options, \"paste\").catch(() => undefined);\n return true;\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 =\n (event.currentTarget as HTMLElement) || (target as Element)?.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) ||\n (target as Element)?.closest(\"button\") ||\n 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","/**\n * HTML to Markdown converter utility (no external dependencies).\n */\n\nexport function htmlToMarkdown(html: string): string {\n const parser = new DOMParser();\n const doc = parser.parseFromString(html, \"text/html\");\n const result = convertNode(doc.body, { listDepth: 0, listType: null });\n // Normalize multiple blank lines to max two\n return result.replace(/\\n{3,}/g, \"\\n\\n\").trim();\n}\n\nfunction convertNode(\n node: Node,\n ctx: { listDepth: number; listType: \"ul\" | \"ol\" | null; orderedIndex?: number }\n): string {\n if (node.nodeType === Node.TEXT_NODE) {\n return node.textContent || \"\";\n }\n\n if (node.nodeType !== Node.ELEMENT_NODE) {\n return \"\";\n }\n\n const el = node as HTMLElement;\n const tag = el.tagName.toLowerCase();\n const children = Array.from(el.childNodes);\n\n const inner = (overrideCtx?: Partial<typeof ctx>) =>\n children.map(c => convertNode(c, { ...ctx, ...overrideCtx })).join(\"\");\n\n // ── Block-level elements ──────────────────────────────────\n\n if (tag === \"br\") {\n return \"\\n\";\n }\n\n if (tag === \"hr\") {\n return \"\\n\\n---\\n\\n\";\n }\n\n if (/^h[1-6]$/.test(tag)) {\n const level = parseInt(tag[1], 10);\n const prefix = \"#\".repeat(level);\n return `\\n\\n${prefix} ${inner().trim()}\\n\\n`;\n }\n\n if (tag === \"p\") {\n const content = inner().trim();\n if (!content) {\n return \"\";\n }\n return `\\n\\n${content}\\n\\n`;\n }\n\n if (tag === \"blockquote\") {\n const content = inner()\n .trim()\n .split(\"\\n\")\n .map(line => `> ${line}`)\n .join(\"\\n\");\n return `\\n\\n${content}\\n\\n`;\n }\n\n if (tag === \"pre\") {\n // Extract language from code class e.g. \"language-typescript\"\n const codeEl = el.querySelector(\"code\");\n const lang = codeEl ? (codeEl.className.match(/language-(\\S+)/) || [])[1] || \"\" : \"\";\n const code = codeEl ? codeEl.textContent || \"\" : el.textContent || \"\";\n return `\\n\\n\\`\\`\\`${lang}\\n${code}\\n\\`\\`\\`\\n\\n`;\n }\n\n if (tag === \"ul\" || tag === \"ol\") {\n const isTaskList = el.getAttribute(\"data-type\") === \"taskList\";\n const items = children\n .filter(c => (c as HTMLElement).tagName?.toLowerCase() === \"li\")\n .map((li, idx) =>\n convertListItem(li as HTMLElement, {\n listDepth: ctx.listDepth + 1,\n listType: tag === \"ul\" ? \"ul\" : \"ol\",\n orderedIndex: idx + 1,\n isTaskList,\n })\n )\n .join(\"\\n\");\n const block = `\\n\\n${items}\\n\\n`;\n // Only add surrounding newlines for root-level lists\n return ctx.listDepth === 0 ? block : `\\n${items}`;\n }\n\n if (tag === \"table\") {\n return convertTable(el);\n }\n\n // ── Inline elements ──────────────────────────────────────\n\n if (tag === \"strong\" || tag === \"b\") {\n const content = inner();\n return content ? `**${content}**` : \"\";\n }\n\n if (tag === \"em\" || tag === \"i\") {\n const content = inner();\n return content ? `*${content}*` : \"\";\n }\n\n if (tag === \"s\" || tag === \"del\" || tag === \"strike\") {\n const content = inner();\n return content ? `~~${content}~~` : \"\";\n }\n\n if (tag === \"u\") {\n // No standard Markdown for underline — use HTML passthrough\n const content = inner();\n return content ? `<u>${content}</u>` : \"\";\n }\n\n if (tag === \"code\") {\n // Inline code (not inside pre)\n const content = el.textContent || \"\";\n return content ? `\\`${content}\\`` : \"\";\n }\n\n if (tag === \"a\") {\n const href = el.getAttribute(\"href\") || \"\";\n const content = inner().trim();\n if (!content && !href) {\n return \"\";\n }\n if (!content) {\n return href;\n }\n return `[${content}](${href})`;\n }\n\n if (tag === \"img\") {\n const src = el.getAttribute(\"src\") || \"\";\n const alt = el.getAttribute(\"alt\") || \"\";\n return `![${alt}](${src})`;\n }\n\n // ── Wrapper / Unknown elements → recurse ─────────────────\n return inner();\n}\n\nfunction convertListItem(\n li: HTMLElement,\n ctx: {\n listDepth: number;\n listType: \"ul\" | \"ol\";\n orderedIndex: number;\n isTaskList: boolean;\n }\n): string {\n const indent = \" \".repeat(ctx.listDepth - 1);\n\n // Task list item\n if (ctx.isTaskList) {\n const checked = li.getAttribute(\"data-checked\") === \"true\";\n const checkMark = checked ? \"[x]\" : \"[ ]\";\n const content = Array.from(li.childNodes)\n .map(c => convertNode(c, { listDepth: ctx.listDepth, listType: ctx.listType }))\n .join(\"\")\n .trim();\n return `${indent}- ${checkMark} ${content}`;\n }\n\n // Normal list item\n const bullet = ctx.listType === \"ol\" ? `${ctx.orderedIndex}.` : \"-\";\n\n // Check if li contains nested lists\n const nestedListNodes = Array.from(li.childNodes).filter(\n c =>\n (c as HTMLElement).tagName?.toLowerCase() === \"ul\" ||\n (c as HTMLElement).tagName?.toLowerCase() === \"ol\"\n );\n const textNodes = Array.from(li.childNodes).filter(\n c => ![\"ul\", \"ol\"].includes((c as HTMLElement).tagName?.toLowerCase())\n );\n\n const textContent = textNodes\n .map(c => convertNode(c, { listDepth: ctx.listDepth, listType: ctx.listType }))\n .join(\"\")\n .trim();\n\n const nestedContent = nestedListNodes\n .map(c => convertNode(c, { listDepth: ctx.listDepth, listType: ctx.listType }))\n .join(\"\")\n .trimEnd();\n\n return `${indent}${bullet} ${textContent}${nestedContent}`;\n}\n\nfunction convertTable(table: HTMLElement): string {\n const rows = Array.from(table.querySelectorAll(\"tr\"));\n if (rows.length === 0) {\n return \"\";\n }\n\n const tableData: string[][] = rows.map(row =>\n Array.from(row.querySelectorAll(\"th, td\")).map(\n cell => cell.textContent?.replace(/\\n/g, \" \").trim() || \"\"\n )\n );\n\n if (tableData.length === 0) {\n return \"\";\n }\n\n const colCount = Math.max(...tableData.map(r => r.length));\n\n // Pad rows to same width\n const normalized = tableData.map(row => {\n while (row.length < colCount) {\n row.push(\"\");\n }\n return row;\n });\n\n // Calculate column widths\n const colWidths = Array.from({ length: colCount }, (_, i) =>\n Math.max(...normalized.map(r => (r[i] || \"\").length), 3)\n );\n\n const pad = (str: string, len: number) => str.padEnd(len, \" \");\n const separator = colWidths.map(w => \"-\".repeat(w)).join(\" | \");\n\n // Build rows\n const lines: string[] = [];\n normalized.forEach((row, rowIdx) => {\n const line = row.map((cell, i) => pad(cell, colWidths[i])).join(\" | \");\n lines.push(`| ${line} |`);\n // Add separator after header row (first row)\n if (rowIdx === 0) {\n lines.push(`| ${separator} |`);\n }\n });\n\n return `\\n\\n${lines.join(\"\\n\")}\\n\\n`;\n}\n","import { Injectable } from \"@angular/core\";\nimport { Editor } from \"@tiptap/core\";\nimport { htmlToMarkdown } from \"../utils/ate-markdown.utils\";\n\n/** Supported export formats */\nexport type AteExportFormat = \"html\" | \"markdown\" | \"text\";\n\n/** Export delivery method */\nexport type AteExportMethod = \"clipboard\" | \"download\";\n\n/** Options for file download */\nexport interface AteExportOptions {\n /** Custom filename (without extension). Defaults to \"document\". */\n filename?: string;\n}\n\n@Injectable()\nexport class AteExportService {\n // ============================================================\n // Public Content Getters\n // ============================================================\n\n /** Returns the editor content as HTML string. */\n getHtml(editor: Editor): string {\n return editor.getHTML();\n }\n\n /** Returns the editor content as plain text. */\n getText(editor: Editor): string {\n return editor.getText();\n }\n\n /** Returns the editor content converted to Markdown. */\n getMarkdown(editor: Editor): string {\n const html = editor.getHTML();\n return htmlToMarkdown(html);\n }\n\n /** Returns the editor content in the specified format. */\n getContent(editor: Editor, format: AteExportFormat): string {\n switch (format) {\n case \"html\":\n return this.getHtml(editor);\n case \"markdown\":\n return this.getMarkdown(editor);\n case \"text\":\n return this.getText(editor);\n }\n }\n\n // ============================================================\n // Export Methods\n // ============================================================\n\n /** Copies the editor content to the clipboard. */\n async exportToClipboard(editor: Editor, format: AteExportFormat): Promise<void> {\n const content = this.getContent(editor, format);\n await navigator.clipboard.writeText(content);\n }\n\n /** Downloads the editor content as a file. */\n exportToFile(editor: Editor, format: AteExportFormat, options?: AteExportOptions): void {\n const content = this.getContent(editor, format);\n const baseName = options?.filename || \"document\";\n\n const extensions: Record<AteExportFormat, string> = {\n html: \"html\",\n markdown: \"md\",\n text: \"txt\",\n };\n const mimeTypes: Record<AteExportFormat, string> = {\n html: \"text/html;charset=utf-8\",\n markdown: \"text/markdown;charset=utf-8\",\n text: \"text/plain;charset=utf-8\",\n };\n\n const filename = `${baseName}.${extensions[format]}`;\n const blob = new Blob([content], { type: mimeTypes[format] });\n const url = URL.createObjectURL(blob);\n\n const link = document.createElement(\"a\");\n link.href = url;\n link.download = filename;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\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 { AteExportService, AteExportFormat, AteExportOptions } from \"./ate-export.service\";\nimport { AteEditorStateSnapshot, ATE_INITIAL_EDITOR_STATE } from \"../models/ate-editor-state.model\";\nimport {\n AteImageUploadHandler,\n AteImageSrcResolver,\n AteImageUploadOptions,\n AteImageUploadResult,\n AteImageRejection,\n} 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 exportSvc = inject(AteExportService);\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\n set onImageUploaded(callback: ((result: AteImageUploadResult) => void) | null) {\n this.imageService.onImageUploadedCallback = callback || undefined;\n }\n set onImageRejected(callback: ((rejection: AteImageRejection) => void) | null) {\n this.imageService.onImageRejectedCallback = callback || undefined;\n }\n set uploadHandler(handler: AteImageUploadHandler | null) {\n this.imageService.uploadHandler = handler;\n }\n get srcResolver(): AteImageSrcResolver | null {\n return this.imageService.srcResolver;\n }\n set srcResolver(resolver: AteImageSrcResolver | null) {\n this.imageService.srcResolver = resolver;\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).catch(() => undefined);\n break;\n case \"uploadImage\":\n this.uploadImage(\n editor,\n args[0] as File,\n args[1] as AteImageUploadOptions | undefined\n ).catch(() => 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 case \"exportAs\":\n void this.exportAs(\n editor,\n args[0] as AteExportFormat,\n args[1] as \"clipboard\" | \"download\",\n args[2] as AteExportOptions | undefined\n );\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 // --- Export Commands ---\n\n /**\n * Returns the editor content in the given format.\n * @param format 'html' | 'markdown' | 'text'\n */\n getContent(editor: Editor, format: AteExportFormat): string {\n if (!editor) {\n return \"\";\n }\n return this.exportSvc.getContent(editor, format);\n }\n\n /**\n * Exports the editor content.\n * @param format 'html' | 'markdown' | 'text'\n * @param method 'clipboard' | 'download'\n * @param options Optional filename for download\n */\n async exportAs(\n editor: Editor,\n format: AteExportFormat,\n method: \"clipboard\" | \"download\",\n options?: AteExportOptions\n ): Promise<void> {\n if (!editor) {\n return;\n }\n if (method === \"clipboard\") {\n await this.exportSvc.exportToClipboard(editor, format);\n } else {\n this.exportSvc.exportToFile(editor, format, options);\n }\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 downloadImage(editor: Editor): void {\n this.imageService.downloadImage(editor);\n }\n\n handleImageDrop(editor: Editor, event: DragEvent, options?: AteImageUploadOptions): boolean {\n return this.imageService.handleDrop(editor, event, options);\n }\n\n handleImagePaste(\n editor: Editor,\n event: ClipboardEvent,\n options?: AteImageUploadOptions\n ): boolean {\n return this.imageService.handlePaste(editor, event, options);\n }\n\n rehostImage(file: File, options?: AteImageUploadOptions): Promise<string> {\n return this.imageService.rehostImage(file, options);\n }\n\n get hasUploadHandler(): boolean {\n return this.imageService.uploadHandler !== null;\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 { AteEditorI18n } from \"../../services/ate-editor-i18n.service\";\nimport { AteEditorCommandsService } from \"../../services/ate-editor-commands.service\";\n\nimport { AteTooltipDirective } from \"../../directives/ate-tooltip.directive\";\nimport { AteIconComponent } from \"../ui/ate-icon.component\";\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, AteTooltipDirective, AteIconComponent],\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 [ateTooltip]=\"t().clear\"\n [attr.aria-label]=\"t().clear\"\n (click)=\"onClear($event)\">\n <ate-icon name=\"clear\" />\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 .ate-icon {\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(AteEditorI18n);\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\" ? \"textColor\" : \"highlightColor\";\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 { AteEditorI18n } from \"../../services/ate-editor-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=\"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=\"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=\"underline\"\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=\"strike\"\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=\"codeBlock\"\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=\"heading1\"\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=\"heading2\"\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=\"heading3\"\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=\"bulletList\"\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=\"orderedList\"\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=\"blockquote\"\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=\"alignLeft\"\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=\"alignCenter\"\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=\"alignRight\"\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=\"alignJustify\"\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=\"horizontalRule\"\n [title]=\"t().horizontalRule\"\n [disabled]=\"!state().can.insertHorizontalRule\"\n (buttonClick)=\"onCommand('insertHorizontalRule')\" />\n }\n @if (config().table) {\n <ate-button\n icon=\"table\"\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=\"clearContent\"\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: var(--ate-toolbar-gap);\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 @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(AteEditorI18n);\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 { AteToolbarConfig } from \"../models/ate-toolbar.model\";\nimport {\n AteBubbleMenuConfig,\n AteImageBubbleMenuConfig,\n AteTableBubbleMenuConfig,\n AteCellBubbleMenuConfig,\n} from \"../models/ate-bubble-menu.model\";\nimport { AteImageUploadConfig } from \"../models/ate-image.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 downloadImage: true,\n resizeSmall: true,\n resizeMedium: true,\n resizeLarge: true,\n resizeOriginal: true,\n alignLeft: true,\n alignCenter: true,\n alignRight: 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\n// Default image upload configuration\nexport const ATE_DEFAULT_IMAGE_UPLOAD_CONFIG: AteImageUploadConfig = {\n maxSize: 5, // 5MB\n maxWidth: 1920,\n maxHeight: 1080,\n allowedTypes: [\"image/jpeg\", \"image/png\", \"image/gif\", \"image/webp\"],\n quality: 0.8,\n};\n\nimport { AteEditorConfig } from \"../models/ate-editor-config.model\";\nimport { AtePasteConfig } from \"../models/ate-paste.model\";\n\n/** Default paste settings: everything pasted from other apps is kept */\nexport const ATE_DEFAULT_PASTE_CONFIG: AtePasteConfig = {\n colors: true,\n highlights: true,\n};\n\n/**\n * Ultimate default configuration for the Angular Tiptap Editor.\n * This serves as the 'Level 4' fallback in the configuration hierarchy:\n * 1. Component Inputs (Le Roi)\n * 2. Component [config] (Le Prince)\n * 3. Global provideAteEditor() (Le Duc)\n * 4. ATE_DEFAULT_CONFIG (Le Peuple)\n */\nexport const ATE_DEFAULT_CONFIG: AteEditorConfig = {\n theme: \"auto\",\n mode: \"classic\",\n height: \"auto\",\n minHeight: \"200px\",\n maxHeight: \"none\",\n fillContainer: false,\n autofocus: false,\n editable: true,\n disabled: false,\n spellcheck: true,\n enableOfficePaste: true,\n showToolbar: true,\n showFooter: true,\n showCharacterCount: true,\n showWordCount: true,\n showEditToggle: false,\n showBubbleMenu: true,\n showImageBubbleMenu: true,\n downloadImage: true,\n showTableMenu: true,\n showCellMenu: true,\n enableSlashCommands: true,\n enableBlockShortcuts: true,\n blockControls: \"none\",\n floatingToolbar: false,\n toolbar: ATE_DEFAULT_TOOLBAR_CONFIG,\n bubbleMenu: ATE_DEFAULT_BUBBLE_MENU_CONFIG,\n imageBubbleMenu: ATE_DEFAULT_IMAGE_BUBBLE_MENU_CONFIG,\n imageUpload: ATE_DEFAULT_IMAGE_UPLOAD_CONFIG,\n paste: ATE_DEFAULT_PASTE_CONFIG,\n tableBubbleMenu: ATE_DEFAULT_TABLE_MENU_CONFIG,\n cellBubbleMenu: ATE_DEFAULT_CELL_MENU_CONFIG,\n slashCommands: {},\n tiptapExtensions: [],\n tiptapOptions: {},\n starterKitOptions: {},\n stateCalculators: [],\n angularNodes: [],\n};\n","import {\n Directive,\n input,\n viewChild,\n ElementRef,\n OnDestroy,\n inject,\n effect,\n AfterViewInit,\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 { AteEditorI18n } from \"../../../services/ate-editor-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 AfterViewInit, OnDestroy {\n protected readonly i18nService = inject(AteEditorI18n);\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: ReturnType<typeof setTimeout> | 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 () => {\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 { allowSignalWrites: true }\n );\n }\n\n ngAfterViewInit() {\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 const nativeElement = this.menuRef().nativeElement;\n if (!nativeElement) {\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: nativeElement,\n trigger: \"manual\",\n placement: \"top-start\",\n theme: \"ate-bubble-menu\",\n appendTo: () => (ed?.options?.element as HTMLElement) || 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 as HTMLElement) || document.body,\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 = 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 = typeof window !== \"undefined\" ? window.getSelection() : null;\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 OnDestroy,\n OnInit,\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 { ATE_DEFAULT_BUBBLE_MENU_CONFIG } from \"../../../config/ate-editor.config\";\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=\"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=\"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=\"underline\"\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=\"strike\"\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 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>(ATE_DEFAULT_BUBBLE_MENU_CONFIG);\n\n bubbleMenuConfig = computed(() => ({\n ...ATE_DEFAULT_BUBBLE_MENU_CONFIG,\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 { Editor } from \"@tiptap/core\";\nimport { AteIconKey } from \"../services/ate-icon-registry.service\";\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: AteIconKey;\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 \"downloadImage\",\n \"resizeSmall\",\n \"resizeMedium\",\n \"resizeLarge\",\n \"resizeOriginal\",\n \"alignLeft\",\n \"alignCenter\",\n \"alignRight\",\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 { 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 {\n AteImageBubbleMenuConfig,\n ATE_IMAGE_BUBBLE_MENU_KEYS,\n} from \"../../../models/ate-bubble-menu.model\";\nimport { ATE_DEFAULT_IMAGE_BUBBLE_MENU_CONFIG } from \"../../../config/ate-editor.config\";\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 && editor().isEditable) {\n <ate-button\n icon=\"changeImage\"\n [title]=\"t().changeImage\"\n (buttonClick)=\"onCommand('changeImage', $event)\"></ate-button>\n }\n @if (imageBubbleMenuConfig().downloadImage) {\n <ate-button\n icon=\"downloadImage\"\n [title]=\"t().downloadImage\"\n (buttonClick)=\"onCommand('downloadImage', $event)\"></ate-button>\n }\n @if (imageBubbleMenuConfig().separator && hasResizeButtons() && editor().isEditable) {\n <ate-separator />\n }\n @if (imageBubbleMenuConfig().resizeSmall && editor().isEditable) {\n <ate-button\n icon=\"resizeSmall\"\n iconSize=\"small\"\n [title]=\"t().resizeSmall\"\n (buttonClick)=\"onCommand('resizeSmall', $event)\"></ate-button>\n }\n @if (imageBubbleMenuConfig().resizeMedium && editor().isEditable) {\n <ate-button\n icon=\"resizeMedium\"\n iconSize=\"medium\"\n [title]=\"t().resizeMedium\"\n (buttonClick)=\"onCommand('resizeMedium', $event)\"></ate-button>\n }\n @if (imageBubbleMenuConfig().resizeLarge && editor().isEditable) {\n <ate-button\n icon=\"resizeLarge\"\n iconSize=\"large\"\n [title]=\"t().resizeLarge\"\n (buttonClick)=\"onCommand('resizeLarge', $event)\"></ate-button>\n }\n @if (imageBubbleMenuConfig().resizeOriginal && editor().isEditable) {\n <ate-button\n icon=\"resizeOriginal\"\n [title]=\"t().resizeOriginal\"\n (buttonClick)=\"onCommand('resizeOriginal', $event)\"></ate-button>\n }\n @if (imageBubbleMenuConfig().separator && hasAlignmentButtons() && editor().isEditable) {\n <ate-separator />\n }\n @if (imageBubbleMenuConfig().alignLeft && editor().isEditable) {\n <ate-button\n icon=\"alignLeft\"\n [title]=\"t().alignLeft\"\n [active]=\"editor().isActive({ textAlign: 'left' })\"\n (buttonClick)=\"onCommand('alignLeft', $event)\"></ate-button>\n }\n @if (imageBubbleMenuConfig().alignCenter && editor().isEditable) {\n <ate-button\n icon=\"alignCenter\"\n [title]=\"t().alignCenter\"\n [active]=\"editor().isActive({ textAlign: 'center' })\"\n (buttonClick)=\"onCommand('alignCenter', $event)\"></ate-button>\n }\n @if (imageBubbleMenuConfig().alignRight && editor().isEditable) {\n <ate-button\n icon=\"alignRight\"\n [title]=\"t().alignRight\"\n [active]=\"editor().isActive({ textAlign: 'right' })\"\n (buttonClick)=\"onCommand('alignRight', $event)\"></ate-button>\n }\n\n @if (\n imageBubbleMenuConfig().separator &&\n imageBubbleMenuConfig().deleteImage &&\n editor().isEditable\n ) {\n <ate-separator />\n }\n @if (imageBubbleMenuConfig().deleteImage && editor().isEditable) {\n <ate-button\n icon=\"deleteImage\"\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>(ATE_DEFAULT_IMAGE_BUBBLE_MENU_CONFIG);\n\n imageUpload = input<AteImageUploadOptions>({});\n\n imageBubbleMenuConfig = computed(() => {\n const c = this.config();\n const result: Record<string, boolean> = {};\n ATE_IMAGE_BUBBLE_MENU_KEYS.forEach(key => {\n result[key] = c[key] ?? true;\n });\n return result as Required<AteImageBubbleMenuConfig>;\n });\n\n hasAlignmentButtons = computed(\n () =>\n this.imageBubbleMenuConfig().alignLeft ||\n this.imageBubbleMenuConfig().alignCenter ||\n this.imageBubbleMenuConfig().alignRight\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, selection } = this.state();\n\n if (this.editorCommands.linkEditMode() || this.editorCommands.colorEditMode()) {\n return false;\n }\n\n // In read-only mode, focus reporting can be unreliable,\n // so we show the menu as long as an image is selected.\n if (!isEditable) {\n return nodes.isImage && selection.type === \"node\";\n }\n\n return nodes.isImage && 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 \"downloadImage\":\n this.editorCommands.downloadImage(editor);\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 case \"alignLeft\":\n editor.chain().focus().setTextAlign(\"left\").run();\n break;\n case \"alignCenter\":\n editor.chain().focus().setTextAlign(\"center\").run();\n break;\n case \"alignRight\":\n editor.chain().focus().setTextAlign(\"right\").run();\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, computed } 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 {\n AteTableBubbleMenuConfig,\n ATE_TABLE_BUBBLE_MENU_KEYS,\n} from \"../../../models/ate-bubble-menu.model\";\nimport { ATE_DEFAULT_TABLE_MENU_CONFIG } from \"../../../config/ate-editor.config\";\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 (tableBubbleMenuConfig().addRowBefore !== false) {\n <ate-button\n icon=\"addRowBefore\"\n [title]=\"t().addRowBefore\"\n [disabled]=\"!state().can.addRowBefore\"\n (buttonClick)=\"onCommand('addRowBefore', $event)\"></ate-button>\n }\n @if (tableBubbleMenuConfig().addRowAfter !== false) {\n <ate-button\n icon=\"addRowAfter\"\n [title]=\"t().addRowAfter\"\n [disabled]=\"!state().can.addRowAfter\"\n (buttonClick)=\"onCommand('addRowAfter', $event)\"></ate-button>\n }\n @if (tableBubbleMenuConfig().deleteRow !== false) {\n <ate-button\n icon=\"deleteRow\"\n [title]=\"t().deleteRow\"\n variant=\"danger\"\n [disabled]=\"!state().can.deleteRow\"\n (buttonClick)=\"onCommand('deleteRow', $event)\"></ate-button>\n }\n @if (tableBubbleMenuConfig().separator !== false) {\n <ate-separator />\n }\n\n <!-- Column actions -->\n @if (tableBubbleMenuConfig().addColumnBefore !== false) {\n <ate-button\n icon=\"addColumnBefore\"\n [title]=\"t().addColumnBefore\"\n [disabled]=\"!state().can.addColumnBefore\"\n (buttonClick)=\"onCommand('addColumnBefore', $event)\"></ate-button>\n }\n @if (tableBubbleMenuConfig().addColumnAfter !== false) {\n <ate-button\n icon=\"addColumnAfter\"\n [title]=\"t().addColumnAfter\"\n [disabled]=\"!state().can.addColumnAfter\"\n (buttonClick)=\"onCommand('addColumnAfter', $event)\"></ate-button>\n }\n @if (tableBubbleMenuConfig().deleteColumn !== false) {\n <ate-button\n icon=\"deleteColumn\"\n [title]=\"t().deleteColumn\"\n variant=\"danger\"\n [disabled]=\"!state().can.deleteColumn\"\n (buttonClick)=\"onCommand('deleteColumn', $event)\"></ate-button>\n }\n @if (tableBubbleMenuConfig().separator !== false) {\n <ate-separator />\n }\n\n <!-- Cell actions -->\n @if (tableBubbleMenuConfig().toggleHeaderRow !== false) {\n <ate-button\n icon=\"toggleHeaderRow\"\n [title]=\"t().toggleHeaderRow\"\n [active]=\"state().nodes.isTableHeaderRow\"\n [disabled]=\"!state().can.toggleHeaderRow\"\n (buttonClick)=\"onCommand('toggleHeaderRow', $event)\"></ate-button>\n }\n @if (tableBubbleMenuConfig().toggleHeaderColumn !== false) {\n <ate-button\n icon=\"toggleHeaderColumn\"\n [title]=\"t().toggleHeaderColumn\"\n [active]=\"state().nodes.isTableHeaderColumn\"\n [disabled]=\"!state().can.toggleHeaderColumn\"\n (buttonClick)=\"onCommand('toggleHeaderColumn', $event)\"></ate-button>\n }\n @if (\n tableBubbleMenuConfig().separator !== false && tableBubbleMenuConfig().deleteTable !== false\n ) {\n <ate-separator />\n }\n\n <!-- Table actions -->\n @if (tableBubbleMenuConfig().deleteTable !== false) {\n <ate-button\n icon=\"deleteTable\"\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>(ATE_DEFAULT_TABLE_MENU_CONFIG);\n\n tableBubbleMenuConfig = computed(() => {\n const c = this.config();\n const result: Record<string, boolean> = {};\n ATE_TABLE_BUBBLE_MENU_KEYS.forEach(key => {\n result[key] = c[key] ?? true;\n });\n return result as Required<AteTableBubbleMenuConfig>;\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\n ? dom.closest(\"table\")\n : (dom.parentElement as HTMLElement)?.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 as 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, computed } 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\";\nimport { ATE_DEFAULT_CELL_MENU_CONFIG } from \"../../../config/ate-editor.config\";\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 (cellBubbleMenuConfig().mergeCells !== false && !state().selection.isSingleCell) {\n <ate-button\n icon=\"mergeCells\"\n [title]=\"i18n().table().mergeCells\"\n [disabled]=\"!state().can.mergeCells\"\n (buttonClick)=\"onCommand('mergeCells', $event)\"></ate-button>\n }\n @if (cellBubbleMenuConfig().splitCell !== false && state().selection.isSingleCell) {\n <ate-button\n icon=\"splitCell\"\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>(ATE_DEFAULT_CELL_MENU_CONFIG);\n\n cellBubbleMenuConfig = computed(() => ({\n mergeCells: this.config().mergeCells ?? true,\n splitCell: this.config().splitCell ?? true,\n }));\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 OnDestroy,\n inject,\n effect,\n AfterViewInit,\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 { AteEditorI18n } from \"../../../services/ate-editor-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 AfterViewInit, OnDestroy {\n protected readonly i18nService = inject(AteEditorI18n);\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: ReturnType<typeof setTimeout> | 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 () => {\n // Monitor editor state and specific sub-menu states\n this.state();\n this.onStateChange();\n\n this.updateMenu();\n },\n { allowSignalWrites: true }\n );\n }\n\n ngAfterViewInit() {\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 const nativeElement = this.menuRef().nativeElement;\n if (!nativeElement) {\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: nativeElement,\n trigger: \"manual\",\n placement: \"bottom-start\",\n theme: \"ate-bubble-menu\",\n appendTo: () => (ed?.options?.element as HTMLElement) || document.body,\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: {\n boundary: (ed?.options?.element as HTMLElement) || document.body,\n padding: 8,\n },\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 untracked,\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 { AteIconComponent } from \"../../ui/ate-icon.component\";\nimport { AteBaseSubBubbleMenu } from \"../base/ate-base-sub-bubble-menu\";\n\n/** Frames to wait for the menu to become visible before giving up on focusing the URL field */\nconst FOCUS_MAX_ATTEMPTS = 20;\n\n@Component({\n selector: \"ate-link-bubble-menu\",\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AteButtonComponent, AteSeparatorComponent, AteIconComponent, 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 <ate-icon class=\"icon-link\" name=\"link\" />\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=\"apply\"\n [title]=\"common().apply\"\n color=\"var(--ate-primary)\"\n [disabled]=\"!editUrl().trim()\"\n (buttonClick)=\"onApply($event)\"></ate-button>\n <ate-button\n icon=\"openLink\"\n [title]=\"t().openLink\"\n [disabled]=\"!currentUrl()\"\n (buttonClick)=\"onOpenLink($event)\"></ate-button>\n <ate-separator />\n <ate-button\n icon=\"unsetLink\"\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 () => {\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 { allowSignalWrites: true }\n );\n\n // Move focus to the URL field whenever link editing starts (toolbar, bubble menu or Mod+K)\n effect(() => {\n if (this.linkSvc.editMode()) {\n untracked(() => this.focusInputWhenVisible());\n }\n });\n }\n\n private focusInputWhenVisible(attempt = 0) {\n requestAnimationFrame(() => {\n const input = this.linkInput()?.nativeElement;\n if (!input || !this.linkSvc.editMode()) {\n return;\n }\n input.focus();\n if (document.activeElement !== input && attempt < FOCUS_MAX_ATTEMPTS) {\n this.focusInputWhenVisible(attempt + 1);\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 as 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 = typeof window !== \"undefined\" ? window.getSelection() : null;\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=\"customColor\"\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=\"apply\"\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=\"unsetColor\"\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 private findColoredElementInContent(start: Element | null, contentRoot: Element): Element | null {\n let current = start;\n while (current && current !== contentRoot && contentRoot.contains(current)) {\n if (current.matches('[style*=\"color\"], [style*=\"background\"], mark')) {\n return current;\n }\n current = current.parentElement;\n }\n return null;\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 = this.findColoredElementInContent(element, ed.view.dom);\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 = typeof window !== \"undefined\" ? window.getSelection() : null;\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 \"../models/ate-slash-command.model\";\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 \"tableOfContents\",\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 tableOfContents: false,\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: Pick<AteI18nService, \"slashCommands\">,\n commands: AteEditorCommandsService,\n imageOptions?: {\n quality?: number;\n maxWidth?: number;\n maxHeight?: number;\n maxSize?: 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: \"heading1\",\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: \"heading2\",\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: \"heading3\",\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: \"bulletList\",\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: \"orderedList\",\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: \"blockquote\",\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: \"codeBlock\",\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 maxSize: imageOptions?.maxSize,\n allowedTypes: imageOptions?.allowedTypes,\n }),\n },\n {\n title: t.horizontalRule.title,\n description: t.horizontalRule.description,\n icon: \"horizontalRule\",\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\",\n keywords: t.table.keywords,\n command: (editor: Editor) => commands.insertTable(editor),\n },\n {\n title: t.tableOfContents.title,\n description: t.tableOfContents.description,\n icon: \"tableOfContents\",\n keywords: t.tableOfContents.keywords,\n command: (editor: Editor) =>\n editor.chain().focus().insertContent({ type: \"tableOfContents\" }).run(),\n },\n ];\n}\n\n/**\n * Filtre et assemble les commandes selon la configuration fournie.\n */\nexport function filterSlashCommands(\n config: AteSlashCommandsConfig,\n i18n: Pick<AteI18nService, \"slashCommands\">,\n commands: AteEditorCommandsService,\n imageOptions?: {\n quality?: number;\n maxWidth?: number;\n maxHeight?: number;\n maxSize?: 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 OnDestroy,\n effect,\n computed,\n inject,\n signal,\n ChangeDetectionStrategy,\n AfterViewInit,\n} from \"@angular/core\";\nimport tippy, { Instance as TippyInstance, sticky } from \"tippy.js\";\nimport { Editor } from \"@tiptap/core\";\nimport { AteEditorI18n } from \"../../services/ate-editor-i18n.service\";\nimport { AteEditorCommandsService } from \"../../services/ate-editor-commands.service\";\nimport { createDefaultSlashCommands } from \"../../config/ate-slash-commands.config\";\nimport { AteSlashCommandItem, AteCustomSlashCommands } from \"../../models/ate-slash-command.model\";\nimport { Plugin, PluginKey } from \"@tiptap/pm/state\";\nimport { EditorView, Decoration, DecorationSet } from \"@tiptap/pm/view\";\nimport { AteIconComponent } from \"../ui/ate-icon.component\";\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 imports: [AteIconComponent],\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 <ate-icon [name]=\"command.icon\" />\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 .ate-icon {\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 AfterViewInit, OnDestroy {\n readonly i18nService = inject(AteEditorI18n);\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 filterPlaceholderText = computed(() => {\n return this.i18nService.slashCommands().filterPlaceholder || \"Filter...\";\n });\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 () => {\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 { allowSignalWrites: true }\n );\n }\n\n ngAfterViewInit() {\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 const nativeElement = this.menuRef().nativeElement;\n if (!nativeElement) {\n return;\n }\n\n if (this.tippyInstance) {\n this.tippyInstance.destroy();\n }\n\n this.tippyInstance = tippy(document.body, {\n content: nativeElement,\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 as HTMLElement).closest(\n \"angular-tiptap-editor\"\n );\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 as HTMLElement) || document.body,\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 = typeof window !== \"undefined\" ? window.getSelection() : null;\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 decorations: state => {\n const { from } = state.selection;\n const textBefore = state.doc.textBetween(Math.max(0, from - 20), from, \"\\n\");\n const slashMatch = textBefore.match(/(?:^|\\s)\\/([^/\\s]*)$/);\n\n if (!slashMatch) {\n return DecorationSet.empty;\n }\n\n const slashPos = from - slashMatch[0].length + slashMatch[0].indexOf(\"/\");\n const query = slashMatch[1] || \"\";\n const isEmpty = !query;\n const placeholder = this.filterPlaceholderText();\n const decorationId = `id_${slashPos}_${from}`;\n\n return DecorationSet.create(state.doc, [\n Decoration.inline(slashPos, from, {\n \"data-decoration-id\": decorationId,\n \"data-decoration-content\": placeholder,\n class: `ate-slash-decoration ${isEmpty ? \"is-empty\" : \"\"}`,\n }),\n ]);\n },\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 {\n Component,\n input,\n viewChild,\n ElementRef,\n OnDestroy,\n effect,\n signal,\n inject,\n ChangeDetectionStrategy,\n AfterViewInit,\n} from \"@angular/core\";\nimport tippy, { Instance as TippyInstance, sticky } from \"tippy.js\";\nimport { Editor } from \"@tiptap/core\";\nimport { Node as PMNode } from \"@tiptap/pm/model\";\nimport { AteEditorI18n } from \"../../services/ate-editor-i18n.service\";\nimport { AteTooltipDirective } from \"../../directives/ate-tooltip.directive\";\nimport { AteIconComponent } from \"../ui/ate-icon.component\";\n\n/**\n * Component providing Notion-like block controls (Plus button and Drag Handle).\n */\n@Component({\n selector: \"ate-block-controls\",\n standalone: true,\n imports: [AteTooltipDirective, AteIconComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div\n #menuRef\n class=\"ate-block-controls\"\n (mouseenter)=\"onMouseEnter()\"\n (mouseleave)=\"onMouseLeave()\"\n (mousedown)=\"onContainerMouseDown($event)\">\n <button\n class=\"ate-control-btn ate-block-add\"\n (mousedown)=\"onButtonMouseDown($event)\"\n (click)=\"addBlock($event)\"\n [ateTooltip]=\"i18n.editor().blockAdd\"\n ateTooltipPlacement=\"top\">\n <ate-icon name=\"blockAdd\" />\n </button>\n <div\n class=\"ate-control-btn ate-block-drag\"\n draggable=\"true\"\n (mousedown)=\"onDragHandleMouseDown($event)\"\n (dragstart)=\"onDragStart($event)\"\n (dragend)=\"onDragEnd()\"\n [ateTooltip]=\"i18n.editor().blockDrag\"\n ateTooltipPlacement=\"top\">\n <ate-icon name=\"blockDrag\" />\n </div>\n </div>\n `,\n styles: [\n `\n .ate-block-controls {\n display: flex;\n align-items: center;\n gap: 2px;\n padding: 4px;\n pointer-events: auto;\n will-change: transform;\n }\n\n .ate-control-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n border-radius: 4px;\n border: none;\n background: transparent;\n color: var(--ate-text-secondary);\n cursor: pointer;\n transition: all 0.15s ease;\n }\n\n .ate-control-btn:hover {\n background: var(--ate-surface-tertiary);\n color: var(--ate-text);\n }\n\n .ate-control-btn .ate-icon {\n font-size: 18px;\n }\n\n @media (max-width: 768px) {\n :host {\n display: none !important;\n }\n }\n `,\n ],\n})\nexport class AteBlockControlsComponent implements AfterViewInit, OnDestroy {\n protected readonly i18n = inject(AteEditorI18n);\n\n editor = input.required<Editor>();\n hoveredData = input<{ node: PMNode; element: HTMLElement; pos: number } | null>(null);\n\n menuRef = viewChild.required<ElementRef<HTMLDivElement>>(\"menuRef\");\n\n protected isInteracting = signal(false);\n private lastValidData: { node: PMNode; element: HTMLElement; pos: number } | null = null;\n private lastValidRect: DOMRect | null = null;\n private tippyInstance: TippyInstance | null = null;\n private updateTimeout: ReturnType<typeof setTimeout> | null = null;\n\n constructor() {\n effect(() => {\n const data = this.hoveredData();\n const interacting = this.isInteracting();\n\n if (data) {\n this.lastValidData = data;\n this.lastValidRect = data.element.getBoundingClientRect();\n }\n\n this.updateMenu(!!data || interacting);\n });\n }\n\n ngAfterViewInit() {\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 private initTippy() {\n const nativeElement = this.menuRef().nativeElement;\n if (!nativeElement) {\n return;\n }\n\n this.tippyInstance = tippy(document.body, {\n content: nativeElement,\n trigger: \"manual\",\n placement: \"left\",\n theme: \"ate-block-controls\",\n appendTo: () => (this.editor()?.options?.element as HTMLElement) || document.body,\n interactive: true,\n hideOnClick: false,\n arrow: false,\n offset: [0, 8],\n zIndex: 99,\n plugins: [sticky],\n sticky: \"reference\",\n moveTransition: \"transform 0.2s ease-out\",\n getReferenceClientRect: () => this.getSelectionRect(),\n popperOptions: {\n modifiers: [\n {\n name: \"preventOverflow\",\n options: {\n boundary: (this.editor()?.options?.element as HTMLElement) || document.body,\n padding: 8,\n },\n },\n ],\n },\n });\n }\n\n private updateMenu(show: boolean) {\n if (this.updateTimeout) {\n clearTimeout(this.updateTimeout);\n }\n const delay = show ? 0 : 400;\n this.updateTimeout = setTimeout(() => {\n if (show) {\n this.showTippy();\n } else {\n this.hideTippy();\n }\n }, delay);\n }\n\n private showTippy() {\n if (this.tippyInstance) {\n this.tippyInstance.setProps({\n getReferenceClientRect: () => this.getSelectionRect(),\n });\n this.tippyInstance.show();\n }\n }\n\n private hideTippy() {\n if (this.tippyInstance) {\n this.tippyInstance.hide();\n }\n }\n\n private getSelectionRect(): DOMRect {\n const data = this.hoveredData();\n if (data && data.element) {\n return data.element.getBoundingClientRect();\n }\n return this.lastValidRect || new DOMRect(-9999, -9999, 0, 0);\n }\n\n onMouseEnter() {\n this.isInteracting.set(true);\n }\n\n onMouseLeave() {\n this.isInteracting.set(false);\n }\n\n onContainerMouseDown(event: MouseEvent) {\n if (event.target === event.currentTarget) {\n event.preventDefault();\n }\n }\n\n onButtonMouseDown(event: MouseEvent) {\n event.preventDefault();\n }\n\n /**\n * Selection strategy to avoid partial node dragging (ghost table issue).\n */\n onDragHandleMouseDown(event: MouseEvent) {\n event.stopPropagation();\n const ed = this.editor();\n const data = this.hoveredData() || this.lastValidData;\n if (ed && data) {\n // Force whole-node selection. This is crucial for atomic nodes like tables and images.\n ed.commands.setNodeSelection(data.pos);\n }\n }\n\n addBlock(event: MouseEvent) {\n event.stopPropagation();\n const ed = this.editor();\n const data = this.hoveredData() || this.lastValidData;\n if (!ed || !data) {\n return;\n }\n\n const { pos, node } = data;\n if (node.content.size === 0) {\n ed.chain()\n .focus()\n .setTextSelection(pos + 1)\n .insertContent(\"/\")\n .run();\n } else {\n const nextPos = pos + node.nodeSize;\n ed.chain()\n .focus()\n .insertContentAt(nextPos, { type: \"paragraph\", content: [{ type: \"text\", text: \"/\" }] })\n .setTextSelection(nextPos + 2)\n .run();\n }\n\n this.isInteracting.set(false);\n this.hideTippy();\n }\n\n onDragStart(event: DragEvent) {\n const ed = this.editor();\n const data = this.hoveredData() || this.lastValidData;\n if (!ed || !data || !event.dataTransfer) {\n return;\n }\n\n const { element, pos } = data;\n const view = ed.view;\n\n // 1. Force the editor to focus and select the ENTIRE node\n view.focus();\n ed.commands.setNodeSelection(pos);\n\n // 2. Browser Drag Image & metadata\n event.dataTransfer.setDragImage(element, 0, 10);\n event.dataTransfer.effectAllowed = \"move\";\n event.dataTransfer.setData(\"text/plain\", \"\");\n\n // 3. PRO-HACK: Indicate this is a move of the current selection (the whole node)\n (view as unknown as { dragging: unknown }).dragging = {\n slice: ed.state.selection.content(),\n move: true,\n };\n\n // 4. Dispatch virtual dragstart\n const pmEvent = new DragEvent(\"dragstart\", {\n dataTransfer: event.dataTransfer,\n bubbles: true,\n cancelable: true,\n });\n element.dispatchEvent(pmEvent);\n\n // 5. Cleanup UI\n setTimeout(() => {\n this.hideTippy();\n this.isInteracting.set(false);\n }, 0);\n }\n\n onDragEnd() {\n this.isInteracting.set(false);\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 \"../../i18n/ateTranslationsModel\";\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() ? 'preview' : '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 { InjectionToken } from \"@angular/core\";\nimport { AteEditorConfig } from \"../models/ate-editor-config.model\";\n\n/**\n * Injection Token for global editor configuration.\n */\nexport const ATE_GLOBAL_CONFIG = new InjectionToken<AteEditorConfig>(\"ATE_GLOBAL_CONFIG\");\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 { Extension } from \"@tiptap/core\";\nimport { Plugin, PluginKey } from \"@tiptap/pm/state\";\nimport { EditorView } from \"@tiptap/pm/view\";\nimport { Node } from \"@tiptap/pm/model\";\n\nexport interface AteBlockControlsOptions {\n onHover?: (data: { node: Node; element: HTMLElement; pos: number } | null) => void;\n}\n\n// Helper to get the DOM element properly\nfunction getDomElement(view: EditorView, pos: number): HTMLElement | null {\n const dom = view.nodeDOM(pos);\n if (!dom) {\n return null;\n }\n if (dom instanceof HTMLElement) {\n return dom;\n }\n return dom.parentElement;\n}\n\n// VERTICAL SCAN (For the empty margin)\nfunction findBlockElementAtY(view: EditorView, y: number): HTMLElement | null {\n const editorDom = view.dom as HTMLElement;\n const children = Array.from(editorDom.children) as HTMLElement[];\n\n // We look for the direct child of the editor (Level 1) that intercepts the Y line\n return (\n children.find(child => {\n if (getComputedStyle(child).position === \"absolute\") {\n return false;\n }\n const rect = child.getBoundingClientRect();\n // Tolérance de 5px\n return y >= rect.top - 5 && y <= rect.bottom + 5;\n }) || null\n );\n}\n\nfunction resolveBlockData(\n view: EditorView,\n y: number,\n targetElement: HTMLElement | null\n): { node: Node; element: HTMLElement; pos: number } | null {\n let blockEl: HTMLElement | null = null;\n\n // 1. FAST PATH : Direct target\n // LEVEL 1: We look for the first parent element that is a direct child of the editor\n if (targetElement && !targetElement.classList.contains(\"ProseMirror\")) {\n blockEl = targetElement.closest(\".ProseMirror > *\") as HTMLElement;\n }\n\n // 2. GUTTER PATH : Vertical scan\n if (!blockEl) {\n blockEl = findBlockElementAtY(view, y);\n }\n\n if (!blockEl) {\n return null;\n }\n\n // 3. PROSEMIRROR NODE RESOLUTION\n try {\n // We ask for the position at the beginning of this root block\n const pos = view.posAtDOM(blockEl, 0);\n const $pos = view.state.doc.resolve(pos);\n\n // CASE A : STANDARD BLOCKS (H1, P, Lists, Blockquotes...)\n // We make sure to take the node of depth 1 (Direct child of the Doc)\n if ($pos.depth >= 1) {\n const rootNode = $pos.node(1);\n const rootPos = $pos.before(1);\n const rootElement = getDomElement(view, rootPos);\n\n // Sécurité : on vérifie que l'élément DOM correspond bien\n if (rootNode && (rootElement || blockEl)) {\n return { node: rootNode, element: rootElement || blockEl, pos: rootPos };\n }\n }\n\n // CASE B : IMAGES / ATOMS (Depth 0)\n // Sometimes a root image is seen as Depth 0 by resolve()\n // We look at the node right after the position\n if ($pos.depth === 0) {\n const nodeAfter = $pos.nodeAfter;\n if (nodeAfter && (nodeAfter.isBlock || nodeAfter.isAtom)) {\n return { node: nodeAfter, element: blockEl, pos: pos };\n }\n }\n } catch (_e) {\n // console.warn(_e);\n }\n\n return null;\n}\n\nexport const AteBlockControlsExtension = Extension.create<AteBlockControlsOptions>({\n name: \"ateBlockControls\",\n\n addOptions() {\n return { onHover: undefined };\n },\n\n addProseMirrorPlugins() {\n let lastHoveredElement: HTMLElement | null = null;\n let lastHoveredPos: number | null = null;\n let rafId: number | null = null;\n let lastMouseX = 0;\n let lastMouseY = 0;\n\n const update = (view: EditorView) => {\n if (!this.editor.isEditable) {\n return;\n }\n\n const editorRect = view.dom.getBoundingClientRect();\n const gutterWidth = 80;\n\n // Check Limites (Marge Gauche + Editeur)\n if (\n lastMouseY < editorRect.top ||\n lastMouseY > editorRect.bottom ||\n lastMouseX > editorRect.right ||\n lastMouseX < editorRect.left - gutterWidth\n ) {\n if (lastHoveredElement) {\n reset();\n }\n return;\n }\n\n // STICKY ANTI-FLICKER\n // On garde le bloc tant qu'on est dans sa hauteur\n if (lastHoveredElement && lastHoveredElement.isConnected) {\n const rect = lastHoveredElement.getBoundingClientRect();\n if (lastMouseY >= rect.top && lastMouseY <= rect.bottom) {\n return;\n }\n }\n\n const target = document.elementFromPoint(lastMouseX, lastMouseY) as HTMLElement;\n\n const data = resolveBlockData(view, lastMouseY, target);\n\n if (data && (data.element !== lastHoveredElement || data.pos !== lastHoveredPos)) {\n lastHoveredElement = data.element;\n lastHoveredPos = data.pos;\n this.options.onHover?.(data);\n } else if (!data) {\n if (!lastHoveredElement || !lastHoveredElement.isConnected) {\n reset();\n }\n }\n };\n\n const reset = () => {\n this.options.onHover?.(null);\n lastHoveredElement = null;\n lastHoveredPos = null;\n };\n\n return [\n new Plugin({\n key: new PluginKey(\"ateBlockControls\"),\n props: {\n handleDOMEvents: {\n mousemove: (view: EditorView, event: MouseEvent) => {\n lastMouseX = event.clientX;\n lastMouseY = event.clientY;\n\n if (rafId === null) {\n rafId = requestAnimationFrame(() => {\n update(view);\n rafId = null;\n });\n }\n return false;\n },\n mouseleave: () => {\n if (rafId) {\n cancelAnimationFrame(rafId);\n rafId = null;\n }\n reset();\n return false;\n },\n },\n },\n }),\n ];\n },\n});\n","export function shallowArrayEqual<T>(a: readonly T[], b: readonly T[]): boolean {\n return a === b || (a.length === b.length && a.every((item, i) => item === b[i]));\n}\n\nexport function shallowObjectEqual<T extends object>(a: T, b: T): boolean {\n if (a === b) {\n return true;\n }\n const aKeys = Object.keys(a);\n const bKeys = Object.keys(b);\n return (\n aKeys.length === bKeys.length &&\n aKeys.every(\n key =>\n Object.prototype.hasOwnProperty.call(b, key) &&\n (a as Record<string, unknown>)[key] === (b as Record<string, unknown>)[key]\n )\n );\n}\n","import type { Extension, Mark, Node } from \"@tiptap/core\";\nimport type { StarterKitOptions } from \"@tiptap/starter-kit\";\n\n/**\n * Maps the runtime `.name` of each extension bundled in `@tiptap/starter-kit`\n * to its corresponding option key in `StarterKitOptions`.\n */\nexport const STARTER_KIT_NAME_TO_OPTION: Readonly<Record<string, keyof StarterKitOptions>> = {\n blockquote: \"blockquote\",\n bold: \"bold\",\n bulletList: \"bulletList\",\n code: \"code\",\n codeBlock: \"codeBlock\",\n doc: \"document\",\n dropCursor: \"dropcursor\",\n gapCursor: \"gapcursor\",\n hardBreak: \"hardBreak\",\n heading: \"heading\",\n undoRedo: \"undoRedo\",\n horizontalRule: \"horizontalRule\",\n italic: \"italic\",\n listItem: \"listItem\",\n listKeymap: \"listKeymap\",\n link: \"link\",\n orderedList: \"orderedList\",\n paragraph: \"paragraph\",\n strike: \"strike\",\n text: \"text\",\n underline: \"underline\",\n trailingNode: \"trailingNode\",\n};\n\n/**\n * Describes which parts of Angular Tiptap Editor's UI or state calculators\n * depend on a given built-in or StarterKit extension name.\n */\nexport const ATE_BUILTIN_UI_DEPENDENCIES: Readonly<Record<string, string>> = {\n blockquote: \"toolbar/slash menu blockquote buttons, AteStructureCalculator\",\n bold: \"toolbar/bubble menu bold buttons, AteMarksCalculator\",\n bulletList: \"toolbar/slash menu bullet list buttons, AteStructureCalculator\",\n code: \"toolbar/bubble menu inline code buttons, AteMarksCalculator\",\n codeBlock: \"toolbar/slash menu code block buttons, AteStructureCalculator\",\n doc: \"top-level ProseMirror document schema\",\n dropCursor: \"drag-and-drop cursor indicator\",\n gapCursor: \"gap cursor navigation around leaf block nodes\",\n hardBreak: \"Shift+Enter line break shortcut\",\n heading:\n \"toolbar/bubble menu/slash menu heading controls, table of contents, AteStructureCalculator\",\n undoRedo: \"toolbar undo/redo buttons, AteStructureCalculator\",\n horizontalRule: \"toolbar/slash menu horizontal rule buttons\",\n italic: \"toolbar/bubble menu italic buttons, AteMarksCalculator\",\n listItem: \"bullet/ordered list items, block shortcuts\",\n listKeymap: \"list backspace/delete keyboard navigation\",\n link: \"toolbar/bubble menu link editor, Mod+K shortcut, AteMarksCalculator\",\n orderedList: \"toolbar/slash menu ordered list buttons, AteStructureCalculator\",\n paragraph: \"default text block node, AteStructureCalculator\",\n strike: \"toolbar/bubble menu strikethrough buttons, AteMarksCalculator\",\n text: \"core inline text node\",\n underline: \"toolbar/bubble menu underline buttons, AteMarksCalculator\",\n trailingNode: \"automatic trailing paragraph after block nodes\",\n textStyle: \"color picker, AteMarksCalculator\",\n color: \"toolbar/bubble menu text color picker, AteMarksCalculator\",\n placeholder: \"empty editor placeholder decoration\",\n superscript: \"toolbar/bubble menu superscript buttons, AteMarksCalculator\",\n subscript: \"toolbar/bubble menu subscript buttons, AteMarksCalculator\",\n textAlign: \"toolbar/image bubble menu alignment buttons, AteStructureCalculator\",\n ateLinkClickBehavior: \"read-only and Ctrl+click link navigation\",\n ateBlockShortcuts: \"Mod+D and Mod+Shift+ArrowUp/Down block shortcuts\",\n ateLinkShortcut: \"Mod+K link editor shortcut\",\n highlight: \"toolbar/bubble menu highlight picker, AteMarksCalculator\",\n resizableImage:\n \"image node view, image bubble menu, image upload/resize service, AteImageCalculator\",\n atePaste: \"paste settings (`paste` input / config): format filters and `transformHTML`\",\n atePasteSourceTracker:\n \"paste source detection (`editor` / `office` / `external`) for the `paste` settings\",\n atePastedImage: \"pasted HTML image sanitization and base64 re-hosting\",\n ateUploadProgress: \"image upload progress overlay\",\n tableExtension: \"toolbar/slash menu table insertion, table/cell bubble menus, AteTableCalculator\",\n tableOfContents: \"slash menu table of contents node, AteTableOfContentsComponent\",\n tiptapState: \"reactive editor state engine (toolbar, bubble menus, footer)\",\n blockControls: \"block plus button and drag handle\",\n officePaste: \"Word/Excel paste normalization\",\n characterCount: \"footer character/word counters and maxCharacters limit\",\n};\n\nexport function getExtensionName(ext: Extension | Node | Mark): string | undefined {\n return (ext as { name?: string })?.name;\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 booleanAttribute,\n isDevMode,\n} from \"@angular/core\";\n\nfunction transformBooleanInput(val: unknown): boolean | undefined {\n if (val === undefined || val === null) {\n return undefined;\n }\n return booleanAttribute(val);\n}\nimport { takeUntilDestroyed } from \"@angular/core/rxjs-interop\";\nimport { Editor, EditorOptions, Extension, Node, Mark, JSONContent } from \"@tiptap/core\";\nimport StarterKit, { type StarterKitOptions } from \"@tiptap/starter-kit\";\nimport { Placeholder, CharacterCount } from \"@tiptap/extensions\";\nimport { Superscript } from \"@tiptap/extension-superscript\";\nimport { Subscript } from \"@tiptap/extension-subscript\";\nimport { TextAlign } from \"@tiptap/extension-text-align\";\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\";\nimport { Node as PMNode } from \"@tiptap/pm/model\";\n\nimport { AteResizableImage } from \"../../extensions/ate-resizable-image.extension\";\nimport { AteIconRegistry } from \"../../services/ate-icon-registry.service\";\nimport { AteUploadProgress } from \"../../extensions/ate-upload-progress.extension\";\nimport { AtePastedImage } from \"../../extensions/ate-pasted-image.extension\";\nimport { AteLinkShortcut } from \"../../extensions/ate-link-shortcut.extension\";\nimport { AteBlockShortcuts } from \"../../extensions/ate-block-shortcuts.extension\";\nimport { AtePaste } from \"../../extensions/ate-paste.extension\";\nimport { AteTableExtension } from \"../../extensions/ate-table.extension\";\nimport { AteTocNodeOptions } from \"../table-of-contents/ate-toc-node.component\";\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 { AteSlashCommandsComponent } from \"../slash-commands/ate-slash-commands.component\";\nimport { AteBlockControlsComponent } from \"./ate-block-controls.component\";\nimport { AteCustomSlashCommands } from \"../../models/ate-slash-command.model\";\nimport { AteEditToggleComponent } from \"../edit-toggle/ate-edit-toggle.component\";\nimport { AteImageService } from \"../../services/ate-image.service\";\nimport { AteI18nService } from \"../../services/ate-i18n.service\";\nimport { AteEditorI18n } from \"../../services/ate-editor-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 { AteExportService } from \"../../services/ate-export.service\";\nimport { AteEditorRegistry } from \"../../services/ate-editor-registry.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\";\nimport { registerAngularComponent } from \"../../node-view/ate-register-angular-component\";\nimport { RegisterAngularComponentOptions } from \"../../node-view/ate-node-view.models\";\nimport { ATE_GLOBAL_CONFIG } from \"../../config/ate-global-config.token\";\nimport { Type, Injector } from \"@angular/core\";\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 {\n AteEditorConfig,\n AteAngularNode,\n AteBlockControlsMode,\n AteAutofocusMode,\n} from \"../../models/ate-editor-config.model\";\nimport { AteLinkClickBehavior } from \"../../extensions/ate-link-click-behavior.extension\";\nimport { AteBlockControlsExtension } from \"../../extensions/ate-block-controls.extension\";\nimport {\n ATE_DEFAULT_TOOLBAR_CONFIG,\n ATE_DEFAULT_BUBBLE_MENU_CONFIG,\n ATE_DEFAULT_IMAGE_BUBBLE_MENU_CONFIG,\n ATE_DEFAULT_IMAGE_UPLOAD_CONFIG,\n ATE_DEFAULT_PASTE_CONFIG,\n ATE_DEFAULT_TABLE_MENU_CONFIG,\n ATE_DEFAULT_CELL_MENU_CONFIG,\n ATE_DEFAULT_CONFIG,\n} from \"../../config/ate-editor.config\";\nimport { concat, defer, Observable, of, tap } from \"rxjs\";\nimport {\n AteImageUploadHandler,\n AteImageSrcResolver,\n AteImageUploadOptions,\n AteImageUploadResult,\n AteImageRejection,\n AtePastedImageRejection,\n} from \"../../models/ate-image.model\";\nimport { AtePasteConfig } from \"../../models/ate-paste.model\";\nimport { SupportedLocale } from \"../../i18n/ateTranslationsModel\";\nimport { shallowArrayEqual, shallowObjectEqual } from \"../../utils/ate-equality.utils\";\nimport {\n ATE_BUILTIN_UI_DEPENDENCIES,\n STARTER_KIT_NAME_TO_OPTION,\n getExtensionName,\n} from \"../../utils/ate-extensions.utils\";\n\n// Slash commands configuration is handled dynamically via slashCommandsConfigComputed\n\n/**\n * The main rich-text editor component for Angular.\n *\n * Powered by Tiptap and built with a native Signal-based architecture, it provides\n * a seamless, high-performance editing experience. Supports automatic registration\n * of Angular components as interactive nodes ('Angular Nodes'), full Reactive Forms\n * integration, and extensive customization via the AteEditorConfig.\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 \"[class.ate-blocks-inside]\": \"finalBlockControls() === 'inside'\",\n \"[class.ate-blocks-outside]\": \"finalBlockControls() === 'outside'\",\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 AteBlockControlsComponent,\n ],\n providers: [\n AteEditorCommandsService,\n AteImageService,\n AteColorPickerService,\n AteLinkService,\n AteExportService,\n AteEditorI18n,\n ],\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 <!-- Block Controls (Plus + Drag) -->\n @if (finalEditable() && !mergedDisabled() && editor() && finalBlockControls() !== \"none\") {\n <ate-block-controls\n [editor]=\"editor()!\"\n [hoveredData]=\"hoveredBlock()\"\n [style.display]=\"editorFullyInitialized() ? 'block' : 'none'\"></ate-block-controls>\n }\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 (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 {{\n characterCount() > 1\n ? currentTranslations().editor.characterPlural\n : currentTranslations().editor.character\n }}\n @if (finalMaxCharacters()) {\n / {{ finalMaxCharacters() }}\n }\n }\n\n @if (finalShowCharacterCount() && finalShowWordCount()) {\n ,\n }\n\n @if (finalShowWordCount()) {\n {{ wordCount() }}\n {{\n wordCount() > 1\n ? currentTranslations().editor.wordPlural\n : currentTranslations().editor.word\n }}\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 ===== */\n --ate-primary: #2563eb;\n --ate-primary-hover: #153ca9;\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-selection-bg: var(--ate-primary-light-alpha);\n\n --ate-error-color: #c53030;\n --ate-error-bg: #fed7d7;\n --ate-error-border: #feb2b2;\n\n /* ===== COMPONENT TOKENS ===== */\n --ate-border-color: var(--ate-border);\n --ate-border-width: 2px;\n --ate-border-radius: 12px;\n --ate-sub-border-radius: 8px;\n --ate-focus-color: var(--ate-primary);\n --ate-background: var(--ate-surface);\n\n /* Content */\n --ate-text-color: var(--ate-text, #2d3748);\n --ate-placeholder-color: var(--ate-text-muted, #a0aec0);\n --ate-list-marker-color: var(--ate-text-color);\n --ate-line-height: 1.6;\n --ate-content-padding-block: 16px;\n --ate-content-padding-inline: 16px;\n --ate-content-gutter: 0px;\n\n /* ===== MENUS (Slash/Bubble) ===== */\n --ate-menu-bg: var(--ate-surface, #ffffff);\n --ate-menu-border-radius: var(--ate-border-radius, 12px);\n --ate-menu-border: var(--ate-border, #e2e8f0);\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: 4px;\n --ate-menu-gap: 2px;\n\n /* Toolbar */\n --ate-toolbar-padding: var(--ate-menu-padding);\n --ate-toolbar-gap: var(--ate-menu-gap);\n --ate-toolbar-background: var(--ate-surface-secondary, #f8f9fa);\n --ate-toolbar-border-color: var(--ate-border, #e2e8f0);\n --ate-toolbar-button-color: var(--ate-text-secondary, #64748b);\n --ate-toolbar-button-hover-background: transparent;\n --ate-toolbar-button-active-background: color-mix(\n in srgb,\n var(--ate-primary, #2563eb),\n transparent 90%\n );\n --ate-toolbar-button-active-color: var(--ate-primary, #2563eb);\n\n /* Counter */\n --ate-counter-color: var(--ate-text-secondary, #64748b);\n --ate-counter-background: var(--ate-surface-secondary, #f8f9fa);\n --ate-counter-border-color: var(--ate-border, #e2e8f0);\n\n /* Drag & Drop */\n --ate-drag-background: #f0f8ff;\n --ate-drag-border-color: var(--ate-primary, #2563eb);\n\n /* Blockquote */\n --ate-blockquote-border-color: var(--ate-border, #e2e8f0);\n --ate-blockquote-background: var(--ate-surface-secondary, #f8f9fa);\n\n /* Code */\n --ate-code-background: var(--ate-surface-secondary, #f8f9fa);\n --ate-code-color: var(--ate-text, #2d3748);\n --ate-code-border-color: var(--ate-border, #e2e8f0);\n\n --ate-code-block-background: #0f172a;\n --ate-code-block-color: #e2e8f0;\n --ate-code-block-border-color: var(--ate-border, #e2e8f0);\n\n /* Images */\n --ate-image-border-radius: 16px;\n --ate-image-selected-color: var(--ate-primary, #2563eb);\n\n /* Scrollbars */\n --ate-scrollbar-width: 10px;\n --ate-scrollbar-thumb: var(--ate-border, #e2e8f0);\n --ate-scrollbar-thumb-hover: var(--ate-text-muted, #a0aec0);\n --ate-scrollbar-track: transparent;\n\n /* Tables */\n --ate-table-border-color: var(--ate-border, #e2e8f0);\n --ate-table-header-background: var(--ate-surface-secondary, #f8f9fa);\n --ate-table-header-color: var(--ate-text, #2d3748);\n --ate-table-cell-background: var(--ate-surface, #ffffff);\n --ate-table-cell-selected-background: color-mix(\n in srgb,\n var(--ate-primary, #2563eb),\n transparent 90%\n );\n --ate-table-resize-handle-color: var(--ate-primary, #2563eb);\n --ate-table-row-hover-background: color-mix(\n in srgb,\n var(--ate-primary, #2563eb),\n transparent 95%\n );\n\n /* Floating UI & Tooltips */\n --ate-tooltip-bg: var(--ate-code-block-background, #0f172a);\n --ate-tooltip-color: var(--ate-code-block-color, #e2e8f0);\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 :host.ate-blocks-inside {\n --ate-content-gutter: 54px;\n }\n\n @media (max-width: 768px) {\n :host.ate-blocks-inside {\n --ate-content-gutter: 0px;\n }\n\n ate-block-controls {\n display: none !important;\n }\n }\n\n /* Styles ProseMirror avec :host ::ng-deep */\n :host ::ng-deep .ProseMirror {\n padding-inline: calc(var(--ate-content-padding-inline) + var(--ate-content-gutter));\n padding-block: var(--ate-content-padding-block);\n outline: none;\n line-height: var(--ate-line-height);\n color: var(--ate-text-color);\n min-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 :host ::ng-deep .ProseMirror ::selection {\n background-color: var(--ate-selection-bg);\n color: inherit;\n }\n\n :host ::ng-deep .ProseMirror ::-moz-selection {\n background-color: var(--ate-selection-bg);\n color: inherit;\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 :host ::ng-deep .ProseMirror h4 {\n font-size: 1.1em;\n font-weight: bold;\n margin-top: 1em;\n margin-bottom: 0.5em;\n }\n\n :host ::ng-deep .ProseMirror h5,\n :host ::ng-deep .ProseMirror h6 {\n font-size: 1em;\n font-weight: bold;\n margin-top: 1em;\n margin-bottom: 0.5em;\n }\n\n /* Paragraphes et listes (Normalisation contre les CSS Resets globaux type Tailwind) */\n :host ::ng-deep .ProseMirror p {\n margin: 0.5em 0;\n }\n\n :host ::ng-deep .ProseMirror ul {\n list-style-type: disc;\n list-style-position: outside;\n padding-left: 2em;\n margin: 0.5em 0;\n }\n\n :host ::ng-deep .ProseMirror ol {\n list-style-type: decimal;\n list-style-position: outside;\n padding-left: 2em;\n margin: 0.5em 0;\n }\n\n :host ::ng-deep .ProseMirror ul ul {\n list-style-type: circle;\n }\n\n :host ::ng-deep .ProseMirror ul ul ul {\n list-style-type: square;\n }\n\n :host ::ng-deep .ProseMirror ol ol {\n list-style-type: lower-alpha;\n }\n\n :host ::ng-deep .ProseMirror ol ol ol {\n list-style-type: lower-roman;\n }\n\n :host ::ng-deep .ProseMirror li::marker {\n color: var(--ate-list-marker-color);\n }\n\n :host ::ng-deep .ProseMirror ul[data-type=\"taskList\"] {\n list-style-type: none;\n }\n\n :host ::ng-deep .ProseMirror hr {\n border: none;\n border-top: 1px solid var(--ate-border);\n margin: 1.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 /* Allow interaction in read-only mode (links, node selection) */\n }\n\n :host ::ng-deep .ProseMirror[contenteditable=\"false\"] img {\n cursor: pointer;\n }\n\n :host ::ng-deep .ProseMirror[contenteditable=\"false\"] a {\n cursor: pointer;\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 :host ::ng-deep .resizable-image-container.selected img {\n border-color: var(--ate-image-selected-color);\n transition: all 0.2s ease;\n }\n\n /* Alignment Support (ProseMirror / ATE Wrapper) */\n :host ::ng-deep .ProseMirror [data-text-align=\"center\"],\n :host ::ng-deep .ProseMirror [data-align=\"center\"] {\n text-align: center;\n }\n\n :host ::ng-deep .ProseMirror [data-text-align=\"right\"],\n :host ::ng-deep .ProseMirror [data-align=\"right\"] {\n text-align: right;\n }\n\n :host ::ng-deep .ProseMirror [data-text-align=\"left\"],\n :host ::ng-deep .ProseMirror [data-align=\"left\"] {\n text-align: left;\n }\n\n /* Conteneur pour les images redimensionnables */\n :host ::ng-deep .resizable-image-wrapper {\n display: block;\n width: 100%;\n margin: 0.5em 0;\n }\n\n :host ::ng-deep .resizable-image-container {\n position: relative;\n display: inline-block;\n max-width: 100%;\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 opacity: 0;\n transition: opacity 0.2s ease;\n }\n\n /* Styles pour le SlashCommandComponent */\n ::ng-deep .ate-slash-decoration {\n background: var(\n --ate-primary-light,\n color-mix(in srgb, var(--ate-primary, #2563eb), transparent 90%)\n );\n padding: 4px 8px;\n border-radius: var(--ate-sub-border-radius, 8px);\n }\n\n ::ng-deep .ate-slash-decoration.is-empty::after {\n content: attr(data-decoration-content);\n color: var(--ate-text-secondary);\n font-weight: 400;\n opacity: 0.7;\n }\n\n /* Afficher les poignées au hover (même si non sélectionné) - Uniquement si éditable */\n :host:not(.is-readonly):not(.is-disabled)\n ::ng-deep\n .resizable-image-container:hover\n .resize-controls,\n :host:not(.is-readonly):not(.is-disabled) ::ng-deep body.resizing .resize-controls {\n opacity: 1;\n }\n\n /* Poignées de redimensionnement */\n :host ::ng-deep .resize-handle {\n position: absolute;\n width: 0.35rem;\n height: 2rem;\n background: var(--ate-primary);\n border: 2px solid var(--ate-surface);\n border-radius: var(--ate-border-radius);\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 des côtés avec scale séparé pour centrage */\n :host ::ng-deep .resize-handle-w:hover,\n :host ::ng-deep .resize-handle-e:hover {\n background: var(--ate-primary-hover);\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 background: var(--ate-primary-hover);\n }\n\n /* Positions spécifiques pour chaque poignée */\n :host ::ng-deep .resize-handle-w {\n top: 50%;\n left: 0.35rem;\n transform: translateY(-50%);\n cursor: w-resize;\n }\n :host ::ng-deep .resize-handle-e {\n top: 50%;\n right: 0.35rem;\n transform: translateY(-50%);\n cursor: e-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 .resizable-image-container {\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 .resizable-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 | undefined>(undefined);\n editable = input<boolean | undefined, unknown>(undefined, { transform: transformBooleanInput });\n disabled = input<boolean | undefined, unknown>(undefined, { transform: transformBooleanInput });\n minHeight = input<number | string | undefined>(undefined);\n height = input<number | string | undefined>(undefined);\n maxHeight = input<number | string | undefined>(undefined);\n fillContainer = input<boolean | undefined, unknown>(undefined, {\n transform: transformBooleanInput,\n });\n showToolbar = input<boolean | undefined, unknown>(undefined, {\n transform: transformBooleanInput,\n });\n showFooter = input<boolean | undefined, unknown>(undefined, { transform: transformBooleanInput });\n showCharacterCount = input<boolean | undefined, unknown>(undefined, {\n transform: transformBooleanInput,\n });\n showWordCount = input<boolean | undefined, unknown>(undefined, {\n transform: transformBooleanInput,\n });\n maxCharacters = input<number | undefined>(undefined);\n enableOfficePaste = input<boolean | undefined, unknown>(undefined, {\n transform: transformBooleanInput,\n });\n enableSlashCommands = input<boolean | undefined, unknown>(undefined, {\n transform: transformBooleanInput,\n });\n enableBlockShortcuts = input<boolean | undefined, unknown>(undefined, {\n transform: transformBooleanInput,\n });\n slashCommands = input<AteSlashCommandsConfig | undefined>(undefined);\n customSlashCommands = input<AteCustomSlashCommands | undefined>(undefined);\n blockControls = input<AteBlockControlsMode>();\n locale = input<SupportedLocale | undefined>(undefined);\n autofocus = input<AteAutofocusMode | undefined>(undefined);\n mode = input<\"classic\" | \"seamless\" | undefined>(undefined);\n seamless = input<boolean | undefined, unknown>(undefined, { transform: transformBooleanInput });\n floatingToolbar = input<boolean | undefined, unknown>(undefined, {\n transform: transformBooleanInput,\n });\n showEditToggle = input<boolean | undefined, unknown>(undefined, {\n transform: transformBooleanInput,\n });\n spellcheck = input<boolean | undefined, unknown>(undefined, { transform: transformBooleanInput });\n\n tiptapExtensions = input<(Extension | Node | Mark)[] | undefined>(undefined);\n tiptapOptions = input<Partial<EditorOptions> | undefined>(undefined);\n starterKitOptions = input<Partial<StarterKitOptions> | undefined>(undefined);\n\n // Nouveaux inputs pour les bubble menus\n showBubbleMenu = input<boolean | undefined, unknown>(undefined, {\n transform: transformBooleanInput,\n });\n bubbleMenu = input<Partial<AteBubbleMenuConfig> | undefined>(undefined);\n showImageBubbleMenu = input<boolean | undefined, unknown>(undefined, {\n transform: transformBooleanInput,\n });\n imageBubbleMenu = input<Partial<AteImageBubbleMenuConfig> | undefined>(undefined);\n\n // Configuration de la toolbar\n toolbar = input<Partial<AteToolbarConfig> | undefined>(undefined);\n\n // Configuration des menus de table\n showTableBubbleMenu = input<boolean | undefined, unknown>(undefined, {\n transform: transformBooleanInput,\n });\n tableBubbleMenu = input<Partial<AteTableBubbleMenuConfig> | undefined>(undefined);\n showCellBubbleMenu = input<boolean | undefined, unknown>(undefined, {\n transform: transformBooleanInput,\n });\n cellBubbleMenu = input<Partial<AteCellBubbleMenuConfig> | undefined>(undefined);\n\n /**\n * Additionnal state calculators to extend the reactive editor state.\n */\n stateCalculators = input<AteStateCalculator[] | undefined>(undefined);\n\n // Nouveau input pour la configuration de l'upload d'images\n imageUpload = input<Partial<AteImageUploadOptions> | undefined>(undefined);\n\n /**\n * What is kept from HTML pasted or dropped from other apps (`colors`, `highlights`),\n * and an optional `transformHTML` hook. Merged over `config.paste`.\n */\n paste = input<AtePasteConfig | undefined>(undefined);\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 /**\n * Maps the `src` stored in the document to the URL the editor displays and downloads.\n * The document, `getHTML()` and exports keep the original `src`.\n */\n imageSrcResolver = input<AteImageSrcResolver | undefined>(undefined);\n\n /**\n * Optional unique identifier for the editor instance in the registry.\n * If not specified, a unique ID is automatically generated.\n */\n editorId = input<string | 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 imageUploaded = output<AteImageUploadResult>();\n /** Emitted when an image file is rejected (disallowed type, too large or failed upload) */\n imageRejected = output<AteImageRejection>();\n /** Emitted when an image from pasted HTML is dropped (unreachable source or failed upload) */\n pastedImageRejected = output<AtePastedImageRejection>();\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 private _hoveredBlock = signal<{ node: PMNode; element: HTMLElement; pos: number } | null>(null);\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 readonly hoveredBlock = this._hoveredBlock.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.disabled() ?? this.effectiveConfig().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 inputVal = this.seamless();\n if (inputVal !== undefined) {\n return inputVal;\n }\n\n const modeVal = this.mode();\n if (modeVal !== undefined) {\n return modeVal === \"seamless\";\n }\n\n const fromConfig = this.effectiveConfig().mode;\n return fromConfig === \"seamless\";\n });\n\n readonly finalEditable = computed(\n () => this.editable() ?? this.effectiveConfig().editable ?? true\n );\n readonly finalPlaceholder = computed(\n () =>\n this.placeholder() ??\n this.effectiveConfig().placeholder ??\n this.currentTranslations().editor.placeholder\n );\n readonly finalFillContainer = computed(\n () => this.fillContainer() ?? this.effectiveConfig().fillContainer\n );\n readonly finalShowFooter = computed(\n () => this.showFooter() ?? this.effectiveConfig().showFooter ?? true\n );\n readonly finalShowEditToggle = computed(\n () => this.showEditToggle() ?? this.effectiveConfig().showEditToggle ?? false\n );\n\n readonly finalHeight = computed(() => {\n const h = this.height() ?? this.effectiveConfig().height;\n return typeof h === \"number\" ? `${h}px` : h;\n });\n readonly finalMinHeight = computed(() => {\n const mh = this.minHeight() ?? this.effectiveConfig().minHeight;\n return typeof mh === \"number\" ? `${mh}px` : mh;\n });\n readonly finalMaxHeight = computed(() => {\n const mh = this.maxHeight() ?? this.effectiveConfig().maxHeight;\n return typeof mh === \"number\" ? `${mh}px` : mh;\n });\n\n readonly finalSpellcheck = computed(\n () => this.spellcheck() ?? this.effectiveConfig().spellcheck ?? true\n );\n readonly finalEnableOfficePaste = computed(\n () => this.enableOfficePaste() ?? this.effectiveConfig().enableOfficePaste ?? true\n );\n\n // Features\n readonly finalShowToolbar = computed(\n () => this.showToolbar() ?? this.effectiveConfig().showToolbar ?? true\n );\n\n readonly finalToolbarConfig = computed(() => {\n const fromInput = this.toolbar();\n const fromConfig = this.effectiveConfig().toolbar;\n const base = ATE_DEFAULT_TOOLBAR_CONFIG;\n\n if (fromInput && Object.keys(fromInput).length > 0) {\n return { ...base, ...fromInput };\n }\n if (fromConfig) {\n return { ...base, ...fromConfig };\n }\n return base;\n });\n\n readonly finalFloatingToolbar = computed(\n () => this.floatingToolbar() ?? this.effectiveConfig().floatingToolbar ?? false\n );\n\n readonly finalShowBubbleMenu = computed(\n () => this.showBubbleMenu() ?? this.effectiveConfig().showBubbleMenu ?? true\n );\n\n readonly finalBubbleMenuConfig = computed(() => {\n const fromInput = this.bubbleMenu();\n const fromConfig = this.effectiveConfig().bubbleMenu;\n const base = ATE_DEFAULT_BUBBLE_MENU_CONFIG;\n\n if (fromInput && Object.keys(fromInput).length > 0) {\n return { ...base, ...fromInput };\n }\n if (fromConfig) {\n return { ...base, ...fromConfig };\n }\n return base;\n });\n\n readonly finalShowImageBubbleMenu = computed(\n () => this.showImageBubbleMenu() ?? this.effectiveConfig().showImageBubbleMenu ?? true\n );\n\n readonly finalImageBubbleMenuConfig = computed(() => {\n const fromInput = this.imageBubbleMenu();\n const fromConfig = this.effectiveConfig().imageBubbleMenu;\n const base = ATE_DEFAULT_IMAGE_BUBBLE_MENU_CONFIG;\n\n if (fromInput && Object.keys(fromInput).length > 0) {\n return { ...base, ...fromInput };\n }\n if (fromConfig) {\n return { ...base, ...fromConfig };\n }\n return base;\n });\n\n readonly finalShowTableBubbleMenu = computed(\n () => this.showTableBubbleMenu() ?? this.effectiveConfig().showTableMenu ?? true\n );\n\n readonly finalTableBubbleMenuConfig = computed(() => {\n const fromInput = this.tableBubbleMenu();\n const fromConfig = this.effectiveConfig().tableBubbleMenu;\n const base = ATE_DEFAULT_TABLE_MENU_CONFIG;\n\n if (fromInput && Object.keys(fromInput).length > 0) {\n return { ...base, ...fromInput };\n }\n if (fromConfig) {\n return { ...base, ...fromConfig };\n }\n return base;\n });\n\n readonly finalShowCellBubbleMenu = computed(\n () => this.showCellBubbleMenu() ?? this.effectiveConfig().showCellMenu ?? true\n );\n\n readonly finalCellBubbleMenuConfig = computed(() => {\n const fromInput = this.cellBubbleMenu();\n const fromConfig = this.effectiveConfig().cellBubbleMenu;\n const base = ATE_DEFAULT_CELL_MENU_CONFIG;\n\n if (fromInput && Object.keys(fromInput).length > 0) {\n return { ...base, ...fromInput };\n }\n if (fromConfig) {\n return { ...base, ...fromConfig };\n }\n return base;\n });\n\n readonly finalEnableSlashCommands = computed(\n () => this.enableSlashCommands() ?? this.effectiveConfig().enableSlashCommands ?? true\n );\n\n readonly finalSlashCommandsConfig = computed(() => {\n const fromInputComponent = this.customSlashCommands();\n const fromConfigComponent = this.effectiveConfig().customSlashCommands;\n const customConfig = fromInputComponent ?? fromConfigComponent;\n\n if (customConfig) {\n return customConfig;\n }\n\n const fromInputOptions = this.slashCommands();\n const fromConfigOptions = this.effectiveConfig().slashCommands;\n const baseConfig =\n fromInputOptions && Object.keys(fromInputOptions).length > 0\n ? fromInputOptions\n : fromConfigOptions;\n\n return {\n commands: filterSlashCommands(\n baseConfig || {},\n this.editorI18n,\n this.editorCommandsService,\n this.finalImageUploadConfig()\n ),\n };\n });\n\n // Behavior\n readonly finalAutofocus = computed(() => this.autofocus() ?? this.effectiveConfig().autofocus);\n readonly finalMaxCharacters = computed(\n () => this.maxCharacters() ?? this.effectiveConfig().maxCharacters\n );\n readonly finalEnableBlockShortcuts = computed(\n () => this.enableBlockShortcuts() ?? this.effectiveConfig().enableBlockShortcuts ?? true\n );\n readonly finalBlockControls = computed(\n () => this.blockControls() ?? this.effectiveConfig().blockControls ?? \"none\"\n );\n readonly finalShowCharacterCount = computed(\n () => this.showCharacterCount() ?? this.effectiveConfig().showCharacterCount ?? true\n );\n readonly finalShowWordCount = computed(\n () => this.showWordCount() ?? this.effectiveConfig().showWordCount ?? true\n );\n readonly finalLocale = computed(\n () => (this.locale() as SupportedLocale) ?? (this.effectiveConfig().locale as SupportedLocale)\n );\n\n // Extensions & Options\n readonly finalTiptapExtensions = computed(\n () => this.tiptapExtensions() ?? this.effectiveConfig().tiptapExtensions ?? [],\n { equal: shallowArrayEqual }\n );\n\n readonly finalTiptapOptions = computed(\n () => this.tiptapOptions() ?? this.effectiveConfig().tiptapOptions ?? {},\n { equal: shallowObjectEqual }\n );\n\n readonly finalStarterKitOptions = computed(\n () => this.starterKitOptions() ?? this.effectiveConfig().starterKitOptions ?? {},\n { equal: shallowObjectEqual }\n );\n\n readonly finalStateCalculators = computed(\n () => this.stateCalculators() ?? this.effectiveConfig().stateCalculators ?? []\n );\n\n readonly finalAngularNodesConfig = computed(() => this.effectiveConfig().angularNodes ?? [], {\n equal: shallowArrayEqual,\n });\n\n // Paste\n readonly finalPasteConfig = computed<AtePasteConfig>(() => ({\n ...ATE_DEFAULT_PASTE_CONFIG,\n ...this.effectiveConfig().paste,\n ...this.paste(),\n }));\n\n // Image Upload\n readonly finalImageUploadConfig = computed(() => {\n const fromInput = this.imageUpload();\n const fromConfig = this.effectiveConfig().imageUpload;\n const base = ATE_DEFAULT_IMAGE_UPLOAD_CONFIG;\n\n const merged = {\n ...base,\n ...fromConfig,\n ...fromInput,\n };\n\n return {\n ...merged,\n maxSize: (merged.maxSize ?? 5) * 1024 * 1024, // Convert MB to bytes for internal service\n };\n });\n\n readonly finalImageSrcResolver = computed(\n () => this.imageSrcResolver() ?? this.effectiveConfig().imageSrcResolver\n );\n\n readonly finalImageUploadHandler = computed(\n () => this.imageUploadHandler() ?? this.effectiveConfig().imageUpload?.handler\n );\n\n private readonly editorI18n = inject(AteEditorI18n);\n // Current translations (per-instance override via config or input, else the global locale)\n readonly currentTranslations = this.editorI18n.translations;\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 private editorRegistry = inject(AteEditorRegistry);\n private readonly warnedExtensionOverrides = new Set<string>();\n private iconRegistry = inject(AteIconRegistry);\n private _registeredId = signal<string | null>(null);\n readonly registeredId = this._registeredId.asReadonly();\n\n private injector = inject(Injector);\n private globalConfig = inject(ATE_GLOBAL_CONFIG, { optional: true });\n\n /**\n * Final merged configuration.\n * Priority: Input [config] > Global config via provideAteEditor()\n */\n readonly effectiveConfig = computed(() => {\n const fromInput = this.config();\n const fromGlobal = this.globalConfig || {};\n return { ...ATE_DEFAULT_CONFIG, ...fromGlobal, ...fromInput };\n });\n\n constructor() {\n this.editorI18n.bindLocale(this.finalLocale);\n // Effect to update editor content (with anti-echo)\n effect(\n () => {\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, { emitUpdate: false });\n });\n },\n { allowSignalWrites: true }\n );\n\n // Effect to update height properties\n effect(\n () => {\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 { allowSignalWrites: true }\n );\n\n // Effect to monitor editability changes\n effect(\n () => {\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 { allowSignalWrites: true }\n );\n\n // Effect to synchronize image upload handler with the service\n effect(\n () => {\n const handler = this.finalImageUploadHandler();\n this.editorCommandsService.uploadHandler = handler || null;\n },\n { allowSignalWrites: true }\n );\n\n // Effect to refresh the placeholder decoration when its resolved text changes\n effect(() => {\n const editor = this.editor();\n this.finalPlaceholder();\n\n if (editor && !editor.isDestroyed) {\n untracked(() => editor.view.dispatch(editor.state.tr));\n }\n });\n\n // Effect to re-apply the image src resolver to the displayed images when it changes\n // (e.g. a resolver set after the editor was created, or a new one after a token refresh)\n effect(() => {\n this.editorCommandsService.srcResolver = this.finalImageSrcResolver() ?? null;\n const editor = untracked(() => this.editor());\n if (editor && !editor.isDestroyed) {\n editor.storage.resizableImage?.srcRefreshers.forEach(refresh => refresh());\n }\n });\n\n // Effect to update character count limit dynamically\n effect(\n () => {\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 { allowSignalWrites: true }\n );\n\n // Effect to re-initialize editor when technical configuration changes\n effect(\n () => {\n // Monitor technical dependencies\n this.finalTiptapExtensions();\n this.finalTiptapOptions();\n this.finalStarterKitOptions();\n this.finalAngularNodesConfig();\n this.finalBlockControls();\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 { allowSignalWrites: true }\n );\n\n this.editorCommandsService.onImageUploaded = result => {\n this.imageUploaded.emit(result);\n };\n this.editorCommandsService.onImageRejected = rejection => {\n this.imageRejected.emit(rejection);\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 // Unregister from the global registry\n const id = this.registeredId();\n if (id) {\n this.editorRegistry.unregister(id);\n }\n }\n\n private initEditor() {\n this.editorCommandsService.srcResolver = this.finalImageSrcResolver() ?? null;\n const starterKitOptions = this.finalStarterKitOptions();\n const customExtensions = this.finalTiptapExtensions();\n const customNames = new Set(\n customExtensions.map(getExtensionName).filter((name): name is string => !!name)\n );\n\n const defaultLinkOptions = {\n openOnClick: false,\n HTMLAttributes: {\n class: \"ate-link\",\n },\n };\n\n const effectiveStarterKitOptions: Partial<StarterKitOptions> = {\n ...starterKitOptions,\n link:\n starterKitOptions.link === false\n ? false\n : {\n ...defaultLinkOptions,\n ...starterKitOptions.link,\n HTMLAttributes: {\n ...defaultLinkOptions.HTMLAttributes,\n ...starterKitOptions.link?.HTMLAttributes,\n },\n },\n };\n\n const replacedNames: string[] = [];\n const ignoredStarterKitOptionKeys: string[] = [];\n\n for (const customName of customNames) {\n const optionKey = STARTER_KIT_NAME_TO_OPTION[customName];\n if (!optionKey) {\n continue;\n }\n const userStarterKitValue = starterKitOptions[optionKey];\n if (userStarterKitValue !== undefined && userStarterKitValue !== false) {\n ignoredStarterKitOptionKeys.push(optionKey);\n }\n if (userStarterKitValue !== false) {\n replacedNames.push(customName);\n }\n (effectiveStarterKitOptions as Record<string, unknown>)[optionKey] = false;\n }\n\n const extensions: (Extension | Node | Mark)[] = [\n StarterKit.configure(effectiveStarterKitOptions),\n TextStyle,\n Color.configure({\n types: [\"textStyle\"],\n }),\n Placeholder.configure({\n placeholder: () => this.finalPlaceholder(),\n }),\n Superscript,\n Subscript,\n TextAlign.configure({\n types: [\"heading\", \"paragraph\", \"resizableImage\"],\n }),\n AteLinkClickBehavior,\n AteBlockShortcuts.configure({\n enabled: () => this.finalEnableBlockShortcuts(),\n }),\n AtePaste.configure({\n config: () => this.finalPasteConfig(),\n }),\n AteLinkShortcut.configure({\n canOpen: () => this.editorCommandsService.editorState().can.toggleLink,\n open: editor => this.editorCommandsService.execute(editor, \"toggleLink\"),\n }),\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 srcResolver: () => this.editorCommandsService.srcResolver,\n }),\n AtePastedImage.configure({\n shouldRehost: () => this.editorCommandsService.hasUploadHandler,\n rehost: file => this.editorCommandsService.rehostImage(file, this.getImageUploadOptions()),\n onRejected: rejection => this.pastedImageRejected.emit(rejection),\n }),\n AteUploadProgress.configure({\n isUploading: () => this.editorCommandsService.isUploading(),\n uploadProgress: () => this.editorCommandsService.uploadProgress(),\n uploadMessage: () => this.editorCommandsService.uploadMessage(),\n iconHtml: () => this.iconRegistry.html(\"imageUpload\", \"spinning\"),\n }),\n AteTableExtension,\n registerAngularComponent(this.injector, AteTocNodeOptions),\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.finalStateCalculators(),\n ],\n }),\n ];\n\n if (this.finalBlockControls() !== \"none\") {\n extensions.push(\n AteBlockControlsExtension.configure({\n onHover: data => this._hoveredBlock.set(data),\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 // Register automatic node views from config\n const autoNodeViews = this.finalAngularNodesConfig();\n autoNodeViews.forEach((reg: AteAngularNode) => {\n const options =\n typeof reg === \"function\"\n ? { component: reg as Type<unknown> }\n : (reg as RegisterAngularComponentOptions<unknown>);\n\n try {\n const extension = registerAngularComponent(this.injector, options);\n extensions.push(extension);\n } catch (e) {\n console.error(\"[ATE] Failed to auto-register node view:\", e);\n }\n });\n\n // Custom extensions in tiptapExtensions take precedence over built-in extensions of the same name\n if (customExtensions.length > 0) {\n for (let i = extensions.length - 1; i >= 0; i--) {\n const name = getExtensionName(extensions[i]);\n if (name && customNames.has(name)) {\n replacedNames.push(name);\n extensions.splice(i, 1);\n }\n }\n\n extensions.push(...customExtensions);\n\n if (isDevMode()) {\n const newlyReplaced = replacedNames.filter(\n name => !this.warnedExtensionOverrides.has(`override:${name}`)\n );\n const newlyIgnoredOptions = ignoredStarterKitOptionKeys.filter(\n key => !this.warnedExtensionOverrides.has(`conflict:${key}`)\n );\n\n if (newlyReplaced.length > 0 || newlyIgnoredOptions.length > 0) {\n newlyReplaced.forEach(name => this.warnedExtensionOverrides.add(`override:${name}`));\n newlyIgnoredOptions.forEach(key => this.warnedExtensionOverrides.add(`conflict:${key}`));\n\n const parts: string[] = [];\n if (newlyReplaced.length > 0) {\n const details = newlyReplaced\n .map(name => {\n const deps = ATE_BUILTIN_UI_DEPENDENCIES[name];\n return deps ? `${name} (used by: ${deps})` : name;\n })\n .join(\"; \");\n parts.push(\n `Custom extension(s) in tiptapExtensions replaced built-in extension(s): ${details}.`\n );\n }\n if (newlyIgnoredOptions.length > 0) {\n const ignoredList = newlyIgnoredOptions\n .map(key => `starterKitOptions.${key}`)\n .join(\", \");\n parts.push(\n `${ignoredList} was ignored because the custom extension in tiptapExtensions takes precedence.`\n );\n }\n\n console.warn(`[ATE] ${parts.join(\" \")}`);\n }\n }\n }\n\n // Also allow any tiptap user options\n const userOptions = this.finalTiptapOptions();\n const userEditorProps = userOptions.editorProps;\n const userHandlePaste = userEditorProps?.handlePaste;\n const userHandleDOMPaste = userEditorProps?.handleDOMEvents?.paste;\n\n type EditorHandlePaste = NonNullable<NonNullable<EditorOptions[\"editorProps\"]>[\"handlePaste\"]>;\n type EditorDOMPasteHandler = NonNullable<\n NonNullable<NonNullable<EditorOptions[\"editorProps\"]>[\"handleDOMEvents\"]>[\"paste\"]\n >;\n\n const handleDOMPaste: EditorDOMPasteHandler = (view, event) => {\n const currentEditor = this.editor();\n if (\n currentEditor &&\n this.editorCommandsService.handleImagePaste(\n currentEditor,\n event,\n this.getImageUploadOptions()\n )\n ) {\n return true;\n }\n\n if (!userHandleDOMPaste) {\n return false;\n }\n\n const userResult = userHandleDOMPaste(view, event);\n return userResult === true;\n };\n\n const handlePaste: EditorHandlePaste = (view, event, slice) => {\n const currentEditor = this.editor();\n if (\n currentEditor &&\n this.editorCommandsService.handleImagePaste(\n currentEditor,\n event,\n this.getImageUploadOptions()\n )\n ) {\n return true;\n }\n\n if (!userHandlePaste) {\n return false;\n }\n\n const userResult = userHandlePaste(view, event, slice);\n return userResult === true;\n };\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 ...userEditorProps,\n attributes: {\n ...userEditorProps?.attributes,\n spellcheck: this.finalSpellcheck().toString(),\n },\n handleDOMEvents: {\n ...userEditorProps?.handleDOMEvents,\n paste: handleDOMPaste,\n },\n handlePaste,\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 const id = this.registeredId();\n if (id) {\n this.editorRegistry.setActive(id);\n }\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 // Register editor in the global registry\n const registeredId = this.editorRegistry.register(\n this.editorId(),\n () => this.editor(),\n this.editorCommandsService\n );\n this._registeredId.set(registeredId);\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 const editor = this.editor();\n if (editor) {\n this.editorCommandsService.handleImageDrop(editor, event, this.getImageUploadOptions());\n this._isDragOver.set(false);\n }\n }\n\n private getImageUploadOptions(): AteImageUploadOptions {\n const config = this.finalImageUploadConfig();\n return {\n quality: config.quality,\n maxWidth: config.maxWidth,\n maxHeight: config.maxHeight,\n maxSize: config.maxSize,\n allowedTypes: config.allowedTypes,\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) {\n return;\n }\n\n // In read-only mode, handle clearing of node selection\n if (!this.finalEditable()) {\n const target = event.target as HTMLElement;\n const editorElement = this.editorElement()?.nativeElement;\n if (target === editorElement || target.classList.contains(\"ate-content\")) {\n // Clear selection to hide bubble menus\n editor.commands.setTextSelection(0);\n }\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 {\n EnvironmentProviders,\n makeEnvironmentProviders,\n APP_INITIALIZER,\n Injector,\n} from \"@angular/core\";\nimport { setGlobalInjector } from \"./node-view/ate-injector.registry\";\n\nimport { ATE_GLOBAL_CONFIG } from \"./config/ate-global-config.token\";\nimport { AteEditorConfig } from \"./models/ate-editor-config.model\";\nimport { ATE_ICONS, AteIcons } from \"./services/ate-icon-registry.service\";\n\n/**\n * Provides the necessary configuration and initialization for the Angular TipTap Editor.\n * This should be called in your app.config.ts (for standalone) or main.ts.\n *\n * This provider is essential for 'Angular Nodes' to work correctly, as it captures the\n * root Injector required to instantiate custom Angular components within the editor.\n * @example\n * ```ts\n * bootstrapApplication(AppComponent, {\n * providers: [\n * provideAteEditor({\n * theme: 'dark',\n * mode: 'seamless'\n * })\n * ]\n * });\n * ```\n */\nexport function provideAteEditor(config?: AteEditorConfig): EnvironmentProviders {\n return makeEnvironmentProviders([\n {\n provide: ATE_GLOBAL_CONFIG,\n useValue: config || {},\n },\n {\n provide: APP_INITIALIZER,\n useFactory: (injector: Injector) => () => {\n setGlobalInjector(injector);\n },\n deps: [Injector],\n multi: true,\n },\n ]);\n}\n\n/**\n * Registers SVG icons, to override the library icons or to add icons for custom\n * toolbar items, bubble menus and slash commands. Can be called several times.\n *\n * Must be provided at application bootstrap (`app.config.ts` or `main.ts`) because\n * `AteIconRegistry` is root-scoped (`providedIn: 'root'`); for lazy routes or\n * runtime changes, inject `AteIconRegistry` and call `register()`.\n *\n * Values are a full `<svg>` element, used as-is with its own `fill` and `stroke`,\n * or only its inner markup, drawn in the Material Symbols viewBox (`0 -960 960 960`)\n * and filled with `currentColor`. Unregistered names fall back to\n * the Material Symbols font, when it is loaded.\n * @example\n * ```ts\n * bootstrapApplication(AppComponent, {\n * providers: [\n * provideAteEditor(),\n * provideAteIcons({\n * // full <svg>: keeps its own fill and stroke (here a stroke icon, Lucide style)\n * bold: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"…\"/></svg>',\n * // inner markup: Material Symbols viewBox, filled with currentColor\n * rocket: '<path d=\"…\"/>',\n * })\n * ]\n * });\n * ```\n */\nexport function provideAteIcons(icons: AteIcons): EnvironmentProviders {\n return makeEnvironmentProviders([{ provide: ATE_ICONS, useValue: icons, multi: true }]);\n}\n","// Generated by scripts/generate-ate-stroke-icons.mjs, do not edit by hand.\n// /ATE stroke icons: 24 grid, 2px stroke, round caps. Usage: provideAteIcons(ATE_STROKE_ICONS)\nimport type { AteIcons } from \"../services/ate-icon-registry.service\";\n\nexport const ATE_STROKE_ICONS: AteIcons = {\n addColumnAfter: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><rect x=\\\"4\\\" y=\\\"3\\\" width=\\\"10\\\" height=\\\"18\\\" rx=\\\"3\\\"/><path d=\\\"M9 3v18M4 9.5h10M16.5 12h5M19 9.5v5\\\"/></svg>\",\n addColumnBefore: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><rect x=\\\"10\\\" y=\\\"3\\\" width=\\\"10\\\" height=\\\"18\\\" rx=\\\"3\\\"/><path d=\\\"M15 3v18M10 9.5h10M2.5 12h5M5 9.5v5\\\"/></svg>\",\n addRowAfter: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><rect x=\\\"3\\\" y=\\\"4\\\" width=\\\"18\\\" height=\\\"10\\\" rx=\\\"3\\\"/><path d=\\\"M3 9h18M9.5 4v10M12 16.5v5M9.5 19h5\\\"/></svg>\",\n addRowBefore: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><rect x=\\\"3\\\" y=\\\"10\\\" width=\\\"18\\\" height=\\\"10\\\" rx=\\\"3\\\"/><path d=\\\"M3 15h18M9.5 10v10M12 2.5v5M9.5 5h5\\\"/></svg>\",\n alignCenter: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M4 6h16M7 10h10M4 14h16M7 18h10\\\"/></svg>\",\n alignJustify: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M4 6h16M4 10h16M4 14h16M4 18h16\\\"/></svg>\",\n alignLeft: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M4 6h16M4 10h10M4 14h16M4 18h10\\\"/></svg>\",\n alignRight: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M4 6h16M10 10h10M4 14h16M10 18h10\\\"/></svg>\",\n apply: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"m5 12.5 4.5 4.5L19 7.5\\\"/></svg>\",\n blockAdd: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><rect x=\\\"3.5\\\" y=\\\"3.5\\\" width=\\\"17\\\" height=\\\"17\\\" rx=\\\"5\\\"/><path d=\\\"M12 8.5v7M8.5 12h7\\\"/></svg>\",\n blockDrag: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><g fill=\\\"currentColor\\\" stroke=\\\"none\\\"><circle cx=\\\"9\\\" cy=\\\"6\\\" r=\\\"1.5\\\"/><circle cx=\\\"15\\\" cy=\\\"6\\\" r=\\\"1.5\\\"/><circle cx=\\\"9\\\" cy=\\\"12\\\" r=\\\"1.5\\\"/><circle cx=\\\"15\\\" cy=\\\"12\\\" r=\\\"1.5\\\"/><circle cx=\\\"9\\\" cy=\\\"18\\\" r=\\\"1.5\\\"/><circle cx=\\\"15\\\" cy=\\\"18\\\" r=\\\"1.5\\\"/></g></svg>\",\n blockquote: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M4 5v14M9 7.5h11M9 12h11M9 16.5h7\\\"/></svg>\",\n bold: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M7 5h5.5a3.5 3.5 0 0 1 0 7H7zM7 12h6.5a3.5 3.5 0 0 1 0 7H7z\\\" stroke-width=\\\"2.6\\\"/></svg>\",\n bulletList: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M10 6h10M10 12h10M10 18h10\\\"/><circle cx=\\\"5\\\" cy=\\\"6\\\" r=\\\"1.4\\\" fill=\\\"currentColor\\\" stroke=\\\"none\\\"/><circle cx=\\\"5\\\" cy=\\\"12\\\" r=\\\"1.4\\\" fill=\\\"currentColor\\\" stroke=\\\"none\\\"/><circle cx=\\\"5\\\" cy=\\\"18\\\" r=\\\"1.4\\\" fill=\\\"currentColor\\\" stroke=\\\"none\\\"/></svg>\",\n changeImage: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M11 20H6.5A3.5 3.5 0 0 1 3 16.5v-9A3.5 3.5 0 0 1 6.5 4h11A3.5 3.5 0 0 1 21 7.5V11M3 16l5-5 3.5 3.5\\\"/><circle cx=\\\"15.5\\\" cy=\\\"8.5\\\" r=\\\"1.4\\\"/><path d=\\\"m18.5 13.5 2 2-4.5 4.5h-2v-2z\\\"/></svg>\",\n clear: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M6 6l12 12M18 6 6 18\\\"/></svg>\",\n clearContent: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M9 20.5h11M4.8 14.8 13.6 6a2 2 0 0 1 2.8 0l3.2 3.2a2 2 0 0 1 0 2.8L11.1 20.5H9.3l-4.5-4.5a.9.9 0 0 1 0-1.2zM9.5 10.2l5.8 5.8\\\"/></svg>\",\n code: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M8.5 7 3.5 12l5 5M15.5 7l5 5-5 5\\\"/></svg>\",\n codeBlock: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><rect x=\\\"3\\\" y=\\\"4\\\" width=\\\"18\\\" height=\\\"16\\\" rx=\\\"3.5\\\"/><path d=\\\"m7.5 10 2.5 2-2.5 2M12.5 15h4\\\"/></svg>\",\n customColor: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"m13 7 4 4M14.5 5.5l1.2-1.2a2.3 2.3 0 0 1 3.3 3.3l-1.2 1.2M14 8l-8.3 8.3-.9 3 3-.9L16.1 10\\\"/></svg>\",\n deleteColumn: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><rect x=\\\"3\\\" y=\\\"4\\\" width=\\\"18\\\" height=\\\"16\\\" rx=\\\"3.5\\\"/><path d=\\\"M8.5 4v16M15.5 4v16\\\"/><path d=\\\"M10.4 10.4l3.2 3.2M13.6 10.4l-3.2 3.2\\\"/></svg>\",\n deleteImage: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M4 7h16M6.5 7l.9 11.6A2 2 0 0 0 9.4 20.5h5.2a2 2 0 0 0 2-1.9L17.5 7M9.5 7V5a1.5 1.5 0 0 1 1.5-1.5h2A1.5 1.5 0 0 1 14.5 5v2M10.5 11v5.5M13.5 11v5.5\\\"/></svg>\",\n deleteRow: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><rect x=\\\"3\\\" y=\\\"4\\\" width=\\\"18\\\" height=\\\"16\\\" rx=\\\"3.5\\\"/><path d=\\\"M3 9.2h18M3 14.8h18\\\"/><path d=\\\"M10.4 10.4l3.2 3.2M13.6 10.4l-3.2 3.2\\\"/></svg>\",\n deleteTable: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><rect x=\\\"3\\\" y=\\\"3\\\" width=\\\"13.5\\\" height=\\\"13.5\\\" rx=\\\"3\\\"/><path d=\\\"M3 8h13.5M8 8v8.5\\\"/><path d=\\\"M16.5 16.5l4 4M20.5 16.5l-4 4\\\"/></svg>\",\n downloadImage: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M12 4v11M7.5 10.5 12 15l4.5-4.5M4 15.5v2.5A2 2 0 0 0 6 20h12a2 2 0 0 0 2-2v-2.5\\\"/></svg>\",\n edit: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M4 20h4L18.3 9.7a2.8 2.8 0 0 0-4-4L4 16zM13 7l4 4\\\"/></svg>\",\n heading1: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M3.5 6v12M11.5 6v12M3.5 12h8M16 9.5 19 7.5V18\\\"/></svg>\",\n heading2: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M3.5 6v12M11.5 6v12M3.5 12h8M15.5 9.5a2.6 2.6 0 0 1 5 .9c0 .8-.4 1.5-1 2.1L15.5 18h5\\\"/></svg>\",\n heading3: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M3.5 6v12M11.5 6v12M3.5 12h8M15.5 7.5h4.8l-2.8 3.6a3.4 3.4 0 1 1-2.3 5.6\\\"/></svg>\",\n highlight: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M9 16.5 5.5 13 14.8 3.7a2.5 2.5 0 0 1 3.5 3.5z M5.5 13 3.5 18.5h4L9 16.5 M13 20.5h7.5\\\"/></svg>\",\n highlightColor: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"m14.5 4.5 5 5-7.8 7.8H6.7v-5z M4 20h16\\\"/></svg>\",\n horizontalRule: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M3 12h18\\\"/><path d=\\\"M7 6.5h10M7 17.5h10\\\" stroke-opacity=\\\".35\\\"/></svg>\",\n image: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><rect x=\\\"3\\\" y=\\\"4\\\" width=\\\"18\\\" height=\\\"16\\\" rx=\\\"3.5\\\"/><circle cx=\\\"8.5\\\" cy=\\\"9.5\\\" r=\\\"1.6\\\"/><path d=\\\"m21 15.5-4.8-4.8L6 20\\\"/></svg>\",\n imageUpload: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M12 15V4M7.5 8.5 12 4l4.5 4.5M4 15.5v2.5A2 2 0 0 0 6 20h12a2 2 0 0 0 2-2v-2.5\\\"/></svg>\",\n italic: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M10 5h8M6 19h8M14.5 5l-5 14\\\"/></svg>\",\n link: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M10 14a4 4 0 0 0 5.66 0l3.17-3.17a4 4 0 0 0-5.66-5.66L12 6.34M14 10a4 4 0 0 0-5.66 0l-3.17 3.17a4 4 0 0 0 5.66 5.66L12 17.66\\\"/></svg>\",\n mergeCells: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M12 4v16M3.5 12H9M6.5 9.5 9 12l-2.5 2.5M20.5 12H15M17.5 9.5 15 12l2.5 2.5\\\"/></svg>\",\n openLink: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M14 4h6v6M20 4l-8.5 8.5M18 14v3.5A2.5 2.5 0 0 1 15.5 20h-9A2.5 2.5 0 0 1 4 17.5v-9A2.5 2.5 0 0 1 6.5 6H10\\\"/></svg>\",\n orderedList: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M10.5 6H20M10.5 12H20M10.5 18H20M4 4.5 5.5 3.8V9M3.8 13.4a1.3 1.3 0 0 1 2.5.4c0 .4-.2.7-.5 1L3.8 17h2.6\\\" stroke-width=\\\"1.8\\\"/></svg>\",\n preview: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M2.5 12S6 5.5 12 5.5 21.5 12 21.5 12 18 18.5 12 18.5 2.5 12 2.5 12z\\\"/><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"3\\\"/></svg>\",\n redo: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M15 13.5 19.5 9 15 4.5M19.5 9H9a5 5 0 0 0 0 10h4\\\"/></svg>\",\n resizeLarge: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><rect x=\\\"3\\\" y=\\\"3\\\" width=\\\"18\\\" height=\\\"18\\\" rx=\\\"3.5\\\" stroke-opacity=\\\".35\\\" stroke-dasharray=\\\"3 3\\\"/><rect x=\\\"5.5\\\" y=\\\"5.5\\\" width=\\\"13\\\" height=\\\"13\\\" rx=\\\"2.5\\\"/></svg>\",\n resizeMedium: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><rect x=\\\"3\\\" y=\\\"3\\\" width=\\\"18\\\" height=\\\"18\\\" rx=\\\"3.5\\\" stroke-opacity=\\\".35\\\" stroke-dasharray=\\\"3 3\\\"/><rect x=\\\"7\\\" y=\\\"7\\\" width=\\\"10\\\" height=\\\"10\\\" rx=\\\"2\\\"/></svg>\",\n resizeOriginal: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M4 9V4h5M4 4l5.5 5.5M20 15v5h-5M20 20l-5.5-5.5\\\"/></svg>\",\n resizeSmall: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><rect x=\\\"3\\\" y=\\\"3\\\" width=\\\"18\\\" height=\\\"18\\\" rx=\\\"3.5\\\" stroke-opacity=\\\".35\\\" stroke-dasharray=\\\"3 3\\\"/><rect x=\\\"9\\\" y=\\\"9\\\" width=\\\"6\\\" height=\\\"6\\\" rx=\\\"1.5\\\"/></svg>\",\n splitCell: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M12 4v16M9 12H3.5M6 9.5 3.5 12 6 14.5M15 12h5.5M18 9.5l2.5 2.5-2.5 2.5\\\"/></svg>\",\n strike: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M16.5 7.2C15.8 5.8 14.2 5 12.2 5 9.7 5 8 6.3 8 8.1c0 1.4.9 2.3 2.4 2.9M4 12h16M7.6 16.8c.7 1.4 2.3 2.2 4.4 2.2 2.6 0 4.5-1.3 4.5-3.3 0-.7-.2-1.3-.6-1.7\\\"/></svg>\",\n subscript: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M4 5.5l8 10M12 5.5l-8 10\\\"/><path d=\\\"M15.5 14.7a1.7 1.7 0 0 1 3.2.8c0 .5-.3 1-.7 1.4l-2.5 2.6h3.5\\\" stroke-width=\\\"1.7\\\"/></svg>\",\n superscript: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M4 8.5l8 10M12 8.5l-8 10\\\"/><path d=\\\"M15.5 5.2a1.7 1.7 0 0 1 3.2.8c0 .5-.3 1-.7 1.4L15.5 10h3.5\\\" stroke-width=\\\"1.7\\\"/></svg>\",\n table: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><rect x=\\\"3\\\" y=\\\"4\\\" width=\\\"18\\\" height=\\\"16\\\" rx=\\\"3.5\\\"/><path d=\\\"M3 9.5h18M3 14.8h18M9.5 9.5V20\\\"/></svg>\",\n tableOfContents: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M4 5h11M8 10h12M8 15h12M4 20h11\\\"/></svg>\",\n textColor: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M6.5 16 12 4l5.5 12M8.4 12h7.2M4 20h16\\\"/></svg>\",\n toggleHeaderColumn: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><rect x=\\\"3\\\" y=\\\"4\\\" width=\\\"18\\\" height=\\\"16\\\" rx=\\\"3.5\\\"/><path d=\\\"M9.5 4H6.5A3.5 3.5 0 0 0 3 7.5v9A3.5 3.5 0 0 0 6.5 20h3z\\\" fill=\\\"currentColor\\\"/><path d=\\\"M9.5 12H21M15.2 4v16\\\"/></svg>\",\n toggleHeaderRow: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><rect x=\\\"3\\\" y=\\\"4\\\" width=\\\"18\\\" height=\\\"16\\\" rx=\\\"3.5\\\"/><path d=\\\"M3 9.5V7.5A3.5 3.5 0 0 1 6.5 4h11A3.5 3.5 0 0 1 21 7.5v2z\\\" fill=\\\"currentColor\\\"/><path d=\\\"M9.5 9.5V20M3 14.8h18\\\"/></svg>\",\n underline: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M7 4v6.5a5 5 0 0 0 10 0V4M5 20h14\\\"/></svg>\",\n undo: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M9 13.5 4.5 9 9 4.5M4.5 9H15a5 5 0 0 1 0 10h-4\\\"/></svg>\",\n unsetColor: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M8 5.8C9.2 4.4 10.5 3.5 12 3.5c1.9 2 5.5 5.7 5.5 9.7 0 .8-.1 1.5-.4 2.2M15.8 17.2A5.5 5.5 0 0 1 6.5 13.2c0-1.8.8-3.6 1.8-5.2M4 4l16 16\\\"/></svg>\",\n unsetLink: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"m13.5 6.5.8-.8a4 4 0 0 1 5.66 5.66l-.8.8M10.5 17.5l-.8.8a4 4 0 0 1-5.66-5.66l.8-.8M4 4l16 16\\\"/></svg>\",\n};\n","import { Editor } from \"@tiptap/core\";\nimport { AteIconKey } from \"../services/ate-icon-registry.service\";\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: AteIconKey;\n command: (editor: Editor) => void | Promise<void>;\n}\n","import { AteTocConfig } from \"../models/ate-toc.model\";\n\n/**\n * Default Table of Contents configuration\n */\nexport const ATE_DEFAULT_TOC_CONFIG: Required<AteTocConfig> = {\n enabled: true,\n floating: true,\n positionMode: \"fixed\",\n position: \"right\",\n variant: \"minimal\",\n hoverExpand: true,\n showTitle: true,\n maxDepth: 6,\n};\n","/*\n * Public API Surface of tiptap-editor\n */\n\n// Main component & Provider\nexport * from \"./lib/components/editor/angular-tiptap-editor.component\";\nexport { AteTableOfContentsComponent } from \"./lib/components/table-of-contents/ate-table-of-contents.component\";\nexport {\n AteTocNodeComponent,\n AteTocNodeOptions,\n getAteTocNodeExtension,\n} from \"./lib/components/table-of-contents/ate-toc-node.component\";\nexport * from \"./lib/ate-editor.provider\";\n\n// Icons\nexport { AteIconComponent } from \"./lib/components/ui/ate-icon.component\";\nexport {\n ATE_DEFAULT_ICONS,\n ATE_MATERIAL_SYMBOLS_VIEWBOX,\n type AteIconName,\n} from \"./lib/icons/ate-default-icons\";\nexport { ATE_STROKE_ICONS } from \"./lib/icons/ate-stroke-icons\";\n\n// Directives\nexport * from \"./lib/directives/ate-noop-value-accessor.directive\";\nexport * from \"./lib/directives/ate-tooltip.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\";\nexport * from \"./lib/services/ate-export.service\";\nexport * from \"./lib/services/ate-editor-registry.service\";\nexport * from \"./lib/services/ate-icon-registry.service\";\nexport * from \"./lib/models/ate-editor-ref\";\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// Extensions\nexport {\n AtePastedImage,\n classifyPastedImageSrc,\n dataUriToFile,\n sanitizePastedImages,\n type AtePastedImageOptions,\n type AtePastedImageSource,\n} from \"./lib/extensions/ate-pasted-image.extension\";\nexport {\n AteLinkShortcut,\n isLinkShortcut,\n type AteLinkShortcutOptions,\n} from \"./lib/extensions/ate-link-shortcut.extension\";\nexport {\n AteBlockShortcuts,\n type AteBlockShortcutsOptions,\n} from \"./lib/extensions/ate-block-shortcuts.extension\";\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-paste.model\";\nexport * from \"./lib/models/ate-bubble-menu.model\";\nexport * from \"./lib/models/ate-editor-config.model\";\nexport * from \"./lib/models/ate-slash-command.model\";\nexport * from \"./lib/models/ate-toc.model\";\n\n// Default configurations\nexport * from \"./lib/config/ate-editor.config\";\nexport * from \"./lib/config/ate-global-config.token\";\nexport * from \"./lib/config/ate-toc.config\";\n\n// Utility functions for slash commands\nexport * from \"./lib/config/ate-slash-commands.config\";\n\n// Translations\nexport type { SupportedLocale } from \"./lib/i18n/ateTranslationsModel\";\n\n// Angular NodeView Integration\nexport { AteAngularNodeView } from \"./lib/node-view/ate-angular-node-view\";\nexport { AteNodeViewRenderer } from \"./lib/node-view/ate-node-view.renderer\";\nexport { createAngularComponentExtension } from \"./lib/node-view/ate-node-view.factory\";\nexport { registerAngularComponent } from \"./lib/node-view/ate-register-angular-component\";\n\n// Node View Types - AteAngularNode is the primary public type\nexport type { AteAngularNode } from \"./lib/models/ate-editor-config.model\";\n// Advanced: Low-level options for full control over node registration\nexport type {\n RegisterAngularComponentOptions,\n AteComponentRenderOptions,\n} from \"./lib/node-view/ate-node-view.models\";\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/utils/ate-image-src-resolver.utils.ts","../../../projects/angular-tiptap-editor/src/lib/extensions/ate-resizable-image.extension.ts","../../../projects/angular-tiptap-editor/src/lib/icons/ate-default-icons.ts","../../../projects/angular-tiptap-editor/src/lib/services/ate-icon-registry.service.ts","../../../projects/angular-tiptap-editor/src/lib/extensions/ate-upload-progress.extension.ts","../../../projects/angular-tiptap-editor/src/lib/models/ate-image.model.ts","../../../projects/angular-tiptap-editor/src/lib/extensions/ate-pasted-image.extension.ts","../../../projects/angular-tiptap-editor/src/lib/extensions/ate-link-shortcut.extension.ts","../../../projects/angular-tiptap-editor/src/lib/extensions/ate-block-shortcuts.extension.ts","../../../projects/angular-tiptap-editor/src/lib/extensions/ate-paste.extension.ts","../../../projects/angular-tiptap-editor/src/lib/extensions/ate-table.extension.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-injector.registry.ts","../../../projects/angular-tiptap-editor/src/lib/node-view/ate-register-angular-component.ts","../../../projects/angular-tiptap-editor/src/lib/models/ate-editor-ref.ts","../../../projects/angular-tiptap-editor/src/lib/services/ate-editor-registry.service.ts","../../../projects/angular-tiptap-editor/src/lib/i18n/en_ateTranslations.ts","../../../projects/angular-tiptap-editor/src/lib/i18n/fr_ateTranslations.ts","../../../projects/angular-tiptap-editor/src/lib/i18n/de_ateTranslations.ts","../../../projects/angular-tiptap-editor/src/lib/i18n/pt_ateTranslations.ts","../../../projects/angular-tiptap-editor/src/lib/i18n/es_ateTranslations.ts","../../../projects/angular-tiptap-editor/src/lib/services/ate-i18n.service.ts","../../../projects/angular-tiptap-editor/src/lib/services/ate-editor-i18n.service.ts","../../../projects/angular-tiptap-editor/src/lib/components/table-of-contents/ate-table-of-contents.component.ts","../../../projects/angular-tiptap-editor/src/lib/components/table-of-contents/ate-toc-node.component.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/directives/ate-tooltip.directive.ts","../../../projects/angular-tiptap-editor/src/lib/components/ui/ate-icon.component.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-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/utils/ate-markdown.utils.ts","../../../projects/angular-tiptap-editor/src/lib/services/ate-export.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/config/ate-editor.config.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/models/ate-bubble-menu.model.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/extensions/ate-block-controls.extension.ts","../../../projects/angular-tiptap-editor/src/lib/components/editor/ate-block-controls.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/config/ate-global-config.token.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/utils/ate-equality.utils.ts","../../../projects/angular-tiptap-editor/src/lib/utils/ate-extensions.utils.ts","../../../projects/angular-tiptap-editor/src/lib/components/editor/angular-tiptap-editor.component.ts","../../../projects/angular-tiptap-editor/src/lib/ate-editor.provider.ts","../../../projects/angular-tiptap-editor/src/lib/icons/ate-stroke-icons.ts","../../../projects/angular-tiptap-editor/src/lib/models/ate-toolbar.model.ts","../../../projects/angular-tiptap-editor/src/lib/config/ate-toc.config.ts","../../../projects/angular-tiptap-editor/src/public-api.ts","../../../projects/angular-tiptap-editor/src/flogeez-angular-tiptap-editor.ts"],"sourcesContent":["import { isDevMode } from \"@angular/core\";\nimport { firstValueFrom, isObservable } from \"rxjs\";\nimport { AteImageSrcResolver } from \"../models/ate-image.model\";\n\nexport async function ateResolveImageSrc(\n resolver: AteImageSrcResolver | null | undefined,\n src: string\n): Promise<string> {\n if (!resolver || !src) {\n return src;\n }\n try {\n const result = resolver(src);\n const resolved = isObservable(result) ? await firstValueFrom(result) : await result;\n if (typeof resolved === \"string\" && resolved) {\n return resolved;\n }\n } catch (error) {\n if (isDevMode()) {\n console.warn(\"[ATE] imageSrcResolver failed, showing the original src instead.\", src, error);\n }\n }\n return src;\n}\n","import { Node, mergeAttributes, nodeInputRule } from \"@tiptap/core\";\nimport { AteImageSrcResolver } from \"../models/ate-image.model\";\nimport { ateResolveImageSrc } from \"../utils/ate-image-src-resolver.utils\";\n\nexport interface AteResizableImageOptions {\n inline: boolean;\n allowBase64: boolean;\n HTMLAttributes: Record<string, unknown>;\n srcResolver: () => AteImageSrcResolver | null | undefined;\n}\n\nexport interface AteResizableImageStorage {\n /** One callback per image node view: re-applies the resolver when it changes */\n srcRefreshers: Set<() => void>;\n}\n\ndeclare module \"@tiptap/core\" {\n interface Storage {\n resizableImage: AteResizableImageStorage;\n }\n\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, AteResizableImageStorage>({\n name: \"resizableImage\",\n\n addOptions() {\n return {\n inline: false,\n allowBase64: false,\n HTMLAttributes: {},\n srcResolver: () => null,\n };\n },\n\n addStorage() {\n return {\n srcRefreshers: new Set(),\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 const options = this.options;\n const storage = this.storage;\n return ({ node, getPos, editor }) => {\n let currentNode = node;\n let requestedSrc: string | null = null;\n let requestedWith: AteImageSrcResolver | null = null;\n let destroyed = false;\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"resizable-image-wrapper\";\n wrapper.style.display = \"block\";\n if (currentNode.attrs[\"textAlign\"]) {\n wrapper.style.textAlign = currentNode.attrs[\"textAlign\"];\n wrapper.setAttribute(\"data-align\", currentNode.attrs[\"textAlign\"]);\n }\n\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.alt = currentNode.attrs[\"alt\"] || \"\";\n img.title = currentNode.attrs[\"title\"] || \"\";\n img.className = \"ate-image\";\n img.style.display = \"inline-block\"; // Ensure it respects container text-align\n\n if (currentNode.attrs[\"width\"]) {\n img.width = currentNode.attrs[\"width\"];\n }\n if (currentNode.attrs[\"height\"]) {\n img.height = currentNode.attrs[\"height\"];\n }\n\n const applySrc = (src: string | null) => {\n const resolver = options.srcResolver() ?? null;\n if (!resolver || !src) {\n requestedSrc = null;\n requestedWith = null;\n img.src = src ?? \"\";\n return;\n }\n if (src === requestedSrc && resolver === requestedWith) {\n return;\n }\n // A new resolver for the same src keeps the current image until the new URL is ready, so it does not blink\n if (src !== requestedSrc) {\n img.removeAttribute(\"src\");\n }\n requestedSrc = src;\n requestedWith = resolver;\n ateResolveImageSrc(resolver, src).then(resolved => {\n if (!destroyed && requestedSrc === src && requestedWith === resolver) {\n img.src = resolved;\n }\n });\n };\n const refreshSrc = () => applySrc(currentNode.attrs[\"src\"]);\n refreshSrc();\n storage.srcRefreshers.add(refreshSrc);\n\n wrapper.appendChild(container);\n container.appendChild(img);\n\n // Allow selection in read-only mode to show bubble menu/download\n img.addEventListener(\"click\", e => {\n if (!editor.isEditable) {\n e.preventDefault();\n e.stopPropagation();\n const pos = getPos();\n if (typeof pos === \"number\") {\n editor.commands.setNodeSelection(pos);\n editor.view.focus();\n }\n }\n });\n\n // Add modern resize controls\n const resizeControls = document.createElement(\"div\");\n resizeControls.className = \"resize-controls\";\n\n // Create 2 handles (sides only) for a minimalist UI\n const handles = [\"w\", \"e\"];\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 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\n // Use current image dimensions instead of initial ones\n startWidth =\n parseInt(img.getAttribute(\"width\") || \"0\") ||\n currentNode.attrs[\"width\"] ||\n img.naturalWidth;\n startHeight =\n parseInt(img.getAttribute(\"height\") || \"0\") ||\n currentNode.attrs[\"height\"] ||\n img.naturalHeight;\n\n // Add resizing class to body\n document.body.classList.add(\"resizing\");\n\n const handleMouseMove = (e: MouseEvent) => {\n if (!isResizing) {\n return;\n }\n\n const deltaX = e.clientX - startX;\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 }\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 at the specific position\n const pos = typeof getPos === \"function\" ? getPos() : undefined;\n if (typeof pos === \"number\") {\n const finalWidth = parseInt(img.getAttribute(\"width\") || \"0\");\n const finalHeight = parseInt(img.getAttribute(\"height\") || \"0\");\n\n if (finalWidth && finalHeight) {\n editor.view.dispatch(\n editor.view.state.tr.setNodeMarkup(pos, undefined, {\n ...currentNode.attrs,\n width: finalWidth,\n height: finalHeight,\n })\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 wrapper.classList.add(\"selected\");\n container.classList.add(\"selected\");\n img.classList.add(\"selected\");\n };\n\n const deselectNode = () => {\n wrapper.classList.remove(\"selected\");\n container.classList.remove(\"selected\");\n img.classList.remove(\"selected\");\n };\n\n return {\n dom: wrapper,\n selectNode,\n deselectNode,\n update: updatedNode => {\n if (updatedNode.type.name !== \"resizableImage\") {\n return false;\n }\n\n currentNode = updatedNode;\n\n applySrc(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 if (updatedNode.attrs[\"textAlign\"]) {\n wrapper.style.textAlign = updatedNode.attrs[\"textAlign\"];\n wrapper.setAttribute(\"data-align\", updatedNode.attrs[\"textAlign\"]);\n } else {\n wrapper.style.textAlign = \"\";\n wrapper.removeAttribute(\"data-align\");\n }\n\n return true;\n },\n stopEvent: (event: Event) => {\n const target = event.target as HTMLElement;\n return !!target.closest(\".resize-controls\");\n },\n ignoreMutation: () => true,\n destroy: () => {\n destroyed = true;\n storage.srcRefreshers.delete(refreshSrc);\n },\n };\n };\n },\n});\n","// Generated by scripts/generate-ate-icons.mjs, do not edit by hand.\n// Material Symbols Outlined (weight 400) by Google, Apache License 2.0 (see THIRD_PARTY_LICENSES).\n\n/** ViewBox shared by every Material Symbols SVG */\nexport const ATE_MATERIAL_SYMBOLS_VIEWBOX = \"0 -960 960 960\";\n\nconst ADD = \"<path d=\\\"M440-440H200v-80h240v-240h80v240h240v80H520v240h-80v-240Z\\\"/>\";\nconst ADD_COLUMN_LEFT = \"<path d=\\\"M800-200v-560H560v560h240Zm-640 80v-160h80v80h240v-560H240v80h-80v-160h720v720H160Zm320-360Zm80 0h-80 80Zm0 0ZM160-360v-80H80v-80h80v-80h80v80h80v80h-80v80h-80Z\\\"/>\";\nconst ADD_COLUMN_RIGHT = \"<path d=\\\"M160-760v560h240v-560H160ZM80-120v-720h720v160h-80v-80H480v560h240v-80h80v160H80Zm400-360Zm-80 0h80-80Zm0 0Zm320 120v-80h-80v-80h80v-80h80v80h80v80h-80v80h-80Z\\\"/>\";\nconst ADD_ROW_ABOVE = \"<path d=\\\"M200-160h560v-240H200v240Zm640 80H120v-720h160v80h-80v240h560v-240h-80v-80h160v720ZM480-480Zm0 80v-80 80Zm0 0Zm-40-240v-80h-80v-80h80v-80h80v80h80v80h-80v80h-80Z\\\"/>\";\nconst ADD_ROW_BELOW = \"<path d=\\\"M200-560h560v-240H200v240Zm-80 400v-720h720v720H680v-80h80v-240H200v240h80v80H120Zm360-320Zm0-80v80-80Zm0 0ZM440-80v-80h-80v-80h80v-80h80v80h80v80h-80v80h-80Z\\\"/>\";\nconst CELL_MERGE = \"<path d=\\\"M120-120v-240h80v160h160v80H120Zm480 0v-80h160v-160h80v240H600ZM287-327l-57-56 57-57H80v-80h207l-57-57 57-56 153 153-153 153Zm386 0L520-480l153-153 57 56-57 57h207v80H673l57 57-57 56ZM120-600v-240h240v80H200v160h-80Zm640 0v-160H600v-80h240v240h-80Z\\\"/>\";\nconst CHECK = \"<path d=\\\"M382-240 154-468l57-57 171 171 367-367 57 57-424 424Z\\\"/>\";\nconst CLOSE = \"<path d=\\\"m256-200-56-56 224-224-224-224 56-56 224 224 224-224 56 56-224 224 224 224-56 56-224-224-224 224Z\\\"/>\";\nconst CODE = \"<path d=\\\"M320-240 80-480l240-240 57 57-184 184 183 183-56 56Zm320 0-57-57 184-184-183-183 56-56 240 240-240 240Z\\\"/>\";\nconst COLORIZE = \"<path d=\\\"M120-120v-190l358-358-58-56 58-56 76 76 124-124q5-5 12.5-8t15.5-3q8 0 15 3t13 8l94 94q5 6 8 13t3 15q0 8-3 15.5t-8 12.5L705-555l76 78-57 57-56-58-358 358H120Zm80-80h78l332-334-76-76-334 332v78Zm447-410 96-96-37-37-96 96 37 37Zm0 0-37-37 37 37Z\\\"/>\";\nconst CROP_SQUARE = \"<path d=\\\"M200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v560q0 33-23.5 56.5T760-120H200Zm0-80h560v-560H200v560Zm0 0v-560 560Z\\\"/>\";\nconst DELETE = \"<path d=\\\"M280-120q-33 0-56.5-23.5T200-200v-520h-40v-80h200v-40h240v40h200v80h-40v520q0 33-23.5 56.5T680-120H280Zm400-600H280v520h400v-520ZM360-280h80v-360h-80v360Zm160 0h80v-360h-80v360ZM280-720v520-520Z\\\"/>\";\nconst DELETE_FOREVER = \"<path d=\\\"m376-300 104-104 104 104 56-56-104-104 104-104-56-56-104 104-104-104-56 56 104 104-104 104 56 56Zm-96 180q-33 0-56.5-23.5T200-200v-520h-40v-80h200v-40h240v40h200v80h-40v520q0 33-23.5 56.5T680-120H280Zm400-600H280v520h400v-520Zm-400 0v520-520Z\\\"/>\";\nconst DOCK_TO_RIGHT = \"<path d=\\\"M200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v560q0 33-23.5 56.5T760-120H200Zm120-80v-560H200v560h120Zm80 0h360v-560H400v560Zm-80 0H200h120Z\\\"/>\";\nconst DOWNLOAD = \"<path d=\\\"M480-320 280-520l56-58 104 104v-326h80v326l104-104 56 58-200 200ZM240-160q-33 0-56.5-23.5T160-240v-120h80v120h480v-120h80v120q0 33-23.5 56.5T720-160H240Z\\\"/>\";\nconst DRAG_INDICATOR = \"<path d=\\\"M360-160q-33 0-56.5-23.5T280-240q0-33 23.5-56.5T360-320q33 0 56.5 23.5T440-240q0 33-23.5 56.5T360-160Zm240 0q-33 0-56.5-23.5T520-240q0-33 23.5-56.5T600-320q33 0 56.5 23.5T680-240q0 33-23.5 56.5T600-160ZM360-400q-33 0-56.5-23.5T280-480q0-33 23.5-56.5T360-560q33 0 56.5 23.5T440-480q0 33-23.5 56.5T360-400Zm240 0q-33 0-56.5-23.5T520-480q0-33 23.5-56.5T600-560q33 0 56.5 23.5T680-480q0 33-23.5 56.5T600-400ZM360-640q-33 0-56.5-23.5T280-720q0-33 23.5-56.5T360-800q33 0 56.5 23.5T440-720q0 33-23.5 56.5T360-640Zm240 0q-33 0-56.5-23.5T520-720q0-33 23.5-56.5T600-800q33 0 56.5 23.5T680-720q0 33-23.5 56.5T600-640Z\\\"/>\";\nconst DRIVE_FILE_RENAME_OUTLINE = \"<path d=\\\"m400-120 160-160h320v160H400Zm-240-80h57l391-391-57-57-391 391v57Zm-80 80v-170l528-527q12-11 26.5-17t30.5-6q16 0 31 6t26 18l55 56q12 11 17.5 26t5.5 30q0 16-5.5 30.5T777-647L250-120H80Zm640-584-56-56 56 56Zm-141 85-28-29 57 57-29-28Z\\\"/>\";\nconst EDIT = \"<path d=\\\"M200-200h57l391-391-57-57-391 391v57Zm-80 80v-170l528-527q12-11 26.5-17t30.5-6q16 0 31 6t26 18l55 56q12 11 17.5 26t5.5 30q0 16-5.5 30.5T817-647L290-120H120Zm640-584-56-56 56 56Zm-141 85-28-29 57 57-29-28Z\\\"/>\";\nconst FORMAT_ALIGN_CENTER = \"<path d=\\\"M120-120v-80h720v80H120Zm160-160v-80h400v80H280ZM120-440v-80h720v80H120Zm160-160v-80h400v80H280ZM120-760v-80h720v80H120Z\\\"/>\";\nconst FORMAT_ALIGN_JUSTIFY = \"<path d=\\\"M120-120v-80h720v80H120Zm0-160v-80h720v80H120Zm0-160v-80h720v80H120Zm0-160v-80h720v80H120Zm0-160v-80h720v80H120Z\\\"/>\";\nconst FORMAT_ALIGN_LEFT = \"<path d=\\\"M120-120v-80h720v80H120Zm0-160v-80h480v80H120Zm0-160v-80h720v80H120Zm0-160v-80h480v80H120Zm0-160v-80h720v80H120Z\\\"/>\";\nconst FORMAT_ALIGN_RIGHT = \"<path d=\\\"M120-760v-80h720v80H120Zm240 160v-80h480v80H360ZM120-440v-80h720v80H120Zm240 160v-80h480v80H360ZM120-120v-80h720v80H120Z\\\"/>\";\nconst FORMAT_BOLD = \"<path d=\\\"M272-200v-560h221q65 0 120 40t55 111q0 51-23 78.5T602-491q25 11 55.5 41t30.5 90q0 89-65 124.5T501-200H272Zm121-112h104q48 0 58.5-24.5T566-372q0-11-10.5-35.5T494-432H393v120Zm0-228h93q33 0 48-17t15-38q0-24-17-39t-44-15h-95v109Z\\\"/>\";\nconst FORMAT_COLOR_FILL = \"<path d=\\\"m247-904 57-56 343 343q23 23 23 57t-23 57L457-313q-23 23-57 23t-57-23L153-503q-23-23-23-57t23-57l190-191-96-96Zm153 153L209-560h382L400-751Zm303.5 447.5Q680-327 680-360q0-21 12.5-45t27.5-45q9-12 19-25t21-25q11 12 21 25t19 25q15 21 27.5 45t12.5 45q0 33-23.5 56.5T760-280q-33 0-56.5-23.5ZM80 0v-160h800V0H80Z\\\"/>\";\nconst FORMAT_COLOR_RESET = \"<path d=\\\"M800-436q0 36-8 69t-22 63l-62-60q6-17 9-34.5t3-37.5q0-47-17.5-89T650-600L480-768l-88 86-56-56 144-142 226 222q44 42 69 99.5T800-436Zm-8 380L668-180q-41 29-88 44.5T480-120q-133 0-226.5-92.5T160-436q0-51 16-98t48-90L56-792l56-56 736 736-56 56ZM480-200q36 0 68.5-10t61.5-28L280-566q-21 32-30.5 64t-9.5 66q0 98 70 167t170 69Zm-37-204Zm110-116Z\\\"/>\";\nconst FORMAT_COLOR_TEXT = \"<path d=\\\"M80 0v-160h800V0H80Zm140-280 210-560h100l210 560h-96l-50-144H368l-52 144h-96Zm176-224h168l-82-232h-4l-82 232Z\\\"/>\";\nconst FORMAT_H1 = \"<path d=\\\"M200-280v-400h80v160h160v-160h80v400h-80v-160H280v160h-80Zm480 0v-320h-80v-80h160v400h-80Z\\\"/>\";\nconst FORMAT_H2 = \"<path d=\\\"M120-280v-400h80v160h160v-160h80v400h-80v-160H200v160h-80Zm400 0v-160q0-33 23.5-56.5T600-520h160v-80H520v-80h240q33 0 56.5 23.5T840-600v80q0 33-23.5 56.5T760-440H600v80h240v80H520Z\\\"/>\";\nconst FORMAT_H3 = \"<path d=\\\"M120-280v-400h80v160h160v-160h80v400h-80v-160H200v160h-80Zm400 0v-80h240v-80H600v-80h160v-80H520v-80h240q33 0 56.5 23.5T840-600v240q0 33-23.5 56.5T760-280H520Z\\\"/>\";\nconst FORMAT_ITALIC = \"<path d=\\\"M200-200v-100h160l120-360H320v-100h400v100H580L460-300h140v100H200Z\\\"/>\";\nconst FORMAT_LIST_BULLETED = \"<path d=\\\"M360-200v-80h480v80H360Zm0-240v-80h480v80H360Zm0-240v-80h480v80H360ZM200-160q-33 0-56.5-23.5T120-240q0-33 23.5-56.5T200-320q33 0 56.5 23.5T280-240q0 33-23.5 56.5T200-160Zm0-240q-33 0-56.5-23.5T120-480q0-33 23.5-56.5T200-560q33 0 56.5 23.5T280-480q0 33-23.5 56.5T200-400Zm-56.5-263.5Q120-687 120-720t23.5-56.5Q167-800 200-800t56.5 23.5Q280-753 280-720t-23.5 56.5Q233-640 200-640t-56.5-23.5Z\\\"/>\";\nconst FORMAT_LIST_NUMBERED = \"<path d=\\\"M120-80v-60h100v-30h-60v-60h60v-30H120v-60h120q17 0 28.5 11.5T280-280v40q0 17-11.5 28.5T240-200q17 0 28.5 11.5T280-160v40q0 17-11.5 28.5T240-80H120Zm0-280v-110q0-17 11.5-28.5T160-510h60v-30H120v-60h120q17 0 28.5 11.5T280-560v70q0 17-11.5 28.5T240-450h-60v30h100v60H120Zm60-280v-180h-60v-60h120v240h-60Zm180 440v-80h480v80H360Zm0-240v-80h480v80H360Zm0-240v-80h480v80H360Z\\\"/>\";\nconst FORMAT_QUOTE = \"<path d=\\\"m228-240 92-160q-66 0-113-47t-47-113q0-66 47-113t113-47q66 0 113 47t47 113q0 23-5.5 42.5T458-480L320-240h-92Zm360 0 92-160q-66 0-113-47t-47-113q0-66 47-113t113-47q66 0 113 47t47 113q0 23-5.5 42.5T818-480L680-240h-92ZM362.5-517.5Q380-535 380-560t-17.5-42.5Q345-620 320-620t-42.5 17.5Q260-585 260-560t17.5 42.5Q295-500 320-500t42.5-17.5Zm360 0Q740-535 740-560t-17.5-42.5Q705-620 680-620t-42.5 17.5Q620-585 620-560t17.5 42.5Q655-500 680-500t42.5-17.5ZM680-560Zm-360 0Z\\\"/>\";\nconst FORMAT_UNDERLINED = \"<path d=\\\"M200-120v-80h560v80H200Zm123-223q-56-63-56-167v-330h103v336q0 56 28 91t82 35q54 0 82-35t28-91v-336h103v330q0 104-56 167t-157 63q-101 0-157-63Z\\\"/>\";\nconst HIGHLIGHT = \"<path d=\\\"m226-640-86-84 56-58 86 86-56 56Zm214-120v-120h80v120h-80Zm296 120-58-56 86-84 56 56-84 84ZM360-80v-200L240-400v-200h480v200L600-280v200H360Zm80-80h80v-153l120-120v-87H320v87l120 120v153Zm40-180Z\\\"/>\";\nconst HORIZONTAL_RULE = \"<path d=\\\"M160-440v-80h640v80H160Z\\\"/>\";\nconst IMAGE = \"<path d=\\\"M200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v560q0 33-23.5 56.5T760-120H200Zm0-80h560v-560H200v560Zm40-80h480L570-480 450-320l-90-120-120 160Zm-40 80v-560 560Z\\\"/>\";\nconst LINK = \"<path d=\\\"M440-280H280q-83 0-141.5-58.5T80-480q0-83 58.5-141.5T280-680h160v80H280q-50 0-85 35t-35 85q0 50 35 85t85 35h160v80ZM320-440v-80h320v80H320Zm200 160v-80h160q50 0 85-35t35-85q0-50-35-85t-85-35H520v-80h160q83 0 141.5 58.5T880-480q0 83-58.5 141.5T680-280H520Z\\\"/>\";\nconst LINK_OFF = \"<path d=\\\"m770-302-60-62q40-11 65-42.5t25-73.5q0-50-35-85t-85-35H520v-80h160q83 0 141.5 58.5T880-480q0 57-29.5 105T770-302ZM634-440l-80-80h86v80h-6ZM792-56 56-792l56-56 736 736-56 56ZM440-280H280q-83 0-141.5-58.5T80-480q0-69 42-123t108-71l74 74h-24q-50 0-85 35t-35 85q0 50 35 85t85 35h160v80ZM320-440v-80h65l79 80H320Z\\\"/>\";\nconst OPEN_IN_NEW = \"<path d=\\\"M200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h280v80H200v560h560v-280h80v280q0 33-23.5 56.5T760-120H200Zm188-212-56-56 372-372H560v-80h280v280h-80v-144L388-332Z\\\"/>\";\nconst PHOTO = \"<path d=\\\"M200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v560q0 33-23.5 56.5T760-120H200Zm0-80h560v-560H200v560Zm40-80h480L570-480 450-320l-90-120-120 160Zm-40 80v-560 560Z\\\"/>\";\nconst REDO = \"<path d=\\\"M396-200q-97 0-166.5-63T160-420q0-94 69.5-157T396-640h252L544-744l56-56 200 200-200 200-56-56 104-104H396q-63 0-109.5 40T240-420q0 60 46.5 100T396-280h284v80H396Z\\\"/>\";\nconst SPLIT_SCENE = \"<path d=\\\"M200-160q-33 0-56.5-23.5T120-240v-480q0-33 23.5-56.5T200-800h160v80H200v480h160v80H200Zm240 80v-800h80v80h240q33 0 56.5 23.5T840-720v480q0 33-23.5 56.5T760-160H520v80h-80Zm80-160h240v-480H520v480Zm-320 0v-480 480Zm560 0v-480 480Z\\\"/>\";\nconst STRIKETHROUGH_S = \"<path d=\\\"M486-160q-76 0-135-45t-85-123l88-38q14 48 48.5 79t85.5 31q42 0 76-20t34-64q0-18-7-33t-19-27h112q5 14 7.5 28.5T694-340q0 86-61.5 133T486-160ZM80-480v-80h800v80H80Zm402-326q66 0 115.5 32.5T674-674l-88 39q-9-29-33.5-52T484-710q-41 0-68 18.5T386-640h-96q2-69 54.5-117.5T482-806Z\\\"/>\";\nconst SUBSCRIPT = \"<path d=\\\"M760-160v-80q0-17 11.5-28.5T800-280h80v-40H760v-40h120q17 0 28.5 11.5T920-320v40q0 17-11.5 28.5T880-240h-80v40h120v40H760Zm-525-80 185-291-172-269h106l124 200h4l123-200h107L539-531l186 291H618L482-457h-4L342-240H235Z\\\"/>\";\nconst SUPERSCRIPT = \"<path d=\\\"M760-600v-80q0-17 11.5-28.5T800-720h80v-40H760v-40h120q17 0 28.5 11.5T920-760v40q0 17-11.5 28.5T880-680h-80v40h120v40H760ZM235-160l185-291-172-269h106l124 200h4l123-200h107L539-451l186 291H618L482-377h-4L342-160H235Z\\\"/>\";\nconst TABLE_VIEW = \"<path d=\\\"M320-80q-33 0-56.5-23.5T240-160v-480q0-33 23.5-56.5T320-720h480q33 0 56.5 23.5T880-640v480q0 33-23.5 56.5T800-80H320Zm0-80h200v-120H320v120Zm280 0h200v-120H600v120ZM80-240v-560q0-33 23.5-56.5T160-880h560v80H160v560H80Zm240-120h200v-120H320v120Zm280 0h200v-120H600v120ZM320-560h480v-80H320v80Z\\\"/>\";\nconst TERMINAL = \"<path d=\\\"M160-160q-33 0-56.5-23.5T80-240v-480q0-33 23.5-56.5T160-800h640q33 0 56.5 23.5T880-720v480q0 33-23.5 56.5T800-160H160Zm0-80h640v-400H160v400Zm140-40-56-56 103-104-104-104 57-56 160 160-160 160Zm180 0v-80h240v80H480Z\\\"/>\";\nconst TOOLBAR = \"<path d=\\\"M200-120q-33 0-56.5-23.5T120-200v-560q0-33 23.5-56.5T200-840h560q33 0 56.5 23.5T840-760v560q0 33-23.5 56.5T760-120H200Zm0-520h560v-120H200v120Zm560 80H200v360h560v-360Zm-560-80v80-80Zm0 0v-120 120Zm0 80v360-360Z\\\"/>\";\nconst UNDO = \"<path d=\\\"M280-200v-80h284q63 0 109.5-40T720-420q0-60-46.5-100T564-560H312l104 104-56 56-200-200 200-200 56 56-104 104h252q97 0 166.5 63T800-420q0 94-69.5 157T564-200H280Z\\\"/>\";\nconst VISIBILITY = \"<path d=\\\"M607.5-372.5Q660-425 660-500t-52.5-127.5Q555-680 480-680t-127.5 52.5Q300-575 300-500t52.5 127.5Q405-320 480-320t127.5-52.5Zm-204-51Q372-455 372-500t31.5-76.5Q435-608 480-608t76.5 31.5Q588-545 588-500t-31.5 76.5Q525-392 480-392t-76.5-31.5ZM214-281.5Q94-363 40-500q54-137 174-218.5T480-800q146 0 266 81.5T920-500q-54 137-174 218.5T480-200q-146 0-266-81.5ZM480-500Zm207.5 160.5Q782-399 832-500q-50-101-144.5-160.5T480-720q-113 0-207.5 59.5T128-500q50 101 144.5 160.5T480-280q113 0 207.5-59.5Z\\\"/>\";\n\n/** Inner SVG markup of the library icons, keyed by what they do */\nexport const ATE_DEFAULT_ICONS = {\n bold: FORMAT_BOLD,\n italic: FORMAT_ITALIC,\n underline: FORMAT_UNDERLINED,\n strike: STRIKETHROUGH_S,\n code: CODE,\n superscript: SUPERSCRIPT,\n subscript: SUBSCRIPT,\n highlight: HIGHLIGHT,\n link: LINK,\n heading1: FORMAT_H1,\n heading2: FORMAT_H2,\n heading3: FORMAT_H3,\n bulletList: FORMAT_LIST_BULLETED,\n orderedList: FORMAT_LIST_NUMBERED,\n blockquote: FORMAT_QUOTE,\n codeBlock: TERMINAL,\n horizontalRule: HORIZONTAL_RULE,\n image: IMAGE,\n table: TABLE_VIEW,\n tableOfContents: FORMAT_LIST_BULLETED,\n alignLeft: FORMAT_ALIGN_LEFT,\n alignCenter: FORMAT_ALIGN_CENTER,\n alignRight: FORMAT_ALIGN_RIGHT,\n alignJustify: FORMAT_ALIGN_JUSTIFY,\n textColor: FORMAT_COLOR_TEXT,\n highlightColor: FORMAT_COLOR_FILL,\n customColor: COLORIZE,\n unsetColor: FORMAT_COLOR_RESET,\n openLink: OPEN_IN_NEW,\n unsetLink: LINK_OFF,\n changeImage: DRIVE_FILE_RENAME_OUTLINE,\n downloadImage: DOWNLOAD,\n resizeSmall: CROP_SQUARE,\n resizeMedium: CROP_SQUARE,\n resizeLarge: CROP_SQUARE,\n resizeOriginal: PHOTO,\n deleteImage: DELETE,\n imageUpload: IMAGE,\n addRowBefore: ADD_ROW_ABOVE,\n addRowAfter: ADD_ROW_BELOW,\n deleteRow: DELETE,\n addColumnBefore: ADD_COLUMN_LEFT,\n addColumnAfter: ADD_COLUMN_RIGHT,\n deleteColumn: DELETE,\n toggleHeaderRow: TOOLBAR,\n toggleHeaderColumn: DOCK_TO_RIGHT,\n deleteTable: DELETE_FOREVER,\n mergeCells: CELL_MERGE,\n splitCell: SPLIT_SCENE,\n undo: UNDO,\n redo: REDO,\n clearContent: DELETE,\n blockAdd: ADD,\n blockDrag: DRAG_INDICATOR,\n edit: EDIT,\n preview: VISIBILITY,\n apply: CHECK,\n clear: CLOSE,\n} as const satisfies Record<string, string>;\n\n/** Name of an icon used by the library */\nexport type AteIconName = keyof typeof ATE_DEFAULT_ICONS;\n","import { Injectable, InjectionToken, inject, signal } from \"@angular/core\";\nimport {\n ATE_DEFAULT_ICONS,\n ATE_MATERIAL_SYMBOLS_VIEWBOX,\n AteIconName,\n} from \"../icons/ate-default-icons\";\n\n/**\n * An icon name: a library icon (autocompleted), a custom registered icon,\n * or any Material Symbols name rendered with the font.\n */\nexport type AteIconKey = AteIconName | (string & {});\n\n/**\n * Icons keyed by name. Library icons are keyed by what they do (`bold`, `addRowBefore`…).\n * Each value is SVG markup:\n * - a full `<svg>` element (any viewBox), used as-is: it keeps its own `fill` and `stroke`\n * (use `currentColor` in them to follow the text color, e.g. stroke icons like Lucide);\n * - or only its inner markup (`<path d=\"…\"/>`), drawn in the Material Symbols viewBox\n * (`0 -960 960 960`) and filled with `currentColor`.\n *\n * Icons are sized with `1em`.\n */\nexport type AteIcons = Partial<Record<AteIconName, string>> & Record<string, string>;\n\n/**\n * Injection Token for the icons registered with `provideAteIcons()`.\n */\nexport const ATE_ICONS = new InjectionToken<AteIcons[]>(\"ATE_ICONS\");\n\n/**\n * A root-level registry resolving icon names to SVG markup.\n *\n * The library ships the SVG of every icon it uses, so the Material Symbols font is not required.\n * Names that are not registered fall back to the Material Symbols font ligature: load the font\n * to use any Material Symbols name in custom toolbar items, bubble menus or slash commands.\n */\n@Injectable({\n providedIn: \"root\",\n})\nexport class AteIconRegistry {\n private readonly _icons = signal<Record<string, string>>(\n Object.assign({}, ATE_DEFAULT_ICONS, ...(inject(ATE_ICONS, { optional: true }) ?? []))\n );\n\n /**\n * Register or override icons at runtime.\n */\n register(icons: AteIcons): void {\n this._icons.update(current => ({ ...current, ...icons }));\n }\n\n /**\n * Full SVG markup of an icon, or null when it is not registered.\n * Reactive when called inside a computed or an effect.\n */\n svg(name: AteIconKey): string | null {\n const icon = this._icons()[name];\n if (!icon) {\n return null;\n }\n return icon.trimStart().startsWith(\"<svg\")\n ? icon\n : `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"${ATE_MATERIAL_SYMBOLS_VIEWBOX}\" fill=\"currentColor\">${icon}</svg>`;\n }\n\n /**\n * Markup drawing an icon: its SVG, or the Material Symbols font ligature when it is not registered.\n */\n markup(name: AteIconKey): string {\n return this.svg(name) ?? `<span class=\"material-symbols-outlined\">${escapeHtml(name)}</span>`;\n }\n\n /**\n * HTML of an icon for contexts outside Angular templates (ProseMirror widgets, raw HTML).\n */\n html(name: AteIconKey, className = \"\"): string {\n const classes = escapeHtml(`ate-icon ${className}`.trim());\n return `<span class=\"${classes}\" aria-hidden=\"true\">${this.markup(name)}</span>`;\n }\n}\n\nfunction escapeHtml(value: string): string {\n return value.replace(\n /[&<>\"']/g,\n char => ({ \"&\": \"&amp;\", \"<\": \"&lt;\", \">\": \"&gt;\", '\"': \"&quot;\", \"'\": \"&#39;\" })[char]!\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 /** HTML of the icon shown while uploading */\n iconHtml: () => 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 iconHtml: () => \"\",\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 ${options.iconHtml()}\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 .ate-icon {\n display: inline-flex;\n width: 1em;\n height: 1em;\n font-size: 24px;\n }\n .upload-icon .ate-icon > svg {\n width: 100%;\n height: 100%;\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 ${options.iconHtml()}\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 { Observable } from \"rxjs\";\n\nexport interface AteImageData {\n src: string;\n alt?: string;\n title?: string;\n width?: number;\n height?: number;\n}\n\nexport interface AteImageUploadResult {\n src: string;\n name: string;\n size: number;\n type: string;\n width?: number;\n height?: number;\n originalSize?: number;\n}\n\n/** Why an image failed validation: its type is not in `allowedTypes`, or it exceeds `maxSize` */\nexport type AteImageValidationReason = \"invalid-type\" | \"too-large\";\n\n/**\n * Thrown when an image fails validation, before compression and before `imageUploadHandler` runs.\n * `message` is the translated, user-facing text.\n */\nexport class AteImageValidationError extends Error {\n constructor(\n readonly reason: AteImageValidationReason,\n message: string\n ) {\n super(message);\n this.name = \"AteImageValidationError\";\n }\n}\n\n/** Where a rejected image file came from */\nexport type AteImageSource = \"paste\" | \"drop\" | \"picker\" | \"api\";\n\n/**\n * Emitted when an image file cannot be inserted.\n * - `invalid-type`: the file type is not in `allowedTypes`\n * - `too-large`: the file exceeds `maxSize`\n * - `upload-failed`: processing or `imageUploadHandler` failed\n *\n * `source` is `paste` (clipboard file), `drop`, `picker` (toolbar, slash menu, image bubble menu)\n * or `api` (`uploadImage`).\n */\nexport interface AteImageRejection {\n reason: AteImageValidationReason | \"upload-failed\";\n file: File;\n source: AteImageSource;\n}\n\n/**\n * Emitted when an image found in pasted HTML cannot be kept.\n * - `unreachable`: the page cannot load its source (e.g. `attachment:`, `file:`, `cid:`, foreign `blob:`, malformed base64)\n * - `invalid-type`: a pasted base64 image has a type that is not in `allowedTypes`\n * - `too-large`: a pasted base64 image exceeds `maxSize`\n * - `upload-failed`: a pasted base64 image was rejected by the upload handler\n */\nexport interface AtePastedImageRejection {\n reason: \"unreachable\" | AteImageValidationReason | \"upload-failed\";\n src: string;\n}\n\nexport interface AteResizeOptions {\n width?: number;\n height?: number;\n maintainAspectRatio?: boolean;\n}\n\nexport interface AteImageUploadOptions {\n quality?: number;\n maxWidth?: number;\n maxHeight?: number;\n maxSize?: number; // in bytes\n allowedTypes?: string[];\n}\n\n/**\n * Context passed to the image upload handler containing information about the image\n */\nexport interface AteImageUploadContext {\n /** Original file being uploaded */\n file: File;\n /** Width of the processed image */\n width: number;\n /** Height of the processed image */\n height: number;\n /** MIME type of the image */\n type: string;\n /** Base64 data URL of the processed image (after compression/resize) */\n base64: string;\n}\n\n/**\n * Result expected from a custom image upload handler.\n * Must contain at least the `src` property with the image URL.\n */\nexport interface AteImageUploadHandlerResult {\n /** URL of the uploaded image (can be a remote URL or any string) */\n src: string;\n /** Optional custom alt text */\n alt?: string;\n /** Optional custom title */\n title?: string;\n}\n\n/**\n * Custom handler function for image uploads.\n * Allows users to implement their own image storage logic (e.g., upload to S3, Cloudinary, etc.)\n *\n * Can return either a Promise or an Observable (Angular-friendly).\n *\n * @param context - Context containing the image file and metadata\n * @returns Promise or Observable resolving to ImageUploadHandlerResult\n *\n * @example Using Promise (async/await)\n * ```typescript\n * uploadHandler: ImageUploadHandler = async (ctx) => {\n * const formData = new FormData();\n * formData.append('image', ctx.file);\n * const result = await firstValueFrom(this.http.post<{url: string}>('/api/upload', formData));\n * return { src: result.url };\n * };\n * ```\n *\n * @example Using Observable (Angular HttpClient)\n * ```typescript\n * uploadHandler: ImageUploadHandler = (ctx) => {\n * const formData = new FormData();\n * formData.append('image', ctx.file);\n * return this.http.post<{url: string}>('/api/upload', formData).pipe(\n * map(result => ({ src: result.url }))\n * );\n * };\n * ```\n */\nexport type AteImageUploadHandler = (\n context: AteImageUploadContext\n) => Promise<AteImageUploadHandlerResult> | Observable<AteImageUploadHandlerResult>;\n\n/**\n * Interface dedicated to image upload configuration.\n */\nexport interface AteImageUploadConfig {\n /** Callback function to handle upload (Promise or Observable) */\n handler?: AteImageUploadHandler;\n /** Compression quality (0 to 1) */\n quality?: number;\n /** Maximum allowed width in pixels */\n maxWidth?: number;\n /** Maximum allowed height in pixels */\n maxHeight?: number;\n /** Maximum allowed size in MB */\n maxSize?: number;\n /** Accepted file types (e.g., ['image/jpeg', 'image/png']) */\n allowedTypes?: string[];\n}\n\n/**\n * Maps the `src` stored in the document to the URL the editor displays (and downloads).\n * The document, `getHTML()`, `getJSON()` and exports always keep the original `src`.\n *\n * Use it for images that cannot be loaded by a plain `<img src>`, e.g. endpoints that need an\n * authorization header: fetch the image and resolve to a `blob:` URL.\n *\n * Can return a string, a Promise or an Observable (only the first emission is used).\n * When it throws, rejects or emits nothing, the original `src` is displayed instead.\n * The library never revokes the URLs it returns: if you create `blob:` URLs, you own their lifetime.\n */\nexport type AteImageSrcResolver = (src: string) => string | Promise<string> | Observable<string>;\n","import { Editor, Extension } from \"@tiptap/core\";\nimport { Fragment, Node as ProseMirrorNode, Slice } from \"@tiptap/pm/model\";\nimport { Plugin, PluginKey } from \"@tiptap/pm/state\";\nimport { AteImageValidationError, AtePastedImageRejection } from \"../models/ate-image.model\";\n\nconst IMAGE_NODE_NAMES = new Set([\"resizableImage\", \"image\"]);\nconst REMOTE_SRC = /^(https?:)?\\/\\//i;\nconst INLINE_SRC = /^data:(image\\/[\\w.+-]+);base64,(.*)$/is;\nconst PASTED_IMAGE_BASENAME = \"pasted-image\";\n\nexport type AtePastedImageSource = \"remote\" | \"inline\" | \"unreachable\";\n\nexport interface AtePastedImageOptions {\n /** Whether pasted base64 images should be sent to the upload handler */\n shouldRehost: () => boolean;\n /** Uploads a pasted base64 image and resolves to its hosted URL */\n rehost: (file: File) => Promise<string>;\n /** Called for every pasted image that could not be kept */\n onRejected: (rejection: AtePastedImageRejection) => void;\n}\n\n/**\n * Classifies the `src` of an image found in pasted HTML.\n * `unreachable` sources (e.g. `attachment:`, `file:`, `cid:`, foreign `blob:`) cannot be fetched by the page.\n */\nexport function classifyPastedImageSrc(\n src: string | null | undefined,\n origin: string = typeof location !== \"undefined\" ? location.origin : \"\"\n): AtePastedImageSource {\n if (!src) {\n return \"unreachable\";\n }\n if (REMOTE_SRC.test(src) || (src.startsWith(\"/\") && !src.startsWith(\"//\"))) {\n return \"remote\";\n }\n if (origin && src.startsWith(`blob:${origin}/`)) {\n return \"remote\";\n }\n return INLINE_SRC.test(src) ? \"inline\" : \"unreachable\";\n}\n\n/** Decodes a base64 image data URI into a `File`, or returns `null` when it is malformed */\nexport function dataUriToFile(src: string): File | null {\n const match = INLINE_SRC.exec(src);\n if (!match) {\n return null;\n }\n const mimeType = match[1].toLowerCase();\n try {\n const binary = atob(match[2].replace(/\\s/g, \"\"));\n const bytes = Uint8Array.from(binary, char => char.codePointAt(0) ?? 0);\n const extension = mimeType.split(\"/\")[1].split(\"+\")[0];\n return new File([bytes], `${PASTED_IMAGE_BASENAME}.${extension}`, { type: mimeType });\n } catch {\n return null;\n }\n}\n\nfunction isImageNode(node: ProseMirrorNode): boolean {\n return IMAGE_NODE_NAMES.has(node.type.name);\n}\n\n/** Removes unreachable images from a pasted slice and lists the base64 sources it keeps */\nexport function sanitizePastedImages(slice: Slice): {\n slice: Slice;\n inlineSources: string[];\n droppedSources: string[];\n} {\n const inlineSources = new Set<string>();\n const droppedSources: string[] = [];\n\n const sanitize = (fragment: Fragment): Fragment => {\n const kept: ProseMirrorNode[] = [];\n fragment.forEach(child => {\n if (isImageNode(child)) {\n const src = child.attrs[\"src\"] as string | null;\n const source = classifyPastedImageSrc(src);\n if (source === \"unreachable\") {\n droppedSources.push(src ?? \"\");\n return;\n }\n if (source === \"inline\" && src) {\n inlineSources.add(src);\n }\n kept.push(child);\n return;\n }\n kept.push(child.isLeaf ? child : child.copy(sanitize(child.content)));\n });\n return Fragment.fromArray(kept);\n };\n\n const content = sanitize(slice.content);\n if (!droppedSources.length) {\n return { slice, inlineSources: [...inlineSources], droppedSources };\n }\n const openStart = content.firstChild === slice.content.firstChild ? slice.openStart : 0;\n const openEnd = content.lastChild === slice.content.lastChild ? slice.openEnd : 0;\n return {\n slice: new Slice(content, openStart, openEnd),\n inlineSources: [...inlineSources],\n droppedSources,\n };\n}\n\nfunction replaceImageSrc(editor: Editor, previousSrc: string, nextSrc: string | null): void {\n if (editor.isDestroyed) {\n return;\n }\n const { state } = editor;\n const matches: { pos: number; node: ProseMirrorNode }[] = [];\n state.doc.descendants((node, pos) => {\n if (isImageNode(node) && node.attrs[\"src\"] === previousSrc) {\n matches.push({ pos, node });\n }\n });\n if (!matches.length) {\n return;\n }\n const tr = state.tr;\n for (const { pos, node } of [...matches].reverse()) {\n if (nextSrc) {\n tr.setNodeMarkup(pos, undefined, { ...node.attrs, src: nextSrc });\n } else {\n tr.delete(pos, pos + node.nodeSize);\n }\n }\n editor.view.dispatch(tr);\n}\n\n/**\n * Cleans images coming from pasted HTML (e.g. Notion, Google Docs, Office):\n * - drops images whose source the page cannot load, instead of inserting broken images;\n * - sends base64 images through the upload handler (when one is configured) and swaps in the hosted URL.\n *\n * File-based clipboard images keep going through the regular paste upload flow.\n */\nexport const AtePastedImage = Extension.create<AtePastedImageOptions>({\n name: \"atePastedImage\",\n\n addOptions() {\n return {\n shouldRehost: () => false,\n rehost: () => Promise.reject(new Error(\"No upload handler configured\")),\n onRejected: () => undefined,\n };\n },\n\n addProseMirrorPlugins() {\n const editor = this.editor;\n const options = this.options;\n\n const rehost = (src: string): void => {\n const file = dataUriToFile(src);\n if (!file) {\n replaceImageSrc(editor, src, null);\n options.onRejected({ reason: \"unreachable\", src });\n return;\n }\n options\n .rehost(file)\n .then(url => replaceImageSrc(editor, src, url))\n .catch((error: unknown) => {\n replaceImageSrc(editor, src, null);\n options.onRejected({\n reason: error instanceof AteImageValidationError ? error.reason : \"upload-failed\",\n src,\n });\n });\n };\n\n return [\n new Plugin({\n key: new PluginKey(\"atePastedImage\"),\n props: {\n transformPasted: slice => {\n const { slice: sanitized, inlineSources, droppedSources } = sanitizePastedImages(slice);\n droppedSources.forEach(src => options.onRejected({ reason: \"unreachable\", src }));\n if (inlineSources.length && options.shouldRehost()) {\n queueMicrotask(() => inlineSources.forEach(rehost));\n }\n return sanitized;\n },\n },\n }),\n ];\n },\n});\n","import { Editor, Extension } from \"@tiptap/core\";\nimport { Plugin, PluginKey } from \"@tiptap/pm/state\";\n\nexport interface AteLinkShortcutOptions {\n /** Whether a link can be set or edited at the current selection */\n canOpen: () => boolean;\n /** Opens the link editor */\n open: (editor: Editor) => void;\n}\n\n/** Matches the bare `Mod+K` chord (`Cmd+K` on macOS, `Ctrl+K` elsewhere) */\nexport function isLinkShortcut(event: KeyboardEvent): boolean {\n return (\n (event.metaKey || event.ctrlKey) &&\n !event.shiftKey &&\n !event.altKey &&\n event.key.toLowerCase() === \"k\"\n );\n}\n\n/**\n * `Mod+K` opens the link editor when text is selected or the cursor is on a link.\n * With an empty selection outside a link the event is left alone, so host-level `Mod+K`\n * shortcuts (search, command palettes) keep working.\n */\nexport const AteLinkShortcut = Extension.create<AteLinkShortcutOptions>({\n name: \"ateLinkShortcut\",\n\n addOptions() {\n return {\n canOpen: () => true,\n open: () => undefined,\n };\n },\n\n addProseMirrorPlugins() {\n const editor = this.editor;\n const options = this.options;\n\n return [\n new Plugin({\n key: new PluginKey(\"ateLinkShortcut\"),\n props: {\n handleKeyDown: (view, event) => {\n if (!isLinkShortcut(event) || !view.editable) {\n return false;\n }\n if (view.state.selection.empty && !editor.isActive(\"link\")) {\n return false;\n }\n if (!options.canOpen()) {\n return false;\n }\n event.preventDefault();\n event.stopPropagation();\n options.open(editor);\n return true;\n },\n },\n }),\n ];\n },\n});\n","import { Extension } from \"@tiptap/core\";\nimport { Node as ProseMirrorNode } from \"@tiptap/pm/model\";\nimport { EditorState, NodeSelection, Selection, Transaction } from \"@tiptap/pm/state\";\n\nconst LIST_ITEM_NODE_NAMES = new Set([\"listItem\", \"taskItem\"]);\n\nexport interface AteBlockShortcutsOptions {\n /** Whether the shortcuts are active. Evaluated on every key press, so it can change at runtime */\n enabled: () => boolean;\n}\n\nexport interface AteBlockAtSelection {\n node: ProseMirrorNode;\n /** Document position right before the block */\n pos: number;\n parent: ProseMirrorNode;\n /** Index of the block among its parent's children */\n index: number;\n}\n\n/**\n * Resolves the block the shortcuts act on: a selected block node, the list or task item\n * holding the cursor, or else the top-level block holding the cursor.\n */\nexport function findBlockAtSelection(selection: Selection): AteBlockAtSelection | null {\n const { $from } = selection;\n if (selection instanceof NodeSelection && selection.node.isBlock) {\n return {\n node: selection.node,\n pos: selection.from,\n parent: $from.parent,\n index: $from.index(),\n };\n }\n if ($from.depth < 1) {\n return null;\n }\n let depth = 1;\n for (let current = $from.depth; current > 0; current--) {\n if (LIST_ITEM_NODE_NAMES.has($from.node(current).type.name)) {\n depth = current;\n break;\n }\n }\n return {\n node: $from.node(depth),\n pos: $from.before(depth),\n parent: $from.node(depth - 1),\n index: $from.index(depth - 1),\n };\n}\n\n/** Inserts a copy of the current block right after it */\nexport function duplicateBlock(state: EditorState): Transaction | null {\n const block = findBlockAtSelection(state.selection);\n if (!block) {\n return null;\n }\n return state.tr.insert(block.pos, block.node).scrollIntoView();\n}\n\n/** Swaps the current block with its previous sibling, or returns `null` at the first position */\nexport function moveBlockUp(state: EditorState): Transaction | null {\n const block = findBlockAtSelection(state.selection);\n if (!block || block.index === 0) {\n return null;\n }\n const previous = block.parent.child(block.index - 1);\n const end = block.pos + block.node.nodeSize;\n return state.tr\n .insert(end, previous)\n .delete(block.pos - previous.nodeSize, block.pos)\n .scrollIntoView();\n}\n\n/** Swaps the current block with its next sibling, or returns `null` at the last position */\nexport function moveBlockDown(state: EditorState): Transaction | null {\n const block = findBlockAtSelection(state.selection);\n if (!block || block.index >= block.parent.childCount - 1) {\n return null;\n }\n const next = block.parent.child(block.index + 1);\n const end = block.pos + block.node.nodeSize;\n return state.tr\n .delete(end, end + next.nodeSize)\n .insert(block.pos, next)\n .scrollIntoView();\n}\n\n/**\n * Notion-style block shortcuts: `Mod+D` duplicates the current block, `Mod+Shift+ArrowUp` and\n * `Mod+Shift+ArrowDown` move it one sibling up or down. Inside a list the block is the list\n * or task item, which moves within its list. At the edges the key event is left alone.\n */\nexport const AteBlockShortcuts = Extension.create<AteBlockShortcutsOptions>({\n name: \"ateBlockShortcuts\",\n\n addOptions() {\n return {\n enabled: () => true,\n };\n },\n\n addKeyboardShortcuts() {\n const run = (build: (state: EditorState) => Transaction | null) => (): boolean => {\n if (!this.options.enabled() || !this.editor.isEditable) {\n return false;\n }\n const transaction = build(this.editor.state);\n if (!transaction) {\n return false;\n }\n this.editor.view.dispatch(transaction);\n return true;\n };\n\n return {\n \"Mod-d\": run(duplicateBlock),\n \"Mod-Shift-ArrowUp\": run(moveBlockUp),\n \"Mod-Shift-ArrowDown\": run(moveBlockDown),\n };\n },\n});\n","import { isDevMode } from \"@angular/core\";\nimport { Extension } from \"@tiptap/core\";\nimport { DOMSerializer, Fragment } from \"@tiptap/pm/model\";\nimport { Plugin, PluginKey } from \"@tiptap/pm/state\";\nimport { AtePasteConfig, AtePasteSource } from \"../models/ate-paste.model\";\n\n/** Set on HTML copied from an editor, so a later paste knows it comes from an editor */\nconst EDITOR_CLIPBOARD_MARKER = \"data-ate-copy\";\nconst OFFICE_HTML = /urn:schemas-microsoft-com:office|class=\"?Mso|mso-/i;\n\nexport interface AtePasteOptions {\n /** Paste settings, read on every paste so they can change at runtime */\n config: () => AtePasteConfig;\n}\n\nexport interface AtePasteStorage {\n /** Source of the paste being processed, detected before any cleanup */\n source: AtePasteSource;\n}\n\ndeclare module \"@tiptap/core\" {\n interface Storage {\n atePaste: AtePasteStorage;\n }\n}\n\n/** Detects where clipboard HTML comes from. Must run on the HTML as copied, before any cleanup */\nexport function detectPasteSource(html: string): AtePasteSource {\n if (html.includes(EDITOR_CLIPBOARD_MARKER)) {\n return \"editor\";\n }\n return OFFICE_HTML.test(html) ? \"office\" : \"external\";\n}\n\n/** Removes the formats turned off in `config` (`colors`, `highlights`) from pasted HTML */\nexport function stripPastedFormats(html: string, config: AtePasteConfig): string {\n const keepColors = config.colors !== false;\n const keepHighlights = config.highlights !== false;\n if (keepColors && keepHighlights) {\n return html;\n }\n const template = document.createElement(\"template\");\n template.innerHTML = html;\n const content = template.content;\n const styleProperties = [\n ...(keepColors ? [] : [\"color\"]),\n ...(keepHighlights ? [] : [\"background-color\", \"background\"]),\n ];\n content.querySelectorAll<HTMLElement>(\"[style]\").forEach(element => {\n styleProperties.forEach(property => element.style.removeProperty(property));\n if (!element.getAttribute(\"style\")?.trim()) {\n element.removeAttribute(\"style\");\n }\n });\n if (!keepColors) {\n content.querySelectorAll(\"font[color]\").forEach(font => font.removeAttribute(\"color\"));\n }\n if (!keepHighlights) {\n content.querySelectorAll(\"[bgcolor]\").forEach(element => element.removeAttribute(\"bgcolor\"));\n content\n .querySelectorAll(\"mark\")\n .forEach(mark => mark.replaceWith(...Array.from(mark.childNodes)));\n }\n return template.innerHTML;\n}\n\n/**\n * Runs before every other paste cleanup (the Office cleanup removes the markers it relies on):\n * records the source of each paste, and marks HTML copied from the editor.\n */\nconst AtePasteSourceTracker = Extension.create({\n name: \"atePasteSourceTracker\",\n priority: 100000,\n\n addProseMirrorPlugins() {\n const editor = this.editor;\n const serializer = DOMSerializer.fromSchema(editor.schema);\n return [\n new Plugin({\n key: new PluginKey(\"atePasteSourceTracker\"),\n props: {\n transformPastedHTML: html => {\n editor.storage.atePaste.source = detectPasteSource(html);\n return html;\n },\n clipboardSerializer: {\n serializeFragment: (fragment: Fragment, options?: { document?: Document }) => {\n const dom = serializer.serializeFragment(fragment, options);\n dom.firstElementChild?.setAttribute(EDITOR_CLIPBOARD_MARKER, \"\");\n return dom;\n },\n } as DOMSerializer,\n },\n }),\n ];\n },\n});\n\n/**\n * Applies `AtePasteConfig` to pasted and dropped HTML, after the Office cleanup:\n * removes the formats turned off for content from other apps, then calls `transformHTML`.\n */\nexport const AtePaste = Extension.create<AtePasteOptions, AtePasteStorage>({\n name: \"atePaste\",\n\n addOptions() {\n return {\n config: () => ({}),\n };\n },\n\n addStorage() {\n return {\n source: \"external\",\n };\n },\n\n addExtensions() {\n return [AtePasteSourceTracker];\n },\n\n addProseMirrorPlugins() {\n const options = this.options;\n const storage = this.storage;\n return [\n new Plugin({\n key: new PluginKey(\"atePaste\"),\n props: {\n transformPastedHTML: html => {\n const config = options.config();\n const source = storage.source;\n const stripped = source === \"editor\" ? html : stripPastedFormats(html, config);\n if (!config.transformHTML) {\n return stripped;\n }\n try {\n const transformed = config.transformHTML(stripped, { source });\n return typeof transformed === \"string\" ? transformed : stripped;\n } catch (error) {\n if (isDevMode()) {\n console.warn(\n \"[ATE] paste.transformHTML failed, inserting the HTML unchanged.\",\n error\n );\n }\n return stripped;\n }\n },\n },\n }),\n ];\n },\n});\n","import { Extension } from \"@tiptap/core\";\nimport { Table, TableRow, TableCell, TableHeader } from \"@tiptap/extension-table\";\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 allowTableNodeSelection: true,\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 { Directive, signal, Signal, WritableSignal, computed } 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 custom 'Angular Nodes'.\n *\n * Extend this class in your custom components to automatically receive TipTap editor\n * properties (node attributes, selection state, etc.) as reactive Signals.\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 * Helper signal to directly access node attributes\n */\n public attributes: Signal<Record<string, unknown>> = computed(() => this.node()?.attrs || {});\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 const declaredInputs =\n (componentRef.componentType as unknown as { ɵcmp?: { inputs?: Record<string, string> } })\n ?.ɵcmp?.inputs || {};\n\n Object.entries(mergedInputs).forEach(([key, value]) => {\n if (key !== \"id\" && value !== null && value !== undefined) {\n // Only invoke setInput if the key is a declared @Input() / input() signal or in explicit options\n if (key in declaredInputs || key in inputs) {\n try {\n componentRef.setInput(key, value);\n } catch {\n // Silently ignore inputs that fail to set\n }\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\";\n\n/**\n * Internal registry to store the root injector for the editor.\n * This allows registerAngularComponent to work without explicitly passing the injector.\n * @internal\n */\nlet globalInjector: Injector | null = null;\n\nexport function setGlobalInjector(injector: Injector): void {\n globalInjector = injector;\n}\n\nexport function getGlobalInjector(): Injector {\n if (!globalInjector) {\n throw new Error(\n \"[ATE] Global Injector not found. Make sure to call provideAteEditor() in your app.config.ts or main.ts.\"\n );\n }\n return globalInjector;\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\";\nimport { getGlobalInjector } from \"./ate-injector.registry\";\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 injectorOrOptions - The Angular Injector OR the configuration options\n * @param maybeOptions - Configuration options (if the first param was an injector)\n * @returns A TipTap Node extension ready to be used\n *\n * @example\n * ```typescript\n * // Modern way (requires provideAteEditor())\n * registerAngularComponent({\n * component: MyComponent,\n * name: 'myComponent'\n * });\n *\n * // Classic way\n * registerAngularComponent(injector, {\n * component: MyComponent\n * });\n * ```\n */\nexport function registerAngularComponent<T = unknown>(\n injectorOrOptions: Injector | RegisterAngularComponentOptions<T>,\n maybeOptions?: RegisterAngularComponentOptions<T>\n): Node {\n let injector: Injector;\n let options: RegisterAngularComponentOptions<T>;\n\n // Duck-typing check: Injectors have a 'get' method\n const isInjector = (obj: unknown): obj is Injector =>\n obj !== null && typeof obj === \"object\" && typeof (obj as Injector).get === \"function\";\n\n if (isInjector(injectorOrOptions)) {\n injector = injectorOrOptions;\n options = maybeOptions!;\n } else {\n injector = getGlobalInjector();\n options = injectorOrOptions as RegisterAngularComponentOptions<T>;\n }\n\n return createAngularComponentExtension(injector, options);\n}\n","import { Signal } from \"@angular/core\";\nimport { Editor, JSONContent } from \"@tiptap/core\";\nimport { AteEditorCommandsService } from \"../services/ate-editor-commands.service\";\nimport { AteEditorStateSnapshot } from \"./ate-editor-state.model\";\nimport { AteImageUploadOptions } from \"./ate-image.model\";\nimport { AteExportFormat, AteExportOptions } from \"../services/ate-export.service\";\n\n/**\n * A wrapper class that holds a reference to a registered editor component.\n * It provides direct, type-safe facade methods to interact with the editor\n * and execute formatting/utility commands without needing to manage the raw\n * TipTap editor instance directly.\n */\nexport class AteEditorRef {\n constructor(\n public readonly id: string,\n private readonly getEditorInstance: () => Editor | null,\n public readonly commandsService: AteEditorCommandsService\n ) {}\n\n /** Get the raw TipTap Editor instance. */\n get editor(): Editor | null {\n return this.getEditorInstance();\n }\n\n /** Get the current editor state snapshot. */\n get state(): AteEditorStateSnapshot {\n return this.commandsService.editorState();\n }\n\n /** Get the reactive editor state as a Signal. */\n get stateSignal(): Signal<AteEditorStateSnapshot> {\n return this.commandsService.editorState;\n }\n\n /** Execute a generic command by name. */\n execute(command: string, ...args: unknown[]): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.execute(editor, command, ...args);\n }\n }\n\n // ============================================\n // Facade Formatting Commands\n // ============================================\n\n toggleBold(): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.toggleBold(editor);\n }\n }\n\n toggleItalic(): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.toggleItalic(editor);\n }\n }\n\n toggleStrike(): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.toggleStrike(editor);\n }\n }\n\n toggleCode(): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.toggleCode(editor);\n }\n }\n\n toggleCodeBlock(): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.toggleCodeBlock(editor);\n }\n }\n\n toggleUnderline(): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.toggleUnderline(editor);\n }\n }\n\n toggleSuperscript(): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.toggleSuperscript(editor);\n }\n }\n\n toggleSubscript(): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.toggleSubscript(editor);\n }\n }\n\n toggleHeading(level: 1 | 2 | 3): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.toggleHeading(editor, level);\n }\n }\n\n toggleBulletList(): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.toggleBulletList(editor);\n }\n }\n\n toggleOrderedList(): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.toggleOrderedList(editor);\n }\n }\n\n toggleBlockquote(): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.toggleBlockquote(editor);\n }\n }\n\n setTextAlign(alignment: \"left\" | \"center\" | \"right\" | \"justify\"): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.setTextAlign(editor, alignment);\n }\n }\n\n insertHorizontalRule(): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.insertHorizontalRule(editor);\n }\n }\n\n insertImage(options: AteImageUploadOptions): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.insertImage(editor, options).catch(() => undefined);\n }\n }\n\n uploadImage(file: File, options?: AteImageUploadOptions): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.uploadImage(editor, file, options).catch(() => undefined);\n }\n }\n\n toggleHighlight(color: string): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.toggleHighlight(editor, color);\n }\n }\n\n undo(): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.undo(editor);\n }\n }\n\n redo(): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.redo(editor);\n }\n }\n\n // ============================================\n // Table Commands\n // ============================================\n\n insertTable(rows?: number, cols?: number): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.insertTable(editor, rows, cols);\n }\n }\n\n addColumnBefore(): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.addColumnBefore(editor);\n }\n }\n\n addColumnAfter(): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.addColumnAfter(editor);\n }\n }\n\n deleteColumn(): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.deleteColumn(editor);\n }\n }\n\n addRowBefore(): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.addRowBefore(editor);\n }\n }\n\n addRowAfter(): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.addRowAfter(editor);\n }\n }\n\n deleteRow(): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.deleteRow(editor);\n }\n }\n\n deleteTable(): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.deleteTable(editor);\n }\n }\n\n mergeCells(): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.mergeCells(editor);\n }\n }\n\n splitCell(): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.splitCell(editor);\n }\n }\n\n toggleHeaderColumn(): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.toggleHeaderColumn(editor);\n }\n }\n\n toggleHeaderRow(): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.toggleHeaderRow(editor);\n }\n }\n\n // ============================================\n // Color Picker & Link Commands\n // ============================================\n\n applyColor(color: string, selectionOnly?: boolean, closeMenu?: boolean): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.execute(editor, \"applyColor\", color, selectionOnly, closeMenu);\n }\n }\n\n applyHighlight(color: string, selectionOnly?: boolean, closeMenu?: boolean): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.execute(editor, \"applyHighlight\", color, selectionOnly, closeMenu);\n }\n }\n\n unsetColor(selectionOnly?: boolean): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.execute(editor, \"unsetColor\", selectionOnly);\n }\n }\n\n unsetHighlight(selectionOnly?: boolean): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.execute(editor, \"unsetHighlight\", selectionOnly);\n }\n }\n\n toggleLink(event?: Event): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.execute(editor, \"toggleLink\", event);\n }\n }\n\n unsetLink(): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.execute(editor, \"unsetLink\");\n }\n }\n\n toggleColorPicker(mode: \"text\" | \"highlight\", event: Event): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.execute(editor, \"toggleColorPicker\", mode, event);\n }\n }\n\n // ============================================\n // General Controls & Content\n // ============================================\n\n clearContent(): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.clearContent(editor);\n }\n }\n\n setContent(content: string, emitUpdate = true): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.setContent(editor, content, emitUpdate);\n }\n }\n\n getContent(format: AteExportFormat): string {\n const editor = this.editor;\n return editor ? this.commandsService.getContent(editor, format) : \"\";\n }\n\n getHTML(): string {\n const editor = this.editor;\n return editor ? editor.getHTML() : \"\";\n }\n\n getJSON(): JSONContent | undefined {\n const editor = this.editor;\n return editor ? editor.getJSON() : undefined;\n }\n\n getText(): string {\n const editor = this.editor;\n return editor ? editor.getText() : \"\";\n }\n\n async exportAs(\n format: AteExportFormat,\n method: \"clipboard\" | \"download\",\n options?: AteExportOptions\n ): Promise<void> {\n const editor = this.editor;\n if (editor) {\n await this.commandsService.exportAs(editor, format, method, options);\n }\n }\n\n focus(): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.focus(editor);\n }\n }\n\n blur(): void {\n const editor = this.editor;\n if (editor) {\n this.commandsService.blur(editor);\n }\n }\n}\n","import { Injectable, signal, computed } from \"@angular/core\";\nimport { Editor } from \"@tiptap/core\";\nimport { AteEditorRef } from \"../models/ate-editor-ref\";\nimport { AteEditorCommandsService } from \"./ate-editor-commands.service\";\n\n/**\n * A root-level registry service to register, unregister, and manage active editor instances.\n * This service is provided in 'root' and can be injected anywhere in the application.\n */\n@Injectable({\n providedIn: \"root\",\n})\nexport class AteEditorRegistry {\n private static counter = 0;\n\n // Map of registered editors\n private readonly _editors = signal<Map<string, AteEditorRef>>(new Map());\n readonly editors = this._editors.asReadonly();\n\n // Active (last focused or last registered) editor ID\n private readonly _activeEditorId = signal<string | null>(null);\n readonly activeEditorId = this._activeEditorId.asReadonly();\n\n // List of all active editor IDs reactively\n readonly editorIds = computed(() => Array.from(this._editors().keys()));\n\n // Active AteEditorRef reactively\n readonly activeEditor = computed(() => {\n const activeId = this._activeEditorId();\n if (!activeId) {\n return null;\n }\n return this._editors().get(activeId) || null;\n });\n\n /**\n * Register an editor instance.\n * Returns the final registered ID.\n */\n register(\n id: string | undefined,\n getEditor: () => Editor | null,\n commandsService: AteEditorCommandsService\n ): string {\n const finalId = id || `ate-editor-${++AteEditorRegistry.counter}`;\n const editorRef = new AteEditorRef(finalId, getEditor, commandsService);\n\n this._editors.update(map => {\n const newMap = new Map(map);\n newMap.set(finalId, editorRef);\n return newMap;\n });\n\n // If there is no active editor, make this one active\n if (!this._activeEditorId()) {\n this._activeEditorId.set(finalId);\n }\n\n return finalId;\n }\n\n /**\n * Unregister an editor instance by ID.\n */\n unregister(id: string): void {\n this._editors.update(map => {\n const newMap = new Map(map);\n newMap.delete(id);\n return newMap;\n });\n\n // If the active editor is the one being unregistered, find a fallback\n if (this._activeEditorId() === id) {\n const remainingIds = this.editorIds();\n if (remainingIds.length > 0) {\n // Set active to the last registered one remaining\n this._activeEditorId.set(remainingIds[remainingIds.length - 1]);\n } else {\n this._activeEditorId.set(null);\n }\n }\n }\n\n /**\n * Mark an editor as active (usually on focus).\n */\n setActive(id: string): void {\n if (this._editors().has(id)) {\n this._activeEditorId.set(id);\n }\n }\n\n /**\n * Retrieve an editor reference by ID, or the active editor if ID is not specified.\n */\n get(id?: string): AteEditorRef | undefined {\n if (id) {\n return this._editors().get(id);\n }\n const activeId = this._activeEditorId();\n return activeId ? this._editors().get(activeId) : undefined;\n }\n}\n","import { AteTranslations } from \"./ateTranslationsModel\";\n\nexport const ENGLISH_TRANSLATIONS: AteTranslations = {\n toolbar: {\n bold: \"Bold\\nCtrl+B\",\n italic: \"Italic\\nCtrl+I\",\n underline: \"Underline\\nCtrl+U\",\n strike: \"Strikethrough\\nCtrl+Shift+X\",\n code: \"Inline Code\\nCtrl+E\",\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\\nCtrl+Z\",\n redo: \"Redo\\nCtrl+Shift+Z\",\n clear: \"Clear\",\n textColor: \"Text Color\",\n customColor: \"Custom Color\",\n presets: \"Presets\",\n },\n bubbleMenu: {\n bold: \"Bold\\nCtrl+B\",\n italic: \"Italic\\nCtrl+I\",\n underline: \"Underline\\nCtrl+U\",\n strike: \"Strikethrough\\nCtrl+Shift+X\",\n code: \"Code\\nCtrl+E\",\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 tableOfContents: {\n title: \"Table of Contents\",\n description: \"Insert a table of contents\",\n keywords: [\"toc\", \"table\", \"contents\", \"summary\", \"index\", \"headings\", \"outline\"],\n },\n filterPlaceholder: \"Filter...\",\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 downloadImage: \"Download Image\",\n deleteImage: \"Delete Image\",\n resizeSmall: \"Small\",\n resizeMedium: \"Medium\",\n resizeLarge: \"Large\",\n resizeOriginal: \"Original\",\n alignLeft: \"Align Left\",\n alignCenter: \"Align Center\",\n alignRight: \"Align Right\",\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 characterPlural: \"characters\",\n word: \"word\",\n wordPlural: \"words\",\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 blockAdd: \"Click to add a block\",\n blockDrag: \"Drag to move this block\",\n tableOfContents: \"Table of Contents\",\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 export: {\n export: \"Export\",\n html: \"HTML\",\n markdown: \"Markdown\",\n text: \"Plain Text\",\n copyHtml: \"Copy as HTML\",\n copyMarkdown: \"Copy as Markdown\",\n copyText: \"Copy as plain text\",\n downloadHtml: \"Download .html\",\n downloadMarkdown: \"Download .md\",\n downloadText: \"Download .txt\",\n copiedSuccess: \"Copied to clipboard!\",\n },\n};\n","import { AteTranslations } from \"./ateTranslationsModel\";\n\nexport const FRENCH_TRANSLATIONS: AteTranslations = {\n toolbar: {\n bold: \"Gras\\nCtrl+B\",\n italic: \"Italique\\nCtrl+I\",\n underline: \"Souligné\\nCtrl+U\",\n strike: \"Barré\\nCtrl+Shift+X\",\n code: \"Code en ligne\\nCtrl+E\",\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\\nCtrl+Z\",\n redo: \"Refaire\\nCtrl+Shift+Z\",\n clear: \"Vider\",\n textColor: \"Couleur du texte\",\n customColor: \"Couleur personnalisée\",\n presets: \"Préréglages\",\n },\n bubbleMenu: {\n bold: \"Gras\\nCtrl+B\",\n italic: \"Italique\\nCtrl+I\",\n underline: \"Souligné\\nCtrl+U\",\n strike: \"Barré\\nCtrl+Shift+X\",\n code: \"Code\\nCtrl+E\",\n superscript: \"Exposant\",\n subscript: \"Indice\",\n highlight: \"Surligner\",\n highlightPicker: \"Couleur de fond\",\n textColor: \"Couleur du 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 tableOfContents: {\n title: \"Table des matières\",\n description: \"Insérer une table des matières\",\n keywords: [\"toc\", \"table\", \"matières\", \"sommaire\", \"index\", \"headings\", \"titres\"],\n },\n filterPlaceholder: \"Filtrer...\",\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 downloadImage: \"Télécharger l'image\",\n deleteImage: \"Supprimer l'image\",\n resizeSmall: \"Petit\",\n resizeMedium: \"Moyen\",\n resizeLarge: \"Grand\",\n resizeOriginal: \"Original\",\n alignLeft: \"Aligner à gauche\",\n alignCenter: \"Aligner au centre\",\n alignRight: \"Aligner à droite\",\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 characterPlural: \"caractères\",\n word: \"mot\",\n wordPlural: \"mots\",\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 blockAdd: \"Cliquer pour ajouter un bloc\",\n blockDrag: \"Faire glisser pour déplacer ce bloc\",\n tableOfContents: \"Sommaire\",\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 export: {\n export: \"Exporter\",\n html: \"HTML\",\n markdown: \"Markdown\",\n text: \"Texte brut\",\n copyHtml: \"Copier en HTML\",\n copyMarkdown: \"Copier en Markdown\",\n copyText: \"Copier en texte brut\",\n downloadHtml: \"Télécharger .html\",\n downloadMarkdown: \"Télécharger .md\",\n downloadText: \"Télécharger .txt\",\n copiedSuccess: \"Copié dans le presse-papiers !\",\n },\n};\n","import { AteTranslations } from \"./ateTranslationsModel\";\n\nexport const GERMAN_TRANSLATIONS: AteTranslations = {\n toolbar: {\n bold: \"Fett\\nStrg+B\",\n italic: \"Kursiv\\nStrg+I\",\n underline: \"Unterstrichen\\nStrg+U\",\n strike: \"Durchgestrichen\\nStrg+Shift+X\",\n code: \"Inline-Code\\nStrg+E\",\n codeBlock: \"Codeblock\",\n superscript: \"Hochgestellt\",\n subscript: \"Tiefgestellt\",\n highlight: \"Hervorheben\",\n highlightPicker: \"Hintergrundfarbe\",\n heading1: \"Überschrift 1\",\n heading2: \"Überschrift 2\",\n heading3: \"Überschrift 3\",\n bulletList: \"Aufzählungsliste\",\n orderedList: \"Nummerierte Liste\",\n blockquote: \"Zitatblock\",\n alignLeft: \"Links ausrichten\",\n alignCenter: \"Zentrieren\",\n alignRight: \"Rechts ausrichten\",\n alignJustify: \"Blocksatz\",\n link: \"Link hinzufügen\",\n image: \"Bild hinzufügen\",\n horizontalRule: \"Horizontale Linie\",\n table: \"Tabelle einfügen\",\n undo: \"Rückgängig\\nStrg+Z\",\n redo: \"Wiederholen\\nStrg+Shift+Z\",\n clear: \"Leeren\",\n textColor: \"Textfarbe\",\n customColor: \"Benutzerdefinierte Farbe\",\n presets: \"Voreinstellungen\",\n },\n\n bubbleMenu: {\n bold: \"Fett\\nStrg+B\",\n italic: \"Kursiv\\nStrg+I\",\n underline: \"Unterstrichen\\nStrg+U\",\n strike: \"Durchgestrichen\\nStrg+Shift+X\",\n code: \"Code\\nStrg+E\",\n superscript: \"Hochgestellt\",\n subscript: \"Tiefgestellt\",\n highlight: \"Hervorheben\",\n highlightPicker: \"Hintergrundfarbe\",\n textColor: \"Textfarbe\",\n link: \"Link\",\n addLink: \"Link hinzufügen\",\n editLink: \"Link bearbeiten\",\n removeLink: \"Link entfernen\",\n linkUrl: \"Link-URL\",\n linkText: \"Link-Text\",\n openLink: \"Link öffnen\",\n customColor: \"Benutzerdefinierte Farbe\",\n presets: \"Voreinstellungen\",\n },\n\n slashCommands: {\n heading1: {\n title: \"Überschrift 1\",\n description: \"Große Abschnittsüberschrift\",\n keywords: [\"überschrift\", \"heading\", \"h1\", \"titel\", \"1\", \"header\"],\n },\n heading2: {\n title: \"Überschrift 2\",\n description: \"Mittlere Abschnittsüberschrift\",\n keywords: [\"überschrift\", \"heading\", \"h2\", \"titel\", \"2\", \"header\"],\n },\n heading3: {\n title: \"Überschrift 3\",\n description: \"Kleine Abschnittsüberschrift\",\n keywords: [\"überschrift\", \"heading\", \"h3\", \"titel\", \"3\", \"header\"],\n },\n bulletList: {\n title: \"Aufzählungsliste\",\n description: \"Eine Aufzählungsliste erstellen\",\n keywords: [\"aufzählung\", \"liste\", \"bullet\", \"ul\", \"unordered\"],\n },\n orderedList: {\n title: \"Nummerierte Liste\",\n description: \"Eine nummerierte Liste erstellen\",\n keywords: [\"nummeriert\", \"liste\", \"ordered\", \"ol\", \"zahlen\"],\n },\n blockquote: {\n title: \"Zitatblock\",\n description: \"Einen Zitatblock hinzufügen\",\n keywords: [\"zitat\", \"blockquote\", \"quote\", \"citation\"],\n },\n code: {\n title: \"Codeblock\",\n description: \"Einen Codeblock hinzufügen\",\n keywords: [\"code\", \"codeblock\", \"pre\", \"programmierung\"],\n },\n image: {\n title: \"Bild\",\n description: \"Ein Bild einfügen\",\n keywords: [\"bild\", \"image\", \"foto\", \"photo\", \"picture\", \"img\"],\n },\n horizontalRule: {\n title: \"Horizontale Linie\",\n description: \"Eine horizontale Trennlinie hinzufügen\",\n keywords: [\"linie\", \"horizontal\", \"rule\", \"hr\", \"trennlinie\", \"separator\"],\n },\n table: {\n title: \"Tabelle\",\n description: \"Eine Tabelle einfügen\",\n keywords: [\"tabelle\", \"table\", \"grid\", \"raster\", \"daten\", \"zeilen\", \"spalten\"],\n },\n tableOfContents: {\n title: \"Inhaltsverzeichnis\",\n description: \"Ein Inhaltsverzeichnis einfügen\",\n keywords: [\"toc\", \"inhaltsverzeichnis\", \"tabelle\", \"inhalte\", \"index\", \"überschriften\"],\n },\n filterPlaceholder: \"Filtern...\",\n },\n\n table: {\n addRowBefore: \"Zeile davor einfügen\",\n addRowAfter: \"Zeile danach einfügen\",\n deleteRow: \"Zeile löschen\",\n addColumnBefore: \"Spalte davor einfügen\",\n addColumnAfter: \"Spalte danach einfügen\",\n deleteColumn: \"Spalte löschen\",\n deleteTable: \"Tabelle löschen\",\n toggleHeaderRow: \"Kopfzeile umschalten\",\n toggleHeaderColumn: \"Kopfspalte umschalten\",\n mergeCells: \"Zellen verbinden\",\n splitCell: \"Zelle teilen\",\n },\n\n imageUpload: {\n selectImage: \"Bild auswählen\",\n loadError: \"Fehler beim Laden des Bildes\",\n uploadingImage: \"Bild wird hochgeladen...\",\n uploadProgress: \"Upload-Fortschritt\",\n uploadError: \"Upload-Fehler\",\n uploadSuccess: \"Upload erfolgreich\",\n imageTooLarge: \"Bild ist zu groß\",\n invalidFileType: \"Ungültiger Dateityp\",\n dragDropText: \"Bilder hierher ziehen und ablegen\",\n changeImage: \"Bild ändern\",\n downloadImage: \"Bild herunterladen\",\n deleteImage: \"Bild löschen\",\n resizeSmall: \"Klein\",\n resizeMedium: \"Mittel\",\n resizeLarge: \"Groß\",\n resizeOriginal: \"Originalgröße\",\n alignLeft: \"Links ausrichten\",\n alignCenter: \"Zentrieren\",\n alignRight: \"Rechts ausrichten\",\n resizing: \"Größe wird angepasst...\",\n compressing: \"Bild wird komprimiert...\",\n compressionError: \"Fehler bei der Komprimierung\",\n validating: \"Datei wird geprüft...\",\n uploadingToServer: \"Upload zum Server...\",\n replacingImage: \"Bild wird ersetzt...\",\n insertingImage: \"Bild wird in den Editor eingefügt...\",\n noFileSelected: \"Keine Bilddatei ausgewählt\",\n selectionCancelled: \"Auswahl abgebrochen\",\n },\n\n editor: {\n placeholder: \"Beginne zu schreiben...\",\n character: \"Zeichen\",\n characterPlural: \"Zeichen\",\n word: \"Wort\",\n wordPlural: \"Wörter\",\n linkPrompt: \"Link-URL eingeben\",\n linkUrlPrompt: \"URL eingeben\",\n confirmDelete: \"Möchtest du dies wirklich löschen?\",\n toggleEdit: \"In den Bearbeitungsmodus wechseln\",\n viewMode: \"In den Ansichtsmodus wechseln\",\n blockAdd: \"Klicken, um einen Block hinzuzufügen\",\n blockDrag: \"Ziehen, um diesen Block zu verschieben\",\n tableOfContents: \"Inhaltsverzeichnis\",\n },\n\n common: {\n cancel: \"Abbrechen\",\n confirm: \"Bestätigen\",\n apply: \"Anwenden\",\n delete: \"Löschen\",\n save: \"Speichern\",\n close: \"Schließen\",\n loading: \"Lädt\",\n error: \"Fehler\",\n success: \"Erfolg\",\n },\n\n export: {\n export: \"Exportieren\",\n html: \"HTML\",\n markdown: \"Markdown\",\n text: \"Nur Text\",\n copyHtml: \"Als HTML kopieren\",\n copyMarkdown: \"Als Markdown kopieren\",\n copyText: \"Als reinen Text kopieren\",\n downloadHtml: \".html herunterladen\",\n downloadMarkdown: \".md herunterladen\",\n downloadText: \".txt herunterladen\",\n copiedSuccess: \"In die Zwischenablage kopiert!\",\n },\n};\n","import { AteTranslations } from \"./ateTranslationsModel\";\n\nexport const PORTUGUESE_TRANSLATIONS: AteTranslations = {\n toolbar: {\n bold: \"Negrito\\nCtrl+B\",\n italic: \"Itálico\\nCtrl+I\",\n underline: \"Sublinhado\\nCtrl+U\",\n strike: \"Tachado\\nCtrl+Shift+X\",\n code: \"Código em linha\\nCtrl+E\",\n codeBlock: \"Bloco de código\",\n superscript: \"Sobrescrito\",\n subscript: \"Subscrito\",\n highlight: \"Destacar\",\n highlightPicker: \"Cor de destaque\",\n heading1: \"Título 1\",\n heading2: \"Título 2\",\n heading3: \"Título 3\",\n bulletList: \"Lista com marcadores\",\n orderedList: \"Lista numerada\",\n blockquote: \"Citação\",\n alignLeft: \"Alinhar à esquerda\",\n alignCenter: \"Centralizar\",\n alignRight: \"Alinhar à direita\",\n alignJustify: \"Justificar\",\n link: \"Inserir link\",\n image: \"Inserir imagem\",\n horizontalRule: \"Linha horizontal\",\n table: \"Inserir tabela\",\n undo: \"Desfazer\\nCtrl+Z\",\n redo: \"Refazer\\nCtrl+Shift+Z\",\n clear: \"Limpar\",\n textColor: \"Cor do texto\",\n customColor: \"Cor personalizada\",\n presets: \"Predefinições\",\n },\n bubbleMenu: {\n bold: \"Negrito\\nCtrl+B\",\n italic: \"Itálico\\nCtrl+I\",\n underline: \"Sublinhado\\nCtrl+U\",\n strike: \"Tachado\\nCtrl+Shift+X\",\n code: \"Código\\nCtrl+E\",\n superscript: \"Sobrescrito\",\n subscript: \"Subscrito\",\n highlight: \"Destacar\",\n highlightPicker: \"Cor de destaque\",\n textColor: \"Cor do texto\",\n link: \"Link\",\n addLink: \"Inserir link\",\n editLink: \"Editar link\",\n removeLink: \"Remover link\",\n linkUrl: \"URL do link\",\n linkText: \"Texto do link\",\n openLink: \"Abrir link\",\n customColor: \"Cor personalizada\",\n presets: \"Predefinições\",\n },\n slashCommands: {\n heading1: {\n title: \"Título 1\",\n description: \"Título de seção grande\",\n keywords: [\"heading\", \"h1\", \"title\", \"1\", \"header\", \"título\", \"titulo\", \"cabeçalho\"],\n },\n heading2: {\n title: \"Título 2\",\n description: \"Título de seção médio\",\n keywords: [\"heading\", \"h2\", \"title\", \"2\", \"header\", \"título\", \"titulo\", \"subtítulo\"],\n },\n heading3: {\n title: \"Título 3\",\n description: \"Título de seção pequeno\",\n keywords: [\"heading\", \"h3\", \"title\", \"3\", \"header\", \"título\", \"titulo\", \"subtítulo\"],\n },\n bulletList: {\n title: \"Lista com marcadores\",\n description: \"Criar uma lista com marcadores\",\n keywords: [\"bullet\", \"list\", \"ul\", \"unordered\", \"lista\", \"marcadores\", \"tópicos\"],\n },\n orderedList: {\n title: \"Lista numerada\",\n description: \"Criar uma lista numerada\",\n keywords: [\"ordered\", \"list\", \"ol\", \"numbered\", \"lista\", \"numerada\", \"ordenada\"],\n },\n blockquote: {\n title: \"Citação\",\n description: \"Adicionar uma citação\",\n keywords: [\"quote\", \"blockquote\", \"citation\", \"citação\", \"citacao\", \"aspas\"],\n },\n code: {\n title: \"Bloco de código\",\n description: \"Adicionar um bloco de código\",\n keywords: [\"code\", \"codeblock\", \"pre\", \"programming\", \"código\", \"codigo\", \"programação\"],\n },\n image: {\n title: \"Imagem\",\n description: \"Inserir uma imagem\",\n keywords: [\"image\", \"photo\", \"picture\", \"img\", \"imagem\", \"foto\"],\n },\n horizontalRule: {\n title: \"Linha horizontal\",\n description: \"Adicionar uma linha divisória\",\n keywords: [\"hr\", \"horizontal\", \"rule\", \"line\", \"separator\", \"linha\", \"divisor\", \"separador\"],\n },\n table: {\n title: \"Tabela\",\n description: \"Inserir uma tabela\",\n keywords: [\n \"table\",\n \"grid\",\n \"data\",\n \"rows\",\n \"columns\",\n \"tabela\",\n \"grade\",\n \"dados\",\n \"linhas\",\n \"colunas\",\n ],\n },\n tableOfContents: {\n title: \"Sumário\",\n description: \"Inserir um sumário\",\n keywords: [\n \"toc\",\n \"table\",\n \"contents\",\n \"summary\",\n \"index\",\n \"headings\",\n \"outline\",\n \"sumário\",\n \"sumario\",\n \"índice\",\n \"indice\",\n \"títulos\",\n ],\n },\n filterPlaceholder: \"Filtrar...\",\n },\n table: {\n addRowBefore: \"Inserir linha acima\",\n addRowAfter: \"Inserir linha abaixo\",\n deleteRow: \"Excluir linha\",\n addColumnBefore: \"Inserir coluna à esquerda\",\n addColumnAfter: \"Inserir coluna à direita\",\n deleteColumn: \"Excluir coluna\",\n deleteTable: \"Excluir tabela\",\n toggleHeaderRow: \"Alternar linha de cabeçalho\",\n toggleHeaderColumn: \"Alternar coluna de cabeçalho\",\n mergeCells: \"Mesclar células\",\n splitCell: \"Dividir célula\",\n },\n imageUpload: {\n selectImage: \"Selecionar imagem\",\n loadError: \"Erro ao carregar a imagem\",\n uploadingImage: \"Enviando imagem...\",\n uploadProgress: \"Progresso do envio\",\n uploadError: \"Erro no envio\",\n uploadSuccess: \"Envio concluído\",\n imageTooLarge: \"Imagem muito grande\",\n invalidFileType: \"Tipo de arquivo inválido\",\n dragDropText: \"Arraste e solte imagens aqui\",\n changeImage: \"Trocar imagem\",\n downloadImage: \"Baixar imagem\",\n deleteImage: \"Excluir imagem\",\n resizeSmall: \"Pequena\",\n resizeMedium: \"Média\",\n resizeLarge: \"Grande\",\n resizeOriginal: \"Original\",\n alignLeft: \"Alinhar à esquerda\",\n alignCenter: \"Centralizar\",\n alignRight: \"Alinhar à direita\",\n resizing: \"Redimensionando...\",\n compressing: \"Comprimindo...\",\n compressionError: \"Erro ao comprimir a imagem\",\n validating: \"Validando arquivo...\",\n uploadingToServer: \"Enviando para o servidor...\",\n replacingImage: \"Substituindo imagem...\",\n insertingImage: \"Inserindo no editor...\",\n noFileSelected: \"Nenhum arquivo de imagem selecionado\",\n selectionCancelled: \"Seleção cancelada\",\n },\n editor: {\n placeholder: \"Comece a escrever...\",\n character: \"caractere\",\n characterPlural: \"caracteres\",\n word: \"palavra\",\n wordPlural: \"palavras\",\n linkPrompt: \"Digite a URL do link\",\n linkUrlPrompt: \"Digite a URL\",\n confirmDelete: \"Tem certeza de que deseja excluir?\",\n toggleEdit: \"Mudar para o modo de edição\",\n viewMode: \"Mudar para o modo de leitura\",\n blockAdd: \"Clique para adicionar um bloco\",\n blockDrag: \"Arraste para mover este bloco\",\n tableOfContents: \"Sumário\",\n },\n common: {\n cancel: \"Cancelar\",\n confirm: \"Confirmar\",\n apply: \"Aplicar\",\n delete: \"Excluir\",\n save: \"Salvar\",\n close: \"Fechar\",\n loading: \"Carregando\",\n error: \"Erro\",\n success: \"Sucesso\",\n },\n export: {\n export: \"Exportar\",\n html: \"HTML\",\n markdown: \"Markdown\",\n text: \"Texto simples\",\n copyHtml: \"Copiar como HTML\",\n copyMarkdown: \"Copiar como Markdown\",\n copyText: \"Copiar como texto simples\",\n downloadHtml: \"Baixar .html\",\n downloadMarkdown: \"Baixar .md\",\n downloadText: \"Baixar .txt\",\n copiedSuccess: \"Copiado para a área de transferência!\",\n },\n};\n","import { AteTranslations } from \"./ateTranslationsModel\";\n\nexport const SPANISH_TRANSLATIONS: AteTranslations = {\n toolbar: {\n bold: \"Negrita\\nCtrl+B\",\n italic: \"Cursiva\\nCtrl+I\",\n underline: \"Subrayado\\nCtrl+U\",\n strike: \"Tachado\\nCtrl+Shift+X\",\n code: \"Código en línea\\nCtrl+E\",\n codeBlock: \"Bloque de código\",\n superscript: \"Superíndice\",\n subscript: \"Subíndice\",\n highlight: \"Resaltar\",\n highlightPicker: \"Color de resaltado\",\n heading1: \"Título 1\",\n heading2: \"Título 2\",\n heading3: \"Título 3\",\n bulletList: \"Lista con viñetas\",\n orderedList: \"Lista numerada\",\n blockquote: \"Cita\",\n alignLeft: \"Alinear a la izquierda\",\n alignCenter: \"Centrar\",\n alignRight: \"Alinear a la derecha\",\n alignJustify: \"Justificar\",\n link: \"Insertar enlace\",\n image: \"Insertar imagen\",\n horizontalRule: \"Línea horizontal\",\n table: \"Insertar tabla\",\n undo: \"Deshacer\\nCtrl+Z\",\n redo: \"Rehacer\\nCtrl+Shift+Z\",\n clear: \"Limpiar\",\n textColor: \"Color del texto\",\n customColor: \"Color personalizado\",\n presets: \"Predefinidos\",\n },\n bubbleMenu: {\n bold: \"Negrita\\nCtrl+B\",\n italic: \"Cursiva\\nCtrl+I\",\n underline: \"Subrayado\\nCtrl+U\",\n strike: \"Tachado\\nCtrl+Shift+X\",\n code: \"Código\\nCtrl+E\",\n superscript: \"Superíndice\",\n subscript: \"Subíndice\",\n highlight: \"Resaltar\",\n highlightPicker: \"Color de resaltado\",\n textColor: \"Color del texto\",\n link: \"Enlace\",\n addLink: \"Insertar enlace\",\n editLink: \"Editar enlace\",\n removeLink: \"Quitar enlace\",\n linkUrl: \"URL del enlace\",\n linkText: \"Texto del enlace\",\n openLink: \"Abrir enlace\",\n customColor: \"Color personalizado\",\n presets: \"Predefinidos\",\n },\n slashCommands: {\n heading1: {\n title: \"Título 1\",\n description: \"Título de sección grande\",\n keywords: [\"heading\", \"h1\", \"title\", \"1\", \"header\", \"título\", \"titulo\", \"encabezado\"],\n },\n heading2: {\n title: \"Título 2\",\n description: \"Título de sección mediano\",\n keywords: [\"heading\", \"h2\", \"title\", \"2\", \"header\", \"título\", \"titulo\", \"subtítulo\"],\n },\n heading3: {\n title: \"Título 3\",\n description: \"Título de sección pequeño\",\n keywords: [\"heading\", \"h3\", \"title\", \"3\", \"header\", \"título\", \"titulo\", \"subtítulo\"],\n },\n bulletList: {\n title: \"Lista con viñetas\",\n description: \"Crear una lista con viñetas\",\n keywords: [\"bullet\", \"list\", \"ul\", \"unordered\", \"lista\", \"viñetas\", \"puntos\"],\n },\n orderedList: {\n title: \"Lista numerada\",\n description: \"Crear una lista numerada\",\n keywords: [\"ordered\", \"list\", \"ol\", \"numbered\", \"lista\", \"numerada\", \"ordenada\"],\n },\n blockquote: {\n title: \"Cita\",\n description: \"Añadir una cita\",\n keywords: [\"quote\", \"blockquote\", \"citation\", \"cita\", \"citar\", \"comillas\"],\n },\n code: {\n title: \"Bloque de código\",\n description: \"Añadir un bloque de código\",\n keywords: [\"code\", \"codeblock\", \"pre\", \"programming\", \"código\", \"codigo\", \"programación\"],\n },\n image: {\n title: \"Imagen\",\n description: \"Insertar una imagen\",\n keywords: [\"image\", \"photo\", \"picture\", \"img\", \"imagen\", \"foto\"],\n },\n horizontalRule: {\n title: \"Línea horizontal\",\n description: \"Añadir una línea divisoria\",\n keywords: [\n \"hr\",\n \"horizontal\",\n \"rule\",\n \"line\",\n \"separator\",\n \"línea\",\n \"linea\",\n \"divisor\",\n \"separador\",\n ],\n },\n table: {\n title: \"Tabla\",\n description: \"Insertar una tabla\",\n keywords: [\n \"table\",\n \"grid\",\n \"data\",\n \"rows\",\n \"columns\",\n \"tabla\",\n \"cuadrícula\",\n \"datos\",\n \"filas\",\n \"columnas\",\n ],\n },\n tableOfContents: {\n title: \"Índice\",\n description: \"Insertar un índice\",\n keywords: [\n \"toc\",\n \"table\",\n \"contents\",\n \"summary\",\n \"index\",\n \"headings\",\n \"outline\",\n \"índice\",\n \"indice\",\n \"contenido\",\n \"sumario\",\n \"títulos\",\n ],\n },\n filterPlaceholder: \"Filtrar...\",\n },\n table: {\n addRowBefore: \"Insertar fila arriba\",\n addRowAfter: \"Insertar fila abajo\",\n deleteRow: \"Eliminar fila\",\n addColumnBefore: \"Insertar columna a la izquierda\",\n addColumnAfter: \"Insertar columna a la derecha\",\n deleteColumn: \"Eliminar columna\",\n deleteTable: \"Eliminar tabla\",\n toggleHeaderRow: \"Alternar fila de encabezado\",\n toggleHeaderColumn: \"Alternar columna de encabezado\",\n mergeCells: \"Combinar celdas\",\n splitCell: \"Dividir celda\",\n },\n imageUpload: {\n selectImage: \"Seleccionar imagen\",\n loadError: \"Error al cargar la imagen\",\n uploadingImage: \"Subiendo imagen...\",\n uploadProgress: \"Progreso de la subida\",\n uploadError: \"Error al subir\",\n uploadSuccess: \"Subida completada\",\n imageTooLarge: \"Imagen demasiado grande\",\n invalidFileType: \"Tipo de archivo no válido\",\n dragDropText: \"Arrastra y suelta imágenes aquí\",\n changeImage: \"Cambiar imagen\",\n downloadImage: \"Descargar imagen\",\n deleteImage: \"Eliminar imagen\",\n resizeSmall: \"Pequeña\",\n resizeMedium: \"Mediana\",\n resizeLarge: \"Grande\",\n resizeOriginal: \"Original\",\n alignLeft: \"Alinear a la izquierda\",\n alignCenter: \"Centrar\",\n alignRight: \"Alinear a la derecha\",\n resizing: \"Redimensionando...\",\n compressing: \"Comprimiendo...\",\n compressionError: \"Error al comprimir la imagen\",\n validating: \"Validando archivo...\",\n uploadingToServer: \"Subiendo al servidor...\",\n replacingImage: \"Reemplazando imagen...\",\n insertingImage: \"Insertando en el editor...\",\n noFileSelected: \"Ningún archivo de imagen seleccionado\",\n selectionCancelled: \"Selección cancelada\",\n },\n editor: {\n placeholder: \"Empieza a escribir...\",\n character: \"carácter\",\n characterPlural: \"caracteres\",\n word: \"palabra\",\n wordPlural: \"palabras\",\n linkPrompt: \"Introduce la URL del enlace\",\n linkUrlPrompt: \"Introduce la URL\",\n confirmDelete: \"¿Seguro que quieres eliminar esto?\",\n toggleEdit: \"Cambiar al modo de edición\",\n viewMode: \"Cambiar al modo de lectura\",\n blockAdd: \"Haz clic para añadir un bloque\",\n blockDrag: \"Arrastra para mover este bloque\",\n tableOfContents: \"Índice\",\n },\n common: {\n cancel: \"Cancelar\",\n confirm: \"Confirmar\",\n apply: \"Aplicar\",\n delete: \"Eliminar\",\n save: \"Guardar\",\n close: \"Cerrar\",\n loading: \"Cargando\",\n error: \"Error\",\n success: \"Éxito\",\n },\n export: {\n export: \"Exportar\",\n html: \"HTML\",\n markdown: \"Markdown\",\n text: \"Texto sin formato\",\n copyHtml: \"Copiar como HTML\",\n copyMarkdown: \"Copiar como Markdown\",\n copyText: \"Copiar como texto sin formato\",\n downloadHtml: \"Descargar .html\",\n downloadMarkdown: \"Descargar .md\",\n downloadText: \"Descargar .txt\",\n copiedSuccess: \"¡Copiado al portapapeles!\",\n },\n};\n","import { Injectable, signal, computed } from \"@angular/core\";\nimport { ENGLISH_TRANSLATIONS } from \"../i18n/en_ateTranslations\";\nimport { FRENCH_TRANSLATIONS } from \"../i18n/fr_ateTranslations\";\nimport { GERMAN_TRANSLATIONS } from \"../i18n/de_ateTranslations\";\nimport { PORTUGUESE_TRANSLATIONS } from \"../i18n/pt_ateTranslations\";\nimport { SPANISH_TRANSLATIONS } from \"../i18n/es_ateTranslations\";\nimport { AteTranslations, SupportedLocale } from \"../i18n/ateTranslationsModel\";\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 de: GERMAN_TRANSLATIONS,\n pt: PORTUGUESE_TRANSLATIONS,\n es: SPANISH_TRANSLATIONS,\n });\n\n // Public signals\n readonly currentLocale = this._currentLocale.asReadonly();\n /** All loaded translations (useful for dynamic key access) */\n readonly allTranslations = this._translations.asReadonly();\n\n readonly translations = computed(\n () => this.getTranslations(this._currentLocale()) ?? this._translations().en\n );\n\n // Fast translation methods\n readonly t = computed(() => this.translations());\n readonly toolbar = computed(() => this.translations().toolbar);\n readonly bubbleMenu = computed(() => this.translations().bubbleMenu);\n readonly slashCommands = computed(() => this.translations().slashCommands);\n readonly table = computed(() => this.translations().table);\n readonly imageUpload = computed(() => this.translations().imageUpload);\n readonly editor = computed(() => this.translations().editor);\n readonly common = computed(() => this.translations().common);\n readonly export = computed(() => this.translations().export);\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 getTranslations(locale: SupportedLocale): AteTranslations | undefined {\n const resolved = this.resolveLocale(locale);\n return resolved ? this._translations()[resolved] : undefined;\n }\n\n private resolveLocale(locale: string): string | undefined {\n const all = this._translations();\n if (all[locale]) {\n return locale;\n }\n const language = locale.toLowerCase().split(/[-_]/)[0];\n return all[language] ? language : undefined;\n }\n\n private detectBrowserLanguage(): void {\n this._currentLocale.set(this.resolveLocale(navigator.language) ?? \"en\");\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, computed, inject, signal } from \"@angular/core\";\nimport { AteTranslations, SupportedLocale } from \"../i18n/ateTranslationsModel\";\nimport { AteI18nService } from \"./ate-i18n.service\";\n\n/**\n * Translations seen by one editor instance. The editor provides its own copy and binds its\n * `locale` input to it; without a locale (or outside an editor) it follows the global\n * `AteI18nService` locale. Internal: not part of the public API.\n */\n@Injectable({ providedIn: \"root\" })\nexport class AteEditorI18n {\n private readonly global = inject(AteI18nService);\n private readonly localeSource = signal<() => SupportedLocale | undefined>(() => undefined);\n\n readonly translations = computed<AteTranslations>(() => {\n const locale = this.localeSource()();\n return (locale && this.global.getTranslations(locale)) || this.global.translations();\n });\n\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 readonly export = computed(() => this.translations().export);\n\n bindLocale(source: () => SupportedLocale | undefined): void {\n this.localeSource.set(source);\n }\n}\n","import {\n Component,\n input,\n inject,\n signal,\n computed,\n effect,\n untracked,\n ChangeDetectionStrategy,\n OnDestroy,\n HostListener,\n booleanAttribute,\n} from \"@angular/core\";\nimport { Editor } from \"@tiptap/core\";\nimport { AteEditorRef } from \"../../models/ate-editor-ref\";\nimport { AteEditorRegistry } from \"../../services/ate-editor-registry.service\";\nimport { AteEditorI18n } from \"../../services/ate-editor-i18n.service\";\n\nimport { AteTocItem, AteTocVariant } from \"../../models/ate-toc.model\";\n\n/**\n * Table of Contents Component (Notion-style)\n * Dynamically extracts headings from the active editor and displays them.\n * Configurable via inputs (floating, position, variants, hover expansion) and CSS variables.\n */\n@Component({\n selector: \"ate-table-of-contents\",\n standalone: true,\n imports: [],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n \"[class.ate-toc-host-floating]\": \"floating()\",\n \"[style.--ate-toc-position-mode]\": \"floating() ? positionMode() : null\",\n \"[class.ate-toc-host-absolute]\": \"floating() && positionMode() === 'absolute'\",\n \"[class.ate-toc-host-fixed]\": \"floating() && positionMode() === 'fixed'\",\n },\n template: `\n <div\n class=\"ate-toc-wrapper\"\n [class.ate-toc-floating]=\"floating()\"\n [class.ate-toc-position-absolute]=\"floating() && positionMode() === 'absolute'\"\n [class.ate-toc-position-fixed]=\"floating() && positionMode() === 'fixed'\"\n [class.ate-toc-position-left]=\"position() === 'left'\"\n [class.ate-toc-position-right]=\"position() === 'right'\"\n (mouseenter)=\"setMouseHover(true)\"\n (mouseleave)=\"setMouseHover(false)\"\n (focusin)=\"setFocused(true)\"\n (focusout)=\"setFocused(false)\">\n <div\n class=\"ate-toc\"\n [class.ate-toc-floating]=\"floating()\"\n [class.ate-toc-position-left]=\"position() === 'left'\"\n [class.ate-toc-position-right]=\"position() === 'right'\"\n [class.ate-toc-variant-card]=\"variant() === 'card'\"\n [class.ate-toc-variant-transparent]=\"variant() === 'transparent'\"\n [class.ate-toc-variant-minimal]=\"variant() === 'minimal'\"\n [class.ate-toc-hover-expand]=\"floating() && hoverExpand()\"\n [class.ate-toc-hovered]=\"floating() && hoverExpand() && isExpanded()\"\n role=\"navigation\"\n aria-label=\"Table of Contents\">\n @if (items().length > 0) {\n @if (showTitle()) {\n <div class=\"ate-toc-header\">{{ headerTitle() }}</div>\n }\n <div class=\"ate-toc-list\">\n @for (item of items(); track item.id) {\n <button\n type=\"button\"\n class=\"ate-toc-item\"\n [class.ate-toc-active]=\"item.active\"\n [attr.aria-current]=\"item.active ? 'true' : null\"\n [attr.data-level]=\"item.level\"\n (click)=\"scrollToHeading(item, $event)\"\n [title]=\"item.text\">\n <!-- Perfect native vector SVG dash with level-adapted viewBox & width -->\n <svg\n [attr.width]=\"dashWidth(item.level)\"\n height=\"2\"\n [attr.viewBox]=\"'0 0 ' + dashWidth(item.level) + ' 2'\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"ate-toc-dash\">\n <rect\n [attr.width]=\"dashWidth(item.level)\"\n height=\"2\"\n rx=\"1\"\n ry=\"1\"\n fill=\"currentColor\"></rect>\n </svg>\n\n <!-- Full heading text -->\n <span class=\"ate-toc-text\">{{ item.text }}</span>\n </button>\n }\n </div>\n }\n </div>\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n }\n\n /* Outer Hitbox Container Positioning */\n .ate-toc-wrapper.ate-toc-floating {\n position: var(--ate-toc-position-mode, fixed);\n top: var(--ate-toc-top, 50%);\n transform: translateY(-50%);\n z-index: var(--ate-toc-z-index, 95);\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n }\n\n .ate-toc-wrapper.ate-toc-floating.ate-toc-position-absolute,\n :host(.ate-toc-host-absolute) .ate-toc-wrapper.ate-toc-floating {\n position: absolute;\n }\n\n .ate-toc-wrapper.ate-toc-floating.ate-toc-position-fixed,\n :host(.ate-toc-host-fixed) .ate-toc-wrapper.ate-toc-floating {\n position: fixed;\n }\n\n .ate-toc-wrapper.ate-toc-floating.ate-toc-position-right {\n right: var(--ate-toc-right, 2rem);\n left: auto;\n padding-left: var(--ate-toc-hitbox-padding, 16px);\n padding-right: 0;\n padding-top: var(--ate-toc-hitbox-padding-vertical, 8px);\n padding-bottom: var(--ate-toc-hitbox-padding-vertical, 8px);\n }\n\n .ate-toc-wrapper.ate-toc-floating.ate-toc-position-left {\n left: var(--ate-toc-left, 2rem);\n right: auto;\n padding-right: var(--ate-toc-hitbox-padding, 16px);\n padding-left: 0;\n padding-top: var(--ate-toc-hitbox-padding-vertical, 8px);\n padding-bottom: var(--ate-toc-hitbox-padding-vertical, 8px);\n }\n\n .ate-toc {\n font-family: inherit;\n user-select: none;\n width: 100%;\n box-sizing: border-box;\n transition: all 0.3s cubic-bezier(0.25, 0.46, 0.45, 0.94);\n }\n\n /* Floating Mode Container Positioning */\n .ate-toc.ate-toc-floating {\n max-height: var(--ate-toc-max-height, 400px);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n }\n\n /* Floating mode width & padding */\n .ate-toc.ate-toc-floating:not(.ate-toc-hover-expand),\n .ate-toc.ate-toc-floating.ate-toc-hover-expand:hover,\n .ate-toc.ate-toc-floating.ate-toc-hover-expand.ate-toc-hovered {\n width: var(--ate-toc-width, 240px);\n border-radius: var(--ate-toc-border-radius, var(--ate-border-radius, 16px));\n padding: var(--ate-toc-padding);\n }\n\n .ate-toc.ate-toc-floating.ate-toc-hover-expand:not(.ate-toc-hovered):not(:hover) {\n width: var(--ate-toc-collapsed-width, 32px);\n border-radius: var(--ate-toc-collapsed-radius, 16px);\n padding: var(--ate-toc-padding);\n }\n\n /* Variant: card */\n .ate-toc.ate-toc-variant-card {\n background: var(--ate-toc-bg, var(--ate-surface, #ffffff));\n border: 1px solid var(--ate-toc-border, var(--ate-border, #e2e8f0));\n border-radius: var(--ate-toc-border-radius, var(--ate-border-radius, 12px));\n box-shadow: var(--ate-toc-shadow, 0 4px 20px rgba(0, 0, 0, 0.06));\n padding: var(--ate-toc-padding);\n }\n\n /* Variant: minimal */\n .ate-toc.ate-toc-variant-minimal {\n background: transparent;\n border: 1px solid transparent;\n box-shadow: none;\n border-radius: var(--ate-toc-border-radius, var(--ate-border-radius, 12px));\n padding: 10px 12px;\n }\n\n .ate-toc.ate-toc-variant-minimal:hover {\n background: var(--ate-toc-hover-bg, var(--ate-surface, rgba(255, 255, 255, 0.95)));\n border-color: var(--ate-toc-hover-border, var(--ate-border, #e2e8f0));\n box-shadow: var(--ate-toc-hover-shadow, 0 4px 20px rgba(0, 0, 0, 0.06));\n }\n\n /* Variant: transparent */\n .ate-toc.ate-toc-variant-transparent {\n background: transparent;\n border: none;\n box-shadow: none;\n padding: 0;\n }\n\n /* Header styling */\n .ate-toc-header {\n font-size: 0.65rem;\n text-transform: uppercase;\n letter-spacing: 0.08em;\n font-weight: 700;\n color: var(--ate-text-muted, #9ca3af);\n margin-bottom: 10px;\n margin-top: 6px;\n padding-left: 12px;\n padding-right: 0;\n text-align: left;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n transition: opacity 0.2s ease;\n }\n\n /* List container */\n .ate-toc-list {\n display: flex;\n flex-direction: column;\n gap: var(--ate-toc-text-gap, var(--ate-toc-gap, 2px));\n position: relative;\n transition: gap 0.2s ease;\n }\n\n /* Base Item (Expanded / Text mode default) */\n .ate-toc-item {\n display: flex;\n align-items: center;\n justify-content: flex-start;\n text-align: left;\n position: relative;\n text-decoration: none;\n background: transparent;\n border: none;\n padding-right: 0;\n cursor: pointer;\n font: inherit;\n width: 100%;\n height: var(--ate-toc-item-hover-height, 22px);\n color: var(--ate-toolbar-button-color, var(--ate-text-secondary, #64748b));\n outline: none;\n box-sizing: border-box;\n border-radius: var(--ate-sub-border-radius, 8px);\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n overflow: hidden;\n }\n\n .ate-toc-item:focus-visible {\n outline: 2px solid var(--ate-primary, #2563eb);\n outline-offset: 1px;\n }\n\n /* Level Indentations in Text mode */\n .ate-toc-item[data-level=\"1\"] {\n padding-left: 8px;\n }\n .ate-toc-item[data-level=\"2\"] {\n padding-left: 16px;\n }\n .ate-toc-item[data-level=\"3\"] {\n padding-left: 24px;\n }\n .ate-toc-item[data-level=\"4\"] {\n padding-left: 32px;\n }\n .ate-toc-item[data-level=\"5\"] {\n padding-left: 40px;\n }\n .ate-toc-item[data-level=\"6\"] {\n padding-left: 48px;\n }\n\n /* Item hover overlay & active state (Expanded / Text mode) */\n .ate-toc-item::before {\n content: \"\";\n position: absolute;\n inset: 0;\n background: var(--ate-primary, #2563eb);\n opacity: 0;\n transition: opacity 0.2s ease;\n border-radius: var(--ate-sub-border-radius, 8px);\n pointer-events: none;\n }\n\n .ate-toc-item:hover {\n color: var(--ate-toolbar-button-active-color, var(--ate-primary, #2563eb));\n background: var(--ate-toolbar-button-hover-background, transparent);\n }\n\n .ate-toc-item:hover::before {\n opacity: 0.1;\n }\n\n .ate-toc-item.ate-toc-active {\n color: var(--ate-toolbar-button-active-color, var(--ate-primary, #2563eb));\n background: var(\n --ate-toolbar-button-active-background,\n var(--ate-primary-light, color-mix(in srgb, var(--ate-primary, #2563eb), transparent 90%))\n );\n font-weight: 600;\n }\n\n /* Heading Text styling */\n .ate-toc-text {\n font-size: 0.8rem;\n font-weight: 500;\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n flex: 1;\n min-width: 0;\n opacity: 1;\n max-width: 250px;\n transform: translateX(0);\n margin-left: 4px;\n margin-right: 0;\n transition:\n opacity 0.25s cubic-bezier(0.25, 0.46, 0.45, 0.94),\n max-width 0.3s cubic-bezier(0.25, 0.46, 0.45, 0.94),\n transform 0.25s cubic-bezier(0.25, 0.46, 0.45, 0.94),\n margin 0.25s ease;\n }\n\n /* SVG Rect Dash styling (Hidden in Text mode) */\n .ate-toc-dash {\n display: none;\n height: 3px;\n color: var(--ate-toc-dash-color, var(--ate-border, #cbd5e1));\n flex-shrink: 0;\n vertical-align: middle;\n overflow: visible;\n transition: all 0.3s cubic-bezier(0.25, 0.46, 0.45, 0.94);\n }\n\n /* --- COLLAPSED NOTION MODE (Dashes only, when hover-expand is active & not hovered) --- */\n .ate-toc.ate-toc-hover-expand:not(.ate-toc-hovered) .ate-toc-header {\n display: none;\n }\n\n .ate-toc.ate-toc-hover-expand:not(.ate-toc-hovered) .ate-toc-dash {\n display: inline-block;\n }\n\n .ate-toc.ate-toc-hover-expand:not(.ate-toc-hovered) .ate-toc-item {\n height: var(--ate-toc-item-height, 18px);\n padding-left: 0;\n padding-right: 0;\n background: transparent;\n }\n\n .ate-toc.ate-toc-hover-expand:not(.ate-toc-hovered) .ate-toc-item::before {\n opacity: 0;\n }\n\n .ate-toc.ate-toc-hover-expand:not(.ate-toc-hovered) .ate-toc-item:hover .ate-toc-dash,\n .ate-toc.ate-toc-hover-expand:not(.ate-toc-hovered)\n .ate-toc-item.ate-toc-active\n .ate-toc-dash {\n color: var(--ate-primary, #2563eb);\n opacity: 1;\n }\n\n /* Direction & text collapse for Collapsed RIGHT position */\n .ate-toc.ate-toc-hover-expand.ate-toc-position-right:not(.ate-toc-hovered) .ate-toc-item {\n flex-direction: row-reverse;\n justify-content: flex-start;\n }\n\n .ate-toc.ate-toc-hover-expand.ate-toc-position-right:not(.ate-toc-hovered) .ate-toc-text {\n opacity: 0;\n max-width: 0;\n transform: translateX(4px);\n margin-right: 0;\n }\n\n /* Direction & text collapse for Collapsed LEFT position */\n .ate-toc.ate-toc-hover-expand:not(.ate-toc-position-right):not(.ate-toc-hovered)\n .ate-toc-item,\n .ate-toc.ate-toc-hover-expand.ate-toc-position-left:not(.ate-toc-hovered) .ate-toc-item {\n flex-direction: row;\n justify-content: flex-start;\n }\n\n .ate-toc.ate-toc-hover-expand:not(.ate-toc-position-right):not(.ate-toc-hovered)\n .ate-toc-text,\n .ate-toc.ate-toc-hover-expand.ate-toc-position-left:not(.ate-toc-hovered) .ate-toc-text {\n opacity: 0;\n max-width: 0;\n transform: translateX(-4px);\n margin-left: 0;\n }\n `,\n ],\n})\nexport class AteTableOfContentsComponent implements OnDestroy {\n // Input accepts raw Editor, AteEditorRef, or ID of registered editor\n editor = input<Editor | AteEditorRef | string | null | undefined>(null);\n\n // Optional custom title (if not provided, uses i18n translation)\n title = input<string | null>(null);\n\n // Whether to show the header title\n showTitle = input(true, { transform: booleanAttribute });\n\n // Layout mode: floating on fixed position or inline inside parent container\n floating = input(true, { transform: booleanAttribute });\n\n // Positioning mode when floating: 'fixed' (relative to viewport, default) or 'absolute' (relative to parent container)\n positionMode = input<\"absolute\" | \"fixed\">(\"fixed\");\n\n // Floating position: 'right' | 'left'\n position = input<\"left\" | \"right\">(\"right\");\n\n // Visual variant: 'minimal' | 'card' | 'transparent'\n variant = input<AteTocVariant>(\"minimal\");\n\n // Notion-style hover expansion (collapses text into dashes until hovered)\n hoverExpand = input(true, { transform: booleanAttribute });\n\n // Maximum heading level depth to include (1-6, default: 6)\n maxDepth = input<number, number | string>(6, {\n transform: (v: number | string) => {\n const parsed = typeof v === \"string\" ? parseInt(v, 10) : v;\n if (isNaN(parsed)) {\n return 6;\n }\n return Math.min(Math.max(1, parsed), 6);\n },\n });\n\n private readonly registry = inject(AteEditorRegistry);\n private readonly i18n = inject(AteEditorI18n);\n\n // Helper method for exact native SVG dash width per heading level\n dashWidth(level: number): number {\n switch (level) {\n case 1:\n return 16;\n case 2:\n return 12;\n case 3:\n return 8;\n case 4:\n return 6;\n case 5:\n return 4;\n default:\n return 3;\n }\n }\n\n // Computed header title with fallback to i18n\n readonly headerTitle = computed(() => {\n const custom = this.title();\n if (custom !== null && custom !== undefined) {\n return custom;\n }\n return this.i18n.editor().tableOfContents;\n });\n\n // Resolved editor instance\n readonly resolvedEditor = computed(() => {\n const val = this.editor();\n if (!val) {\n return this.registry.activeEditor()?.editor || null;\n }\n if (val instanceof AteEditorRef) {\n return val.editor;\n }\n if (typeof val === \"string\") {\n return this.registry.get(val)?.editor || null;\n }\n return val;\n });\n\n // Table of Contents items\n readonly items = signal<AteTocItem[]>([]);\n\n // Distinct mouse hover and keyboard focus state tracking\n isMouseHovered = signal<boolean>(false);\n isFocused = signal<boolean>(false);\n readonly isExpanded = computed(() => this.isMouseHovered() || this.isFocused());\n\n constructor() {\n // React strictly to editor instance changes without tracking internal signal updates\n effect(() => {\n const editor = this.resolvedEditor();\n untracked(() => {\n if (editor) {\n this.bindEditorEvents(editor);\n this.updateHeadings(editor);\n } else {\n this.items.set([]);\n }\n });\n });\n }\n\n ngOnDestroy() {\n const editor = this.resolvedEditor();\n if (editor) {\n this.unbindEditorEvents(editor);\n }\n }\n\n @HostListener(\"window:scroll\", [])\n @HostListener(\"window:resize\", [])\n onScroll() {\n this.checkActiveHeading();\n }\n\n // Handle mouse hover state independently\n setMouseHover(hovered: boolean) {\n this.isMouseHovered.set(hovered);\n }\n\n // Handle keyboard focus state independently\n setFocused(focused: boolean) {\n this.isFocused.set(focused);\n }\n\n // Navigate to heading on click\n scrollToHeading(item: AteTocItem, event: MouseEvent) {\n event.preventDefault();\n event.stopPropagation();\n\n const editor = this.resolvedEditor();\n if (!editor || !editor.view) {\n return;\n }\n\n try {\n // 1. Position cursor inside the heading text (item.pos + 1 points to inline text)\n const targetPos = Math.min(item.pos + 1, editor.state.doc.content.size);\n editor.commands.setTextSelection(targetPos);\n editor.commands.focus();\n } catch (_e) {\n // Safe-guard against position selection errors\n }\n\n // 2. Smoothly scroll DOM node into view\n setTimeout(() => {\n try {\n const domNode = editor.view.nodeDOM(item.pos) as HTMLElement;\n if (domNode) {\n domNode.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\n }\n } catch (_e) {\n // Safe-guard\n }\n }, 10);\n }\n\n private bindEditorEvents(editor: Editor) {\n this.unbindEditorEvents(editor);\n editor.on(\"update\", this.onEditorUpdate);\n editor.on(\"selectionUpdate\", this.onEditorUpdate);\n }\n\n private unbindEditorEvents(editor: Editor) {\n editor.off(\"update\", this.onEditorUpdate);\n editor.off(\"selectionUpdate\", this.onEditorUpdate);\n }\n\n private readonly onEditorUpdate = () => {\n const editor = this.resolvedEditor();\n if (editor) {\n this.updateHeadings(editor);\n }\n };\n\n private updateHeadings(editor: Editor) {\n const nextItems: AteTocItem[] = [];\n\n try {\n editor.state.doc.descendants((node, pos) => {\n if (node.type.name === \"heading\") {\n const text = node.textContent.trim();\n const level = node.attrs[\"level\"] || 1;\n\n const maxDepthLevel = this.maxDepth();\n if (text && level <= maxDepthLevel) {\n nextItems.push({\n text,\n level,\n pos,\n id: `heading-${pos}`,\n active: false,\n });\n }\n }\n });\n } catch (_e) {\n // Safe guard against document access issues\n }\n\n untracked(() => {\n this.items.set(nextItems);\n this.checkActiveHeading();\n });\n }\n\n private checkActiveHeading() {\n // Active heading scroll tracking only applies to floating TOC mode\n if (!this.floating()) {\n return;\n }\n\n const editor = this.resolvedEditor();\n if (!editor || !editor.view) {\n return;\n }\n\n untracked(() => {\n const currentItems = this.items();\n if (currentItems.length === 0) {\n return;\n }\n\n const headingsWithDom = currentItems\n .map(item => {\n try {\n const dom = editor.view.nodeDOM(item.pos) as HTMLElement;\n return { item, dom };\n } catch (_e) {\n return { item, dom: null };\n }\n })\n .filter((entry): entry is { item: AteTocItem; dom: HTMLElement } => entry.dom !== null);\n\n if (headingsWithDom.length === 0) {\n return;\n }\n\n const windowHeight = typeof window !== \"undefined\" ? window.innerHeight : 800;\n let activeItem: AteTocItem | null = null;\n\n for (let i = headingsWithDom.length - 1; i >= 0; i--) {\n const { item, dom } = headingsWithDom[i];\n const rect = dom.getBoundingClientRect();\n\n if (rect.top <= windowHeight * 0.35) {\n activeItem = item;\n break;\n }\n }\n\n if (!activeItem && headingsWithDom.length > 0) {\n activeItem = headingsWithDom[0].item;\n }\n\n if (activeItem) {\n const updated = currentItems.map(item => ({\n ...item,\n active: item.id === activeItem!.id,\n }));\n\n const isDifferent = updated.some((item, idx) => item.active !== currentItems[idx].active);\n if (isDifferent) {\n this.items.set(updated);\n }\n }\n });\n }\n}\n","import { Component, ChangeDetectionStrategy } from \"@angular/core\";\nimport { Injector } from \"@angular/core\";\nimport { AteAngularNodeView } from \"../../node-view/ate-angular-node-view\";\nimport { registerAngularComponent } from \"../../node-view/ate-register-angular-component\";\nimport { RegisterAngularComponentOptions } from \"../../node-view/ate-node-view.models\";\nimport { AteTableOfContentsComponent } from \"./ate-table-of-contents.component\";\n\n/**\n * Custom Angular NodeView wrapper for displaying Table of Contents directly inside the editor content.\n */\n@Component({\n selector: \"ate-toc-node\",\n standalone: true,\n imports: [AteTableOfContentsComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div class=\"ate-toc-node-wrapper\">\n <ate-table-of-contents\n [editor]=\"editor()\"\n [floating]=\"false\"\n [variant]=\"node().attrs['variant'] || 'minimal'\"\n [showTitle]=\"node().attrs['showTitle'] !== false\"\n [maxDepth]=\"node().attrs['maxDepth'] || 6\" />\n </div>\n `,\n styles: [\n `\n .ate-toc-node-wrapper {\n margin: 1rem 0;\n user-select: none;\n }\n `,\n ],\n})\nexport class AteTocNodeComponent extends AteAngularNodeView {}\n\n/**\n * Registration options for the Table of Contents Angular NodeView\n */\nexport const AteTocNodeOptions: RegisterAngularComponentOptions<AteTocNodeComponent> = {\n component: AteTocNodeComponent,\n name: \"tableOfContents\",\n group: \"block\",\n draggable: true,\n attributes: {\n variant: {\n default: \"minimal\",\n },\n showTitle: {\n default: true,\n },\n maxDepth: {\n default: 6,\n },\n },\n};\n\n/**\n * Creates the Table of Contents TipTap Node Extension instance.\n */\nexport function getAteTocNodeExtension(injector?: Injector) {\n if (injector) {\n return registerAngularComponent(injector, AteTocNodeOptions);\n }\n return registerAngularComponent(AteTocNodeOptions);\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 { Directive, ElementRef, input, OnDestroy, inject, effect, computed } from \"@angular/core\";\nimport tippy, { Instance as TippyInstance, Placement } from \"tippy.js\";\n\n// Pre-calculate platform once to avoid repeated checks\nconst IS_MAC = typeof window !== \"undefined\" && /Mac|iPod|iPhone|iPad/.test(navigator.platform);\n\nconst DURATION: [number, number] = [100, 100];\n// After a tooltip closes, the next one still opens at once if hovered within this gap\nconst WARM_GAP = 300;\n\n// Shared by every tooltip: the first one waits for its delay, the next ones open at once,\n// without animation, as long as the pointer moves from one control to the next.\nlet openTooltip: TippyInstance | null = null;\nlet warm = false;\nlet coolTimeout: ReturnType<typeof setTimeout> | undefined;\n\n@Directive({\n selector: \"[ateTooltip]\",\n standalone: true,\n host: {\n \"[attr.aria-keyshortcuts]\": \"ariaShortcut()\",\n },\n})\nexport class AteTooltipDirective implements OnDestroy {\n private readonly el = inject(ElementRef);\n private tippyInstance: TippyInstance | null = null;\n\n // Signal Inputs\n content = input<string | null>(null, { alias: \"ateTooltip\" });\n placement = input<Placement>(\"top\", { alias: \"ateTooltipPlacement\" });\n delay = input<number | [number, number]>([200, 50], { alias: \"ateTooltipDelay\" });\n disabled = input<boolean>(false, { alias: \"ateTooltipDisabled\" });\n\n /**\n * Computed logic for ARIA shortcuts.\n */\n protected readonly ariaShortcut = computed(() => {\n const text = this.content();\n if (!text || !text.includes(\"\\n\")) {\n return null;\n }\n return text.split(\"\\n\")[1].replace(/\\+/g, \" \");\n });\n\n /**\n * Computed logic for Tippy content.\n * Includes strict escaping of dynamic content to prevent XSS.\n */\n private readonly processedTooltip = computed(() => {\n const text = this.content();\n if (!text) {\n return { content: \"\", isHTML: false };\n }\n\n if (text.includes(\"\\n\")) {\n const [label, shortcut] = text.split(\"\\n\");\n\n // Escape dynamic parts to prevent XSS before wrapping in safe HTML\n const safeLabel = this.escapeHtml(label);\n let safeShortcut = this.escapeHtml(shortcut);\n\n if (IS_MAC) {\n safeShortcut = safeShortcut.replace(/Ctrl\\+/g, \"⌘\").replace(/Mod\\+/g, \"⌘\");\n } else {\n safeShortcut = safeShortcut.replace(/Mod\\+/g, \"Ctrl+\");\n }\n\n return {\n content: `<div class=\"ate-tooltip-label\">${safeLabel}</div><div class=\"ate-tooltip-shortcut\"><kbd>${safeShortcut}</kbd></div>`,\n isHTML: true,\n };\n }\n\n // No newline? Keep it as plain text (Tippy handles string as text by default)\n return { content: text, isHTML: false };\n });\n\n constructor() {\n effect(() => {\n const { content, isHTML } = this.processedTooltip();\n const placement = this.placement();\n const delay = this.delay();\n const isDisabled = this.disabled();\n\n if (isDisabled || !content) {\n this.destroyTippy();\n return;\n }\n\n if (!this.tippyInstance) {\n this.initTippy(content, isHTML, placement, delay);\n } else {\n this.tippyInstance.setProps({\n content,\n allowHTML: isHTML,\n placement,\n delay,\n });\n }\n });\n }\n\n ngOnDestroy(): void {\n this.destroyTippy();\n }\n\n /**\n * Basic HTML escaping for security.\n * Effectively neutralizes scripts or malicious HTML tags.\n */\n private escapeHtml(unsafe: string): string {\n return unsafe\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#039;\");\n }\n\n private initTippy(\n content: string,\n allowHTML: boolean,\n placement: Placement,\n delay: number | [number, number]\n ): void {\n const container = this.el.nativeElement.closest(\".ate-editor\") || document.body;\n\n this.tippyInstance = tippy(this.el.nativeElement, {\n content,\n allowHTML,\n placement,\n delay,\n duration: DURATION,\n offset: [0, 6],\n theme: \"ate-tooltip\",\n touch: [\"hold\", 500],\n maxWidth: 250,\n appendTo: () => container,\n aria: {\n content: \"describedby\",\n },\n onTrigger: (instance, event) => {\n const base = this.delay();\n const instant = warm && event.type === \"mouseenter\";\n instance.setProps({\n delay: instant ? [0, Array.isArray(base) ? base[1] : base] : base,\n duration: instant ? [0, DURATION[1]] : DURATION,\n });\n },\n onShow: instance => {\n // Only one tooltip at a time: the previous one goes away at once\n if (openTooltip && openTooltip !== instance) {\n openTooltip.unmount();\n }\n openTooltip = instance;\n warm = true;\n clearTimeout(coolTimeout);\n },\n onHidden: instance => {\n if (openTooltip !== instance) {\n return;\n }\n openTooltip = null;\n coolTimeout = setTimeout(() => (warm = false), WARM_GAP);\n },\n popperOptions: {\n modifiers: [\n {\n name: \"preventOverflow\",\n options: {\n boundary: document.body,\n padding: 8,\n },\n },\n ],\n },\n }) as unknown as TippyInstance;\n }\n\n private destroyTippy(): void {\n if (this.tippyInstance) {\n if (openTooltip === this.tippyInstance) {\n openTooltip = null;\n }\n this.tippyInstance.destroy();\n this.tippyInstance = null;\n }\n }\n}\n","import {\n Component,\n ChangeDetectionStrategy,\n ViewEncapsulation,\n computed,\n inject,\n input,\n} from \"@angular/core\";\nimport { DomSanitizer } from \"@angular/platform-browser\";\nimport { AteIconKey, AteIconRegistry } from \"../../services/ate-icon-registry.service\";\n\n/**\n * Renders an icon from the AteIconRegistry as inline SVG,\n * or with the Material Symbols font when the name is not registered.\n * Its size follows the `font-size` (1em). Library icons are filled with `currentColor`;\n * a full custom `<svg>` keeps its own `fill` and `stroke` attributes.\n */\n@Component({\n selector: \"ate-icon\",\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n // The SVG is injected as HTML: its styles cannot be scoped to the component\n encapsulation: ViewEncapsulation.None,\n host: {\n class: \"ate-icon\",\n \"aria-hidden\": \"true\",\n \"[innerHTML]\": \"content()\",\n },\n template: \"\",\n styles: [\n `\n .ate-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 1em;\n height: 1em;\n font-size: 24px;\n line-height: 1;\n }\n\n .ate-icon > svg {\n display: block;\n width: 100%;\n height: 100%;\n }\n\n .ate-icon > .material-symbols-outlined {\n font-size: inherit;\n }\n `,\n ],\n})\nexport class AteIconComponent {\n private readonly registry = inject(AteIconRegistry);\n private readonly sanitizer = inject(DomSanitizer);\n\n /** Library icon, icon registered with provideAteIcons, or Material Symbols name (font) */\n name = input.required<AteIconKey>();\n\n // Icons come from the library or from the developer, never from user content\n readonly content = computed(() =>\n this.sanitizer.bypassSecurityTrustHtml(this.registry.markup(this.name()))\n );\n}\n","import { Component, input, output, ChangeDetectionStrategy, booleanAttribute } from \"@angular/core\";\nimport { AteTooltipDirective } from \"../../directives/ate-tooltip.directive\";\nimport { AteIconComponent } from \"./ate-icon.component\";\nimport { AteIconKey } from \"../../services/ate-icon-registry.service\";\n\nexport interface AteButtonConfig {\n icon: AteIconKey;\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 imports: [AteTooltipDirective, AteIconComponent],\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 [ateTooltip]=\"title()\"\n [attr.aria-label]=\"title()\"\n (mousedown)=\"onMouseDown($event)\"\n (click)=\"buttonClick.emit($event)\"\n type=\"button\">\n @if (icon()) {\n <ate-icon\n [name]=\"icon()\"\n [class.icon-small]=\"iconSize() === 'small'\"\n [class.icon-medium]=\"iconSize() === 'medium'\"\n [class.icon-large]=\"iconSize() === 'large'\" />\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 .ate-icon {\n font-size: 20px;\n position: relative;\n z-index: 1;\n }\n\n .ate-button .ate-icon.icon-small {\n font-size: 16px;\n }\n\n .ate-button .ate-icon.icon-medium {\n font-size: 20px;\n }\n\n .ate-button .ate-icon.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 .ate-icon {\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<AteIconKey>(\"\");\n title = input.required<string>();\n active = input(false, { transform: booleanAttribute });\n disabled = input(false, { transform: booleanAttribute });\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, ChangeDetectionStrategy } from \"@angular/core\";\n\n@Component({\n selector: \"ate-separator\",\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `<div class=\"ate-separator\"></div>`,\n styles: [\n `\n .ate-separator {\n width: 1px;\n height: 24px;\n background-color: var(--ate-border, #e2e8f0);\n margin: 0 var(--ate-menu-gap, 2px);\n flex-shrink: 0;\n }\n `,\n ],\n})\nexport class AteSeparatorComponent {}\n","import { Injectable, signal, computed, inject } from \"@angular/core\";\nimport { Editor } from \"@tiptap/core\";\nimport { Node as PMNode } from \"@tiptap/pm/model\";\nimport { NodeSelection, Transaction } from \"@tiptap/pm/state\";\nimport { isObservable, firstValueFrom } from \"rxjs\";\nimport { AteEditorI18n } from \"./ate-editor-i18n.service\";\nimport { ateResolveImageSrc } from \"../utils/ate-image-src-resolver.utils\";\nimport {\n AteResizeOptions,\n AteImageUploadOptions,\n AteImageUploadHandler,\n AteImageSrcResolver,\n AteImageUploadResult,\n AteImageData,\n AteImageRejection,\n AteImageSource,\n AteImageValidationError,\n AteImageValidationReason,\n} from \"../models/ate-image.model\";\n\n/** An image position followed through document changes, see `trackSelectedImage` */\ninterface AteTrackedImage {\n /** Current position of the image, or `null` when no image was selected */\n pos: () => number | null;\n stop: () => void;\n}\n\n/** Whether `pos` holds an image node (`NodeSelection.create` throws on an empty position) */\nfunction isImageAt(doc: PMNode, pos: number): boolean {\n return pos >= 0 && pos < doc.content.size && doc.nodeAt(pos)?.type.name === \"resizableImage\";\n}\n\n@Injectable()\nexport class AteImageService {\n onImageUploadedCallback?: (result: AteImageUploadResult) => void;\n onImageRejectedCallback?: (rejection: AteImageRejection) => void;\n\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(AteEditorI18n);\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 srcResolver: AteImageSrcResolver | 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 editor\n .chain()\n .focus()\n .setResizableImage(imageData)\n .command(({ tr }) => {\n // Selection is usually after the node. Node is at tr.selection.from - 1.\n // Only select a position that holds an image: NodeSelection throws on an empty position.\n const { from } = tr.selection;\n const imagePos = [from, from - 1].find(pos => isImageAt(tr.doc, pos));\n if (imagePos !== undefined) {\n tr.setSelection(NodeSelection.create(tr.doc, imagePos));\n }\n return true;\n })\n .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 const storedSrc = editor.getAttributes(\"resizableImage\")[\"src\"];\n ateResolveImageSrc(this.srcResolver, storedSrc).then(src => {\n img.src = src;\n });\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 /** Download the current image */\n downloadImage(editor: Editor): void {\n const attrs = editor.getAttributes(\"resizableImage\");\n if (!attrs || !attrs[\"src\"]) {\n return;\n }\n\n const fileName = attrs[\"alt\"] || \"image\";\n\n ateResolveImageSrc(this.srcResolver, attrs[\"src\"]).then(src =>\n this.downloadResolvedImage(src, fileName)\n );\n }\n\n private downloadResolvedImage(src: string, fileName: string): void {\n // Detect if it's base64 or remote URL\n if (\n src.startsWith(\"data:\") ||\n src.startsWith(\"blob:\") ||\n (typeof window !== \"undefined\" && src.startsWith(window.location.origin))\n ) {\n const link = document.createElement(\"a\");\n link.href = src;\n link.download = fileName;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n } else {\n // For remote URLs, we try to fetch it to bypass cross-origin restrictions on 'download' attribute\n fetch(src)\n .then(response => response.blob())\n .then(blob => {\n const url = window.URL.createObjectURL(blob);\n const link = document.createElement(\"a\");\n link.href = url;\n link.download = fileName;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n window.URL.revokeObjectURL(url);\n })\n .catch(err => {\n console.error(\"Error downloading image:\", err);\n // Fallback to opening in new tab\n window.open(src, \"_blank\");\n });\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; reason?: AteImageValidationReason } {\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, reason: \"invalid-type\" };\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 reason: \"too-large\",\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 | undefined,\n source: AteImageSource\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 result = await this.processImage(file, options, (progress, message) => {\n if (progress !== undefined) {\n this.uploadProgress.set(progress);\n }\n if (message !== undefined) {\n this.uploadMessage.set(message);\n this.forceEditorUpdate();\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 if (this.onImageUploadedCallback) {\n this.onImageUploadedCallback(result);\n }\n\n this.resetUploadState();\n } catch (error) {\n this.resetUploadState();\n console.error(this.t().uploadError, error);\n this.onImageRejectedCallback?.({\n reason: error instanceof AteImageValidationError ? error.reason : \"upload-failed\",\n file,\n source,\n });\n throw error;\n }\n }\n\n /** Validate, compress and (when configured) send an image to the upload handler */\n private async processImage(\n file: File,\n options?: AteImageUploadOptions,\n onStep?: (progress?: number, message?: string) => void\n ): Promise<AteImageUploadResult> {\n const validation = this.validateImage(file, {\n maxSize: options?.maxSize,\n allowedTypes: options?.allowedTypes,\n });\n if (!validation.valid) {\n throw new AteImageValidationError(\n validation.reason ?? \"invalid-type\",\n validation.error ?? \"\"\n );\n }\n\n onStep?.(30, this.t().compressing);\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 onStep?.(70);\n\n // Handle custom upload if handler is provided\n if (this.uploadHandler) {\n onStep?.(undefined, this.t().uploadingToServer);\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 return result;\n }\n\n /**\n * Run an image that is already in the document (e.g. base64 from pasted HTML)\n * through validation, compression and the upload handler, and resolve to its new `src`.\n */\n async rehostImage(file: File, options?: AteImageUploadOptions): Promise<string> {\n try {\n const result = await this.processImage(file, options);\n if (this.onImageUploadedCallback) {\n this.onImageUploadedCallback(result);\n }\n return result.src;\n } catch (error) {\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 source: AteImageSource = \"api\"\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 source\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: (\n editor: Editor,\n file: File,\n options: AteImageUploadOptions | undefined,\n source: AteImageSource\n ) => 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, \"picker\");\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 // Remember the image now: opening the file picker can move the selection (e.g. on WebKit)\n const target = this.trackSelectedImage(editor);\n try {\n await this.selectFileAndProcess(\n editor,\n (ed, file, opts, source) => this.uploadAndReplaceImage(ed, file, opts, source, target),\n options\n );\n } finally {\n target.stop();\n }\n }\n\n /** Internal helper used by replacement logic */\n async uploadAndReplaceImage(\n editor: Editor,\n file: File,\n options?: AteImageUploadOptions,\n source: AteImageSource = \"api\",\n target?: AteTrackedImage\n ): Promise<void> {\n // The image to replace is the one selected when the replacement started, wherever the selection is after the upload\n const tracked = target ?? this.trackSelectedImage(editor);\n\n try {\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 (this.replaceImageAt(ed, tracked.pos(), imageData)) {\n this.updateSelectedImage(imageData);\n } else {\n // No image to replace (none was selected, or it was removed during the upload): 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 source\n );\n } finally {\n if (!target) {\n tracked.stop();\n }\n }\n }\n\n /**\n * Remembers the selected image and follows its position through the transactions\n * dispatched until `stop()` (e.g. while the file picker is open and the image uploads).\n */\n private trackSelectedImage(editor: Editor): AteTrackedImage {\n const { selection } = editor.state;\n let pos: number | null =\n selection instanceof NodeSelection && isImageAt(editor.state.doc, selection.from)\n ? selection.from\n : null;\n const onTransaction = ({ transaction }: { transaction: Transaction }) => {\n if (pos !== null && transaction.docChanged) {\n pos = transaction.mapping.map(pos);\n }\n };\n editor.on(\"transaction\", onTransaction);\n return {\n pos: () => pos,\n stop: () => editor.off(\"transaction\", onTransaction),\n };\n }\n\n /** Replaces the image at `pos` with `imageData` (keeping its other attributes) and selects it */\n private replaceImageAt(editor: Editor, pos: number | null, imageData: AteImageData): boolean {\n if (pos === null || !isImageAt(editor.state.doc, pos)) {\n return false;\n }\n return editor\n .chain()\n .focus()\n .command(({ tr }) => {\n const node = tr.doc.nodeAt(pos)!;\n tr.setNodeMarkup(pos, undefined, { ...node.attrs, ...imageData });\n tr.setSelection(NodeSelection.create(tr.doc, pos));\n return true;\n })\n .run();\n }\n\n /**\n * Handle image drop event.\n * Calculates the position from coordinates and sets the selection accordingly.\n */\n handleDrop(editor: Editor, event: DragEvent, options?: AteImageUploadOptions): boolean {\n const files = event.dataTransfer?.files;\n if (!files || files.length === 0) {\n return false;\n }\n\n const file = Array.from(files).find(f => f.type.startsWith(\"image/\"));\n if (!file) {\n return false;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n // Try to find the drop position from coordinates\n const pos = editor.view.posAtCoords({ left: event.clientX, top: event.clientY });\n if (pos) {\n editor.commands.setTextSelection(pos.pos);\n }\n\n this.uploadAndInsertImage(editor, file, options, \"drop\").catch(() => undefined);\n return true;\n }\n\n /**\n * Handle image paste event.\n */\n handlePaste(editor: Editor, event: ClipboardEvent, options?: AteImageUploadOptions): boolean {\n const clipboardFiles = event.clipboardData?.files;\n if (!clipboardFiles || clipboardFiles.length === 0) {\n return false;\n }\n\n const imageFile = Array.from(clipboardFiles).find(file => file.type.startsWith(\"image/\"));\n if (!imageFile) {\n return false;\n }\n\n event.preventDefault();\n this.uploadAndInsertImage(editor, imageFile, options, \"paste\").catch(() => undefined);\n return true;\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 =\n (event.currentTarget as HTMLElement) || (target as Element)?.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) ||\n (target as Element)?.closest(\"button\") ||\n 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","/**\n * HTML to Markdown converter utility (no external dependencies).\n */\n\nexport function htmlToMarkdown(html: string): string {\n const parser = new DOMParser();\n const doc = parser.parseFromString(html, \"text/html\");\n const result = convertNode(doc.body, { listDepth: 0, listType: null });\n // Normalize multiple blank lines to max two\n return result.replace(/\\n{3,}/g, \"\\n\\n\").trim();\n}\n\nfunction convertNode(\n node: Node,\n ctx: { listDepth: number; listType: \"ul\" | \"ol\" | null; orderedIndex?: number }\n): string {\n if (node.nodeType === Node.TEXT_NODE) {\n return node.textContent || \"\";\n }\n\n if (node.nodeType !== Node.ELEMENT_NODE) {\n return \"\";\n }\n\n const el = node as HTMLElement;\n const tag = el.tagName.toLowerCase();\n const children = Array.from(el.childNodes);\n\n const inner = (overrideCtx?: Partial<typeof ctx>) =>\n children.map(c => convertNode(c, { ...ctx, ...overrideCtx })).join(\"\");\n\n // ── Block-level elements ──────────────────────────────────\n\n if (tag === \"br\") {\n return \"\\n\";\n }\n\n if (tag === \"hr\") {\n return \"\\n\\n---\\n\\n\";\n }\n\n if (/^h[1-6]$/.test(tag)) {\n const level = parseInt(tag[1], 10);\n const prefix = \"#\".repeat(level);\n return `\\n\\n${prefix} ${inner().trim()}\\n\\n`;\n }\n\n if (tag === \"p\") {\n const content = inner().trim();\n if (!content) {\n return \"\";\n }\n return `\\n\\n${content}\\n\\n`;\n }\n\n if (tag === \"blockquote\") {\n const content = inner()\n .trim()\n .split(\"\\n\")\n .map(line => `> ${line}`)\n .join(\"\\n\");\n return `\\n\\n${content}\\n\\n`;\n }\n\n if (tag === \"pre\") {\n // Extract language from code class e.g. \"language-typescript\"\n const codeEl = el.querySelector(\"code\");\n const lang = codeEl ? (codeEl.className.match(/language-(\\S+)/) || [])[1] || \"\" : \"\";\n const code = codeEl ? codeEl.textContent || \"\" : el.textContent || \"\";\n return `\\n\\n\\`\\`\\`${lang}\\n${code}\\n\\`\\`\\`\\n\\n`;\n }\n\n if (tag === \"ul\" || tag === \"ol\") {\n const isTaskList = el.getAttribute(\"data-type\") === \"taskList\";\n const items = children\n .filter(c => (c as HTMLElement).tagName?.toLowerCase() === \"li\")\n .map((li, idx) =>\n convertListItem(li as HTMLElement, {\n listDepth: ctx.listDepth + 1,\n listType: tag === \"ul\" ? \"ul\" : \"ol\",\n orderedIndex: idx + 1,\n isTaskList,\n })\n )\n .join(\"\\n\");\n const block = `\\n\\n${items}\\n\\n`;\n // Only add surrounding newlines for root-level lists\n return ctx.listDepth === 0 ? block : `\\n${items}`;\n }\n\n if (tag === \"table\") {\n return convertTable(el);\n }\n\n // ── Inline elements ──────────────────────────────────────\n\n if (tag === \"strong\" || tag === \"b\") {\n const content = inner();\n return content ? `**${content}**` : \"\";\n }\n\n if (tag === \"em\" || tag === \"i\") {\n const content = inner();\n return content ? `*${content}*` : \"\";\n }\n\n if (tag === \"s\" || tag === \"del\" || tag === \"strike\") {\n const content = inner();\n return content ? `~~${content}~~` : \"\";\n }\n\n if (tag === \"u\") {\n // No standard Markdown for underline — use HTML passthrough\n const content = inner();\n return content ? `<u>${content}</u>` : \"\";\n }\n\n if (tag === \"code\") {\n // Inline code (not inside pre)\n const content = el.textContent || \"\";\n return content ? `\\`${content}\\`` : \"\";\n }\n\n if (tag === \"a\") {\n const href = el.getAttribute(\"href\") || \"\";\n const content = inner().trim();\n if (!content && !href) {\n return \"\";\n }\n if (!content) {\n return href;\n }\n return `[${content}](${href})`;\n }\n\n if (tag === \"img\") {\n const src = el.getAttribute(\"src\") || \"\";\n const alt = el.getAttribute(\"alt\") || \"\";\n return `![${alt}](${src})`;\n }\n\n // ── Wrapper / Unknown elements → recurse ─────────────────\n return inner();\n}\n\nfunction convertListItem(\n li: HTMLElement,\n ctx: {\n listDepth: number;\n listType: \"ul\" | \"ol\";\n orderedIndex: number;\n isTaskList: boolean;\n }\n): string {\n const indent = \" \".repeat(ctx.listDepth - 1);\n\n // Task list item\n if (ctx.isTaskList) {\n const checked = li.getAttribute(\"data-checked\") === \"true\";\n const checkMark = checked ? \"[x]\" : \"[ ]\";\n const content = Array.from(li.childNodes)\n .map(c => convertNode(c, { listDepth: ctx.listDepth, listType: ctx.listType }))\n .join(\"\")\n .trim();\n return `${indent}- ${checkMark} ${content}`;\n }\n\n // Normal list item\n const bullet = ctx.listType === \"ol\" ? `${ctx.orderedIndex}.` : \"-\";\n\n // Check if li contains nested lists\n const nestedListNodes = Array.from(li.childNodes).filter(\n c =>\n (c as HTMLElement).tagName?.toLowerCase() === \"ul\" ||\n (c as HTMLElement).tagName?.toLowerCase() === \"ol\"\n );\n const textNodes = Array.from(li.childNodes).filter(\n c => ![\"ul\", \"ol\"].includes((c as HTMLElement).tagName?.toLowerCase())\n );\n\n const textContent = textNodes\n .map(c => convertNode(c, { listDepth: ctx.listDepth, listType: ctx.listType }))\n .join(\"\")\n .trim();\n\n const nestedContent = nestedListNodes\n .map(c => convertNode(c, { listDepth: ctx.listDepth, listType: ctx.listType }))\n .join(\"\")\n .trimEnd();\n\n return `${indent}${bullet} ${textContent}${nestedContent}`;\n}\n\nfunction convertTable(table: HTMLElement): string {\n const rows = Array.from(table.querySelectorAll(\"tr\"));\n if (rows.length === 0) {\n return \"\";\n }\n\n const tableData: string[][] = rows.map(row =>\n Array.from(row.querySelectorAll(\"th, td\")).map(\n cell => cell.textContent?.replace(/\\n/g, \" \").trim() || \"\"\n )\n );\n\n if (tableData.length === 0) {\n return \"\";\n }\n\n const colCount = Math.max(...tableData.map(r => r.length));\n\n // Pad rows to same width\n const normalized = tableData.map(row => {\n while (row.length < colCount) {\n row.push(\"\");\n }\n return row;\n });\n\n // Calculate column widths\n const colWidths = Array.from({ length: colCount }, (_, i) =>\n Math.max(...normalized.map(r => (r[i] || \"\").length), 3)\n );\n\n const pad = (str: string, len: number) => str.padEnd(len, \" \");\n const separator = colWidths.map(w => \"-\".repeat(w)).join(\" | \");\n\n // Build rows\n const lines: string[] = [];\n normalized.forEach((row, rowIdx) => {\n const line = row.map((cell, i) => pad(cell, colWidths[i])).join(\" | \");\n lines.push(`| ${line} |`);\n // Add separator after header row (first row)\n if (rowIdx === 0) {\n lines.push(`| ${separator} |`);\n }\n });\n\n return `\\n\\n${lines.join(\"\\n\")}\\n\\n`;\n}\n","import { Injectable } from \"@angular/core\";\nimport { Editor } from \"@tiptap/core\";\nimport { htmlToMarkdown } from \"../utils/ate-markdown.utils\";\n\n/** Supported export formats */\nexport type AteExportFormat = \"html\" | \"markdown\" | \"text\";\n\n/** Export delivery method */\nexport type AteExportMethod = \"clipboard\" | \"download\";\n\n/** Options for file download */\nexport interface AteExportOptions {\n /** Custom filename (without extension). Defaults to \"document\". */\n filename?: string;\n}\n\n@Injectable()\nexport class AteExportService {\n // ============================================================\n // Public Content Getters\n // ============================================================\n\n /** Returns the editor content as HTML string. */\n getHtml(editor: Editor): string {\n return editor.getHTML();\n }\n\n /** Returns the editor content as plain text. */\n getText(editor: Editor): string {\n return editor.getText();\n }\n\n /** Returns the editor content converted to Markdown. */\n getMarkdown(editor: Editor): string {\n const html = editor.getHTML();\n return htmlToMarkdown(html);\n }\n\n /** Returns the editor content in the specified format. */\n getContent(editor: Editor, format: AteExportFormat): string {\n switch (format) {\n case \"html\":\n return this.getHtml(editor);\n case \"markdown\":\n return this.getMarkdown(editor);\n case \"text\":\n return this.getText(editor);\n }\n }\n\n // ============================================================\n // Export Methods\n // ============================================================\n\n /** Copies the editor content to the clipboard. */\n async exportToClipboard(editor: Editor, format: AteExportFormat): Promise<void> {\n const content = this.getContent(editor, format);\n await navigator.clipboard.writeText(content);\n }\n\n /** Downloads the editor content as a file. */\n exportToFile(editor: Editor, format: AteExportFormat, options?: AteExportOptions): void {\n const content = this.getContent(editor, format);\n const baseName = options?.filename || \"document\";\n\n const extensions: Record<AteExportFormat, string> = {\n html: \"html\",\n markdown: \"md\",\n text: \"txt\",\n };\n const mimeTypes: Record<AteExportFormat, string> = {\n html: \"text/html;charset=utf-8\",\n markdown: \"text/markdown;charset=utf-8\",\n text: \"text/plain;charset=utf-8\",\n };\n\n const filename = `${baseName}.${extensions[format]}`;\n const blob = new Blob([content], { type: mimeTypes[format] });\n const url = URL.createObjectURL(blob);\n\n const link = document.createElement(\"a\");\n link.href = url;\n link.download = filename;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\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 { AteExportService, AteExportFormat, AteExportOptions } from \"./ate-export.service\";\nimport { AteEditorStateSnapshot, ATE_INITIAL_EDITOR_STATE } from \"../models/ate-editor-state.model\";\nimport {\n AteImageUploadHandler,\n AteImageSrcResolver,\n AteImageUploadOptions,\n AteImageUploadResult,\n AteImageRejection,\n} 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 exportSvc = inject(AteExportService);\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\n set onImageUploaded(callback: ((result: AteImageUploadResult) => void) | null) {\n this.imageService.onImageUploadedCallback = callback || undefined;\n }\n set onImageRejected(callback: ((rejection: AteImageRejection) => void) | null) {\n this.imageService.onImageRejectedCallback = callback || undefined;\n }\n set uploadHandler(handler: AteImageUploadHandler | null) {\n this.imageService.uploadHandler = handler;\n }\n get srcResolver(): AteImageSrcResolver | null {\n return this.imageService.srcResolver;\n }\n set srcResolver(resolver: AteImageSrcResolver | null) {\n this.imageService.srcResolver = resolver;\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).catch(() => undefined);\n break;\n case \"uploadImage\":\n this.uploadImage(\n editor,\n args[0] as File,\n args[1] as AteImageUploadOptions | undefined\n ).catch(() => 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 case \"exportAs\":\n void this.exportAs(\n editor,\n args[0] as AteExportFormat,\n args[1] as \"clipboard\" | \"download\",\n args[2] as AteExportOptions | undefined\n );\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 // --- Export Commands ---\n\n /**\n * Returns the editor content in the given format.\n * @param format 'html' | 'markdown' | 'text'\n */\n getContent(editor: Editor, format: AteExportFormat): string {\n if (!editor) {\n return \"\";\n }\n return this.exportSvc.getContent(editor, format);\n }\n\n /**\n * Exports the editor content.\n * @param format 'html' | 'markdown' | 'text'\n * @param method 'clipboard' | 'download'\n * @param options Optional filename for download\n */\n async exportAs(\n editor: Editor,\n format: AteExportFormat,\n method: \"clipboard\" | \"download\",\n options?: AteExportOptions\n ): Promise<void> {\n if (!editor) {\n return;\n }\n if (method === \"clipboard\") {\n await this.exportSvc.exportToClipboard(editor, format);\n } else {\n this.exportSvc.exportToFile(editor, format, options);\n }\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 downloadImage(editor: Editor): void {\n this.imageService.downloadImage(editor);\n }\n\n handleImageDrop(editor: Editor, event: DragEvent, options?: AteImageUploadOptions): boolean {\n return this.imageService.handleDrop(editor, event, options);\n }\n\n handleImagePaste(\n editor: Editor,\n event: ClipboardEvent,\n options?: AteImageUploadOptions\n ): boolean {\n return this.imageService.handlePaste(editor, event, options);\n }\n\n rehostImage(file: File, options?: AteImageUploadOptions): Promise<string> {\n return this.imageService.rehostImage(file, options);\n }\n\n get hasUploadHandler(): boolean {\n return this.imageService.uploadHandler !== null;\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 { AteEditorI18n } from \"../../services/ate-editor-i18n.service\";\nimport { AteEditorCommandsService } from \"../../services/ate-editor-commands.service\";\n\nimport { AteTooltipDirective } from \"../../directives/ate-tooltip.directive\";\nimport { AteIconComponent } from \"../ui/ate-icon.component\";\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, AteTooltipDirective, AteIconComponent],\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 [ateTooltip]=\"t().clear\"\n [attr.aria-label]=\"t().clear\"\n (click)=\"onClear($event)\">\n <ate-icon name=\"clear\" />\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 .ate-icon {\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(AteEditorI18n);\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\" ? \"textColor\" : \"highlightColor\";\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 { AteEditorI18n } from \"../../services/ate-editor-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=\"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=\"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=\"underline\"\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=\"strike\"\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=\"codeBlock\"\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=\"heading1\"\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=\"heading2\"\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=\"heading3\"\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=\"bulletList\"\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=\"orderedList\"\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=\"blockquote\"\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=\"alignLeft\"\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=\"alignCenter\"\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=\"alignRight\"\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=\"alignJustify\"\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=\"horizontalRule\"\n [title]=\"t().horizontalRule\"\n [disabled]=\"!state().can.insertHorizontalRule\"\n (buttonClick)=\"onCommand('insertHorizontalRule')\" />\n }\n @if (config().table) {\n <ate-button\n icon=\"table\"\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=\"clearContent\"\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: var(--ate-toolbar-gap);\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 @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(AteEditorI18n);\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 { AteToolbarConfig } from \"../models/ate-toolbar.model\";\nimport {\n AteBubbleMenuConfig,\n AteImageBubbleMenuConfig,\n AteTableBubbleMenuConfig,\n AteCellBubbleMenuConfig,\n} from \"../models/ate-bubble-menu.model\";\nimport { AteImageUploadConfig } from \"../models/ate-image.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 downloadImage: true,\n resizeSmall: true,\n resizeMedium: true,\n resizeLarge: true,\n resizeOriginal: true,\n alignLeft: true,\n alignCenter: true,\n alignRight: 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\n// Default image upload configuration\nexport const ATE_DEFAULT_IMAGE_UPLOAD_CONFIG: AteImageUploadConfig = {\n maxSize: 5, // 5MB\n maxWidth: 1920,\n maxHeight: 1080,\n allowedTypes: [\"image/jpeg\", \"image/png\", \"image/gif\", \"image/webp\"],\n quality: 0.8,\n};\n\nimport { AteEditorConfig } from \"../models/ate-editor-config.model\";\nimport { AtePasteConfig } from \"../models/ate-paste.model\";\n\n/** Default paste settings: everything pasted from other apps is kept */\nexport const ATE_DEFAULT_PASTE_CONFIG: AtePasteConfig = {\n colors: true,\n highlights: true,\n};\n\n/**\n * Ultimate default configuration for the Angular Tiptap Editor.\n * This serves as the 'Level 4' fallback in the configuration hierarchy:\n * 1. Component Inputs (Le Roi)\n * 2. Component [config] (Le Prince)\n * 3. Global provideAteEditor() (Le Duc)\n * 4. ATE_DEFAULT_CONFIG (Le Peuple)\n */\nexport const ATE_DEFAULT_CONFIG: AteEditorConfig = {\n theme: \"auto\",\n mode: \"classic\",\n height: \"auto\",\n minHeight: \"200px\",\n maxHeight: \"none\",\n fillContainer: false,\n autofocus: false,\n editable: true,\n disabled: false,\n spellcheck: true,\n enableOfficePaste: true,\n showToolbar: true,\n showFooter: true,\n showCharacterCount: true,\n showWordCount: true,\n showEditToggle: false,\n showBubbleMenu: true,\n showImageBubbleMenu: true,\n downloadImage: true,\n showTableMenu: true,\n showCellMenu: true,\n enableSlashCommands: true,\n enableBlockShortcuts: true,\n blockControls: \"none\",\n floatingToolbar: false,\n toolbar: ATE_DEFAULT_TOOLBAR_CONFIG,\n bubbleMenu: ATE_DEFAULT_BUBBLE_MENU_CONFIG,\n imageBubbleMenu: ATE_DEFAULT_IMAGE_BUBBLE_MENU_CONFIG,\n imageUpload: ATE_DEFAULT_IMAGE_UPLOAD_CONFIG,\n paste: ATE_DEFAULT_PASTE_CONFIG,\n tableBubbleMenu: ATE_DEFAULT_TABLE_MENU_CONFIG,\n cellBubbleMenu: ATE_DEFAULT_CELL_MENU_CONFIG,\n slashCommands: {},\n tiptapExtensions: [],\n tiptapOptions: {},\n starterKitOptions: {},\n stateCalculators: [],\n angularNodes: [],\n};\n","import {\n Directive,\n input,\n viewChild,\n ElementRef,\n OnDestroy,\n inject,\n effect,\n AfterViewInit,\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 { AteEditorI18n } from \"../../../services/ate-editor-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 AfterViewInit, OnDestroy {\n protected readonly i18nService = inject(AteEditorI18n);\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: ReturnType<typeof setTimeout> | 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 () => {\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 { allowSignalWrites: true }\n );\n }\n\n ngAfterViewInit() {\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 const nativeElement = this.menuRef().nativeElement;\n if (!nativeElement) {\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: nativeElement,\n trigger: \"manual\",\n placement: \"top-start\",\n theme: \"ate-bubble-menu\",\n appendTo: () => (ed?.options?.element as HTMLElement) || 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 as HTMLElement) || document.body,\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 = 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 = typeof window !== \"undefined\" ? window.getSelection() : null;\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 OnDestroy,\n OnInit,\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 { ATE_DEFAULT_BUBBLE_MENU_CONFIG } from \"../../../config/ate-editor.config\";\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=\"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=\"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=\"underline\"\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=\"strike\"\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 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>(ATE_DEFAULT_BUBBLE_MENU_CONFIG);\n\n bubbleMenuConfig = computed(() => ({\n ...ATE_DEFAULT_BUBBLE_MENU_CONFIG,\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 { Editor } from \"@tiptap/core\";\nimport { AteIconKey } from \"../services/ate-icon-registry.service\";\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: AteIconKey;\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 \"downloadImage\",\n \"resizeSmall\",\n \"resizeMedium\",\n \"resizeLarge\",\n \"resizeOriginal\",\n \"alignLeft\",\n \"alignCenter\",\n \"alignRight\",\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 { 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 {\n AteImageBubbleMenuConfig,\n ATE_IMAGE_BUBBLE_MENU_KEYS,\n} from \"../../../models/ate-bubble-menu.model\";\nimport { ATE_DEFAULT_IMAGE_BUBBLE_MENU_CONFIG } from \"../../../config/ate-editor.config\";\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 && editor().isEditable) {\n <ate-button\n icon=\"changeImage\"\n [title]=\"t().changeImage\"\n (buttonClick)=\"onCommand('changeImage', $event)\"></ate-button>\n }\n @if (imageBubbleMenuConfig().downloadImage) {\n <ate-button\n icon=\"downloadImage\"\n [title]=\"t().downloadImage\"\n (buttonClick)=\"onCommand('downloadImage', $event)\"></ate-button>\n }\n @if (imageBubbleMenuConfig().separator && hasResizeButtons() && editor().isEditable) {\n <ate-separator />\n }\n @if (imageBubbleMenuConfig().resizeSmall && editor().isEditable) {\n <ate-button\n icon=\"resizeSmall\"\n iconSize=\"small\"\n [title]=\"t().resizeSmall\"\n (buttonClick)=\"onCommand('resizeSmall', $event)\"></ate-button>\n }\n @if (imageBubbleMenuConfig().resizeMedium && editor().isEditable) {\n <ate-button\n icon=\"resizeMedium\"\n iconSize=\"medium\"\n [title]=\"t().resizeMedium\"\n (buttonClick)=\"onCommand('resizeMedium', $event)\"></ate-button>\n }\n @if (imageBubbleMenuConfig().resizeLarge && editor().isEditable) {\n <ate-button\n icon=\"resizeLarge\"\n iconSize=\"large\"\n [title]=\"t().resizeLarge\"\n (buttonClick)=\"onCommand('resizeLarge', $event)\"></ate-button>\n }\n @if (imageBubbleMenuConfig().resizeOriginal && editor().isEditable) {\n <ate-button\n icon=\"resizeOriginal\"\n [title]=\"t().resizeOriginal\"\n (buttonClick)=\"onCommand('resizeOriginal', $event)\"></ate-button>\n }\n @if (imageBubbleMenuConfig().separator && hasAlignmentButtons() && editor().isEditable) {\n <ate-separator />\n }\n @if (imageBubbleMenuConfig().alignLeft && editor().isEditable) {\n <ate-button\n icon=\"alignLeft\"\n [title]=\"t().alignLeft\"\n [active]=\"editor().isActive({ textAlign: 'left' })\"\n (buttonClick)=\"onCommand('alignLeft', $event)\"></ate-button>\n }\n @if (imageBubbleMenuConfig().alignCenter && editor().isEditable) {\n <ate-button\n icon=\"alignCenter\"\n [title]=\"t().alignCenter\"\n [active]=\"editor().isActive({ textAlign: 'center' })\"\n (buttonClick)=\"onCommand('alignCenter', $event)\"></ate-button>\n }\n @if (imageBubbleMenuConfig().alignRight && editor().isEditable) {\n <ate-button\n icon=\"alignRight\"\n [title]=\"t().alignRight\"\n [active]=\"editor().isActive({ textAlign: 'right' })\"\n (buttonClick)=\"onCommand('alignRight', $event)\"></ate-button>\n }\n\n @if (\n imageBubbleMenuConfig().separator &&\n imageBubbleMenuConfig().deleteImage &&\n editor().isEditable\n ) {\n <ate-separator />\n }\n @if (imageBubbleMenuConfig().deleteImage && editor().isEditable) {\n <ate-button\n icon=\"deleteImage\"\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>(ATE_DEFAULT_IMAGE_BUBBLE_MENU_CONFIG);\n\n imageUpload = input<AteImageUploadOptions>({});\n\n imageBubbleMenuConfig = computed(() => {\n const c = this.config();\n const result: Record<string, boolean> = {};\n ATE_IMAGE_BUBBLE_MENU_KEYS.forEach(key => {\n result[key] = c[key] ?? true;\n });\n return result as Required<AteImageBubbleMenuConfig>;\n });\n\n hasAlignmentButtons = computed(\n () =>\n this.imageBubbleMenuConfig().alignLeft ||\n this.imageBubbleMenuConfig().alignCenter ||\n this.imageBubbleMenuConfig().alignRight\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, selection } = this.state();\n\n if (this.editorCommands.linkEditMode() || this.editorCommands.colorEditMode()) {\n return false;\n }\n\n // In read-only mode, focus reporting can be unreliable,\n // so we show the menu as long as an image is selected.\n if (!isEditable) {\n return nodes.isImage && selection.type === \"node\";\n }\n\n return nodes.isImage && 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 \"downloadImage\":\n this.editorCommands.downloadImage(editor);\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 case \"alignLeft\":\n editor.chain().focus().setTextAlign(\"left\").run();\n break;\n case \"alignCenter\":\n editor.chain().focus().setTextAlign(\"center\").run();\n break;\n case \"alignRight\":\n editor.chain().focus().setTextAlign(\"right\").run();\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, computed } 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 {\n AteTableBubbleMenuConfig,\n ATE_TABLE_BUBBLE_MENU_KEYS,\n} from \"../../../models/ate-bubble-menu.model\";\nimport { ATE_DEFAULT_TABLE_MENU_CONFIG } from \"../../../config/ate-editor.config\";\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 (tableBubbleMenuConfig().addRowBefore !== false) {\n <ate-button\n icon=\"addRowBefore\"\n [title]=\"t().addRowBefore\"\n [disabled]=\"!state().can.addRowBefore\"\n (buttonClick)=\"onCommand('addRowBefore', $event)\"></ate-button>\n }\n @if (tableBubbleMenuConfig().addRowAfter !== false) {\n <ate-button\n icon=\"addRowAfter\"\n [title]=\"t().addRowAfter\"\n [disabled]=\"!state().can.addRowAfter\"\n (buttonClick)=\"onCommand('addRowAfter', $event)\"></ate-button>\n }\n @if (tableBubbleMenuConfig().deleteRow !== false) {\n <ate-button\n icon=\"deleteRow\"\n [title]=\"t().deleteRow\"\n variant=\"danger\"\n [disabled]=\"!state().can.deleteRow\"\n (buttonClick)=\"onCommand('deleteRow', $event)\"></ate-button>\n }\n @if (tableBubbleMenuConfig().separator !== false) {\n <ate-separator />\n }\n\n <!-- Column actions -->\n @if (tableBubbleMenuConfig().addColumnBefore !== false) {\n <ate-button\n icon=\"addColumnBefore\"\n [title]=\"t().addColumnBefore\"\n [disabled]=\"!state().can.addColumnBefore\"\n (buttonClick)=\"onCommand('addColumnBefore', $event)\"></ate-button>\n }\n @if (tableBubbleMenuConfig().addColumnAfter !== false) {\n <ate-button\n icon=\"addColumnAfter\"\n [title]=\"t().addColumnAfter\"\n [disabled]=\"!state().can.addColumnAfter\"\n (buttonClick)=\"onCommand('addColumnAfter', $event)\"></ate-button>\n }\n @if (tableBubbleMenuConfig().deleteColumn !== false) {\n <ate-button\n icon=\"deleteColumn\"\n [title]=\"t().deleteColumn\"\n variant=\"danger\"\n [disabled]=\"!state().can.deleteColumn\"\n (buttonClick)=\"onCommand('deleteColumn', $event)\"></ate-button>\n }\n @if (tableBubbleMenuConfig().separator !== false) {\n <ate-separator />\n }\n\n <!-- Cell actions -->\n @if (tableBubbleMenuConfig().toggleHeaderRow !== false) {\n <ate-button\n icon=\"toggleHeaderRow\"\n [title]=\"t().toggleHeaderRow\"\n [active]=\"state().nodes.isTableHeaderRow\"\n [disabled]=\"!state().can.toggleHeaderRow\"\n (buttonClick)=\"onCommand('toggleHeaderRow', $event)\"></ate-button>\n }\n @if (tableBubbleMenuConfig().toggleHeaderColumn !== false) {\n <ate-button\n icon=\"toggleHeaderColumn\"\n [title]=\"t().toggleHeaderColumn\"\n [active]=\"state().nodes.isTableHeaderColumn\"\n [disabled]=\"!state().can.toggleHeaderColumn\"\n (buttonClick)=\"onCommand('toggleHeaderColumn', $event)\"></ate-button>\n }\n @if (\n tableBubbleMenuConfig().separator !== false && tableBubbleMenuConfig().deleteTable !== false\n ) {\n <ate-separator />\n }\n\n <!-- Table actions -->\n @if (tableBubbleMenuConfig().deleteTable !== false) {\n <ate-button\n icon=\"deleteTable\"\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>(ATE_DEFAULT_TABLE_MENU_CONFIG);\n\n tableBubbleMenuConfig = computed(() => {\n const c = this.config();\n const result: Record<string, boolean> = {};\n ATE_TABLE_BUBBLE_MENU_KEYS.forEach(key => {\n result[key] = c[key] ?? true;\n });\n return result as Required<AteTableBubbleMenuConfig>;\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\n ? dom.closest(\"table\")\n : (dom.parentElement as HTMLElement)?.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 as 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, computed } 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\";\nimport { ATE_DEFAULT_CELL_MENU_CONFIG } from \"../../../config/ate-editor.config\";\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 (cellBubbleMenuConfig().mergeCells !== false && !state().selection.isSingleCell) {\n <ate-button\n icon=\"mergeCells\"\n [title]=\"i18n().table().mergeCells\"\n [disabled]=\"!state().can.mergeCells\"\n (buttonClick)=\"onCommand('mergeCells', $event)\"></ate-button>\n }\n @if (cellBubbleMenuConfig().splitCell !== false && state().selection.isSingleCell) {\n <ate-button\n icon=\"splitCell\"\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>(ATE_DEFAULT_CELL_MENU_CONFIG);\n\n cellBubbleMenuConfig = computed(() => ({\n mergeCells: this.config().mergeCells ?? true,\n splitCell: this.config().splitCell ?? true,\n }));\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 OnDestroy,\n inject,\n effect,\n AfterViewInit,\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 { AteEditorI18n } from \"../../../services/ate-editor-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 AfterViewInit, OnDestroy {\n protected readonly i18nService = inject(AteEditorI18n);\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: ReturnType<typeof setTimeout> | 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 () => {\n // Monitor editor state and specific sub-menu states\n this.state();\n this.onStateChange();\n\n this.updateMenu();\n },\n { allowSignalWrites: true }\n );\n }\n\n ngAfterViewInit() {\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 const nativeElement = this.menuRef().nativeElement;\n if (!nativeElement) {\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: nativeElement,\n trigger: \"manual\",\n placement: \"bottom-start\",\n theme: \"ate-bubble-menu\",\n appendTo: () => (ed?.options?.element as HTMLElement) || document.body,\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: {\n boundary: (ed?.options?.element as HTMLElement) || document.body,\n padding: 8,\n },\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 untracked,\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 { AteIconComponent } from \"../../ui/ate-icon.component\";\nimport { AteBaseSubBubbleMenu } from \"../base/ate-base-sub-bubble-menu\";\n\n/** Frames to wait for the menu to become visible before giving up on focusing the URL field */\nconst FOCUS_MAX_ATTEMPTS = 20;\n\n@Component({\n selector: \"ate-link-bubble-menu\",\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AteButtonComponent, AteSeparatorComponent, AteIconComponent, 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 <ate-icon class=\"icon-link\" name=\"link\" />\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=\"apply\"\n [title]=\"common().apply\"\n color=\"var(--ate-primary)\"\n [disabled]=\"!editUrl().trim()\"\n (buttonClick)=\"onApply($event)\"></ate-button>\n <ate-button\n icon=\"openLink\"\n [title]=\"t().openLink\"\n [disabled]=\"!currentUrl()\"\n (buttonClick)=\"onOpenLink($event)\"></ate-button>\n <ate-separator />\n <ate-button\n icon=\"unsetLink\"\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 () => {\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 { allowSignalWrites: true }\n );\n\n // Move focus to the URL field whenever link editing starts (toolbar, bubble menu or Mod+K)\n effect(() => {\n if (this.linkSvc.editMode()) {\n untracked(() => this.focusInputWhenVisible());\n }\n });\n }\n\n private focusInputWhenVisible(attempt = 0) {\n requestAnimationFrame(() => {\n const input = this.linkInput()?.nativeElement;\n if (!input || !this.linkSvc.editMode()) {\n return;\n }\n input.focus();\n if (document.activeElement !== input && attempt < FOCUS_MAX_ATTEMPTS) {\n this.focusInputWhenVisible(attempt + 1);\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 as 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 = typeof window !== \"undefined\" ? window.getSelection() : null;\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=\"customColor\"\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=\"apply\"\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=\"unsetColor\"\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 private findColoredElementInContent(start: Element | null, contentRoot: Element): Element | null {\n let current = start;\n while (current && current !== contentRoot && contentRoot.contains(current)) {\n if (current.matches('[style*=\"color\"], [style*=\"background\"], mark')) {\n return current;\n }\n current = current.parentElement;\n }\n return null;\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 = this.findColoredElementInContent(element, ed.view.dom);\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 = typeof window !== \"undefined\" ? window.getSelection() : null;\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 \"../models/ate-slash-command.model\";\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 \"tableOfContents\",\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 tableOfContents: false,\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: Pick<AteI18nService, \"slashCommands\">,\n commands: AteEditorCommandsService,\n imageOptions?: {\n quality?: number;\n maxWidth?: number;\n maxHeight?: number;\n maxSize?: 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: \"heading1\",\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: \"heading2\",\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: \"heading3\",\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: \"bulletList\",\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: \"orderedList\",\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: \"blockquote\",\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: \"codeBlock\",\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 maxSize: imageOptions?.maxSize,\n allowedTypes: imageOptions?.allowedTypes,\n }),\n },\n {\n title: t.horizontalRule.title,\n description: t.horizontalRule.description,\n icon: \"horizontalRule\",\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\",\n keywords: t.table.keywords,\n command: (editor: Editor) => commands.insertTable(editor),\n },\n {\n title: t.tableOfContents.title,\n description: t.tableOfContents.description,\n icon: \"tableOfContents\",\n keywords: t.tableOfContents.keywords,\n command: (editor: Editor) =>\n editor.chain().focus().insertContent({ type: \"tableOfContents\" }).run(),\n },\n ];\n}\n\n/**\n * Filtre et assemble les commandes selon la configuration fournie.\n */\nexport function filterSlashCommands(\n config: AteSlashCommandsConfig,\n i18n: Pick<AteI18nService, \"slashCommands\">,\n commands: AteEditorCommandsService,\n imageOptions?: {\n quality?: number;\n maxWidth?: number;\n maxHeight?: number;\n maxSize?: 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 OnDestroy,\n effect,\n computed,\n inject,\n signal,\n ChangeDetectionStrategy,\n AfterViewInit,\n} from \"@angular/core\";\nimport tippy, { Instance as TippyInstance, sticky } from \"tippy.js\";\nimport { Editor } from \"@tiptap/core\";\nimport { AteEditorI18n } from \"../../services/ate-editor-i18n.service\";\nimport { AteEditorCommandsService } from \"../../services/ate-editor-commands.service\";\nimport { createDefaultSlashCommands } from \"../../config/ate-slash-commands.config\";\nimport { AteSlashCommandItem, AteCustomSlashCommands } from \"../../models/ate-slash-command.model\";\nimport { Plugin, PluginKey } from \"@tiptap/pm/state\";\nimport { EditorView, Decoration, DecorationSet } from \"@tiptap/pm/view\";\nimport { AteIconComponent } from \"../ui/ate-icon.component\";\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 imports: [AteIconComponent],\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 <ate-icon [name]=\"command.icon\" />\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 .ate-icon {\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 AfterViewInit, OnDestroy {\n readonly i18nService = inject(AteEditorI18n);\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 filterPlaceholderText = computed(() => {\n return this.i18nService.slashCommands().filterPlaceholder || \"Filter...\";\n });\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 () => {\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 { allowSignalWrites: true }\n );\n }\n\n ngAfterViewInit() {\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 const nativeElement = this.menuRef().nativeElement;\n if (!nativeElement) {\n return;\n }\n\n if (this.tippyInstance) {\n this.tippyInstance.destroy();\n }\n\n this.tippyInstance = tippy(document.body, {\n content: nativeElement,\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 as HTMLElement).closest(\n \"angular-tiptap-editor\"\n );\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 as HTMLElement) || document.body,\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 = typeof window !== \"undefined\" ? window.getSelection() : null;\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 right away: ProseMirror updates the DOM synchronously\n // on dispatch, and any delay lets keys typed in the meantime land in the paragraph the \"/\" was typed in\n ed.commands.focus();\n command.command(ed);\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 decorations: state => {\n const { from } = state.selection;\n const textBefore = state.doc.textBetween(Math.max(0, from - 20), from, \"\\n\");\n const slashMatch = textBefore.match(/(?:^|\\s)\\/([^/\\s]*)$/);\n\n if (!slashMatch) {\n return DecorationSet.empty;\n }\n\n const slashPos = from - slashMatch[0].length + slashMatch[0].indexOf(\"/\");\n const query = slashMatch[1] || \"\";\n const isEmpty = !query;\n const placeholder = this.filterPlaceholderText();\n const decorationId = `id_${slashPos}_${from}`;\n\n return DecorationSet.create(state.doc, [\n Decoration.inline(slashPos, from, {\n \"data-decoration-id\": decorationId,\n \"data-decoration-content\": placeholder,\n class: `ate-slash-decoration ${isEmpty ? \"is-empty\" : \"\"}`,\n }),\n ]);\n },\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 { Extension } from \"@tiptap/core\";\nimport { EditorState, NodeSelection, Plugin, PluginKey, TextSelection } from \"@tiptap/pm/state\";\nimport { Decoration, DecorationSet, EditorView } from \"@tiptap/pm/view\";\nimport { Node, Slice } from \"@tiptap/pm/model\";\n\nexport const ATE_BLOCK_DRAG_MIME = \"application/x-ate-block-drag\";\n\nconst DRAGGING_CLASS = \"ate-block-dragging\";\nconst DROP_BEFORE_CLASS = \"ate-block-drop-before\";\nconst DROP_AFTER_CLASS = \"ate-block-drop-after\";\n\ninterface PosRange {\n from: number;\n to: number;\n}\n\ninterface ActiveBlockDrag extends PosRange {\n doc: Node;\n slice: Slice;\n}\n\ninterface DropIndicatorState {\n pos: number | null;\n}\n\nconst blockDragKey = new PluginKey<DropIndicatorState>(\"ateBlockDrag\");\nconst blockDragResetters = new WeakMap<EditorView, () => void>();\n\nexport function endAteBlockDrag(view: EditorView): void {\n blockDragResetters.get(view)?.();\n}\n\nexport function ateMultiBlockSelection(state: EditorState, blockPos: number): PosRange | null {\n const covered = coveredTopLevelRange(state.doc, state.selection);\n return covered && blockPos >= covered.from && blockPos < covered.to ? covered : null;\n}\n\nfunction coveredTopLevelRange(doc: Node, selection: PosRange): PosRange | null {\n const blocks: PosRange[] = [];\n doc.forEach((node, offset) => {\n const end = offset + node.nodeSize;\n if (offset < selection.to && end > selection.from) {\n blocks.push({ from: offset, to: end });\n }\n });\n const last = blocks.at(-1);\n if (blocks.length < 2 || !last) {\n return null;\n }\n return { from: blocks[0].from, to: last.to };\n}\n\nfunction topLevelDropPos(\n view: EditorView,\n point: { clientX: number; clientY: number }\n): number | null {\n const hit = view.posAtCoords({ left: point.clientX, top: point.clientY });\n if (!hit) {\n return null;\n }\n const $pos = view.state.doc.resolve(hit.pos);\n if ($pos.depth === 0) {\n return hit.pos;\n }\n const start = $pos.before(1);\n const dom = view.nodeDOM(start);\n if (!(dom instanceof Element)) {\n return $pos.after(1);\n }\n const rect = dom.getBoundingClientRect();\n return point.clientY < rect.top + (rect.bottom - rect.top) / 2 ? start : $pos.after(1);\n}\n\nfunction dropIndicatorDecoration(doc: Node, pos: number): Decoration | null {\n if (pos > doc.content.size || doc.resolve(pos).depth !== 0) {\n return null;\n }\n if (pos < doc.content.size) {\n const next = doc.nodeAt(pos);\n return next ? Decoration.node(pos, pos + next.nodeSize, { class: DROP_BEFORE_CLASS }) : null;\n }\n const last = doc.lastChild;\n return last ? Decoration.node(pos - last.nodeSize, pos, { class: DROP_AFTER_CLASS }) : null;\n}\n\nexport interface AteBlockControlsOptions {\n onHover?: (data: { node: Node; element: HTMLElement; pos: number } | null) => void;\n}\n\n// Helper to get the DOM element properly\nfunction getDomElement(view: EditorView, pos: number): HTMLElement | null {\n const dom = view.nodeDOM(pos);\n if (!dom) {\n return null;\n }\n if (dom instanceof HTMLElement) {\n return dom;\n }\n return dom.parentElement;\n}\n\n// VERTICAL SCAN (For the empty margin)\nfunction findBlockElementAtY(view: EditorView, y: number): HTMLElement | null {\n const editorDom = view.dom as HTMLElement;\n const children = Array.from(editorDom.children) as HTMLElement[];\n\n // We look for the direct child of the editor (Level 1) that intercepts the Y line\n return (\n children.find(child => {\n if (getComputedStyle(child).position === \"absolute\") {\n return false;\n }\n const rect = child.getBoundingClientRect();\n // Tolérance de 5px\n return y >= rect.top - 5 && y <= rect.bottom + 5;\n }) || null\n );\n}\n\nfunction resolveBlockData(\n view: EditorView,\n y: number,\n targetElement: HTMLElement | null\n): { node: Node; element: HTMLElement; pos: number } | null {\n let blockEl: HTMLElement | null = null;\n\n // 1. FAST PATH : Direct target\n // LEVEL 1: We look for the first parent element that is a direct child of the editor\n if (targetElement && !targetElement.classList.contains(\"ProseMirror\")) {\n blockEl = targetElement.closest(\".ProseMirror > *\") as HTMLElement;\n }\n\n // 2. GUTTER PATH : Vertical scan\n if (!blockEl) {\n blockEl = findBlockElementAtY(view, y);\n }\n\n if (!blockEl) {\n return null;\n }\n\n // 3. PROSEMIRROR NODE RESOLUTION\n try {\n // We ask for the position at the beginning of this root block\n const pos = view.posAtDOM(blockEl, 0);\n const $pos = view.state.doc.resolve(pos);\n\n // CASE A : STANDARD BLOCKS (H1, P, Lists, Blockquotes...)\n // We make sure to take the node of depth 1 (Direct child of the Doc)\n if ($pos.depth >= 1) {\n const rootNode = $pos.node(1);\n const rootPos = $pos.before(1);\n const rootElement = getDomElement(view, rootPos);\n\n // Sécurité : on vérifie que l'élément DOM correspond bien\n if (rootNode && (rootElement || blockEl)) {\n return { node: rootNode, element: rootElement || blockEl, pos: rootPos };\n }\n }\n\n // CASE B : IMAGES / ATOMS (Depth 0)\n // Sometimes a root image is seen as Depth 0 by resolve()\n // We look at the node right after the position\n if ($pos.depth === 0) {\n const nodeAfter = $pos.nodeAfter;\n if (nodeAfter && (nodeAfter.isBlock || nodeAfter.isAtom)) {\n return { node: nodeAfter, element: blockEl, pos: pos };\n }\n }\n } catch (_e) {\n // console.warn(_e);\n }\n\n return null;\n}\n\nfunction createBlockDragPlugin(): Plugin<DropIndicatorState> {\n let active: ActiveBlockDrag | null = null;\n let marked: HTMLElement | null = null;\n let stopListening: (() => void) | null = null;\n\n const setIndicator = (view: EditorView, pos: number | null): void => {\n if (blockDragKey.getState(view.state)?.pos !== pos) {\n view.dispatch(view.state.tr.setMeta(blockDragKey, pos));\n }\n };\n\n const reset = (view: EditorView): void => {\n if (active && view.dragging?.slice === active.slice) {\n view.dragging = null;\n }\n active = null;\n stopListening?.();\n stopListening = null;\n marked?.classList.remove(DRAGGING_CLASS);\n marked = null;\n if (!view.isDestroyed) {\n setIndicator(view, null);\n }\n };\n\n const listenForDragEnd = (view: EditorView): void => {\n stopListening?.();\n const onEnd = (): void => reset(view);\n const events = [\"dragend\", \"drop\"];\n events.forEach(name => window.addEventListener(name, onEnd));\n stopListening = () => events.forEach(name => window.removeEventListener(name, onEnd));\n };\n\n const resetOnForeignDrag = (view: EditorView, event: DragEvent): void => {\n if (active && !Array.from(event.dataTransfer?.types ?? []).includes(ATE_BLOCK_DRAG_MIME)) {\n reset(view);\n }\n };\n\n return new Plugin<DropIndicatorState>({\n key: blockDragKey,\n state: {\n init: () => ({ pos: null }),\n apply: (tr, value) => {\n const meta = tr.getMeta(blockDragKey) as number | null | undefined;\n if (meta !== undefined) {\n return { pos: meta };\n }\n return tr.docChanged ? { pos: null } : value;\n },\n },\n view: view => {\n blockDragResetters.set(view, () => reset(view));\n return {\n destroy: () => {\n reset(view);\n blockDragResetters.delete(view);\n },\n };\n },\n props: {\n decorations: state => {\n const pos = blockDragKey.getState(state)?.pos;\n if (pos === null || pos === undefined) {\n return null;\n }\n const decoration = dropIndicatorDecoration(state.doc, pos);\n return decoration ? DecorationSet.create(state.doc, [decoration]) : null;\n },\n handleDOMEvents: {\n dragstart: (view, event) => {\n const transfer = event.dataTransfer;\n if (\n !view.editable ||\n !transfer ||\n !Array.from(transfer.types).includes(ATE_BLOCK_DRAG_MIME)\n ) {\n return false;\n }\n reset(view);\n const { selection, doc } = view.state;\n const range = coveredTopLevelRange(doc, selection) ?? {\n from: selection.from,\n to: selection.to,\n };\n if (range.from === range.to) {\n return false;\n }\n const slice = doc.slice(range.from, range.to);\n active = { ...range, doc, slice };\n view.dragging = { slice, move: true };\n marked =\n view.dom.offsetParent instanceof HTMLElement\n ? view.dom.offsetParent\n : view.dom.parentElement;\n marked?.classList.add(DRAGGING_CLASS);\n listenForDragEnd(view);\n const { dom, text } = view.serializeForClipboard(slice);\n transfer.clearData();\n transfer.setData(\"text/html\", dom.innerHTML);\n transfer.setData(\"text/plain\", text);\n transfer.setData(ATE_BLOCK_DRAG_MIME, \"1\");\n return true;\n },\n dragleave: (view, event) => {\n const related = event.relatedTarget;\n if (active && !(related instanceof globalThis.Node && view.dom.contains(related))) {\n setIndicator(view, null);\n }\n return false;\n },\n dragenter: (view, event) => {\n resetOnForeignDrag(view, event);\n return false;\n },\n dragover: (view, event) => {\n resetOnForeignDrag(view, event);\n if (active && !event.dataTransfer?.files?.length) {\n setIndicator(view, topLevelDropPos(view, event));\n }\n return false;\n },\n },\n handleDrop: (view, event) => {\n const drag = active;\n if (!drag || event.dataTransfer?.files?.length) {\n return false;\n }\n if (drag.doc !== view.state.doc) {\n event.preventDefault();\n reset(view);\n return true;\n }\n const target = topLevelDropPos(view, event);\n if (target === null) {\n return false;\n }\n event.preventDefault();\n if (target >= drag.from && target <= drag.to) {\n reset(view);\n return true;\n }\n const tr = view.state.tr.delete(drag.from, drag.to);\n const at = tr.mapping.map(target);\n tr.insert(at, drag.slice.content);\n const { content } = drag.slice;\n const only = content.childCount === 1 ? content.firstChild : null;\n tr.setSelection(\n only && NodeSelection.isSelectable(only)\n ? NodeSelection.create(tr.doc, at)\n : TextSelection.between(tr.doc.resolve(at), tr.doc.resolve(at + content.size))\n );\n tr.setMeta(blockDragKey, null).setMeta(\"uiEvent\", \"drop\");\n view.dispatch(tr.scrollIntoView());\n reset(view);\n return true;\n },\n },\n });\n}\n\nexport const AteBlockControlsExtension = Extension.create<AteBlockControlsOptions>({\n name: \"ateBlockControls\",\n\n addOptions() {\n return { onHover: undefined };\n },\n\n addProseMirrorPlugins() {\n let lastHoveredElement: HTMLElement | null = null;\n let lastHoveredPos: number | null = null;\n let rafId: number | null = null;\n let lastMouseX = 0;\n let lastMouseY = 0;\n\n // `force` re-resolves the hovered block even if the pointer is still over the last one (after a document change)\n const update = (view: EditorView, force = false) => {\n if (!this.editor.isEditable) {\n return;\n }\n\n const editorRect = view.dom.getBoundingClientRect();\n const gutterWidth = 80;\n\n // Check Limites (Marge Gauche + Editeur)\n if (\n lastMouseY < editorRect.top ||\n lastMouseY > editorRect.bottom ||\n lastMouseX > editorRect.right ||\n lastMouseX < editorRect.left - gutterWidth\n ) {\n if (lastHoveredElement) {\n reset();\n }\n return;\n }\n\n // STICKY ANTI-FLICKER\n // On garde le bloc tant qu'on est dans sa hauteur\n if (!force && lastHoveredElement && lastHoveredElement.isConnected) {\n const rect = lastHoveredElement.getBoundingClientRect();\n if (lastMouseY >= rect.top && lastMouseY <= rect.bottom) {\n return;\n }\n }\n\n const target = document.elementFromPoint(lastMouseX, lastMouseY) as HTMLElement;\n\n const data = resolveBlockData(view, lastMouseY, target);\n\n if (data && (data.element !== lastHoveredElement || data.pos !== lastHoveredPos)) {\n lastHoveredElement = data.element;\n lastHoveredPos = data.pos;\n this.options.onHover?.(data);\n } else if (!data) {\n if (!lastHoveredElement || !lastHoveredElement.isConnected) {\n reset();\n }\n }\n };\n\n const reset = () => {\n this.options.onHover?.(null);\n lastHoveredElement = null;\n lastHoveredPos = null;\n };\n\n return [\n new Plugin({\n key: new PluginKey(\"ateBlockControls\"),\n // The hovered block can be removed, replaced or moved by an edit while the pointer stays still:\n // resolve it again so the controls never point at a detached element or a stale position\n view: () => ({\n update: (view, prevState) => {\n if (lastHoveredElement && !view.state.doc.eq(prevState.doc)) {\n update(view, true);\n }\n },\n }),\n props: {\n handleDOMEvents: {\n mousemove: (view: EditorView, event: MouseEvent) => {\n lastMouseX = event.clientX;\n lastMouseY = event.clientY;\n\n if (rafId === null) {\n rafId = requestAnimationFrame(() => {\n update(view);\n rafId = null;\n });\n }\n return false;\n },\n mouseleave: () => {\n if (rafId) {\n cancelAnimationFrame(rafId);\n rafId = null;\n }\n reset();\n return false;\n },\n },\n },\n }),\n createBlockDragPlugin(),\n ];\n },\n});\n","import {\n Component,\n input,\n viewChild,\n ElementRef,\n OnDestroy,\n effect,\n signal,\n inject,\n ChangeDetectionStrategy,\n AfterViewInit,\n} from \"@angular/core\";\nimport tippy, { Instance as TippyInstance, sticky } from \"tippy.js\";\nimport { Editor } from \"@tiptap/core\";\nimport { Node as PMNode } from \"@tiptap/pm/model\";\nimport { AteEditorI18n } from \"../../services/ate-editor-i18n.service\";\nimport { AteTooltipDirective } from \"../../directives/ate-tooltip.directive\";\nimport { AteIconComponent } from \"../ui/ate-icon.component\";\nimport {\n ATE_BLOCK_DRAG_MIME,\n ateMultiBlockSelection,\n endAteBlockDrag,\n} from \"../../extensions/ate-block-controls.extension\";\n\n// Glides from block to block; the strong ease-out covers most of the way at once, so it never trails the pointer\nconst BLOCK_CONTROLS_MOVE_TRANSITION = \"transform 200ms cubic-bezier(0.23, 1, 0.32, 1)\";\n\nfunction prefersReducedMotion(): boolean {\n return typeof matchMedia === \"function\" && matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n}\n\n/**\n * Component providing Notion-like block controls (Plus button and Drag Handle).\n */\n@Component({\n selector: \"ate-block-controls\",\n standalone: true,\n imports: [AteTooltipDirective, AteIconComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <div\n #menuRef\n class=\"ate-block-controls\"\n (mouseenter)=\"onMouseEnter()\"\n (mouseleave)=\"onMouseLeave()\"\n (mousedown)=\"onContainerMouseDown($event)\">\n <button\n class=\"ate-control-btn ate-block-add\"\n (mousedown)=\"onButtonMouseDown($event)\"\n (click)=\"addBlock($event)\"\n [ateTooltip]=\"i18n.editor().blockAdd\"\n ateTooltipPlacement=\"top\">\n <ate-icon name=\"blockAdd\" />\n </button>\n <div\n class=\"ate-control-btn ate-block-drag\"\n draggable=\"true\"\n (mousedown)=\"onDragHandleMouseDown($event)\"\n (dragstart)=\"onDragStart($event)\"\n (dragend)=\"onDragEnd()\"\n [ateTooltip]=\"i18n.editor().blockDrag\"\n ateTooltipPlacement=\"top\">\n <ate-icon name=\"blockDrag\" />\n </div>\n </div>\n `,\n styles: [\n `\n .ate-block-controls {\n display: flex;\n align-items: center;\n gap: 2px;\n padding: 4px;\n pointer-events: auto;\n will-change: transform;\n }\n\n .ate-control-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n border-radius: 4px;\n border: none;\n background: transparent;\n color: var(--ate-text-secondary);\n cursor: pointer;\n }\n\n /* Hovered dozens of times a minute: a flash at most, and only with a real pointer */\n @media (hover: hover) and (pointer: fine) {\n .ate-control-btn {\n transition:\n background-color 120ms ease-out,\n color 120ms ease-out;\n }\n\n .ate-control-btn:hover {\n background: var(--ate-surface-tertiary);\n color: var(--ate-text);\n }\n }\n\n .ate-control-btn .ate-icon {\n font-size: 18px;\n }\n\n @media (max-width: 768px) {\n :host {\n display: none !important;\n }\n }\n `,\n ],\n})\nexport class AteBlockControlsComponent implements AfterViewInit, OnDestroy {\n protected readonly i18n = inject(AteEditorI18n);\n\n editor = input.required<Editor>();\n hoveredData = input<{ node: PMNode; element: HTMLElement; pos: number } | null>(null);\n\n menuRef = viewChild.required<ElementRef<HTMLDivElement>>(\"menuRef\");\n\n protected isInteracting = signal(false);\n private lastValidData: { node: PMNode; element: HTMLElement; pos: number } | null = null;\n private lastValidRect: DOMRect | null = null;\n private tippyInstance: TippyInstance | null = null;\n private updateTimeout: ReturnType<typeof setTimeout> | null = null;\n private glideFrame: number | null = null;\n\n constructor() {\n effect(() => {\n const data = this.hoveredData();\n const interacting = this.isInteracting();\n\n if (data) {\n this.lastValidData = data;\n if (data.element.isConnected) {\n this.lastValidRect = data.element.getBoundingClientRect();\n }\n }\n\n this.updateMenu(!!data || interacting);\n });\n }\n\n ngAfterViewInit() {\n this.initTippy();\n window.addEventListener(\"scroll\", this.onScroll, { capture: true, passive: true });\n }\n\n ngOnDestroy() {\n window.removeEventListener(\"scroll\", this.onScroll, { capture: true });\n if (this.updateTimeout) {\n clearTimeout(this.updateTimeout);\n }\n if (this.glideFrame !== null) {\n cancelAnimationFrame(this.glideFrame);\n }\n if (this.tippyInstance) {\n this.tippyInstance.destroy();\n this.tippyInstance = null;\n }\n }\n\n private initTippy() {\n const nativeElement = this.menuRef().nativeElement;\n if (!nativeElement) {\n return;\n }\n\n this.tippyInstance = tippy(document.body, {\n content: nativeElement,\n trigger: \"manual\",\n placement: \"left\",\n theme: \"ate-block-controls\",\n appendTo: () => (this.editor()?.options?.element as HTMLElement) || document.body,\n interactive: true,\n hideOnClick: false,\n arrow: false,\n offset: [0, 8],\n zIndex: 99,\n plugins: [sticky],\n sticky: \"reference\",\n // The glide keeps the handle visibly the same one moving with the pointer (see withoutGlide for when it is skipped)\n moveTransition: prefersReducedMotion() ? \"\" : BLOCK_CONTROLS_MOVE_TRANSITION,\n getReferenceClientRect: () => this.getSelectionRect(),\n popperOptions: {\n modifiers: [\n {\n name: \"preventOverflow\",\n options: {\n boundary: (this.editor()?.options?.element as HTMLElement) || document.body,\n padding: 8,\n },\n },\n ],\n },\n });\n }\n\n private updateMenu(show: boolean) {\n if (this.updateTimeout) {\n clearTimeout(this.updateTimeout);\n }\n const delay = show ? 0 : 400;\n this.updateTimeout = setTimeout(() => {\n if (show) {\n this.showTippy();\n } else {\n this.hideTippy();\n }\n }, delay);\n }\n\n /** While scrolling, the controls follow their block every frame: a glide would make them trail behind it */\n private onScroll = () => {\n if (this.tippyInstance?.state.isVisible) {\n this.withoutGlide();\n }\n };\n\n /**\n * Moves the controls without gliding until the position settles (two frames after the last call).\n * Tippy only skips the move transition on its very first show: the controls are never unmounted\n * afterwards, so they would otherwise glide in from wherever they were last shown.\n */\n private withoutGlide() {\n const popper = this.tippyInstance?.popper;\n if (!popper) {\n return;\n }\n popper.style.transition = \"none\";\n if (this.glideFrame !== null) {\n cancelAnimationFrame(this.glideFrame);\n }\n this.glideFrame = requestAnimationFrame(() => {\n this.glideFrame = requestAnimationFrame(() => {\n this.glideFrame = null;\n popper.style.transition = this.tippyInstance?.props.moveTransition ?? \"\";\n });\n });\n }\n\n private showTippy() {\n if (this.tippyInstance) {\n // Appearing: show the controls in place, the glide is only for moving between blocks\n if (!this.tippyInstance.state.isVisible) {\n this.withoutGlide();\n }\n this.tippyInstance.setProps({\n getReferenceClientRect: () => this.getSelectionRect(),\n });\n this.tippyInstance.show();\n }\n }\n\n private hideTippy() {\n if (this.tippyInstance) {\n this.tippyInstance.hide();\n }\n }\n\n private getSelectionRect(): DOMRect {\n const data = this.hoveredData();\n // A block removed by an edit is detached: its rect is (0, 0), which would send the controls to the editor's corner\n if (data?.element?.isConnected) {\n this.lastValidRect = data.element.getBoundingClientRect();\n return this.lastValidRect;\n }\n return this.lastValidRect || new DOMRect(-9999, -9999, 0, 0);\n }\n\n onMouseEnter() {\n this.isInteracting.set(true);\n }\n\n onMouseLeave() {\n this.isInteracting.set(false);\n }\n\n onContainerMouseDown(event: MouseEvent) {\n if (event.target === event.currentTarget) {\n event.preventDefault();\n }\n }\n\n onButtonMouseDown(event: MouseEvent) {\n event.preventDefault();\n }\n\n /**\n * Selection strategy to avoid partial node dragging (ghost table issue).\n */\n onDragHandleMouseDown(event: MouseEvent) {\n event.stopPropagation();\n const ed = this.editor();\n const data = this.hoveredData() || this.lastValidData;\n if (ed && data && !ateMultiBlockSelection(ed.state, data.pos)) {\n // Force whole-node selection. This is crucial for atomic nodes like tables and images.\n ed.commands.setNodeSelection(data.pos);\n }\n }\n\n addBlock(event: MouseEvent) {\n event.stopPropagation();\n const ed = this.editor();\n const data = this.hoveredData() || this.lastValidData;\n if (!ed || !data) {\n return;\n }\n\n const { pos, node } = data;\n if (node.content.size === 0) {\n ed.chain()\n .focus()\n .setTextSelection(pos + 1)\n .insertContent(\"/\")\n .run();\n } else {\n const nextPos = pos + node.nodeSize;\n ed.chain()\n .focus()\n .insertContentAt(nextPos, { type: \"paragraph\", content: [{ type: \"text\", text: \"/\" }] })\n .setTextSelection(nextPos + 2)\n .run();\n }\n\n this.isInteracting.set(false);\n this.hideTippy();\n }\n\n onDragStart(event: DragEvent) {\n const ed = this.editor();\n const data = this.hoveredData() || this.lastValidData;\n if (!ed || !data || !event.dataTransfer) {\n return;\n }\n\n const { element, pos } = data;\n const view = ed.view;\n\n // 1. Select the grabbed block, unless it belongs to a multi-block selection that is dragged as a whole\n view.focus();\n if (!ateMultiBlockSelection(ed.state, pos)) {\n ed.commands.setNodeSelection(pos);\n }\n\n // 2. Browser Drag Image & metadata\n event.dataTransfer.setDragImage(element, 0, 10);\n event.dataTransfer.effectAllowed = \"move\";\n event.dataTransfer.setData(ATE_BLOCK_DRAG_MIME, \"1\");\n\n // 3. Dispatch virtual dragstart, handled by the block drag plugin of AteBlockControlsExtension\n const pmEvent = new DragEvent(\"dragstart\", {\n dataTransfer: event.dataTransfer,\n bubbles: true,\n cancelable: true,\n });\n element.dispatchEvent(pmEvent);\n\n // 4. Cleanup UI\n setTimeout(() => {\n this.hideTippy();\n this.isInteracting.set(false);\n }, 0);\n }\n\n onDragEnd() {\n const ed = this.editor();\n if (!ed.isDestroyed) {\n endAteBlockDrag(ed.view);\n }\n this.isInteracting.set(false);\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 \"../../i18n/ateTranslationsModel\";\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() ? 'preview' : '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 { InjectionToken } from \"@angular/core\";\nimport { AteEditorConfig } from \"../models/ate-editor-config.model\";\n\n/**\n * Injection Token for global editor configuration.\n */\nexport const ATE_GLOBAL_CONFIG = new InjectionToken<AteEditorConfig>(\"ATE_GLOBAL_CONFIG\");\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","export function shallowArrayEqual<T>(a: readonly T[], b: readonly T[]): boolean {\n return a === b || (a.length === b.length && a.every((item, i) => item === b[i]));\n}\n\nexport function shallowObjectEqual<T extends object>(a: T, b: T): boolean {\n if (a === b) {\n return true;\n }\n const aKeys = Object.keys(a);\n const bKeys = Object.keys(b);\n return (\n aKeys.length === bKeys.length &&\n aKeys.every(\n key =>\n Object.prototype.hasOwnProperty.call(b, key) &&\n (a as Record<string, unknown>)[key] === (b as Record<string, unknown>)[key]\n )\n );\n}\n","import type { Extension, Mark, Node } from \"@tiptap/core\";\nimport type { StarterKitOptions } from \"@tiptap/starter-kit\";\n\n/**\n * Maps the runtime `.name` of each extension bundled in `@tiptap/starter-kit`\n * to its corresponding option key in `StarterKitOptions`.\n */\nexport const STARTER_KIT_NAME_TO_OPTION: Readonly<Record<string, keyof StarterKitOptions>> = {\n blockquote: \"blockquote\",\n bold: \"bold\",\n bulletList: \"bulletList\",\n code: \"code\",\n codeBlock: \"codeBlock\",\n doc: \"document\",\n dropCursor: \"dropcursor\",\n gapCursor: \"gapcursor\",\n hardBreak: \"hardBreak\",\n heading: \"heading\",\n undoRedo: \"undoRedo\",\n horizontalRule: \"horizontalRule\",\n italic: \"italic\",\n listItem: \"listItem\",\n listKeymap: \"listKeymap\",\n link: \"link\",\n orderedList: \"orderedList\",\n paragraph: \"paragraph\",\n strike: \"strike\",\n text: \"text\",\n underline: \"underline\",\n trailingNode: \"trailingNode\",\n};\n\n/**\n * Describes which parts of Angular Tiptap Editor's UI or state calculators\n * depend on a given built-in or StarterKit extension name.\n */\nexport const ATE_BUILTIN_UI_DEPENDENCIES: Readonly<Record<string, string>> = {\n blockquote: \"toolbar/slash menu blockquote buttons, AteStructureCalculator\",\n bold: \"toolbar/bubble menu bold buttons, AteMarksCalculator\",\n bulletList: \"toolbar/slash menu bullet list buttons, AteStructureCalculator\",\n code: \"toolbar/bubble menu inline code buttons, AteMarksCalculator\",\n codeBlock: \"toolbar/slash menu code block buttons, AteStructureCalculator\",\n doc: \"top-level ProseMirror document schema\",\n dropCursor: \"drag-and-drop cursor indicator\",\n gapCursor: \"gap cursor navigation around leaf block nodes\",\n hardBreak: \"Shift+Enter line break shortcut\",\n heading:\n \"toolbar/bubble menu/slash menu heading controls, table of contents, AteStructureCalculator\",\n undoRedo: \"toolbar undo/redo buttons, AteStructureCalculator\",\n horizontalRule: \"toolbar/slash menu horizontal rule buttons\",\n italic: \"toolbar/bubble menu italic buttons, AteMarksCalculator\",\n listItem: \"bullet/ordered list items, block shortcuts\",\n listKeymap: \"list backspace/delete keyboard navigation\",\n link: \"toolbar/bubble menu link editor, Mod+K shortcut, AteMarksCalculator\",\n orderedList: \"toolbar/slash menu ordered list buttons, AteStructureCalculator\",\n paragraph: \"default text block node, AteStructureCalculator\",\n strike: \"toolbar/bubble menu strikethrough buttons, AteMarksCalculator\",\n text: \"core inline text node\",\n underline: \"toolbar/bubble menu underline buttons, AteMarksCalculator\",\n trailingNode: \"automatic trailing paragraph after block nodes\",\n textStyle: \"color picker, AteMarksCalculator\",\n color: \"toolbar/bubble menu text color picker, AteMarksCalculator\",\n placeholder: \"empty editor placeholder decoration\",\n superscript: \"toolbar/bubble menu superscript buttons, AteMarksCalculator\",\n subscript: \"toolbar/bubble menu subscript buttons, AteMarksCalculator\",\n textAlign: \"toolbar/image bubble menu alignment buttons, AteStructureCalculator\",\n ateLinkClickBehavior: \"read-only and Ctrl+click link navigation\",\n ateBlockShortcuts: \"Mod+D and Mod+Shift+ArrowUp/Down block shortcuts\",\n ateLinkShortcut: \"Mod+K link editor shortcut\",\n highlight: \"toolbar/bubble menu highlight picker, AteMarksCalculator\",\n resizableImage:\n \"image node view, image bubble menu, image upload/resize service, AteImageCalculator\",\n atePaste: \"paste settings (`paste` input / config): format filters and `transformHTML`\",\n atePasteSourceTracker:\n \"paste source detection (`editor` / `office` / `external`) for the `paste` settings\",\n atePastedImage: \"pasted HTML image sanitization and base64 re-hosting\",\n ateUploadProgress: \"image upload progress overlay\",\n tableExtension: \"toolbar/slash menu table insertion, table/cell bubble menus, AteTableCalculator\",\n tableOfContents: \"slash menu table of contents node, AteTableOfContentsComponent\",\n tiptapState: \"reactive editor state engine (toolbar, bubble menus, footer)\",\n blockControls: \"block plus button and drag handle\",\n officePaste: \"Word/Excel paste normalization\",\n characterCount: \"footer character/word counters and maxCharacters limit\",\n};\n\nexport function getExtensionName(ext: Extension | Node | Mark): string | undefined {\n return (ext as { name?: string })?.name;\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 booleanAttribute,\n isDevMode,\n} from \"@angular/core\";\n\nfunction transformBooleanInput(val: unknown): boolean | undefined {\n if (val === undefined || val === null) {\n return undefined;\n }\n return booleanAttribute(val);\n}\nimport { takeUntilDestroyed } from \"@angular/core/rxjs-interop\";\nimport { Editor, EditorOptions, Extension, Node, Mark, JSONContent } from \"@tiptap/core\";\nimport StarterKit, { type StarterKitOptions } from \"@tiptap/starter-kit\";\nimport { Placeholder, CharacterCount } from \"@tiptap/extensions\";\nimport { Superscript } from \"@tiptap/extension-superscript\";\nimport { Subscript } from \"@tiptap/extension-subscript\";\nimport { TextAlign } from \"@tiptap/extension-text-align\";\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\";\nimport { Node as PMNode } from \"@tiptap/pm/model\";\n\nimport { AteResizableImage } from \"../../extensions/ate-resizable-image.extension\";\nimport { AteIconRegistry } from \"../../services/ate-icon-registry.service\";\nimport { AteUploadProgress } from \"../../extensions/ate-upload-progress.extension\";\nimport { AtePastedImage } from \"../../extensions/ate-pasted-image.extension\";\nimport { AteLinkShortcut } from \"../../extensions/ate-link-shortcut.extension\";\nimport { AteBlockShortcuts } from \"../../extensions/ate-block-shortcuts.extension\";\nimport { AtePaste } from \"../../extensions/ate-paste.extension\";\nimport { AteTableExtension } from \"../../extensions/ate-table.extension\";\nimport { AteTocNodeOptions } from \"../table-of-contents/ate-toc-node.component\";\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 { AteSlashCommandsComponent } from \"../slash-commands/ate-slash-commands.component\";\nimport { AteBlockControlsComponent } from \"./ate-block-controls.component\";\nimport { AteCustomSlashCommands } from \"../../models/ate-slash-command.model\";\nimport { AteEditToggleComponent } from \"../edit-toggle/ate-edit-toggle.component\";\nimport { AteImageService } from \"../../services/ate-image.service\";\nimport { AteI18nService } from \"../../services/ate-i18n.service\";\nimport { AteEditorI18n } from \"../../services/ate-editor-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 { AteExportService } from \"../../services/ate-export.service\";\nimport { AteEditorRegistry } from \"../../services/ate-editor-registry.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\";\nimport { registerAngularComponent } from \"../../node-view/ate-register-angular-component\";\nimport { RegisterAngularComponentOptions } from \"../../node-view/ate-node-view.models\";\nimport { ATE_GLOBAL_CONFIG } from \"../../config/ate-global-config.token\";\nimport { Type, Injector } from \"@angular/core\";\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 {\n AteEditorConfig,\n AteAngularNode,\n AteBlockControlsMode,\n AteAutofocusMode,\n} from \"../../models/ate-editor-config.model\";\nimport { AteLinkClickBehavior } from \"../../extensions/ate-link-click-behavior.extension\";\nimport { AteBlockControlsExtension } from \"../../extensions/ate-block-controls.extension\";\nimport {\n ATE_DEFAULT_TOOLBAR_CONFIG,\n ATE_DEFAULT_BUBBLE_MENU_CONFIG,\n ATE_DEFAULT_IMAGE_BUBBLE_MENU_CONFIG,\n ATE_DEFAULT_IMAGE_UPLOAD_CONFIG,\n ATE_DEFAULT_PASTE_CONFIG,\n ATE_DEFAULT_TABLE_MENU_CONFIG,\n ATE_DEFAULT_CELL_MENU_CONFIG,\n ATE_DEFAULT_CONFIG,\n} from \"../../config/ate-editor.config\";\nimport { concat, defer, Observable, of, tap } from \"rxjs\";\nimport {\n AteImageUploadHandler,\n AteImageSrcResolver,\n AteImageUploadOptions,\n AteImageUploadResult,\n AteImageRejection,\n AtePastedImageRejection,\n} from \"../../models/ate-image.model\";\nimport { AtePasteConfig } from \"../../models/ate-paste.model\";\nimport { SupportedLocale } from \"../../i18n/ateTranslationsModel\";\nimport { shallowArrayEqual, shallowObjectEqual } from \"../../utils/ate-equality.utils\";\nimport {\n ATE_BUILTIN_UI_DEPENDENCIES,\n STARTER_KIT_NAME_TO_OPTION,\n getExtensionName,\n} from \"../../utils/ate-extensions.utils\";\n\n// Slash commands configuration is handled dynamically via slashCommandsConfigComputed\n\n/**\n * The main rich-text editor component for Angular.\n *\n * Powered by Tiptap and built with a native Signal-based architecture, it provides\n * a seamless, high-performance editing experience. Supports automatic registration\n * of Angular components as interactive nodes ('Angular Nodes'), full Reactive Forms\n * integration, and extensive customization via the AteEditorConfig.\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 \"[class.ate-blocks-inside]\": \"finalBlockControls() === 'inside'\",\n \"[class.ate-blocks-outside]\": \"finalBlockControls() === 'outside'\",\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 AteBlockControlsComponent,\n ],\n providers: [\n AteEditorCommandsService,\n AteImageService,\n AteColorPickerService,\n AteLinkService,\n AteExportService,\n AteEditorI18n,\n ],\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 <!-- Block Controls (Plus + Drag) -->\n @if (finalEditable() && !mergedDisabled() && editor() && finalBlockControls() !== \"none\") {\n <ate-block-controls\n [editor]=\"editor()!\"\n [hoveredData]=\"hoveredBlock()\"\n [style.display]=\"editorFullyInitialized() ? 'block' : 'none'\"></ate-block-controls>\n }\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 (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 {{\n characterCount() > 1\n ? currentTranslations().editor.characterPlural\n : currentTranslations().editor.character\n }}\n @if (finalMaxCharacters()) {\n / {{ finalMaxCharacters() }}\n }\n }\n\n @if (finalShowCharacterCount() && finalShowWordCount()) {\n ,\n }\n\n @if (finalShowWordCount()) {\n {{ wordCount() }}\n {{\n wordCount() > 1\n ? currentTranslations().editor.wordPlural\n : currentTranslations().editor.word\n }}\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 ===== */\n --ate-primary: #2563eb;\n --ate-primary-hover: #153ca9;\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-selection-bg: var(--ate-primary-light-alpha);\n\n --ate-error-color: #c53030;\n --ate-error-bg: #fed7d7;\n --ate-error-border: #feb2b2;\n\n /* ===== COMPONENT TOKENS ===== */\n --ate-border-color: var(--ate-border);\n --ate-border-width: 2px;\n --ate-border-radius: 12px;\n --ate-sub-border-radius: 8px;\n --ate-focus-color: var(--ate-primary);\n --ate-background: var(--ate-surface);\n\n /* Content */\n --ate-text-color: var(--ate-text, #2d3748);\n --ate-placeholder-color: var(--ate-text-muted, #a0aec0);\n --ate-list-marker-color: var(--ate-text-color);\n --ate-line-height: 1.6;\n --ate-content-padding-block: 16px;\n --ate-content-padding-inline: 16px;\n --ate-content-gutter: 0px;\n\n /* ===== MENUS (Slash/Bubble) ===== */\n --ate-menu-bg: var(--ate-surface, #ffffff);\n --ate-menu-border-radius: var(--ate-border-radius, 12px);\n --ate-menu-border: var(--ate-border, #e2e8f0);\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: 4px;\n --ate-menu-gap: 2px;\n\n /* Toolbar */\n --ate-toolbar-padding: var(--ate-menu-padding);\n --ate-toolbar-gap: var(--ate-menu-gap);\n --ate-toolbar-background: var(--ate-surface-secondary, #f8f9fa);\n --ate-toolbar-border-color: var(--ate-border, #e2e8f0);\n --ate-toolbar-button-color: var(--ate-text-secondary, #64748b);\n --ate-toolbar-button-hover-background: transparent;\n --ate-toolbar-button-active-background: color-mix(\n in srgb,\n var(--ate-primary, #2563eb),\n transparent 90%\n );\n --ate-toolbar-button-active-color: var(--ate-primary, #2563eb);\n\n /* Counter */\n --ate-counter-color: var(--ate-text-secondary, #64748b);\n --ate-counter-background: var(--ate-surface-secondary, #f8f9fa);\n --ate-counter-border-color: var(--ate-border, #e2e8f0);\n\n /* Drag & Drop */\n --ate-drag-background: #f0f8ff;\n --ate-drag-border-color: var(--ate-primary, #2563eb);\n\n /* Blockquote */\n --ate-blockquote-border-color: var(--ate-border, #e2e8f0);\n --ate-blockquote-background: var(--ate-surface-secondary, #f8f9fa);\n\n /* Code */\n --ate-code-background: var(--ate-surface-secondary, #f8f9fa);\n --ate-code-color: var(--ate-text, #2d3748);\n --ate-code-border-color: var(--ate-border, #e2e8f0);\n\n --ate-code-block-background: #0f172a;\n --ate-code-block-color: #e2e8f0;\n --ate-code-block-border-color: var(--ate-border, #e2e8f0);\n\n /* Images */\n --ate-image-border-radius: 16px;\n --ate-image-selected-color: var(--ate-primary, #2563eb);\n\n /* Scrollbars */\n --ate-scrollbar-width: 10px;\n --ate-scrollbar-thumb: var(--ate-border, #e2e8f0);\n --ate-scrollbar-thumb-hover: var(--ate-text-muted, #a0aec0);\n --ate-scrollbar-track: transparent;\n\n /* Tables */\n --ate-table-border-color: var(--ate-border, #e2e8f0);\n --ate-table-header-background: var(--ate-surface-secondary, #f8f9fa);\n --ate-table-header-color: var(--ate-text, #2d3748);\n --ate-table-cell-background: var(--ate-surface, #ffffff);\n --ate-table-cell-selected-background: color-mix(\n in srgb,\n var(--ate-primary, #2563eb),\n transparent 90%\n );\n --ate-table-resize-handle-color: var(--ate-primary, #2563eb);\n --ate-table-row-hover-background: color-mix(\n in srgb,\n var(--ate-primary, #2563eb),\n transparent 95%\n );\n\n /* Floating UI & Tooltips */\n --ate-tooltip-bg: var(--ate-code-block-background, #0f172a);\n --ate-tooltip-color: var(--ate-code-block-color, #e2e8f0);\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 :host.ate-blocks-inside {\n --ate-content-gutter: 54px;\n }\n\n @media (max-width: 768px) {\n :host.ate-blocks-inside {\n --ate-content-gutter: 0px;\n }\n\n ate-block-controls {\n display: none !important;\n }\n }\n\n /* Styles ProseMirror avec :host ::ng-deep */\n :host ::ng-deep .ProseMirror {\n padding-inline: calc(var(--ate-content-padding-inline) + var(--ate-content-gutter));\n padding-block: var(--ate-content-padding-block);\n outline: none;\n line-height: var(--ate-line-height);\n color: var(--ate-text-color);\n min-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 :host ::ng-deep .ProseMirror ::selection {\n background-color: var(--ate-selection-bg);\n color: inherit;\n }\n\n :host ::ng-deep .ProseMirror ::-moz-selection {\n background-color: var(--ate-selection-bg);\n color: inherit;\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 :host ::ng-deep .ProseMirror h4 {\n font-size: 1.1em;\n font-weight: bold;\n margin-top: 1em;\n margin-bottom: 0.5em;\n }\n\n :host ::ng-deep .ProseMirror h5,\n :host ::ng-deep .ProseMirror h6 {\n font-size: 1em;\n font-weight: bold;\n margin-top: 1em;\n margin-bottom: 0.5em;\n }\n\n /* Paragraphes et listes (Normalisation contre les CSS Resets globaux type Tailwind) */\n :host ::ng-deep .ProseMirror p {\n margin: 0.5em 0;\n }\n\n :host ::ng-deep .ProseMirror ul {\n list-style-type: disc;\n list-style-position: outside;\n padding-left: 2em;\n margin: 0.5em 0;\n }\n\n :host ::ng-deep .ProseMirror ol {\n list-style-type: decimal;\n list-style-position: outside;\n padding-left: 2em;\n margin: 0.5em 0;\n }\n\n :host ::ng-deep .ProseMirror ul ul {\n list-style-type: circle;\n }\n\n :host ::ng-deep .ProseMirror ul ul ul {\n list-style-type: square;\n }\n\n :host ::ng-deep .ProseMirror ol ol {\n list-style-type: lower-alpha;\n }\n\n :host ::ng-deep .ProseMirror ol ol ol {\n list-style-type: lower-roman;\n }\n\n :host ::ng-deep .ProseMirror li::marker {\n color: var(--ate-list-marker-color);\n }\n\n :host ::ng-deep .ProseMirror ul[data-type=\"taskList\"] {\n list-style-type: none;\n }\n\n :host ::ng-deep .ProseMirror hr {\n border: none;\n border-top: 1px solid var(--ate-border);\n margin: 1.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 /* Allow interaction in read-only mode (links, node selection) */\n }\n\n :host ::ng-deep .ProseMirror[contenteditable=\"false\"] img {\n cursor: pointer;\n }\n\n :host ::ng-deep .ProseMirror[contenteditable=\"false\"] a {\n cursor: pointer;\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 :host ::ng-deep .resizable-image-container.selected img {\n border-color: var(--ate-image-selected-color);\n transition: all 0.2s ease;\n }\n\n /* Alignment Support (ProseMirror / ATE Wrapper) */\n :host ::ng-deep .ProseMirror [data-text-align=\"center\"],\n :host ::ng-deep .ProseMirror [data-align=\"center\"] {\n text-align: center;\n }\n\n :host ::ng-deep .ProseMirror [data-text-align=\"right\"],\n :host ::ng-deep .ProseMirror [data-align=\"right\"] {\n text-align: right;\n }\n\n :host ::ng-deep .ProseMirror [data-text-align=\"left\"],\n :host ::ng-deep .ProseMirror [data-align=\"left\"] {\n text-align: left;\n }\n\n /* Conteneur pour les images redimensionnables */\n :host ::ng-deep .resizable-image-wrapper {\n display: block;\n width: 100%;\n margin: 0.5em 0;\n }\n\n :host ::ng-deep .resizable-image-container {\n position: relative;\n display: inline-block;\n max-width: 100%;\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 opacity: 0;\n transition: opacity 0.2s ease;\n }\n\n /* Styles pour le SlashCommandComponent */\n ::ng-deep .ate-slash-decoration {\n background: var(\n --ate-primary-light,\n color-mix(in srgb, var(--ate-primary, #2563eb), transparent 90%)\n );\n padding: 4px 8px;\n border-radius: var(--ate-sub-border-radius, 8px);\n }\n\n ::ng-deep .ate-slash-decoration.is-empty::after {\n content: attr(data-decoration-content);\n color: var(--ate-text-secondary);\n font-weight: 400;\n opacity: 0.7;\n }\n\n /* Afficher les poignées au hover (même si non sélectionné) - Uniquement si éditable */\n :host:not(.is-readonly):not(.is-disabled)\n ::ng-deep\n .resizable-image-container:hover\n .resize-controls,\n :host:not(.is-readonly):not(.is-disabled) ::ng-deep body.resizing .resize-controls {\n opacity: 1;\n }\n\n /* Poignées de redimensionnement */\n :host ::ng-deep .resize-handle {\n position: absolute;\n width: 0.35rem;\n height: 2rem;\n background: var(--ate-primary);\n border: 2px solid var(--ate-surface);\n border-radius: var(--ate-border-radius);\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 des côtés avec scale séparé pour centrage */\n :host ::ng-deep .resize-handle-w:hover,\n :host ::ng-deep .resize-handle-e:hover {\n background: var(--ate-primary-hover);\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 background: var(--ate-primary-hover);\n }\n\n /* Positions spécifiques pour chaque poignée */\n :host ::ng-deep .resize-handle-w {\n top: 50%;\n left: 0.35rem;\n transform: translateY(-50%);\n cursor: w-resize;\n }\n :host ::ng-deep .resize-handle-e {\n top: 50%;\n right: 0.35rem;\n transform: translateY(-50%);\n cursor: e-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 .resizable-image-container {\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 .resizable-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 | undefined>(undefined);\n editable = input<boolean | undefined, unknown>(undefined, { transform: transformBooleanInput });\n disabled = input<boolean | undefined, unknown>(undefined, { transform: transformBooleanInput });\n minHeight = input<number | string | undefined>(undefined);\n height = input<number | string | undefined>(undefined);\n maxHeight = input<number | string | undefined>(undefined);\n fillContainer = input<boolean | undefined, unknown>(undefined, {\n transform: transformBooleanInput,\n });\n showToolbar = input<boolean | undefined, unknown>(undefined, {\n transform: transformBooleanInput,\n });\n showFooter = input<boolean | undefined, unknown>(undefined, { transform: transformBooleanInput });\n showCharacterCount = input<boolean | undefined, unknown>(undefined, {\n transform: transformBooleanInput,\n });\n showWordCount = input<boolean | undefined, unknown>(undefined, {\n transform: transformBooleanInput,\n });\n maxCharacters = input<number | undefined>(undefined);\n enableOfficePaste = input<boolean | undefined, unknown>(undefined, {\n transform: transformBooleanInput,\n });\n enableSlashCommands = input<boolean | undefined, unknown>(undefined, {\n transform: transformBooleanInput,\n });\n enableBlockShortcuts = input<boolean | undefined, unknown>(undefined, {\n transform: transformBooleanInput,\n });\n slashCommands = input<AteSlashCommandsConfig | undefined>(undefined);\n customSlashCommands = input<AteCustomSlashCommands | undefined>(undefined);\n blockControls = input<AteBlockControlsMode>();\n locale = input<SupportedLocale | undefined>(undefined);\n autofocus = input<AteAutofocusMode | undefined>(undefined);\n mode = input<\"classic\" | \"seamless\" | undefined>(undefined);\n seamless = input<boolean | undefined, unknown>(undefined, { transform: transformBooleanInput });\n floatingToolbar = input<boolean | undefined, unknown>(undefined, {\n transform: transformBooleanInput,\n });\n showEditToggle = input<boolean | undefined, unknown>(undefined, {\n transform: transformBooleanInput,\n });\n spellcheck = input<boolean | undefined, unknown>(undefined, { transform: transformBooleanInput });\n\n tiptapExtensions = input<(Extension | Node | Mark)[] | undefined>(undefined);\n tiptapOptions = input<Partial<EditorOptions> | undefined>(undefined);\n starterKitOptions = input<Partial<StarterKitOptions> | undefined>(undefined);\n\n // Nouveaux inputs pour les bubble menus\n showBubbleMenu = input<boolean | undefined, unknown>(undefined, {\n transform: transformBooleanInput,\n });\n bubbleMenu = input<Partial<AteBubbleMenuConfig> | undefined>(undefined);\n showImageBubbleMenu = input<boolean | undefined, unknown>(undefined, {\n transform: transformBooleanInput,\n });\n imageBubbleMenu = input<Partial<AteImageBubbleMenuConfig> | undefined>(undefined);\n\n // Configuration de la toolbar\n toolbar = input<Partial<AteToolbarConfig> | undefined>(undefined);\n\n // Configuration des menus de table\n showTableBubbleMenu = input<boolean | undefined, unknown>(undefined, {\n transform: transformBooleanInput,\n });\n tableBubbleMenu = input<Partial<AteTableBubbleMenuConfig> | undefined>(undefined);\n showCellBubbleMenu = input<boolean | undefined, unknown>(undefined, {\n transform: transformBooleanInput,\n });\n cellBubbleMenu = input<Partial<AteCellBubbleMenuConfig> | undefined>(undefined);\n\n /**\n * Additionnal state calculators to extend the reactive editor state.\n */\n stateCalculators = input<AteStateCalculator[] | undefined>(undefined);\n\n // Nouveau input pour la configuration de l'upload d'images\n imageUpload = input<Partial<AteImageUploadOptions> | undefined>(undefined);\n\n /**\n * What is kept from HTML pasted or dropped from other apps (`colors`, `highlights`),\n * and an optional `transformHTML` hook. Merged over `config.paste`.\n */\n paste = input<AtePasteConfig | undefined>(undefined);\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 /**\n * Maps the `src` stored in the document to the URL the editor displays and downloads.\n * The document, `getHTML()` and exports keep the original `src`.\n */\n imageSrcResolver = input<AteImageSrcResolver | undefined>(undefined);\n\n /**\n * Optional unique identifier for the editor instance in the registry.\n * If not specified, a unique ID is automatically generated.\n */\n editorId = input<string | 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 imageUploaded = output<AteImageUploadResult>();\n /** Emitted when an image file is rejected (disallowed type, too large or failed upload) */\n imageRejected = output<AteImageRejection>();\n /** Emitted when an image from pasted HTML is dropped (unreachable source or failed upload) */\n pastedImageRejected = output<AtePastedImageRejection>();\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 /** Technical config the current editor was created with, see `technicalConfig()` */\n private editorTechnicalConfig: unknown[] | null = null;\n private _hoveredBlock = signal<{ node: PMNode; element: HTMLElement; pos: number } | null>(null);\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 readonly hoveredBlock = this._hoveredBlock.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.disabled() ?? this.effectiveConfig().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 inputVal = this.seamless();\n if (inputVal !== undefined) {\n return inputVal;\n }\n\n const modeVal = this.mode();\n if (modeVal !== undefined) {\n return modeVal === \"seamless\";\n }\n\n const fromConfig = this.effectiveConfig().mode;\n return fromConfig === \"seamless\";\n });\n\n readonly finalEditable = computed(\n () => this.editable() ?? this.effectiveConfig().editable ?? true\n );\n readonly finalPlaceholder = computed(\n () =>\n this.placeholder() ??\n this.effectiveConfig().placeholder ??\n this.currentTranslations().editor.placeholder\n );\n readonly finalFillContainer = computed(\n () => this.fillContainer() ?? this.effectiveConfig().fillContainer\n );\n readonly finalShowFooter = computed(\n () => this.showFooter() ?? this.effectiveConfig().showFooter ?? true\n );\n readonly finalShowEditToggle = computed(\n () => this.showEditToggle() ?? this.effectiveConfig().showEditToggle ?? false\n );\n\n readonly finalHeight = computed(() => {\n const h = this.height() ?? this.effectiveConfig().height;\n return typeof h === \"number\" ? `${h}px` : h;\n });\n readonly finalMinHeight = computed(() => {\n const mh = this.minHeight() ?? this.effectiveConfig().minHeight;\n return typeof mh === \"number\" ? `${mh}px` : mh;\n });\n readonly finalMaxHeight = computed(() => {\n const mh = this.maxHeight() ?? this.effectiveConfig().maxHeight;\n return typeof mh === \"number\" ? `${mh}px` : mh;\n });\n\n readonly finalSpellcheck = computed(\n () => this.spellcheck() ?? this.effectiveConfig().spellcheck ?? true\n );\n readonly finalEnableOfficePaste = computed(\n () => this.enableOfficePaste() ?? this.effectiveConfig().enableOfficePaste ?? true\n );\n\n // Features\n readonly finalShowToolbar = computed(\n () => this.showToolbar() ?? this.effectiveConfig().showToolbar ?? true\n );\n\n readonly finalToolbarConfig = computed(() => {\n const fromInput = this.toolbar();\n const fromConfig = this.effectiveConfig().toolbar;\n const base = ATE_DEFAULT_TOOLBAR_CONFIG;\n\n if (fromInput && Object.keys(fromInput).length > 0) {\n return { ...base, ...fromInput };\n }\n if (fromConfig) {\n return { ...base, ...fromConfig };\n }\n return base;\n });\n\n readonly finalFloatingToolbar = computed(\n () => this.floatingToolbar() ?? this.effectiveConfig().floatingToolbar ?? false\n );\n\n readonly finalShowBubbleMenu = computed(\n () => this.showBubbleMenu() ?? this.effectiveConfig().showBubbleMenu ?? true\n );\n\n readonly finalBubbleMenuConfig = computed(() => {\n const fromInput = this.bubbleMenu();\n const fromConfig = this.effectiveConfig().bubbleMenu;\n const base = ATE_DEFAULT_BUBBLE_MENU_CONFIG;\n\n if (fromInput && Object.keys(fromInput).length > 0) {\n return { ...base, ...fromInput };\n }\n if (fromConfig) {\n return { ...base, ...fromConfig };\n }\n return base;\n });\n\n readonly finalShowImageBubbleMenu = computed(\n () => this.showImageBubbleMenu() ?? this.effectiveConfig().showImageBubbleMenu ?? true\n );\n\n readonly finalImageBubbleMenuConfig = computed(() => {\n const fromInput = this.imageBubbleMenu();\n const fromConfig = this.effectiveConfig().imageBubbleMenu;\n const base = ATE_DEFAULT_IMAGE_BUBBLE_MENU_CONFIG;\n\n if (fromInput && Object.keys(fromInput).length > 0) {\n return { ...base, ...fromInput };\n }\n if (fromConfig) {\n return { ...base, ...fromConfig };\n }\n return base;\n });\n\n readonly finalShowTableBubbleMenu = computed(\n () => this.showTableBubbleMenu() ?? this.effectiveConfig().showTableMenu ?? true\n );\n\n readonly finalTableBubbleMenuConfig = computed(() => {\n const fromInput = this.tableBubbleMenu();\n const fromConfig = this.effectiveConfig().tableBubbleMenu;\n const base = ATE_DEFAULT_TABLE_MENU_CONFIG;\n\n if (fromInput && Object.keys(fromInput).length > 0) {\n return { ...base, ...fromInput };\n }\n if (fromConfig) {\n return { ...base, ...fromConfig };\n }\n return base;\n });\n\n readonly finalShowCellBubbleMenu = computed(\n () => this.showCellBubbleMenu() ?? this.effectiveConfig().showCellMenu ?? true\n );\n\n readonly finalCellBubbleMenuConfig = computed(() => {\n const fromInput = this.cellBubbleMenu();\n const fromConfig = this.effectiveConfig().cellBubbleMenu;\n const base = ATE_DEFAULT_CELL_MENU_CONFIG;\n\n if (fromInput && Object.keys(fromInput).length > 0) {\n return { ...base, ...fromInput };\n }\n if (fromConfig) {\n return { ...base, ...fromConfig };\n }\n return base;\n });\n\n readonly finalEnableSlashCommands = computed(\n () => this.enableSlashCommands() ?? this.effectiveConfig().enableSlashCommands ?? true\n );\n\n readonly finalSlashCommandsConfig = computed(() => {\n const fromInputComponent = this.customSlashCommands();\n const fromConfigComponent = this.effectiveConfig().customSlashCommands;\n const customConfig = fromInputComponent ?? fromConfigComponent;\n\n if (customConfig) {\n return customConfig;\n }\n\n const fromInputOptions = this.slashCommands();\n const fromConfigOptions = this.effectiveConfig().slashCommands;\n const baseConfig =\n fromInputOptions && Object.keys(fromInputOptions).length > 0\n ? fromInputOptions\n : fromConfigOptions;\n\n return {\n commands: filterSlashCommands(\n baseConfig || {},\n this.editorI18n,\n this.editorCommandsService,\n this.finalImageUploadConfig()\n ),\n };\n });\n\n // Behavior\n readonly finalAutofocus = computed(() => this.autofocus() ?? this.effectiveConfig().autofocus);\n readonly finalMaxCharacters = computed(\n () => this.maxCharacters() ?? this.effectiveConfig().maxCharacters\n );\n readonly finalEnableBlockShortcuts = computed(\n () => this.enableBlockShortcuts() ?? this.effectiveConfig().enableBlockShortcuts ?? true\n );\n readonly finalBlockControls = computed(\n () => this.blockControls() ?? this.effectiveConfig().blockControls ?? \"none\"\n );\n readonly finalShowCharacterCount = computed(\n () => this.showCharacterCount() ?? this.effectiveConfig().showCharacterCount ?? true\n );\n readonly finalShowWordCount = computed(\n () => this.showWordCount() ?? this.effectiveConfig().showWordCount ?? true\n );\n readonly finalLocale = computed(\n () => (this.locale() as SupportedLocale) ?? (this.effectiveConfig().locale as SupportedLocale)\n );\n\n // Extensions & Options\n readonly finalTiptapExtensions = computed(\n () => this.tiptapExtensions() ?? this.effectiveConfig().tiptapExtensions ?? [],\n { equal: shallowArrayEqual }\n );\n\n readonly finalTiptapOptions = computed(\n () => this.tiptapOptions() ?? this.effectiveConfig().tiptapOptions ?? {},\n { equal: shallowObjectEqual }\n );\n\n readonly finalStarterKitOptions = computed(\n () => this.starterKitOptions() ?? this.effectiveConfig().starterKitOptions ?? {},\n { equal: shallowObjectEqual }\n );\n\n readonly finalStateCalculators = computed(\n () => this.stateCalculators() ?? this.effectiveConfig().stateCalculators ?? []\n );\n\n readonly finalAngularNodesConfig = computed(() => this.effectiveConfig().angularNodes ?? [], {\n equal: shallowArrayEqual,\n });\n\n // Paste\n readonly finalPasteConfig = computed<AtePasteConfig>(() => ({\n ...ATE_DEFAULT_PASTE_CONFIG,\n ...this.effectiveConfig().paste,\n ...this.paste(),\n }));\n\n // Image Upload\n readonly finalImageUploadConfig = computed(() => {\n const fromInput = this.imageUpload();\n const fromConfig = this.effectiveConfig().imageUpload;\n const base = ATE_DEFAULT_IMAGE_UPLOAD_CONFIG;\n\n const merged = {\n ...base,\n ...fromConfig,\n ...fromInput,\n };\n\n return {\n ...merged,\n maxSize: (merged.maxSize ?? 5) * 1024 * 1024, // Convert MB to bytes for internal service\n };\n });\n\n readonly finalImageSrcResolver = computed(\n () => this.imageSrcResolver() ?? this.effectiveConfig().imageSrcResolver\n );\n\n readonly finalImageUploadHandler = computed(\n () => this.imageUploadHandler() ?? this.effectiveConfig().imageUpload?.handler\n );\n\n private readonly editorI18n = inject(AteEditorI18n);\n // Current translations (per-instance override via config or input, else the global locale)\n readonly currentTranslations = this.editorI18n.translations;\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 private editorRegistry = inject(AteEditorRegistry);\n private readonly warnedExtensionOverrides = new Set<string>();\n private iconRegistry = inject(AteIconRegistry);\n private _registeredId = signal<string | null>(null);\n readonly registeredId = this._registeredId.asReadonly();\n\n private injector = inject(Injector);\n private globalConfig = inject(ATE_GLOBAL_CONFIG, { optional: true });\n\n /**\n * Final merged configuration.\n * Priority: Input [config] > Global config via provideAteEditor()\n */\n readonly effectiveConfig = computed(() => {\n const fromInput = this.config();\n const fromGlobal = this.globalConfig || {};\n return { ...ATE_DEFAULT_CONFIG, ...fromGlobal, ...fromInput };\n });\n\n constructor() {\n this.editorI18n.bindLocale(this.finalLocale);\n // Effect to update editor content (with anti-echo)\n effect(\n () => {\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, { emitUpdate: false });\n });\n },\n { allowSignalWrites: true }\n );\n\n // Effect to update height properties\n effect(\n () => {\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 { allowSignalWrites: true }\n );\n\n // Effect to monitor editability changes\n effect(\n () => {\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 { allowSignalWrites: true }\n );\n\n // Effect to synchronize image upload handler with the service\n effect(\n () => {\n const handler = this.finalImageUploadHandler();\n this.editorCommandsService.uploadHandler = handler || null;\n },\n { allowSignalWrites: true }\n );\n\n // Effect to refresh the placeholder decoration when its resolved text changes\n effect(() => {\n const editor = this.editor();\n this.finalPlaceholder();\n\n if (editor && !editor.isDestroyed) {\n untracked(() => editor.view.dispatch(editor.state.tr));\n }\n });\n\n // Effect to re-apply the image src resolver to the displayed images when it changes\n // (e.g. a resolver set after the editor was created, or a new one after a token refresh)\n effect(() => {\n this.editorCommandsService.srcResolver = this.finalImageSrcResolver() ?? null;\n const editor = untracked(() => this.editor());\n if (editor && !editor.isDestroyed) {\n editor.storage.resizableImage?.srcRefreshers.forEach(refresh => refresh());\n }\n });\n\n // Effect to update character count limit dynamically\n effect(\n () => {\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 { allowSignalWrites: true }\n );\n\n // Effect to re-initialize editor when technical configuration changes\n effect(\n () => {\n const technicalConfig = this.technicalConfig();\n\n untracked(() => {\n const currentEditor = this.editor();\n // Before the first initEditor (AfterViewInit) there is nothing to re-create: it reads the latest config.\n // Compare with the config the editor was created with, so a change is never missed, however soon it comes.\n if (\n !currentEditor ||\n !this.editorTechnicalConfig ||\n technicalConfig.every((value, index) => value === this.editorTechnicalConfig![index])\n ) {\n return;\n }\n currentEditor.destroy();\n this._editorFullyInitialized.set(false);\n this.initEditor();\n });\n },\n { allowSignalWrites: true }\n );\n\n this.editorCommandsService.onImageUploaded = result => {\n this.imageUploaded.emit(result);\n };\n this.editorCommandsService.onImageRejected = rejection => {\n this.imageRejected.emit(rejection);\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 // Unregister from the global registry\n const id = this.registeredId();\n if (id) {\n this.editorRegistry.unregister(id);\n }\n }\n\n /**\n * Settings that require re-creating the editor when they change.\n * Each computed compares by value, so a new reference means a real change.\n */\n private technicalConfig(): unknown[] {\n return [\n this.finalTiptapExtensions(),\n this.finalTiptapOptions(),\n this.finalStarterKitOptions(),\n this.finalAngularNodesConfig(),\n this.finalBlockControls(),\n ];\n }\n\n private initEditor() {\n this.editorTechnicalConfig = this.technicalConfig();\n this.editorCommandsService.srcResolver = this.finalImageSrcResolver() ?? null;\n const starterKitOptions = this.finalStarterKitOptions();\n const customExtensions = this.finalTiptapExtensions();\n const customNames = new Set(\n customExtensions.map(getExtensionName).filter((name): name is string => !!name)\n );\n\n const defaultLinkOptions = {\n openOnClick: false,\n HTMLAttributes: {\n class: \"ate-link\",\n },\n };\n\n const effectiveStarterKitOptions: Partial<StarterKitOptions> = {\n ...starterKitOptions,\n link:\n starterKitOptions.link === false\n ? false\n : {\n ...defaultLinkOptions,\n ...starterKitOptions.link,\n HTMLAttributes: {\n ...defaultLinkOptions.HTMLAttributes,\n ...starterKitOptions.link?.HTMLAttributes,\n },\n },\n };\n\n const replacedNames: string[] = [];\n const ignoredStarterKitOptionKeys: string[] = [];\n\n for (const customName of customNames) {\n const optionKey = STARTER_KIT_NAME_TO_OPTION[customName];\n if (!optionKey) {\n continue;\n }\n const userStarterKitValue = starterKitOptions[optionKey];\n if (userStarterKitValue !== undefined && userStarterKitValue !== false) {\n ignoredStarterKitOptionKeys.push(optionKey);\n }\n if (userStarterKitValue !== false) {\n replacedNames.push(customName);\n }\n (effectiveStarterKitOptions as Record<string, unknown>)[optionKey] = false;\n }\n\n const extensions: (Extension | Node | Mark)[] = [\n StarterKit.configure(effectiveStarterKitOptions),\n TextStyle,\n Color.configure({\n types: [\"textStyle\"],\n }),\n Placeholder.configure({\n placeholder: () => this.finalPlaceholder(),\n }),\n Superscript,\n Subscript,\n TextAlign.configure({\n types: [\"heading\", \"paragraph\", \"resizableImage\"],\n }),\n AteLinkClickBehavior,\n AteBlockShortcuts.configure({\n enabled: () => this.finalEnableBlockShortcuts(),\n }),\n AtePaste.configure({\n config: () => this.finalPasteConfig(),\n }),\n AteLinkShortcut.configure({\n canOpen: () => this.editorCommandsService.editorState().can.toggleLink,\n open: editor => this.editorCommandsService.execute(editor, \"toggleLink\"),\n }),\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 srcResolver: () => this.editorCommandsService.srcResolver,\n }),\n AtePastedImage.configure({\n shouldRehost: () => this.editorCommandsService.hasUploadHandler,\n rehost: file => this.editorCommandsService.rehostImage(file, this.getImageUploadOptions()),\n onRejected: rejection => this.pastedImageRejected.emit(rejection),\n }),\n AteUploadProgress.configure({\n isUploading: () => this.editorCommandsService.isUploading(),\n uploadProgress: () => this.editorCommandsService.uploadProgress(),\n uploadMessage: () => this.editorCommandsService.uploadMessage(),\n iconHtml: () => this.iconRegistry.html(\"imageUpload\", \"spinning\"),\n }),\n AteTableExtension,\n registerAngularComponent(this.injector, AteTocNodeOptions),\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.finalStateCalculators(),\n ],\n }),\n ];\n\n if (this.finalBlockControls() !== \"none\") {\n extensions.push(\n AteBlockControlsExtension.configure({\n onHover: data => this._hoveredBlock.set(data),\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 // Register automatic node views from config\n const autoNodeViews = this.finalAngularNodesConfig();\n autoNodeViews.forEach((reg: AteAngularNode) => {\n const options =\n typeof reg === \"function\"\n ? { component: reg as Type<unknown> }\n : (reg as RegisterAngularComponentOptions<unknown>);\n\n try {\n const extension = registerAngularComponent(this.injector, options);\n extensions.push(extension);\n } catch (e) {\n console.error(\"[ATE] Failed to auto-register node view:\", e);\n }\n });\n\n // Custom extensions in tiptapExtensions take precedence over built-in extensions of the same name\n if (customExtensions.length > 0) {\n for (let i = extensions.length - 1; i >= 0; i--) {\n const name = getExtensionName(extensions[i]);\n if (name && customNames.has(name)) {\n replacedNames.push(name);\n extensions.splice(i, 1);\n }\n }\n\n extensions.push(...customExtensions);\n\n if (isDevMode()) {\n const newlyReplaced = replacedNames.filter(\n name => !this.warnedExtensionOverrides.has(`override:${name}`)\n );\n const newlyIgnoredOptions = ignoredStarterKitOptionKeys.filter(\n key => !this.warnedExtensionOverrides.has(`conflict:${key}`)\n );\n\n if (newlyReplaced.length > 0 || newlyIgnoredOptions.length > 0) {\n newlyReplaced.forEach(name => this.warnedExtensionOverrides.add(`override:${name}`));\n newlyIgnoredOptions.forEach(key => this.warnedExtensionOverrides.add(`conflict:${key}`));\n\n const parts: string[] = [];\n if (newlyReplaced.length > 0) {\n const details = newlyReplaced\n .map(name => {\n const deps = ATE_BUILTIN_UI_DEPENDENCIES[name];\n return deps ? `${name} (used by: ${deps})` : name;\n })\n .join(\"; \");\n parts.push(\n `Custom extension(s) in tiptapExtensions replaced built-in extension(s): ${details}.`\n );\n }\n if (newlyIgnoredOptions.length > 0) {\n const ignoredList = newlyIgnoredOptions\n .map(key => `starterKitOptions.${key}`)\n .join(\", \");\n parts.push(\n `${ignoredList} was ignored because the custom extension in tiptapExtensions takes precedence.`\n );\n }\n\n console.warn(`[ATE] ${parts.join(\" \")}`);\n }\n }\n }\n\n // Also allow any tiptap user options\n const userOptions = this.finalTiptapOptions();\n const userEditorProps = userOptions.editorProps;\n const userHandlePaste = userEditorProps?.handlePaste;\n const userHandleDOMPaste = userEditorProps?.handleDOMEvents?.paste;\n\n type EditorHandlePaste = NonNullable<NonNullable<EditorOptions[\"editorProps\"]>[\"handlePaste\"]>;\n type EditorDOMPasteHandler = NonNullable<\n NonNullable<NonNullable<EditorOptions[\"editorProps\"]>[\"handleDOMEvents\"]>[\"paste\"]\n >;\n\n const handleDOMPaste: EditorDOMPasteHandler = (view, event) => {\n const currentEditor = this.editor();\n if (\n currentEditor &&\n this.editorCommandsService.handleImagePaste(\n currentEditor,\n event,\n this.getImageUploadOptions()\n )\n ) {\n return true;\n }\n\n if (!userHandleDOMPaste) {\n return false;\n }\n\n const userResult = userHandleDOMPaste(view, event);\n return userResult === true;\n };\n\n const handlePaste: EditorHandlePaste = (view, event, slice) => {\n const currentEditor = this.editor();\n if (\n currentEditor &&\n this.editorCommandsService.handleImagePaste(\n currentEditor,\n event,\n this.getImageUploadOptions()\n )\n ) {\n return true;\n }\n\n if (!userHandlePaste) {\n return false;\n }\n\n const userResult = userHandlePaste(view, event, slice);\n return userResult === true;\n };\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 ...userEditorProps,\n attributes: {\n ...userEditorProps?.attributes,\n spellcheck: this.finalSpellcheck().toString(),\n },\n handleDOMEvents: {\n ...userEditorProps?.handleDOMEvents,\n paste: handleDOMPaste,\n },\n handlePaste,\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 // Tiptap emits create once every extension and plugin is mounted: the menus can show\n this._editorFullyInitialized.set(true);\n },\n onFocus: ({ editor, event }) => {\n const id = this.registeredId();\n if (id) {\n this.editorRegistry.setActive(id);\n }\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 // Register editor in the global registry\n const registeredId = this.editorRegistry.register(\n this.editorId(),\n () => this.editor(),\n this.editorCommandsService\n );\n this._registeredId.set(registeredId);\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 const editor = this.editor();\n if (editor) {\n this.editorCommandsService.handleImageDrop(editor, event, this.getImageUploadOptions());\n this._isDragOver.set(false);\n }\n }\n\n private getImageUploadOptions(): AteImageUploadOptions {\n const config = this.finalImageUploadConfig();\n return {\n quality: config.quality,\n maxWidth: config.maxWidth,\n maxHeight: config.maxHeight,\n maxSize: config.maxSize,\n allowedTypes: config.allowedTypes,\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) {\n return;\n }\n\n // In read-only mode, handle clearing of node selection\n if (!this.finalEditable()) {\n const target = event.target as HTMLElement;\n const editorElement = this.editorElement()?.nativeElement;\n if (target === editorElement || target.classList.contains(\"ate-content\")) {\n // Clear selection to hide bubble menus\n editor.commands.setTextSelection(0);\n }\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 {\n EnvironmentProviders,\n makeEnvironmentProviders,\n APP_INITIALIZER,\n Injector,\n} from \"@angular/core\";\nimport { setGlobalInjector } from \"./node-view/ate-injector.registry\";\n\nimport { ATE_GLOBAL_CONFIG } from \"./config/ate-global-config.token\";\nimport { AteEditorConfig } from \"./models/ate-editor-config.model\";\nimport { ATE_ICONS, AteIcons } from \"./services/ate-icon-registry.service\";\n\n/**\n * Provides the necessary configuration and initialization for the Angular TipTap Editor.\n * This should be called in your app.config.ts (for standalone) or main.ts.\n *\n * This provider is essential for 'Angular Nodes' to work correctly, as it captures the\n * root Injector required to instantiate custom Angular components within the editor.\n * @example\n * ```ts\n * bootstrapApplication(AppComponent, {\n * providers: [\n * provideAteEditor({\n * theme: 'dark',\n * mode: 'seamless'\n * })\n * ]\n * });\n * ```\n */\nexport function provideAteEditor(config?: AteEditorConfig): EnvironmentProviders {\n return makeEnvironmentProviders([\n {\n provide: ATE_GLOBAL_CONFIG,\n useValue: config || {},\n },\n {\n provide: APP_INITIALIZER,\n useFactory: (injector: Injector) => () => {\n setGlobalInjector(injector);\n },\n deps: [Injector],\n multi: true,\n },\n ]);\n}\n\n/**\n * Registers SVG icons, to override the library icons or to add icons for custom\n * toolbar items, bubble menus and slash commands. Can be called several times.\n *\n * Must be provided at application bootstrap (`app.config.ts` or `main.ts`) because\n * `AteIconRegistry` is root-scoped (`providedIn: 'root'`); for lazy routes or\n * runtime changes, inject `AteIconRegistry` and call `register()`.\n *\n * Values are a full `<svg>` element, used as-is with its own `fill` and `stroke`,\n * or only its inner markup, drawn in the Material Symbols viewBox (`0 -960 960 960`)\n * and filled with `currentColor`. Unregistered names fall back to\n * the Material Symbols font, when it is loaded.\n * @example\n * ```ts\n * bootstrapApplication(AppComponent, {\n * providers: [\n * provideAteEditor(),\n * provideAteIcons({\n * // full <svg>: keeps its own fill and stroke (here a stroke icon, Lucide style)\n * bold: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"…\"/></svg>',\n * // inner markup: Material Symbols viewBox, filled with currentColor\n * rocket: '<path d=\"…\"/>',\n * })\n * ]\n * });\n * ```\n */\nexport function provideAteIcons(icons: AteIcons): EnvironmentProviders {\n return makeEnvironmentProviders([{ provide: ATE_ICONS, useValue: icons, multi: true }]);\n}\n","// Generated by scripts/generate-ate-stroke-icons.mjs, do not edit by hand.\n// /ATE stroke icons: 24 grid, 2px stroke, round caps. Usage: provideAteIcons(ATE_STROKE_ICONS)\nimport type { AteIcons } from \"../services/ate-icon-registry.service\";\n\nexport const ATE_STROKE_ICONS: AteIcons = {\n addColumnAfter: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><rect x=\\\"4\\\" y=\\\"3\\\" width=\\\"10\\\" height=\\\"18\\\" rx=\\\"3\\\"/><path d=\\\"M9 3v18M4 9.5h10M16.5 12h5M19 9.5v5\\\"/></svg>\",\n addColumnBefore: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><rect x=\\\"10\\\" y=\\\"3\\\" width=\\\"10\\\" height=\\\"18\\\" rx=\\\"3\\\"/><path d=\\\"M15 3v18M10 9.5h10M2.5 12h5M5 9.5v5\\\"/></svg>\",\n addRowAfter: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><rect x=\\\"3\\\" y=\\\"4\\\" width=\\\"18\\\" height=\\\"10\\\" rx=\\\"3\\\"/><path d=\\\"M3 9h18M9.5 4v10M12 16.5v5M9.5 19h5\\\"/></svg>\",\n addRowBefore: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><rect x=\\\"3\\\" y=\\\"10\\\" width=\\\"18\\\" height=\\\"10\\\" rx=\\\"3\\\"/><path d=\\\"M3 15h18M9.5 10v10M12 2.5v5M9.5 5h5\\\"/></svg>\",\n alignCenter: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M4 6h16M7 10h10M4 14h16M7 18h10\\\"/></svg>\",\n alignJustify: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M4 6h16M4 10h16M4 14h16M4 18h16\\\"/></svg>\",\n alignLeft: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M4 6h16M4 10h10M4 14h16M4 18h10\\\"/></svg>\",\n alignRight: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M4 6h16M10 10h10M4 14h16M10 18h10\\\"/></svg>\",\n apply: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"m5 12.5 4.5 4.5L19 7.5\\\"/></svg>\",\n blockAdd: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><rect x=\\\"3.5\\\" y=\\\"3.5\\\" width=\\\"17\\\" height=\\\"17\\\" rx=\\\"5\\\"/><path d=\\\"M12 8.5v7M8.5 12h7\\\"/></svg>\",\n blockDrag: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><g fill=\\\"currentColor\\\" stroke=\\\"none\\\"><circle cx=\\\"9\\\" cy=\\\"6\\\" r=\\\"1.5\\\"/><circle cx=\\\"15\\\" cy=\\\"6\\\" r=\\\"1.5\\\"/><circle cx=\\\"9\\\" cy=\\\"12\\\" r=\\\"1.5\\\"/><circle cx=\\\"15\\\" cy=\\\"12\\\" r=\\\"1.5\\\"/><circle cx=\\\"9\\\" cy=\\\"18\\\" r=\\\"1.5\\\"/><circle cx=\\\"15\\\" cy=\\\"18\\\" r=\\\"1.5\\\"/></g></svg>\",\n blockquote: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M4 5v14M9 7.5h11M9 12h11M9 16.5h7\\\"/></svg>\",\n bold: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M7 5h5.5a3.5 3.5 0 0 1 0 7H7zM7 12h6.5a3.5 3.5 0 0 1 0 7H7z\\\" stroke-width=\\\"2.6\\\"/></svg>\",\n bulletList: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M10 6h10M10 12h10M10 18h10\\\"/><circle cx=\\\"5\\\" cy=\\\"6\\\" r=\\\"1.4\\\" fill=\\\"currentColor\\\" stroke=\\\"none\\\"/><circle cx=\\\"5\\\" cy=\\\"12\\\" r=\\\"1.4\\\" fill=\\\"currentColor\\\" stroke=\\\"none\\\"/><circle cx=\\\"5\\\" cy=\\\"18\\\" r=\\\"1.4\\\" fill=\\\"currentColor\\\" stroke=\\\"none\\\"/></svg>\",\n changeImage: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M11 20H6.5A3.5 3.5 0 0 1 3 16.5v-9A3.5 3.5 0 0 1 6.5 4h11A3.5 3.5 0 0 1 21 7.5V11M3 16l5-5 3.5 3.5\\\"/><circle cx=\\\"15.5\\\" cy=\\\"8.5\\\" r=\\\"1.4\\\"/><path d=\\\"m18.5 13.5 2 2-4.5 4.5h-2v-2z\\\"/></svg>\",\n clear: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M6 6l12 12M18 6 6 18\\\"/></svg>\",\n clearContent: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M9 20.5h11M4.8 14.8 13.6 6a2 2 0 0 1 2.8 0l3.2 3.2a2 2 0 0 1 0 2.8L11.1 20.5H9.3l-4.5-4.5a.9.9 0 0 1 0-1.2zM9.5 10.2l5.8 5.8\\\"/></svg>\",\n code: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M8.5 7 3.5 12l5 5M15.5 7l5 5-5 5\\\"/></svg>\",\n codeBlock: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><rect x=\\\"3\\\" y=\\\"4\\\" width=\\\"18\\\" height=\\\"16\\\" rx=\\\"3.5\\\"/><path d=\\\"m7.5 10 2.5 2-2.5 2M12.5 15h4\\\"/></svg>\",\n customColor: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"m13 7 4 4M14.5 5.5l1.2-1.2a2.3 2.3 0 0 1 3.3 3.3l-1.2 1.2M14 8l-8.3 8.3-.9 3 3-.9L16.1 10\\\"/></svg>\",\n deleteColumn: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><rect x=\\\"3\\\" y=\\\"4\\\" width=\\\"18\\\" height=\\\"16\\\" rx=\\\"3.5\\\"/><path d=\\\"M8.5 4v16M15.5 4v16\\\"/><path d=\\\"M10.4 10.4l3.2 3.2M13.6 10.4l-3.2 3.2\\\"/></svg>\",\n deleteImage: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M4 7h16M6.5 7l.9 11.6A2 2 0 0 0 9.4 20.5h5.2a2 2 0 0 0 2-1.9L17.5 7M9.5 7V5a1.5 1.5 0 0 1 1.5-1.5h2A1.5 1.5 0 0 1 14.5 5v2M10.5 11v5.5M13.5 11v5.5\\\"/></svg>\",\n deleteRow: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><rect x=\\\"3\\\" y=\\\"4\\\" width=\\\"18\\\" height=\\\"16\\\" rx=\\\"3.5\\\"/><path d=\\\"M3 9.2h18M3 14.8h18\\\"/><path d=\\\"M10.4 10.4l3.2 3.2M13.6 10.4l-3.2 3.2\\\"/></svg>\",\n deleteTable: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><rect x=\\\"3\\\" y=\\\"3\\\" width=\\\"13.5\\\" height=\\\"13.5\\\" rx=\\\"3\\\"/><path d=\\\"M3 8h13.5M8 8v8.5\\\"/><path d=\\\"M16.5 16.5l4 4M20.5 16.5l-4 4\\\"/></svg>\",\n downloadImage: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M12 4v11M7.5 10.5 12 15l4.5-4.5M4 15.5v2.5A2 2 0 0 0 6 20h12a2 2 0 0 0 2-2v-2.5\\\"/></svg>\",\n edit: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M4 20h4L18.3 9.7a2.8 2.8 0 0 0-4-4L4 16zM13 7l4 4\\\"/></svg>\",\n heading1: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M3.5 6v12M11.5 6v12M3.5 12h8M16 9.5 19 7.5V18\\\"/></svg>\",\n heading2: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M3.5 6v12M11.5 6v12M3.5 12h8M15.5 9.5a2.6 2.6 0 0 1 5 .9c0 .8-.4 1.5-1 2.1L15.5 18h5\\\"/></svg>\",\n heading3: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M3.5 6v12M11.5 6v12M3.5 12h8M15.5 7.5h4.8l-2.8 3.6a3.4 3.4 0 1 1-2.3 5.6\\\"/></svg>\",\n highlight: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M9 16.5 5.5 13 14.8 3.7a2.5 2.5 0 0 1 3.5 3.5z M5.5 13 3.5 18.5h4L9 16.5 M13 20.5h7.5\\\"/></svg>\",\n highlightColor: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"m14.5 4.5 5 5-7.8 7.8H6.7v-5z M4 20h16\\\"/></svg>\",\n horizontalRule: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M3 12h18\\\"/><path d=\\\"M7 6.5h10M7 17.5h10\\\" stroke-opacity=\\\".35\\\"/></svg>\",\n image: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><rect x=\\\"3\\\" y=\\\"4\\\" width=\\\"18\\\" height=\\\"16\\\" rx=\\\"3.5\\\"/><circle cx=\\\"8.5\\\" cy=\\\"9.5\\\" r=\\\"1.6\\\"/><path d=\\\"m21 15.5-4.8-4.8L6 20\\\"/></svg>\",\n imageUpload: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M12 15V4M7.5 8.5 12 4l4.5 4.5M4 15.5v2.5A2 2 0 0 0 6 20h12a2 2 0 0 0 2-2v-2.5\\\"/></svg>\",\n italic: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M10 5h8M6 19h8M14.5 5l-5 14\\\"/></svg>\",\n link: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M10 14a4 4 0 0 0 5.66 0l3.17-3.17a4 4 0 0 0-5.66-5.66L12 6.34M14 10a4 4 0 0 0-5.66 0l-3.17 3.17a4 4 0 0 0 5.66 5.66L12 17.66\\\"/></svg>\",\n mergeCells: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M12 4v16M3.5 12H9M6.5 9.5 9 12l-2.5 2.5M20.5 12H15M17.5 9.5 15 12l2.5 2.5\\\"/></svg>\",\n openLink: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M14 4h6v6M20 4l-8.5 8.5M18 14v3.5A2.5 2.5 0 0 1 15.5 20h-9A2.5 2.5 0 0 1 4 17.5v-9A2.5 2.5 0 0 1 6.5 6H10\\\"/></svg>\",\n orderedList: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M10.5 6H20M10.5 12H20M10.5 18H20M4 4.5 5.5 3.8V9M3.8 13.4a1.3 1.3 0 0 1 2.5.4c0 .4-.2.7-.5 1L3.8 17h2.6\\\" stroke-width=\\\"1.8\\\"/></svg>\",\n preview: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M2.5 12S6 5.5 12 5.5 21.5 12 21.5 12 18 18.5 12 18.5 2.5 12 2.5 12z\\\"/><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"3\\\"/></svg>\",\n redo: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M15 13.5 19.5 9 15 4.5M19.5 9H9a5 5 0 0 0 0 10h4\\\"/></svg>\",\n resizeLarge: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><rect x=\\\"3\\\" y=\\\"3\\\" width=\\\"18\\\" height=\\\"18\\\" rx=\\\"3.5\\\" stroke-opacity=\\\".35\\\" stroke-dasharray=\\\"3 3\\\"/><rect x=\\\"5.5\\\" y=\\\"5.5\\\" width=\\\"13\\\" height=\\\"13\\\" rx=\\\"2.5\\\"/></svg>\",\n resizeMedium: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><rect x=\\\"3\\\" y=\\\"3\\\" width=\\\"18\\\" height=\\\"18\\\" rx=\\\"3.5\\\" stroke-opacity=\\\".35\\\" stroke-dasharray=\\\"3 3\\\"/><rect x=\\\"7\\\" y=\\\"7\\\" width=\\\"10\\\" height=\\\"10\\\" rx=\\\"2\\\"/></svg>\",\n resizeOriginal: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M4 9V4h5M4 4l5.5 5.5M20 15v5h-5M20 20l-5.5-5.5\\\"/></svg>\",\n resizeSmall: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><rect x=\\\"3\\\" y=\\\"3\\\" width=\\\"18\\\" height=\\\"18\\\" rx=\\\"3.5\\\" stroke-opacity=\\\".35\\\" stroke-dasharray=\\\"3 3\\\"/><rect x=\\\"9\\\" y=\\\"9\\\" width=\\\"6\\\" height=\\\"6\\\" rx=\\\"1.5\\\"/></svg>\",\n splitCell: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M12 4v16M9 12H3.5M6 9.5 3.5 12 6 14.5M15 12h5.5M18 9.5l2.5 2.5-2.5 2.5\\\"/></svg>\",\n strike: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M16.5 7.2C15.8 5.8 14.2 5 12.2 5 9.7 5 8 6.3 8 8.1c0 1.4.9 2.3 2.4 2.9M4 12h16M7.6 16.8c.7 1.4 2.3 2.2 4.4 2.2 2.6 0 4.5-1.3 4.5-3.3 0-.7-.2-1.3-.6-1.7\\\"/></svg>\",\n subscript: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M4 5.5l8 10M12 5.5l-8 10\\\"/><path d=\\\"M15.5 14.7a1.7 1.7 0 0 1 3.2.8c0 .5-.3 1-.7 1.4l-2.5 2.6h3.5\\\" stroke-width=\\\"1.7\\\"/></svg>\",\n superscript: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M4 8.5l8 10M12 8.5l-8 10\\\"/><path d=\\\"M15.5 5.2a1.7 1.7 0 0 1 3.2.8c0 .5-.3 1-.7 1.4L15.5 10h3.5\\\" stroke-width=\\\"1.7\\\"/></svg>\",\n table: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><rect x=\\\"3\\\" y=\\\"4\\\" width=\\\"18\\\" height=\\\"16\\\" rx=\\\"3.5\\\"/><path d=\\\"M3 9.5h18M3 14.8h18M9.5 9.5V20\\\"/></svg>\",\n tableOfContents: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M4 5h11M8 10h12M8 15h12M4 20h11\\\"/></svg>\",\n textColor: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M6.5 16 12 4l5.5 12M8.4 12h7.2M4 20h16\\\"/></svg>\",\n toggleHeaderColumn: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><rect x=\\\"3\\\" y=\\\"4\\\" width=\\\"18\\\" height=\\\"16\\\" rx=\\\"3.5\\\"/><path d=\\\"M9.5 4H6.5A3.5 3.5 0 0 0 3 7.5v9A3.5 3.5 0 0 0 6.5 20h3z\\\" fill=\\\"currentColor\\\"/><path d=\\\"M9.5 12H21M15.2 4v16\\\"/></svg>\",\n toggleHeaderRow: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><rect x=\\\"3\\\" y=\\\"4\\\" width=\\\"18\\\" height=\\\"16\\\" rx=\\\"3.5\\\"/><path d=\\\"M3 9.5V7.5A3.5 3.5 0 0 1 6.5 4h11A3.5 3.5 0 0 1 21 7.5v2z\\\" fill=\\\"currentColor\\\"/><path d=\\\"M9.5 9.5V20M3 14.8h18\\\"/></svg>\",\n underline: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M7 4v6.5a5 5 0 0 0 10 0V4M5 20h14\\\"/></svg>\",\n undo: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M9 13.5 4.5 9 9 4.5M4.5 9H15a5 5 0 0 1 0 10h-4\\\"/></svg>\",\n unsetColor: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M8 5.8C9.2 4.4 10.5 3.5 12 3.5c1.9 2 5.5 5.7 5.5 9.7 0 .8-.1 1.5-.4 2.2M15.8 17.2A5.5 5.5 0 0 1 6.5 13.2c0-1.8.8-3.6 1.8-5.2M4 4l16 16\\\"/></svg>\",\n unsetLink: \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"m13.5 6.5.8-.8a4 4 0 0 1 5.66 5.66l-.8.8M10.5 17.5l-.8.8a4 4 0 0 1-5.66-5.66l.8-.8M4 4l16 16\\\"/></svg>\",\n};\n","import { Editor } from \"@tiptap/core\";\nimport { AteIconKey } from \"../services/ate-icon-registry.service\";\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: AteIconKey;\n command: (editor: Editor) => void | Promise<void>;\n}\n","import { AteTocConfig } from \"../models/ate-toc.model\";\n\n/**\n * Default Table of Contents configuration\n */\nexport const ATE_DEFAULT_TOC_CONFIG: Required<AteTocConfig> = {\n enabled: true,\n floating: true,\n positionMode: \"fixed\",\n position: \"right\",\n variant: \"minimal\",\n hoverExpand: true,\n showTitle: true,\n maxDepth: 6,\n};\n","/*\n * Public API Surface of tiptap-editor\n */\n\n// Main component & Provider\nexport * from \"./lib/components/editor/angular-tiptap-editor.component\";\nexport { AteTableOfContentsComponent } from \"./lib/components/table-of-contents/ate-table-of-contents.component\";\nexport {\n AteTocNodeComponent,\n AteTocNodeOptions,\n getAteTocNodeExtension,\n} from \"./lib/components/table-of-contents/ate-toc-node.component\";\nexport * from \"./lib/ate-editor.provider\";\n\n// Icons\nexport { AteIconComponent } from \"./lib/components/ui/ate-icon.component\";\nexport {\n ATE_DEFAULT_ICONS,\n ATE_MATERIAL_SYMBOLS_VIEWBOX,\n type AteIconName,\n} from \"./lib/icons/ate-default-icons\";\nexport { ATE_STROKE_ICONS } from \"./lib/icons/ate-stroke-icons\";\n\n// Directives\nexport * from \"./lib/directives/ate-noop-value-accessor.directive\";\nexport * from \"./lib/directives/ate-tooltip.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\";\nexport * from \"./lib/services/ate-export.service\";\nexport * from \"./lib/services/ate-editor-registry.service\";\nexport * from \"./lib/services/ate-icon-registry.service\";\nexport * from \"./lib/models/ate-editor-ref\";\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// Extensions\nexport {\n AtePastedImage,\n classifyPastedImageSrc,\n dataUriToFile,\n sanitizePastedImages,\n type AtePastedImageOptions,\n type AtePastedImageSource,\n} from \"./lib/extensions/ate-pasted-image.extension\";\nexport {\n AteLinkShortcut,\n isLinkShortcut,\n type AteLinkShortcutOptions,\n} from \"./lib/extensions/ate-link-shortcut.extension\";\nexport {\n AteBlockShortcuts,\n type AteBlockShortcutsOptions,\n} from \"./lib/extensions/ate-block-shortcuts.extension\";\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-paste.model\";\nexport * from \"./lib/models/ate-bubble-menu.model\";\nexport * from \"./lib/models/ate-editor-config.model\";\nexport * from \"./lib/models/ate-slash-command.model\";\nexport * from \"./lib/models/ate-toc.model\";\n\n// Default configurations\nexport * from \"./lib/config/ate-editor.config\";\nexport * from \"./lib/config/ate-global-config.token\";\nexport * from \"./lib/config/ate-toc.config\";\n\n// Utility functions for slash commands\nexport * from \"./lib/config/ate-slash-commands.config\";\n\n// Translations\nexport type { SupportedLocale } from \"./lib/i18n/ateTranslationsModel\";\n\n// Angular NodeView Integration\nexport { AteAngularNodeView } from \"./lib/node-view/ate-angular-node-view\";\nexport { AteNodeViewRenderer } from \"./lib/node-view/ate-node-view.renderer\";\nexport { createAngularComponentExtension } from \"./lib/node-view/ate-node-view.factory\";\nexport { registerAngularComponent } from \"./lib/node-view/ate-register-angular-component\";\n\n// Node View Types - AteAngularNode is the primary public type\nexport type { AteAngularNode } from \"./lib/models/ate-editor-config.model\";\n// Advanced: Low-level options for full control over node registration\nexport type {\n RegisterAngularComponentOptions,\n AteComponentRenderOptions,\n} from \"./lib/node-view/ate-node-view.models\";\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["Node","i1.AteNoopValueAccessorDirective"],"mappings":"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"}