@flogeez/angular-tiptap-editor 0.3.5 → 0.3.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"flogeez-angular-tiptap-editor.mjs","sources":["../../../projects/angular-tiptap-editor/src/lib/extensions/resizable-image.extension.ts","../../../projects/angular-tiptap-editor/src/lib/extensions/upload-progress.extension.ts","../../../projects/angular-tiptap-editor/src/lib/extensions/table.extension.ts","../../../projects/angular-tiptap-editor/src/lib/tiptap-button.component.ts","../../../projects/angular-tiptap-editor/src/lib/tiptap-bubble-menu.component.ts","../../../projects/angular-tiptap-editor/src/lib/tiptap-separator.component.ts","../../../projects/angular-tiptap-editor/src/lib/services/image.service.ts","../../../projects/angular-tiptap-editor/src/lib/tiptap-image-bubble-menu.component.ts","../../../projects/angular-tiptap-editor/src/lib/services/i18n.service.ts","../../../projects/angular-tiptap-editor/src/lib/services/editor-commands.service.ts","../../../projects/angular-tiptap-editor/src/lib/tiptap-table-bubble-menu.component.ts","../../../projects/angular-tiptap-editor/src/lib/tiptap-cell-bubble-menu.component.ts","../../../projects/angular-tiptap-editor/src/lib/tiptap-toolbar.component.ts","../../../projects/angular-tiptap-editor/src/lib/tiptap-slash-commands.component.ts","../../../projects/angular-tiptap-editor/src/lib/index.ts","../../../projects/angular-tiptap-editor/src/lib/tiptap-image-upload.component.ts","../../../projects/angular-tiptap-editor/src/lib/noop-value-accessor.directive.ts","../../../projects/angular-tiptap-editor/src/lib/config/i18n-slash-commands.ts","../../../projects/angular-tiptap-editor/src/lib/tiptap-editor.component.ts","../../../projects/angular-tiptap-editor/src/public-api.ts","../../../projects/angular-tiptap-editor/src/flogeez-angular-tiptap-editor.ts"],"sourcesContent":["import { Node, mergeAttributes, nodeInputRule } from \"@tiptap/core\";\r\n\r\nexport interface ResizableImageOptions {\r\n inline: boolean;\r\n allowBase64: boolean;\r\n HTMLAttributes: Record<string, any>;\r\n}\r\n\r\ndeclare module \"@tiptap/core\" {\r\n interface Commands<ReturnType> {\r\n resizableImage: {\r\n setResizableImage: (options: {\r\n src: string;\r\n alt?: string;\r\n title?: string;\r\n width?: number;\r\n height?: number;\r\n }) => ReturnType;\r\n updateResizableImage: (options: {\r\n src?: string;\r\n alt?: string;\r\n title?: string;\r\n width?: number;\r\n height?: number;\r\n }) => ReturnType;\r\n };\r\n }\r\n}\r\n\r\nexport const ResizableImage = Node.create<ResizableImageOptions>({\r\n name: \"resizableImage\",\r\n\r\n addOptions() {\r\n return {\r\n inline: false,\r\n allowBase64: false,\r\n HTMLAttributes: {},\r\n };\r\n },\r\n\r\n inline() {\r\n return this.options.inline;\r\n },\r\n\r\n group() {\r\n return this.options.inline ? \"inline\" : \"block\";\r\n },\r\n\r\n draggable: true,\r\n\r\n addAttributes() {\r\n return {\r\n src: {\r\n default: null,\r\n },\r\n alt: {\r\n default: null,\r\n },\r\n title: {\r\n default: null,\r\n },\r\n width: {\r\n default: null,\r\n parseHTML: (element) => {\r\n const width = element.getAttribute(\"width\");\r\n return width ? parseInt(width, 10) : null;\r\n },\r\n renderHTML: (attributes) => {\r\n if (!attributes[\"width\"]) {\r\n return {};\r\n }\r\n return {\r\n width: attributes[\"width\"],\r\n };\r\n },\r\n },\r\n height: {\r\n default: null,\r\n parseHTML: (element) => {\r\n const height = element.getAttribute(\"height\");\r\n return height ? parseInt(height, 10) : null;\r\n },\r\n renderHTML: (attributes) => {\r\n if (!attributes[\"height\"]) {\r\n return {};\r\n }\r\n return {\r\n height: attributes[\"height\"],\r\n };\r\n },\r\n },\r\n };\r\n },\r\n\r\n parseHTML() {\r\n return [\r\n {\r\n tag: \"img[src]\",\r\n },\r\n ];\r\n },\r\n\r\n renderHTML({ HTMLAttributes }) {\r\n return [\r\n \"img\",\r\n mergeAttributes(this.options.HTMLAttributes, HTMLAttributes),\r\n ];\r\n },\r\n\r\n addCommands() {\r\n return {\r\n setResizableImage:\r\n (options) =>\r\n ({ commands }) => {\r\n return commands.insertContent({\r\n type: this.name,\r\n attrs: options,\r\n });\r\n },\r\n updateResizableImage:\r\n (options) =>\r\n ({ commands }) => {\r\n return commands.updateAttributes(this.name, options);\r\n },\r\n };\r\n },\r\n\r\n addInputRules() {\r\n return [\r\n nodeInputRule({\r\n find: /!\\[(.+|:?)]\\((\\S+)(?:(?:\\s+)[\"'](\\S+)[\"'])?\\)/,\r\n type: this.type,\r\n getAttributes: (match) => {\r\n const [, alt, src, title] = match;\r\n return { src, alt, title };\r\n },\r\n }),\r\n ];\r\n },\r\n\r\n addNodeView() {\r\n return ({ node, getPos, editor }) => {\r\n const container = document.createElement(\"div\");\r\n container.className = \"resizable-image-container\";\r\n container.style.position = \"relative\";\r\n container.style.display = \"inline-block\";\r\n\r\n const img = document.createElement(\"img\");\r\n img.src = node.attrs[\"src\"];\r\n img.alt = node.attrs[\"alt\"] || \"\";\r\n img.title = node.attrs[\"title\"] || \"\";\r\n img.className = \"tiptap-image\";\r\n\r\n if (node.attrs[\"width\"]) img.width = node.attrs[\"width\"];\r\n if (node.attrs[\"height\"]) img.height = node.attrs[\"height\"];\r\n\r\n img.parentNode?.insertBefore(container, img);\r\n container.appendChild(img);\r\n\r\n // Ajouter les contrôles de redimensionnement modernes\r\n const resizeControls = document.createElement(\"div\");\r\n resizeControls.className = \"resize-controls\";\r\n resizeControls.style.display = \"none\";\r\n\r\n // Créer les 8 poignées pour un redimensionnement complet\r\n const handles = [\"nw\", \"n\", \"ne\", \"w\", \"e\", \"sw\", \"s\", \"se\"];\r\n handles.forEach((direction) => {\r\n const handle = document.createElement(\"div\");\r\n handle.className = `resize-handle resize-handle-${direction}`;\r\n handle.setAttribute(\"data-direction\", direction);\r\n resizeControls.appendChild(handle);\r\n });\r\n\r\n // Attacher les contrôles au conteneur\r\n container.appendChild(resizeControls);\r\n\r\n // Variables pour le redimensionnement\r\n let isResizing = false;\r\n let startX = 0;\r\n let startY = 0;\r\n let startWidth = 0;\r\n let startHeight = 0;\r\n let aspectRatio = 1;\r\n\r\n // Calculer le ratio d'aspect\r\n img.onload = () => {\r\n aspectRatio = img.naturalWidth / img.naturalHeight;\r\n };\r\n\r\n // Gestion du redimensionnement\r\n const handleMouseDown = (e: MouseEvent, direction: string) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n isResizing = true;\r\n startX = e.clientX;\r\n startY = e.clientY;\r\n\r\n // Utiliser les dimensions actuelles de l'image au lieu des dimensions initiales\r\n startWidth =\r\n parseInt(img.getAttribute(\"width\") || \"0\") ||\r\n node.attrs[\"width\"] ||\r\n img.naturalWidth;\r\n startHeight =\r\n parseInt(img.getAttribute(\"height\") || \"0\") ||\r\n node.attrs[\"height\"] ||\r\n img.naturalHeight;\r\n\r\n // Ajouter la classe de redimensionnement au body\r\n document.body.classList.add(\"resizing\");\r\n\r\n const handleMouseMove = (e: MouseEvent) => {\r\n if (!isResizing) return;\r\n\r\n const deltaX = e.clientX - startX;\r\n const deltaY = e.clientY - startY;\r\n\r\n let newWidth = startWidth;\r\n let newHeight = startHeight;\r\n\r\n // Redimensionnement selon la direction\r\n switch (direction) {\r\n case \"e\":\r\n newWidth = startWidth + deltaX;\r\n newHeight = newWidth / aspectRatio;\r\n break;\r\n case \"w\":\r\n newWidth = startWidth - deltaX;\r\n newHeight = newWidth / aspectRatio;\r\n break;\r\n case \"s\":\r\n newHeight = startHeight + deltaY;\r\n newWidth = newHeight * aspectRatio;\r\n break;\r\n case \"n\":\r\n newHeight = startHeight - deltaY;\r\n newWidth = newHeight * aspectRatio;\r\n break;\r\n case \"se\":\r\n newWidth = startWidth + deltaX;\r\n newHeight = startHeight + deltaY;\r\n break;\r\n case \"sw\":\r\n newWidth = startWidth - deltaX;\r\n newHeight = startHeight + deltaY;\r\n break;\r\n case \"ne\":\r\n newWidth = startWidth + deltaX;\r\n newHeight = startHeight - deltaY;\r\n break;\r\n case \"nw\":\r\n newWidth = startWidth - deltaX;\r\n newHeight = startHeight - deltaY;\r\n break;\r\n }\r\n\r\n // Limites\r\n newWidth = Math.max(50, Math.min(2000, newWidth));\r\n newHeight = Math.max(50, Math.min(2000, newHeight));\r\n\r\n // Mettre à jour directement les attributs de l'image\r\n img.setAttribute(\"width\", Math.round(newWidth).toString());\r\n img.setAttribute(\"height\", Math.round(newHeight).toString());\r\n };\r\n\r\n const handleMouseUp = () => {\r\n isResizing = false;\r\n document.body.classList.remove(\"resizing\");\r\n\r\n // Mettre à jour le nœud Tiptap avec les nouvelles dimensions\r\n if (typeof getPos === \"function\") {\r\n const finalWidth = parseInt(img.getAttribute(\"width\") || \"0\");\r\n const finalHeight = parseInt(img.getAttribute(\"height\") || \"0\");\r\n\r\n if (finalWidth && finalHeight) {\r\n editor.commands.updateAttributes(\"resizableImage\", {\r\n width: finalWidth,\r\n height: finalHeight,\r\n });\r\n }\r\n }\r\n\r\n document.removeEventListener(\"mousemove\", handleMouseMove);\r\n document.removeEventListener(\"mouseup\", handleMouseUp);\r\n };\r\n\r\n document.addEventListener(\"mousemove\", handleMouseMove);\r\n document.addEventListener(\"mouseup\", handleMouseUp);\r\n };\r\n\r\n // Ajouter les événements aux poignées\r\n resizeControls.addEventListener(\"mousedown\", (e) => {\r\n const target = e.target as HTMLElement;\r\n if (target.classList.contains(\"resize-handle\")) {\r\n const direction = target.getAttribute(\"data-direction\");\r\n if (direction) {\r\n handleMouseDown(e, direction);\r\n }\r\n }\r\n });\r\n\r\n // Gestion des événements\r\n img.addEventListener(\"click\", () => {\r\n // Masquer tous les autres contrôles\r\n document.querySelectorAll(\".resize-controls\").forEach((control) => {\r\n (control as HTMLElement).style.display = \"none\";\r\n });\r\n\r\n // Afficher les contrôles de cette image\r\n resizeControls.style.display = \"block\";\r\n img.classList.add(\"selected\");\r\n });\r\n\r\n // Masquer les contrôles quand on clique ailleurs\r\n document.addEventListener(\"click\", (e) => {\r\n const target = e.target as Element;\r\n if (\r\n target &&\r\n !img.contains(target) &&\r\n !resizeControls.contains(target)\r\n ) {\r\n resizeControls.style.display = \"none\";\r\n img.classList.remove(\"selected\");\r\n }\r\n });\r\n\r\n return {\r\n dom: container,\r\n update: (updatedNode) => {\r\n if (updatedNode.type.name !== \"resizableImage\") return false;\r\n\r\n img.src = updatedNode.attrs[\"src\"];\r\n img.alt = updatedNode.attrs[\"alt\"] || \"\";\r\n img.title = updatedNode.attrs[\"title\"] || \"\";\r\n\r\n if (updatedNode.attrs[\"width\"])\r\n img.width = updatedNode.attrs[\"width\"];\r\n if (updatedNode.attrs[\"height\"])\r\n img.height = updatedNode.attrs[\"height\"];\r\n\r\n return true;\r\n },\r\n };\r\n };\r\n },\r\n});\r\n","import { Extension } from \"@tiptap/core\";\r\nimport { Plugin, PluginKey } from \"@tiptap/pm/state\";\r\nimport { Decoration, DecorationSet } from \"@tiptap/pm/view\";\r\n\r\nexport interface UploadProgressOptions {\r\n isUploading: () => boolean;\r\n uploadProgress: () => number;\r\n uploadMessage: () => string;\r\n}\r\n\r\nexport const UploadProgress = Extension.create<UploadProgressOptions>({\r\n name: \"uploadProgress\",\r\n\r\n addOptions() {\r\n return {\r\n isUploading: () => false,\r\n uploadProgress: () => 0,\r\n uploadMessage: () => \"\",\r\n };\r\n },\r\n\r\n addProseMirrorPlugins() {\r\n const options = this.options;\r\n\r\n return [\r\n new Plugin({\r\n key: new PluginKey(\"uploadProgress\"),\r\n state: {\r\n init() {\r\n return {\r\n decorations: DecorationSet.empty,\r\n isUploading: false,\r\n uploadPosition: null as number | null,\r\n };\r\n },\r\n apply: (tr, state) => {\r\n const isUploading = options.isUploading();\r\n\r\n // Si l'upload commence, sauvegarder la position\r\n if (isUploading && !state.isUploading) {\r\n const uploadPosition = tr.selection.from;\r\n const uploadProgress = options.uploadProgress();\r\n const uploadMessage = options.uploadMessage();\r\n\r\n // Créer un élément de progression\r\n const uploadElement = document.createElement(\"div\");\r\n uploadElement.className = \"upload-progress-widget\";\r\n uploadElement.innerHTML = `\r\n <div class=\"upload-skeleton\">\r\n <div class=\"upload-content\">\r\n <div class=\"upload-icon\">\r\n <span class=\"material-symbols-outlined spinning\">image</span>\r\n </div>\r\n <div class=\"upload-info\">\r\n <div class=\"upload-message\">${uploadMessage}</div>\r\n <div class=\"progress-bar\">\r\n <div class=\"progress-fill\" style=\"width: ${uploadProgress}%\"></div>\r\n </div>\r\n <div class=\"progress-text\">${uploadProgress}%</div>\r\n </div>\r\n </div>\r\n </div>\r\n `;\r\n\r\n // Ajouter les styles si pas déjà fait\r\n if (!document.querySelector(\"#upload-progress-styles\")) {\r\n const style = document.createElement(\"style\");\r\n style.id = \"upload-progress-styles\";\r\n style.textContent = `\r\n .upload-progress-widget {\r\n display: block;\r\n margin: 8px 0;\r\n max-width: 400px;\r\n }\r\n .upload-skeleton {\r\n background: #f8f9fa;\r\n border: 2px dashed #e2e8f0;\r\n border-radius: 8px;\r\n padding: 16px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n min-height: 120px;\r\n animation: pulse 2s infinite;\r\n }\r\n @keyframes pulse {\r\n 0%, 100% { background-color: #f8f9fa; }\r\n 50% { background-color: #f1f5f9; }\r\n }\r\n .upload-content {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n gap: 12px;\r\n text-align: center;\r\n }\r\n .upload-icon {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 48px;\r\n height: 48px;\r\n background: #e6f3ff;\r\n border-radius: 50%;\r\n color: #3182ce;\r\n }\r\n .upload-icon .material-symbols-outlined {\r\n font-size: 24px;\r\n }\r\n .spinning {\r\n animation: spin 1s linear infinite;\r\n }\r\n @keyframes spin {\r\n from { transform: rotate(0deg); }\r\n to { transform: rotate(360deg); }\r\n }\r\n .upload-info {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 8px;\r\n width: 100%;\r\n max-width: 200px;\r\n }\r\n .upload-message {\r\n font-size: 14px;\r\n color: #4a5568;\r\n font-weight: 500;\r\n }\r\n .progress-bar {\r\n width: 100%;\r\n height: 6px;\r\n background: #e2e8f0;\r\n border-radius: 3px;\r\n overflow: hidden;\r\n }\r\n .progress-fill {\r\n height: 100%;\r\n background: linear-gradient(90deg, #3182ce, #4299e1);\r\n border-radius: 3px;\r\n transition: width 0.3s ease;\r\n }\r\n .progress-text {\r\n font-size: 12px;\r\n color: #718096;\r\n font-weight: 500;\r\n }\r\n `;\r\n document.head.appendChild(style);\r\n }\r\n\r\n // Créer une décoration widget à la position sauvegardée\r\n const decoration = Decoration.widget(\r\n uploadPosition,\r\n uploadElement,\r\n {\r\n side: 1,\r\n key: \"upload-progress\",\r\n }\r\n );\r\n\r\n return {\r\n decorations: DecorationSet.create(tr.doc, [decoration]),\r\n isUploading: true,\r\n uploadPosition,\r\n };\r\n }\r\n\r\n // Si l'upload continue, mettre à jour le contenu\r\n if (\r\n isUploading &&\r\n state.isUploading &&\r\n state.uploadPosition !== null\r\n ) {\r\n const uploadProgress = options.uploadProgress();\r\n const uploadMessage = options.uploadMessage();\r\n\r\n // Mettre à jour le contenu de l'élément existant\r\n const existingElement = document.querySelector(\r\n \".upload-progress-widget\"\r\n );\r\n if (existingElement) {\r\n existingElement.innerHTML = `\r\n <div class=\"upload-skeleton\">\r\n <div class=\"upload-content\">\r\n <div class=\"upload-icon\">\r\n <span class=\"material-symbols-outlined spinning\">image</span>\r\n </div>\r\n <div class=\"upload-info\">\r\n <div class=\"upload-message\">${uploadMessage}</div>\r\n <div class=\"progress-bar\">\r\n <div class=\"progress-fill\" style=\"width: ${uploadProgress}%\"></div>\r\n </div>\r\n <div class=\"progress-text\">${uploadProgress}%</div>\r\n </div>\r\n </div>\r\n </div>\r\n `;\r\n }\r\n\r\n return state; // Garder les décorations existantes\r\n }\r\n\r\n // Si l'upload se termine, supprimer les décorations\r\n if (!isUploading && state.isUploading) {\r\n return {\r\n decorations: DecorationSet.empty,\r\n isUploading: false,\r\n uploadPosition: null,\r\n };\r\n }\r\n\r\n return state;\r\n },\r\n },\r\n props: {\r\n decorations(state) {\r\n const pluginState = this.getState(state);\r\n return pluginState ? pluginState.decorations : DecorationSet.empty;\r\n },\r\n },\r\n }),\r\n ];\r\n },\r\n});\r\n","import { Extension } from \"@tiptap/core\";\r\nimport Table from \"@tiptap/extension-table\";\r\nimport TableRow from \"@tiptap/extension-table-row\";\r\nimport TableCell from \"@tiptap/extension-table-cell\";\r\nimport TableHeader from \"@tiptap/extension-table-header\";\r\n\r\nexport const TableExtension = Extension.create({\r\n name: \"tableExtension\",\r\n\r\n addExtensions() {\r\n return [\r\n Table.configure({\r\n resizable: true,\r\n handleWidth: 5,\r\n cellMinWidth: 100,\r\n }),\r\n TableRow,\r\n TableHeader.configure({\r\n HTMLAttributes: {\r\n class: \"table-header\",\r\n },\r\n }),\r\n TableCell.configure({\r\n HTMLAttributes: {\r\n class: \"table-cell\",\r\n },\r\n }),\r\n ];\r\n },\r\n});\r\n","import { Component, input, output } from \"@angular/core\";\r\n\r\nexport interface TiptapButtonConfig {\r\n icon: string;\r\n title: string;\r\n active?: boolean;\r\n disabled?: boolean;\r\n variant?: \"default\" | \"text\" | \"danger\";\r\n size?: \"small\" | \"medium\" | \"large\";\r\n iconSize?: \"small\" | \"medium\" | \"large\";\r\n}\r\n\r\n@Component({\r\n selector: \"tiptap-button\",\r\n standalone: true,\r\n template: `\r\n <button\r\n class=\"tiptap-button\"\r\n [class.is-active]=\"active()\"\r\n [class.is-disabled]=\"disabled()\"\r\n [class.text-button]=\"variant() === 'text'\"\r\n [class.danger]=\"variant() === 'danger'\"\r\n [class.small]=\"size() === 'small'\"\r\n [class.medium]=\"size() === 'medium'\"\r\n [class.large]=\"size() === 'large'\"\r\n [disabled]=\"disabled()\"\r\n [attr.title]=\"title()\"\r\n (mousedown)=\"onMouseDown($event)\"\r\n (click)=\"onClick.emit($event)\"\r\n type=\"button\"\r\n >\r\n <span\r\n class=\"material-symbols-outlined\"\r\n [class.icon-small]=\"iconSize() === 'small'\"\r\n [class.icon-medium]=\"iconSize() === 'medium'\"\r\n [class.icon-large]=\"iconSize() === 'large'\"\r\n >{{ icon() }}</span\r\n >\r\n <ng-content></ng-content>\r\n </button>\r\n `,\r\n styles: [\r\n `\r\n /* Styles de base pour les boutons Tiptap */\r\n .tiptap-button {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 32px;\r\n height: 32px;\r\n border: none;\r\n background: transparent;\r\n border-radius: 8px;\r\n cursor: pointer;\r\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\r\n color: #64748b;\r\n position: relative;\r\n overflow: hidden;\r\n }\r\n\r\n .tiptap-button::before {\r\n content: \"\";\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n bottom: 0;\r\n background: linear-gradient(135deg, #6366f1, #8b5cf6);\r\n opacity: 0;\r\n transition: opacity 0.2s ease;\r\n border-radius: 8px;\r\n }\r\n\r\n .tiptap-button:hover {\r\n color: #6366f1;\r\n transform: translateY(-1px);\r\n }\r\n\r\n .tiptap-button:hover::before {\r\n opacity: 0.1;\r\n }\r\n\r\n .tiptap-button:active {\r\n transform: translateY(0);\r\n }\r\n\r\n .tiptap-button.is-active {\r\n color: #6366f1;\r\n background: rgba(99, 102, 241, 0.1);\r\n }\r\n\r\n .tiptap-button.is-active::before {\r\n opacity: 0.15;\r\n }\r\n\r\n .tiptap-button.is-active:hover {\r\n background: rgba(99, 102, 241, 0.15);\r\n }\r\n\r\n .tiptap-button:disabled {\r\n opacity: 0.5;\r\n cursor: not-allowed;\r\n pointer-events: none;\r\n }\r\n\r\n .tiptap-button:disabled:hover {\r\n transform: none;\r\n color: #64748b;\r\n }\r\n\r\n .tiptap-button:disabled::before {\r\n opacity: 0;\r\n }\r\n\r\n /* Icônes Material Symbols */\r\n .tiptap-button .material-symbols-outlined {\r\n font-size: 20px;\r\n position: relative;\r\n z-index: 1;\r\n }\r\n\r\n .tiptap-button .material-symbols-outlined.icon-small {\r\n font-size: 16px;\r\n }\r\n\r\n .tiptap-button .material-symbols-outlined.icon-medium {\r\n font-size: 20px;\r\n }\r\n\r\n .tiptap-button .material-symbols-outlined.icon-large {\r\n font-size: 24px;\r\n }\r\n\r\n /* Boutons avec texte */\r\n .tiptap-button.text-button {\r\n width: auto;\r\n padding: 0 12px;\r\n font-size: 14px;\r\n font-weight: 500;\r\n }\r\n\r\n /* Boutons de couleur */\r\n .tiptap-button.color-button {\r\n width: 28px;\r\n height: 28px;\r\n border-radius: 50%;\r\n border: 2px solid transparent;\r\n transition: all 0.2s ease;\r\n }\r\n\r\n .tiptap-button.color-button:hover {\r\n border-color: #e2e8f0;\r\n transform: scale(1.1);\r\n }\r\n\r\n .tiptap-button.color-button.is-active {\r\n border-color: #6366f1;\r\n box-shadow: 0 0 0 2px rgba(99, 102, 241, 0.2);\r\n }\r\n\r\n /* Boutons avec variantes */\r\n .tiptap-button.primary {\r\n background: linear-gradient(135deg, #6366f1, #8b5cf6);\r\n color: white;\r\n }\r\n\r\n .tiptap-button.primary:hover {\r\n background: linear-gradient(135deg, #5b21b6, #7c3aed);\r\n color: white;\r\n }\r\n\r\n .tiptap-button.secondary {\r\n background: #f1f5f9;\r\n color: #64748b;\r\n }\r\n\r\n .tiptap-button.secondary:hover {\r\n background: #e2e8f0;\r\n color: #475569;\r\n }\r\n\r\n .tiptap-button.danger {\r\n color: #ef4444;\r\n }\r\n\r\n .tiptap-button.danger:hover {\r\n color: #dc2626;\r\n background: rgba(239, 68, 68, 0.1);\r\n }\r\n\r\n .tiptap-button.danger::before {\r\n background: linear-gradient(135deg, #ef4444, #dc2626);\r\n }\r\n\r\n /* Boutons de taille différente */\r\n .tiptap-button.small {\r\n width: 24px;\r\n height: 24px;\r\n }\r\n\r\n .tiptap-button.medium {\r\n width: 32px;\r\n height: 32px;\r\n }\r\n\r\n .tiptap-button.large {\r\n width: 40px;\r\n height: 40px;\r\n }\r\n\r\n /* Boutons avec badge */\r\n .tiptap-button.has-badge {\r\n position: relative;\r\n }\r\n\r\n .tiptap-button .badge {\r\n position: absolute;\r\n top: -4px;\r\n right: -4px;\r\n background: #ef4444;\r\n color: white;\r\n font-size: 10px;\r\n padding: 2px 4px;\r\n border-radius: 8px;\r\n min-width: 16px;\r\n text-align: center;\r\n line-height: 1;\r\n }\r\n\r\n /* Boutons avec tooltip */\r\n .tiptap-button.has-tooltip {\r\n position: relative;\r\n }\r\n\r\n .tiptap-button .tooltip {\r\n position: absolute;\r\n bottom: -30px;\r\n left: 50%;\r\n transform: translateX(-50%);\r\n background: rgba(0, 0, 0, 0.8);\r\n color: white;\r\n padding: 4px 8px;\r\n border-radius: 4px;\r\n font-size: 12px;\r\n white-space: nowrap;\r\n opacity: 0;\r\n visibility: hidden;\r\n transition: all 0.2s ease;\r\n z-index: 1000;\r\n }\r\n\r\n .tiptap-button:hover .tooltip {\r\n opacity: 1;\r\n visibility: visible;\r\n }\r\n\r\n /* Animation de pulsation pour les boutons actifs */\r\n @keyframes pulse {\r\n 0%,\r\n 100% {\r\n box-shadow: 0 0 0 0 rgba(99, 102, 241, 0.4);\r\n }\r\n 50% {\r\n box-shadow: 0 0 0 4px rgba(99, 102, 241, 0);\r\n }\r\n }\r\n\r\n .tiptap-button.is-active.pulse {\r\n animation: pulse 2s infinite;\r\n }\r\n\r\n /* Responsive */\r\n @media (max-width: 768px) {\r\n .tiptap-button {\r\n width: 32px;\r\n height: 32px;\r\n }\r\n\r\n .tiptap-button .material-symbols-outlined {\r\n font-size: 18px;\r\n }\r\n\r\n .tiptap-button.text-button {\r\n padding: 0 8px;\r\n font-size: 13px;\r\n }\r\n }\r\n `,\r\n ],\r\n})\r\nexport class TiptapButtonComponent {\r\n // Inputs\r\n icon = input.required<string>();\r\n title = input.required<string>();\r\n active = input(false);\r\n disabled = input(false);\r\n variant = input<\"default\" | \"text\" | \"danger\">(\"default\");\r\n size = input<\"small\" | \"medium\" | \"large\">(\"medium\");\r\n iconSize = input<\"small\" | \"medium\" | \"large\">(\"medium\");\r\n\r\n // Outputs\r\n onClick = output<Event>();\r\n\r\n onMouseDown(event: MouseEvent) {\r\n event.preventDefault();\r\n }\r\n}\r\n","import {\n Component,\n input,\n ViewChild,\n ElementRef,\n OnInit,\n OnDestroy,\n effect,\n signal,\n computed,\n} from \"@angular/core\";\nimport tippy, { Instance as TippyInstance } from \"tippy.js\";\nimport type { Editor } from \"@tiptap/core\";\nimport { CellSelection } from \"@tiptap/pm/tables\";\nimport { TiptapButtonComponent } from \"./tiptap-button.component\";\n\nexport interface BubbleMenuConfig {\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 separator?: boolean;\n}\n\n@Component({\n selector: \"tiptap-bubble-menu\",\n standalone: true,\n imports: [TiptapButtonComponent],\n template: `\n <div #menuRef class=\"bubble-menu\">\n @if (bubbleMenuConfig().bold) {\n <tiptap-button\n icon=\"format_bold\"\n title=\"Gras\"\n [active]=\"isActive('bold')\"\n (click)=\"onCommand('bold', $event)\"\n ></tiptap-button>\n } @if (bubbleMenuConfig().italic) {\n <tiptap-button\n icon=\"format_italic\"\n title=\"Italique\"\n [active]=\"isActive('italic')\"\n (click)=\"onCommand('italic', $event)\"\n ></tiptap-button>\n } @if (bubbleMenuConfig().underline) {\n <tiptap-button\n icon=\"format_underlined\"\n title=\"Souligné\"\n [active]=\"isActive('underline')\"\n (click)=\"onCommand('underline', $event)\"\n ></tiptap-button>\n } @if (bubbleMenuConfig().strike) {\n <tiptap-button\n icon=\"strikethrough_s\"\n title=\"Barré\"\n [active]=\"isActive('strike')\"\n (click)=\"onCommand('strike', $event)\"\n ></tiptap-button>\n } @if (bubbleMenuConfig().superscript) {\n <tiptap-button\n icon=\"superscript\"\n title=\"Exposant\"\n [active]=\"isActive('superscript')\"\n (click)=\"onCommand('superscript', $event)\"\n ></tiptap-button>\n } @if (bubbleMenuConfig().subscript) {\n <tiptap-button\n icon=\"subscript\"\n title=\"Indice\"\n [active]=\"isActive('subscript')\"\n (click)=\"onCommand('subscript', $event)\"\n ></tiptap-button>\n } @if (bubbleMenuConfig().highlight) {\n <tiptap-button\n icon=\"highlight\"\n title=\"Surbrillance\"\n [active]=\"isActive('highlight')\"\n (click)=\"onCommand('highlight', $event)\"\n ></tiptap-button>\n } @if (bubbleMenuConfig().separator && (bubbleMenuConfig().code ||\n bubbleMenuConfig().link)) {\n <div class=\"tiptap-separator\"></div>\n } @if (bubbleMenuConfig().code) {\n <tiptap-button\n icon=\"code\"\n title=\"Code\"\n [active]=\"isActive('code')\"\n (click)=\"onCommand('code', $event)\"\n ></tiptap-button>\n } @if (bubbleMenuConfig().link) {\n <tiptap-button\n icon=\"link\"\n title=\"Lien\"\n [active]=\"isActive('link')\"\n (click)=\"onCommand('link', $event)\"\n ></tiptap-button>\n }\n </div>\n `,\n styles: [],\n})\nexport class TiptapBubbleMenuComponent implements OnInit, OnDestroy {\n editor = input.required<Editor>();\n config = input<BubbleMenuConfig>({\n bold: true,\n italic: true,\n underline: true,\n strike: true,\n code: true,\n superscript: false,\n subscript: false,\n highlight: true,\n link: true,\n separator: true,\n });\n\n @ViewChild(\"menuRef\", { static: false }) menuRef!: ElementRef<HTMLDivElement>;\n\n private tippyInstance: TippyInstance | null = null;\n private updateTimeout: any = null;\n\n bubbleMenuConfig = computed(() => ({\n bold: true,\n italic: true,\n underline: true,\n strike: true,\n code: true,\n superscript: false,\n subscript: false,\n highlight: true,\n link: true,\n separator: true,\n ...this.config(),\n }));\n\n // Effect comme propriété de classe pour éviter l'erreur d'injection context\n constructor() {\n effect(() => {\n const ed = this.editor();\n if (!ed) return;\n\n // Nettoyer les anciens 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 // Ajouter les nouveaux 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 // Ne pas appeler updateMenu() ici pour éviter l'affichage prématuré\n // Il sera appelé automatiquement quand l'éditeur sera prêt\n });\n }\n\n ngOnInit() {\n // Initialiser Tippy de manière synchrone après que le component soit ready\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 // Nettoyer les timeouts\n if (this.updateTimeout) {\n clearTimeout(this.updateTimeout);\n }\n\n // Nettoyer Tippy\n if (this.tippyInstance) {\n this.tippyInstance.destroy();\n this.tippyInstance = null;\n }\n }\n\n private initTippy() {\n // Attendre que l'élément soit disponible\n if (!this.menuRef?.nativeElement) {\n setTimeout(() => this.initTippy(), 50);\n return;\n }\n\n const menuElement = this.menuRef.nativeElement;\n\n // S'assurer qu'il n'y a pas déjà une instance\n if (this.tippyInstance) {\n this.tippyInstance.destroy();\n }\n\n // Créer l'instance Tippy\n this.tippyInstance = tippy(document.body, {\n content: menuElement,\n trigger: \"manual\",\n placement: \"top-start\",\n appendTo: () => document.body,\n interactive: true,\n arrow: false,\n offset: [0, 8],\n hideOnClick: false,\n onShow: (instance) => {\n // S'assurer que les autres menus sont fermés\n this.hideOtherMenus();\n },\n getReferenceClientRect: () => this.getSelectionRect(),\n // Améliorer le positionnement avec scroll\n popperOptions: {\n modifiers: [\n {\n name: \"preventOverflow\",\n options: {\n boundary: \"viewport\",\n padding: 8,\n },\n },\n {\n name: \"flip\",\n options: {\n fallbackPlacements: [\"bottom-start\", \"top-end\", \"bottom-end\"],\n },\n },\n ],\n },\n });\n\n // Maintenant que Tippy est initialisé, faire un premier check\n this.updateMenu();\n }\n\n private getSelectionRect(): DOMRect {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) {\n return new DOMRect(0, 0, 0, 0);\n }\n\n const range = selection.getRangeAt(0);\n return range.getBoundingClientRect();\n }\n\n updateMenu = () => {\n // Debounce pour éviter les appels trop fréquents\n if (this.updateTimeout) {\n clearTimeout(this.updateTimeout);\n }\n\n this.updateTimeout = setTimeout(() => {\n const ed = this.editor();\n if (!ed) return;\n\n const { selection } = ed.state;\n const { from, to } = selection;\n const hasTextSelection =\n from !== to && !(selection instanceof CellSelection);\n const isImageSelected =\n ed.isActive(\"image\") || ed.isActive(\"resizableImage\");\n const isTableCellSelected =\n ed.isActive(\"tableCell\") || ed.isActive(\"tableHeader\");\n const hasCellSelection = selection instanceof CellSelection;\n\n // Ne montrer le menu texte que si :\n // - Il y a une sélection de texte (pas une sélection de cellules multiples)\n // - Aucune image n'est sélectionnée (priorité aux images)\n // - Ce n'est pas une sélection de cellules multiples (CellSelection)\n // - L'éditeur est éditable\n // Note: Le texte dans une cellule est autorisé (isTableCellSelected peut être true)\n const shouldShow =\n hasTextSelection &&\n !isImageSelected &&\n !hasCellSelection &&\n ed.isEditable;\n\n if (shouldShow) {\n this.showTippy();\n } else {\n this.hideTippy();\n }\n }, 10);\n };\n\n handleBlur = () => {\n // Masquer le menu quand l'éditeur perd le focus\n setTimeout(() => {\n this.hideTippy();\n }, 100);\n };\n\n private hideOtherMenus() {\n // Cette méthode peut être étendue pour fermer d'autres menus si nécessaire\n // Pour l'instant, elle sert de placeholder pour une future coordination entre menus\n }\n\n private showTippy() {\n if (!this.tippyInstance) return;\n\n // Mettre à jour la position\n this.tippyInstance.setProps({\n getReferenceClientRect: () => this.getSelectionRect(),\n });\n\n this.tippyInstance.show();\n }\n\n hideTippy() {\n if (this.tippyInstance) {\n this.tippyInstance.hide();\n }\n }\n\n isActive(mark: string): boolean {\n const ed = this.editor();\n return ed?.isActive(mark) || false;\n }\n\n onCommand(command: string, event: MouseEvent) {\n event.preventDefault();\n const ed = this.editor();\n if (!ed) return;\n\n switch (command) {\n case \"bold\":\n ed.chain().focus().toggleBold().run();\n break;\n case \"italic\":\n ed.chain().focus().toggleItalic().run();\n break;\n case \"underline\":\n ed.chain().focus().toggleUnderline().run();\n break;\n case \"strike\":\n ed.chain().focus().toggleStrike().run();\n break;\n case \"code\":\n ed.chain().focus().toggleCode().run();\n break;\n case \"superscript\":\n ed.chain().focus().toggleSuperscript().run();\n break;\n case \"subscript\":\n ed.chain().focus().toggleSubscript().run();\n break;\n case \"highlight\":\n ed.chain().focus().toggleHighlight().run();\n break;\n case \"link\":\n const href = window.prompt(\"URL du lien:\");\n if (href) {\n ed.chain().focus().toggleLink({ href }).run();\n }\n break;\n }\n }\n}\n","import { Component, input } from \"@angular/core\";\n\n@Component({\n selector: \"tiptap-separator\",\n standalone: true,\n template: `\n <div\n class=\"tiptap-separator\"\n [class.vertical]=\"orientation() === 'vertical'\"\n [class.horizontal]=\"orientation() === 'horizontal'\"\n [class.small]=\"size() === 'small'\"\n [class.medium]=\"size() === 'medium'\"\n [class.large]=\"size() === 'large'\"\n ></div>\n `,\n styles: [\n `\n .tiptap-separator {\n background-color: #e2e8f0;\n margin: 0;\n }\n\n .tiptap-separator.vertical {\n width: 1px;\n height: 24px;\n margin: 0 8px;\n }\n\n .tiptap-separator.horizontal {\n height: 1px;\n width: 100%;\n margin: 8px 0;\n }\n\n .tiptap-separator.small.vertical {\n height: 16px;\n margin: 0 4px;\n }\n\n .tiptap-separator.small.horizontal {\n margin: 4px 0;\n }\n\n .tiptap-separator.medium.vertical {\n height: 24px;\n margin: 0 8px;\n }\n\n .tiptap-separator.medium.horizontal {\n margin: 8px 0;\n }\n\n .tiptap-separator.large.vertical {\n height: 32px;\n margin: 0 12px;\n }\n\n .tiptap-separator.large.horizontal {\n margin: 12px 0;\n }\n `,\n ],\n})\nexport class TiptapSeparatorComponent {\n orientation = input<\"vertical\" | \"horizontal\">(\"vertical\");\n size = input<\"small\" | \"medium\" | \"large\">(\"medium\");\n}\n","import { Injectable, signal, computed } from \"@angular/core\";\r\nimport { Editor } from \"@tiptap/core\";\r\n\r\nexport interface ImageData {\r\n src: string;\r\n alt?: string;\r\n title?: string;\r\n width?: number;\r\n height?: number;\r\n}\r\n\r\nexport interface ImageUploadResult {\r\n src: string;\r\n name: string;\r\n size: number;\r\n type: string;\r\n width?: number;\r\n height?: number;\r\n originalSize?: number;\r\n}\r\n\r\nexport interface ResizeOptions {\r\n width?: number;\r\n height?: number;\r\n maintainAspectRatio?: boolean;\r\n}\r\n\r\n@Injectable({\r\n providedIn: \"root\",\r\n})\r\nexport class ImageService {\r\n // Signals pour l'état des images\r\n selectedImage = signal<ImageData | null>(null);\r\n isImageSelected = computed(() => this.selectedImage() !== null);\r\n isResizing = signal(false);\r\n\r\n // Signaux pour l'upload\r\n isUploading = signal(false);\r\n uploadProgress = signal(0);\r\n uploadMessage = signal(\"\");\r\n\r\n // Référence à l'éditeur pour les mises à jour\r\n private currentEditor: Editor | null = null;\r\n\r\n // Méthodes pour la gestion des images\r\n selectImage(editor: Editor): void {\r\n if (editor.isActive(\"resizableImage\")) {\r\n const attrs = editor.getAttributes(\"resizableImage\");\r\n this.selectedImage.set({\r\n src: attrs[\"src\"],\r\n alt: attrs[\"alt\"],\r\n title: attrs[\"title\"],\r\n width: attrs[\"width\"],\r\n height: attrs[\"height\"],\r\n });\r\n } else {\r\n this.selectedImage.set(null);\r\n }\r\n }\r\n\r\n clearSelection(): void {\r\n this.selectedImage.set(null);\r\n }\r\n\r\n // Méthodes pour manipuler les images\r\n insertImage(editor: Editor, imageData: ImageData): void {\r\n editor.chain().focus().setResizableImage(imageData).run();\r\n }\r\n\r\n updateImageAttributes(editor: Editor, attributes: Partial<ImageData>): void {\r\n if (editor.isActive(\"resizableImage\")) {\r\n editor\r\n .chain()\r\n .focus()\r\n .updateAttributes(\"resizableImage\", attributes)\r\n .run();\r\n this.updateSelectedImage(attributes);\r\n }\r\n }\r\n\r\n // Nouvelles méthodes pour le redimensionnement\r\n resizeImage(editor: Editor, options: ResizeOptions): void {\r\n if (!editor.isActive(\"resizableImage\")) return;\r\n\r\n const currentAttrs = editor.getAttributes(\"resizableImage\");\r\n let newWidth = options.width;\r\n let newHeight = options.height;\r\n\r\n // Maintenir le ratio d'aspect si demandé\r\n if (\r\n options.maintainAspectRatio !== false &&\r\n currentAttrs[\"width\"] &&\r\n currentAttrs[\"height\"]\r\n ) {\r\n const aspectRatio = currentAttrs[\"width\"] / currentAttrs[\"height\"];\r\n\r\n if (newWidth && !newHeight) {\r\n newHeight = Math.round(newWidth / aspectRatio);\r\n } else if (newHeight && !newWidth) {\r\n newWidth = Math.round(newHeight * aspectRatio);\r\n }\r\n }\r\n\r\n // Appliquer des limites minimales\r\n if (newWidth) newWidth = Math.max(50, newWidth);\r\n if (newHeight) newHeight = Math.max(50, newHeight);\r\n\r\n this.updateImageAttributes(editor, {\r\n width: newWidth,\r\n height: newHeight,\r\n });\r\n }\r\n\r\n // Méthodes pour redimensionner par pourcentage\r\n resizeImageByPercentage(editor: Editor, percentage: number): void {\r\n if (!editor.isActive(\"resizableImage\")) return;\r\n\r\n const currentAttrs = editor.getAttributes(\"resizableImage\");\r\n if (!currentAttrs[\"width\"] || !currentAttrs[\"height\"]) return;\r\n\r\n const newWidth = Math.round(currentAttrs[\"width\"] * (percentage / 100));\r\n const newHeight = Math.round(currentAttrs[\"height\"] * (percentage / 100));\r\n\r\n this.resizeImage(editor, { width: newWidth, height: newHeight });\r\n }\r\n\r\n // Méthodes pour redimensionner à des tailles prédéfinies\r\n resizeImageToSmall(editor: Editor): void {\r\n this.resizeImage(editor, {\r\n width: 300,\r\n height: 200,\r\n maintainAspectRatio: true,\r\n });\r\n }\r\n\r\n resizeImageToMedium(editor: Editor): void {\r\n this.resizeImage(editor, {\r\n width: 500,\r\n height: 350,\r\n maintainAspectRatio: true,\r\n });\r\n }\r\n\r\n resizeImageToLarge(editor: Editor): void {\r\n this.resizeImage(editor, {\r\n width: 800,\r\n height: 600,\r\n maintainAspectRatio: true,\r\n });\r\n }\r\n\r\n resizeImageToOriginal(editor: Editor): void {\r\n if (!editor.isActive(\"resizableImage\")) return;\r\n\r\n const img = new Image();\r\n img.onload = () => {\r\n this.resizeImage(editor, {\r\n width: img.naturalWidth,\r\n height: img.naturalHeight,\r\n });\r\n };\r\n img.src = editor.getAttributes(\"resizableImage\")[\"src\"];\r\n }\r\n\r\n // Méthode pour redimensionner librement (sans maintenir le ratio)\r\n resizeImageFreely(editor: Editor, width: number, height: number): void {\r\n this.resizeImage(editor, {\r\n width,\r\n height,\r\n maintainAspectRatio: false,\r\n });\r\n }\r\n\r\n // Méthode pour obtenir les dimensions actuelles de l'image\r\n getImageDimensions(editor: Editor): { width: number; height: number } | null {\r\n if (!editor.isActive(\"resizableImage\")) return null;\r\n\r\n const attrs = editor.getAttributes(\"resizableImage\");\r\n return {\r\n width: attrs[\"width\"] || 0,\r\n height: attrs[\"height\"] || 0,\r\n };\r\n }\r\n\r\n // Méthode pour obtenir les dimensions naturelles de l'image\r\n getNaturalImageDimensions(\r\n src: string\r\n ): Promise<{ width: number; height: number }> {\r\n return new Promise((resolve, reject) => {\r\n const img = new Image();\r\n img.onload = () => {\r\n resolve({ width: img.naturalWidth, height: img.naturalHeight });\r\n };\r\n img.onerror = () => {\r\n reject(new Error(\"Impossible de charger l'image\"));\r\n };\r\n img.src = src;\r\n });\r\n }\r\n\r\n deleteImage(editor: Editor): void {\r\n if (editor.isActive(\"resizableImage\")) {\r\n editor.chain().focus().deleteSelection().run();\r\n this.clearSelection();\r\n }\r\n }\r\n\r\n // Méthodes utilitaires\r\n private updateSelectedImage(attributes: Partial<ImageData>): void {\r\n const current = this.selectedImage();\r\n if (current) {\r\n this.selectedImage.set({ ...current, ...attributes });\r\n }\r\n }\r\n\r\n // Validation des images\r\n validateImage(\r\n file: File,\r\n maxSize: number = 5 * 1024 * 1024\r\n ): { valid: boolean; error?: string } {\r\n if (!file.type.startsWith(\"image/\")) {\r\n return { valid: false, error: \"Le fichier doit être une image\" };\r\n }\r\n\r\n if (file.size > maxSize) {\r\n return {\r\n valid: false,\r\n error: `L'image est trop volumineuse (max ${maxSize / 1024 / 1024}MB)`,\r\n };\r\n }\r\n\r\n return { valid: true };\r\n }\r\n\r\n // Compression d'image\r\n async compressImage(\r\n file: File,\r\n quality: number = 0.8,\r\n maxWidth: number = 1920,\r\n maxHeight: number = 1080\r\n ): Promise<ImageUploadResult> {\r\n return new Promise((resolve, reject) => {\r\n const canvas = document.createElement(\"canvas\");\r\n const ctx = canvas.getContext(\"2d\");\r\n const img = new Image();\r\n\r\n img.onload = () => {\r\n // Mise à jour du progrès\r\n if (this.isUploading()) {\r\n this.uploadProgress.set(40);\r\n this.uploadMessage.set(\"Redimensionnement...\");\r\n this.forceEditorUpdate();\r\n }\r\n\r\n let { width, height } = img;\r\n\r\n // Redimensionner si nécessaire\r\n if (width > maxWidth || height > maxHeight) {\r\n const ratio = Math.min(maxWidth / width, maxHeight / height);\r\n width *= ratio;\r\n height *= ratio;\r\n }\r\n\r\n canvas.width = width;\r\n canvas.height = height;\r\n\r\n // Dessiner l'image redimensionnée\r\n ctx?.drawImage(img, 0, 0, width, height);\r\n\r\n // Mise à jour du progrès\r\n if (this.isUploading()) {\r\n this.uploadProgress.set(60);\r\n this.uploadMessage.set(\"Compression...\");\r\n this.forceEditorUpdate();\r\n }\r\n\r\n // Convertir en base64 avec compression\r\n canvas.toBlob(\r\n (blob) => {\r\n if (blob) {\r\n const reader = new FileReader();\r\n reader.onload = (e) => {\r\n const base64 = e.target?.result as string;\r\n if (base64) {\r\n const result: ImageUploadResult = {\r\n src: base64,\r\n name: file.name,\r\n size: blob.size,\r\n type: file.type,\r\n width: Math.round(width),\r\n height: Math.round(height),\r\n originalSize: file.size,\r\n };\r\n resolve(result);\r\n } else {\r\n reject(new Error(\"Erreur lors de la compression\"));\r\n }\r\n };\r\n reader.readAsDataURL(blob);\r\n } else {\r\n reject(new Error(\"Erreur lors de la compression\"));\r\n }\r\n },\r\n file.type,\r\n quality\r\n );\r\n };\r\n\r\n img.onerror = () =>\r\n reject(new Error(\"Erreur lors du chargement de l'image\"));\r\n img.src = URL.createObjectURL(file);\r\n });\r\n }\r\n\r\n // Méthode privée générique pour uploader avec progression\r\n private async uploadImageWithProgress(\r\n editor: Editor,\r\n file: File,\r\n insertionStrategy: (editor: Editor, result: ImageUploadResult) => void,\r\n actionMessage: string,\r\n options?: {\r\n quality?: number;\r\n maxWidth?: number;\r\n maxHeight?: number;\r\n }\r\n ): Promise<void> {\r\n try {\r\n // Stocker la référence à l'éditeur\r\n this.currentEditor = editor;\r\n\r\n this.isUploading.set(true);\r\n this.uploadProgress.set(0);\r\n this.uploadMessage.set(\"Validation du fichier...\");\r\n this.forceEditorUpdate();\r\n\r\n // Validation\r\n const validation = this.validateImage(file);\r\n if (!validation.valid) {\r\n throw new Error(validation.error);\r\n }\r\n\r\n this.uploadProgress.set(20);\r\n this.uploadMessage.set(\"Compression en cours...\");\r\n this.forceEditorUpdate();\r\n\r\n // Petit délai pour permettre à l'utilisateur de voir la progression\r\n await new Promise((resolve) => setTimeout(resolve, 200));\r\n\r\n const result = await this.compressImage(\r\n file,\r\n options?.quality || 0.8,\r\n options?.maxWidth || 1920,\r\n options?.maxHeight || 1080\r\n );\r\n\r\n this.uploadProgress.set(80);\r\n this.uploadMessage.set(actionMessage);\r\n this.forceEditorUpdate();\r\n\r\n // Petit délai pour l'action\r\n await new Promise((resolve) => setTimeout(resolve, 100));\r\n\r\n // Exécuter la stratégie d'insertion\r\n insertionStrategy(editor, result);\r\n\r\n // L'action est terminée, maintenant on peut cacher l'indicateur\r\n this.isUploading.set(false);\r\n this.uploadProgress.set(0);\r\n this.uploadMessage.set(\"\");\r\n this.forceEditorUpdate();\r\n this.currentEditor = null;\r\n } catch (error) {\r\n this.isUploading.set(false);\r\n this.uploadProgress.set(0);\r\n this.uploadMessage.set(\"\");\r\n this.forceEditorUpdate();\r\n this.currentEditor = null;\r\n console.error(\"Erreur lors de l'upload d'image:\", error);\r\n throw error;\r\n }\r\n }\r\n\r\n // Méthode unifiée pour uploader et insérer une image\r\n async uploadAndInsertImage(\r\n editor: Editor,\r\n file: File,\r\n options?: {\r\n quality?: number;\r\n maxWidth?: number;\r\n maxHeight?: number;\r\n }\r\n ): Promise<void> {\r\n return this.uploadImageWithProgress(\r\n editor,\r\n file,\r\n (editor, result) => {\r\n this.insertImage(editor, {\r\n src: result.src,\r\n alt: result.name,\r\n title: `${result.name} (${result.width}×${result.height})`,\r\n width: result.width,\r\n height: result.height,\r\n });\r\n },\r\n \"Insertion dans l'éditeur...\",\r\n options\r\n );\r\n }\r\n\r\n // Méthode pour forcer la mise à jour de l'éditeur\r\n private forceEditorUpdate() {\r\n if (this.currentEditor) {\r\n // Déclencher une transaction vide pour forcer la mise à jour des décorations\r\n const { tr } = this.currentEditor.state;\r\n this.currentEditor.view.dispatch(tr);\r\n }\r\n }\r\n\r\n // Méthode privée générique pour créer un sélecteur de fichier\r\n private async selectFileAndProcess(\r\n editor: Editor,\r\n uploadMethod: (editor: Editor, file: File, options?: any) => Promise<void>,\r\n options?: {\r\n quality?: number;\r\n maxWidth?: number;\r\n maxHeight?: number;\r\n accept?: string;\r\n }\r\n ): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n const input = document.createElement(\"input\");\r\n input.type = \"file\";\r\n input.accept = options?.accept || \"image/*\";\r\n input.style.display = \"none\";\r\n\r\n input.addEventListener(\"change\", async (e) => {\r\n const file = (e.target as HTMLInputElement).files?.[0];\r\n if (file && file.type.startsWith(\"image/\")) {\r\n try {\r\n await uploadMethod(editor, file, options);\r\n resolve();\r\n } catch (error) {\r\n reject(error);\r\n }\r\n } else {\r\n reject(new Error(\"Aucun fichier image sélectionné\"));\r\n }\r\n document.body.removeChild(input);\r\n });\r\n\r\n input.addEventListener(\"cancel\", () => {\r\n document.body.removeChild(input);\r\n reject(new Error(\"Sélection annulée\"));\r\n });\r\n\r\n document.body.appendChild(input);\r\n input.click();\r\n });\r\n }\r\n\r\n // Méthode pour créer un sélecteur de fichier et uploader une image\r\n async selectAndUploadImage(\r\n editor: Editor,\r\n options?: {\r\n quality?: number;\r\n maxWidth?: number;\r\n maxHeight?: number;\r\n accept?: string;\r\n }\r\n ): Promise<void> {\r\n return this.selectFileAndProcess(\r\n editor,\r\n this.uploadAndInsertImage.bind(this),\r\n options\r\n );\r\n }\r\n\r\n // Méthode pour sélectionner et remplacer une image existante\r\n async selectAndReplaceImage(\r\n editor: Editor,\r\n options?: {\r\n quality?: number;\r\n maxWidth?: number;\r\n maxHeight?: number;\r\n accept?: string;\r\n }\r\n ): Promise<void> {\r\n return this.selectFileAndProcess(\r\n editor,\r\n this.uploadAndReplaceImage.bind(this),\r\n options\r\n );\r\n }\r\n\r\n // Méthode pour remplacer une image existante avec indicateur de progression\r\n async uploadAndReplaceImage(\r\n editor: Editor,\r\n file: File,\r\n options?: {\r\n quality?: number;\r\n maxWidth?: number;\r\n maxHeight?: number;\r\n }\r\n ): Promise<void> {\r\n // Sauvegarder les attributs de l'image actuelle pour restauration en cas d'échec\r\n const currentImageAttrs = editor.getAttributes(\"resizableImage\");\r\n const backupImage = { ...currentImageAttrs };\r\n\r\n try {\r\n // Supprimer visuellement l'ancienne image immédiatement\r\n editor.chain().focus().deleteSelection().run();\r\n\r\n // Stocker la référence à l'éditeur\r\n this.currentEditor = editor;\r\n\r\n this.isUploading.set(true);\r\n this.uploadProgress.set(0);\r\n this.uploadMessage.set(\"Validation du fichier...\");\r\n this.forceEditorUpdate();\r\n\r\n // Validation\r\n const validation = this.validateImage(file);\r\n if (!validation.valid) {\r\n throw new Error(validation.error);\r\n }\r\n\r\n this.uploadProgress.set(20);\r\n this.uploadMessage.set(\"Compression en cours...\");\r\n this.forceEditorUpdate();\r\n\r\n // Petit délai pour permettre à l'utilisateur de voir la progression\r\n await new Promise((resolve) => setTimeout(resolve, 200));\r\n\r\n const result = await this.compressImage(\r\n file,\r\n options?.quality || 0.8,\r\n options?.maxWidth || 1920,\r\n options?.maxHeight || 1080\r\n );\r\n\r\n this.uploadProgress.set(80);\r\n this.uploadMessage.set(\"Remplacement de l'image...\");\r\n this.forceEditorUpdate();\r\n\r\n // Petit délai pour le remplacement\r\n await new Promise((resolve) => setTimeout(resolve, 100));\r\n\r\n // Insérer la nouvelle image à la position actuelle\r\n this.insertImage(editor, {\r\n src: result.src,\r\n alt: result.name,\r\n title: `${result.name} (${result.width}×${result.height})`,\r\n width: result.width,\r\n height: result.height,\r\n });\r\n\r\n // L'image est remplacée, maintenant on peut cacher l'indicateur\r\n this.isUploading.set(false);\r\n this.uploadProgress.set(0);\r\n this.uploadMessage.set(\"\");\r\n this.forceEditorUpdate();\r\n this.currentEditor = null;\r\n } catch (error) {\r\n // En cas d'erreur, restaurer l'image originale\r\n if (backupImage[\"src\"]) {\r\n this.insertImage(editor, {\r\n src: backupImage[\"src\"] as string,\r\n alt: backupImage[\"alt\"] as string,\r\n title: backupImage[\"title\"] as string,\r\n width: backupImage[\"width\"] as number,\r\n height: backupImage[\"height\"] as number,\r\n });\r\n }\r\n\r\n this.isUploading.set(false);\r\n this.uploadProgress.set(0);\r\n this.uploadMessage.set(\"\");\r\n this.forceEditorUpdate();\r\n this.currentEditor = null;\r\n console.error(\"Erreur lors du remplacement d'image:\", error);\r\n throw error;\r\n }\r\n }\r\n}\r\n","import {\r\n Component,\r\n input,\r\n ViewChild,\r\n ElementRef,\r\n OnInit,\r\n OnDestroy,\r\n computed,\r\n inject,\r\n effect,\r\n} from \"@angular/core\";\r\nimport tippy, { Instance as TippyInstance } from \"tippy.js\";\r\nimport type { Editor } from \"@tiptap/core\";\r\nimport { TiptapButtonComponent } from \"./tiptap-button.component\";\r\nimport { TiptapSeparatorComponent } from \"./tiptap-separator.component\";\r\nimport { ImageService } from \"./services/image.service\";\r\nimport { ImageBubbleMenuConfig } from \"./models/bubble-menu.model\";\r\n\r\n@Component({\r\n selector: \"tiptap-image-bubble-menu\",\r\n standalone: true,\r\n imports: [TiptapButtonComponent, TiptapSeparatorComponent],\r\n template: `\r\n <div #menuRef class=\"bubble-menu\">\r\n @if (imageBubbleMenuConfig().changeImage) {\r\n <tiptap-button\r\n icon=\"drive_file_rename_outline\"\r\n title=\"Changer l'image\"\r\n (click)=\"onCommand('changeImage', $event)\"\r\n ></tiptap-button>\r\n } @if (imageBubbleMenuConfig().separator && hasResizeButtons()) {\r\n <tiptap-separator></tiptap-separator>\r\n } @if (imageBubbleMenuConfig().resizeSmall) {\r\n <tiptap-button\r\n icon=\"crop_square\"\r\n iconSize=\"small\"\r\n title=\"Petite (300×200)\"\r\n (click)=\"onCommand('resizeSmall', $event)\"\r\n ></tiptap-button>\r\n } @if (imageBubbleMenuConfig().resizeMedium) {\r\n <tiptap-button\r\n icon=\"crop_square\"\r\n iconSize=\"medium\"\r\n title=\"Moyenne (500×350)\"\r\n (click)=\"onCommand('resizeMedium', $event)\"\r\n ></tiptap-button>\r\n } @if (imageBubbleMenuConfig().resizeLarge) {\r\n <tiptap-button\r\n icon=\"crop_square\"\r\n iconSize=\"large\"\r\n title=\"Grande (800×600)\"\r\n (click)=\"onCommand('resizeLarge', $event)\"\r\n ></tiptap-button>\r\n } @if (imageBubbleMenuConfig().resizeOriginal) {\r\n <tiptap-button\r\n icon=\"photo_size_select_actual\"\r\n title=\"Taille originale\"\r\n (click)=\"onCommand('resizeOriginal', $event)\"\r\n ></tiptap-button>\r\n } @if (imageBubbleMenuConfig().separator &&\r\n imageBubbleMenuConfig().deleteImage) {\r\n <tiptap-separator></tiptap-separator>\r\n } @if (imageBubbleMenuConfig().deleteImage) {\r\n <tiptap-button\r\n icon=\"delete\"\r\n title=\"Supprimer l'image\"\r\n variant=\"danger\"\r\n (click)=\"onCommand('deleteImage', $event)\"\r\n ></tiptap-button>\r\n }\r\n </div>\r\n `,\r\n styles: [],\r\n})\r\nexport class TiptapImageBubbleMenuComponent implements OnInit, OnDestroy {\r\n editor = input.required<Editor>();\r\n config = input<ImageBubbleMenuConfig>({\r\n changeImage: true,\r\n resizeSmall: true,\r\n resizeMedium: true,\r\n resizeLarge: true,\r\n resizeOriginal: true,\r\n deleteImage: true,\r\n separator: true,\r\n });\r\n\r\n @ViewChild(\"menuRef\", { static: false }) menuRef!: ElementRef<HTMLDivElement>;\r\n\r\n private tippyInstance: TippyInstance | null = null;\r\n private imageService = inject(ImageService);\r\n private updateTimeout: any = null;\r\n\r\n imageBubbleMenuConfig = computed(() => ({\r\n changeImage: true,\r\n resizeSmall: true,\r\n resizeMedium: true,\r\n resizeLarge: true,\r\n resizeOriginal: true,\r\n deleteImage: true,\r\n separator: true,\r\n ...this.config(),\r\n }));\r\n\r\n hasResizeButtons = computed(() => {\r\n const config = this.imageBubbleMenuConfig();\r\n return (\r\n config.resizeSmall ||\r\n config.resizeMedium ||\r\n config.resizeLarge ||\r\n config.resizeOriginal\r\n );\r\n });\r\n\r\n constructor() {\r\n effect(() => {\r\n const ed = this.editor();\r\n if (!ed) return;\r\n\r\n // Nettoyer les anciens listeners\r\n ed.off(\"selectionUpdate\", this.updateMenu);\r\n ed.off(\"transaction\", this.updateMenu);\r\n ed.off(\"focus\", this.updateMenu);\r\n ed.off(\"blur\", this.handleBlur);\r\n\r\n // Ajouter les nouveaux listeners\r\n ed.on(\"selectionUpdate\", this.updateMenu);\r\n ed.on(\"transaction\", this.updateMenu);\r\n ed.on(\"focus\", this.updateMenu);\r\n ed.on(\"blur\", this.handleBlur);\r\n\r\n // Ne pas appeler updateMenu() ici pour éviter l'affichage prématuré\r\n // Il sera appelé automatiquement quand l'éditeur sera prêt\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n // Initialiser Tippy de manière synchrone après que le component soit ready\r\n this.initTippy();\r\n }\r\n\r\n ngOnDestroy() {\r\n const ed = this.editor();\r\n if (ed) {\r\n ed.off(\"selectionUpdate\", this.updateMenu);\r\n ed.off(\"transaction\", this.updateMenu);\r\n ed.off(\"focus\", this.updateMenu);\r\n ed.off(\"blur\", this.handleBlur);\r\n }\r\n\r\n // Nettoyer les timeouts\r\n if (this.updateTimeout) {\r\n clearTimeout(this.updateTimeout);\r\n }\r\n\r\n // Nettoyer Tippy\r\n if (this.tippyInstance) {\r\n this.tippyInstance.destroy();\r\n this.tippyInstance = null;\r\n }\r\n }\r\n\r\n private initTippy() {\r\n // Attendre que l'élément soit disponible\r\n if (!this.menuRef?.nativeElement) {\r\n setTimeout(() => this.initTippy(), 50);\r\n return;\r\n }\r\n\r\n const menuElement = this.menuRef.nativeElement;\r\n\r\n // S'assurer qu'il n'y a pas déjà une instance\r\n if (this.tippyInstance) {\r\n this.tippyInstance.destroy();\r\n }\r\n\r\n // Créer l'instance Tippy\r\n this.tippyInstance = tippy(document.body, {\r\n content: menuElement,\r\n trigger: \"manual\",\r\n placement: \"top-start\",\r\n appendTo: () => document.body,\r\n interactive: true,\r\n arrow: false,\r\n offset: [0, 8],\r\n hideOnClick: false,\r\n onShow: (instance) => {\r\n // S'assurer que les autres menus sont fermés\r\n this.hideOtherMenus();\r\n },\r\n getReferenceClientRect: () => this.getImageRect(),\r\n // Améliorer le positionnement avec scroll\r\n popperOptions: {\r\n modifiers: [\r\n {\r\n name: \"preventOverflow\",\r\n options: {\r\n boundary: \"viewport\",\r\n padding: 8,\r\n },\r\n },\r\n {\r\n name: \"flip\",\r\n options: {\r\n fallbackPlacements: [\"bottom-start\", \"top-end\", \"bottom-end\"],\r\n },\r\n },\r\n ],\r\n },\r\n });\r\n\r\n // Maintenant que Tippy est initialisé, faire un premier check\r\n this.updateMenu();\r\n }\r\n\r\n private getImageRect(): DOMRect {\r\n const ed = this.editor();\r\n if (!ed) return new DOMRect(0, 0, 0, 0);\r\n\r\n // Trouver l'image sélectionnée dans le DOM\r\n const { from } = ed.state.selection;\r\n\r\n // Fonction pour trouver toutes les images dans l'éditeur\r\n const getAllImages = (): HTMLImageElement[] => {\r\n const editorElement = ed.view.dom;\r\n return Array.from(editorElement.querySelectorAll(\"img\"));\r\n };\r\n\r\n // Fonction pour trouver l'image à la position spécifique\r\n const findImageAtPosition = (): HTMLImageElement | null => {\r\n const allImages = getAllImages();\r\n\r\n for (const img of allImages) {\r\n try {\r\n // Obtenir la position ProseMirror de cette image\r\n const imgPos = ed.view.posAtDOM(img, 0);\r\n // Vérifier si cette image correspond à la position sélectionnée\r\n if (Math.abs(imgPos - from) <= 1) {\r\n return img;\r\n }\r\n } catch (error) {\r\n // Continuer si on ne peut pas obtenir la position de cette image\r\n continue;\r\n }\r\n }\r\n\r\n return null;\r\n };\r\n\r\n // Chercher l'image à la position exacte\r\n const imageElement = findImageAtPosition();\r\n\r\n if (imageElement) {\r\n return imageElement.getBoundingClientRect();\r\n }\r\n\r\n return new DOMRect(0, 0, 0, 0);\r\n }\r\n\r\n updateMenu = () => {\r\n // Debounce pour éviter les appels trop fréquents\r\n if (this.updateTimeout) {\r\n clearTimeout(this.updateTimeout);\r\n }\r\n\r\n this.updateTimeout = setTimeout(() => {\r\n const ed = this.editor();\r\n if (!ed) return;\r\n\r\n const isImageSelected =\r\n ed.isActive(\"resizableImage\") || ed.isActive(\"image\");\r\n const { from, to } = ed.state.selection;\r\n const hasTextSelection = from !== to;\r\n\r\n // Ne montrer le menu image que si :\r\n // - Une image est sélectionnée\r\n // - L'éditeur est éditable\r\n const shouldShow = isImageSelected && ed.isEditable;\r\n\r\n if (shouldShow) {\r\n this.showTippy();\r\n } else {\r\n this.hideTippy();\r\n }\r\n }, 10);\r\n };\r\n\r\n handleBlur = () => {\r\n // Masquer le menu quand l'éditeur perd le focus\r\n setTimeout(() => {\r\n this.hideTippy();\r\n }, 100);\r\n };\r\n\r\n private hideOtherMenus() {\r\n // Cette méthode peut être étendue pour fermer d'autres menus si nécessaire\r\n // Pour l'instant, elle sert de placeholder pour une future coordination entre menus\r\n }\r\n\r\n private showTippy() {\r\n if (!this.tippyInstance) return;\r\n\r\n // Mettre à jour la position\r\n this.tippyInstance.setProps({\r\n getReferenceClientRect: () => this.getImageRect(),\r\n });\r\n\r\n this.tippyInstance.show();\r\n }\r\n\r\n private hideTippy() {\r\n if (this.tippyInstance) {\r\n this.tippyInstance.hide();\r\n }\r\n }\r\n\r\n onCommand(command: string, event: MouseEvent) {\r\n event.preventDefault();\r\n const ed = this.editor();\r\n if (!ed) return;\r\n\r\n switch (command) {\r\n case \"changeImage\":\r\n this.changeImage();\r\n break;\r\n case \"resizeSmall\":\r\n this.imageService.resizeImageToSmall(ed);\r\n break;\r\n case \"resizeMedium\":\r\n this.imageService.resizeImageToMedium(ed);\r\n break;\r\n case \"resizeLarge\":\r\n this.imageService.resizeImageToLarge(ed);\r\n break;\r\n case \"resizeOriginal\":\r\n this.imageService.resizeImageToOriginal(ed);\r\n break;\r\n case \"deleteImage\":\r\n this.deleteImage();\r\n break;\r\n }\r\n }\r\n\r\n private async changeImage() {\r\n const ed = this.editor();\r\n if (!ed) return;\r\n\r\n try {\r\n // Utiliser la méthode spécifique pour remplacer une image existante\r\n await this.imageService.selectAndReplaceImage(ed, {\r\n quality: 0.8,\r\n maxWidth: 1920,\r\n maxHeight: 1080,\r\n accept: \"image/*\",\r\n });\r\n } catch (error) {\r\n console.error(\"Erreur lors du changement d'image:\", error);\r\n }\r\n }\r\n\r\n private deleteImage() {\r\n const ed = this.editor();\r\n if (ed) {\r\n ed.chain().focus().deleteSelection().run();\r\n }\r\n }\r\n}\r\n","import { Injectable, signal, computed } from \"@angular/core\";\r\n\r\nexport type SupportedLocale = \"en\" | \"fr\";\r\n\r\nexport interface TiptapTranslations {\r\n // Toolbar\r\n toolbar: {\r\n bold: string;\r\n italic: string;\r\n underline: string;\r\n strike: string;\r\n code: string;\r\n superscript: string;\r\n subscript: string;\r\n highlight: string;\r\n heading1: string;\r\n heading2: string;\r\n heading3: string;\r\n bulletList: string;\r\n orderedList: string;\r\n blockquote: string;\r\n alignLeft: string;\r\n alignCenter: string;\r\n alignRight: string;\r\n alignJustify: string;\r\n link: string;\r\n image: string;\r\n horizontalRule: string;\r\n table: string;\r\n undo: string;\r\n redo: string;\r\n clear: string;\r\n };\r\n\r\n // Bubble Menu\r\n bubbleMenu: {\r\n bold: string;\r\n italic: string;\r\n underline: string;\r\n strike: string;\r\n code: string;\r\n superscript: string;\r\n subscript: string;\r\n highlight: string;\r\n link: string;\r\n addLink: string;\r\n editLink: string;\r\n removeLink: string;\r\n linkUrl: string;\r\n linkText: string;\r\n openLink: string;\r\n };\r\n\r\n // Slash Commands\r\n slashCommands: {\r\n heading1: {\r\n title: string;\r\n description: string;\r\n keywords: string[];\r\n };\r\n heading2: {\r\n title: string;\r\n description: string;\r\n keywords: string[];\r\n };\r\n heading3: {\r\n title: string;\r\n description: string;\r\n keywords: string[];\r\n };\r\n bulletList: {\r\n title: string;\r\n description: string;\r\n keywords: string[];\r\n };\r\n orderedList: {\r\n title: string;\r\n description: string;\r\n keywords: string[];\r\n };\r\n blockquote: {\r\n title: string;\r\n description: string;\r\n keywords: string[];\r\n };\r\n code: {\r\n title: string;\r\n description: string;\r\n keywords: string[];\r\n };\r\n image: {\r\n title: string;\r\n description: string;\r\n keywords: string[];\r\n };\r\n horizontalRule: {\r\n title: string;\r\n description: string;\r\n keywords: string[];\r\n };\r\n table: {\r\n title: string;\r\n description: string;\r\n keywords: string[];\r\n };\r\n };\r\n\r\n // Table Actions\r\n table: {\r\n addRowBefore: string;\r\n addRowAfter: string;\r\n deleteRow: string;\r\n addColumnBefore: string;\r\n addColumnAfter: string;\r\n deleteColumn: string;\r\n deleteTable: string;\r\n toggleHeaderRow: string;\r\n toggleHeaderColumn: string;\r\n mergeCells: string;\r\n splitCell: string;\r\n };\r\n\r\n // Image Upload\r\n imageUpload: {\r\n selectImage: string;\r\n uploadingImage: string;\r\n uploadProgress: string;\r\n uploadError: string;\r\n uploadSuccess: string;\r\n imageTooLarge: string;\r\n invalidFileType: string;\r\n dragDropText: string;\r\n changeImage: string;\r\n deleteImage: string;\r\n resizeSmall: string;\r\n resizeMedium: string;\r\n resizeLarge: string;\r\n resizeOriginal: string;\r\n };\r\n\r\n // Editor\r\n editor: {\r\n placeholder: string;\r\n character: string;\r\n word: string;\r\n imageLoadError: string;\r\n linkPrompt: string;\r\n linkUrlPrompt: string;\r\n confirmDelete: string;\r\n };\r\n\r\n // Common\r\n common: {\r\n cancel: string;\r\n confirm: string;\r\n apply: string;\r\n delete: string;\r\n save: string;\r\n close: string;\r\n loading: string;\r\n error: string;\r\n success: string;\r\n };\r\n}\r\n\r\nconst ENGLISH_TRANSLATIONS: TiptapTranslations = {\r\n toolbar: {\r\n bold: \"Bold\",\r\n italic: \"Italic\",\r\n underline: \"Underline\",\r\n strike: \"Strikethrough\",\r\n code: \"Code\",\r\n superscript: \"Superscript\",\r\n subscript: \"Subscript\",\r\n highlight: \"Highlight\",\r\n heading1: \"Heading 1\",\r\n heading2: \"Heading 2\",\r\n heading3: \"Heading 3\",\r\n bulletList: \"Bullet List\",\r\n orderedList: \"Ordered List\",\r\n blockquote: \"Blockquote\",\r\n alignLeft: \"Align Left\",\r\n alignCenter: \"Align Center\",\r\n alignRight: \"Align Right\",\r\n alignJustify: \"Align Justify\",\r\n link: \"Add Link\",\r\n image: \"Add Image\",\r\n horizontalRule: \"Horizontal Rule\",\r\n table: \"Insert Table\",\r\n undo: \"Undo\",\r\n redo: \"Redo\",\r\n clear: \"Clear\",\r\n },\r\n bubbleMenu: {\r\n bold: \"Bold\",\r\n italic: \"Italic\",\r\n underline: \"Underline\",\r\n strike: \"Strikethrough\",\r\n code: \"Code\",\r\n superscript: \"Superscript\",\r\n subscript: \"Subscript\",\r\n highlight: \"Highlight\",\r\n link: \"Link\",\r\n addLink: \"Add Link\",\r\n editLink: \"Edit Link\",\r\n removeLink: \"Remove Link\",\r\n linkUrl: \"Link URL\",\r\n linkText: \"Link Text\",\r\n openLink: \"Open Link\",\r\n },\r\n slashCommands: {\r\n heading1: {\r\n title: \"Heading 1\",\r\n description: \"Large section heading\",\r\n keywords: [\"heading\", \"h1\", \"title\", \"1\", \"header\"],\r\n },\r\n heading2: {\r\n title: \"Heading 2\",\r\n description: \"Medium section heading\",\r\n keywords: [\"heading\", \"h2\", \"title\", \"2\", \"header\"],\r\n },\r\n heading3: {\r\n title: \"Heading 3\",\r\n description: \"Small section heading\",\r\n keywords: [\"heading\", \"h3\", \"title\", \"3\", \"header\"],\r\n },\r\n bulletList: {\r\n title: \"Bullet List\",\r\n description: \"Create a bullet list\",\r\n keywords: [\"bullet\", \"list\", \"ul\", \"unordered\"],\r\n },\r\n orderedList: {\r\n title: \"Ordered List\",\r\n description: \"Create an ordered list\",\r\n keywords: [\"ordered\", \"list\", \"ol\", \"numbered\"],\r\n },\r\n blockquote: {\r\n title: \"Blockquote\",\r\n description: \"Add a blockquote\",\r\n keywords: [\"quote\", \"blockquote\", \"citation\"],\r\n },\r\n code: {\r\n title: \"Code Block\",\r\n description: \"Add a code block\",\r\n keywords: [\"code\", \"codeblock\", \"pre\", \"programming\"],\r\n },\r\n image: {\r\n title: \"Image\",\r\n description: \"Insert an image\",\r\n keywords: [\"image\", \"photo\", \"picture\", \"img\"],\r\n },\r\n horizontalRule: {\r\n title: \"Horizontal Rule\",\r\n description: \"Add a horizontal line\",\r\n keywords: [\"hr\", \"horizontal\", \"rule\", \"line\", \"separator\"],\r\n },\r\n table: {\r\n title: \"Table\",\r\n description: \"Insert a table\",\r\n keywords: [\"table\", \"grid\", \"data\", \"rows\", \"columns\"],\r\n },\r\n },\r\n table: {\r\n addRowBefore: \"Add row before\",\r\n addRowAfter: \"Add row after\",\r\n deleteRow: \"Delete row\",\r\n addColumnBefore: \"Add column before\",\r\n addColumnAfter: \"Add column after\",\r\n deleteColumn: \"Delete column\",\r\n deleteTable: \"Delete table\",\r\n toggleHeaderRow: \"Toggle header row\",\r\n toggleHeaderColumn: \"Toggle header column\",\r\n mergeCells: \"Merge cells\",\r\n splitCell: \"Split cell\",\r\n },\r\n imageUpload: {\r\n selectImage: \"Select Image\",\r\n uploadingImage: \"Uploading image...\",\r\n uploadProgress: \"Upload Progress\",\r\n uploadError: \"Upload Error\",\r\n uploadSuccess: \"Upload Success\",\r\n imageTooLarge: \"Image too large\",\r\n invalidFileType: \"Invalid file type\",\r\n dragDropText: \"Drag and drop images here\",\r\n changeImage: \"Change Image\",\r\n deleteImage: \"Delete Image\",\r\n resizeSmall: \"Small\",\r\n resizeMedium: \"Medium\",\r\n resizeLarge: \"Large\",\r\n resizeOriginal: \"Original\",\r\n },\r\n editor: {\r\n placeholder: \"Start typing...\",\r\n character: \"character\",\r\n word: \"word\",\r\n imageLoadError: \"Error loading image\",\r\n linkPrompt: \"Enter link URL\",\r\n linkUrlPrompt: \"Enter URL\",\r\n confirmDelete: \"Are you sure you want to delete this?\",\r\n },\r\n common: {\r\n cancel: \"Cancel\",\r\n confirm: \"Confirm\",\r\n apply: \"Apply\",\r\n delete: \"Delete\",\r\n save: \"Save\",\r\n close: \"Close\",\r\n loading: \"Loading\",\r\n error: \"Error\",\r\n success: \"Success\",\r\n },\r\n};\r\n\r\nconst FRENCH_TRANSLATIONS: TiptapTranslations = {\r\n toolbar: {\r\n bold: \"Gras\",\r\n italic: \"Italique\",\r\n underline: \"Souligné\",\r\n strike: \"Barré\",\r\n code: \"Code\",\r\n superscript: \"Exposant\",\r\n subscript: \"Indice\",\r\n highlight: \"Surligner\",\r\n heading1: \"Titre 1\",\r\n heading2: \"Titre 2\",\r\n heading3: \"Titre 3\",\r\n bulletList: \"Liste à puces\",\r\n orderedList: \"Liste numérotée\",\r\n blockquote: \"Citation\",\r\n alignLeft: \"Aligner à gauche\",\r\n alignCenter: \"Centrer\",\r\n alignRight: \"Aligner à droite\",\r\n alignJustify: \"Justifier\",\r\n link: \"Ajouter un lien\",\r\n image: \"Ajouter une image\",\r\n horizontalRule: \"Ligne horizontale\",\r\n table: \"Insérer un tableau\",\r\n undo: \"Annuler\",\r\n redo: \"Refaire\",\r\n clear: \"Vider\",\r\n },\r\n bubbleMenu: {\r\n bold: \"Gras\",\r\n italic: \"Italique\",\r\n underline: \"Souligné\",\r\n strike: \"Barré\",\r\n code: \"Code\",\r\n superscript: \"Exposant\",\r\n subscript: \"Indice\",\r\n highlight: \"Surligner\",\r\n link: \"Lien\",\r\n addLink: \"Ajouter un lien\",\r\n editLink: \"Modifier le lien\",\r\n removeLink: \"Supprimer le lien\",\r\n linkUrl: \"URL du lien\",\r\n linkText: \"Texte du lien\",\r\n openLink: \"Ouvrir le lien\",\r\n },\r\n slashCommands: {\r\n heading1: {\r\n title: \"Titre 1\",\r\n description: \"Grand titre de section\",\r\n keywords: [\"heading\", \"h1\", \"titre\", \"title\", \"1\", \"header\"],\r\n },\r\n heading2: {\r\n title: \"Titre 2\",\r\n description: \"Titre de sous-section\",\r\n keywords: [\"heading\", \"h2\", \"titre\", \"title\", \"2\", \"header\"],\r\n },\r\n heading3: {\r\n title: \"Titre 3\",\r\n description: \"Petit titre\",\r\n keywords: [\"heading\", \"h3\", \"titre\", \"title\", \"3\", \"header\"],\r\n },\r\n bulletList: {\r\n title: \"Liste à puces\",\r\n description: \"Créer une liste à puces\",\r\n keywords: [\"bullet\", \"list\", \"liste\", \"puces\", \"ul\"],\r\n },\r\n orderedList: {\r\n title: \"Liste numérotée\",\r\n description: \"Créer une liste numérotée\",\r\n keywords: [\"numbered\", \"list\", \"liste\", \"numérotée\", \"ol\", \"ordered\"],\r\n },\r\n blockquote: {\r\n title: \"Citation\",\r\n description: \"Ajouter une citation\",\r\n keywords: [\"quote\", \"blockquote\", \"citation\"],\r\n },\r\n code: {\r\n title: \"Bloc de code\",\r\n description: \"Ajouter un bloc de code\",\r\n keywords: [\"code\", \"codeblock\", \"pre\", \"programmation\"],\r\n },\r\n image: {\r\n title: \"Image\",\r\n description: \"Insérer une image\",\r\n keywords: [\"image\", \"photo\", \"picture\", \"img\"],\r\n },\r\n horizontalRule: {\r\n title: \"Ligne horizontale\",\r\n description: \"Ajouter une ligne de séparation\",\r\n keywords: [\"hr\", \"horizontal\", \"rule\", \"ligne\", \"séparation\"],\r\n },\r\n table: {\r\n title: \"Tableau\",\r\n description: \"Insérer un tableau\",\r\n keywords: [\r\n \"table\",\r\n \"tableau\",\r\n \"grid\",\r\n \"grille\",\r\n \"data\",\r\n \"données\",\r\n \"rows\",\r\n \"colonnes\",\r\n ],\r\n },\r\n },\r\n table: {\r\n addRowBefore: \"Ajouter une ligne avant\",\r\n addRowAfter: \"Ajouter une ligne après\",\r\n deleteRow: \"Supprimer la ligne\",\r\n addColumnBefore: \"Ajouter une colonne avant\",\r\n addColumnAfter: \"Ajouter une colonne après\",\r\n deleteColumn: \"Supprimer la colonne\",\r\n deleteTable: \"Supprimer le tableau\",\r\n toggleHeaderRow: \"Basculer ligne d'en-tête\",\r\n toggleHeaderColumn: \"Basculer colonne d'en-tête\",\r\n mergeCells: \"Fusionner les cellules\",\r\n splitCell: \"Diviser la cellule\",\r\n },\r\n imageUpload: {\r\n selectImage: \"Sélectionner une image\",\r\n uploadingImage: \"Téléchargement de l'image...\",\r\n uploadProgress: \"Progression du téléchargement\",\r\n uploadError: \"Erreur de téléchargement\",\r\n uploadSuccess: \"Téléchargement réussi\",\r\n imageTooLarge: \"Image trop volumineuse\",\r\n invalidFileType: \"Type de fichier invalide\",\r\n dragDropText: \"Glissez et déposez des images ici\",\r\n changeImage: \"Changer l'image\",\r\n deleteImage: \"Supprimer l'image\",\r\n resizeSmall: \"Petit\",\r\n resizeMedium: \"Moyen\",\r\n resizeLarge: \"Grand\",\r\n resizeOriginal: \"Original\",\r\n },\r\n editor: {\r\n placeholder: \"Commencez à écrire...\",\r\n character: \"caractère\",\r\n word: \"mot\",\r\n imageLoadError: \"Erreur de chargement de l'image\",\r\n linkPrompt: \"Entrez l'URL du lien\",\r\n linkUrlPrompt: \"Entrez l'URL\",\r\n confirmDelete: \"Êtes-vous sûr de vouloir supprimer ceci ?\",\r\n },\r\n common: {\r\n cancel: \"Annuler\",\r\n confirm: \"Confirmer\",\r\n apply: \"Appliquer\",\r\n delete: \"Supprimer\",\r\n save: \"Sauvegarder\",\r\n close: \"Fermer\",\r\n loading: \"Chargement\",\r\n error: \"Erreur\",\r\n success: \"Succès\",\r\n },\r\n};\r\n\r\n@Injectable({\r\n providedIn: \"root\",\r\n})\r\nexport class TiptapI18nService {\r\n private _currentLocale = signal<SupportedLocale>(\"en\");\r\n private _translations = signal<Record<SupportedLocale, TiptapTranslations>>({\r\n en: ENGLISH_TRANSLATIONS,\r\n fr: FRENCH_TRANSLATIONS,\r\n });\r\n\r\n // Signaux publics\r\n readonly currentLocale = this._currentLocale.asReadonly();\r\n readonly translations = computed(\r\n () => this._translations()[this._currentLocale()]\r\n );\r\n\r\n // Méthodes de traduction rapides\r\n readonly t = computed(() => this.translations());\r\n readonly toolbar = computed(() => this.translations().toolbar);\r\n readonly bubbleMenu = computed(() => this.translations().bubbleMenu);\r\n readonly slashCommands = computed(() => this.translations().slashCommands);\r\n readonly table = computed(() => this.translations().table);\r\n readonly imageUpload = computed(() => this.translations().imageUpload);\r\n readonly editor = computed(() => this.translations().editor);\r\n readonly common = computed(() => this.translations().common);\r\n\r\n constructor() {\r\n // Détecter automatiquement la langue du navigateur\r\n this.detectBrowserLanguage();\r\n }\r\n\r\n setLocale(locale: SupportedLocale): void {\r\n this._currentLocale.set(locale);\r\n }\r\n\r\n autoDetectLocale(): void {\r\n this.detectBrowserLanguage();\r\n }\r\n\r\n getSupportedLocales(): SupportedLocale[] {\r\n return Object.keys(this._translations()) as SupportedLocale[];\r\n }\r\n\r\n addTranslations(\r\n locale: SupportedLocale,\r\n translations: Partial<TiptapTranslations>\r\n ): void {\r\n this._translations.update((current) => ({\r\n ...current,\r\n [locale]: {\r\n ...current[locale],\r\n ...translations,\r\n },\r\n }));\r\n }\r\n\r\n private detectBrowserLanguage(): void {\r\n const browserLang = navigator.language.toLowerCase();\r\n if (browserLang.startsWith(\"fr\")) {\r\n this._currentLocale.set(\"fr\");\r\n } else {\r\n this._currentLocale.set(\"en\");\r\n }\r\n }\r\n\r\n // Méthodes utilitaires pour les composants\r\n getToolbarTitle(key: keyof TiptapTranslations[\"toolbar\"]): string {\r\n return this.translations().toolbar[key];\r\n }\r\n\r\n getBubbleMenuTitle(key: keyof TiptapTranslations[\"bubbleMenu\"]): string {\r\n return this.translations().bubbleMenu[key];\r\n }\r\n\r\n getSlashCommand(key: keyof TiptapTranslations[\"slashCommands\"]) {\r\n return this.translations().slashCommands[key];\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\nimport { Editor } from \"@tiptap/core\";\n\n@Injectable({\n providedIn: \"root\",\n})\nexport class EditorCommandsService {\n // Méthodes pour vérifier l'état actif\n isActive(\n editor: Editor,\n name: string,\n attributes?: Record<string, any>\n ): boolean {\n return editor.isActive(name, attributes);\n }\n\n // Méthodes pour vérifier si une commande peut être exécutée\n canExecute(editor: Editor, command: string): boolean {\n if (!editor) return false;\n\n switch (command) {\n case \"toggleBold\":\n return editor.can().chain().focus().toggleBold().run();\n case \"toggleItalic\":\n return editor.can().chain().focus().toggleItalic().run();\n case \"toggleStrike\":\n return editor.can().chain().focus().toggleStrike().run();\n case \"toggleCode\":\n return editor.can().chain().focus().toggleCode().run();\n case \"toggleUnderline\":\n return editor.can().chain().focus().toggleUnderline().run();\n case \"toggleSuperscript\":\n return editor.can().chain().focus().toggleSuperscript().run();\n case \"toggleSubscript\":\n return editor.can().chain().focus().toggleSubscript().run();\n case \"setTextAlign\":\n return editor.can().chain().focus().setTextAlign(\"left\").run();\n case \"toggleLink\":\n return editor.can().chain().focus().toggleLink({ href: \"\" }).run();\n case \"insertHorizontalRule\":\n return editor.can().chain().focus().setHorizontalRule().run();\n case \"toggleHighlight\":\n return editor.can().chain().focus().toggleHighlight().run();\n case \"undo\":\n return editor.can().chain().focus().undo().run();\n case \"redo\":\n return editor.can().chain().focus().redo().run();\n case \"insertTable\":\n return editor.can().chain().focus().insertTable().run();\n case \"addColumnBefore\":\n return editor.can().chain().focus().addColumnBefore().run();\n case \"addColumnAfter\":\n return editor.can().chain().focus().addColumnAfter().run();\n case \"deleteColumn\":\n return editor.can().chain().focus().deleteColumn().run();\n case \"addRowBefore\":\n return editor.can().chain().focus().addRowBefore().run();\n case \"addRowAfter\":\n return editor.can().chain().focus().addRowAfter().run();\n case \"deleteRow\":\n return editor.can().chain().focus().deleteRow().run();\n case \"deleteTable\":\n return editor.can().chain().focus().deleteTable().run();\n case \"mergeCells\":\n return editor.can().chain().focus().mergeCells().run();\n case \"splitCell\":\n return editor.can().chain().focus().splitCell().run();\n case \"toggleHeaderColumn\":\n return editor.can().chain().focus().toggleHeaderColumn().run();\n case \"toggleHeaderRow\":\n return editor.can().chain().focus().toggleHeaderRow().run();\n case \"toggleHeaderCell\":\n return editor.can().chain().focus().toggleHeaderCell().run();\n default:\n return false;\n }\n }\n\n // Méthodes pour exécuter les commandes\n toggleBold(editor: Editor): void {\n editor.chain().focus().toggleBold().run();\n }\n\n toggleItalic(editor: Editor): void {\n editor.chain().focus().toggleItalic().run();\n }\n\n toggleStrike(editor: Editor): void {\n editor.chain().focus().toggleStrike().run();\n }\n\n toggleCode(editor: Editor): void {\n editor.chain().focus().toggleCode().run();\n }\n\n toggleHeading(editor: Editor, level: 1 | 2 | 3): void {\n editor.chain().focus().toggleHeading({ level }).run();\n }\n\n toggleBulletList(editor: Editor): void {\n editor.chain().focus().toggleBulletList().run();\n }\n\n toggleOrderedList(editor: Editor): void {\n editor.chain().focus().toggleOrderedList().run();\n }\n\n toggleBlockquote(editor: Editor): void {\n editor.chain().focus().toggleBlockquote().run();\n }\n\n undo(editor: Editor): void {\n editor.chain().focus().undo().run();\n }\n\n redo(editor: Editor): void {\n editor.chain().focus().redo().run();\n }\n\n // Nouvelles méthodes pour les formatages supplémentaires\n toggleUnderline(editor: Editor): void {\n editor.chain().focus().toggleUnderline().run();\n }\n\n toggleSuperscript(editor: Editor): void {\n editor.chain().focus().toggleSuperscript().run();\n }\n\n toggleSubscript(editor: Editor): void {\n editor.chain().focus().toggleSubscript().run();\n }\n\n setTextAlign(\n editor: Editor,\n alignment: \"left\" | \"center\" | \"right\" | \"justify\"\n ): void {\n editor.chain().focus().setTextAlign(alignment).run();\n }\n\n toggleLink(editor: Editor, url?: string): void {\n if (url) {\n editor.chain().focus().toggleLink({ href: url }).run();\n } else {\n // Si pas d'URL fournie, on demande à l'utilisateur\n const href = window.prompt(\"URL du lien:\");\n if (href) {\n editor.chain().focus().toggleLink({ href }).run();\n }\n }\n }\n\n insertHorizontalRule(editor: Editor): void {\n editor.chain().focus().setHorizontalRule().run();\n }\n\n toggleHighlight(editor: Editor, color?: string): void {\n if (color) {\n editor.chain().focus().toggleHighlight({ color }).run();\n } else {\n editor.chain().focus().toggleHighlight().run();\n }\n }\n\n // Table commands\n insertTable(editor: Editor, rows: number = 3, cols: number = 3): void {\n editor.chain().focus().insertTable({ rows, cols }).run();\n }\n\n addColumnBefore(editor: Editor): void {\n editor.chain().focus().addColumnBefore().run();\n }\n\n addColumnAfter(editor: Editor): void {\n editor.chain().focus().addColumnAfter().run();\n }\n\n deleteColumn(editor: Editor): void {\n editor.chain().focus().deleteColumn().run();\n }\n\n addRowBefore(editor: Editor): void {\n editor.chain().focus().addRowBefore().run();\n }\n\n addRowAfter(editor: Editor): void {\n editor.chain().focus().addRowAfter().run();\n }\n\n deleteRow(editor: Editor): void {\n editor.chain().focus().deleteRow().run();\n }\n\n deleteTable(editor: Editor): void {\n editor.chain().focus().deleteTable().run();\n }\n\n mergeCells(editor: Editor): void {\n editor.chain().focus().mergeCells().run();\n }\n\n splitCell(editor: Editor): void {\n editor.chain().focus().splitCell().run();\n }\n\n toggleHeaderColumn(editor: Editor): void {\n editor.chain().focus().toggleHeaderColumn().run();\n }\n\n toggleHeaderRow(editor: Editor): void {\n editor.chain().focus().toggleHeaderRow().run();\n }\n\n toggleHeaderCell(editor: Editor): void {\n editor.chain().focus().toggleHeaderCell().run();\n }\n\n // Méthode pour vider le contenu\n clearContent(editor: Editor): void {\n editor.chain().focus().setContent(\"\", true).run(); // ✅ Forcer l'émission de l'événement\n }\n\n // Méthodes de base de l'éditeur\n focus(editor: Editor): void {\n editor.chain().focus().run();\n }\n\n blur(editor: Editor): void {\n editor.chain().blur().run();\n }\n\n setContent(editor: Editor, content: string, emitUpdate = true): void {\n editor.chain().focus().setContent(content, emitUpdate).run();\n }\n\n setEditable(editor: Editor, editable: boolean): void {\n editor.setEditable(editable);\n }\n}\n","import {\r\n Component,\r\n input,\r\n ViewChild,\r\n ElementRef,\r\n OnInit,\r\n OnDestroy,\r\n effect,\r\n inject,\r\n} from \"@angular/core\";\r\nimport { CommonModule } from \"@angular/common\";\r\nimport { Editor } from \"@tiptap/core\";\r\nimport tippy, { Instance as TippyInstance } from \"tippy.js\";\r\nimport { TiptapI18nService } from \"./services/i18n.service\";\r\nimport { EditorCommandsService } from \"./services/editor-commands.service\";\r\nimport { TiptapButtonComponent } from \"./tiptap-button.component\";\r\nimport { TiptapSeparatorComponent } from \"./tiptap-separator.component\";\r\nimport { TableBubbleMenuConfig } from \"./models/bubble-menu.model\";\r\n\r\n@Component({\r\n selector: \"tiptap-table-bubble-menu\",\r\n standalone: true,\r\n imports: [CommonModule, TiptapButtonComponent, TiptapSeparatorComponent],\r\n template: `\r\n <div #menuElement class=\"bubble-menu\">\r\n <!-- Actions de lignes -->\r\n @if (config().addRowBefore !== false) {\r\n <tiptap-button\r\n icon=\"add_row_above\"\r\n title=\"{{ i18n.table().addRowBefore }}\"\r\n (click)=\"addRowBefore()\"\r\n ></tiptap-button>\r\n } @if (config().addRowAfter !== false) {\r\n <tiptap-button\r\n icon=\"add_row_below\"\r\n title=\"{{ i18n.table().addRowAfter }}\"\r\n (click)=\"addRowAfter()\"\r\n ></tiptap-button>\r\n } @if (config().deleteRow !== false) {\r\n <tiptap-button\r\n icon=\"delete\"\r\n title=\"{{ i18n.table().deleteRow }}\"\r\n variant=\"danger\"\r\n (click)=\"deleteRow()\"\r\n ></tiptap-button>\r\n } @if (config().separator !== false) {\r\n <tiptap-separator></tiptap-separator>\r\n }\r\n\r\n <!-- Actions de colonnes -->\r\n @if (config().addColumnBefore !== false) {\r\n <tiptap-button\r\n icon=\"add_column_left\"\r\n title=\"{{ i18n.table().addColumnBefore }}\"\r\n (click)=\"addColumnBefore()\"\r\n ></tiptap-button>\r\n } @if (config().addColumnAfter !== false) {\r\n <tiptap-button\r\n icon=\"add_column_right\"\r\n title=\"{{ i18n.table().addColumnAfter }}\"\r\n (click)=\"addColumnAfter()\"\r\n ></tiptap-button>\r\n } @if (config().deleteColumn !== false) {\r\n <tiptap-button\r\n icon=\"delete\"\r\n title=\"{{ i18n.table().deleteColumn }}\"\r\n variant=\"danger\"\r\n (click)=\"deleteColumn()\"\r\n ></tiptap-button>\r\n } @if (config().separator !== false) {\r\n <tiptap-separator></tiptap-separator>\r\n }\r\n\r\n <!-- Actions de cellules -->\r\n @if (config().toggleHeaderRow !== false) {\r\n <tiptap-button\r\n icon=\"toolbar\"\r\n title=\"{{ i18n.table().toggleHeaderRow }}\"\r\n (click)=\"toggleHeaderRow()\"\r\n ></tiptap-button>\r\n } @if (config().toggleHeaderColumn !== false) {\r\n <tiptap-button\r\n icon=\"dock_to_right\"\r\n title=\"{{ i18n.table().toggleHeaderColumn }}\"\r\n (click)=\"toggleHeaderColumn()\"\r\n ></tiptap-button>\r\n } @if (config().separator !== false && config().deleteTable !== false) {\r\n <tiptap-separator></tiptap-separator>\r\n }\r\n\r\n <!-- Actions de table -->\r\n @if (config().deleteTable !== false) {\r\n <tiptap-button\r\n icon=\"delete_forever\"\r\n title=\"{{ i18n.table().deleteTable }}\"\r\n variant=\"danger\"\r\n (click)=\"deleteTable()\"\r\n ></tiptap-button>\r\n }\r\n </div>\r\n `,\r\n styles: [],\r\n})\r\nexport class TiptapTableBubbleMenuComponent implements OnInit, OnDestroy {\r\n @ViewChild(\"menuElement\", { static: true }) menuElement!: ElementRef;\r\n\r\n // Inputs\r\n editor = input.required<Editor>();\r\n config = input<TableBubbleMenuConfig>({});\r\n\r\n // Services\r\n private i18nService = inject(TiptapI18nService);\r\n private commandsService = inject(EditorCommandsService);\r\n\r\n // Tippy instance\r\n private tippyInstance: TippyInstance | null = null;\r\n private updateTimeout: any = null;\r\n\r\n // Signaux\r\n readonly i18n = this.i18nService;\r\n\r\n constructor() {\r\n // Effet pour mettre à jour le menu quand l'éditeur change\r\n effect(() => {\r\n const editor = this.editor();\r\n if (editor) {\r\n // Nettoyer les anciens listeners\r\n editor.off(\"selectionUpdate\", this.updateMenu);\r\n editor.off(\"focus\", this.updateMenu);\r\n editor.off(\"blur\", this.handleBlur);\r\n\r\n // Ajouter les nouveaux listeners\r\n editor.on(\"selectionUpdate\", this.updateMenu);\r\n editor.on(\"focus\", this.updateMenu);\r\n editor.on(\"blur\", this.handleBlur);\r\n }\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n this.initTippy();\r\n }\r\n\r\n ngOnDestroy() {\r\n const editor = this.editor();\r\n if (editor) {\r\n // Nettoyer les événements\r\n editor.off(\"selectionUpdate\", this.updateMenu);\r\n editor.off(\"focus\", this.updateMenu);\r\n editor.off(\"blur\", this.handleBlur);\r\n }\r\n\r\n if (this.tippyInstance) {\r\n this.tippyInstance.destroy();\r\n }\r\n if (this.updateTimeout) {\r\n clearTimeout(this.updateTimeout);\r\n }\r\n }\r\n\r\n private initTippy() {\r\n const menuElement = this.menuElement.nativeElement;\r\n\r\n // Créer l'instance Tippy\r\n this.tippyInstance = tippy(document.body, {\r\n content: menuElement,\r\n trigger: \"manual\",\r\n placement: \"top-start\",\r\n appendTo: () => document.body,\r\n interactive: true,\r\n arrow: false,\r\n offset: [0, 8],\r\n maxWidth: \"none\",\r\n hideOnClick: false,\r\n onShow: (instance) => {\r\n // S'assurer que les autres menus sont fermés\r\n this.hideOtherMenus();\r\n },\r\n getReferenceClientRect: () => this.getTableRect(),\r\n popperOptions: {\r\n modifiers: [\r\n {\r\n name: \"preventOverflow\",\r\n options: {\r\n boundary: \"viewport\",\r\n padding: 8,\r\n },\r\n },\r\n {\r\n name: \"flip\",\r\n options: {\r\n fallbackPlacements: [\"bottom-start\", \"top-end\", \"bottom-end\"],\r\n },\r\n },\r\n ],\r\n },\r\n });\r\n\r\n // Maintenant que Tippy est initialisé, faire un premier check\r\n this.updateMenu();\r\n }\r\n\r\n private getTableRect(): DOMRect {\r\n const ed = this.editor();\r\n if (!ed) return new DOMRect(0, 0, 0, 0);\r\n\r\n // Méthode 1: Utiliser coordsAtPos (méthode native ProseMirror)\r\n const { from } = ed.state.selection;\r\n const coords = ed.view.coordsAtPos(from);\r\n\r\n // Trouver la table qui contient cette position\r\n const editorElement = ed.view.dom;\r\n const tables = Array.from(editorElement.querySelectorAll(\"table\"));\r\n\r\n for (let i = 0; i < tables.length; i++) {\r\n const table = tables[i];\r\n try {\r\n const tableRect = table.getBoundingClientRect();\r\n\r\n // Vérifier si la position ProseMirror est dans cette table\r\n const isInside =\r\n coords.left >= tableRect.left &&\r\n coords.left <= tableRect.right &&\r\n coords.top >= tableRect.top &&\r\n coords.top <= tableRect.bottom;\r\n\r\n if (isInside) {\r\n return tableRect;\r\n }\r\n } catch (error) {\r\n continue;\r\n }\r\n }\r\n\r\n // Fallback : utiliser la méthode DOM si ProseMirror échoue\r\n const selection = window.getSelection();\r\n if (selection && selection.rangeCount > 0) {\r\n const range = selection.getRangeAt(0);\r\n const rect = range.getBoundingClientRect();\r\n\r\n if (rect.width > 0 && rect.height > 0) {\r\n return rect;\r\n }\r\n }\r\n\r\n // Dernier fallback : première table\r\n if (tables.length > 0) {\r\n return tables[0].getBoundingClientRect();\r\n }\r\n\r\n return new DOMRect(0, 0, 0, 0);\r\n }\r\n\r\n updateMenu = () => {\r\n // Debounce pour éviter les appels trop fréquents\r\n if (this.updateTimeout) {\r\n clearTimeout(this.updateTimeout);\r\n }\r\n\r\n this.updateTimeout = setTimeout(() => {\r\n const ed = this.editor();\r\n if (!ed) return;\r\n\r\n const isTableSelected =\r\n ed.isActive(\"table\") ||\r\n ed.isActive(\"tableCell\") ||\r\n ed.isActive(\"tableHeader\");\r\n\r\n // Vérifier s'il y a une sélection de cellules (priorité au menu de cellules)\r\n const { from, to } = ed.state.selection;\r\n const hasCellSelection = from !== to;\r\n const isTableCell =\r\n ed.isActive(\"tableCell\") || ed.isActive(\"tableHeader\");\r\n\r\n // Vérifier si la sélection traverse plusieurs cellules\r\n const selectionSize = to - from;\r\n const hasMultiCellSelection = hasCellSelection && selectionSize > 1;\r\n\r\n // Ne montrer le menu de table que si :\r\n // 1. Une table est sélectionnée\r\n // 2. L'éditeur est éditable\r\n // 3. Il n'y a PAS de sélection de cellules (priorité au menu de cellules)\r\n // 4. Il n'y a PAS de sélection multi-cellules\r\n const shouldShow =\r\n isTableSelected &&\r\n ed.isEditable &&\r\n !(hasCellSelection && isTableCell) &&\r\n !hasMultiCellSelection;\r\n\r\n if (shouldShow) {\r\n this.showTippy();\r\n } else {\r\n this.hideTippy();\r\n }\r\n }, 10);\r\n };\r\n\r\n handleBlur = () => {\r\n // Masquer le menu quand l'éditeur perd le focus\r\n setTimeout(() => {\r\n this.hideTippy();\r\n }, 100);\r\n };\r\n\r\n private hideOtherMenus() {\r\n // Cette méthode peut être étendue pour fermer d'autres menus si nécessaire\r\n }\r\n\r\n private showTippy() {\r\n if (!this.tippyInstance) return;\r\n\r\n // Mettre à jour la position\r\n this.tippyInstance.setProps({\r\n getReferenceClientRect: () => this.getTableRect(),\r\n });\r\n\r\n this.tippyInstance.show();\r\n }\r\n\r\n hideTippy() {\r\n if (!this.tippyInstance) return;\r\n this.tippyInstance.hide();\r\n }\r\n\r\n // Actions de lignes\r\n addRowBefore() {\r\n this.commandsService.addRowBefore(this.editor());\r\n }\r\n\r\n addRowAfter() {\r\n this.commandsService.addRowAfter(this.editor());\r\n }\r\n\r\n deleteRow() {\r\n this.commandsService.deleteRow(this.editor());\r\n }\r\n\r\n // Actions de colonnes\r\n addColumnBefore() {\r\n this.commandsService.addColumnBefore(this.editor());\r\n }\r\n\r\n addColumnAfter() {\r\n this.commandsService.addColumnAfter(this.editor());\r\n }\r\n\r\n deleteColumn() {\r\n this.commandsService.deleteColumn(this.editor());\r\n }\r\n\r\n // Actions de headers\r\n toggleHeaderRow() {\r\n this.commandsService.toggleHeaderRow(this.editor());\r\n }\r\n\r\n toggleHeaderColumn() {\r\n this.commandsService.toggleHeaderColumn(this.editor());\r\n }\r\n\r\n // Actions de table\r\n deleteTable() {\r\n this.commandsService.deleteTable(this.editor());\r\n }\r\n}\r\n","import {\r\n Component,\r\n input,\r\n ViewChild,\r\n ElementRef,\r\n OnInit,\r\n OnDestroy,\r\n effect,\r\n inject,\r\n} from \"@angular/core\";\r\nimport { CommonModule } from \"@angular/common\";\r\nimport { Editor } from \"@tiptap/core\";\r\nimport { CellSelection } from \"@tiptap/pm/tables\";\r\nimport tippy, { Instance as TippyInstance } from \"tippy.js\";\r\nimport { TiptapI18nService } from \"./services/i18n.service\";\r\nimport { EditorCommandsService } from \"./services/editor-commands.service\";\r\nimport { TiptapButtonComponent } from \"./tiptap-button.component\";\r\n\r\nexport interface CellBubbleMenuConfig {\r\n mergeCells?: boolean;\r\n splitCell?: boolean;\r\n}\r\n\r\n@Component({\r\n selector: \"tiptap-cell-bubble-menu\",\r\n standalone: true,\r\n imports: [CommonModule, TiptapButtonComponent],\r\n template: `\r\n <div #menuElement class=\"bubble-menu\">\r\n <!-- Actions spécifiques aux cellules -->\r\n @if (config().mergeCells !== false && !isSingleCellSelected) {\r\n <tiptap-button\r\n icon=\"cell_merge\"\r\n title=\"{{ i18n.table().mergeCells }}\"\r\n (click)=\"mergeCells()\"\r\n ></tiptap-button>\r\n } @if (config().splitCell !== false && isSingleCellSelected) {\r\n <tiptap-button\r\n icon=\"split_scene\"\r\n title=\"{{ i18n.table().splitCell }}\"\r\n (click)=\"splitCell()\"\r\n ></tiptap-button>\r\n }\r\n </div>\r\n `,\r\n styles: [],\r\n})\r\nexport class TiptapCellBubbleMenuComponent implements OnInit, OnDestroy {\r\n @ViewChild(\"menuElement\", { static: true }) menuElement!: ElementRef;\r\n\r\n // Inputs\r\n editor = input.required<Editor>();\r\n config = input<CellBubbleMenuConfig>({});\r\n\r\n // Services\r\n private i18nService = inject(TiptapI18nService);\r\n private commandsService = inject(EditorCommandsService);\r\n\r\n // Tippy instance\r\n private tippyInstance: TippyInstance | null = null;\r\n private updateTimeout: any = null;\r\n\r\n // Signaux\r\n readonly i18n = this.i18nService;\r\n isSingleCellSelected: boolean = false;\r\n\r\n constructor() {\r\n // Effet pour mettre à jour le menu quand l'éditeur change\r\n effect(() => {\r\n const editor = this.editor();\r\n if (editor) {\r\n // Nettoyer les anciens listeners\r\n editor.off(\"selectionUpdate\", this.updateMenu);\r\n editor.off(\"focus\", this.updateMenu);\r\n editor.off(\"blur\", this.handleBlur);\r\n\r\n // Ajouter les nouveaux listeners\r\n editor.on(\"selectionUpdate\", this.updateMenu);\r\n editor.on(\"focus\", this.updateMenu);\r\n editor.on(\"blur\", this.handleBlur);\r\n }\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n this.initTippy();\r\n }\r\n\r\n ngOnDestroy() {\r\n const editor = this.editor();\r\n if (editor) {\r\n // Nettoyer les événements\r\n editor.off(\"selectionUpdate\", this.updateMenu);\r\n editor.off(\"focus\", this.updateMenu);\r\n editor.off(\"blur\", this.handleBlur);\r\n }\r\n\r\n if (this.tippyInstance) {\r\n this.tippyInstance.destroy();\r\n }\r\n if (this.updateTimeout) {\r\n clearTimeout(this.updateTimeout);\r\n }\r\n }\r\n\r\n private initTippy() {\r\n const menuElement = this.menuElement.nativeElement;\r\n\r\n // Créer l'instance Tippy\r\n this.tippyInstance = tippy(document.body, {\r\n content: menuElement,\r\n trigger: \"manual\",\r\n placement: \"top-start\",\r\n appendTo: () => document.body,\r\n interactive: true,\r\n arrow: false,\r\n offset: [0, 8],\r\n hideOnClick: false,\r\n onShow: (instance) => {\r\n // S'assurer que les autres menus sont fermés\r\n this.hideOtherMenus();\r\n },\r\n getReferenceClientRect: () => this.getCellRect(),\r\n popperOptions: {\r\n modifiers: [\r\n {\r\n name: \"preventOverflow\",\r\n options: {\r\n boundary: \"viewport\",\r\n padding: 8,\r\n },\r\n },\r\n {\r\n name: \"flip\",\r\n options: {\r\n fallbackPlacements: [\"bottom-start\", \"top-end\", \"bottom-end\"],\r\n },\r\n },\r\n ],\r\n },\r\n });\r\n\r\n // Maintenant que Tippy est initialisé, faire un premier check\r\n this.updateMenu();\r\n }\r\n\r\n private getCellRect(): DOMRect {\r\n const ed = this.editor();\r\n if (!ed) return new DOMRect(0, 0, 0, 0);\r\n\r\n // Détecter la sélection de cellules\r\n const { from, to } = ed.state.selection;\r\n const hasCellSelection = from !== to;\r\n\r\n if (!hasCellSelection) {\r\n return new DOMRect(0, 0, 0, 0);\r\n }\r\n\r\n // Obtenir les coordonnées de la sélection\r\n const coords = ed.view.coordsAtPos(from);\r\n const endCoords = ed.view.coordsAtPos(to);\r\n\r\n // Créer un rectangle englobant la sélection\r\n const rect = new DOMRect(\r\n Math.min(coords.left, endCoords.left),\r\n Math.min(coords.top, endCoords.top),\r\n Math.abs(endCoords.left - coords.left),\r\n Math.abs(endCoords.top - coords.top)\r\n );\r\n\r\n return rect;\r\n }\r\n\r\n updateMenu = () => {\r\n // Debounce pour éviter les appels trop fréquents\r\n if (this.updateTimeout) {\r\n clearTimeout(this.updateTimeout);\r\n }\r\n\r\n this.updateTimeout = setTimeout(() => {\r\n const ed = this.editor();\r\n if (!ed) return;\r\n\r\n const { selection } = ed.state;\r\n const { from, to } = selection;\r\n\r\n // Détecter spécifiquement la sélection de CELLULES (pas de texte)\r\n const hasCellSelection = selection instanceof CellSelection;\r\n // Une seule cellule si ancre et tête pointent vers la même cellule\r\n this.isSingleCellSelected =\r\n hasCellSelection &&\r\n (selection as CellSelection).$anchorCell.pos ===\r\n (selection as CellSelection).$headCell.pos;\r\n const hasTextSelection =\r\n !selection.empty && !(selection instanceof CellSelection);\r\n const isTableCell =\r\n ed.isActive(\"tableCell\") || ed.isActive(\"tableHeader\");\r\n\r\n\r\n // Le menu de cellule ne s'affiche QUE pour les sélections de cellules multiples\r\n // (pas pour la sélection de texte dans une cellule)\r\n const shouldShow = hasCellSelection && isTableCell && ed.isEditable;\r\n\r\n if (shouldShow) {\r\n this.showTippy();\r\n } else {\r\n this.hideTippy();\r\n }\r\n }, 10);\r\n };\r\n\r\n handleBlur = () => {\r\n // Masquer le menu quand l'éditeur perd le focus\r\n setTimeout(() => {\r\n this.hideTippy();\r\n }, 100);\r\n };\r\n\r\n private hideOtherMenus() {\r\n // Masquer tous les autres menus quand le menu de cellules est actif\r\n this.hideTableMenu();\r\n this.hideTextBubbleMenu();\r\n }\r\n\r\n private showTippy() {\r\n if (!this.tippyInstance) return;\r\n\r\n // Masquer les autres menus avant d'afficher le menu de cellules\r\n this.hideTableMenu();\r\n this.hideTextBubbleMenu();\r\n\r\n // Mettre à jour la position\r\n this.tippyInstance.setProps({\r\n getReferenceClientRect: () => this.getCellRect(),\r\n });\r\n\r\n this.tippyInstance.show();\r\n }\r\n\r\n private hideTableMenu() {\r\n // Masquer le menu de table quand le menu de cellules est actif\r\n const tableMenu = document.querySelector(\"tiptap-table-bubble-menu\");\r\n if (tableMenu) {\r\n const tippyInstance = (tableMenu as any)._tippy;\r\n if (tippyInstance) {\r\n tippyInstance.hide();\r\n }\r\n }\r\n\r\n // Alternative : masquer via l'élément Angular\r\n const tableMenuComponent = document.querySelector(\r\n \"tiptap-table-bubble-menu\"\r\n ) as any;\r\n if (tableMenuComponent && tableMenuComponent.hideTippy) {\r\n tableMenuComponent.hideTippy();\r\n }\r\n }\r\n\r\n private hideTextBubbleMenu() {\r\n // Masquer le menu de texte (bubble menu général) quand le menu de cellules est actif\r\n const textMenu = document.querySelector(\"tiptap-bubble-menu\");\r\n if (textMenu) {\r\n const tippyInstance = (textMenu as any)._tippy;\r\n if (tippyInstance) {\r\n tippyInstance.hide();\r\n }\r\n }\r\n\r\n // Alternative : masquer via l'élément Angular\r\n const textMenuComponent = document.querySelector(\r\n \"tiptap-bubble-menu\"\r\n ) as any;\r\n if (textMenuComponent && textMenuComponent.hideTippy) {\r\n textMenuComponent.hideTippy();\r\n }\r\n }\r\n\r\n hideTippy() {\r\n if (!this.tippyInstance) return;\r\n this.tippyInstance.hide();\r\n }\r\n\r\n // Actions spécifiques aux cellules\r\n mergeCells() {\r\n this.commandsService.mergeCells(this.editor());\r\n }\r\n\r\n splitCell() {\r\n this.commandsService.splitCell(this.editor());\r\n }\r\n}\r\n","import { Component, input, output, signal, inject } from \"@angular/core\";\r\nimport { Editor } from \"@tiptap/core\";\r\nimport { TiptapButtonComponent } from \"./tiptap-button.component\";\r\nimport { TiptapSeparatorComponent } from \"./tiptap-separator.component\";\r\nimport { ImageUploadResult, ImageService } from \"./services/image.service\";\r\nimport { EditorCommandsService } from \"./services/editor-commands.service\";\r\nimport { TiptapI18nService } from \"./services/i18n.service\";\r\n\r\nexport interface ToolbarConfig {\r\n bold?: boolean;\r\n italic?: boolean;\r\n underline?: boolean;\r\n strike?: boolean;\r\n code?: boolean;\r\n superscript?: boolean;\r\n subscript?: boolean;\r\n highlight?: boolean;\r\n heading1?: boolean;\r\n heading2?: boolean;\r\n heading3?: boolean;\r\n bulletList?: boolean;\r\n orderedList?: boolean;\r\n blockquote?: boolean;\r\n alignLeft?: boolean;\r\n alignCenter?: boolean;\r\n alignRight?: boolean;\r\n alignJustify?: boolean;\r\n link?: boolean;\r\n image?: boolean;\r\n horizontalRule?: boolean;\r\n table?: boolean;\r\n undo?: boolean;\r\n redo?: boolean;\r\n clear?: boolean;\r\n separator?: boolean;\r\n}\r\n\r\n@Component({\r\n selector: \"tiptap-toolbar\",\r\n standalone: true,\r\n imports: [TiptapButtonComponent, TiptapSeparatorComponent],\r\n template: `\r\n <div class=\"tiptap-toolbar\">\r\n @if (config().bold) {\r\n <tiptap-button\r\n icon=\"format_bold\"\r\n [title]=\"t().bold\"\r\n [active]=\"isActive('bold')\"\r\n [disabled]=\"!canExecute('toggleBold')\"\r\n (onClick)=\"toggleBold()\"\r\n />\r\n } @if (config().italic) {\r\n <tiptap-button\r\n icon=\"format_italic\"\r\n [title]=\"t().italic\"\r\n [active]=\"isActive('italic')\"\r\n [disabled]=\"!canExecute('toggleItalic')\"\r\n (onClick)=\"toggleItalic()\"\r\n />\r\n } @if (config().underline) {\r\n <tiptap-button\r\n icon=\"format_underlined\"\r\n [title]=\"t().underline\"\r\n [active]=\"isActive('underline')\"\r\n [disabled]=\"!canExecute('toggleUnderline')\"\r\n (onClick)=\"toggleUnderline()\"\r\n />\r\n } @if (config().strike) {\r\n <tiptap-button\r\n icon=\"strikethrough_s\"\r\n [title]=\"t().strike\"\r\n [active]=\"isActive('strike')\"\r\n [disabled]=\"!canExecute('toggleStrike')\"\r\n (onClick)=\"toggleStrike()\"\r\n />\r\n } @if (config().code) {\r\n <tiptap-button\r\n icon=\"code\"\r\n [title]=\"t().code\"\r\n [active]=\"isActive('code')\"\r\n [disabled]=\"!canExecute('toggleCode')\"\r\n (onClick)=\"toggleCode()\"\r\n />\r\n } @if (config().superscript) {\r\n <tiptap-button\r\n icon=\"superscript\"\r\n [title]=\"t().superscript\"\r\n [active]=\"isActive('superscript')\"\r\n [disabled]=\"!canExecute('toggleSuperscript')\"\r\n (onClick)=\"toggleSuperscript()\"\r\n />\r\n } @if (config().subscript) {\r\n <tiptap-button\r\n icon=\"subscript\"\r\n [title]=\"t().subscript\"\r\n [active]=\"isActive('subscript')\"\r\n [disabled]=\"!canExecute('toggleSubscript')\"\r\n (onClick)=\"toggleSubscript()\"\r\n />\r\n } @if (config().highlight) {\r\n <tiptap-button\r\n icon=\"highlight\"\r\n [title]=\"t().highlight\"\r\n [active]=\"isActive('highlight')\"\r\n [disabled]=\"!canExecute('toggleHighlight')\"\r\n (onClick)=\"toggleHighlight()\"\r\n />\r\n } @if (config().separator && (config().heading1 || config().heading2 ||\r\n config().heading3)) {\r\n <tiptap-separator />\r\n } @if (config().heading1) {\r\n <tiptap-button\r\n icon=\"format_h1\"\r\n [title]=\"t().heading1\"\r\n variant=\"text\"\r\n [active]=\"isActive('heading', { level: 1 })\"\r\n (onClick)=\"toggleHeading(1)\"\r\n />\r\n } @if (config().heading2) {\r\n <tiptap-button\r\n icon=\"format_h2\"\r\n [title]=\"t().heading2\"\r\n variant=\"text\"\r\n [active]=\"isActive('heading', { level: 2 })\"\r\n (onClick)=\"toggleHeading(2)\"\r\n />\r\n } @if (config().heading3) {\r\n <tiptap-button\r\n icon=\"format_h3\"\r\n [title]=\"t().heading3\"\r\n variant=\"text\"\r\n [active]=\"isActive('heading', { level: 3 })\"\r\n (onClick)=\"toggleHeading(3)\"\r\n />\r\n } @if (config().separator && (config().bulletList || config().orderedList\r\n || config().blockquote)) {\r\n <tiptap-separator />\r\n } @if (config().bulletList) {\r\n <tiptap-button\r\n icon=\"format_list_bulleted\"\r\n [title]=\"t().bulletList\"\r\n [active]=\"isActive('bulletList')\"\r\n (onClick)=\"toggleBulletList()\"\r\n />\r\n } @if (config().orderedList) {\r\n <tiptap-button\r\n icon=\"format_list_numbered\"\r\n [title]=\"t().orderedList\"\r\n [active]=\"isActive('orderedList')\"\r\n (onClick)=\"toggleOrderedList()\"\r\n />\r\n } @if (config().blockquote) {\r\n <tiptap-button\r\n icon=\"format_quote\"\r\n [title]=\"t().blockquote\"\r\n [active]=\"isActive('blockquote')\"\r\n (onClick)=\"toggleBlockquote()\"\r\n />\r\n } @if (config().separator && (config().alignLeft || config().alignCenter\r\n || config().alignRight || config().alignJustify)) {\r\n <tiptap-separator />\r\n } @if (config().alignLeft) {\r\n <tiptap-button\r\n icon=\"format_align_left\"\r\n [title]=\"t().alignLeft\"\r\n [active]=\"isActive('textAlign', { textAlign: 'left' })\"\r\n (onClick)=\"setTextAlign('left')\"\r\n />\r\n } @if (config().alignCenter) {\r\n <tiptap-button\r\n icon=\"format_align_center\"\r\n [title]=\"t().alignCenter\"\r\n [active]=\"isActive('textAlign', { textAlign: 'center' })\"\r\n (onClick)=\"setTextAlign('center')\"\r\n />\r\n } @if (config().alignRight) {\r\n <tiptap-button\r\n icon=\"format_align_right\"\r\n [title]=\"t().alignRight\"\r\n [active]=\"isActive('textAlign', { textAlign: 'right' })\"\r\n (onClick)=\"setTextAlign('right')\"\r\n />\r\n } @if (config().alignJustify) {\r\n <tiptap-button\r\n icon=\"format_align_justify\"\r\n [title]=\"t().alignJustify\"\r\n [active]=\"isActive('textAlign', { textAlign: 'justify' })\"\r\n (onClick)=\"setTextAlign('justify')\"\r\n />\r\n } @if (config().separator && (config().link || config().horizontalRule)) {\r\n <tiptap-separator />\r\n } @if (config().link) {\r\n <tiptap-button\r\n icon=\"link\"\r\n [title]=\"t().link\"\r\n [active]=\"isActive('link')\"\r\n (onClick)=\"toggleLink()\"\r\n />\r\n } @if (config().horizontalRule) {\r\n <tiptap-button\r\n icon=\"horizontal_rule\"\r\n [title]=\"t().horizontalRule\"\r\n (onClick)=\"insertHorizontalRule()\"\r\n />\r\n } @if (config().table) {\r\n <tiptap-button\r\n icon=\"table_view\"\r\n [title]=\"t().table\"\r\n (onClick)=\"insertTable()\"\r\n />\r\n } @if (config().separator && config().image) {\r\n <tiptap-separator />\r\n } @if (config().image) {\r\n <tiptap-button\r\n icon=\"image\"\r\n [title]=\"t().image\"\r\n (onClick)=\"insertImage()\"\r\n />\r\n } @if (config().separator && (config().undo || config().redo)) {\r\n <tiptap-separator />\r\n } @if (config().undo) {\r\n <tiptap-button\r\n icon=\"undo\"\r\n [title]=\"t().undo\"\r\n [disabled]=\"!canExecute('undo')\"\r\n (onClick)=\"undo()\"\r\n />\r\n } @if (config().redo) {\r\n <tiptap-button\r\n icon=\"redo\"\r\n [title]=\"t().redo\"\r\n [disabled]=\"!canExecute('redo')\"\r\n (onClick)=\"redo()\"\r\n />\r\n } @if (config().separator && config().clear) {\r\n <tiptap-separator />\r\n } @if (config().clear) {\r\n <tiptap-button\r\n icon=\"delete\"\r\n [title]=\"t().clear\"\r\n (onClick)=\"clearContent()\"\r\n />\r\n }\r\n </div>\r\n `,\r\n styles: [\r\n `\r\n /* Styles de base pour la toolbar */\r\n .tiptap-toolbar {\r\n display: flex;\r\n align-items: center;\r\n gap: 4px;\r\n padding: 4px 8px;\r\n background: #f8f9fa;\r\n border-bottom: 1px solid #e2e8f0;\r\n flex-wrap: wrap;\r\n min-height: 32px;\r\n position: relative;\r\n }\r\n\r\n /* Groupe de boutons */\r\n .toolbar-group {\r\n display: flex;\r\n align-items: center;\r\n gap: 2px;\r\n padding: 0 4px;\r\n }\r\n\r\n /* Séparateur entre groupes */\r\n .toolbar-separator {\r\n width: 1px;\r\n height: 24px;\r\n background: #e2e8f0;\r\n margin: 0 4px;\r\n }\r\n\r\n /* Responsive */\r\n @media (max-width: 768px) {\r\n .tiptap-toolbar {\r\n padding: 6px 8px;\r\n gap: 2px;\r\n }\r\n\r\n .toolbar-group {\r\n gap: 1px;\r\n }\r\n }\r\n\r\n /* Animation d'apparition */\r\n @keyframes toolbarSlideIn {\r\n from {\r\n opacity: 0;\r\n transform: translateY(-10px);\r\n }\r\n to {\r\n opacity: 1;\r\n transform: translateY(0);\r\n }\r\n }\r\n\r\n .tiptap-toolbar {\r\n animation: toolbarSlideIn 0.3s cubic-bezier(0.4, 0, 0.2, 1);\r\n }\r\n `,\r\n ],\r\n})\r\nexport class TiptapToolbarComponent {\r\n editor = input.required<Editor>();\r\n config = input.required<ToolbarConfig>();\r\n\r\n // Outputs pour les événements d'image\r\n imageUploaded = output<ImageUploadResult>();\r\n imageError = output<string>();\r\n\r\n private imageService = inject(ImageService);\r\n private i18nService = inject(TiptapI18nService);\r\n\r\n // Computed values pour les traductions\r\n readonly t = this.i18nService.toolbar;\r\n\r\n constructor(private editorCommands: EditorCommandsService) {}\r\n\r\n isActive(name: string, attributes?: Record<string, any>): boolean {\r\n return this.editorCommands.isActive(this.editor(), name, attributes);\r\n }\r\n\r\n canExecute(command: string): boolean {\r\n return this.editorCommands.canExecute(this.editor(), command);\r\n }\r\n\r\n toggleBold() {\r\n this.editorCommands.toggleBold(this.editor());\r\n }\r\n toggleItalic() {\r\n this.editorCommands.toggleItalic(this.editor());\r\n }\r\n toggleStrike() {\r\n this.editorCommands.toggleStrike(this.editor());\r\n }\r\n toggleCode() {\r\n this.editorCommands.toggleCode(this.editor());\r\n }\r\n toggleHeading(level: 1 | 2 | 3) {\r\n this.editorCommands.toggleHeading(this.editor(), level);\r\n }\r\n toggleBulletList() {\r\n this.editorCommands.toggleBulletList(this.editor());\r\n }\r\n toggleOrderedList() {\r\n this.editorCommands.toggleOrderedList(this.editor());\r\n }\r\n toggleBlockquote() {\r\n this.editorCommands.toggleBlockquote(this.editor());\r\n }\r\n undo() {\r\n this.editorCommands.undo(this.editor());\r\n }\r\n redo() {\r\n this.editorCommands.redo(this.editor());\r\n }\r\n\r\n // Nouvelles méthodes pour les formatages supplémentaires\r\n toggleUnderline() {\r\n this.editorCommands.toggleUnderline(this.editor());\r\n }\r\n toggleSuperscript() {\r\n this.editorCommands.toggleSuperscript(this.editor());\r\n }\r\n toggleSubscript() {\r\n this.editorCommands.toggleSubscript(this.editor());\r\n }\r\n setTextAlign(alignment: \"left\" | \"center\" | \"right\" | \"justify\") {\r\n this.editorCommands.setTextAlign(this.editor(), alignment);\r\n }\r\n toggleLink() {\r\n this.editorCommands.toggleLink(this.editor());\r\n }\r\n insertHorizontalRule() {\r\n this.editorCommands.insertHorizontalRule(this.editor());\r\n }\r\n toggleHighlight() {\r\n this.editorCommands.toggleHighlight(this.editor());\r\n }\r\n\r\n // Méthode pour insérer un tableau\r\n insertTable() {\r\n this.editorCommands.insertTable(this.editor());\r\n }\r\n\r\n // Méthode pour insérer une image\r\n async insertImage() {\r\n try {\r\n await this.imageService.selectAndUploadImage(this.editor());\r\n } catch (error) {\r\n console.error(\"Erreur lors de l'upload d'image:\", error);\r\n this.imageError.emit(\"Erreur lors de l'upload d'image\");\r\n }\r\n }\r\n\r\n // Méthode pour vider le contenu\r\n clearContent() {\r\n this.editorCommands.clearContent(this.editor());\r\n }\r\n\r\n // Méthodes pour les événements d'image (conservées pour compatibilité)\r\n onImageSelected(result: ImageUploadResult) {\r\n this.imageUploaded.emit(result);\r\n }\r\n\r\n onImageError(error: string) {\r\n this.imageError.emit(error);\r\n }\r\n}\r\n","import {\n Component,\n input,\n output,\n ViewChild,\n ElementRef,\n OnInit,\n OnDestroy,\n effect,\n computed,\n inject,\n signal,\n} from \"@angular/core\";\nimport tippy, { Instance as TippyInstance } from \"tippy.js\";\nimport type { Editor } from \"@tiptap/core\";\nimport { ImageService, ImageUploadResult } from \"./services/image.service\";\nimport { Plugin, PluginKey } from \"prosemirror-state\";\nimport { EditorView } from \"prosemirror-view\";\n\nexport interface SlashCommandItem {\n title: string;\n description: string;\n icon: string;\n keywords: string[];\n command: (editor: Editor) => void;\n}\n\nexport interface SlashCommandsConfig {\n commands?: SlashCommandItem[];\n}\n\nexport const DEFAULT_SLASH_COMMANDS: SlashCommandItem[] = [\n {\n title: \"Titre 1\",\n description: \"Grand titre de section\",\n icon: \"format_h1\",\n keywords: [\"heading\", \"h1\", \"titre\", \"title\", \"1\"],\n command: (editor) =>\n editor.chain().focus().toggleHeading({ level: 1 }).run(),\n },\n {\n title: \"Titre 2\",\n description: \"Titre de sous-section\",\n icon: \"format_h2\",\n keywords: [\"heading\", \"h2\", \"titre\", \"title\", \"2\"],\n command: (editor) =>\n editor.chain().focus().toggleHeading({ level: 2 }).run(),\n },\n {\n title: \"Titre 3\",\n description: \"Petit titre\",\n icon: \"format_h3\",\n keywords: [\"heading\", \"h3\", \"titre\", \"title\", \"3\"],\n command: (editor) =>\n editor.chain().focus().toggleHeading({ level: 3 }).run(),\n },\n {\n title: \"Liste à puces\",\n description: \"Créer une liste à puces\",\n icon: \"format_list_bulleted\",\n keywords: [\"bullet\", \"list\", \"liste\", \"puces\", \"ul\"],\n command: (editor) => editor.chain().focus().toggleBulletList().run(),\n },\n {\n title: \"Liste numérotée\",\n description: \"Créer une liste numérotée\",\n icon: \"format_list_numbered\",\n keywords: [\"numbered\", \"list\", \"liste\", \"numérotée\", \"ol\", \"ordered\"],\n command: (editor) => editor.chain().focus().toggleOrderedList().run(),\n },\n {\n title: \"Citation\",\n description: \"Ajouter une citation\",\n icon: \"format_quote\",\n keywords: [\"quote\", \"blockquote\", \"citation\"],\n command: (editor) => editor.chain().focus().toggleBlockquote().run(),\n },\n {\n title: \"Code\",\n description: \"Bloc de code\",\n icon: \"code\",\n keywords: [\"code\", \"codeblock\", \"pre\"],\n command: (editor) => editor.chain().focus().toggleCodeBlock().run(),\n },\n {\n title: \"Image\",\n description: \"Insérer une image\",\n icon: \"image\",\n keywords: [\"image\", \"photo\", \"picture\", \"img\"],\n command: (editor) => {\n // Créer un input file temporaire pour sélectionner une image\n const input = document.createElement(\"input\");\n input.type = \"file\";\n input.accept = \"image/*\";\n input.style.display = \"none\";\n\n input.addEventListener(\"change\", async (e) => {\n const file = (e.target as HTMLInputElement).files?.[0];\n if (file && file.type.startsWith(\"image/\")) {\n try {\n // Utiliser la méthode de compression unifiée\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n const img = new Image();\n\n img.onload = () => {\n // Vérifier les dimensions (max 1920x1080)\n const maxWidth = 1920;\n const maxHeight = 1080;\n let { width, height } = img;\n\n // Redimensionner si nécessaire\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\n // Dessiner l'image redimensionnée\n ctx?.drawImage(img, 0, 0, width, height);\n\n // Convertir en base64 avec compression\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 if (base64) {\n // Utiliser setResizableImage avec toutes les propriétés\n editor\n .chain()\n .focus()\n .setResizableImage({\n src: base64,\n alt: file.name,\n title: `${file.name} (${Math.round(\n width\n )}×${Math.round(height)})`,\n width: Math.round(width),\n height: Math.round(height),\n })\n .run();\n }\n };\n reader.readAsDataURL(blob);\n }\n },\n file.type,\n 0.8 // qualité de compression\n );\n };\n\n img.onerror = () => {\n console.error(\"Erreur lors du chargement de l'image\");\n };\n\n img.src = URL.createObjectURL(file);\n } catch (error) {\n console.error(\"Erreur lors de l'upload:\", error);\n }\n }\n document.body.removeChild(input);\n });\n\n document.body.appendChild(input);\n input.click();\n },\n },\n {\n title: \"Ligne horizontale\",\n description: \"Ajouter une ligne de séparation\",\n icon: \"horizontal_rule\",\n keywords: [\"hr\", \"horizontal\", \"rule\", \"ligne\", \"séparation\"],\n command: (editor) => editor.chain().focus().setHorizontalRule().run(),\n },\n];\n\n@Component({\n selector: \"tiptap-slash-commands\",\n standalone: true,\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 (click)=\"executeCommand(command)\"\n (mouseenter)=\"selectedIndex.set($index)\"\n >\n <div class=\"slash-command-icon\">\n <span class=\"material-symbols-outlined\">{{ command.icon }}</span>\n </div>\n <div class=\"slash-command-content\">\n <div class=\"slash-command-title\">{{ command.title }}</div>\n <div class=\"slash-command-description\">{{ command.description }}</div>\n </div>\n </div>\n }\n </div>\n `,\n styles: [\n `\n .slash-commands-menu {\n background: white;\n border: 1px solid #e2e8f0;\n border-radius: 8px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n padding: 8px;\n max-height: 300px;\n overflow-y: auto;\n min-width: 280px;\n outline: none;\n }\n\n .slash-command-item {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 8px 12px;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.2s ease;\n border: 2px solid transparent;\n outline: none;\n }\n\n .slash-command-item:hover {\n background: #f1f5f9;\n border-color: #e2e8f0;\n }\n\n .slash-command-item.selected {\n background: #e6f3ff;\n border-color: #3182ce;\n box-shadow: 0 0 0 1px #3182ce;\n }\n\n .slash-command-item:focus {\n outline: 2px solid #3182ce;\n outline-offset: 2px;\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: #f8f9fa;\n border-radius: 6px;\n color: #3182ce;\n flex-shrink: 0;\n }\n\n .slash-command-icon .material-symbols-outlined {\n font-size: 18px;\n }\n\n .slash-command-content {\n flex: 1;\n min-width: 0;\n }\n\n .slash-command-title {\n font-weight: 600;\n color: #2d3748;\n font-size: 14px;\n margin-bottom: 2px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .slash-command-description {\n color: #718096;\n font-size: 12px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n `,\n ],\n})\nexport class TiptapSlashCommandsComponent implements OnInit, OnDestroy {\n editor = input.required<Editor>();\n config = input<SlashCommandsConfig>({\n commands: DEFAULT_SLASH_COMMANDS,\n });\n\n // Output pour l'upload d'image\n imageUploadRequested = output<File>();\n\n @ViewChild(\"menuRef\", { static: false }) menuRef!: ElementRef<HTMLDivElement>;\n\n private tippyInstance: TippyInstance | null = null;\n private imageService = inject(ImageService);\n\n // État local\n private isActive = false;\n private currentQuery = signal(\"\");\n private slashRange: { from: number; to: number } | null = null;\n\n // Signal pour l'index sélectionné\n selectedIndex = signal(0);\n\n commands = computed(() => {\n const configCommands = this.config().commands || DEFAULT_SLASH_COMMANDS;\n // Remplacer la commande image par une version qui utilise l'output\n return configCommands.map((command) => {\n if (command.icon === \"image\") {\n return {\n ...command,\n command: (editor: Editor) => {\n // Créer un input file temporaire\n const input = document.createElement(\"input\");\n input.type = \"file\";\n input.accept = \"image/*\";\n input.style.display = \"none\";\n\n input.addEventListener(\"change\", (e) => {\n const file = (e.target as HTMLInputElement).files?.[0];\n if (file && file.type.startsWith(\"image/\")) {\n this.imageUploadRequested.emit(file);\n }\n document.body.removeChild(input);\n });\n\n document.body.appendChild(input);\n input.click();\n },\n };\n }\n return command;\n });\n });\n\n filteredCommands = computed(() => {\n const query = this.currentQuery().toLowerCase();\n const commands = this.commands();\n\n if (!query) {\n return commands;\n }\n\n return commands.filter(\n (command) =>\n command.title.toLowerCase().includes(query) ||\n command.description.toLowerCase().includes(query) ||\n command.keywords.some((keyword) =>\n keyword.toLowerCase().includes(query)\n )\n );\n });\n\n constructor() {\n effect(() => {\n const ed = this.editor();\n if (!ed) return;\n\n // Nettoyer les anciens 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 // Ajouter les nouveaux 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 // Utiliser le système de plugins ProseMirror pour intercepter les touches\n this.addKeyboardPlugin(ed);\n\n // Ne pas appeler updateMenu() ici pour éviter l'affichage prématuré\n // Il sera appelé automatiquement quand l'éditeur sera prêt\n });\n }\n\n ngOnInit() {\n this.initTippy();\n }\n\n ngOnDestroy() {\n const ed = this.editor();\n if (ed) {\n ed.off(\"selectionUpdate\", this.updateMenu);\n ed.off(\"transaction\", this.updateMenu);\n ed.off(\"focus\", this.updateMenu);\n ed.off(\"blur\", this.handleBlur);\n }\n\n if (this.tippyInstance) {\n this.tippyInstance.destroy();\n this.tippyInstance = null;\n }\n }\n\n private initTippy() {\n if (!this.menuRef?.nativeElement) {\n setTimeout(() => this.initTippy(), 50);\n return;\n }\n\n const menuElement = this.menuRef.nativeElement;\n\n if (this.tippyInstance) {\n this.tippyInstance.destroy();\n }\n\n this.tippyInstance = tippy(document.body, {\n content: menuElement,\n trigger: \"manual\",\n placement: \"bottom-start\",\n appendTo: () => document.body,\n interactive: true,\n arrow: false,\n offset: [0, 8],\n hideOnClick: true,\n getReferenceClientRect: () => this.getSlashRect(),\n // Améliorer le positionnement avec scroll\n popperOptions: {\n modifiers: [\n {\n name: \"preventOverflow\",\n options: {\n boundary: \"viewport\",\n padding: 8,\n },\n },\n {\n name: \"flip\",\n options: {\n fallbackPlacements: [\"top-start\", \"bottom-end\", \"top-end\"],\n },\n },\n ],\n },\n });\n\n // Maintenant que Tippy est initialisé, faire un premier check\n this.updateMenu();\n }\n\n private getSlashRect(): DOMRect {\n const ed = this.editor();\n if (!ed || !this.slashRange) {\n return new DOMRect(0, 0, 0, 0);\n }\n\n try {\n // Utiliser les coordonnées ProseMirror pour plus de précision\n const coords = ed.view.coordsAtPos(this.slashRange.from);\n return new DOMRect(\n coords.left,\n coords.top,\n 0,\n coords.bottom - coords.top\n );\n } catch (error) {\n console.warn(\"Erreur lors du calcul des coordonnées:\", error);\n // Fallback sur window.getSelection\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) {\n return new DOMRect(0, 0, 0, 0);\n }\n const range = selection.getRangeAt(0);\n return range.getBoundingClientRect();\n }\n }\n\n updateMenu = () => {\n const ed = this.editor();\n if (!ed) return;\n\n const { from } = ed.state.selection;\n\n // Vérifier si on a tapé '/' au début d'une ligne ou après un espace\n const textBefore = ed.state.doc.textBetween(\n Math.max(0, from - 20),\n from,\n \"\\n\"\n );\n const slashMatch = textBefore.match(/(?:^|\\s)\\/([^\\/\\s]*)$/);\n\n if (slashMatch) {\n const query = slashMatch[1] || \"\";\n const wasActive = this.isActive;\n\n this.currentQuery.set(query);\n this.slashRange = {\n from: from - slashMatch[0].length + slashMatch[0].indexOf(\"/\"),\n to: from,\n };\n\n // Si le menu vient de devenir actif, réinitialiser l'index\n if (!wasActive) {\n this.selectedIndex.set(0);\n }\n\n this.isActive = true;\n this.showTippy();\n } else {\n this.isActive = false;\n this.hideTippy();\n }\n };\n\n handleBlur = () => {\n setTimeout(() => this.hideTippy(), 100);\n };\n\n handleKeyDown = (event: KeyboardEvent) => {\n // Ne gérer les touches que si le menu est actif\n if (!this.isActive || this.filteredCommands().length === 0) {\n return;\n }\n\n switch (event.key) {\n case \"ArrowDown\":\n event.preventDefault();\n event.stopPropagation();\n const nextIndex =\n (this.selectedIndex() + 1) % this.filteredCommands().length;\n this.selectedIndex.set(nextIndex);\n this.scrollToSelected();\n break;\n\n case \"ArrowUp\":\n event.preventDefault();\n event.stopPropagation();\n const prevIndex =\n this.selectedIndex() === 0\n ? this.filteredCommands().length - 1\n : this.selectedIndex() - 1;\n this.selectedIndex.set(prevIndex);\n this.scrollToSelected();\n break;\n\n case \"Enter\":\n event.preventDefault();\n event.stopPropagation();\n const selectedCommand = this.filteredCommands()[this.selectedIndex()];\n if (selectedCommand) {\n this.executeCommand(selectedCommand);\n }\n break;\n\n case \"Escape\":\n event.preventDefault();\n event.stopPropagation();\n this.isActive = false;\n this.hideTippy();\n // Optionnel : supprimer le \"/\" tapé\n const ed = this.editor();\n if (ed && this.slashRange) {\n const { tr } = ed.state;\n tr.delete(this.slashRange.from, this.slashRange.to);\n ed.view.dispatch(tr);\n }\n break;\n }\n };\n\n private scrollToSelected() {\n // Faire défiler vers l'élément sélectionné\n if (this.menuRef?.nativeElement) {\n const selectedItem = this.menuRef.nativeElement.querySelector(\n \".slash-command-item.selected\"\n ) as HTMLElement;\n if (selectedItem) {\n selectedItem.scrollIntoView({ block: \"nearest\", behavior: \"smooth\" });\n }\n }\n }\n\n private showTippy() {\n if (this.tippyInstance && this.filteredCommands().length > 0) {\n this.tippyInstance.show();\n }\n }\n\n private hideTippy() {\n if (this.tippyInstance) {\n this.tippyInstance.hide();\n }\n }\n\n executeCommand(command: SlashCommandItem) {\n const ed = this.editor();\n if (!ed || !this.slashRange) return;\n\n // Supprimer le texte slash\n const { tr } = ed.state;\n tr.delete(this.slashRange.from, this.slashRange.to);\n ed.view.dispatch(tr);\n\n // Cacher le menu\n this.hideTippy();\n\n // Exécuter la commande\n setTimeout(() => {\n command.command(ed);\n }, 10);\n }\n\n private addKeyboardPlugin(ed: Editor) {\n // Ajouter un plugin ProseMirror pour intercepter les événements clavier\n const keyboardPlugin = new Plugin({\n key: new PluginKey(\"slash-commands-keyboard\"),\n props: {\n handleKeyDown: (view: EditorView, event: KeyboardEvent) => {\n // Ne gérer que si le menu est actif\n if (!this.isActive || this.filteredCommands().length === 0) {\n return false;\n }\n\n switch (event.key) {\n case \"ArrowDown\":\n event.preventDefault();\n const nextIndex =\n (this.selectedIndex() + 1) % this.filteredCommands().length;\n this.selectedIndex.set(nextIndex);\n this.scrollToSelected();\n return true;\n\n case \"ArrowUp\":\n event.preventDefault();\n const prevIndex =\n this.selectedIndex() === 0\n ? this.filteredCommands().length - 1\n : this.selectedIndex() - 1;\n this.selectedIndex.set(prevIndex);\n this.scrollToSelected();\n return true;\n\n case \"Enter\":\n event.preventDefault();\n const selectedCommand =\n this.filteredCommands()[this.selectedIndex()];\n if (selectedCommand) {\n this.executeCommand(selectedCommand);\n }\n return true;\n\n case \"Escape\":\n event.preventDefault();\n this.isActive = false;\n this.hideTippy();\n // Supprimer le \"/\" tapé\n if (this.slashRange) {\n const { tr } = view.state;\n tr.delete(this.slashRange.from, this.slashRange.to);\n view.dispatch(tr);\n }\n return true;\n }\n\n return false;\n },\n },\n });\n\n // Ajouter le plugin à l'éditeur\n ed.view.updateState(\n ed.view.state.reconfigure({\n plugins: [keyboardPlugin, ...ed.view.state.plugins],\n })\n );\n }\n}\n","// Main component\r\nexport { AngularTiptapEditorComponent } from \"./tiptap-editor.component\";\r\n\r\n// Bubble menus\r\nexport { TiptapBubbleMenuComponent } from \"./tiptap-bubble-menu.component\";\r\nexport { TiptapImageBubbleMenuComponent } from \"./tiptap-image-bubble-menu.component\";\r\nexport { TiptapTableBubbleMenuComponent } from \"./tiptap-table-bubble-menu.component\";\r\nexport { TiptapCellBubbleMenuComponent } from \"./tiptap-cell-bubble-menu.component\";\r\n\r\n// Toolbar components\r\nexport { TiptapToolbarComponent } from \"./tiptap-toolbar.component\";\r\nexport { TiptapButtonComponent } from \"./tiptap-button.component\";\r\nexport { TiptapSeparatorComponent } from \"./tiptap-separator.component\";\r\n\r\n// Slash commands\r\nexport { TiptapSlashCommandsComponent } from \"./tiptap-slash-commands.component\";\r\n\r\n// Services\r\nexport { TiptapI18nService } from \"./services/i18n.service\";\r\nexport { EditorCommandsService } from \"./services/editor-commands.service\";\r\nexport { ImageService } from \"./services/image.service\";\r\n\r\n// Models and types\r\nexport type {\r\n BubbleMenuConfig,\r\n ImageBubbleMenuConfig,\r\n TableBubbleMenuConfig,\r\n CellBubbleMenuConfig,\r\n} from \"./models/bubble-menu.model\";\r\n","import { Component, input, output, signal, computed } from \"@angular/core\";\nimport { TiptapButtonComponent } from \"./tiptap-button.component\";\nimport { ImageUploadResult } from \"./services/image.service\";\n\nexport interface ImageUploadConfig {\n maxSize?: number; // en MB\n maxWidth?: number; // largeur max en px\n maxHeight?: number; // hauteur max en px\n allowedTypes?: string[];\n enableDragDrop?: boolean;\n showPreview?: boolean;\n multiple?: boolean;\n compressImages?: boolean; // compression automatique\n quality?: number; // qualité de compression (0-1)\n}\n\n@Component({\n selector: \"tiptap-image-upload\",\n standalone: true,\n imports: [TiptapButtonComponent],\n template: `\n <div class=\"image-upload-container\">\n <!-- Bouton d'upload -->\n <tiptap-button\n icon=\"image\"\n title=\"Ajouter une image\"\n [disabled]=\"isUploading()\"\n (onClick)=\"triggerFileInput()\"\n />\n\n <!-- Input file caché -->\n <input\n #fileInput\n type=\"file\"\n [accept]=\"acceptedTypes()\"\n [multiple]=\"config().multiple\"\n (change)=\"onFileSelected($event)\"\n style=\"display: none;\"\n />\n\n <!-- Zone de drag & drop -->\n @if (config().enableDragDrop && isDragOver()) {\n <div\n class=\"drag-overlay\"\n (dragover)=\"onDragOver($event)\"\n (drop)=\"onDrop($event)\"\n (dragleave)=\"onDragLeave($event)\"\n >\n <div class=\"drag-content\">\n <span class=\"material-symbols-outlined\">cloud_upload</span>\n <p>Déposez votre image ici</p>\n </div>\n </div>\n }\n\n <!-- Barre de progression -->\n @if (isUploading() && uploadProgress() > 0) {\n <div class=\"upload-progress\">\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 }\n\n <!-- Prévisualisation -->\n @if (config().showPreview && previewImage()) {\n <div class=\"image-preview\">\n <img [src]=\"previewImage()\" alt=\"Prévisualisation\" />\n <div class=\"preview-info\">\n <span>{{ previewInfo() }}</span>\n </div>\n <button\n class=\"preview-close\"\n (click)=\"clearPreview()\"\n title=\"Fermer la prévisualisation\"\n >\n <span class=\"material-symbols-outlined\">close</span>\n </button>\n </div>\n }\n\n <!-- Messages d'erreur -->\n @if (errorMessage()) {\n <div class=\"error-message\">\n <span class=\"material-symbols-outlined\">error</span>\n {{ errorMessage() }}\n </div>\n }\n </div>\n `,\n styles: [\n `\n .image-upload-container {\n position: relative;\n display: inline-block;\n }\n\n .drag-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(49, 130, 206, 0.1);\n border: 2px dashed #3182ce;\n border-radius: 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n backdrop-filter: blur(2px);\n }\n\n .drag-content {\n text-align: center;\n color: #3182ce;\n font-weight: 600;\n }\n\n .drag-content .material-symbols-outlined {\n font-size: 48px;\n margin-bottom: 16px;\n }\n\n .drag-content p {\n margin: 0;\n font-size: 18px;\n }\n\n .upload-progress {\n position: absolute;\n top: 100%;\n left: 0;\n background: white;\n border: 1px solid #e2e8f0;\n border-radius: 8px;\n padding: 12px;\n margin-top: 8px;\n z-index: 100;\n min-width: 200px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n }\n\n .progress-bar {\n width: 100%;\n height: 6px;\n background: #e2e8f0;\n border-radius: 3px;\n overflow: hidden;\n margin-bottom: 8px;\n }\n\n .progress-fill {\n height: 100%;\n background: #3182ce;\n border-radius: 3px;\n transition: width 0.3s ease;\n }\n\n .progress-text {\n font-size: 12px;\n color: #4a5568;\n text-align: center;\n }\n\n .image-preview {\n position: absolute;\n top: 100%;\n left: 0;\n background: white;\n border: 1px solid #e2e8f0;\n border-radius: 8px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n padding: 8px;\n margin-top: 8px;\n z-index: 100;\n min-width: 200px;\n }\n\n .image-preview img {\n max-width: 200px;\n max-height: 150px;\n border-radius: 4px;\n display: block;\n }\n\n .preview-info {\n margin-top: 8px;\n font-size: 11px;\n color: #718096;\n text-align: center;\n }\n\n .preview-close {\n position: absolute;\n top: 4px;\n right: 4px;\n background: rgba(0, 0, 0, 0.7);\n color: white;\n border: none;\n border-radius: 50%;\n width: 24px;\n height: 24px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 14px;\n }\n\n .preview-close:hover {\n background: rgba(0, 0, 0, 0.9);\n }\n\n .error-message {\n position: absolute;\n top: 100%;\n left: 0;\n background: #fed7d7;\n color: #c53030;\n border: 1px solid #feb2b2;\n border-radius: 6px;\n padding: 8px 12px;\n margin-top: 8px;\n font-size: 12px;\n display: flex;\n align-items: center;\n gap: 6px;\n z-index: 100;\n min-width: 200px;\n }\n\n .error-message .material-symbols-outlined {\n font-size: 16px;\n }\n `,\n ],\n})\nexport class TiptapImageUploadComponent {\n // Inputs\n config = input<Partial<ImageUploadConfig>>({\n maxSize: 5, // 5MB par défaut\n maxWidth: 1920, // largeur max par défaut\n maxHeight: 1080, // hauteur max par défaut\n allowedTypes: [\"image/jpeg\", \"image/png\", \"image/gif\", \"image/webp\"],\n enableDragDrop: true,\n showPreview: true,\n multiple: false,\n compressImages: true,\n quality: 0.8,\n });\n\n // Outputs\n imageSelected = output<ImageUploadResult>();\n error = output<string>();\n\n // Signals internes\n isDragOver = signal(false);\n isUploading = signal(false);\n uploadProgress = signal(0);\n previewImage = signal<string | null>(null);\n previewInfo = signal<string>(\"\");\n errorMessage = signal<string | null>(null);\n\n // Computed\n acceptedTypes = computed(() => {\n const types = this.config().allowedTypes || [\"image/*\"];\n return types.join(\",\");\n });\n\n triggerFileInput() {\n const input = document.querySelector(\n 'input[type=\"file\"]'\n ) as HTMLInputElement;\n if (input) {\n input.click();\n }\n }\n\n onFileSelected(event: Event) {\n const input = event.target as HTMLInputElement;\n const files = input.files;\n\n if (files && files.length > 0) {\n this.processFiles(Array.from(files));\n }\n\n // Reset input\n input.value = \"\";\n }\n\n onDragOver(event: DragEvent) {\n event.preventDefault();\n event.stopPropagation();\n this.isDragOver.set(true);\n }\n\n onDrop(event: DragEvent) {\n event.preventDefault();\n event.stopPropagation();\n this.isDragOver.set(false);\n\n const files = event.dataTransfer?.files;\n if (files && files.length > 0) {\n this.processFiles(Array.from(files));\n }\n }\n\n onDragLeave(event: DragEvent) {\n event.preventDefault();\n event.stopPropagation();\n this.isDragOver.set(false);\n }\n\n private processFiles(files: File[]) {\n const config = this.config();\n const maxSize = (config.maxSize || 5) * 1024 * 1024; // Convertir en bytes\n const allowedTypes = config.allowedTypes || [\"image/*\"];\n\n // Vérifier le nombre de fichiers\n if (!config.multiple && files.length > 1) {\n this.showError(\"Veuillez sélectionner une seule image\");\n return;\n }\n\n // Traiter chaque fichier\n files.forEach((file) => {\n // Vérifier le type\n if (!this.isValidFileType(file, allowedTypes)) {\n this.showError(`Type de fichier non supporté: ${file.name}`);\n return;\n }\n\n // Vérifier la taille\n if (file.size > maxSize) {\n this.showError(\n `Fichier trop volumineux: ${file.name} (max ${config.maxSize}MB)`\n );\n return;\n }\n\n // Traiter l'image avec compression si nécessaire\n this.processImage(file);\n });\n }\n\n private isValidFileType(file: File, allowedTypes: string[]): boolean {\n if (allowedTypes.includes(\"image/*\")) {\n return file.type.startsWith(\"image/\");\n }\n return allowedTypes.includes(file.type);\n }\n\n private processImage(file: File) {\n this.isUploading.set(true);\n this.uploadProgress.set(10);\n\n const config = this.config();\n const originalSize = file.size;\n\n // Créer un canvas pour la compression\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n const img = new Image();\n\n img.onload = () => {\n this.uploadProgress.set(30);\n\n // Vérifier les dimensions\n const maxWidth = config.maxWidth || 1920;\n const maxHeight = config.maxHeight || 1080;\n\n let { width, height } = img;\n\n // Redimensionner si nécessaire\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\n // Dessiner l'image redimensionnée\n ctx?.drawImage(img, 0, 0, width, height);\n\n this.uploadProgress.set(70);\n\n // Convertir en base64 avec compression\n const quality = config.quality || 0.8;\n const mimeType = file.type;\n\n canvas.toBlob(\n (blob) => {\n this.uploadProgress.set(90);\n\n if (blob) {\n const reader = new FileReader();\n reader.onload = (e) => {\n const base64 = e.target?.result as string;\n if (base64) {\n const result: ImageUploadResult = {\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: originalSize,\n };\n\n // Afficher la prévisualisation si activée\n if (config.showPreview) {\n this.previewImage.set(base64);\n this.previewInfo.set(\n `${result.width}×${result.height} • ${this.formatFileSize(\n blob.size\n )}`\n );\n }\n\n // Émettre l'événement\n this.imageSelected.emit(result);\n this.clearError();\n }\n\n this.uploadProgress.set(100);\n setTimeout(() => {\n this.isUploading.set(false);\n this.uploadProgress.set(0);\n }, 500);\n };\n reader.readAsDataURL(blob);\n } else {\n this.showError(\"Erreur lors de la compression de l'image\");\n this.isUploading.set(false);\n this.uploadProgress.set(0);\n }\n },\n mimeType,\n quality\n );\n };\n\n img.onerror = () => {\n this.showError(\"Erreur lors du chargement de l'image\");\n this.isUploading.set(false);\n this.uploadProgress.set(0);\n };\n\n img.src = URL.createObjectURL(file);\n }\n\n private formatFileSize(bytes: number): string {\n if (bytes === 0) return \"0 B\";\n const k = 1024;\n const sizes = [\"B\", \"KB\", \"MB\", \"GB\"];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(1)) + \" \" + sizes[i];\n }\n\n private showError(message: string) {\n this.errorMessage.set(message);\n this.error.emit(message);\n this.isUploading.set(false);\n this.uploadProgress.set(0);\n\n // Auto-clear après 5 secondes\n setTimeout(() => {\n this.clearError();\n }, 5000);\n }\n\n private clearError() {\n this.errorMessage.set(null);\n }\n\n clearPreview() {\n this.previewImage.set(null);\n this.previewInfo.set(\"\");\n }\n}\n","import { Directive } from \"@angular/core\";\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from \"@angular/forms\";\r\n\r\n@Directive({\r\n standalone: true,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n multi: true,\r\n useExisting: NoopValueAccessorDirective,\r\n },\r\n ],\r\n})\r\nexport class NoopValueAccessorDirective implements ControlValueAccessor {\r\n writeValue(obj: any): void {}\r\n registerOnChange(fn: any): void {}\r\n registerOnTouched(fn: any): void {}\r\n}\r\n","import { Editor } from \"@tiptap/core\";\nimport { SlashCommandItem } from \"../tiptap-slash-commands.component\";\nimport { TiptapI18nService } from \"../services/i18n.service\";\n\n/**\n * Clés des commandes dans l'ordre de création\n */\nexport const SLASH_COMMAND_KEYS = [\n \"heading1\",\n \"heading2\",\n \"heading3\",\n \"bulletList\",\n \"orderedList\",\n \"blockquote\",\n \"code\",\n \"image\",\n \"horizontalRule\",\n \"table\",\n] as const;\n\n/**\n * Factory function pour créer les slash commands traduits\n */\nexport function createI18nSlashCommands(\n i18nService: TiptapI18nService\n): SlashCommandItem[] {\n const slashCommands = i18nService.slashCommands();\n\n return [\n {\n title: slashCommands.heading1.title,\n description: slashCommands.heading1.description,\n icon: \"format_h1\",\n keywords: slashCommands.heading1.keywords,\n command: (editor: Editor) =>\n editor.chain().focus().toggleHeading({ level: 1 }).run(),\n },\n {\n title: slashCommands.heading2.title,\n description: slashCommands.heading2.description,\n icon: \"format_h2\",\n keywords: slashCommands.heading2.keywords,\n command: (editor: Editor) =>\n editor.chain().focus().toggleHeading({ level: 2 }).run(),\n },\n {\n title: slashCommands.heading3.title,\n description: slashCommands.heading3.description,\n icon: \"format_h3\",\n keywords: slashCommands.heading3.keywords,\n command: (editor: Editor) =>\n editor.chain().focus().toggleHeading({ level: 3 }).run(),\n },\n {\n title: slashCommands.bulletList.title,\n description: slashCommands.bulletList.description,\n icon: \"format_list_bulleted\",\n keywords: slashCommands.bulletList.keywords,\n command: (editor: Editor) =>\n editor.chain().focus().toggleBulletList().run(),\n },\n {\n title: slashCommands.orderedList.title,\n description: slashCommands.orderedList.description,\n icon: \"format_list_numbered\",\n keywords: slashCommands.orderedList.keywords,\n command: (editor: Editor) =>\n editor.chain().focus().toggleOrderedList().run(),\n },\n {\n title: slashCommands.blockquote.title,\n description: slashCommands.blockquote.description,\n icon: \"format_quote\",\n keywords: slashCommands.blockquote.keywords,\n command: (editor: Editor) =>\n editor.chain().focus().toggleBlockquote().run(),\n },\n {\n title: slashCommands.code.title,\n description: slashCommands.code.description,\n icon: \"code\",\n keywords: slashCommands.code.keywords,\n command: (editor: Editor) =>\n editor.chain().focus().toggleCodeBlock().run(),\n },\n {\n title: slashCommands.image.title,\n description: slashCommands.image.description,\n icon: \"image\",\n keywords: slashCommands.image.keywords,\n command: (editor: Editor) => {\n // Créer un input file temporaire pour sélectionner une image\n const input = document.createElement(\"input\");\n input.type = \"file\";\n input.accept = \"image/*\";\n input.style.display = \"none\";\n\n input.addEventListener(\"change\", async (e) => {\n const file = (e.target as HTMLInputElement).files?.[0];\n if (file && file.type.startsWith(\"image/\")) {\n try {\n // Utiliser la méthode de compression unifiée\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n const img = new Image();\n\n img.onload = () => {\n // Vérifier les dimensions (max 1920x1080)\n const maxWidth = 1920;\n const maxHeight = 1080;\n let { width, height } = img;\n\n // Redimensionner si nécessaire\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\n // Dessiner l'image redimensionnée\n ctx?.drawImage(img, 0, 0, width, height);\n\n // Convertir en base64 avec compression\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 if (base64) {\n // Utiliser setResizableImage avec toutes les propriétés\n editor\n .chain()\n .focus()\n .setResizableImage({\n src: base64,\n alt: file.name,\n title: `${file.name} (${Math.round(\n width\n )}×${Math.round(height)})`,\n width: Math.round(width),\n height: Math.round(height),\n })\n .run();\n }\n };\n reader.readAsDataURL(blob);\n }\n },\n file.type,\n 0.8 // qualité de compression\n );\n };\n\n img.onerror = () => {\n console.error(i18nService.editor().imageLoadError);\n };\n\n img.src = URL.createObjectURL(file);\n } catch (error) {\n console.error(\"Error uploading image:\", error);\n }\n }\n document.body.removeChild(input);\n });\n\n document.body.appendChild(input);\n input.click();\n },\n },\n {\n title: slashCommands.horizontalRule.title,\n description: slashCommands.horizontalRule.description,\n icon: \"horizontal_rule\",\n keywords: slashCommands.horizontalRule.keywords,\n command: (editor: Editor) =>\n editor.chain().focus().setHorizontalRule().run(),\n },\n {\n title: slashCommands.table.title,\n description: slashCommands.table.description,\n icon: \"table_view\",\n keywords: slashCommands.table.keywords,\n command: (editor: Editor) =>\n editor.chain().focus().insertTable({ rows: 3, cols: 3 }).run(),\n },\n ];\n}\n\n/**\n * Fonction utilitaire pour filtrer les slash commands selon les commandes actives\n */\nexport function filterSlashCommands(\n activeCommands: Set<string>,\n i18nService: TiptapI18nService\n): SlashCommandItem[] {\n const allCommands = createI18nSlashCommands(i18nService);\n\n return allCommands.filter((command, index) => {\n const commandKey = SLASH_COMMAND_KEYS[index];\n return commandKey && activeCommands.has(commandKey);\n });\n}\n","import {\r\n Component,\r\n ElementRef,\r\n input,\r\n output,\r\n OnDestroy,\r\n viewChild,\r\n effect,\r\n signal,\r\n computed,\r\n AfterViewInit,\r\n inject,\r\n DestroyRef,\r\n} from \"@angular/core\";\r\nimport { takeUntilDestroyed } from \"@angular/core/rxjs-interop\";\r\nimport { Editor, Extension, Node, Mark } from \"@tiptap/core\";\r\nimport StarterKit from \"@tiptap/starter-kit\";\r\nimport Placeholder from \"@tiptap/extension-placeholder\";\r\nimport CharacterCount from \"@tiptap/extension-character-count\";\r\nimport Underline from \"@tiptap/extension-underline\";\r\nimport Superscript from \"@tiptap/extension-superscript\";\r\nimport Subscript from \"@tiptap/extension-subscript\";\r\nimport TextAlign from \"@tiptap/extension-text-align\";\r\nimport Link from \"@tiptap/extension-link\";\r\nimport Highlight from \"@tiptap/extension-highlight\";\r\nimport OfficePaste from \"@intevation/tiptap-extension-office-paste\";\r\n\r\nimport { ResizableImage } from \"./extensions/resizable-image.extension\";\r\nimport { UploadProgress } from \"./extensions/upload-progress.extension\";\r\nimport { TableExtension } from \"./extensions/table.extension\";\r\nimport { TiptapToolbarComponent } from \"./index\";\r\nimport { TiptapImageUploadComponent } from \"./tiptap-image-upload.component\";\r\nimport { TiptapBubbleMenuComponent } from \"./tiptap-bubble-menu.component\";\r\nimport { TiptapImageBubbleMenuComponent } from \"./tiptap-image-bubble-menu.component\";\r\nimport { TiptapTableBubbleMenuComponent } from \"./tiptap-table-bubble-menu.component\";\r\nimport {\r\n CellBubbleMenuConfig,\r\n TiptapCellBubbleMenuComponent,\r\n} from \"./tiptap-cell-bubble-menu.component\";\r\nimport {\r\n TiptapSlashCommandsComponent,\r\n SlashCommandsConfig,\r\n} from \"./tiptap-slash-commands.component\";\r\nimport { ImageService } from \"./services/image.service\";\r\nimport { TiptapI18nService, SupportedLocale } from \"./services/i18n.service\";\r\nimport { EditorCommandsService } from \"./services/editor-commands.service\";\r\nimport { NoopValueAccessorDirective } from \"./noop-value-accessor.directive\";\r\nimport { NgControl } from \"@angular/forms\";\r\nimport {\r\n filterSlashCommands,\r\n SLASH_COMMAND_KEYS,\r\n} from \"./config/i18n-slash-commands\";\r\n\r\nimport { ImageUploadResult } from \"./services/image.service\";\r\nimport { ToolbarConfig } from \"./tiptap-toolbar.component\";\r\nimport {\r\n BubbleMenuConfig,\r\n ImageBubbleMenuConfig,\r\n TableBubbleMenuConfig,\r\n} from \"./models/bubble-menu.model\";\r\nimport { concat, defer, of, tap } from \"rxjs\";\r\n\r\n// Configuration par défaut de la toolbar\r\nexport const DEFAULT_TOOLBAR_CONFIG: ToolbarConfig = {\r\n bold: true,\r\n italic: true,\r\n underline: true,\r\n strike: true,\r\n code: true,\r\n superscript: false,\r\n subscript: false,\r\n highlight: true,\r\n heading1: true,\r\n heading2: true,\r\n heading3: true,\r\n bulletList: true,\r\n orderedList: true,\r\n blockquote: true,\r\n alignLeft: false,\r\n alignCenter: false,\r\n alignRight: false,\r\n alignJustify: false,\r\n link: true,\r\n image: true,\r\n horizontalRule: true,\r\n table: true,\r\n undo: true,\r\n redo: true,\r\n clear: false, // Désactivé par défaut (opt-in)\r\n separator: true,\r\n};\r\n\r\n// Configuration par défaut du bubble menu\r\nexport const DEFAULT_BUBBLE_MENU_CONFIG: BubbleMenuConfig = {\r\n bold: true,\r\n italic: true,\r\n underline: true,\r\n strike: true,\r\n code: true,\r\n superscript: false,\r\n subscript: false,\r\n highlight: true,\r\n link: true,\r\n separator: true,\r\n};\r\n\r\n// Configuration par défaut du bubble menu image\r\nexport const DEFAULT_IMAGE_BUBBLE_MENU_CONFIG: ImageBubbleMenuConfig = {\r\n changeImage: true,\r\n resizeSmall: true,\r\n resizeMedium: true,\r\n resizeLarge: true,\r\n resizeOriginal: true,\r\n deleteImage: true,\r\n separator: true,\r\n};\r\n\r\n// Configuration par défaut du menu de table\r\nexport const DEFAULT_TABLE_MENU_CONFIG: TableBubbleMenuConfig = {\r\n addRowBefore: true,\r\n addRowAfter: true,\r\n deleteRow: true,\r\n addColumnBefore: true,\r\n addColumnAfter: true,\r\n deleteColumn: true,\r\n toggleHeaderRow: true,\r\n toggleHeaderColumn: true,\r\n deleteTable: true,\r\n separator: true,\r\n};\r\n\r\nexport const DEFAULT_CELL_MENU_CONFIG: CellBubbleMenuConfig = {\r\n mergeCells: true,\r\n splitCell: true,\r\n};\r\n\r\nexport const DEFAULT_SLASH_COMMANDS: SlashCommandsConfig = {\r\n commands: [], // Sera rempli par filterSlashCommands\r\n};\r\n\r\n@Component({\r\n selector: \"angular-tiptap-editor\",\r\n standalone: true,\r\n hostDirectives: [NoopValueAccessorDirective],\r\n imports: [\r\n TiptapToolbarComponent,\r\n TiptapImageUploadComponent,\r\n TiptapBubbleMenuComponent,\r\n TiptapImageBubbleMenuComponent,\r\n TiptapTableBubbleMenuComponent,\r\n TiptapCellBubbleMenuComponent,\r\n TiptapSlashCommandsComponent,\r\n ],\r\n template: `\r\n <div class=\"tiptap-editor\">\r\n <!-- Toolbar -->\r\n @if (showToolbar() && editor()) {\r\n <tiptap-toolbar [editor]=\"editor()!\" [config]=\"toolbarConfig()\">\r\n <div image-upload class=\"image-upload-container\">\r\n <tiptap-image-upload\r\n [config]=\"imageUploadConfig()\"\r\n (imageSelected)=\"onImageUploaded($event)\"\r\n (error)=\"onImageUploadError($event)\"\r\n />\r\n </div>\r\n </tiptap-toolbar>\r\n }\r\n\r\n <!-- Contenu de l'éditeur -->\r\n <div\r\n #editorElement\r\n class=\"tiptap-content\"\r\n [class.drag-over]=\"isDragOver()\"\r\n (dragover)=\"onDragOver($event)\"\r\n (drop)=\"onDrop($event)\"\r\n (click)=\"onEditorClick($event)\"\r\n ></div>\r\n\r\n <!-- Bubble Menu pour le texte -->\r\n @if (showBubbleMenu() && editor()) {\r\n <tiptap-bubble-menu\r\n [editor]=\"editor()!\"\r\n [config]=\"bubbleMenuConfig()\"\r\n [style.display]=\"editorFullyInitialized() ? 'block' : 'none'\"\r\n ></tiptap-bubble-menu>\r\n }\r\n\r\n <!-- Bubble Menu pour les images -->\r\n @if (showImageBubbleMenu() && editor()) {\r\n <tiptap-image-bubble-menu\r\n [editor]=\"editor()!\"\r\n [config]=\"imageBubbleMenuConfig()\"\r\n [style.display]=\"editorFullyInitialized() ? 'block' : 'none'\"\r\n ></tiptap-image-bubble-menu>\r\n }\r\n\r\n <!-- Slash Commands -->\r\n @if (enableSlashCommands() && editor()) {\r\n <tiptap-slash-commands\r\n [editor]=\"editor()!\"\r\n [config]=\"slashCommandsConfigComputed()\"\r\n [style.display]=\"editorFullyInitialized() ? 'block' : 'none'\"\r\n (imageUploadRequested)=\"onSlashCommandImageUpload($event)\"\r\n ></tiptap-slash-commands>\r\n }\r\n\r\n <!-- Table Menu -->\r\n @if (editor()) {\r\n <tiptap-table-bubble-menu\r\n [editor]=\"editor()!\"\r\n [config]=\"tableBubbleMenuConfig()\"\r\n [style.display]=\"editorFullyInitialized() ? 'block' : 'none'\"\r\n ></tiptap-table-bubble-menu>\r\n }\r\n\r\n <!-- Cell Menu -->\r\n @if (editor()) {\r\n <tiptap-cell-bubble-menu\r\n [editor]=\"editor()!\"\r\n [config]=\"cellBubbleMenuConfig()\"\r\n [style.display]=\"editorFullyInitialized() ? 'block' : 'none'\"\r\n ></tiptap-cell-bubble-menu>\r\n }\r\n\r\n <!-- Table Edit Button - Supprimé car remplacé par le menu bubble -->\r\n\r\n <!-- Compteur de caractères -->\r\n @if (showCharacterCount()) {\r\n <div class=\"character-count\">\r\n {{ characterCount() }}\r\n {{ i18nService.editor().character\r\n }}{{ characterCount() > 1 ? \"s\" : \"\" }}, {{ wordCount() }}\r\n {{ i18nService.editor().word }}{{ wordCount() > 1 ? \"s\" : \"\" }}\r\n @if (maxCharacters()) { /\r\n {{ maxCharacters() }}\r\n }\r\n </div>\r\n }\r\n </div>\r\n `,\r\n\r\n styles: [\r\n `\r\n /* Styles de base pour l'éditeur Tiptap */\r\n\r\n /* Conteneur principal de l'éditeur */\r\n .tiptap-editor {\r\n border: 2px solid #e2e8f0;\r\n border-radius: 8px;\r\n background: white;\r\n overflow: hidden;\r\n transition: border-color 0.2s ease;\r\n }\r\n\r\n .tiptap-editor:focus-within {\r\n border-color: #3182ce;\r\n }\r\n\r\n /* Contenu de l'éditeur */\r\n .tiptap-content {\r\n padding: 16px;\r\n min-height: var(--editor-min-height, 200px);\r\n height: var(--editor-height, auto);\r\n max-height: var(--editor-max-height, none);\r\n overflow-y: var(--editor-overflow, visible);\r\n outline: none;\r\n position: relative;\r\n }\r\n\r\n .tiptap-content.drag-over {\r\n background: #f0f8ff;\r\n border: 2px dashed #3182ce;\r\n }\r\n\r\n /* Compteur de caractères */\r\n .character-count {\r\n padding: 8px 16px;\r\n font-size: 12px;\r\n color: #718096;\r\n text-align: right;\r\n border-top: 1px solid #e2e8f0;\r\n background: #f8f9fa;\r\n }\r\n\r\n /* Styles spécifiques au composant */\r\n .image-upload-container {\r\n position: relative;\r\n display: inline-block;\r\n }\r\n\r\n /* Styles ProseMirror avec :host ::ng-deep */\r\n :host ::ng-deep .ProseMirror {\r\n outline: none;\r\n line-height: 1.6;\r\n color: #2d3748;\r\n min-height: 100%;\r\n height: 100%;\r\n /* S'assurer que le contenu s'étend correctement dans un conteneur scrollable */\r\n word-wrap: break-word;\r\n overflow-wrap: break-word;\r\n }\r\n\r\n /* Titres */\r\n :host ::ng-deep .ProseMirror h1 {\r\n font-size: 2em;\r\n font-weight: bold;\r\n margin-top: 0;\r\n margin-bottom: 0.5em;\r\n }\r\n\r\n :host ::ng-deep .ProseMirror h2 {\r\n font-size: 1.5em;\r\n font-weight: bold;\r\n margin-top: 1em;\r\n margin-bottom: 0.5em;\r\n }\r\n\r\n :host ::ng-deep .ProseMirror h3 {\r\n font-size: 1.25em;\r\n font-weight: bold;\r\n margin-top: 1em;\r\n margin-bottom: 0.5em;\r\n }\r\n\r\n /* Paragraphes et listes */\r\n :host ::ng-deep .ProseMirror p {\r\n margin: 0.5em 0;\r\n }\r\n\r\n :host ::ng-deep .ProseMirror ul,\r\n :host ::ng-deep .ProseMirror ol {\r\n padding-left: 2em;\r\n margin: 0.5em 0;\r\n }\r\n\r\n /* Citations */\r\n :host ::ng-deep .ProseMirror blockquote {\r\n border-left: 4px solid #e2e8f0;\r\n padding-left: 1em;\r\n margin: 1em 0;\r\n font-style: italic;\r\n background: #f8f9fa;\r\n padding: 0.5em 1em;\r\n border-radius: 0 4px 4px 0;\r\n }\r\n\r\n /* Code */\r\n :host ::ng-deep .ProseMirror code {\r\n background: #f1f5f9;\r\n padding: 0.2em 0.4em;\r\n border-radius: 3px;\r\n font-family: \"Monaco\", \"Consolas\", monospace;\r\n font-size: 0.9em;\r\n }\r\n\r\n :host ::ng-deep .ProseMirror pre {\r\n background: #1a202c;\r\n color: #e2e8f0;\r\n padding: 1em;\r\n border-radius: 6px;\r\n overflow-x: auto;\r\n margin: 1em 0;\r\n }\r\n\r\n :host ::ng-deep .ProseMirror pre code {\r\n background: none;\r\n color: inherit;\r\n padding: 0;\r\n }\r\n\r\n /* Placeholder */\r\n :host ::ng-deep .ProseMirror p.is-editor-empty:first-child::before {\r\n content: attr(data-placeholder);\r\n color: #a0aec0;\r\n pointer-events: none;\r\n float: left;\r\n height: 0;\r\n }\r\n\r\n /* Mode lecture seule */\r\n :host ::ng-deep .ProseMirror[contenteditable=\"false\"] {\r\n pointer-events: none;\r\n }\r\n\r\n :host ::ng-deep .ProseMirror[contenteditable=\"false\"] img {\r\n cursor: default;\r\n pointer-events: none;\r\n }\r\n\r\n :host ::ng-deep .ProseMirror[contenteditable=\"false\"] img:hover {\r\n transform: none;\r\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\r\n }\r\n\r\n :host\r\n ::ng-deep\r\n .ProseMirror[contenteditable=\"false\"]\r\n img.ProseMirror-selectednode {\r\n outline: none;\r\n }\r\n\r\n /* Styles pour les images */\r\n :host ::ng-deep .ProseMirror img {\r\n position: relative;\r\n display: inline-block;\r\n max-width: 100%;\r\n height: auto;\r\n cursor: pointer;\r\n transition: all 0.2s ease;\r\n border: 2px solid transparent;\r\n border-radius: 8px;\r\n }\r\n\r\n :host ::ng-deep .ProseMirror img:hover {\r\n border-color: #e2e8f0;\r\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\r\n }\r\n\r\n :host ::ng-deep .ProseMirror img.ProseMirror-selectednode {\r\n border-color: #3182ce;\r\n box-shadow: 0 0 0 3px rgba(49, 130, 206, 0.1);\r\n transition: all 0.2s ease;\r\n }\r\n\r\n /* Images avec classe tiptap-image */\r\n :host ::ng-deep .ProseMirror .tiptap-image {\r\n max-width: 100%;\r\n height: auto;\r\n border-radius: 16px;\r\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08);\r\n margin: 0.5em 0;\r\n cursor: pointer;\r\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\r\n display: block;\r\n filter: brightness(1) contrast(1);\r\n }\r\n\r\n :host ::ng-deep .ProseMirror .tiptap-image:hover {\r\n box-shadow: 0 8px 30px rgba(0, 0, 0, 0.12);\r\n filter: brightness(1.02) contrast(1.02);\r\n }\r\n\r\n :host ::ng-deep .ProseMirror .tiptap-image.ProseMirror-selectednode {\r\n outline: 2px solid #6366f1;\r\n outline-offset: 2px;\r\n border-radius: 16px;\r\n box-shadow: 0 0 0 4px rgba(99, 102, 241, 0.1);\r\n }\r\n\r\n /* Conteneurs d'images avec alignement */\r\n :host ::ng-deep .image-container {\r\n margin: 0.5em 0;\r\n text-align: center;\r\n border-radius: 16px;\r\n overflow: hidden;\r\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\r\n }\r\n\r\n :host ::ng-deep .image-container.image-align-left {\r\n text-align: left;\r\n }\r\n\r\n :host ::ng-deep .image-container.image-align-center {\r\n text-align: center;\r\n }\r\n\r\n :host ::ng-deep .image-container.image-align-right {\r\n text-align: right;\r\n }\r\n\r\n :host ::ng-deep .image-container img {\r\n display: inline-block;\r\n max-width: 100%;\r\n height: auto;\r\n border-radius: 16px;\r\n }\r\n\r\n /* Conteneur pour les images redimensionnables */\r\n :host ::ng-deep .resizable-image-container {\r\n position: relative;\r\n display: inline-block;\r\n margin: 0.5em 0;\r\n }\r\n\r\n /* Conteneur des contrôles de redimensionnement */\r\n :host ::ng-deep .resize-controls {\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n bottom: 0;\r\n pointer-events: none;\r\n z-index: 1000;\r\n }\r\n\r\n /* Poignées de redimensionnement */\r\n :host ::ng-deep .resize-handle {\r\n position: absolute;\r\n width: 12px;\r\n height: 12px;\r\n background: #3b82f6;\r\n border: 2px solid white;\r\n border-radius: 50%;\r\n pointer-events: all;\r\n cursor: pointer;\r\n z-index: 1001;\r\n transition: all 0.15s ease;\r\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.2);\r\n }\r\n\r\n :host ::ng-deep .resize-handle:hover {\r\n background: #2563eb;\r\n box-shadow: 0 3px 8px rgba(0, 0, 0, 0.3);\r\n }\r\n\r\n :host ::ng-deep .resize-handle:active {\r\n background: #1d4ed8;\r\n }\r\n\r\n /* Poignées du milieu avec scale séparé */\r\n :host ::ng-deep .resize-handle-n:hover,\r\n :host ::ng-deep .resize-handle-s:hover {\r\n transform: translateX(-50%) scale(1.2);\r\n }\r\n\r\n :host ::ng-deep .resize-handle-w:hover,\r\n :host ::ng-deep .resize-handle-e:hover {\r\n transform: translateY(-50%) scale(1.2);\r\n }\r\n\r\n :host ::ng-deep .resize-handle-n:active,\r\n :host ::ng-deep .resize-handle-s:active {\r\n transform: translateX(-50%) scale(0.9);\r\n }\r\n\r\n :host ::ng-deep .resize-handle-w:active,\r\n :host ::ng-deep .resize-handle-e:active {\r\n transform: translateY(-50%) scale(0.9);\r\n }\r\n\r\n /* Poignées des coins avec scale simple */\r\n :host ::ng-deep .resize-handle-nw:hover,\r\n :host ::ng-deep .resize-handle-ne:hover,\r\n :host ::ng-deep .resize-handle-sw:hover,\r\n :host ::ng-deep .resize-handle-se:hover {\r\n transform: scale(1.2);\r\n }\r\n\r\n :host ::ng-deep .resize-handle-nw:active,\r\n :host ::ng-deep .resize-handle-ne:active,\r\n :host ::ng-deep .resize-handle-sw:active,\r\n :host ::ng-deep .resize-handle-se:active {\r\n transform: scale(0.9);\r\n }\r\n\r\n /* Positions spécifiques pour chaque poignée */\r\n :host ::ng-deep .resize-handle-nw {\r\n top: 0;\r\n left: -6px;\r\n cursor: nw-resize;\r\n }\r\n :host ::ng-deep .resize-handle-n {\r\n top: 0;\r\n left: 50%;\r\n transform: translateX(-50%);\r\n cursor: n-resize;\r\n }\r\n :host ::ng-deep .resize-handle-ne {\r\n top: 0;\r\n right: -6px;\r\n cursor: ne-resize;\r\n }\r\n :host ::ng-deep .resize-handle-w {\r\n top: 50%;\r\n left: -6px;\r\n transform: translateY(-50%);\r\n cursor: w-resize;\r\n }\r\n :host ::ng-deep .resize-handle-e {\r\n top: 50%;\r\n right: -6px;\r\n transform: translateY(-50%);\r\n cursor: e-resize;\r\n }\r\n :host ::ng-deep .resize-handle-sw {\r\n bottom: 0;\r\n left: -6px;\r\n cursor: sw-resize;\r\n }\r\n :host ::ng-deep .resize-handle-s {\r\n bottom: 0;\r\n left: 50%;\r\n transform: translateX(-50%);\r\n cursor: s-resize;\r\n }\r\n :host ::ng-deep .resize-handle-se {\r\n bottom: 0;\r\n right: -6px;\r\n cursor: se-resize;\r\n }\r\n\r\n /* Styles pour le redimensionnement en cours */\r\n :host ::ng-deep body.resizing {\r\n user-select: none;\r\n cursor: crosshair;\r\n }\r\n\r\n :host ::ng-deep body.resizing .ProseMirror {\r\n pointer-events: none;\r\n }\r\n\r\n :host ::ng-deep body.resizing .ProseMirror .tiptap-image {\r\n pointer-events: none;\r\n }\r\n\r\n /* Styles pour les informations de taille d'image */\r\n :host ::ng-deep .image-size-info {\r\n position: absolute;\r\n bottom: -20px;\r\n left: 50%;\r\n transform: translateX(-50%);\r\n background: rgba(0, 0, 0, 0.8);\r\n color: white;\r\n padding: 2px 6px;\r\n border-radius: 3px;\r\n font-size: 11px;\r\n white-space: nowrap;\r\n opacity: 0;\r\n transition: opacity 0.2s ease;\r\n }\r\n\r\n :host ::ng-deep .image-container:hover .image-size-info {\r\n opacity: 1;\r\n }\r\n /* Styles pour les tables */\r\n :host ::ng-deep .ProseMirror table {\r\n border-collapse: separate;\r\n border-spacing: 0;\r\n margin: 0;\r\n table-layout: fixed;\r\n width: 100%;\r\n border-radius: 8px;\r\n overflow: hidden;\r\n }\r\n\r\n :host ::ng-deep .ProseMirror table td,\r\n :host ::ng-deep .ProseMirror table th {\r\n border: none;\r\n border-right: 1px solid #e2e8f0;\r\n border-bottom: 1px solid #e2e8f0;\r\n box-sizing: border-box;\r\n min-width: 1em;\r\n padding: 8px 12px;\r\n position: relative;\r\n vertical-align: top;\r\n background: white;\r\n }\r\n\r\n /* Ajouter les bordures externes manquantes pour former la bordure du tableau */\r\n :host ::ng-deep .ProseMirror table td:first-child,\r\n :host ::ng-deep .ProseMirror table th:first-child {\r\n border-left: 1px solid #e2e8f0;\r\n }\r\n\r\n :host ::ng-deep .ProseMirror table tr:first-child td,\r\n :host ::ng-deep .ProseMirror table tr:first-child th {\r\n border-top: 1px solid #e2e8f0;\r\n }\r\n\r\n /* Coins arrondis */\r\n :host ::ng-deep .ProseMirror table tr:first-child th:first-child {\r\n border-top-left-radius: 8px;\r\n }\r\n\r\n :host ::ng-deep .ProseMirror table tr:first-child th:last-child {\r\n border-top-right-radius: 8px;\r\n }\r\n\r\n :host ::ng-deep .ProseMirror table tr:last-child td:first-child {\r\n border-bottom-left-radius: 8px;\r\n }\r\n\r\n :host ::ng-deep .ProseMirror table tr:last-child td:last-child {\r\n border-bottom-right-radius: 8px;\r\n }\r\n\r\n /* En-têtes de table */\r\n :host ::ng-deep .ProseMirror table th {\r\n background: #f8f9fa;\r\n font-weight: 600;\r\n color: #374151;\r\n }\r\n\r\n /* Cellules sélectionnées */\r\n :host ::ng-deep .ProseMirror table .selectedCell:after {\r\n background: rgba(200, 200, 255, 0.4);\r\n content: \"\";\r\n left: 0;\r\n right: 0;\r\n top: 0;\r\n bottom: 0;\r\n pointer-events: none;\r\n position: absolute;\r\n z-index: 2;\r\n }\r\n\r\n /* Poignées de redimensionnement */\r\n :host ::ng-deep .ProseMirror table .column-resize-handle {\r\n position: absolute;\r\n right: -2px;\r\n top: 0;\r\n bottom: 0;\r\n width: 4px;\r\n background-color: #6366f1;\r\n opacity: 0;\r\n transition: opacity 0.2s ease;\r\n }\r\n\r\n :host ::ng-deep .ProseMirror table:hover .column-resize-handle {\r\n opacity: 1;\r\n }\r\n\r\n :host ::ng-deep .ProseMirror table .column-resize-handle:hover {\r\n background-color: #4f46e5;\r\n }\r\n\r\n /* Container avec scroll horizontal */\r\n :host ::ng-deep .ProseMirror .tableWrapper {\r\n overflow-x: auto;\r\n margin: 1em 0;\r\n border-radius: 8px;\r\n }\r\n\r\n :host ::ng-deep .ProseMirror .tableWrapper table {\r\n margin: 0;\r\n border-radius: 8px;\r\n min-width: 600px;\r\n overflow: hidden;\r\n }\r\n\r\n /* Paragraphes dans les tables */\r\n :host ::ng-deep .ProseMirror table p {\r\n margin: 0;\r\n }\r\n\r\n /* Styles pour les cellules sélectionnées */\r\n :host ::ng-deep .ProseMirror table .selectedCell {\r\n background-color: rgba(99, 102, 241, 0.1);\r\n }\r\n\r\n /* Styles pour les en-têtes de table */\r\n :host ::ng-deep .ProseMirror table th {\r\n background-color: #f8f9fa;\r\n font-weight: 600;\r\n color: #374151;\r\n text-align: left;\r\n }\r\n\r\n /* Styles pour les lignes alternées (optionnel) */\r\n :host ::ng-deep .ProseMirror table tbody tr:nth-child(even) {\r\n background-color: #fafbfc;\r\n }\r\n\r\n :host ::ng-deep .ProseMirror table tbody tr:hover {\r\n background-color: #f1f5f9;\r\n }\r\n `,\r\n ],\r\n})\r\nexport class AngularTiptapEditorComponent implements AfterViewInit, OnDestroy {\r\n // Nouveaux inputs avec signal\r\n content = input<string>(\"\");\r\n placeholder = input<string>(\"\");\r\n editable = input<boolean>(true);\r\n minHeight = input<number>(200);\r\n height = input<number | undefined>(undefined);\r\n maxHeight = input<number | undefined>(undefined);\r\n showToolbar = input<boolean>(true);\r\n showCharacterCount = input<boolean>(true);\r\n maxCharacters = input<number | undefined>(undefined);\r\n enableOfficePaste = input<boolean>(true);\r\n enableSlashCommands = input<boolean>(true);\r\n slashCommandsConfig = input<SlashCommandsConfig | undefined>(undefined);\r\n locale = input<SupportedLocale | undefined>(undefined);\r\n autofocus = input<boolean | 'start' | 'end' | 'all' | number>(false);\r\n\r\n // Nouveaux inputs pour les bubble menus\r\n showBubbleMenu = input<boolean>(true);\r\n bubbleMenu = input<Partial<BubbleMenuConfig>>(DEFAULT_BUBBLE_MENU_CONFIG);\r\n showImageBubbleMenu = input<boolean>(true);\r\n imageBubbleMenu = input<Partial<ImageBubbleMenuConfig>>(\r\n DEFAULT_IMAGE_BUBBLE_MENU_CONFIG\r\n );\r\n\r\n // Nouveau input pour la configuration de la toolbar\r\n toolbar = input<Partial<ToolbarConfig>>({});\r\n\r\n // Nouveau input pour la configuration de l'upload d'images\r\n imageUpload = input<Partial<any>>({});\r\n\r\n // Nouveaux outputs\r\n contentChange = output<string>();\r\n editorCreated = output<Editor>();\r\n editorUpdate = output<{ editor: Editor; transaction: any }>();\r\n editorFocus = output<{ editor: Editor; event: FocusEvent }>();\r\n editorBlur = output<{ editor: Editor; event: FocusEvent }>();\r\n\r\n // ViewChild avec signal\r\n editorElement = viewChild.required<ElementRef>(\"editorElement\");\r\n\r\n // Signals privés pour l'état interne\r\n private _editor = signal<Editor | null>(null);\r\n private _characterCount = signal<number>(0);\r\n private _wordCount = signal<number>(0);\r\n private _isDragOver = signal<boolean>(false);\r\n private _editorFullyInitialized = signal<boolean>(false);\r\n\r\n // Accès en lecture seule aux signaux\r\n readonly editor = this._editor.asReadonly();\r\n readonly characterCount = this._characterCount.asReadonly();\r\n readonly wordCount = this._wordCount.asReadonly();\r\n readonly isDragOver = this._isDragOver.asReadonly();\r\n readonly editorFullyInitialized = this._editorFullyInitialized.asReadonly();\r\n\r\n // Computed pour les états de l'éditeur\r\n isEditorReady = computed(() => this.editor() !== null);\r\n\r\n // Computed pour la configuration de la toolbar\r\n toolbarConfig = computed(() =>\r\n Object.keys(this.toolbar()).length === 0\r\n ? DEFAULT_TOOLBAR_CONFIG\r\n : this.toolbar()\r\n );\r\n\r\n // Computed pour la configuration du bubble menu\r\n bubbleMenuConfig = computed(() =>\r\n Object.keys(this.bubbleMenu()).length === 0\r\n ? DEFAULT_BUBBLE_MENU_CONFIG\r\n : { ...DEFAULT_BUBBLE_MENU_CONFIG, ...this.bubbleMenu() }\r\n );\r\n\r\n // Computed pour la configuration du bubble menu image\r\n imageBubbleMenuConfig = computed(() =>\r\n Object.keys(this.imageBubbleMenu()).length === 0\r\n ? DEFAULT_IMAGE_BUBBLE_MENU_CONFIG\r\n : { ...DEFAULT_IMAGE_BUBBLE_MENU_CONFIG, ...this.imageBubbleMenu() }\r\n );\r\n\r\n // Computed pour la configuration du bubble menu table\r\n tableBubbleMenuConfig = computed(() => ({\r\n addRowBefore: true,\r\n addRowAfter: true,\r\n deleteRow: true,\r\n addColumnBefore: true,\r\n addColumnAfter: true,\r\n deleteColumn: true,\r\n deleteTable: true,\r\n toggleHeaderRow: true,\r\n toggleHeaderColumn: true,\r\n }));\r\n\r\n // Computed pour la configuration du menu de cellules\r\n cellBubbleMenuConfig = computed(() => ({\r\n mergeCells: true,\r\n splitCell: true,\r\n }));\r\n\r\n // Computed pour la configuration de l'upload d'images\r\n imageUploadConfig = computed(() => ({\r\n maxSize: 5,\r\n maxWidth: 1920,\r\n maxHeight: 1080,\r\n allowedTypes: [\"image/jpeg\", \"image/png\", \"image/gif\", \"image/webp\"],\r\n enableDragDrop: true,\r\n showPreview: true,\r\n multiple: false,\r\n compressImages: true,\r\n quality: 0.8,\r\n ...this.imageUpload(),\r\n }));\r\n\r\n // Computed pour la configuration des slash commands\r\n slashCommandsConfigComputed = computed(() => {\r\n const config = this.slashCommandsConfig();\r\n if (config) {\r\n return config;\r\n }\r\n\r\n // Configuration par défaut avec toutes les commandes\r\n const allCommands = filterSlashCommands(\r\n new Set(SLASH_COMMAND_KEYS),\r\n this.i18nService\r\n );\r\n return { commands: allCommands };\r\n });\r\n\r\n private _destroyRef = inject(DestroyRef);\r\n // NgControl pour gérer les FormControls\r\n private ngControl = inject(NgControl, { self: true, optional: true });\r\n\r\n readonly i18nService = inject(TiptapI18nService);\r\n readonly imageService = inject(ImageService);\r\n readonly editorCommandsService = inject(EditorCommandsService);\r\n\r\n constructor() {\r\n // Effet pour gérer le changement de langue\r\n effect(() => {\r\n const locale = this.locale();\r\n if (locale) {\r\n this.i18nService.setLocale(locale);\r\n }\r\n });\r\n\r\n // Effet pour mettre à jour le contenu de l'éditeur\r\n effect(() => {\r\n const editor = this.editor();\r\n const content = this.content();\r\n const hasFormControl = !!(this.ngControl as any)?.control;\r\n\r\n // Ne pas écraser le contenu si on a un FormControl et que le content est vide\r\n if (editor && content !== undefined && content !== editor.getHTML()) {\r\n if (hasFormControl && !content) {\r\n return;\r\n }\r\n this.setContent(content, false);\r\n }\r\n });\r\n\r\n // Effet pour mettre à jour les propriétés de hauteur\r\n effect(() => {\r\n const minHeight = this.minHeight();\r\n const height = this.height();\r\n const maxHeight = this.maxHeight();\r\n const element = this.editorElement()?.nativeElement;\r\n\r\n // Calculer automatiquement si le scroll est nécessaire\r\n const needsScroll = height !== undefined || maxHeight !== undefined;\r\n\r\n if (element) {\r\n element.style.setProperty(\"--editor-min-height\", `${minHeight}px`);\r\n element.style.setProperty(\r\n \"--editor-height\",\r\n height ? `${height}px` : \"auto\"\r\n );\r\n element.style.setProperty(\r\n \"--editor-max-height\",\r\n maxHeight ? `${maxHeight}px` : \"none\"\r\n );\r\n element.style.setProperty(\r\n \"--editor-overflow\",\r\n needsScroll ? \"auto\" : \"visible\"\r\n );\r\n }\r\n });\r\n\r\n // Effect pour surveiller les changements d'édition\r\n effect(() => {\r\n const currentEditor = this.editor();\r\n const isEditable = this.editable();\r\n\r\n if (currentEditor) {\r\n this.editorCommandsService.setEditable(currentEditor, isEditable);\r\n }\r\n });\r\n\r\n // Effect pour la détection du survol des tables\r\n effect(() => {\r\n const currentEditor = this.editor();\r\n if (!currentEditor) return;\r\n\r\n // Table hover detection supprimée car remplacée par le menu bubble\r\n });\r\n }\r\n\r\n ngAfterViewInit() {\r\n // La vue est déjà complètement initialisée dans ngAfterViewInit\r\n this.initEditor();\r\n\r\n // S'abonner aux changements du FormControl\r\n this.setupFormControlSubscription();\r\n }\r\n\r\n ngOnDestroy() {\r\n const currentEditor = this.editor();\r\n if (currentEditor) {\r\n currentEditor.destroy();\r\n }\r\n this._editorFullyInitialized.set(false);\r\n }\r\n\r\n private initEditor() {\r\n const extensions: (Extension | Node | Mark)[] = [\r\n StarterKit,\r\n Placeholder.configure({\r\n placeholder:\r\n this.placeholder() || this.i18nService.editor().placeholder,\r\n }),\r\n Underline,\r\n Superscript,\r\n Subscript,\r\n TextAlign.configure({\r\n types: [\"heading\", \"paragraph\"],\r\n }),\r\n Link.configure({\r\n openOnClick: false,\r\n HTMLAttributes: {\r\n class: \"tiptap-link\",\r\n },\r\n }),\r\n Highlight.configure({\r\n multicolor: true,\r\n HTMLAttributes: {\r\n class: \"tiptap-highlight\",\r\n },\r\n }),\r\n ResizableImage.configure({\r\n inline: false,\r\n allowBase64: true,\r\n HTMLAttributes: {\r\n class: \"tiptap-image\",\r\n },\r\n }),\r\n UploadProgress.configure({\r\n isUploading: () => this.imageService.isUploading(),\r\n uploadProgress: () => this.imageService.uploadProgress(),\r\n uploadMessage: () => this.imageService.uploadMessage(),\r\n }),\r\n TableExtension,\r\n ];\r\n\r\n // Ajouter l'extension Office Paste si activée\r\n if (this.enableOfficePaste()) {\r\n extensions.push(\r\n OfficePaste.configure({\r\n // Configuration par défaut pour une meilleure compatibilité\r\n transformPastedHTML: true,\r\n transformPastedText: true,\r\n })\r\n );\r\n }\r\n\r\n if (this.showCharacterCount()) {\r\n extensions.push(\r\n CharacterCount.configure({\r\n limit: this.maxCharacters(),\r\n })\r\n );\r\n }\r\n\r\n const newEditor = new Editor({\r\n element: this.editorElement().nativeElement,\r\n extensions,\r\n content: this.content(),\r\n editable: this.editable(),\r\n autofocus: this.autofocus(),\r\n onUpdate: ({ editor, transaction }) => {\r\n const html = editor.getHTML();\r\n this.contentChange.emit(html);\r\n // Mettre à jour le FormControl si il existe (dans le prochain cycle)\r\n if ((this.ngControl as any)?.control) {\r\n setTimeout(() => {\r\n (this.ngControl as any).control.setValue(html, {\r\n emitEvent: false,\r\n });\r\n }, 0);\r\n }\r\n this.editorUpdate.emit({ editor, transaction });\r\n this.updateCharacterCount(editor);\r\n },\r\n onCreate: ({ editor }) => {\r\n this.editorCreated.emit(editor);\r\n this.updateCharacterCount(editor);\r\n\r\n // Marquer l'éditeur comme complètement initialisé après un court délai\r\n // pour s'assurer que tous les plugins et extensions sont prêts\r\n setTimeout(() => {\r\n this._editorFullyInitialized.set(true);\r\n }, 100);\r\n },\r\n onFocus: ({ editor, event }) => {\r\n this.editorFocus.emit({ editor, event });\r\n },\r\n onBlur: ({ editor, event }) => {\r\n // Marquer le FormControl comme touché si il existe\r\n if ((this.ngControl as any)?.control) {\r\n (this.ngControl as any).control.markAsTouched();\r\n }\r\n this.editorBlur.emit({ editor, event });\r\n },\r\n });\r\n\r\n // Stocker la référence de l'éditeur immédiatement\r\n this._editor.set(newEditor);\r\n }\r\n\r\n private updateCharacterCount(editor: Editor) {\r\n if (this.showCharacterCount() && editor.storage[\"characterCount\"]) {\r\n const storage = editor.storage[\"characterCount\"];\r\n this._characterCount.set(storage.characters());\r\n this._wordCount.set(storage.words());\r\n }\r\n }\r\n\r\n // Méthodes pour l'upload d'images\r\n onImageUploaded(result: ImageUploadResult) {\r\n const currentEditor = this.editor();\r\n if (currentEditor) {\r\n this.imageService.insertImage(currentEditor, {\r\n src: result.src,\r\n alt: result.name,\r\n title: `${result.name} (${result.width}×${result.height})`,\r\n width: result.width,\r\n height: result.height,\r\n });\r\n }\r\n }\r\n\r\n onImageUploadError(error: string) {\r\n // Ici vous pourriez afficher une notification à l'utilisateur\r\n }\r\n\r\n // Gestion de l'upload d'image depuis les slash commands\r\n async onSlashCommandImageUpload(file: File) {\r\n const currentEditor = this.editor();\r\n if (currentEditor) {\r\n try {\r\n await this.imageService.uploadAndInsertImage(currentEditor, file);\r\n } catch (error) {\r\n // Gérer l'erreur silencieusement ou afficher une notification\r\n }\r\n }\r\n }\r\n\r\n onDragOver(event: DragEvent) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this._isDragOver.set(true);\r\n }\r\n\r\n onDrop(event: DragEvent) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this._isDragOver.set(false);\r\n\r\n const files = event.dataTransfer?.files;\r\n if (files && files.length > 0) {\r\n const file = files[0];\r\n if (file.type.startsWith(\"image/\")) {\r\n this.insertImageFromFile(file);\r\n }\r\n }\r\n }\r\n\r\n private async insertImageFromFile(file: File) {\r\n const currentEditor = this.editor();\r\n if (currentEditor) {\r\n try {\r\n await this.imageService.uploadAndInsertImage(currentEditor, file);\r\n } catch (error) {\r\n // Gérer l'erreur silencieusement ou afficher une notification\r\n }\r\n }\r\n }\r\n\r\n // Public methods\r\n getHTML(): string {\r\n return this.editor()?.getHTML() || \"\";\r\n }\r\n\r\n getJSON(): any {\r\n return this.editor()?.getJSON();\r\n }\r\n\r\n getText(): string {\r\n return this.editor()?.getText() || \"\";\r\n }\r\n\r\n setContent(content: string, emitUpdate = true) {\r\n const editor = this.editor();\r\n if (editor) {\r\n this.editorCommandsService.setContent(editor, content, emitUpdate);\r\n }\r\n }\r\n\r\n focus() {\r\n const editor = this.editor();\r\n if (editor) {\r\n this.editorCommandsService.focus(editor);\r\n }\r\n }\r\n\r\n blur() {\r\n const editor = this.editor();\r\n if (editor) {\r\n this.editorCommandsService.blur(editor);\r\n }\r\n }\r\n\r\n clearContent() {\r\n const editor = this.editor();\r\n if (editor) {\r\n this.editorCommandsService.clearContent(editor);\r\n }\r\n }\r\n\r\n // Méthode publique pour obtenir l'éditeur\r\n getEditor(): Editor | null {\r\n return this.editor();\r\n }\r\n\r\n private setupFormControlSubscription(): void {\r\n const control = (this.ngControl as any)?.control;\r\n if (control) {\r\n const formValue$ = concat(\r\n defer(() => of(control.value)),\r\n control.valueChanges\r\n );\r\n\r\n formValue$\r\n .pipe(\r\n tap((value: any) => {\r\n const editor = this.editor();\r\n if (editor) {\r\n this.setContent(value, false);\r\n }\r\n }),\r\n takeUntilDestroyed(this._destroyRef)\r\n )\r\n .subscribe();\r\n }\r\n }\r\n\r\n // Méthode pour gérer l'état disabled\r\n setDisabledState(isDisabled: boolean): void {\r\n const currentEditor = this.editor();\r\n if (currentEditor) {\r\n this.editorCommandsService.setEditable(currentEditor, !isDisabled);\r\n }\r\n }\r\n\r\n onEditorClick(event: MouseEvent) {\r\n const editor = this.editor();\r\n if (!editor) return;\r\n\r\n // Vérifier si on clique sur l'élément conteneur et non sur le contenu\r\n const target = event.target as HTMLElement;\r\n const editorElement = this.editorElement()?.nativeElement;\r\n\r\n if (\r\n target === editorElement ||\r\n target.classList.contains(\"tiptap-content\")\r\n ) {\r\n // On clique dans l'espace vide, positionner le curseur à la fin\r\n setTimeout(() => {\r\n const { doc } = editor.state;\r\n const endPos = doc.content.size;\r\n editor.commands.setTextSelection(endPos);\r\n editor.commands.focus();\r\n }, 0);\r\n }\r\n }\r\n\r\n // Méthodes pour le bouton d'édition de table - Supprimées car remplacées par le menu bubble\r\n}\r\n","/*\r\n * Public API Surface of tiptap-editor\r\n */\r\n\r\n// Main component - only public component\r\nexport * from \"./lib/tiptap-editor.component\";\r\n\r\n// Host directive for FormControl integration\r\nexport * from \"./lib/noop-value-accessor.directive\";\r\n\r\n// Internationalization service\r\nexport * from \"./lib/services/i18n.service\";\r\n\r\n// Editor commands service\r\nexport * from \"./lib/services/editor-commands.service\";\r\n\r\n// Image service\r\nexport * from \"./lib/services/image.service\";\r\n\r\n// Types and interfaces for configuration\r\nexport type { ToolbarConfig } from \"./lib/tiptap-toolbar.component\";\r\nexport type {\r\n BubbleMenuConfig,\r\n ImageBubbleMenuConfig,\r\n TableBubbleMenuConfig,\r\n CellBubbleMenuConfig,\r\n} from \"./lib/models/bubble-menu.model\";\r\nexport type {\r\n SlashCommandsConfig,\r\n SlashCommandItem,\r\n} from \"./lib/tiptap-slash-commands.component\";\r\n// Default configurations\r\nexport { DEFAULT_TOOLBAR_CONFIG } from \"./lib/tiptap-editor.component\";\r\nexport { DEFAULT_BUBBLE_MENU_CONFIG } from \"./lib/tiptap-editor.component\";\r\nexport { DEFAULT_IMAGE_BUBBLE_MENU_CONFIG } from \"./lib/tiptap-editor.component\";\r\nexport { DEFAULT_TABLE_MENU_CONFIG } from \"./lib/tiptap-editor.component\";\r\nexport { DEFAULT_SLASH_COMMANDS } from \"./lib/tiptap-slash-commands.component\";\r\n\r\n// Utility functions to create and filter internationalized slash commands\r\nexport {\r\n createI18nSlashCommands,\r\n filterSlashCommands,\r\n SLASH_COMMAND_KEYS,\r\n} from \"./lib/config/i18n-slash-commands\";\r\n\r\n// Types for height configuration\r\nexport type HeightConfig = {\r\n minHeight?: number;\r\n height?: number;\r\n maxHeight?: number;\r\n};\r\n\r\n// Supported locales type\r\nexport type { SupportedLocale } from \"./lib/services/i18n.service\";\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.EditorCommandsService","DEFAULT_SLASH_COMMANDS","Plugin","PluginKey","i1.NoopValueAccessorDirective"],"mappings":"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"}
1
+ {"version":3,"file":"flogeez-angular-tiptap-editor.mjs","sources":["../../../projects/angular-tiptap-editor/src/lib/extensions/resizable-image.extension.ts","../../../projects/angular-tiptap-editor/src/lib/extensions/upload-progress.extension.ts","../../../projects/angular-tiptap-editor/src/lib/extensions/table.extension.ts","../../../projects/angular-tiptap-editor/src/lib/tiptap-button.component.ts","../../../projects/angular-tiptap-editor/src/lib/tiptap-bubble-menu.component.ts","../../../projects/angular-tiptap-editor/src/lib/tiptap-separator.component.ts","../../../projects/angular-tiptap-editor/src/lib/services/image.service.ts","../../../projects/angular-tiptap-editor/src/lib/tiptap-image-bubble-menu.component.ts","../../../projects/angular-tiptap-editor/src/lib/services/i18n.service.ts","../../../projects/angular-tiptap-editor/src/lib/services/editor-commands.service.ts","../../../projects/angular-tiptap-editor/src/lib/tiptap-table-bubble-menu.component.ts","../../../projects/angular-tiptap-editor/src/lib/tiptap-cell-bubble-menu.component.ts","../../../projects/angular-tiptap-editor/src/lib/tiptap-toolbar.component.ts","../../../projects/angular-tiptap-editor/src/lib/tiptap-slash-commands.component.ts","../../../projects/angular-tiptap-editor/src/lib/index.ts","../../../projects/angular-tiptap-editor/src/lib/tiptap-image-upload.component.ts","../../../projects/angular-tiptap-editor/src/lib/noop-value-accessor.directive.ts","../../../projects/angular-tiptap-editor/src/lib/config/i18n-slash-commands.ts","../../../projects/angular-tiptap-editor/src/lib/tiptap-editor.component.ts","../../../projects/angular-tiptap-editor/src/public-api.ts","../../../projects/angular-tiptap-editor/src/flogeez-angular-tiptap-editor.ts"],"sourcesContent":["import { Node, mergeAttributes, nodeInputRule } from \"@tiptap/core\";\r\n\r\nexport interface ResizableImageOptions {\r\n inline: boolean;\r\n allowBase64: boolean;\r\n HTMLAttributes: Record<string, any>;\r\n}\r\n\r\ndeclare module \"@tiptap/core\" {\r\n interface Commands<ReturnType> {\r\n resizableImage: {\r\n setResizableImage: (options: {\r\n src: string;\r\n alt?: string;\r\n title?: string;\r\n width?: number;\r\n height?: number;\r\n }) => ReturnType;\r\n updateResizableImage: (options: {\r\n src?: string;\r\n alt?: string;\r\n title?: string;\r\n width?: number;\r\n height?: number;\r\n }) => ReturnType;\r\n };\r\n }\r\n}\r\n\r\nexport const ResizableImage = Node.create<ResizableImageOptions>({\r\n name: \"resizableImage\",\r\n\r\n addOptions() {\r\n return {\r\n inline: false,\r\n allowBase64: false,\r\n HTMLAttributes: {},\r\n };\r\n },\r\n\r\n inline() {\r\n return this.options.inline;\r\n },\r\n\r\n group() {\r\n return this.options.inline ? \"inline\" : \"block\";\r\n },\r\n\r\n draggable: true,\r\n\r\n addAttributes() {\r\n return {\r\n src: {\r\n default: null,\r\n },\r\n alt: {\r\n default: null,\r\n },\r\n title: {\r\n default: null,\r\n },\r\n width: {\r\n default: null,\r\n parseHTML: (element) => {\r\n const width = element.getAttribute(\"width\");\r\n return width ? parseInt(width, 10) : null;\r\n },\r\n renderHTML: (attributes) => {\r\n if (!attributes[\"width\"]) {\r\n return {};\r\n }\r\n return {\r\n width: attributes[\"width\"],\r\n };\r\n },\r\n },\r\n height: {\r\n default: null,\r\n parseHTML: (element) => {\r\n const height = element.getAttribute(\"height\");\r\n return height ? parseInt(height, 10) : null;\r\n },\r\n renderHTML: (attributes) => {\r\n if (!attributes[\"height\"]) {\r\n return {};\r\n }\r\n return {\r\n height: attributes[\"height\"],\r\n };\r\n },\r\n },\r\n };\r\n },\r\n\r\n parseHTML() {\r\n return [\r\n {\r\n tag: \"img[src]\",\r\n },\r\n ];\r\n },\r\n\r\n renderHTML({ HTMLAttributes }) {\r\n return [\r\n \"img\",\r\n mergeAttributes(this.options.HTMLAttributes, HTMLAttributes),\r\n ];\r\n },\r\n\r\n addCommands() {\r\n return {\r\n setResizableImage:\r\n (options) =>\r\n ({ commands }) => {\r\n return commands.insertContent({\r\n type: this.name,\r\n attrs: options,\r\n });\r\n },\r\n updateResizableImage:\r\n (options) =>\r\n ({ commands }) => {\r\n return commands.updateAttributes(this.name, options);\r\n },\r\n };\r\n },\r\n\r\n addInputRules() {\r\n return [\r\n nodeInputRule({\r\n find: /!\\[(.+|:?)]\\((\\S+)(?:(?:\\s+)[\"'](\\S+)[\"'])?\\)/,\r\n type: this.type,\r\n getAttributes: (match) => {\r\n const [, alt, src, title] = match;\r\n return { src, alt, title };\r\n },\r\n }),\r\n ];\r\n },\r\n\r\n addNodeView() {\r\n return ({ node, getPos, editor }) => {\r\n const container = document.createElement(\"div\");\r\n container.className = \"resizable-image-container\";\r\n container.style.position = \"relative\";\r\n container.style.display = \"inline-block\";\r\n\r\n const img = document.createElement(\"img\");\r\n img.src = node.attrs[\"src\"];\r\n img.alt = node.attrs[\"alt\"] || \"\";\r\n img.title = node.attrs[\"title\"] || \"\";\r\n img.className = \"tiptap-image\";\r\n\r\n if (node.attrs[\"width\"]) img.width = node.attrs[\"width\"];\r\n if (node.attrs[\"height\"]) img.height = node.attrs[\"height\"];\r\n\r\n img.parentNode?.insertBefore(container, img);\r\n container.appendChild(img);\r\n\r\n // Ajouter les contrôles de redimensionnement modernes\r\n const resizeControls = document.createElement(\"div\");\r\n resizeControls.className = \"resize-controls\";\r\n resizeControls.style.display = \"none\";\r\n\r\n // Créer les 8 poignées pour un redimensionnement complet\r\n const handles = [\"nw\", \"n\", \"ne\", \"w\", \"e\", \"sw\", \"s\", \"se\"];\r\n handles.forEach((direction) => {\r\n const handle = document.createElement(\"div\");\r\n handle.className = `resize-handle resize-handle-${direction}`;\r\n handle.setAttribute(\"data-direction\", direction);\r\n resizeControls.appendChild(handle);\r\n });\r\n\r\n // Attacher les contrôles au conteneur\r\n container.appendChild(resizeControls);\r\n\r\n // Variables pour le redimensionnement\r\n let isResizing = false;\r\n let startX = 0;\r\n let startY = 0;\r\n let startWidth = 0;\r\n let startHeight = 0;\r\n let aspectRatio = 1;\r\n\r\n // Calculer le ratio d'aspect\r\n img.onload = () => {\r\n aspectRatio = img.naturalWidth / img.naturalHeight;\r\n };\r\n\r\n // Gestion du redimensionnement\r\n const handleMouseDown = (e: MouseEvent, direction: string) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n isResizing = true;\r\n startX = e.clientX;\r\n startY = e.clientY;\r\n\r\n // Utiliser les dimensions actuelles de l'image au lieu des dimensions initiales\r\n startWidth =\r\n parseInt(img.getAttribute(\"width\") || \"0\") ||\r\n node.attrs[\"width\"] ||\r\n img.naturalWidth;\r\n startHeight =\r\n parseInt(img.getAttribute(\"height\") || \"0\") ||\r\n node.attrs[\"height\"] ||\r\n img.naturalHeight;\r\n\r\n // Ajouter la classe de redimensionnement au body\r\n document.body.classList.add(\"resizing\");\r\n\r\n const handleMouseMove = (e: MouseEvent) => {\r\n if (!isResizing) return;\r\n\r\n const deltaX = e.clientX - startX;\r\n const deltaY = e.clientY - startY;\r\n\r\n let newWidth = startWidth;\r\n let newHeight = startHeight;\r\n\r\n // Redimensionnement selon la direction\r\n switch (direction) {\r\n case \"e\":\r\n newWidth = startWidth + deltaX;\r\n newHeight = newWidth / aspectRatio;\r\n break;\r\n case \"w\":\r\n newWidth = startWidth - deltaX;\r\n newHeight = newWidth / aspectRatio;\r\n break;\r\n case \"s\":\r\n newHeight = startHeight + deltaY;\r\n newWidth = newHeight * aspectRatio;\r\n break;\r\n case \"n\":\r\n newHeight = startHeight - deltaY;\r\n newWidth = newHeight * aspectRatio;\r\n break;\r\n case \"se\":\r\n newWidth = startWidth + deltaX;\r\n newHeight = startHeight + deltaY;\r\n break;\r\n case \"sw\":\r\n newWidth = startWidth - deltaX;\r\n newHeight = startHeight + deltaY;\r\n break;\r\n case \"ne\":\r\n newWidth = startWidth + deltaX;\r\n newHeight = startHeight - deltaY;\r\n break;\r\n case \"nw\":\r\n newWidth = startWidth - deltaX;\r\n newHeight = startHeight - deltaY;\r\n break;\r\n }\r\n\r\n // Limites\r\n newWidth = Math.max(50, Math.min(2000, newWidth));\r\n newHeight = Math.max(50, Math.min(2000, newHeight));\r\n\r\n // Mettre à jour directement les attributs de l'image\r\n img.setAttribute(\"width\", Math.round(newWidth).toString());\r\n img.setAttribute(\"height\", Math.round(newHeight).toString());\r\n };\r\n\r\n const handleMouseUp = () => {\r\n isResizing = false;\r\n document.body.classList.remove(\"resizing\");\r\n\r\n // Mettre à jour le nœud Tiptap avec les nouvelles dimensions\r\n if (typeof getPos === \"function\") {\r\n const finalWidth = parseInt(img.getAttribute(\"width\") || \"0\");\r\n const finalHeight = parseInt(img.getAttribute(\"height\") || \"0\");\r\n\r\n if (finalWidth && finalHeight) {\r\n editor.commands.updateAttributes(\"resizableImage\", {\r\n width: finalWidth,\r\n height: finalHeight,\r\n });\r\n }\r\n }\r\n\r\n document.removeEventListener(\"mousemove\", handleMouseMove);\r\n document.removeEventListener(\"mouseup\", handleMouseUp);\r\n };\r\n\r\n document.addEventListener(\"mousemove\", handleMouseMove);\r\n document.addEventListener(\"mouseup\", handleMouseUp);\r\n };\r\n\r\n // Ajouter les événements aux poignées\r\n resizeControls.addEventListener(\"mousedown\", (e) => {\r\n const target = e.target as HTMLElement;\r\n if (target.classList.contains(\"resize-handle\")) {\r\n const direction = target.getAttribute(\"data-direction\");\r\n if (direction) {\r\n handleMouseDown(e, direction);\r\n }\r\n }\r\n });\r\n\r\n // Gestion des événements\r\n img.addEventListener(\"click\", () => {\r\n // Masquer tous les autres contrôles\r\n document.querySelectorAll(\".resize-controls\").forEach((control) => {\r\n (control as HTMLElement).style.display = \"none\";\r\n });\r\n\r\n // Afficher les contrôles de cette image\r\n resizeControls.style.display = \"block\";\r\n img.classList.add(\"selected\");\r\n });\r\n\r\n // Masquer les contrôles quand on clique ailleurs\r\n document.addEventListener(\"click\", (e) => {\r\n const target = e.target as Element;\r\n if (\r\n target &&\r\n !img.contains(target) &&\r\n !resizeControls.contains(target)\r\n ) {\r\n resizeControls.style.display = \"none\";\r\n img.classList.remove(\"selected\");\r\n }\r\n });\r\n\r\n return {\r\n dom: container,\r\n update: (updatedNode) => {\r\n if (updatedNode.type.name !== \"resizableImage\") return false;\r\n\r\n img.src = updatedNode.attrs[\"src\"];\r\n img.alt = updatedNode.attrs[\"alt\"] || \"\";\r\n img.title = updatedNode.attrs[\"title\"] || \"\";\r\n\r\n if (updatedNode.attrs[\"width\"])\r\n img.width = updatedNode.attrs[\"width\"];\r\n if (updatedNode.attrs[\"height\"])\r\n img.height = updatedNode.attrs[\"height\"];\r\n\r\n return true;\r\n },\r\n };\r\n };\r\n },\r\n});\r\n","import { Extension } from \"@tiptap/core\";\r\nimport { Plugin, PluginKey } from \"@tiptap/pm/state\";\r\nimport { Decoration, DecorationSet } from \"@tiptap/pm/view\";\r\n\r\nexport interface UploadProgressOptions {\r\n isUploading: () => boolean;\r\n uploadProgress: () => number;\r\n uploadMessage: () => string;\r\n}\r\n\r\nexport const UploadProgress = Extension.create<UploadProgressOptions>({\r\n name: \"uploadProgress\",\r\n\r\n addOptions() {\r\n return {\r\n isUploading: () => false,\r\n uploadProgress: () => 0,\r\n uploadMessage: () => \"\",\r\n };\r\n },\r\n\r\n addProseMirrorPlugins() {\r\n const options = this.options;\r\n\r\n return [\r\n new Plugin({\r\n key: new PluginKey(\"uploadProgress\"),\r\n state: {\r\n init() {\r\n return {\r\n decorations: DecorationSet.empty,\r\n isUploading: false,\r\n uploadPosition: null as number | null,\r\n };\r\n },\r\n apply: (tr, state) => {\r\n const isUploading = options.isUploading();\r\n\r\n // Si l'upload commence, sauvegarder la position\r\n if (isUploading && !state.isUploading) {\r\n const uploadPosition = tr.selection.from;\r\n const uploadProgress = options.uploadProgress();\r\n const uploadMessage = options.uploadMessage();\r\n\r\n // Créer un élément de progression\r\n const uploadElement = document.createElement(\"div\");\r\n uploadElement.className = \"upload-progress-widget\";\r\n uploadElement.innerHTML = `\r\n <div class=\"upload-skeleton\">\r\n <div class=\"upload-content\">\r\n <div class=\"upload-icon\">\r\n <span class=\"material-symbols-outlined spinning\">image</span>\r\n </div>\r\n <div class=\"upload-info\">\r\n <div class=\"upload-message\">${uploadMessage}</div>\r\n <div class=\"progress-bar\">\r\n <div class=\"progress-fill\" style=\"width: ${uploadProgress}%\"></div>\r\n </div>\r\n <div class=\"progress-text\">${uploadProgress}%</div>\r\n </div>\r\n </div>\r\n </div>\r\n `;\r\n\r\n // Ajouter les styles si pas déjà fait\r\n if (!document.querySelector(\"#upload-progress-styles\")) {\r\n const style = document.createElement(\"style\");\r\n style.id = \"upload-progress-styles\";\r\n style.textContent = `\r\n .upload-progress-widget {\r\n display: block;\r\n margin: 8px 0;\r\n max-width: 400px;\r\n }\r\n .upload-skeleton {\r\n background: #f8f9fa;\r\n border: 2px dashed #e2e8f0;\r\n border-radius: 8px;\r\n padding: 16px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n min-height: 120px;\r\n animation: pulse 2s infinite;\r\n }\r\n @keyframes pulse {\r\n 0%, 100% { background-color: #f8f9fa; }\r\n 50% { background-color: #f1f5f9; }\r\n }\r\n .upload-content {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n gap: 12px;\r\n text-align: center;\r\n }\r\n .upload-icon {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 48px;\r\n height: 48px;\r\n background: #e6f3ff;\r\n border-radius: 50%;\r\n color: #3182ce;\r\n }\r\n .upload-icon .material-symbols-outlined {\r\n font-size: 24px;\r\n }\r\n .spinning {\r\n animation: spin 1s linear infinite;\r\n }\r\n @keyframes spin {\r\n from { transform: rotate(0deg); }\r\n to { transform: rotate(360deg); }\r\n }\r\n .upload-info {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 8px;\r\n width: 100%;\r\n max-width: 200px;\r\n }\r\n .upload-message {\r\n font-size: 14px;\r\n color: #4a5568;\r\n font-weight: 500;\r\n }\r\n .progress-bar {\r\n width: 100%;\r\n height: 6px;\r\n background: #e2e8f0;\r\n border-radius: 3px;\r\n overflow: hidden;\r\n }\r\n .progress-fill {\r\n height: 100%;\r\n background: linear-gradient(90deg, #3182ce, #4299e1);\r\n border-radius: 3px;\r\n transition: width 0.3s ease;\r\n }\r\n .progress-text {\r\n font-size: 12px;\r\n color: #718096;\r\n font-weight: 500;\r\n }\r\n `;\r\n document.head.appendChild(style);\r\n }\r\n\r\n // Créer une décoration widget à la position sauvegardée\r\n const decoration = Decoration.widget(\r\n uploadPosition,\r\n uploadElement,\r\n {\r\n side: 1,\r\n key: \"upload-progress\",\r\n }\r\n );\r\n\r\n return {\r\n decorations: DecorationSet.create(tr.doc, [decoration]),\r\n isUploading: true,\r\n uploadPosition,\r\n };\r\n }\r\n\r\n // Si l'upload continue, mettre à jour le contenu\r\n if (\r\n isUploading &&\r\n state.isUploading &&\r\n state.uploadPosition !== null\r\n ) {\r\n const uploadProgress = options.uploadProgress();\r\n const uploadMessage = options.uploadMessage();\r\n\r\n // Mettre à jour le contenu de l'élément existant\r\n const existingElement = document.querySelector(\r\n \".upload-progress-widget\"\r\n );\r\n if (existingElement) {\r\n existingElement.innerHTML = `\r\n <div class=\"upload-skeleton\">\r\n <div class=\"upload-content\">\r\n <div class=\"upload-icon\">\r\n <span class=\"material-symbols-outlined spinning\">image</span>\r\n </div>\r\n <div class=\"upload-info\">\r\n <div class=\"upload-message\">${uploadMessage}</div>\r\n <div class=\"progress-bar\">\r\n <div class=\"progress-fill\" style=\"width: ${uploadProgress}%\"></div>\r\n </div>\r\n <div class=\"progress-text\">${uploadProgress}%</div>\r\n </div>\r\n </div>\r\n </div>\r\n `;\r\n }\r\n\r\n return state; // Garder les décorations existantes\r\n }\r\n\r\n // Si l'upload se termine, supprimer les décorations\r\n if (!isUploading && state.isUploading) {\r\n return {\r\n decorations: DecorationSet.empty,\r\n isUploading: false,\r\n uploadPosition: null,\r\n };\r\n }\r\n\r\n return state;\r\n },\r\n },\r\n props: {\r\n decorations(state) {\r\n const pluginState = this.getState(state);\r\n return pluginState ? pluginState.decorations : DecorationSet.empty;\r\n },\r\n },\r\n }),\r\n ];\r\n },\r\n});\r\n","import { Extension } from \"@tiptap/core\";\r\nimport Table from \"@tiptap/extension-table\";\r\nimport TableRow from \"@tiptap/extension-table-row\";\r\nimport TableCell from \"@tiptap/extension-table-cell\";\r\nimport TableHeader from \"@tiptap/extension-table-header\";\r\n\r\nexport const TableExtension = Extension.create({\r\n name: \"tableExtension\",\r\n\r\n addExtensions() {\r\n return [\r\n Table.configure({\r\n resizable: true,\r\n handleWidth: 5,\r\n cellMinWidth: 100,\r\n }),\r\n TableRow,\r\n TableHeader.configure({\r\n HTMLAttributes: {\r\n class: \"table-header\",\r\n },\r\n }),\r\n TableCell.configure({\r\n HTMLAttributes: {\r\n class: \"table-cell\",\r\n },\r\n }),\r\n ];\r\n },\r\n});\r\n","import { Component, input, output } from \"@angular/core\";\r\n\r\nexport interface TiptapButtonConfig {\r\n icon: string;\r\n title: string;\r\n active?: boolean;\r\n disabled?: boolean;\r\n variant?: \"default\" | \"text\" | \"danger\";\r\n size?: \"small\" | \"medium\" | \"large\";\r\n iconSize?: \"small\" | \"medium\" | \"large\";\r\n}\r\n\r\n@Component({\r\n selector: \"tiptap-button\",\r\n standalone: true,\r\n template: `\r\n <button\r\n class=\"tiptap-button\"\r\n [class.is-active]=\"active()\"\r\n [class.is-disabled]=\"disabled()\"\r\n [class.text-button]=\"variant() === 'text'\"\r\n [class.danger]=\"variant() === 'danger'\"\r\n [class.small]=\"size() === 'small'\"\r\n [class.medium]=\"size() === 'medium'\"\r\n [class.large]=\"size() === 'large'\"\r\n [disabled]=\"disabled()\"\r\n [attr.title]=\"title()\"\r\n (mousedown)=\"onMouseDown($event)\"\r\n (click)=\"onClick.emit($event)\"\r\n type=\"button\"\r\n >\r\n <span\r\n class=\"material-symbols-outlined\"\r\n [class.icon-small]=\"iconSize() === 'small'\"\r\n [class.icon-medium]=\"iconSize() === 'medium'\"\r\n [class.icon-large]=\"iconSize() === 'large'\"\r\n >{{ icon() }}</span\r\n >\r\n <ng-content></ng-content>\r\n </button>\r\n `,\r\n styles: [\r\n `\r\n /* Styles de base pour les boutons Tiptap */\r\n .tiptap-button {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 32px;\r\n height: 32px;\r\n border: none;\r\n background: transparent;\r\n border-radius: 8px;\r\n cursor: pointer;\r\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\r\n color: #64748b;\r\n position: relative;\r\n overflow: hidden;\r\n }\r\n\r\n .tiptap-button::before {\r\n content: \"\";\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n bottom: 0;\r\n background: linear-gradient(135deg, #6366f1, #8b5cf6);\r\n opacity: 0;\r\n transition: opacity 0.2s ease;\r\n border-radius: 8px;\r\n }\r\n\r\n .tiptap-button:hover {\r\n color: #6366f1;\r\n transform: translateY(-1px);\r\n }\r\n\r\n .tiptap-button:hover::before {\r\n opacity: 0.1;\r\n }\r\n\r\n .tiptap-button:active {\r\n transform: translateY(0);\r\n }\r\n\r\n .tiptap-button.is-active {\r\n color: #6366f1;\r\n background: rgba(99, 102, 241, 0.1);\r\n }\r\n\r\n .tiptap-button.is-active::before {\r\n opacity: 0.15;\r\n }\r\n\r\n .tiptap-button.is-active:hover {\r\n background: rgba(99, 102, 241, 0.15);\r\n }\r\n\r\n .tiptap-button:disabled {\r\n opacity: 0.5;\r\n cursor: not-allowed;\r\n pointer-events: none;\r\n }\r\n\r\n .tiptap-button:disabled:hover {\r\n transform: none;\r\n color: #64748b;\r\n }\r\n\r\n .tiptap-button:disabled::before {\r\n opacity: 0;\r\n }\r\n\r\n /* Icônes Material Symbols */\r\n .tiptap-button .material-symbols-outlined {\r\n font-size: 20px;\r\n position: relative;\r\n z-index: 1;\r\n }\r\n\r\n .tiptap-button .material-symbols-outlined.icon-small {\r\n font-size: 16px;\r\n }\r\n\r\n .tiptap-button .material-symbols-outlined.icon-medium {\r\n font-size: 20px;\r\n }\r\n\r\n .tiptap-button .material-symbols-outlined.icon-large {\r\n font-size: 24px;\r\n }\r\n\r\n /* Boutons avec texte */\r\n .tiptap-button.text-button {\r\n width: auto;\r\n padding: 0 12px;\r\n font-size: 14px;\r\n font-weight: 500;\r\n }\r\n\r\n /* Boutons de couleur */\r\n .tiptap-button.color-button {\r\n width: 28px;\r\n height: 28px;\r\n border-radius: 50%;\r\n border: 2px solid transparent;\r\n transition: all 0.2s ease;\r\n }\r\n\r\n .tiptap-button.color-button:hover {\r\n border-color: #e2e8f0;\r\n transform: scale(1.1);\r\n }\r\n\r\n .tiptap-button.color-button.is-active {\r\n border-color: #6366f1;\r\n box-shadow: 0 0 0 2px rgba(99, 102, 241, 0.2);\r\n }\r\n\r\n /* Boutons avec variantes */\r\n .tiptap-button.primary {\r\n background: linear-gradient(135deg, #6366f1, #8b5cf6);\r\n color: white;\r\n }\r\n\r\n .tiptap-button.primary:hover {\r\n background: linear-gradient(135deg, #5b21b6, #7c3aed);\r\n color: white;\r\n }\r\n\r\n .tiptap-button.secondary {\r\n background: #f1f5f9;\r\n color: #64748b;\r\n }\r\n\r\n .tiptap-button.secondary:hover {\r\n background: #e2e8f0;\r\n color: #475569;\r\n }\r\n\r\n .tiptap-button.danger {\r\n color: #ef4444;\r\n }\r\n\r\n .tiptap-button.danger:hover {\r\n color: #dc2626;\r\n background: rgba(239, 68, 68, 0.1);\r\n }\r\n\r\n .tiptap-button.danger::before {\r\n background: linear-gradient(135deg, #ef4444, #dc2626);\r\n }\r\n\r\n /* Boutons de taille différente */\r\n .tiptap-button.small {\r\n width: 24px;\r\n height: 24px;\r\n }\r\n\r\n .tiptap-button.medium {\r\n width: 32px;\r\n height: 32px;\r\n }\r\n\r\n .tiptap-button.large {\r\n width: 40px;\r\n height: 40px;\r\n }\r\n\r\n /* Boutons avec badge */\r\n .tiptap-button.has-badge {\r\n position: relative;\r\n }\r\n\r\n .tiptap-button .badge {\r\n position: absolute;\r\n top: -4px;\r\n right: -4px;\r\n background: #ef4444;\r\n color: white;\r\n font-size: 10px;\r\n padding: 2px 4px;\r\n border-radius: 8px;\r\n min-width: 16px;\r\n text-align: center;\r\n line-height: 1;\r\n }\r\n\r\n /* Boutons avec tooltip */\r\n .tiptap-button.has-tooltip {\r\n position: relative;\r\n }\r\n\r\n .tiptap-button .tooltip {\r\n position: absolute;\r\n bottom: -30px;\r\n left: 50%;\r\n transform: translateX(-50%);\r\n background: rgba(0, 0, 0, 0.8);\r\n color: white;\r\n padding: 4px 8px;\r\n border-radius: 4px;\r\n font-size: 12px;\r\n white-space: nowrap;\r\n opacity: 0;\r\n visibility: hidden;\r\n transition: all 0.2s ease;\r\n z-index: 1000;\r\n }\r\n\r\n .tiptap-button:hover .tooltip {\r\n opacity: 1;\r\n visibility: visible;\r\n }\r\n\r\n /* Animation de pulsation pour les boutons actifs */\r\n @keyframes pulse {\r\n 0%,\r\n 100% {\r\n box-shadow: 0 0 0 0 rgba(99, 102, 241, 0.4);\r\n }\r\n 50% {\r\n box-shadow: 0 0 0 4px rgba(99, 102, 241, 0);\r\n }\r\n }\r\n\r\n .tiptap-button.is-active.pulse {\r\n animation: pulse 2s infinite;\r\n }\r\n\r\n /* Responsive */\r\n @media (max-width: 768px) {\r\n .tiptap-button {\r\n width: 32px;\r\n height: 32px;\r\n }\r\n\r\n .tiptap-button .material-symbols-outlined {\r\n font-size: 18px;\r\n }\r\n\r\n .tiptap-button.text-button {\r\n padding: 0 8px;\r\n font-size: 13px;\r\n }\r\n }\r\n `,\r\n ],\r\n})\r\nexport class TiptapButtonComponent {\r\n // Inputs\r\n icon = input.required<string>();\r\n title = input.required<string>();\r\n active = input(false);\r\n disabled = input(false);\r\n variant = input<\"default\" | \"text\" | \"danger\">(\"default\");\r\n size = input<\"small\" | \"medium\" | \"large\">(\"medium\");\r\n iconSize = input<\"small\" | \"medium\" | \"large\">(\"medium\");\r\n\r\n // Outputs\r\n onClick = output<Event>();\r\n\r\n onMouseDown(event: MouseEvent) {\r\n event.preventDefault();\r\n }\r\n}\r\n","import {\n Component,\n input,\n ViewChild,\n ElementRef,\n OnInit,\n OnDestroy,\n effect,\n signal,\n computed,\n} from \"@angular/core\";\nimport tippy, { Instance as TippyInstance } from \"tippy.js\";\nimport type { Editor } from \"@tiptap/core\";\nimport { CellSelection } from \"@tiptap/pm/tables\";\nimport { TiptapButtonComponent } from \"./tiptap-button.component\";\n\nexport interface BubbleMenuConfig {\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 separator?: boolean;\n}\n\n@Component({\n selector: \"tiptap-bubble-menu\",\n standalone: true,\n imports: [TiptapButtonComponent],\n template: `\n <div #menuRef class=\"bubble-menu\">\n @if (bubbleMenuConfig().bold) {\n <tiptap-button\n icon=\"format_bold\"\n title=\"Gras\"\n [active]=\"isActive('bold')\"\n (click)=\"onCommand('bold', $event)\"\n ></tiptap-button>\n } @if (bubbleMenuConfig().italic) {\n <tiptap-button\n icon=\"format_italic\"\n title=\"Italique\"\n [active]=\"isActive('italic')\"\n (click)=\"onCommand('italic', $event)\"\n ></tiptap-button>\n } @if (bubbleMenuConfig().underline) {\n <tiptap-button\n icon=\"format_underlined\"\n title=\"Souligné\"\n [active]=\"isActive('underline')\"\n (click)=\"onCommand('underline', $event)\"\n ></tiptap-button>\n } @if (bubbleMenuConfig().strike) {\n <tiptap-button\n icon=\"strikethrough_s\"\n title=\"Barré\"\n [active]=\"isActive('strike')\"\n (click)=\"onCommand('strike', $event)\"\n ></tiptap-button>\n } @if (bubbleMenuConfig().superscript) {\n <tiptap-button\n icon=\"superscript\"\n title=\"Exposant\"\n [active]=\"isActive('superscript')\"\n (click)=\"onCommand('superscript', $event)\"\n ></tiptap-button>\n } @if (bubbleMenuConfig().subscript) {\n <tiptap-button\n icon=\"subscript\"\n title=\"Indice\"\n [active]=\"isActive('subscript')\"\n (click)=\"onCommand('subscript', $event)\"\n ></tiptap-button>\n } @if (bubbleMenuConfig().highlight) {\n <tiptap-button\n icon=\"highlight\"\n title=\"Surbrillance\"\n [active]=\"isActive('highlight')\"\n (click)=\"onCommand('highlight', $event)\"\n ></tiptap-button>\n } @if (bubbleMenuConfig().separator && (bubbleMenuConfig().code ||\n bubbleMenuConfig().link)) {\n <div class=\"tiptap-separator\"></div>\n } @if (bubbleMenuConfig().code) {\n <tiptap-button\n icon=\"code\"\n title=\"Code\"\n [active]=\"isActive('code')\"\n (click)=\"onCommand('code', $event)\"\n ></tiptap-button>\n } @if (bubbleMenuConfig().link) {\n <tiptap-button\n icon=\"link\"\n title=\"Lien\"\n [active]=\"isActive('link')\"\n (click)=\"onCommand('link', $event)\"\n ></tiptap-button>\n }\n </div>\n `,\n styles: [],\n})\nexport class TiptapBubbleMenuComponent implements OnInit, OnDestroy {\n editor = input.required<Editor>();\n config = input<BubbleMenuConfig>({\n bold: true,\n italic: true,\n underline: true,\n strike: true,\n code: true,\n superscript: false,\n subscript: false,\n highlight: true,\n link: true,\n separator: true,\n });\n\n @ViewChild(\"menuRef\", { static: false }) menuRef!: ElementRef<HTMLDivElement>;\n\n private tippyInstance: TippyInstance | null = null;\n private updateTimeout: any = null;\n\n bubbleMenuConfig = computed(() => ({\n bold: true,\n italic: true,\n underline: true,\n strike: true,\n code: true,\n superscript: false,\n subscript: false,\n highlight: true,\n link: true,\n separator: true,\n ...this.config(),\n }));\n\n // Effect comme propriété de classe pour éviter l'erreur d'injection context\n constructor() {\n effect(() => {\n const ed = this.editor();\n if (!ed) return;\n\n // Nettoyer les anciens 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 // Ajouter les nouveaux 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 // Ne pas appeler updateMenu() ici pour éviter l'affichage prématuré\n // Il sera appelé automatiquement quand l'éditeur sera prêt\n });\n }\n\n ngOnInit() {\n // Initialiser Tippy de manière synchrone après que le component soit ready\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 // Nettoyer les timeouts\n if (this.updateTimeout) {\n clearTimeout(this.updateTimeout);\n }\n\n // Nettoyer Tippy\n if (this.tippyInstance) {\n this.tippyInstance.destroy();\n this.tippyInstance = null;\n }\n }\n\n private initTippy() {\n // Attendre que l'élément soit disponible\n if (!this.menuRef?.nativeElement) {\n setTimeout(() => this.initTippy(), 50);\n return;\n }\n\n const menuElement = this.menuRef.nativeElement;\n\n // S'assurer qu'il n'y a pas déjà une instance\n if (this.tippyInstance) {\n this.tippyInstance.destroy();\n }\n\n // Créer l'instance Tippy\n this.tippyInstance = tippy(document.body, {\n content: menuElement,\n trigger: \"manual\",\n placement: \"top-start\",\n appendTo: () => document.body,\n interactive: true,\n arrow: false,\n offset: [0, 8],\n hideOnClick: false,\n onShow: (instance) => {\n // S'assurer que les autres menus sont fermés\n this.hideOtherMenus();\n },\n getReferenceClientRect: () => this.getSelectionRect(),\n // Améliorer le positionnement avec scroll\n popperOptions: {\n modifiers: [\n {\n name: \"preventOverflow\",\n options: {\n boundary: \"viewport\",\n padding: 8,\n },\n },\n {\n name: \"flip\",\n options: {\n fallbackPlacements: [\"bottom-start\", \"top-end\", \"bottom-end\"],\n },\n },\n ],\n },\n });\n\n // Maintenant que Tippy est initialisé, faire un premier check\n this.updateMenu();\n }\n\n private getSelectionRect(): DOMRect {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) {\n return new DOMRect(0, 0, 0, 0);\n }\n\n const range = selection.getRangeAt(0);\n return range.getBoundingClientRect();\n }\n\n updateMenu = () => {\n // Debounce pour éviter les appels trop fréquents\n if (this.updateTimeout) {\n clearTimeout(this.updateTimeout);\n }\n\n this.updateTimeout = setTimeout(() => {\n const ed = this.editor();\n if (!ed) return;\n\n const { selection } = ed.state;\n const { from, to } = selection;\n const hasTextSelection =\n from !== to && !(selection instanceof CellSelection);\n const isImageSelected =\n ed.isActive(\"image\") || ed.isActive(\"resizableImage\");\n const isTableCellSelected =\n ed.isActive(\"tableCell\") || ed.isActive(\"tableHeader\");\n const hasCellSelection = selection instanceof CellSelection;\n\n // Ne montrer le menu texte que si :\n // - Il y a une sélection de texte (pas une sélection de cellules multiples)\n // - Aucune image n'est sélectionnée (priorité aux images)\n // - Ce n'est pas une sélection de cellules multiples (CellSelection)\n // - L'éditeur est éditable\n // Note: Le texte dans une cellule est autorisé (isTableCellSelected peut être true)\n const shouldShow =\n hasTextSelection &&\n !isImageSelected &&\n !hasCellSelection &&\n ed.isEditable;\n\n if (shouldShow) {\n this.showTippy();\n } else {\n this.hideTippy();\n }\n }, 10);\n };\n\n handleBlur = () => {\n // Masquer le menu quand l'éditeur perd le focus\n setTimeout(() => {\n this.hideTippy();\n }, 100);\n };\n\n private hideOtherMenus() {\n // Cette méthode peut être étendue pour fermer d'autres menus si nécessaire\n // Pour l'instant, elle sert de placeholder pour une future coordination entre menus\n }\n\n private showTippy() {\n if (!this.tippyInstance) return;\n\n // Mettre à jour la position\n this.tippyInstance.setProps({\n getReferenceClientRect: () => this.getSelectionRect(),\n });\n\n this.tippyInstance.show();\n }\n\n hideTippy() {\n if (this.tippyInstance) {\n this.tippyInstance.hide();\n }\n }\n\n isActive(mark: string): boolean {\n const ed = this.editor();\n return ed?.isActive(mark) || false;\n }\n\n onCommand(command: string, event: MouseEvent) {\n event.preventDefault();\n const ed = this.editor();\n if (!ed) return;\n\n switch (command) {\n case \"bold\":\n ed.chain().focus().toggleBold().run();\n break;\n case \"italic\":\n ed.chain().focus().toggleItalic().run();\n break;\n case \"underline\":\n ed.chain().focus().toggleUnderline().run();\n break;\n case \"strike\":\n ed.chain().focus().toggleStrike().run();\n break;\n case \"code\":\n ed.chain().focus().toggleCode().run();\n break;\n case \"superscript\":\n ed.chain().focus().toggleSuperscript().run();\n break;\n case \"subscript\":\n ed.chain().focus().toggleSubscript().run();\n break;\n case \"highlight\":\n ed.chain().focus().toggleHighlight().run();\n break;\n case \"link\":\n const href = window.prompt(\"URL du lien:\");\n if (href) {\n ed.chain().focus().toggleLink({ href }).run();\n }\n break;\n }\n }\n}\n","import { Component, input } from \"@angular/core\";\n\n@Component({\n selector: \"tiptap-separator\",\n standalone: true,\n template: `\n <div\n class=\"tiptap-separator\"\n [class.vertical]=\"orientation() === 'vertical'\"\n [class.horizontal]=\"orientation() === 'horizontal'\"\n [class.small]=\"size() === 'small'\"\n [class.medium]=\"size() === 'medium'\"\n [class.large]=\"size() === 'large'\"\n ></div>\n `,\n styles: [\n `\n .tiptap-separator {\n background-color: #e2e8f0;\n margin: 0;\n }\n\n .tiptap-separator.vertical {\n width: 1px;\n height: 24px;\n margin: 0 8px;\n }\n\n .tiptap-separator.horizontal {\n height: 1px;\n width: 100%;\n margin: 8px 0;\n }\n\n .tiptap-separator.small.vertical {\n height: 16px;\n margin: 0 4px;\n }\n\n .tiptap-separator.small.horizontal {\n margin: 4px 0;\n }\n\n .tiptap-separator.medium.vertical {\n height: 24px;\n margin: 0 8px;\n }\n\n .tiptap-separator.medium.horizontal {\n margin: 8px 0;\n }\n\n .tiptap-separator.large.vertical {\n height: 32px;\n margin: 0 12px;\n }\n\n .tiptap-separator.large.horizontal {\n margin: 12px 0;\n }\n `,\n ],\n})\nexport class TiptapSeparatorComponent {\n orientation = input<\"vertical\" | \"horizontal\">(\"vertical\");\n size = input<\"small\" | \"medium\" | \"large\">(\"medium\");\n}\n","import { Injectable, signal, computed } from \"@angular/core\";\r\nimport { Editor } from \"@tiptap/core\";\r\nimport { Observable, isObservable, firstValueFrom } from \"rxjs\";\r\n\r\nexport interface ImageData {\r\n src: string;\r\n alt?: string;\r\n title?: string;\r\n width?: number;\r\n height?: number;\r\n}\r\n\r\nexport interface ImageUploadResult {\r\n src: string;\r\n name: string;\r\n size: number;\r\n type: string;\r\n width?: number;\r\n height?: number;\r\n originalSize?: number;\r\n}\r\n\r\nexport interface ResizeOptions {\r\n width?: number;\r\n height?: number;\r\n maintainAspectRatio?: boolean;\r\n}\r\n\r\n/**\r\n * Context passed to the image upload handler containing information about the image\r\n */\r\nexport interface ImageUploadContext {\r\n /** Original file being uploaded */\r\n file: File;\r\n /** Width of the processed image */\r\n width: number;\r\n /** Height of the processed image */\r\n height: number;\r\n /** MIME type of the image */\r\n type: string;\r\n /** Base64 data URL of the processed image (after compression/resize) */\r\n base64: string;\r\n}\r\n\r\n/**\r\n * Result expected from a custom image upload handler.\r\n * Must contain at least the `src` property with the image URL.\r\n */\r\nexport interface ImageUploadHandlerResult {\r\n /** URL of the uploaded image (can be a remote URL or any string) */\r\n src: string;\r\n /** Optional custom alt text */\r\n alt?: string;\r\n /** Optional custom title */\r\n title?: string;\r\n}\r\n\r\n/**\r\n * Custom handler function for image uploads.\r\n * Allows users to implement their own image storage logic (e.g., upload to S3, Cloudinary, etc.)\r\n *\r\n * Can return either a Promise or an Observable (Angular-friendly).\r\n *\r\n * @param context - Context containing the image file and metadata\r\n * @returns Promise or Observable resolving to ImageUploadHandlerResult\r\n *\r\n * @example Using Promise (async/await)\r\n * ```typescript\r\n * uploadHandler: ImageUploadHandler = async (ctx) => {\r\n * const formData = new FormData();\r\n * formData.append('image', ctx.file);\r\n * const result = await firstValueFrom(this.http.post<{url: string}>('/api/upload', formData));\r\n * return { src: result.url };\r\n * };\r\n * ```\r\n *\r\n * @example Using Observable (Angular HttpClient)\r\n * ```typescript\r\n * uploadHandler: ImageUploadHandler = (ctx) => {\r\n * const formData = new FormData();\r\n * formData.append('image', ctx.file);\r\n * return this.http.post<{url: string}>('/api/upload', formData).pipe(\r\n * map(result => ({ src: result.url }))\r\n * );\r\n * };\r\n * ```\r\n */\r\nexport type ImageUploadHandler = (\r\n context: ImageUploadContext\r\n) => Promise<ImageUploadHandlerResult> | Observable<ImageUploadHandlerResult>;\r\n\r\n\r\n@Injectable({\r\n providedIn: \"root\",\r\n})\r\nexport class ImageService {\r\n // Signals pour l'état des images\r\n selectedImage = signal<ImageData | null>(null);\r\n isImageSelected = computed(() => this.selectedImage() !== null);\r\n isResizing = signal(false);\r\n\r\n // Signaux pour l'upload\r\n isUploading = signal(false);\r\n uploadProgress = signal(0);\r\n uploadMessage = signal(\"\");\r\n\r\n /**\r\n * Custom upload handler for images.\r\n * When set, this handler will be called instead of the default base64 conversion.\r\n * This allows users to implement their own image storage logic.\r\n *\r\n * @example\r\n * ```typescript\r\n * imageService.uploadHandler = async (context) => {\r\n * const formData = new FormData();\r\n * formData.append('image', context.file);\r\n * const response = await fetch('/api/upload', { method: 'POST', body: formData });\r\n * const data = await response.json();\r\n * return { src: data.url };\r\n * };\r\n * ```\r\n */\r\n uploadHandler: ImageUploadHandler | null = null;\r\n\r\n // Référence à l'éditeur pour les mises à jour\r\n private currentEditor: Editor | null = null;\r\n\r\n // Méthodes pour la gestion des images\r\n selectImage(editor: Editor): void {\r\n if (editor.isActive(\"resizableImage\")) {\r\n const attrs = editor.getAttributes(\"resizableImage\");\r\n this.selectedImage.set({\r\n src: attrs[\"src\"],\r\n alt: attrs[\"alt\"],\r\n title: attrs[\"title\"],\r\n width: attrs[\"width\"],\r\n height: attrs[\"height\"],\r\n });\r\n } else {\r\n this.selectedImage.set(null);\r\n }\r\n }\r\n\r\n clearSelection(): void {\r\n this.selectedImage.set(null);\r\n }\r\n\r\n // Méthodes pour manipuler les images\r\n insertImage(editor: Editor, imageData: ImageData): void {\r\n editor.chain().focus().setResizableImage(imageData).run();\r\n }\r\n\r\n updateImageAttributes(editor: Editor, attributes: Partial<ImageData>): void {\r\n if (editor.isActive(\"resizableImage\")) {\r\n editor\r\n .chain()\r\n .focus()\r\n .updateAttributes(\"resizableImage\", attributes)\r\n .run();\r\n this.updateSelectedImage(attributes);\r\n }\r\n }\r\n\r\n // Nouvelles méthodes pour le redimensionnement\r\n resizeImage(editor: Editor, options: ResizeOptions): void {\r\n if (!editor.isActive(\"resizableImage\")) return;\r\n\r\n const currentAttrs = editor.getAttributes(\"resizableImage\");\r\n let newWidth = options.width;\r\n let newHeight = options.height;\r\n\r\n // Maintenir le ratio d'aspect si demandé\r\n if (\r\n options.maintainAspectRatio !== false &&\r\n currentAttrs[\"width\"] &&\r\n currentAttrs[\"height\"]\r\n ) {\r\n const aspectRatio = currentAttrs[\"width\"] / currentAttrs[\"height\"];\r\n\r\n if (newWidth && !newHeight) {\r\n newHeight = Math.round(newWidth / aspectRatio);\r\n } else if (newHeight && !newWidth) {\r\n newWidth = Math.round(newHeight * aspectRatio);\r\n }\r\n }\r\n\r\n // Appliquer des limites minimales\r\n if (newWidth) newWidth = Math.max(50, newWidth);\r\n if (newHeight) newHeight = Math.max(50, newHeight);\r\n\r\n this.updateImageAttributes(editor, {\r\n width: newWidth,\r\n height: newHeight,\r\n });\r\n }\r\n\r\n // Méthodes pour redimensionner par pourcentage\r\n resizeImageByPercentage(editor: Editor, percentage: number): void {\r\n if (!editor.isActive(\"resizableImage\")) return;\r\n\r\n const currentAttrs = editor.getAttributes(\"resizableImage\");\r\n if (!currentAttrs[\"width\"] || !currentAttrs[\"height\"]) return;\r\n\r\n const newWidth = Math.round(currentAttrs[\"width\"] * (percentage / 100));\r\n const newHeight = Math.round(currentAttrs[\"height\"] * (percentage / 100));\r\n\r\n this.resizeImage(editor, { width: newWidth, height: newHeight });\r\n }\r\n\r\n // Méthodes pour redimensionner à des tailles prédéfinies\r\n resizeImageToSmall(editor: Editor): void {\r\n this.resizeImage(editor, {\r\n width: 300,\r\n height: 200,\r\n maintainAspectRatio: true,\r\n });\r\n }\r\n\r\n resizeImageToMedium(editor: Editor): void {\r\n this.resizeImage(editor, {\r\n width: 500,\r\n height: 350,\r\n maintainAspectRatio: true,\r\n });\r\n }\r\n\r\n resizeImageToLarge(editor: Editor): void {\r\n this.resizeImage(editor, {\r\n width: 800,\r\n height: 600,\r\n maintainAspectRatio: true,\r\n });\r\n }\r\n\r\n resizeImageToOriginal(editor: Editor): void {\r\n if (!editor.isActive(\"resizableImage\")) return;\r\n\r\n const img = new Image();\r\n img.onload = () => {\r\n this.resizeImage(editor, {\r\n width: img.naturalWidth,\r\n height: img.naturalHeight,\r\n });\r\n };\r\n img.src = editor.getAttributes(\"resizableImage\")[\"src\"];\r\n }\r\n\r\n // Méthode pour redimensionner librement (sans maintenir le ratio)\r\n resizeImageFreely(editor: Editor, width: number, height: number): void {\r\n this.resizeImage(editor, {\r\n width,\r\n height,\r\n maintainAspectRatio: false,\r\n });\r\n }\r\n\r\n // Méthode pour obtenir les dimensions actuelles de l'image\r\n getImageDimensions(editor: Editor): { width: number; height: number } | null {\r\n if (!editor.isActive(\"resizableImage\")) return null;\r\n\r\n const attrs = editor.getAttributes(\"resizableImage\");\r\n return {\r\n width: attrs[\"width\"] || 0,\r\n height: attrs[\"height\"] || 0,\r\n };\r\n }\r\n\r\n // Méthode pour obtenir les dimensions naturelles de l'image\r\n getNaturalImageDimensions(\r\n src: string\r\n ): Promise<{ width: number; height: number }> {\r\n return new Promise((resolve, reject) => {\r\n const img = new Image();\r\n img.onload = () => {\r\n resolve({ width: img.naturalWidth, height: img.naturalHeight });\r\n };\r\n img.onerror = () => {\r\n reject(new Error(\"Impossible de charger l'image\"));\r\n };\r\n img.src = src;\r\n });\r\n }\r\n\r\n deleteImage(editor: Editor): void {\r\n if (editor.isActive(\"resizableImage\")) {\r\n editor.chain().focus().deleteSelection().run();\r\n this.clearSelection();\r\n }\r\n }\r\n\r\n // Méthodes utilitaires\r\n private updateSelectedImage(attributes: Partial<ImageData>): void {\r\n const current = this.selectedImage();\r\n if (current) {\r\n this.selectedImage.set({ ...current, ...attributes });\r\n }\r\n }\r\n\r\n // Validation des images\r\n validateImage(\r\n file: File,\r\n maxSize: number = 5 * 1024 * 1024\r\n ): { valid: boolean; error?: string } {\r\n if (!file.type.startsWith(\"image/\")) {\r\n return { valid: false, error: \"Le fichier doit être une image\" };\r\n }\r\n\r\n if (file.size > maxSize) {\r\n return {\r\n valid: false,\r\n error: `L'image est trop volumineuse (max ${maxSize / 1024 / 1024}MB)`,\r\n };\r\n }\r\n\r\n return { valid: true };\r\n }\r\n\r\n // Compression d'image\r\n async compressImage(\r\n file: File,\r\n quality: number = 0.8,\r\n maxWidth: number = 1920,\r\n maxHeight: number = 1080\r\n ): Promise<ImageUploadResult> {\r\n return new Promise((resolve, reject) => {\r\n const canvas = document.createElement(\"canvas\");\r\n const ctx = canvas.getContext(\"2d\");\r\n const img = new Image();\r\n\r\n img.onload = () => {\r\n // Mise à jour du progrès\r\n if (this.isUploading()) {\r\n this.uploadProgress.set(40);\r\n this.uploadMessage.set(\"Redimensionnement...\");\r\n this.forceEditorUpdate();\r\n }\r\n\r\n let { width, height } = img;\r\n\r\n // Redimensionner si nécessaire\r\n if (width > maxWidth || height > maxHeight) {\r\n const ratio = Math.min(maxWidth / width, maxHeight / height);\r\n width *= ratio;\r\n height *= ratio;\r\n }\r\n\r\n canvas.width = width;\r\n canvas.height = height;\r\n\r\n // Dessiner l'image redimensionnée\r\n ctx?.drawImage(img, 0, 0, width, height);\r\n\r\n // Mise à jour du progrès\r\n if (this.isUploading()) {\r\n this.uploadProgress.set(60);\r\n this.uploadMessage.set(\"Compression...\");\r\n this.forceEditorUpdate();\r\n }\r\n\r\n // Convertir en base64 avec compression\r\n canvas.toBlob(\r\n (blob) => {\r\n if (blob) {\r\n const reader = new FileReader();\r\n reader.onload = (e) => {\r\n const base64 = e.target?.result as string;\r\n if (base64) {\r\n const result: ImageUploadResult = {\r\n src: base64,\r\n name: file.name,\r\n size: blob.size,\r\n type: file.type,\r\n width: Math.round(width),\r\n height: Math.round(height),\r\n originalSize: file.size,\r\n };\r\n resolve(result);\r\n } else {\r\n reject(new Error(\"Erreur lors de la compression\"));\r\n }\r\n };\r\n reader.readAsDataURL(blob);\r\n } else {\r\n reject(new Error(\"Erreur lors de la compression\"));\r\n }\r\n },\r\n file.type,\r\n quality\r\n );\r\n };\r\n\r\n img.onerror = () =>\r\n reject(new Error(\"Erreur lors du chargement de l'image\"));\r\n img.src = URL.createObjectURL(file);\r\n });\r\n }\r\n\r\n // Méthode privée générique pour uploader avec progression\r\n private async uploadImageWithProgress(\r\n editor: Editor,\r\n file: File,\r\n insertionStrategy: (editor: Editor, result: ImageUploadResult) => void,\r\n actionMessage: string,\r\n options?: {\r\n quality?: number;\r\n maxWidth?: number;\r\n maxHeight?: number;\r\n }\r\n ): Promise<void> {\r\n try {\r\n // Stocker la référence à l'éditeur\r\n this.currentEditor = editor;\r\n\r\n this.isUploading.set(true);\r\n this.uploadProgress.set(0);\r\n this.uploadMessage.set(\"Validation du fichier...\");\r\n this.forceEditorUpdate();\r\n\r\n // Validation\r\n const validation = this.validateImage(file);\r\n if (!validation.valid) {\r\n throw new Error(validation.error);\r\n }\r\n\r\n this.uploadProgress.set(20);\r\n this.uploadMessage.set(\"Compression en cours...\");\r\n this.forceEditorUpdate();\r\n\r\n // Petit délai pour permettre à l'utilisateur de voir la progression\r\n await new Promise((resolve) => setTimeout(resolve, 200));\r\n\r\n const result = await this.compressImage(\r\n file,\r\n options?.quality || 0.8,\r\n options?.maxWidth || 1920,\r\n options?.maxHeight || 1080\r\n );\r\n\r\n this.uploadProgress.set(80);\r\n\r\n // Si un handler personnalisé est défini, l'utiliser pour l'upload\r\n if (this.uploadHandler) {\r\n this.uploadMessage.set(\"Upload vers le serveur...\");\r\n this.forceEditorUpdate();\r\n\r\n try {\r\n const handlerResponse = this.uploadHandler({\r\n file,\r\n width: result.width || 0,\r\n height: result.height || 0,\r\n type: result.type,\r\n base64: result.src,\r\n });\r\n\r\n // Convertir Observable en Promise si nécessaire\r\n const handlerResult = isObservable(handlerResponse)\r\n ? await firstValueFrom(handlerResponse)\r\n : await handlerResponse;\r\n\r\n // Remplacer le src base64 par l'URL retournée par le handler\r\n result.src = handlerResult.src;\r\n\r\n // Appliquer les overrides optionnels du handler\r\n if (handlerResult.alt) {\r\n result.name = handlerResult.alt;\r\n }\r\n } catch (handlerError) {\r\n console.error(\"Erreur lors de l'upload personnalisé:\", handlerError);\r\n throw handlerError;\r\n }\r\n }\r\n\r\n this.uploadMessage.set(actionMessage);\r\n this.forceEditorUpdate();\r\n\r\n // Petit délai pour l'action\r\n await new Promise((resolve) => setTimeout(resolve, 100));\r\n\r\n // Exécuter la stratégie d'insertion\r\n insertionStrategy(editor, result);\r\n\r\n // L'action est terminée, maintenant on peut cacher l'indicateur\r\n this.isUploading.set(false);\r\n this.uploadProgress.set(0);\r\n this.uploadMessage.set(\"\");\r\n this.forceEditorUpdate();\r\n this.currentEditor = null;\r\n } catch (error) {\r\n this.isUploading.set(false);\r\n this.uploadProgress.set(0);\r\n this.uploadMessage.set(\"\");\r\n this.forceEditorUpdate();\r\n this.currentEditor = null;\r\n console.error(\"Erreur lors de l'upload d'image:\", error);\r\n throw error;\r\n }\r\n }\r\n\r\n // Méthode unifiée pour uploader et insérer une image\r\n async uploadAndInsertImage(\r\n editor: Editor,\r\n file: File,\r\n options?: {\r\n quality?: number;\r\n maxWidth?: number;\r\n maxHeight?: number;\r\n }\r\n ): Promise<void> {\r\n return this.uploadImageWithProgress(\r\n editor,\r\n file,\r\n (editor, result) => {\r\n this.insertImage(editor, {\r\n src: result.src,\r\n alt: result.name,\r\n title: `${result.name} (${result.width}×${result.height})`,\r\n width: result.width,\r\n height: result.height,\r\n });\r\n },\r\n \"Insertion dans l'éditeur...\",\r\n options\r\n );\r\n }\r\n\r\n // Méthode pour forcer la mise à jour de l'éditeur\r\n private forceEditorUpdate() {\r\n if (this.currentEditor) {\r\n // Déclencher une transaction vide pour forcer la mise à jour des décorations\r\n const { tr } = this.currentEditor.state;\r\n this.currentEditor.view.dispatch(tr);\r\n }\r\n }\r\n\r\n // Méthode privée générique pour créer un sélecteur de fichier\r\n private async selectFileAndProcess(\r\n editor: Editor,\r\n uploadMethod: (editor: Editor, file: File, options?: any) => Promise<void>,\r\n options?: {\r\n quality?: number;\r\n maxWidth?: number;\r\n maxHeight?: number;\r\n accept?: string;\r\n }\r\n ): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n const input = document.createElement(\"input\");\r\n input.type = \"file\";\r\n input.accept = options?.accept || \"image/*\";\r\n input.style.display = \"none\";\r\n\r\n input.addEventListener(\"change\", async (e) => {\r\n const file = (e.target as HTMLInputElement).files?.[0];\r\n if (file && file.type.startsWith(\"image/\")) {\r\n try {\r\n await uploadMethod(editor, file, options);\r\n resolve();\r\n } catch (error) {\r\n reject(error);\r\n }\r\n } else {\r\n reject(new Error(\"Aucun fichier image sélectionné\"));\r\n }\r\n document.body.removeChild(input);\r\n });\r\n\r\n input.addEventListener(\"cancel\", () => {\r\n document.body.removeChild(input);\r\n reject(new Error(\"Sélection annulée\"));\r\n });\r\n\r\n document.body.appendChild(input);\r\n input.click();\r\n });\r\n }\r\n\r\n // Méthode pour créer un sélecteur de fichier et uploader une image\r\n async selectAndUploadImage(\r\n editor: Editor,\r\n options?: {\r\n quality?: number;\r\n maxWidth?: number;\r\n maxHeight?: number;\r\n accept?: string;\r\n }\r\n ): Promise<void> {\r\n return this.selectFileAndProcess(\r\n editor,\r\n this.uploadAndInsertImage.bind(this),\r\n options\r\n );\r\n }\r\n\r\n // Méthode pour sélectionner et remplacer une image existante\r\n async selectAndReplaceImage(\r\n editor: Editor,\r\n options?: {\r\n quality?: number;\r\n maxWidth?: number;\r\n maxHeight?: number;\r\n accept?: string;\r\n }\r\n ): Promise<void> {\r\n return this.selectFileAndProcess(\r\n editor,\r\n this.uploadAndReplaceImage.bind(this),\r\n options\r\n );\r\n }\r\n\r\n // Méthode pour remplacer une image existante avec indicateur de progression\r\n async uploadAndReplaceImage(\r\n editor: Editor,\r\n file: File,\r\n options?: {\r\n quality?: number;\r\n maxWidth?: number;\r\n maxHeight?: number;\r\n }\r\n ): Promise<void> {\r\n // Sauvegarder les attributs de l'image actuelle pour restauration en cas d'échec\r\n const currentImageAttrs = editor.getAttributes(\"resizableImage\");\r\n const backupImage = { ...currentImageAttrs };\r\n\r\n try {\r\n // Supprimer visuellement l'ancienne image immédiatement\r\n editor.chain().focus().deleteSelection().run();\r\n\r\n // Stocker la référence à l'éditeur\r\n this.currentEditor = editor;\r\n\r\n this.isUploading.set(true);\r\n this.uploadProgress.set(0);\r\n this.uploadMessage.set(\"Validation du fichier...\");\r\n this.forceEditorUpdate();\r\n\r\n // Validation\r\n const validation = this.validateImage(file);\r\n if (!validation.valid) {\r\n throw new Error(validation.error);\r\n }\r\n\r\n this.uploadProgress.set(20);\r\n this.uploadMessage.set(\"Compression en cours...\");\r\n this.forceEditorUpdate();\r\n\r\n // Petit délai pour permettre à l'utilisateur de voir la progression\r\n await new Promise((resolve) => setTimeout(resolve, 200));\r\n\r\n const result = await this.compressImage(\r\n file,\r\n options?.quality || 0.8,\r\n options?.maxWidth || 1920,\r\n options?.maxHeight || 1080\r\n );\r\n\r\n this.uploadProgress.set(80);\r\n this.uploadMessage.set(\"Remplacement de l'image...\");\r\n this.forceEditorUpdate();\r\n\r\n // Petit délai pour le remplacement\r\n await new Promise((resolve) => setTimeout(resolve, 100));\r\n\r\n // Insérer la nouvelle image à la position actuelle\r\n this.insertImage(editor, {\r\n src: result.src,\r\n alt: result.name,\r\n title: `${result.name} (${result.width}×${result.height})`,\r\n width: result.width,\r\n height: result.height,\r\n });\r\n\r\n // L'image est remplacée, maintenant on peut cacher l'indicateur\r\n this.isUploading.set(false);\r\n this.uploadProgress.set(0);\r\n this.uploadMessage.set(\"\");\r\n this.forceEditorUpdate();\r\n this.currentEditor = null;\r\n } catch (error) {\r\n // En cas d'erreur, restaurer l'image originale\r\n if (backupImage[\"src\"]) {\r\n this.insertImage(editor, {\r\n src: backupImage[\"src\"] as string,\r\n alt: backupImage[\"alt\"] as string,\r\n title: backupImage[\"title\"] as string,\r\n width: backupImage[\"width\"] as number,\r\n height: backupImage[\"height\"] as number,\r\n });\r\n }\r\n\r\n this.isUploading.set(false);\r\n this.uploadProgress.set(0);\r\n this.uploadMessage.set(\"\");\r\n this.forceEditorUpdate();\r\n this.currentEditor = null;\r\n console.error(\"Erreur lors du remplacement d'image:\", error);\r\n throw error;\r\n }\r\n }\r\n}\r\n","import {\r\n Component,\r\n input,\r\n ViewChild,\r\n ElementRef,\r\n OnInit,\r\n OnDestroy,\r\n computed,\r\n inject,\r\n effect,\r\n} from \"@angular/core\";\r\nimport tippy, { Instance as TippyInstance } from \"tippy.js\";\r\nimport type { Editor } from \"@tiptap/core\";\r\nimport { TiptapButtonComponent } from \"./tiptap-button.component\";\r\nimport { TiptapSeparatorComponent } from \"./tiptap-separator.component\";\r\nimport { ImageService } from \"./services/image.service\";\r\nimport { ImageBubbleMenuConfig } from \"./models/bubble-menu.model\";\r\n\r\n@Component({\r\n selector: \"tiptap-image-bubble-menu\",\r\n standalone: true,\r\n imports: [TiptapButtonComponent, TiptapSeparatorComponent],\r\n template: `\r\n <div #menuRef class=\"bubble-menu\">\r\n @if (imageBubbleMenuConfig().changeImage) {\r\n <tiptap-button\r\n icon=\"drive_file_rename_outline\"\r\n title=\"Changer l'image\"\r\n (click)=\"onCommand('changeImage', $event)\"\r\n ></tiptap-button>\r\n } @if (imageBubbleMenuConfig().separator && hasResizeButtons()) {\r\n <tiptap-separator></tiptap-separator>\r\n } @if (imageBubbleMenuConfig().resizeSmall) {\r\n <tiptap-button\r\n icon=\"crop_square\"\r\n iconSize=\"small\"\r\n title=\"Petite (300×200)\"\r\n (click)=\"onCommand('resizeSmall', $event)\"\r\n ></tiptap-button>\r\n } @if (imageBubbleMenuConfig().resizeMedium) {\r\n <tiptap-button\r\n icon=\"crop_square\"\r\n iconSize=\"medium\"\r\n title=\"Moyenne (500×350)\"\r\n (click)=\"onCommand('resizeMedium', $event)\"\r\n ></tiptap-button>\r\n } @if (imageBubbleMenuConfig().resizeLarge) {\r\n <tiptap-button\r\n icon=\"crop_square\"\r\n iconSize=\"large\"\r\n title=\"Grande (800×600)\"\r\n (click)=\"onCommand('resizeLarge', $event)\"\r\n ></tiptap-button>\r\n } @if (imageBubbleMenuConfig().resizeOriginal) {\r\n <tiptap-button\r\n icon=\"photo_size_select_actual\"\r\n title=\"Taille originale\"\r\n (click)=\"onCommand('resizeOriginal', $event)\"\r\n ></tiptap-button>\r\n } @if (imageBubbleMenuConfig().separator &&\r\n imageBubbleMenuConfig().deleteImage) {\r\n <tiptap-separator></tiptap-separator>\r\n } @if (imageBubbleMenuConfig().deleteImage) {\r\n <tiptap-button\r\n icon=\"delete\"\r\n title=\"Supprimer l'image\"\r\n variant=\"danger\"\r\n (click)=\"onCommand('deleteImage', $event)\"\r\n ></tiptap-button>\r\n }\r\n </div>\r\n `,\r\n styles: [],\r\n})\r\nexport class TiptapImageBubbleMenuComponent implements OnInit, OnDestroy {\r\n editor = input.required<Editor>();\r\n config = input<ImageBubbleMenuConfig>({\r\n changeImage: true,\r\n resizeSmall: true,\r\n resizeMedium: true,\r\n resizeLarge: true,\r\n resizeOriginal: true,\r\n deleteImage: true,\r\n separator: true,\r\n });\r\n\r\n @ViewChild(\"menuRef\", { static: false }) menuRef!: ElementRef<HTMLDivElement>;\r\n\r\n private tippyInstance: TippyInstance | null = null;\r\n private imageService = inject(ImageService);\r\n private updateTimeout: any = null;\r\n\r\n imageBubbleMenuConfig = computed(() => ({\r\n changeImage: true,\r\n resizeSmall: true,\r\n resizeMedium: true,\r\n resizeLarge: true,\r\n resizeOriginal: true,\r\n deleteImage: true,\r\n separator: true,\r\n ...this.config(),\r\n }));\r\n\r\n hasResizeButtons = computed(() => {\r\n const config = this.imageBubbleMenuConfig();\r\n return (\r\n config.resizeSmall ||\r\n config.resizeMedium ||\r\n config.resizeLarge ||\r\n config.resizeOriginal\r\n );\r\n });\r\n\r\n constructor() {\r\n effect(() => {\r\n const ed = this.editor();\r\n if (!ed) return;\r\n\r\n // Nettoyer les anciens listeners\r\n ed.off(\"selectionUpdate\", this.updateMenu);\r\n ed.off(\"transaction\", this.updateMenu);\r\n ed.off(\"focus\", this.updateMenu);\r\n ed.off(\"blur\", this.handleBlur);\r\n\r\n // Ajouter les nouveaux listeners\r\n ed.on(\"selectionUpdate\", this.updateMenu);\r\n ed.on(\"transaction\", this.updateMenu);\r\n ed.on(\"focus\", this.updateMenu);\r\n ed.on(\"blur\", this.handleBlur);\r\n\r\n // Ne pas appeler updateMenu() ici pour éviter l'affichage prématuré\r\n // Il sera appelé automatiquement quand l'éditeur sera prêt\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n // Initialiser Tippy de manière synchrone après que le component soit ready\r\n this.initTippy();\r\n }\r\n\r\n ngOnDestroy() {\r\n const ed = this.editor();\r\n if (ed) {\r\n ed.off(\"selectionUpdate\", this.updateMenu);\r\n ed.off(\"transaction\", this.updateMenu);\r\n ed.off(\"focus\", this.updateMenu);\r\n ed.off(\"blur\", this.handleBlur);\r\n }\r\n\r\n // Nettoyer les timeouts\r\n if (this.updateTimeout) {\r\n clearTimeout(this.updateTimeout);\r\n }\r\n\r\n // Nettoyer Tippy\r\n if (this.tippyInstance) {\r\n this.tippyInstance.destroy();\r\n this.tippyInstance = null;\r\n }\r\n }\r\n\r\n private initTippy() {\r\n // Attendre que l'élément soit disponible\r\n if (!this.menuRef?.nativeElement) {\r\n setTimeout(() => this.initTippy(), 50);\r\n return;\r\n }\r\n\r\n const menuElement = this.menuRef.nativeElement;\r\n\r\n // S'assurer qu'il n'y a pas déjà une instance\r\n if (this.tippyInstance) {\r\n this.tippyInstance.destroy();\r\n }\r\n\r\n // Créer l'instance Tippy\r\n this.tippyInstance = tippy(document.body, {\r\n content: menuElement,\r\n trigger: \"manual\",\r\n placement: \"top-start\",\r\n appendTo: () => document.body,\r\n interactive: true,\r\n arrow: false,\r\n offset: [0, 8],\r\n hideOnClick: false,\r\n onShow: (instance) => {\r\n // S'assurer que les autres menus sont fermés\r\n this.hideOtherMenus();\r\n },\r\n getReferenceClientRect: () => this.getImageRect(),\r\n // Améliorer le positionnement avec scroll\r\n popperOptions: {\r\n modifiers: [\r\n {\r\n name: \"preventOverflow\",\r\n options: {\r\n boundary: \"viewport\",\r\n padding: 8,\r\n },\r\n },\r\n {\r\n name: \"flip\",\r\n options: {\r\n fallbackPlacements: [\"bottom-start\", \"top-end\", \"bottom-end\"],\r\n },\r\n },\r\n ],\r\n },\r\n });\r\n\r\n // Maintenant que Tippy est initialisé, faire un premier check\r\n this.updateMenu();\r\n }\r\n\r\n private getImageRect(): DOMRect {\r\n const ed = this.editor();\r\n if (!ed) return new DOMRect(0, 0, 0, 0);\r\n\r\n // Trouver l'image sélectionnée dans le DOM\r\n const { from } = ed.state.selection;\r\n\r\n // Fonction pour trouver toutes les images dans l'éditeur\r\n const getAllImages = (): HTMLImageElement[] => {\r\n const editorElement = ed.view.dom;\r\n return Array.from(editorElement.querySelectorAll(\"img\"));\r\n };\r\n\r\n // Fonction pour trouver l'image à la position spécifique\r\n const findImageAtPosition = (): HTMLImageElement | null => {\r\n const allImages = getAllImages();\r\n\r\n for (const img of allImages) {\r\n try {\r\n // Obtenir la position ProseMirror de cette image\r\n const imgPos = ed.view.posAtDOM(img, 0);\r\n // Vérifier si cette image correspond à la position sélectionnée\r\n if (Math.abs(imgPos - from) <= 1) {\r\n return img;\r\n }\r\n } catch (error) {\r\n // Continuer si on ne peut pas obtenir la position de cette image\r\n continue;\r\n }\r\n }\r\n\r\n return null;\r\n };\r\n\r\n // Chercher l'image à la position exacte\r\n const imageElement = findImageAtPosition();\r\n\r\n if (imageElement) {\r\n return imageElement.getBoundingClientRect();\r\n }\r\n\r\n return new DOMRect(0, 0, 0, 0);\r\n }\r\n\r\n updateMenu = () => {\r\n // Debounce pour éviter les appels trop fréquents\r\n if (this.updateTimeout) {\r\n clearTimeout(this.updateTimeout);\r\n }\r\n\r\n this.updateTimeout = setTimeout(() => {\r\n const ed = this.editor();\r\n if (!ed) return;\r\n\r\n const isImageSelected =\r\n ed.isActive(\"resizableImage\") || ed.isActive(\"image\");\r\n const { from, to } = ed.state.selection;\r\n const hasTextSelection = from !== to;\r\n\r\n // Ne montrer le menu image que si :\r\n // - Une image est sélectionnée\r\n // - L'éditeur est éditable\r\n const shouldShow = isImageSelected && ed.isEditable;\r\n\r\n if (shouldShow) {\r\n this.showTippy();\r\n } else {\r\n this.hideTippy();\r\n }\r\n }, 10);\r\n };\r\n\r\n handleBlur = () => {\r\n // Masquer le menu quand l'éditeur perd le focus\r\n setTimeout(() => {\r\n this.hideTippy();\r\n }, 100);\r\n };\r\n\r\n private hideOtherMenus() {\r\n // Cette méthode peut être étendue pour fermer d'autres menus si nécessaire\r\n // Pour l'instant, elle sert de placeholder pour une future coordination entre menus\r\n }\r\n\r\n private showTippy() {\r\n if (!this.tippyInstance) return;\r\n\r\n // Mettre à jour la position\r\n this.tippyInstance.setProps({\r\n getReferenceClientRect: () => this.getImageRect(),\r\n });\r\n\r\n this.tippyInstance.show();\r\n }\r\n\r\n private hideTippy() {\r\n if (this.tippyInstance) {\r\n this.tippyInstance.hide();\r\n }\r\n }\r\n\r\n onCommand(command: string, event: MouseEvent) {\r\n event.preventDefault();\r\n const ed = this.editor();\r\n if (!ed) return;\r\n\r\n switch (command) {\r\n case \"changeImage\":\r\n this.changeImage();\r\n break;\r\n case \"resizeSmall\":\r\n this.imageService.resizeImageToSmall(ed);\r\n break;\r\n case \"resizeMedium\":\r\n this.imageService.resizeImageToMedium(ed);\r\n break;\r\n case \"resizeLarge\":\r\n this.imageService.resizeImageToLarge(ed);\r\n break;\r\n case \"resizeOriginal\":\r\n this.imageService.resizeImageToOriginal(ed);\r\n break;\r\n case \"deleteImage\":\r\n this.deleteImage();\r\n break;\r\n }\r\n }\r\n\r\n private async changeImage() {\r\n const ed = this.editor();\r\n if (!ed) return;\r\n\r\n try {\r\n // Utiliser la méthode spécifique pour remplacer une image existante\r\n await this.imageService.selectAndReplaceImage(ed, {\r\n quality: 0.8,\r\n maxWidth: 1920,\r\n maxHeight: 1080,\r\n accept: \"image/*\",\r\n });\r\n } catch (error) {\r\n console.error(\"Erreur lors du changement d'image:\", error);\r\n }\r\n }\r\n\r\n private deleteImage() {\r\n const ed = this.editor();\r\n if (ed) {\r\n ed.chain().focus().deleteSelection().run();\r\n }\r\n }\r\n}\r\n","import { Injectable, signal, computed } from \"@angular/core\";\r\n\r\nexport type SupportedLocale = \"en\" | \"fr\";\r\n\r\nexport interface TiptapTranslations {\r\n // Toolbar\r\n toolbar: {\r\n bold: string;\r\n italic: string;\r\n underline: string;\r\n strike: string;\r\n code: string;\r\n superscript: string;\r\n subscript: string;\r\n highlight: string;\r\n heading1: string;\r\n heading2: string;\r\n heading3: string;\r\n bulletList: string;\r\n orderedList: string;\r\n blockquote: string;\r\n alignLeft: string;\r\n alignCenter: string;\r\n alignRight: string;\r\n alignJustify: string;\r\n link: string;\r\n image: string;\r\n horizontalRule: string;\r\n table: string;\r\n undo: string;\r\n redo: string;\r\n clear: string;\r\n };\r\n\r\n // Bubble Menu\r\n bubbleMenu: {\r\n bold: string;\r\n italic: string;\r\n underline: string;\r\n strike: string;\r\n code: string;\r\n superscript: string;\r\n subscript: string;\r\n highlight: string;\r\n link: string;\r\n addLink: string;\r\n editLink: string;\r\n removeLink: string;\r\n linkUrl: string;\r\n linkText: string;\r\n openLink: string;\r\n };\r\n\r\n // Slash Commands\r\n slashCommands: {\r\n heading1: {\r\n title: string;\r\n description: string;\r\n keywords: string[];\r\n };\r\n heading2: {\r\n title: string;\r\n description: string;\r\n keywords: string[];\r\n };\r\n heading3: {\r\n title: string;\r\n description: string;\r\n keywords: string[];\r\n };\r\n bulletList: {\r\n title: string;\r\n description: string;\r\n keywords: string[];\r\n };\r\n orderedList: {\r\n title: string;\r\n description: string;\r\n keywords: string[];\r\n };\r\n blockquote: {\r\n title: string;\r\n description: string;\r\n keywords: string[];\r\n };\r\n code: {\r\n title: string;\r\n description: string;\r\n keywords: string[];\r\n };\r\n image: {\r\n title: string;\r\n description: string;\r\n keywords: string[];\r\n };\r\n horizontalRule: {\r\n title: string;\r\n description: string;\r\n keywords: string[];\r\n };\r\n table: {\r\n title: string;\r\n description: string;\r\n keywords: string[];\r\n };\r\n };\r\n\r\n // Table Actions\r\n table: {\r\n addRowBefore: string;\r\n addRowAfter: string;\r\n deleteRow: string;\r\n addColumnBefore: string;\r\n addColumnAfter: string;\r\n deleteColumn: string;\r\n deleteTable: string;\r\n toggleHeaderRow: string;\r\n toggleHeaderColumn: string;\r\n mergeCells: string;\r\n splitCell: string;\r\n };\r\n\r\n // Image Upload\r\n imageUpload: {\r\n selectImage: string;\r\n uploadingImage: string;\r\n uploadProgress: string;\r\n uploadError: string;\r\n uploadSuccess: string;\r\n imageTooLarge: string;\r\n invalidFileType: string;\r\n dragDropText: string;\r\n changeImage: string;\r\n deleteImage: string;\r\n resizeSmall: string;\r\n resizeMedium: string;\r\n resizeLarge: string;\r\n resizeOriginal: string;\r\n };\r\n\r\n // Editor\r\n editor: {\r\n placeholder: string;\r\n character: string;\r\n word: string;\r\n imageLoadError: string;\r\n linkPrompt: string;\r\n linkUrlPrompt: string;\r\n confirmDelete: string;\r\n };\r\n\r\n // Common\r\n common: {\r\n cancel: string;\r\n confirm: string;\r\n apply: string;\r\n delete: string;\r\n save: string;\r\n close: string;\r\n loading: string;\r\n error: string;\r\n success: string;\r\n };\r\n}\r\n\r\nconst ENGLISH_TRANSLATIONS: TiptapTranslations = {\r\n toolbar: {\r\n bold: \"Bold\",\r\n italic: \"Italic\",\r\n underline: \"Underline\",\r\n strike: \"Strikethrough\",\r\n code: \"Code\",\r\n superscript: \"Superscript\",\r\n subscript: \"Subscript\",\r\n highlight: \"Highlight\",\r\n heading1: \"Heading 1\",\r\n heading2: \"Heading 2\",\r\n heading3: \"Heading 3\",\r\n bulletList: \"Bullet List\",\r\n orderedList: \"Ordered List\",\r\n blockquote: \"Blockquote\",\r\n alignLeft: \"Align Left\",\r\n alignCenter: \"Align Center\",\r\n alignRight: \"Align Right\",\r\n alignJustify: \"Align Justify\",\r\n link: \"Add Link\",\r\n image: \"Add Image\",\r\n horizontalRule: \"Horizontal Rule\",\r\n table: \"Insert Table\",\r\n undo: \"Undo\",\r\n redo: \"Redo\",\r\n clear: \"Clear\",\r\n },\r\n bubbleMenu: {\r\n bold: \"Bold\",\r\n italic: \"Italic\",\r\n underline: \"Underline\",\r\n strike: \"Strikethrough\",\r\n code: \"Code\",\r\n superscript: \"Superscript\",\r\n subscript: \"Subscript\",\r\n highlight: \"Highlight\",\r\n link: \"Link\",\r\n addLink: \"Add Link\",\r\n editLink: \"Edit Link\",\r\n removeLink: \"Remove Link\",\r\n linkUrl: \"Link URL\",\r\n linkText: \"Link Text\",\r\n openLink: \"Open Link\",\r\n },\r\n slashCommands: {\r\n heading1: {\r\n title: \"Heading 1\",\r\n description: \"Large section heading\",\r\n keywords: [\"heading\", \"h1\", \"title\", \"1\", \"header\"],\r\n },\r\n heading2: {\r\n title: \"Heading 2\",\r\n description: \"Medium section heading\",\r\n keywords: [\"heading\", \"h2\", \"title\", \"2\", \"header\"],\r\n },\r\n heading3: {\r\n title: \"Heading 3\",\r\n description: \"Small section heading\",\r\n keywords: [\"heading\", \"h3\", \"title\", \"3\", \"header\"],\r\n },\r\n bulletList: {\r\n title: \"Bullet List\",\r\n description: \"Create a bullet list\",\r\n keywords: [\"bullet\", \"list\", \"ul\", \"unordered\"],\r\n },\r\n orderedList: {\r\n title: \"Ordered List\",\r\n description: \"Create an ordered list\",\r\n keywords: [\"ordered\", \"list\", \"ol\", \"numbered\"],\r\n },\r\n blockquote: {\r\n title: \"Blockquote\",\r\n description: \"Add a blockquote\",\r\n keywords: [\"quote\", \"blockquote\", \"citation\"],\r\n },\r\n code: {\r\n title: \"Code Block\",\r\n description: \"Add a code block\",\r\n keywords: [\"code\", \"codeblock\", \"pre\", \"programming\"],\r\n },\r\n image: {\r\n title: \"Image\",\r\n description: \"Insert an image\",\r\n keywords: [\"image\", \"photo\", \"picture\", \"img\"],\r\n },\r\n horizontalRule: {\r\n title: \"Horizontal Rule\",\r\n description: \"Add a horizontal line\",\r\n keywords: [\"hr\", \"horizontal\", \"rule\", \"line\", \"separator\"],\r\n },\r\n table: {\r\n title: \"Table\",\r\n description: \"Insert a table\",\r\n keywords: [\"table\", \"grid\", \"data\", \"rows\", \"columns\"],\r\n },\r\n },\r\n table: {\r\n addRowBefore: \"Add row before\",\r\n addRowAfter: \"Add row after\",\r\n deleteRow: \"Delete row\",\r\n addColumnBefore: \"Add column before\",\r\n addColumnAfter: \"Add column after\",\r\n deleteColumn: \"Delete column\",\r\n deleteTable: \"Delete table\",\r\n toggleHeaderRow: \"Toggle header row\",\r\n toggleHeaderColumn: \"Toggle header column\",\r\n mergeCells: \"Merge cells\",\r\n splitCell: \"Split cell\",\r\n },\r\n imageUpload: {\r\n selectImage: \"Select Image\",\r\n uploadingImage: \"Uploading image...\",\r\n uploadProgress: \"Upload Progress\",\r\n uploadError: \"Upload Error\",\r\n uploadSuccess: \"Upload Success\",\r\n imageTooLarge: \"Image too large\",\r\n invalidFileType: \"Invalid file type\",\r\n dragDropText: \"Drag and drop images here\",\r\n changeImage: \"Change Image\",\r\n deleteImage: \"Delete Image\",\r\n resizeSmall: \"Small\",\r\n resizeMedium: \"Medium\",\r\n resizeLarge: \"Large\",\r\n resizeOriginal: \"Original\",\r\n },\r\n editor: {\r\n placeholder: \"Start typing...\",\r\n character: \"character\",\r\n word: \"word\",\r\n imageLoadError: \"Error loading image\",\r\n linkPrompt: \"Enter link URL\",\r\n linkUrlPrompt: \"Enter URL\",\r\n confirmDelete: \"Are you sure you want to delete this?\",\r\n },\r\n common: {\r\n cancel: \"Cancel\",\r\n confirm: \"Confirm\",\r\n apply: \"Apply\",\r\n delete: \"Delete\",\r\n save: \"Save\",\r\n close: \"Close\",\r\n loading: \"Loading\",\r\n error: \"Error\",\r\n success: \"Success\",\r\n },\r\n};\r\n\r\nconst FRENCH_TRANSLATIONS: TiptapTranslations = {\r\n toolbar: {\r\n bold: \"Gras\",\r\n italic: \"Italique\",\r\n underline: \"Souligné\",\r\n strike: \"Barré\",\r\n code: \"Code\",\r\n superscript: \"Exposant\",\r\n subscript: \"Indice\",\r\n highlight: \"Surligner\",\r\n heading1: \"Titre 1\",\r\n heading2: \"Titre 2\",\r\n heading3: \"Titre 3\",\r\n bulletList: \"Liste à puces\",\r\n orderedList: \"Liste numérotée\",\r\n blockquote: \"Citation\",\r\n alignLeft: \"Aligner à gauche\",\r\n alignCenter: \"Centrer\",\r\n alignRight: \"Aligner à droite\",\r\n alignJustify: \"Justifier\",\r\n link: \"Ajouter un lien\",\r\n image: \"Ajouter une image\",\r\n horizontalRule: \"Ligne horizontale\",\r\n table: \"Insérer un tableau\",\r\n undo: \"Annuler\",\r\n redo: \"Refaire\",\r\n clear: \"Vider\",\r\n },\r\n bubbleMenu: {\r\n bold: \"Gras\",\r\n italic: \"Italique\",\r\n underline: \"Souligné\",\r\n strike: \"Barré\",\r\n code: \"Code\",\r\n superscript: \"Exposant\",\r\n subscript: \"Indice\",\r\n highlight: \"Surligner\",\r\n link: \"Lien\",\r\n addLink: \"Ajouter un lien\",\r\n editLink: \"Modifier le lien\",\r\n removeLink: \"Supprimer le lien\",\r\n linkUrl: \"URL du lien\",\r\n linkText: \"Texte du lien\",\r\n openLink: \"Ouvrir le lien\",\r\n },\r\n slashCommands: {\r\n heading1: {\r\n title: \"Titre 1\",\r\n description: \"Grand titre de section\",\r\n keywords: [\"heading\", \"h1\", \"titre\", \"title\", \"1\", \"header\"],\r\n },\r\n heading2: {\r\n title: \"Titre 2\",\r\n description: \"Titre de sous-section\",\r\n keywords: [\"heading\", \"h2\", \"titre\", \"title\", \"2\", \"header\"],\r\n },\r\n heading3: {\r\n title: \"Titre 3\",\r\n description: \"Petit titre\",\r\n keywords: [\"heading\", \"h3\", \"titre\", \"title\", \"3\", \"header\"],\r\n },\r\n bulletList: {\r\n title: \"Liste à puces\",\r\n description: \"Créer une liste à puces\",\r\n keywords: [\"bullet\", \"list\", \"liste\", \"puces\", \"ul\"],\r\n },\r\n orderedList: {\r\n title: \"Liste numérotée\",\r\n description: \"Créer une liste numérotée\",\r\n keywords: [\"numbered\", \"list\", \"liste\", \"numérotée\", \"ol\", \"ordered\"],\r\n },\r\n blockquote: {\r\n title: \"Citation\",\r\n description: \"Ajouter une citation\",\r\n keywords: [\"quote\", \"blockquote\", \"citation\"],\r\n },\r\n code: {\r\n title: \"Bloc de code\",\r\n description: \"Ajouter un bloc de code\",\r\n keywords: [\"code\", \"codeblock\", \"pre\", \"programmation\"],\r\n },\r\n image: {\r\n title: \"Image\",\r\n description: \"Insérer une image\",\r\n keywords: [\"image\", \"photo\", \"picture\", \"img\"],\r\n },\r\n horizontalRule: {\r\n title: \"Ligne horizontale\",\r\n description: \"Ajouter une ligne de séparation\",\r\n keywords: [\"hr\", \"horizontal\", \"rule\", \"ligne\", \"séparation\"],\r\n },\r\n table: {\r\n title: \"Tableau\",\r\n description: \"Insérer un tableau\",\r\n keywords: [\r\n \"table\",\r\n \"tableau\",\r\n \"grid\",\r\n \"grille\",\r\n \"data\",\r\n \"données\",\r\n \"rows\",\r\n \"colonnes\",\r\n ],\r\n },\r\n },\r\n table: {\r\n addRowBefore: \"Ajouter une ligne avant\",\r\n addRowAfter: \"Ajouter une ligne après\",\r\n deleteRow: \"Supprimer la ligne\",\r\n addColumnBefore: \"Ajouter une colonne avant\",\r\n addColumnAfter: \"Ajouter une colonne après\",\r\n deleteColumn: \"Supprimer la colonne\",\r\n deleteTable: \"Supprimer le tableau\",\r\n toggleHeaderRow: \"Basculer ligne d'en-tête\",\r\n toggleHeaderColumn: \"Basculer colonne d'en-tête\",\r\n mergeCells: \"Fusionner les cellules\",\r\n splitCell: \"Diviser la cellule\",\r\n },\r\n imageUpload: {\r\n selectImage: \"Sélectionner une image\",\r\n uploadingImage: \"Téléchargement de l'image...\",\r\n uploadProgress: \"Progression du téléchargement\",\r\n uploadError: \"Erreur de téléchargement\",\r\n uploadSuccess: \"Téléchargement réussi\",\r\n imageTooLarge: \"Image trop volumineuse\",\r\n invalidFileType: \"Type de fichier invalide\",\r\n dragDropText: \"Glissez et déposez des images ici\",\r\n changeImage: \"Changer l'image\",\r\n deleteImage: \"Supprimer l'image\",\r\n resizeSmall: \"Petit\",\r\n resizeMedium: \"Moyen\",\r\n resizeLarge: \"Grand\",\r\n resizeOriginal: \"Original\",\r\n },\r\n editor: {\r\n placeholder: \"Commencez à écrire...\",\r\n character: \"caractère\",\r\n word: \"mot\",\r\n imageLoadError: \"Erreur de chargement de l'image\",\r\n linkPrompt: \"Entrez l'URL du lien\",\r\n linkUrlPrompt: \"Entrez l'URL\",\r\n confirmDelete: \"Êtes-vous sûr de vouloir supprimer ceci ?\",\r\n },\r\n common: {\r\n cancel: \"Annuler\",\r\n confirm: \"Confirmer\",\r\n apply: \"Appliquer\",\r\n delete: \"Supprimer\",\r\n save: \"Sauvegarder\",\r\n close: \"Fermer\",\r\n loading: \"Chargement\",\r\n error: \"Erreur\",\r\n success: \"Succès\",\r\n },\r\n};\r\n\r\n@Injectable({\r\n providedIn: \"root\",\r\n})\r\nexport class TiptapI18nService {\r\n private _currentLocale = signal<SupportedLocale>(\"en\");\r\n private _translations = signal<Record<SupportedLocale, TiptapTranslations>>({\r\n en: ENGLISH_TRANSLATIONS,\r\n fr: FRENCH_TRANSLATIONS,\r\n });\r\n\r\n // Signaux publics\r\n readonly currentLocale = this._currentLocale.asReadonly();\r\n readonly translations = computed(\r\n () => this._translations()[this._currentLocale()]\r\n );\r\n\r\n // Méthodes de traduction rapides\r\n readonly t = computed(() => this.translations());\r\n readonly toolbar = computed(() => this.translations().toolbar);\r\n readonly bubbleMenu = computed(() => this.translations().bubbleMenu);\r\n readonly slashCommands = computed(() => this.translations().slashCommands);\r\n readonly table = computed(() => this.translations().table);\r\n readonly imageUpload = computed(() => this.translations().imageUpload);\r\n readonly editor = computed(() => this.translations().editor);\r\n readonly common = computed(() => this.translations().common);\r\n\r\n constructor() {\r\n // Détecter automatiquement la langue du navigateur\r\n this.detectBrowserLanguage();\r\n }\r\n\r\n setLocale(locale: SupportedLocale): void {\r\n this._currentLocale.set(locale);\r\n }\r\n\r\n autoDetectLocale(): void {\r\n this.detectBrowserLanguage();\r\n }\r\n\r\n getSupportedLocales(): SupportedLocale[] {\r\n return Object.keys(this._translations()) as SupportedLocale[];\r\n }\r\n\r\n addTranslations(\r\n locale: SupportedLocale,\r\n translations: Partial<TiptapTranslations>\r\n ): void {\r\n this._translations.update((current) => ({\r\n ...current,\r\n [locale]: {\r\n ...current[locale],\r\n ...translations,\r\n },\r\n }));\r\n }\r\n\r\n private detectBrowserLanguage(): void {\r\n const browserLang = navigator.language.toLowerCase();\r\n if (browserLang.startsWith(\"fr\")) {\r\n this._currentLocale.set(\"fr\");\r\n } else {\r\n this._currentLocale.set(\"en\");\r\n }\r\n }\r\n\r\n // Méthodes utilitaires pour les composants\r\n getToolbarTitle(key: keyof TiptapTranslations[\"toolbar\"]): string {\r\n return this.translations().toolbar[key];\r\n }\r\n\r\n getBubbleMenuTitle(key: keyof TiptapTranslations[\"bubbleMenu\"]): string {\r\n return this.translations().bubbleMenu[key];\r\n }\r\n\r\n getSlashCommand(key: keyof TiptapTranslations[\"slashCommands\"]) {\r\n return this.translations().slashCommands[key];\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\nimport { Editor } from \"@tiptap/core\";\n\n@Injectable({\n providedIn: \"root\",\n})\nexport class EditorCommandsService {\n // Méthodes pour vérifier l'état actif\n isActive(\n editor: Editor,\n name: string,\n attributes?: Record<string, any>\n ): boolean {\n return editor.isActive(name, attributes);\n }\n\n // Méthodes pour vérifier si une commande peut être exécutée\n canExecute(editor: Editor, command: string): boolean {\n if (!editor) return false;\n\n switch (command) {\n case \"toggleBold\":\n return editor.can().chain().focus().toggleBold().run();\n case \"toggleItalic\":\n return editor.can().chain().focus().toggleItalic().run();\n case \"toggleStrike\":\n return editor.can().chain().focus().toggleStrike().run();\n case \"toggleCode\":\n return editor.can().chain().focus().toggleCode().run();\n case \"toggleUnderline\":\n return editor.can().chain().focus().toggleUnderline().run();\n case \"toggleSuperscript\":\n return editor.can().chain().focus().toggleSuperscript().run();\n case \"toggleSubscript\":\n return editor.can().chain().focus().toggleSubscript().run();\n case \"setTextAlign\":\n return editor.can().chain().focus().setTextAlign(\"left\").run();\n case \"toggleLink\":\n return editor.can().chain().focus().toggleLink({ href: \"\" }).run();\n case \"insertHorizontalRule\":\n return editor.can().chain().focus().setHorizontalRule().run();\n case \"toggleHighlight\":\n return editor.can().chain().focus().toggleHighlight().run();\n case \"undo\":\n return editor.can().chain().focus().undo().run();\n case \"redo\":\n return editor.can().chain().focus().redo().run();\n case \"insertTable\":\n return editor.can().chain().focus().insertTable().run();\n case \"addColumnBefore\":\n return editor.can().chain().focus().addColumnBefore().run();\n case \"addColumnAfter\":\n return editor.can().chain().focus().addColumnAfter().run();\n case \"deleteColumn\":\n return editor.can().chain().focus().deleteColumn().run();\n case \"addRowBefore\":\n return editor.can().chain().focus().addRowBefore().run();\n case \"addRowAfter\":\n return editor.can().chain().focus().addRowAfter().run();\n case \"deleteRow\":\n return editor.can().chain().focus().deleteRow().run();\n case \"deleteTable\":\n return editor.can().chain().focus().deleteTable().run();\n case \"mergeCells\":\n return editor.can().chain().focus().mergeCells().run();\n case \"splitCell\":\n return editor.can().chain().focus().splitCell().run();\n case \"toggleHeaderColumn\":\n return editor.can().chain().focus().toggleHeaderColumn().run();\n case \"toggleHeaderRow\":\n return editor.can().chain().focus().toggleHeaderRow().run();\n case \"toggleHeaderCell\":\n return editor.can().chain().focus().toggleHeaderCell().run();\n default:\n return false;\n }\n }\n\n // Méthodes pour exécuter les commandes\n toggleBold(editor: Editor): void {\n editor.chain().focus().toggleBold().run();\n }\n\n toggleItalic(editor: Editor): void {\n editor.chain().focus().toggleItalic().run();\n }\n\n toggleStrike(editor: Editor): void {\n editor.chain().focus().toggleStrike().run();\n }\n\n toggleCode(editor: Editor): void {\n editor.chain().focus().toggleCode().run();\n }\n\n toggleHeading(editor: Editor, level: 1 | 2 | 3): void {\n editor.chain().focus().toggleHeading({ level }).run();\n }\n\n toggleBulletList(editor: Editor): void {\n editor.chain().focus().toggleBulletList().run();\n }\n\n toggleOrderedList(editor: Editor): void {\n editor.chain().focus().toggleOrderedList().run();\n }\n\n toggleBlockquote(editor: Editor): void {\n editor.chain().focus().toggleBlockquote().run();\n }\n\n undo(editor: Editor): void {\n editor.chain().focus().undo().run();\n }\n\n redo(editor: Editor): void {\n editor.chain().focus().redo().run();\n }\n\n // Nouvelles méthodes pour les formatages supplémentaires\n toggleUnderline(editor: Editor): void {\n editor.chain().focus().toggleUnderline().run();\n }\n\n toggleSuperscript(editor: Editor): void {\n editor.chain().focus().toggleSuperscript().run();\n }\n\n toggleSubscript(editor: Editor): void {\n editor.chain().focus().toggleSubscript().run();\n }\n\n setTextAlign(\n editor: Editor,\n alignment: \"left\" | \"center\" | \"right\" | \"justify\"\n ): void {\n editor.chain().focus().setTextAlign(alignment).run();\n }\n\n toggleLink(editor: Editor, url?: string): void {\n if (url) {\n editor.chain().focus().toggleLink({ href: url }).run();\n } else {\n // Si pas d'URL fournie, on demande à l'utilisateur\n const href = window.prompt(\"URL du lien:\");\n if (href) {\n editor.chain().focus().toggleLink({ href }).run();\n }\n }\n }\n\n insertHorizontalRule(editor: Editor): void {\n editor.chain().focus().setHorizontalRule().run();\n }\n\n toggleHighlight(editor: Editor, color?: string): void {\n if (color) {\n editor.chain().focus().toggleHighlight({ color }).run();\n } else {\n editor.chain().focus().toggleHighlight().run();\n }\n }\n\n // Table commands\n insertTable(editor: Editor, rows: number = 3, cols: number = 3): void {\n editor.chain().focus().insertTable({ rows, cols }).run();\n }\n\n addColumnBefore(editor: Editor): void {\n editor.chain().focus().addColumnBefore().run();\n }\n\n addColumnAfter(editor: Editor): void {\n editor.chain().focus().addColumnAfter().run();\n }\n\n deleteColumn(editor: Editor): void {\n editor.chain().focus().deleteColumn().run();\n }\n\n addRowBefore(editor: Editor): void {\n editor.chain().focus().addRowBefore().run();\n }\n\n addRowAfter(editor: Editor): void {\n editor.chain().focus().addRowAfter().run();\n }\n\n deleteRow(editor: Editor): void {\n editor.chain().focus().deleteRow().run();\n }\n\n deleteTable(editor: Editor): void {\n editor.chain().focus().deleteTable().run();\n }\n\n mergeCells(editor: Editor): void {\n editor.chain().focus().mergeCells().run();\n }\n\n splitCell(editor: Editor): void {\n editor.chain().focus().splitCell().run();\n }\n\n toggleHeaderColumn(editor: Editor): void {\n editor.chain().focus().toggleHeaderColumn().run();\n }\n\n toggleHeaderRow(editor: Editor): void {\n editor.chain().focus().toggleHeaderRow().run();\n }\n\n toggleHeaderCell(editor: Editor): void {\n editor.chain().focus().toggleHeaderCell().run();\n }\n\n // Méthode pour vider le contenu\n clearContent(editor: Editor): void {\n editor.chain().focus().setContent(\"\", true).run(); // ✅ Forcer l'émission de l'événement\n }\n\n // Méthodes de base de l'éditeur\n focus(editor: Editor): void {\n editor.chain().focus().run();\n }\n\n blur(editor: Editor): void {\n editor.chain().blur().run();\n }\n\n setContent(editor: Editor, content: string, emitUpdate = true): void {\n editor.chain().focus().setContent(content, emitUpdate).run();\n }\n\n setEditable(editor: Editor, editable: boolean): void {\n editor.setEditable(editable);\n }\n}\n","import {\r\n Component,\r\n input,\r\n ViewChild,\r\n ElementRef,\r\n OnInit,\r\n OnDestroy,\r\n effect,\r\n inject,\r\n} from \"@angular/core\";\r\nimport { CommonModule } from \"@angular/common\";\r\nimport { Editor } from \"@tiptap/core\";\r\nimport tippy, { Instance as TippyInstance } from \"tippy.js\";\r\nimport { TiptapI18nService } from \"./services/i18n.service\";\r\nimport { EditorCommandsService } from \"./services/editor-commands.service\";\r\nimport { TiptapButtonComponent } from \"./tiptap-button.component\";\r\nimport { TiptapSeparatorComponent } from \"./tiptap-separator.component\";\r\nimport { TableBubbleMenuConfig } from \"./models/bubble-menu.model\";\r\n\r\n@Component({\r\n selector: \"tiptap-table-bubble-menu\",\r\n standalone: true,\r\n imports: [CommonModule, TiptapButtonComponent, TiptapSeparatorComponent],\r\n template: `\r\n <div #menuElement class=\"bubble-menu\">\r\n <!-- Actions de lignes -->\r\n @if (config().addRowBefore !== false) {\r\n <tiptap-button\r\n icon=\"add_row_above\"\r\n title=\"{{ i18n.table().addRowBefore }}\"\r\n (click)=\"addRowBefore()\"\r\n ></tiptap-button>\r\n } @if (config().addRowAfter !== false) {\r\n <tiptap-button\r\n icon=\"add_row_below\"\r\n title=\"{{ i18n.table().addRowAfter }}\"\r\n (click)=\"addRowAfter()\"\r\n ></tiptap-button>\r\n } @if (config().deleteRow !== false) {\r\n <tiptap-button\r\n icon=\"delete\"\r\n title=\"{{ i18n.table().deleteRow }}\"\r\n variant=\"danger\"\r\n (click)=\"deleteRow()\"\r\n ></tiptap-button>\r\n } @if (config().separator !== false) {\r\n <tiptap-separator></tiptap-separator>\r\n }\r\n\r\n <!-- Actions de colonnes -->\r\n @if (config().addColumnBefore !== false) {\r\n <tiptap-button\r\n icon=\"add_column_left\"\r\n title=\"{{ i18n.table().addColumnBefore }}\"\r\n (click)=\"addColumnBefore()\"\r\n ></tiptap-button>\r\n } @if (config().addColumnAfter !== false) {\r\n <tiptap-button\r\n icon=\"add_column_right\"\r\n title=\"{{ i18n.table().addColumnAfter }}\"\r\n (click)=\"addColumnAfter()\"\r\n ></tiptap-button>\r\n } @if (config().deleteColumn !== false) {\r\n <tiptap-button\r\n icon=\"delete\"\r\n title=\"{{ i18n.table().deleteColumn }}\"\r\n variant=\"danger\"\r\n (click)=\"deleteColumn()\"\r\n ></tiptap-button>\r\n } @if (config().separator !== false) {\r\n <tiptap-separator></tiptap-separator>\r\n }\r\n\r\n <!-- Actions de cellules -->\r\n @if (config().toggleHeaderRow !== false) {\r\n <tiptap-button\r\n icon=\"toolbar\"\r\n title=\"{{ i18n.table().toggleHeaderRow }}\"\r\n (click)=\"toggleHeaderRow()\"\r\n ></tiptap-button>\r\n } @if (config().toggleHeaderColumn !== false) {\r\n <tiptap-button\r\n icon=\"dock_to_right\"\r\n title=\"{{ i18n.table().toggleHeaderColumn }}\"\r\n (click)=\"toggleHeaderColumn()\"\r\n ></tiptap-button>\r\n } @if (config().separator !== false && config().deleteTable !== false) {\r\n <tiptap-separator></tiptap-separator>\r\n }\r\n\r\n <!-- Actions de table -->\r\n @if (config().deleteTable !== false) {\r\n <tiptap-button\r\n icon=\"delete_forever\"\r\n title=\"{{ i18n.table().deleteTable }}\"\r\n variant=\"danger\"\r\n (click)=\"deleteTable()\"\r\n ></tiptap-button>\r\n }\r\n </div>\r\n `,\r\n styles: [],\r\n})\r\nexport class TiptapTableBubbleMenuComponent implements OnInit, OnDestroy {\r\n @ViewChild(\"menuElement\", { static: true }) menuElement!: ElementRef;\r\n\r\n // Inputs\r\n editor = input.required<Editor>();\r\n config = input<TableBubbleMenuConfig>({});\r\n\r\n // Services\r\n private i18nService = inject(TiptapI18nService);\r\n private commandsService = inject(EditorCommandsService);\r\n\r\n // Tippy instance\r\n private tippyInstance: TippyInstance | null = null;\r\n private updateTimeout: any = null;\r\n\r\n // Signaux\r\n readonly i18n = this.i18nService;\r\n\r\n constructor() {\r\n // Effet pour mettre à jour le menu quand l'éditeur change\r\n effect(() => {\r\n const editor = this.editor();\r\n if (editor) {\r\n // Nettoyer les anciens listeners\r\n editor.off(\"selectionUpdate\", this.updateMenu);\r\n editor.off(\"focus\", this.updateMenu);\r\n editor.off(\"blur\", this.handleBlur);\r\n\r\n // Ajouter les nouveaux listeners\r\n editor.on(\"selectionUpdate\", this.updateMenu);\r\n editor.on(\"focus\", this.updateMenu);\r\n editor.on(\"blur\", this.handleBlur);\r\n }\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n this.initTippy();\r\n }\r\n\r\n ngOnDestroy() {\r\n const editor = this.editor();\r\n if (editor) {\r\n // Nettoyer les événements\r\n editor.off(\"selectionUpdate\", this.updateMenu);\r\n editor.off(\"focus\", this.updateMenu);\r\n editor.off(\"blur\", this.handleBlur);\r\n }\r\n\r\n if (this.tippyInstance) {\r\n this.tippyInstance.destroy();\r\n }\r\n if (this.updateTimeout) {\r\n clearTimeout(this.updateTimeout);\r\n }\r\n }\r\n\r\n private initTippy() {\r\n const menuElement = this.menuElement.nativeElement;\r\n\r\n // Créer l'instance Tippy\r\n this.tippyInstance = tippy(document.body, {\r\n content: menuElement,\r\n trigger: \"manual\",\r\n placement: \"top-start\",\r\n appendTo: () => document.body,\r\n interactive: true,\r\n arrow: false,\r\n offset: [0, 8],\r\n maxWidth: \"none\",\r\n hideOnClick: false,\r\n onShow: (instance) => {\r\n // S'assurer que les autres menus sont fermés\r\n this.hideOtherMenus();\r\n },\r\n getReferenceClientRect: () => this.getTableRect(),\r\n popperOptions: {\r\n modifiers: [\r\n {\r\n name: \"preventOverflow\",\r\n options: {\r\n boundary: \"viewport\",\r\n padding: 8,\r\n },\r\n },\r\n {\r\n name: \"flip\",\r\n options: {\r\n fallbackPlacements: [\"bottom-start\", \"top-end\", \"bottom-end\"],\r\n },\r\n },\r\n ],\r\n },\r\n });\r\n\r\n // Maintenant que Tippy est initialisé, faire un premier check\r\n this.updateMenu();\r\n }\r\n\r\n private getTableRect(): DOMRect {\r\n const ed = this.editor();\r\n if (!ed) return new DOMRect(0, 0, 0, 0);\r\n\r\n // Méthode 1: Utiliser coordsAtPos (méthode native ProseMirror)\r\n const { from } = ed.state.selection;\r\n const coords = ed.view.coordsAtPos(from);\r\n\r\n // Trouver la table qui contient cette position\r\n const editorElement = ed.view.dom;\r\n const tables = Array.from(editorElement.querySelectorAll(\"table\"));\r\n\r\n for (let i = 0; i < tables.length; i++) {\r\n const table = tables[i];\r\n try {\r\n const tableRect = table.getBoundingClientRect();\r\n\r\n // Vérifier si la position ProseMirror est dans cette table\r\n const isInside =\r\n coords.left >= tableRect.left &&\r\n coords.left <= tableRect.right &&\r\n coords.top >= tableRect.top &&\r\n coords.top <= tableRect.bottom;\r\n\r\n if (isInside) {\r\n return tableRect;\r\n }\r\n } catch (error) {\r\n continue;\r\n }\r\n }\r\n\r\n // Fallback : utiliser la méthode DOM si ProseMirror échoue\r\n const selection = window.getSelection();\r\n if (selection && selection.rangeCount > 0) {\r\n const range = selection.getRangeAt(0);\r\n const rect = range.getBoundingClientRect();\r\n\r\n if (rect.width > 0 && rect.height > 0) {\r\n return rect;\r\n }\r\n }\r\n\r\n // Dernier fallback : première table\r\n if (tables.length > 0) {\r\n return tables[0].getBoundingClientRect();\r\n }\r\n\r\n return new DOMRect(0, 0, 0, 0);\r\n }\r\n\r\n updateMenu = () => {\r\n // Debounce pour éviter les appels trop fréquents\r\n if (this.updateTimeout) {\r\n clearTimeout(this.updateTimeout);\r\n }\r\n\r\n this.updateTimeout = setTimeout(() => {\r\n const ed = this.editor();\r\n if (!ed) return;\r\n\r\n const isTableSelected =\r\n ed.isActive(\"table\") ||\r\n ed.isActive(\"tableCell\") ||\r\n ed.isActive(\"tableHeader\");\r\n\r\n // Vérifier s'il y a une sélection de cellules (priorité au menu de cellules)\r\n const { from, to } = ed.state.selection;\r\n const hasCellSelection = from !== to;\r\n const isTableCell =\r\n ed.isActive(\"tableCell\") || ed.isActive(\"tableHeader\");\r\n\r\n // Vérifier si la sélection traverse plusieurs cellules\r\n const selectionSize = to - from;\r\n const hasMultiCellSelection = hasCellSelection && selectionSize > 1;\r\n\r\n // Ne montrer le menu de table que si :\r\n // 1. Une table est sélectionnée\r\n // 2. L'éditeur est éditable\r\n // 3. Il n'y a PAS de sélection de cellules (priorité au menu de cellules)\r\n // 4. Il n'y a PAS de sélection multi-cellules\r\n const shouldShow =\r\n isTableSelected &&\r\n ed.isEditable &&\r\n !(hasCellSelection && isTableCell) &&\r\n !hasMultiCellSelection;\r\n\r\n if (shouldShow) {\r\n this.showTippy();\r\n } else {\r\n this.hideTippy();\r\n }\r\n }, 10);\r\n };\r\n\r\n handleBlur = () => {\r\n // Masquer le menu quand l'éditeur perd le focus\r\n setTimeout(() => {\r\n this.hideTippy();\r\n }, 100);\r\n };\r\n\r\n private hideOtherMenus() {\r\n // Cette méthode peut être étendue pour fermer d'autres menus si nécessaire\r\n }\r\n\r\n private showTippy() {\r\n if (!this.tippyInstance) return;\r\n\r\n // Mettre à jour la position\r\n this.tippyInstance.setProps({\r\n getReferenceClientRect: () => this.getTableRect(),\r\n });\r\n\r\n this.tippyInstance.show();\r\n }\r\n\r\n hideTippy() {\r\n if (!this.tippyInstance) return;\r\n this.tippyInstance.hide();\r\n }\r\n\r\n // Actions de lignes\r\n addRowBefore() {\r\n this.commandsService.addRowBefore(this.editor());\r\n }\r\n\r\n addRowAfter() {\r\n this.commandsService.addRowAfter(this.editor());\r\n }\r\n\r\n deleteRow() {\r\n this.commandsService.deleteRow(this.editor());\r\n }\r\n\r\n // Actions de colonnes\r\n addColumnBefore() {\r\n this.commandsService.addColumnBefore(this.editor());\r\n }\r\n\r\n addColumnAfter() {\r\n this.commandsService.addColumnAfter(this.editor());\r\n }\r\n\r\n deleteColumn() {\r\n this.commandsService.deleteColumn(this.editor());\r\n }\r\n\r\n // Actions de headers\r\n toggleHeaderRow() {\r\n this.commandsService.toggleHeaderRow(this.editor());\r\n }\r\n\r\n toggleHeaderColumn() {\r\n this.commandsService.toggleHeaderColumn(this.editor());\r\n }\r\n\r\n // Actions de table\r\n deleteTable() {\r\n this.commandsService.deleteTable(this.editor());\r\n }\r\n}\r\n","import {\r\n Component,\r\n input,\r\n ViewChild,\r\n ElementRef,\r\n OnInit,\r\n OnDestroy,\r\n effect,\r\n inject,\r\n} from \"@angular/core\";\r\nimport { CommonModule } from \"@angular/common\";\r\nimport { Editor } from \"@tiptap/core\";\r\nimport { CellSelection } from \"@tiptap/pm/tables\";\r\nimport tippy, { Instance as TippyInstance } from \"tippy.js\";\r\nimport { TiptapI18nService } from \"./services/i18n.service\";\r\nimport { EditorCommandsService } from \"./services/editor-commands.service\";\r\nimport { TiptapButtonComponent } from \"./tiptap-button.component\";\r\n\r\nexport interface CellBubbleMenuConfig {\r\n mergeCells?: boolean;\r\n splitCell?: boolean;\r\n}\r\n\r\n@Component({\r\n selector: \"tiptap-cell-bubble-menu\",\r\n standalone: true,\r\n imports: [CommonModule, TiptapButtonComponent],\r\n template: `\r\n <div #menuElement class=\"bubble-menu\">\r\n <!-- Actions spécifiques aux cellules -->\r\n @if (config().mergeCells !== false && !isSingleCellSelected) {\r\n <tiptap-button\r\n icon=\"cell_merge\"\r\n title=\"{{ i18n.table().mergeCells }}\"\r\n (click)=\"mergeCells()\"\r\n ></tiptap-button>\r\n } @if (config().splitCell !== false && isSingleCellSelected) {\r\n <tiptap-button\r\n icon=\"split_scene\"\r\n title=\"{{ i18n.table().splitCell }}\"\r\n (click)=\"splitCell()\"\r\n ></tiptap-button>\r\n }\r\n </div>\r\n `,\r\n styles: [],\r\n})\r\nexport class TiptapCellBubbleMenuComponent implements OnInit, OnDestroy {\r\n @ViewChild(\"menuElement\", { static: true }) menuElement!: ElementRef;\r\n\r\n // Inputs\r\n editor = input.required<Editor>();\r\n config = input<CellBubbleMenuConfig>({});\r\n\r\n // Services\r\n private i18nService = inject(TiptapI18nService);\r\n private commandsService = inject(EditorCommandsService);\r\n\r\n // Tippy instance\r\n private tippyInstance: TippyInstance | null = null;\r\n private updateTimeout: any = null;\r\n\r\n // Signaux\r\n readonly i18n = this.i18nService;\r\n isSingleCellSelected: boolean = false;\r\n\r\n constructor() {\r\n // Effet pour mettre à jour le menu quand l'éditeur change\r\n effect(() => {\r\n const editor = this.editor();\r\n if (editor) {\r\n // Nettoyer les anciens listeners\r\n editor.off(\"selectionUpdate\", this.updateMenu);\r\n editor.off(\"focus\", this.updateMenu);\r\n editor.off(\"blur\", this.handleBlur);\r\n\r\n // Ajouter les nouveaux listeners\r\n editor.on(\"selectionUpdate\", this.updateMenu);\r\n editor.on(\"focus\", this.updateMenu);\r\n editor.on(\"blur\", this.handleBlur);\r\n }\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n this.initTippy();\r\n }\r\n\r\n ngOnDestroy() {\r\n const editor = this.editor();\r\n if (editor) {\r\n // Nettoyer les événements\r\n editor.off(\"selectionUpdate\", this.updateMenu);\r\n editor.off(\"focus\", this.updateMenu);\r\n editor.off(\"blur\", this.handleBlur);\r\n }\r\n\r\n if (this.tippyInstance) {\r\n this.tippyInstance.destroy();\r\n }\r\n if (this.updateTimeout) {\r\n clearTimeout(this.updateTimeout);\r\n }\r\n }\r\n\r\n private initTippy() {\r\n const menuElement = this.menuElement.nativeElement;\r\n\r\n // Créer l'instance Tippy\r\n this.tippyInstance = tippy(document.body, {\r\n content: menuElement,\r\n trigger: \"manual\",\r\n placement: \"top-start\",\r\n appendTo: () => document.body,\r\n interactive: true,\r\n arrow: false,\r\n offset: [0, 8],\r\n hideOnClick: false,\r\n onShow: (instance) => {\r\n // S'assurer que les autres menus sont fermés\r\n this.hideOtherMenus();\r\n },\r\n getReferenceClientRect: () => this.getCellRect(),\r\n popperOptions: {\r\n modifiers: [\r\n {\r\n name: \"preventOverflow\",\r\n options: {\r\n boundary: \"viewport\",\r\n padding: 8,\r\n },\r\n },\r\n {\r\n name: \"flip\",\r\n options: {\r\n fallbackPlacements: [\"bottom-start\", \"top-end\", \"bottom-end\"],\r\n },\r\n },\r\n ],\r\n },\r\n });\r\n\r\n // Maintenant que Tippy est initialisé, faire un premier check\r\n this.updateMenu();\r\n }\r\n\r\n private getCellRect(): DOMRect {\r\n const ed = this.editor();\r\n if (!ed) return new DOMRect(0, 0, 0, 0);\r\n\r\n // Détecter la sélection de cellules\r\n const { from, to } = ed.state.selection;\r\n const hasCellSelection = from !== to;\r\n\r\n if (!hasCellSelection) {\r\n return new DOMRect(0, 0, 0, 0);\r\n }\r\n\r\n // Obtenir les coordonnées de la sélection\r\n const coords = ed.view.coordsAtPos(from);\r\n const endCoords = ed.view.coordsAtPos(to);\r\n\r\n // Créer un rectangle englobant la sélection\r\n const rect = new DOMRect(\r\n Math.min(coords.left, endCoords.left),\r\n Math.min(coords.top, endCoords.top),\r\n Math.abs(endCoords.left - coords.left),\r\n Math.abs(endCoords.top - coords.top)\r\n );\r\n\r\n return rect;\r\n }\r\n\r\n updateMenu = () => {\r\n // Debounce pour éviter les appels trop fréquents\r\n if (this.updateTimeout) {\r\n clearTimeout(this.updateTimeout);\r\n }\r\n\r\n this.updateTimeout = setTimeout(() => {\r\n const ed = this.editor();\r\n if (!ed) return;\r\n\r\n const { selection } = ed.state;\r\n const { from, to } = selection;\r\n\r\n // Détecter spécifiquement la sélection de CELLULES (pas de texte)\r\n const hasCellSelection = selection instanceof CellSelection;\r\n // Une seule cellule si ancre et tête pointent vers la même cellule\r\n this.isSingleCellSelected =\r\n hasCellSelection &&\r\n (selection as CellSelection).$anchorCell.pos ===\r\n (selection as CellSelection).$headCell.pos;\r\n const hasTextSelection =\r\n !selection.empty && !(selection instanceof CellSelection);\r\n const isTableCell =\r\n ed.isActive(\"tableCell\") || ed.isActive(\"tableHeader\");\r\n\r\n\r\n // Le menu de cellule ne s'affiche QUE pour les sélections de cellules multiples\r\n // (pas pour la sélection de texte dans une cellule)\r\n const shouldShow = hasCellSelection && isTableCell && ed.isEditable;\r\n\r\n if (shouldShow) {\r\n this.showTippy();\r\n } else {\r\n this.hideTippy();\r\n }\r\n }, 10);\r\n };\r\n\r\n handleBlur = () => {\r\n // Masquer le menu quand l'éditeur perd le focus\r\n setTimeout(() => {\r\n this.hideTippy();\r\n }, 100);\r\n };\r\n\r\n private hideOtherMenus() {\r\n // Masquer tous les autres menus quand le menu de cellules est actif\r\n this.hideTableMenu();\r\n this.hideTextBubbleMenu();\r\n }\r\n\r\n private showTippy() {\r\n if (!this.tippyInstance) return;\r\n\r\n // Masquer les autres menus avant d'afficher le menu de cellules\r\n this.hideTableMenu();\r\n this.hideTextBubbleMenu();\r\n\r\n // Mettre à jour la position\r\n this.tippyInstance.setProps({\r\n getReferenceClientRect: () => this.getCellRect(),\r\n });\r\n\r\n this.tippyInstance.show();\r\n }\r\n\r\n private hideTableMenu() {\r\n // Masquer le menu de table quand le menu de cellules est actif\r\n const tableMenu = document.querySelector(\"tiptap-table-bubble-menu\");\r\n if (tableMenu) {\r\n const tippyInstance = (tableMenu as any)._tippy;\r\n if (tippyInstance) {\r\n tippyInstance.hide();\r\n }\r\n }\r\n\r\n // Alternative : masquer via l'élément Angular\r\n const tableMenuComponent = document.querySelector(\r\n \"tiptap-table-bubble-menu\"\r\n ) as any;\r\n if (tableMenuComponent && tableMenuComponent.hideTippy) {\r\n tableMenuComponent.hideTippy();\r\n }\r\n }\r\n\r\n private hideTextBubbleMenu() {\r\n // Masquer le menu de texte (bubble menu général) quand le menu de cellules est actif\r\n const textMenu = document.querySelector(\"tiptap-bubble-menu\");\r\n if (textMenu) {\r\n const tippyInstance = (textMenu as any)._tippy;\r\n if (tippyInstance) {\r\n tippyInstance.hide();\r\n }\r\n }\r\n\r\n // Alternative : masquer via l'élément Angular\r\n const textMenuComponent = document.querySelector(\r\n \"tiptap-bubble-menu\"\r\n ) as any;\r\n if (textMenuComponent && textMenuComponent.hideTippy) {\r\n textMenuComponent.hideTippy();\r\n }\r\n }\r\n\r\n hideTippy() {\r\n if (!this.tippyInstance) return;\r\n this.tippyInstance.hide();\r\n }\r\n\r\n // Actions spécifiques aux cellules\r\n mergeCells() {\r\n this.commandsService.mergeCells(this.editor());\r\n }\r\n\r\n splitCell() {\r\n this.commandsService.splitCell(this.editor());\r\n }\r\n}\r\n","import { Component, input, output, signal, inject } from \"@angular/core\";\r\nimport { Editor } from \"@tiptap/core\";\r\nimport { TiptapButtonComponent } from \"./tiptap-button.component\";\r\nimport { TiptapSeparatorComponent } from \"./tiptap-separator.component\";\r\nimport { ImageUploadResult, ImageService } from \"./services/image.service\";\r\nimport { EditorCommandsService } from \"./services/editor-commands.service\";\r\nimport { TiptapI18nService } from \"./services/i18n.service\";\r\n\r\nexport interface ToolbarConfig {\r\n bold?: boolean;\r\n italic?: boolean;\r\n underline?: boolean;\r\n strike?: boolean;\r\n code?: boolean;\r\n superscript?: boolean;\r\n subscript?: boolean;\r\n highlight?: boolean;\r\n heading1?: boolean;\r\n heading2?: boolean;\r\n heading3?: boolean;\r\n bulletList?: boolean;\r\n orderedList?: boolean;\r\n blockquote?: boolean;\r\n alignLeft?: boolean;\r\n alignCenter?: boolean;\r\n alignRight?: boolean;\r\n alignJustify?: boolean;\r\n link?: boolean;\r\n image?: boolean;\r\n horizontalRule?: boolean;\r\n table?: boolean;\r\n undo?: boolean;\r\n redo?: boolean;\r\n clear?: boolean;\r\n separator?: boolean;\r\n}\r\n\r\n@Component({\r\n selector: \"tiptap-toolbar\",\r\n standalone: true,\r\n imports: [TiptapButtonComponent, TiptapSeparatorComponent],\r\n template: `\r\n <div class=\"tiptap-toolbar\">\r\n @if (config().bold) {\r\n <tiptap-button\r\n icon=\"format_bold\"\r\n [title]=\"t().bold\"\r\n [active]=\"isActive('bold')\"\r\n [disabled]=\"!canExecute('toggleBold')\"\r\n (onClick)=\"toggleBold()\"\r\n />\r\n } @if (config().italic) {\r\n <tiptap-button\r\n icon=\"format_italic\"\r\n [title]=\"t().italic\"\r\n [active]=\"isActive('italic')\"\r\n [disabled]=\"!canExecute('toggleItalic')\"\r\n (onClick)=\"toggleItalic()\"\r\n />\r\n } @if (config().underline) {\r\n <tiptap-button\r\n icon=\"format_underlined\"\r\n [title]=\"t().underline\"\r\n [active]=\"isActive('underline')\"\r\n [disabled]=\"!canExecute('toggleUnderline')\"\r\n (onClick)=\"toggleUnderline()\"\r\n />\r\n } @if (config().strike) {\r\n <tiptap-button\r\n icon=\"strikethrough_s\"\r\n [title]=\"t().strike\"\r\n [active]=\"isActive('strike')\"\r\n [disabled]=\"!canExecute('toggleStrike')\"\r\n (onClick)=\"toggleStrike()\"\r\n />\r\n } @if (config().code) {\r\n <tiptap-button\r\n icon=\"code\"\r\n [title]=\"t().code\"\r\n [active]=\"isActive('code')\"\r\n [disabled]=\"!canExecute('toggleCode')\"\r\n (onClick)=\"toggleCode()\"\r\n />\r\n } @if (config().superscript) {\r\n <tiptap-button\r\n icon=\"superscript\"\r\n [title]=\"t().superscript\"\r\n [active]=\"isActive('superscript')\"\r\n [disabled]=\"!canExecute('toggleSuperscript')\"\r\n (onClick)=\"toggleSuperscript()\"\r\n />\r\n } @if (config().subscript) {\r\n <tiptap-button\r\n icon=\"subscript\"\r\n [title]=\"t().subscript\"\r\n [active]=\"isActive('subscript')\"\r\n [disabled]=\"!canExecute('toggleSubscript')\"\r\n (onClick)=\"toggleSubscript()\"\r\n />\r\n } @if (config().highlight) {\r\n <tiptap-button\r\n icon=\"highlight\"\r\n [title]=\"t().highlight\"\r\n [active]=\"isActive('highlight')\"\r\n [disabled]=\"!canExecute('toggleHighlight')\"\r\n (onClick)=\"toggleHighlight()\"\r\n />\r\n } @if (config().separator && (config().heading1 || config().heading2 ||\r\n config().heading3)) {\r\n <tiptap-separator />\r\n } @if (config().heading1) {\r\n <tiptap-button\r\n icon=\"format_h1\"\r\n [title]=\"t().heading1\"\r\n variant=\"text\"\r\n [active]=\"isActive('heading', { level: 1 })\"\r\n (onClick)=\"toggleHeading(1)\"\r\n />\r\n } @if (config().heading2) {\r\n <tiptap-button\r\n icon=\"format_h2\"\r\n [title]=\"t().heading2\"\r\n variant=\"text\"\r\n [active]=\"isActive('heading', { level: 2 })\"\r\n (onClick)=\"toggleHeading(2)\"\r\n />\r\n } @if (config().heading3) {\r\n <tiptap-button\r\n icon=\"format_h3\"\r\n [title]=\"t().heading3\"\r\n variant=\"text\"\r\n [active]=\"isActive('heading', { level: 3 })\"\r\n (onClick)=\"toggleHeading(3)\"\r\n />\r\n } @if (config().separator && (config().bulletList || config().orderedList\r\n || config().blockquote)) {\r\n <tiptap-separator />\r\n } @if (config().bulletList) {\r\n <tiptap-button\r\n icon=\"format_list_bulleted\"\r\n [title]=\"t().bulletList\"\r\n [active]=\"isActive('bulletList')\"\r\n (onClick)=\"toggleBulletList()\"\r\n />\r\n } @if (config().orderedList) {\r\n <tiptap-button\r\n icon=\"format_list_numbered\"\r\n [title]=\"t().orderedList\"\r\n [active]=\"isActive('orderedList')\"\r\n (onClick)=\"toggleOrderedList()\"\r\n />\r\n } @if (config().blockquote) {\r\n <tiptap-button\r\n icon=\"format_quote\"\r\n [title]=\"t().blockquote\"\r\n [active]=\"isActive('blockquote')\"\r\n (onClick)=\"toggleBlockquote()\"\r\n />\r\n } @if (config().separator && (config().alignLeft || config().alignCenter\r\n || config().alignRight || config().alignJustify)) {\r\n <tiptap-separator />\r\n } @if (config().alignLeft) {\r\n <tiptap-button\r\n icon=\"format_align_left\"\r\n [title]=\"t().alignLeft\"\r\n [active]=\"isActive('textAlign', { textAlign: 'left' })\"\r\n (onClick)=\"setTextAlign('left')\"\r\n />\r\n } @if (config().alignCenter) {\r\n <tiptap-button\r\n icon=\"format_align_center\"\r\n [title]=\"t().alignCenter\"\r\n [active]=\"isActive('textAlign', { textAlign: 'center' })\"\r\n (onClick)=\"setTextAlign('center')\"\r\n />\r\n } @if (config().alignRight) {\r\n <tiptap-button\r\n icon=\"format_align_right\"\r\n [title]=\"t().alignRight\"\r\n [active]=\"isActive('textAlign', { textAlign: 'right' })\"\r\n (onClick)=\"setTextAlign('right')\"\r\n />\r\n } @if (config().alignJustify) {\r\n <tiptap-button\r\n icon=\"format_align_justify\"\r\n [title]=\"t().alignJustify\"\r\n [active]=\"isActive('textAlign', { textAlign: 'justify' })\"\r\n (onClick)=\"setTextAlign('justify')\"\r\n />\r\n } @if (config().separator && (config().link || config().horizontalRule)) {\r\n <tiptap-separator />\r\n } @if (config().link) {\r\n <tiptap-button\r\n icon=\"link\"\r\n [title]=\"t().link\"\r\n [active]=\"isActive('link')\"\r\n (onClick)=\"toggleLink()\"\r\n />\r\n } @if (config().horizontalRule) {\r\n <tiptap-button\r\n icon=\"horizontal_rule\"\r\n [title]=\"t().horizontalRule\"\r\n (onClick)=\"insertHorizontalRule()\"\r\n />\r\n } @if (config().table) {\r\n <tiptap-button\r\n icon=\"table_view\"\r\n [title]=\"t().table\"\r\n (onClick)=\"insertTable()\"\r\n />\r\n } @if (config().separator && config().image) {\r\n <tiptap-separator />\r\n } @if (config().image) {\r\n <tiptap-button\r\n icon=\"image\"\r\n [title]=\"t().image\"\r\n (onClick)=\"insertImage()\"\r\n />\r\n } @if (config().separator && (config().undo || config().redo)) {\r\n <tiptap-separator />\r\n } @if (config().undo) {\r\n <tiptap-button\r\n icon=\"undo\"\r\n [title]=\"t().undo\"\r\n [disabled]=\"!canExecute('undo')\"\r\n (onClick)=\"undo()\"\r\n />\r\n } @if (config().redo) {\r\n <tiptap-button\r\n icon=\"redo\"\r\n [title]=\"t().redo\"\r\n [disabled]=\"!canExecute('redo')\"\r\n (onClick)=\"redo()\"\r\n />\r\n } @if (config().separator && config().clear) {\r\n <tiptap-separator />\r\n } @if (config().clear) {\r\n <tiptap-button\r\n icon=\"delete\"\r\n [title]=\"t().clear\"\r\n (onClick)=\"clearContent()\"\r\n />\r\n }\r\n </div>\r\n `,\r\n styles: [\r\n `\r\n /* Styles de base pour la toolbar */\r\n .tiptap-toolbar {\r\n display: flex;\r\n align-items: center;\r\n gap: 4px;\r\n padding: 4px 8px;\r\n background: #f8f9fa;\r\n border-bottom: 1px solid #e2e8f0;\r\n flex-wrap: wrap;\r\n min-height: 32px;\r\n position: relative;\r\n }\r\n\r\n /* Groupe de boutons */\r\n .toolbar-group {\r\n display: flex;\r\n align-items: center;\r\n gap: 2px;\r\n padding: 0 4px;\r\n }\r\n\r\n /* Séparateur entre groupes */\r\n .toolbar-separator {\r\n width: 1px;\r\n height: 24px;\r\n background: #e2e8f0;\r\n margin: 0 4px;\r\n }\r\n\r\n /* Responsive */\r\n @media (max-width: 768px) {\r\n .tiptap-toolbar {\r\n padding: 6px 8px;\r\n gap: 2px;\r\n }\r\n\r\n .toolbar-group {\r\n gap: 1px;\r\n }\r\n }\r\n\r\n /* Animation d'apparition */\r\n @keyframes toolbarSlideIn {\r\n from {\r\n opacity: 0;\r\n transform: translateY(-10px);\r\n }\r\n to {\r\n opacity: 1;\r\n transform: translateY(0);\r\n }\r\n }\r\n\r\n .tiptap-toolbar {\r\n animation: toolbarSlideIn 0.3s cubic-bezier(0.4, 0, 0.2, 1);\r\n }\r\n `,\r\n ],\r\n})\r\nexport class TiptapToolbarComponent {\r\n editor = input.required<Editor>();\r\n config = input.required<ToolbarConfig>();\r\n\r\n // Outputs pour les événements d'image\r\n imageUploaded = output<ImageUploadResult>();\r\n imageError = output<string>();\r\n\r\n private imageService = inject(ImageService);\r\n private i18nService = inject(TiptapI18nService);\r\n\r\n // Computed values pour les traductions\r\n readonly t = this.i18nService.toolbar;\r\n\r\n constructor(private editorCommands: EditorCommandsService) {}\r\n\r\n isActive(name: string, attributes?: Record<string, any>): boolean {\r\n return this.editorCommands.isActive(this.editor(), name, attributes);\r\n }\r\n\r\n canExecute(command: string): boolean {\r\n return this.editorCommands.canExecute(this.editor(), command);\r\n }\r\n\r\n toggleBold() {\r\n this.editorCommands.toggleBold(this.editor());\r\n }\r\n toggleItalic() {\r\n this.editorCommands.toggleItalic(this.editor());\r\n }\r\n toggleStrike() {\r\n this.editorCommands.toggleStrike(this.editor());\r\n }\r\n toggleCode() {\r\n this.editorCommands.toggleCode(this.editor());\r\n }\r\n toggleHeading(level: 1 | 2 | 3) {\r\n this.editorCommands.toggleHeading(this.editor(), level);\r\n }\r\n toggleBulletList() {\r\n this.editorCommands.toggleBulletList(this.editor());\r\n }\r\n toggleOrderedList() {\r\n this.editorCommands.toggleOrderedList(this.editor());\r\n }\r\n toggleBlockquote() {\r\n this.editorCommands.toggleBlockquote(this.editor());\r\n }\r\n undo() {\r\n this.editorCommands.undo(this.editor());\r\n }\r\n redo() {\r\n this.editorCommands.redo(this.editor());\r\n }\r\n\r\n // Nouvelles méthodes pour les formatages supplémentaires\r\n toggleUnderline() {\r\n this.editorCommands.toggleUnderline(this.editor());\r\n }\r\n toggleSuperscript() {\r\n this.editorCommands.toggleSuperscript(this.editor());\r\n }\r\n toggleSubscript() {\r\n this.editorCommands.toggleSubscript(this.editor());\r\n }\r\n setTextAlign(alignment: \"left\" | \"center\" | \"right\" | \"justify\") {\r\n this.editorCommands.setTextAlign(this.editor(), alignment);\r\n }\r\n toggleLink() {\r\n this.editorCommands.toggleLink(this.editor());\r\n }\r\n insertHorizontalRule() {\r\n this.editorCommands.insertHorizontalRule(this.editor());\r\n }\r\n toggleHighlight() {\r\n this.editorCommands.toggleHighlight(this.editor());\r\n }\r\n\r\n // Méthode pour insérer un tableau\r\n insertTable() {\r\n this.editorCommands.insertTable(this.editor());\r\n }\r\n\r\n // Méthode pour insérer une image\r\n async insertImage() {\r\n try {\r\n await this.imageService.selectAndUploadImage(this.editor());\r\n } catch (error) {\r\n console.error(\"Erreur lors de l'upload d'image:\", error);\r\n this.imageError.emit(\"Erreur lors de l'upload d'image\");\r\n }\r\n }\r\n\r\n // Méthode pour vider le contenu\r\n clearContent() {\r\n this.editorCommands.clearContent(this.editor());\r\n }\r\n\r\n // Méthodes pour les événements d'image (conservées pour compatibilité)\r\n onImageSelected(result: ImageUploadResult) {\r\n this.imageUploaded.emit(result);\r\n }\r\n\r\n onImageError(error: string) {\r\n this.imageError.emit(error);\r\n }\r\n}\r\n","import {\n Component,\n input,\n output,\n ViewChild,\n ElementRef,\n OnInit,\n OnDestroy,\n effect,\n computed,\n inject,\n signal,\n} from \"@angular/core\";\nimport tippy, { Instance as TippyInstance } from \"tippy.js\";\nimport type { Editor } from \"@tiptap/core\";\nimport { ImageService, ImageUploadResult } from \"./services/image.service\";\nimport { Plugin, PluginKey } from \"prosemirror-state\";\nimport { EditorView } from \"prosemirror-view\";\n\nexport interface SlashCommandItem {\n title: string;\n description: string;\n icon: string;\n keywords: string[];\n command: (editor: Editor) => void;\n}\n\nexport interface SlashCommandsConfig {\n commands?: SlashCommandItem[];\n}\n\nexport const DEFAULT_SLASH_COMMANDS: SlashCommandItem[] = [\n {\n title: \"Titre 1\",\n description: \"Grand titre de section\",\n icon: \"format_h1\",\n keywords: [\"heading\", \"h1\", \"titre\", \"title\", \"1\"],\n command: (editor) =>\n editor.chain().focus().toggleHeading({ level: 1 }).run(),\n },\n {\n title: \"Titre 2\",\n description: \"Titre de sous-section\",\n icon: \"format_h2\",\n keywords: [\"heading\", \"h2\", \"titre\", \"title\", \"2\"],\n command: (editor) =>\n editor.chain().focus().toggleHeading({ level: 2 }).run(),\n },\n {\n title: \"Titre 3\",\n description: \"Petit titre\",\n icon: \"format_h3\",\n keywords: [\"heading\", \"h3\", \"titre\", \"title\", \"3\"],\n command: (editor) =>\n editor.chain().focus().toggleHeading({ level: 3 }).run(),\n },\n {\n title: \"Liste à puces\",\n description: \"Créer une liste à puces\",\n icon: \"format_list_bulleted\",\n keywords: [\"bullet\", \"list\", \"liste\", \"puces\", \"ul\"],\n command: (editor) => editor.chain().focus().toggleBulletList().run(),\n },\n {\n title: \"Liste numérotée\",\n description: \"Créer une liste numérotée\",\n icon: \"format_list_numbered\",\n keywords: [\"numbered\", \"list\", \"liste\", \"numérotée\", \"ol\", \"ordered\"],\n command: (editor) => editor.chain().focus().toggleOrderedList().run(),\n },\n {\n title: \"Citation\",\n description: \"Ajouter une citation\",\n icon: \"format_quote\",\n keywords: [\"quote\", \"blockquote\", \"citation\"],\n command: (editor) => editor.chain().focus().toggleBlockquote().run(),\n },\n {\n title: \"Code\",\n description: \"Bloc de code\",\n icon: \"code\",\n keywords: [\"code\", \"codeblock\", \"pre\"],\n command: (editor) => editor.chain().focus().toggleCodeBlock().run(),\n },\n {\n title: \"Image\",\n description: \"Insérer une image\",\n icon: \"image\",\n keywords: [\"image\", \"photo\", \"picture\", \"img\"],\n command: (editor) => {\n // Créer un input file temporaire pour sélectionner une image\n const input = document.createElement(\"input\");\n input.type = \"file\";\n input.accept = \"image/*\";\n input.style.display = \"none\";\n\n input.addEventListener(\"change\", async (e) => {\n const file = (e.target as HTMLInputElement).files?.[0];\n if (file && file.type.startsWith(\"image/\")) {\n try {\n // Utiliser la méthode de compression unifiée\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n const img = new Image();\n\n img.onload = () => {\n // Vérifier les dimensions (max 1920x1080)\n const maxWidth = 1920;\n const maxHeight = 1080;\n let { width, height } = img;\n\n // Redimensionner si nécessaire\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\n // Dessiner l'image redimensionnée\n ctx?.drawImage(img, 0, 0, width, height);\n\n // Convertir en base64 avec compression\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 if (base64) {\n // Utiliser setResizableImage avec toutes les propriétés\n editor\n .chain()\n .focus()\n .setResizableImage({\n src: base64,\n alt: file.name,\n title: `${file.name} (${Math.round(\n width\n )}×${Math.round(height)})`,\n width: Math.round(width),\n height: Math.round(height),\n })\n .run();\n }\n };\n reader.readAsDataURL(blob);\n }\n },\n file.type,\n 0.8 // qualité de compression\n );\n };\n\n img.onerror = () => {\n console.error(\"Erreur lors du chargement de l'image\");\n };\n\n img.src = URL.createObjectURL(file);\n } catch (error) {\n console.error(\"Erreur lors de l'upload:\", error);\n }\n }\n document.body.removeChild(input);\n });\n\n document.body.appendChild(input);\n input.click();\n },\n },\n {\n title: \"Ligne horizontale\",\n description: \"Ajouter une ligne de séparation\",\n icon: \"horizontal_rule\",\n keywords: [\"hr\", \"horizontal\", \"rule\", \"ligne\", \"séparation\"],\n command: (editor) => editor.chain().focus().setHorizontalRule().run(),\n },\n];\n\n@Component({\n selector: \"tiptap-slash-commands\",\n standalone: true,\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 (click)=\"executeCommand(command)\"\n (mouseenter)=\"selectedIndex.set($index)\"\n >\n <div class=\"slash-command-icon\">\n <span class=\"material-symbols-outlined\">{{ command.icon }}</span>\n </div>\n <div class=\"slash-command-content\">\n <div class=\"slash-command-title\">{{ command.title }}</div>\n <div class=\"slash-command-description\">{{ command.description }}</div>\n </div>\n </div>\n }\n </div>\n `,\n styles: [\n `\n .slash-commands-menu {\n background: white;\n border: 1px solid #e2e8f0;\n border-radius: 8px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n padding: 8px;\n max-height: 300px;\n overflow-y: auto;\n min-width: 280px;\n outline: none;\n }\n\n .slash-command-item {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 8px 12px;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.2s ease;\n border: 2px solid transparent;\n outline: none;\n }\n\n .slash-command-item:hover {\n background: #f1f5f9;\n border-color: #e2e8f0;\n }\n\n .slash-command-item.selected {\n background: #e6f3ff;\n border-color: #3182ce;\n box-shadow: 0 0 0 1px #3182ce;\n }\n\n .slash-command-item:focus {\n outline: 2px solid #3182ce;\n outline-offset: 2px;\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: #f8f9fa;\n border-radius: 6px;\n color: #3182ce;\n flex-shrink: 0;\n }\n\n .slash-command-icon .material-symbols-outlined {\n font-size: 18px;\n }\n\n .slash-command-content {\n flex: 1;\n min-width: 0;\n }\n\n .slash-command-title {\n font-weight: 600;\n color: #2d3748;\n font-size: 14px;\n margin-bottom: 2px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .slash-command-description {\n color: #718096;\n font-size: 12px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n `,\n ],\n})\nexport class TiptapSlashCommandsComponent implements OnInit, OnDestroy {\n editor = input.required<Editor>();\n config = input<SlashCommandsConfig>({\n commands: DEFAULT_SLASH_COMMANDS,\n });\n\n // Output pour l'upload d'image\n imageUploadRequested = output<File>();\n\n @ViewChild(\"menuRef\", { static: false }) menuRef!: ElementRef<HTMLDivElement>;\n\n private tippyInstance: TippyInstance | null = null;\n private imageService = inject(ImageService);\n\n // État local\n private isActive = false;\n private currentQuery = signal(\"\");\n private slashRange: { from: number; to: number } | null = null;\n\n // Signal pour l'index sélectionné\n selectedIndex = signal(0);\n\n commands = computed(() => {\n const configCommands = this.config().commands || DEFAULT_SLASH_COMMANDS;\n // Remplacer la commande image par une version qui utilise l'output\n return configCommands.map((command) => {\n if (command.icon === \"image\") {\n return {\n ...command,\n command: (editor: Editor) => {\n // Créer un input file temporaire\n const input = document.createElement(\"input\");\n input.type = \"file\";\n input.accept = \"image/*\";\n input.style.display = \"none\";\n\n input.addEventListener(\"change\", (e) => {\n const file = (e.target as HTMLInputElement).files?.[0];\n if (file && file.type.startsWith(\"image/\")) {\n this.imageUploadRequested.emit(file);\n }\n document.body.removeChild(input);\n });\n\n document.body.appendChild(input);\n input.click();\n },\n };\n }\n return command;\n });\n });\n\n filteredCommands = computed(() => {\n const query = this.currentQuery().toLowerCase();\n const commands = this.commands();\n\n if (!query) {\n return commands;\n }\n\n return commands.filter(\n (command) =>\n command.title.toLowerCase().includes(query) ||\n command.description.toLowerCase().includes(query) ||\n command.keywords.some((keyword) =>\n keyword.toLowerCase().includes(query)\n )\n );\n });\n\n constructor() {\n effect(() => {\n const ed = this.editor();\n if (!ed) return;\n\n // Nettoyer les anciens 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 // Ajouter les nouveaux 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 // Utiliser le système de plugins ProseMirror pour intercepter les touches\n this.addKeyboardPlugin(ed);\n\n // Ne pas appeler updateMenu() ici pour éviter l'affichage prématuré\n // Il sera appelé automatiquement quand l'éditeur sera prêt\n });\n }\n\n ngOnInit() {\n this.initTippy();\n }\n\n ngOnDestroy() {\n const ed = this.editor();\n if (ed) {\n ed.off(\"selectionUpdate\", this.updateMenu);\n ed.off(\"transaction\", this.updateMenu);\n ed.off(\"focus\", this.updateMenu);\n ed.off(\"blur\", this.handleBlur);\n }\n\n if (this.tippyInstance) {\n this.tippyInstance.destroy();\n this.tippyInstance = null;\n }\n }\n\n private initTippy() {\n if (!this.menuRef?.nativeElement) {\n setTimeout(() => this.initTippy(), 50);\n return;\n }\n\n const menuElement = this.menuRef.nativeElement;\n\n if (this.tippyInstance) {\n this.tippyInstance.destroy();\n }\n\n this.tippyInstance = tippy(document.body, {\n content: menuElement,\n trigger: \"manual\",\n placement: \"bottom-start\",\n appendTo: () => document.body,\n interactive: true,\n arrow: false,\n offset: [0, 8],\n hideOnClick: true,\n getReferenceClientRect: () => this.getSlashRect(),\n // Améliorer le positionnement avec scroll\n popperOptions: {\n modifiers: [\n {\n name: \"preventOverflow\",\n options: {\n boundary: \"viewport\",\n padding: 8,\n },\n },\n {\n name: \"flip\",\n options: {\n fallbackPlacements: [\"top-start\", \"bottom-end\", \"top-end\"],\n },\n },\n ],\n },\n });\n\n // Maintenant que Tippy est initialisé, faire un premier check\n this.updateMenu();\n }\n\n private getSlashRect(): DOMRect {\n const ed = this.editor();\n if (!ed || !this.slashRange) {\n return new DOMRect(0, 0, 0, 0);\n }\n\n try {\n // Utiliser les coordonnées ProseMirror pour plus de précision\n const coords = ed.view.coordsAtPos(this.slashRange.from);\n return new DOMRect(\n coords.left,\n coords.top,\n 0,\n coords.bottom - coords.top\n );\n } catch (error) {\n console.warn(\"Erreur lors du calcul des coordonnées:\", error);\n // Fallback sur window.getSelection\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) {\n return new DOMRect(0, 0, 0, 0);\n }\n const range = selection.getRangeAt(0);\n return range.getBoundingClientRect();\n }\n }\n\n updateMenu = () => {\n const ed = this.editor();\n if (!ed) return;\n\n const { from } = ed.state.selection;\n\n // Vérifier si on a tapé '/' au début d'une ligne ou après un espace\n const textBefore = ed.state.doc.textBetween(\n Math.max(0, from - 20),\n from,\n \"\\n\"\n );\n const slashMatch = textBefore.match(/(?:^|\\s)\\/([^\\/\\s]*)$/);\n\n if (slashMatch) {\n const query = slashMatch[1] || \"\";\n const wasActive = this.isActive;\n\n this.currentQuery.set(query);\n this.slashRange = {\n from: from - slashMatch[0].length + slashMatch[0].indexOf(\"/\"),\n to: from,\n };\n\n // Si le menu vient de devenir actif, réinitialiser l'index\n if (!wasActive) {\n this.selectedIndex.set(0);\n }\n\n this.isActive = true;\n this.showTippy();\n } else {\n this.isActive = false;\n this.hideTippy();\n }\n };\n\n handleBlur = () => {\n setTimeout(() => this.hideTippy(), 100);\n };\n\n handleKeyDown = (event: KeyboardEvent) => {\n // Ne gérer les touches que si le menu est actif\n if (!this.isActive || this.filteredCommands().length === 0) {\n return;\n }\n\n switch (event.key) {\n case \"ArrowDown\":\n event.preventDefault();\n event.stopPropagation();\n const nextIndex =\n (this.selectedIndex() + 1) % this.filteredCommands().length;\n this.selectedIndex.set(nextIndex);\n this.scrollToSelected();\n break;\n\n case \"ArrowUp\":\n event.preventDefault();\n event.stopPropagation();\n const prevIndex =\n this.selectedIndex() === 0\n ? this.filteredCommands().length - 1\n : this.selectedIndex() - 1;\n this.selectedIndex.set(prevIndex);\n this.scrollToSelected();\n break;\n\n case \"Enter\":\n event.preventDefault();\n event.stopPropagation();\n const selectedCommand = this.filteredCommands()[this.selectedIndex()];\n if (selectedCommand) {\n this.executeCommand(selectedCommand);\n }\n break;\n\n case \"Escape\":\n event.preventDefault();\n event.stopPropagation();\n this.isActive = false;\n this.hideTippy();\n // Optionnel : supprimer le \"/\" tapé\n const ed = this.editor();\n if (ed && this.slashRange) {\n const { tr } = ed.state;\n tr.delete(this.slashRange.from, this.slashRange.to);\n ed.view.dispatch(tr);\n }\n break;\n }\n };\n\n private scrollToSelected() {\n // Faire défiler vers l'élément sélectionné\n if (this.menuRef?.nativeElement) {\n const selectedItem = this.menuRef.nativeElement.querySelector(\n \".slash-command-item.selected\"\n ) as HTMLElement;\n if (selectedItem) {\n selectedItem.scrollIntoView({ block: \"nearest\", behavior: \"smooth\" });\n }\n }\n }\n\n private showTippy() {\n if (this.tippyInstance && this.filteredCommands().length > 0) {\n this.tippyInstance.show();\n }\n }\n\n private hideTippy() {\n if (this.tippyInstance) {\n this.tippyInstance.hide();\n }\n }\n\n executeCommand(command: SlashCommandItem) {\n const ed = this.editor();\n if (!ed || !this.slashRange) return;\n\n // Supprimer le texte slash\n const { tr } = ed.state;\n tr.delete(this.slashRange.from, this.slashRange.to);\n ed.view.dispatch(tr);\n\n // Cacher le menu\n this.hideTippy();\n\n // Exécuter la commande\n setTimeout(() => {\n command.command(ed);\n }, 10);\n }\n\n private addKeyboardPlugin(ed: Editor) {\n // Ajouter un plugin ProseMirror pour intercepter les événements clavier\n const keyboardPlugin = new Plugin({\n key: new PluginKey(\"slash-commands-keyboard\"),\n props: {\n handleKeyDown: (view: EditorView, event: KeyboardEvent) => {\n // Ne gérer que si le menu est actif\n if (!this.isActive || this.filteredCommands().length === 0) {\n return false;\n }\n\n switch (event.key) {\n case \"ArrowDown\":\n event.preventDefault();\n const nextIndex =\n (this.selectedIndex() + 1) % this.filteredCommands().length;\n this.selectedIndex.set(nextIndex);\n this.scrollToSelected();\n return true;\n\n case \"ArrowUp\":\n event.preventDefault();\n const prevIndex =\n this.selectedIndex() === 0\n ? this.filteredCommands().length - 1\n : this.selectedIndex() - 1;\n this.selectedIndex.set(prevIndex);\n this.scrollToSelected();\n return true;\n\n case \"Enter\":\n event.preventDefault();\n const selectedCommand =\n this.filteredCommands()[this.selectedIndex()];\n if (selectedCommand) {\n this.executeCommand(selectedCommand);\n }\n return true;\n\n case \"Escape\":\n event.preventDefault();\n this.isActive = false;\n this.hideTippy();\n // Supprimer le \"/\" tapé\n if (this.slashRange) {\n const { tr } = view.state;\n tr.delete(this.slashRange.from, this.slashRange.to);\n view.dispatch(tr);\n }\n return true;\n }\n\n return false;\n },\n },\n });\n\n // Ajouter le plugin à l'éditeur\n ed.view.updateState(\n ed.view.state.reconfigure({\n plugins: [keyboardPlugin, ...ed.view.state.plugins],\n })\n );\n }\n}\n","// Main component\r\nexport { AngularTiptapEditorComponent } from \"./tiptap-editor.component\";\r\n\r\n// Bubble menus\r\nexport { TiptapBubbleMenuComponent } from \"./tiptap-bubble-menu.component\";\r\nexport { TiptapImageBubbleMenuComponent } from \"./tiptap-image-bubble-menu.component\";\r\nexport { TiptapTableBubbleMenuComponent } from \"./tiptap-table-bubble-menu.component\";\r\nexport { TiptapCellBubbleMenuComponent } from \"./tiptap-cell-bubble-menu.component\";\r\n\r\n// Toolbar components\r\nexport { TiptapToolbarComponent } from \"./tiptap-toolbar.component\";\r\nexport { TiptapButtonComponent } from \"./tiptap-button.component\";\r\nexport { TiptapSeparatorComponent } from \"./tiptap-separator.component\";\r\n\r\n// Slash commands\r\nexport { TiptapSlashCommandsComponent } from \"./tiptap-slash-commands.component\";\r\n\r\n// Services\r\nexport { TiptapI18nService } from \"./services/i18n.service\";\r\nexport { EditorCommandsService } from \"./services/editor-commands.service\";\r\nexport { ImageService } from \"./services/image.service\";\r\n\r\n// Models and types\r\nexport type {\r\n BubbleMenuConfig,\r\n ImageBubbleMenuConfig,\r\n TableBubbleMenuConfig,\r\n CellBubbleMenuConfig,\r\n} from \"./models/bubble-menu.model\";\r\n\r\n// Image upload types\r\nexport type {\r\n ImageUploadHandler,\r\n ImageUploadContext,\r\n ImageUploadHandlerResult,\r\n ImageUploadResult,\r\n ImageData,\r\n} from \"./services/image.service\";\r\n","import { Component, input, output, signal, computed } from \"@angular/core\";\nimport { TiptapButtonComponent } from \"./tiptap-button.component\";\nimport { ImageUploadResult } from \"./services/image.service\";\n\nexport interface ImageUploadConfig {\n maxSize?: number; // en MB\n maxWidth?: number; // largeur max en px\n maxHeight?: number; // hauteur max en px\n allowedTypes?: string[];\n enableDragDrop?: boolean;\n showPreview?: boolean;\n multiple?: boolean;\n compressImages?: boolean; // compression automatique\n quality?: number; // qualité de compression (0-1)\n}\n\n@Component({\n selector: \"tiptap-image-upload\",\n standalone: true,\n imports: [TiptapButtonComponent],\n template: `\n <div class=\"image-upload-container\">\n <!-- Bouton d'upload -->\n <tiptap-button\n icon=\"image\"\n title=\"Ajouter une image\"\n [disabled]=\"isUploading()\"\n (onClick)=\"triggerFileInput()\"\n />\n\n <!-- Input file caché -->\n <input\n #fileInput\n type=\"file\"\n [accept]=\"acceptedTypes()\"\n [multiple]=\"config().multiple\"\n (change)=\"onFileSelected($event)\"\n style=\"display: none;\"\n />\n\n <!-- Zone de drag & drop -->\n @if (config().enableDragDrop && isDragOver()) {\n <div\n class=\"drag-overlay\"\n (dragover)=\"onDragOver($event)\"\n (drop)=\"onDrop($event)\"\n (dragleave)=\"onDragLeave($event)\"\n >\n <div class=\"drag-content\">\n <span class=\"material-symbols-outlined\">cloud_upload</span>\n <p>Déposez votre image ici</p>\n </div>\n </div>\n }\n\n <!-- Barre de progression -->\n @if (isUploading() && uploadProgress() > 0) {\n <div class=\"upload-progress\">\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 }\n\n <!-- Prévisualisation -->\n @if (config().showPreview && previewImage()) {\n <div class=\"image-preview\">\n <img [src]=\"previewImage()\" alt=\"Prévisualisation\" />\n <div class=\"preview-info\">\n <span>{{ previewInfo() }}</span>\n </div>\n <button\n class=\"preview-close\"\n (click)=\"clearPreview()\"\n title=\"Fermer la prévisualisation\"\n >\n <span class=\"material-symbols-outlined\">close</span>\n </button>\n </div>\n }\n\n <!-- Messages d'erreur -->\n @if (errorMessage()) {\n <div class=\"error-message\">\n <span class=\"material-symbols-outlined\">error</span>\n {{ errorMessage() }}\n </div>\n }\n </div>\n `,\n styles: [\n `\n .image-upload-container {\n position: relative;\n display: inline-block;\n }\n\n .drag-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(49, 130, 206, 0.1);\n border: 2px dashed #3182ce;\n border-radius: 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n backdrop-filter: blur(2px);\n }\n\n .drag-content {\n text-align: center;\n color: #3182ce;\n font-weight: 600;\n }\n\n .drag-content .material-symbols-outlined {\n font-size: 48px;\n margin-bottom: 16px;\n }\n\n .drag-content p {\n margin: 0;\n font-size: 18px;\n }\n\n .upload-progress {\n position: absolute;\n top: 100%;\n left: 0;\n background: white;\n border: 1px solid #e2e8f0;\n border-radius: 8px;\n padding: 12px;\n margin-top: 8px;\n z-index: 100;\n min-width: 200px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n }\n\n .progress-bar {\n width: 100%;\n height: 6px;\n background: #e2e8f0;\n border-radius: 3px;\n overflow: hidden;\n margin-bottom: 8px;\n }\n\n .progress-fill {\n height: 100%;\n background: #3182ce;\n border-radius: 3px;\n transition: width 0.3s ease;\n }\n\n .progress-text {\n font-size: 12px;\n color: #4a5568;\n text-align: center;\n }\n\n .image-preview {\n position: absolute;\n top: 100%;\n left: 0;\n background: white;\n border: 1px solid #e2e8f0;\n border-radius: 8px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n padding: 8px;\n margin-top: 8px;\n z-index: 100;\n min-width: 200px;\n }\n\n .image-preview img {\n max-width: 200px;\n max-height: 150px;\n border-radius: 4px;\n display: block;\n }\n\n .preview-info {\n margin-top: 8px;\n font-size: 11px;\n color: #718096;\n text-align: center;\n }\n\n .preview-close {\n position: absolute;\n top: 4px;\n right: 4px;\n background: rgba(0, 0, 0, 0.7);\n color: white;\n border: none;\n border-radius: 50%;\n width: 24px;\n height: 24px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 14px;\n }\n\n .preview-close:hover {\n background: rgba(0, 0, 0, 0.9);\n }\n\n .error-message {\n position: absolute;\n top: 100%;\n left: 0;\n background: #fed7d7;\n color: #c53030;\n border: 1px solid #feb2b2;\n border-radius: 6px;\n padding: 8px 12px;\n margin-top: 8px;\n font-size: 12px;\n display: flex;\n align-items: center;\n gap: 6px;\n z-index: 100;\n min-width: 200px;\n }\n\n .error-message .material-symbols-outlined {\n font-size: 16px;\n }\n `,\n ],\n})\nexport class TiptapImageUploadComponent {\n // Inputs\n config = input<Partial<ImageUploadConfig>>({\n maxSize: 5, // 5MB par défaut\n maxWidth: 1920, // largeur max par défaut\n maxHeight: 1080, // hauteur max par défaut\n allowedTypes: [\"image/jpeg\", \"image/png\", \"image/gif\", \"image/webp\"],\n enableDragDrop: true,\n showPreview: true,\n multiple: false,\n compressImages: true,\n quality: 0.8,\n });\n\n // Outputs\n imageSelected = output<ImageUploadResult>();\n error = output<string>();\n\n // Signals internes\n isDragOver = signal(false);\n isUploading = signal(false);\n uploadProgress = signal(0);\n previewImage = signal<string | null>(null);\n previewInfo = signal<string>(\"\");\n errorMessage = signal<string | null>(null);\n\n // Computed\n acceptedTypes = computed(() => {\n const types = this.config().allowedTypes || [\"image/*\"];\n return types.join(\",\");\n });\n\n triggerFileInput() {\n const input = document.querySelector(\n 'input[type=\"file\"]'\n ) as HTMLInputElement;\n if (input) {\n input.click();\n }\n }\n\n onFileSelected(event: Event) {\n const input = event.target as HTMLInputElement;\n const files = input.files;\n\n if (files && files.length > 0) {\n this.processFiles(Array.from(files));\n }\n\n // Reset input\n input.value = \"\";\n }\n\n onDragOver(event: DragEvent) {\n event.preventDefault();\n event.stopPropagation();\n this.isDragOver.set(true);\n }\n\n onDrop(event: DragEvent) {\n event.preventDefault();\n event.stopPropagation();\n this.isDragOver.set(false);\n\n const files = event.dataTransfer?.files;\n if (files && files.length > 0) {\n this.processFiles(Array.from(files));\n }\n }\n\n onDragLeave(event: DragEvent) {\n event.preventDefault();\n event.stopPropagation();\n this.isDragOver.set(false);\n }\n\n private processFiles(files: File[]) {\n const config = this.config();\n const maxSize = (config.maxSize || 5) * 1024 * 1024; // Convertir en bytes\n const allowedTypes = config.allowedTypes || [\"image/*\"];\n\n // Vérifier le nombre de fichiers\n if (!config.multiple && files.length > 1) {\n this.showError(\"Veuillez sélectionner une seule image\");\n return;\n }\n\n // Traiter chaque fichier\n files.forEach((file) => {\n // Vérifier le type\n if (!this.isValidFileType(file, allowedTypes)) {\n this.showError(`Type de fichier non supporté: ${file.name}`);\n return;\n }\n\n // Vérifier la taille\n if (file.size > maxSize) {\n this.showError(\n `Fichier trop volumineux: ${file.name} (max ${config.maxSize}MB)`\n );\n return;\n }\n\n // Traiter l'image avec compression si nécessaire\n this.processImage(file);\n });\n }\n\n private isValidFileType(file: File, allowedTypes: string[]): boolean {\n if (allowedTypes.includes(\"image/*\")) {\n return file.type.startsWith(\"image/\");\n }\n return allowedTypes.includes(file.type);\n }\n\n private processImage(file: File) {\n this.isUploading.set(true);\n this.uploadProgress.set(10);\n\n const config = this.config();\n const originalSize = file.size;\n\n // Créer un canvas pour la compression\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n const img = new Image();\n\n img.onload = () => {\n this.uploadProgress.set(30);\n\n // Vérifier les dimensions\n const maxWidth = config.maxWidth || 1920;\n const maxHeight = config.maxHeight || 1080;\n\n let { width, height } = img;\n\n // Redimensionner si nécessaire\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\n // Dessiner l'image redimensionnée\n ctx?.drawImage(img, 0, 0, width, height);\n\n this.uploadProgress.set(70);\n\n // Convertir en base64 avec compression\n const quality = config.quality || 0.8;\n const mimeType = file.type;\n\n canvas.toBlob(\n (blob) => {\n this.uploadProgress.set(90);\n\n if (blob) {\n const reader = new FileReader();\n reader.onload = (e) => {\n const base64 = e.target?.result as string;\n if (base64) {\n const result: ImageUploadResult = {\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: originalSize,\n };\n\n // Afficher la prévisualisation si activée\n if (config.showPreview) {\n this.previewImage.set(base64);\n this.previewInfo.set(\n `${result.width}×${result.height} • ${this.formatFileSize(\n blob.size\n )}`\n );\n }\n\n // Émettre l'événement\n this.imageSelected.emit(result);\n this.clearError();\n }\n\n this.uploadProgress.set(100);\n setTimeout(() => {\n this.isUploading.set(false);\n this.uploadProgress.set(0);\n }, 500);\n };\n reader.readAsDataURL(blob);\n } else {\n this.showError(\"Erreur lors de la compression de l'image\");\n this.isUploading.set(false);\n this.uploadProgress.set(0);\n }\n },\n mimeType,\n quality\n );\n };\n\n img.onerror = () => {\n this.showError(\"Erreur lors du chargement de l'image\");\n this.isUploading.set(false);\n this.uploadProgress.set(0);\n };\n\n img.src = URL.createObjectURL(file);\n }\n\n private formatFileSize(bytes: number): string {\n if (bytes === 0) return \"0 B\";\n const k = 1024;\n const sizes = [\"B\", \"KB\", \"MB\", \"GB\"];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(1)) + \" \" + sizes[i];\n }\n\n private showError(message: string) {\n this.errorMessage.set(message);\n this.error.emit(message);\n this.isUploading.set(false);\n this.uploadProgress.set(0);\n\n // Auto-clear après 5 secondes\n setTimeout(() => {\n this.clearError();\n }, 5000);\n }\n\n private clearError() {\n this.errorMessage.set(null);\n }\n\n clearPreview() {\n this.previewImage.set(null);\n this.previewInfo.set(\"\");\n }\n}\n","import { Directive } from \"@angular/core\";\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from \"@angular/forms\";\r\n\r\n@Directive({\r\n standalone: true,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n multi: true,\r\n useExisting: NoopValueAccessorDirective,\r\n },\r\n ],\r\n})\r\nexport class NoopValueAccessorDirective implements ControlValueAccessor {\r\n writeValue(obj: any): void {}\r\n registerOnChange(fn: any): void {}\r\n registerOnTouched(fn: any): void {}\r\n}\r\n","import { Editor } from \"@tiptap/core\";\nimport { SlashCommandItem } from \"../tiptap-slash-commands.component\";\nimport { TiptapI18nService } from \"../services/i18n.service\";\n\n/**\n * Clés des commandes dans l'ordre de création\n */\nexport const SLASH_COMMAND_KEYS = [\n \"heading1\",\n \"heading2\",\n \"heading3\",\n \"bulletList\",\n \"orderedList\",\n \"blockquote\",\n \"code\",\n \"image\",\n \"horizontalRule\",\n \"table\",\n] as const;\n\n/**\n * Factory function pour créer les slash commands traduits\n */\nexport function createI18nSlashCommands(\n i18nService: TiptapI18nService\n): SlashCommandItem[] {\n const slashCommands = i18nService.slashCommands();\n\n return [\n {\n title: slashCommands.heading1.title,\n description: slashCommands.heading1.description,\n icon: \"format_h1\",\n keywords: slashCommands.heading1.keywords,\n command: (editor: Editor) =>\n editor.chain().focus().toggleHeading({ level: 1 }).run(),\n },\n {\n title: slashCommands.heading2.title,\n description: slashCommands.heading2.description,\n icon: \"format_h2\",\n keywords: slashCommands.heading2.keywords,\n command: (editor: Editor) =>\n editor.chain().focus().toggleHeading({ level: 2 }).run(),\n },\n {\n title: slashCommands.heading3.title,\n description: slashCommands.heading3.description,\n icon: \"format_h3\",\n keywords: slashCommands.heading3.keywords,\n command: (editor: Editor) =>\n editor.chain().focus().toggleHeading({ level: 3 }).run(),\n },\n {\n title: slashCommands.bulletList.title,\n description: slashCommands.bulletList.description,\n icon: \"format_list_bulleted\",\n keywords: slashCommands.bulletList.keywords,\n command: (editor: Editor) =>\n editor.chain().focus().toggleBulletList().run(),\n },\n {\n title: slashCommands.orderedList.title,\n description: slashCommands.orderedList.description,\n icon: \"format_list_numbered\",\n keywords: slashCommands.orderedList.keywords,\n command: (editor: Editor) =>\n editor.chain().focus().toggleOrderedList().run(),\n },\n {\n title: slashCommands.blockquote.title,\n description: slashCommands.blockquote.description,\n icon: \"format_quote\",\n keywords: slashCommands.blockquote.keywords,\n command: (editor: Editor) =>\n editor.chain().focus().toggleBlockquote().run(),\n },\n {\n title: slashCommands.code.title,\n description: slashCommands.code.description,\n icon: \"code\",\n keywords: slashCommands.code.keywords,\n command: (editor: Editor) =>\n editor.chain().focus().toggleCodeBlock().run(),\n },\n {\n title: slashCommands.image.title,\n description: slashCommands.image.description,\n icon: \"image\",\n keywords: slashCommands.image.keywords,\n command: (editor: Editor) => {\n // Créer un input file temporaire pour sélectionner une image\n const input = document.createElement(\"input\");\n input.type = \"file\";\n input.accept = \"image/*\";\n input.style.display = \"none\";\n\n input.addEventListener(\"change\", async (e) => {\n const file = (e.target as HTMLInputElement).files?.[0];\n if (file && file.type.startsWith(\"image/\")) {\n try {\n // Utiliser la méthode de compression unifiée\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n const img = new Image();\n\n img.onload = () => {\n // Vérifier les dimensions (max 1920x1080)\n const maxWidth = 1920;\n const maxHeight = 1080;\n let { width, height } = img;\n\n // Redimensionner si nécessaire\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\n // Dessiner l'image redimensionnée\n ctx?.drawImage(img, 0, 0, width, height);\n\n // Convertir en base64 avec compression\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 if (base64) {\n // Utiliser setResizableImage avec toutes les propriétés\n editor\n .chain()\n .focus()\n .setResizableImage({\n src: base64,\n alt: file.name,\n title: `${file.name} (${Math.round(\n width\n )}×${Math.round(height)})`,\n width: Math.round(width),\n height: Math.round(height),\n })\n .run();\n }\n };\n reader.readAsDataURL(blob);\n }\n },\n file.type,\n 0.8 // qualité de compression\n );\n };\n\n img.onerror = () => {\n console.error(i18nService.editor().imageLoadError);\n };\n\n img.src = URL.createObjectURL(file);\n } catch (error) {\n console.error(\"Error uploading image:\", error);\n }\n }\n document.body.removeChild(input);\n });\n\n document.body.appendChild(input);\n input.click();\n },\n },\n {\n title: slashCommands.horizontalRule.title,\n description: slashCommands.horizontalRule.description,\n icon: \"horizontal_rule\",\n keywords: slashCommands.horizontalRule.keywords,\n command: (editor: Editor) =>\n editor.chain().focus().setHorizontalRule().run(),\n },\n {\n title: slashCommands.table.title,\n description: slashCommands.table.description,\n icon: \"table_view\",\n keywords: slashCommands.table.keywords,\n command: (editor: Editor) =>\n editor.chain().focus().insertTable({ rows: 3, cols: 3 }).run(),\n },\n ];\n}\n\n/**\n * Fonction utilitaire pour filtrer les slash commands selon les commandes actives\n */\nexport function filterSlashCommands(\n activeCommands: Set<string>,\n i18nService: TiptapI18nService\n): SlashCommandItem[] {\n const allCommands = createI18nSlashCommands(i18nService);\n\n return allCommands.filter((command, index) => {\n const commandKey = SLASH_COMMAND_KEYS[index];\n return commandKey && activeCommands.has(commandKey);\n });\n}\n","import {\r\n Component,\r\n ElementRef,\r\n input,\r\n output,\r\n OnDestroy,\r\n viewChild,\r\n effect,\r\n signal,\r\n computed,\r\n AfterViewInit,\r\n inject,\r\n DestroyRef,\r\n} from \"@angular/core\";\r\nimport { takeUntilDestroyed } from \"@angular/core/rxjs-interop\";\r\nimport { Editor, Extension, Node, Mark } from \"@tiptap/core\";\r\nimport StarterKit from \"@tiptap/starter-kit\";\r\nimport Placeholder from \"@tiptap/extension-placeholder\";\r\nimport CharacterCount from \"@tiptap/extension-character-count\";\r\nimport Underline from \"@tiptap/extension-underline\";\r\nimport Superscript from \"@tiptap/extension-superscript\";\r\nimport Subscript from \"@tiptap/extension-subscript\";\r\nimport TextAlign from \"@tiptap/extension-text-align\";\r\nimport Link from \"@tiptap/extension-link\";\r\nimport Highlight from \"@tiptap/extension-highlight\";\r\nimport OfficePaste from \"@intevation/tiptap-extension-office-paste\";\r\n\r\nimport { ResizableImage } from \"./extensions/resizable-image.extension\";\r\nimport { UploadProgress } from \"./extensions/upload-progress.extension\";\r\nimport { TableExtension } from \"./extensions/table.extension\";\r\nimport { TiptapToolbarComponent } from \"./index\";\r\nimport { TiptapImageUploadComponent } from \"./tiptap-image-upload.component\";\r\nimport { TiptapBubbleMenuComponent } from \"./tiptap-bubble-menu.component\";\r\nimport { TiptapImageBubbleMenuComponent } from \"./tiptap-image-bubble-menu.component\";\r\nimport { TiptapTableBubbleMenuComponent } from \"./tiptap-table-bubble-menu.component\";\r\nimport {\r\n CellBubbleMenuConfig,\r\n TiptapCellBubbleMenuComponent,\r\n} from \"./tiptap-cell-bubble-menu.component\";\r\nimport {\r\n TiptapSlashCommandsComponent,\r\n SlashCommandsConfig,\r\n} from \"./tiptap-slash-commands.component\";\r\nimport { ImageService, ImageUploadHandler, ImageUploadResult } from \"./services/image.service\";\r\nimport { TiptapI18nService, SupportedLocale } from \"./services/i18n.service\";\r\nimport { EditorCommandsService } from \"./services/editor-commands.service\";\r\nimport { NoopValueAccessorDirective } from \"./noop-value-accessor.directive\";\r\nimport { NgControl } from \"@angular/forms\";\r\nimport {\r\n filterSlashCommands,\r\n SLASH_COMMAND_KEYS,\r\n} from \"./config/i18n-slash-commands\";\r\n\r\nimport { ToolbarConfig } from \"./tiptap-toolbar.component\";\r\nimport {\r\n BubbleMenuConfig,\r\n ImageBubbleMenuConfig,\r\n TableBubbleMenuConfig,\r\n} from \"./models/bubble-menu.model\";\r\nimport { concat, defer, of, tap } from \"rxjs\";\r\n\r\n// Configuration par défaut de la toolbar\r\nexport const DEFAULT_TOOLBAR_CONFIG: ToolbarConfig = {\r\n bold: true,\r\n italic: true,\r\n underline: true,\r\n strike: true,\r\n code: true,\r\n superscript: false,\r\n subscript: false,\r\n highlight: true,\r\n heading1: true,\r\n heading2: true,\r\n heading3: true,\r\n bulletList: true,\r\n orderedList: true,\r\n blockquote: true,\r\n alignLeft: false,\r\n alignCenter: false,\r\n alignRight: false,\r\n alignJustify: false,\r\n link: true,\r\n image: true,\r\n horizontalRule: true,\r\n table: true,\r\n undo: true,\r\n redo: true,\r\n clear: false, // Désactivé par défaut (opt-in)\r\n separator: true,\r\n};\r\n\r\n// Configuration par défaut du bubble menu\r\nexport const DEFAULT_BUBBLE_MENU_CONFIG: BubbleMenuConfig = {\r\n bold: true,\r\n italic: true,\r\n underline: true,\r\n strike: true,\r\n code: true,\r\n superscript: false,\r\n subscript: false,\r\n highlight: true,\r\n link: true,\r\n separator: true,\r\n};\r\n\r\n// Configuration par défaut du bubble menu image\r\nexport const DEFAULT_IMAGE_BUBBLE_MENU_CONFIG: ImageBubbleMenuConfig = {\r\n changeImage: true,\r\n resizeSmall: true,\r\n resizeMedium: true,\r\n resizeLarge: true,\r\n resizeOriginal: true,\r\n deleteImage: true,\r\n separator: true,\r\n};\r\n\r\n// Configuration par défaut du menu de table\r\nexport const DEFAULT_TABLE_MENU_CONFIG: TableBubbleMenuConfig = {\r\n addRowBefore: true,\r\n addRowAfter: true,\r\n deleteRow: true,\r\n addColumnBefore: true,\r\n addColumnAfter: true,\r\n deleteColumn: true,\r\n toggleHeaderRow: true,\r\n toggleHeaderColumn: true,\r\n deleteTable: true,\r\n separator: true,\r\n};\r\n\r\nexport const DEFAULT_CELL_MENU_CONFIG: CellBubbleMenuConfig = {\r\n mergeCells: true,\r\n splitCell: true,\r\n};\r\n\r\nexport const DEFAULT_SLASH_COMMANDS: SlashCommandsConfig = {\r\n commands: [], // Sera rempli par filterSlashCommands\r\n};\r\n\r\n@Component({\r\n selector: \"angular-tiptap-editor\",\r\n standalone: true,\r\n hostDirectives: [NoopValueAccessorDirective],\r\n imports: [\r\n TiptapToolbarComponent,\r\n TiptapImageUploadComponent,\r\n TiptapBubbleMenuComponent,\r\n TiptapImageBubbleMenuComponent,\r\n TiptapTableBubbleMenuComponent,\r\n TiptapCellBubbleMenuComponent,\r\n TiptapSlashCommandsComponent,\r\n ],\r\n template: `\r\n <div class=\"tiptap-editor\">\r\n <!-- Toolbar -->\r\n @if (showToolbar() && editor()) {\r\n <tiptap-toolbar [editor]=\"editor()!\" [config]=\"toolbarConfig()\">\r\n <div image-upload class=\"image-upload-container\">\r\n <tiptap-image-upload\r\n [config]=\"imageUploadConfig()\"\r\n (imageSelected)=\"onImageUploaded($event)\"\r\n (error)=\"onImageUploadError($event)\"\r\n />\r\n </div>\r\n </tiptap-toolbar>\r\n }\r\n\r\n <!-- Contenu de l'éditeur -->\r\n <div\r\n #editorElement\r\n class=\"tiptap-content\"\r\n [class.drag-over]=\"isDragOver()\"\r\n (dragover)=\"onDragOver($event)\"\r\n (drop)=\"onDrop($event)\"\r\n (click)=\"onEditorClick($event)\"\r\n ></div>\r\n\r\n <!-- Bubble Menu pour le texte -->\r\n @if (showBubbleMenu() && editor()) {\r\n <tiptap-bubble-menu\r\n [editor]=\"editor()!\"\r\n [config]=\"bubbleMenuConfig()\"\r\n [style.display]=\"editorFullyInitialized() ? 'block' : 'none'\"\r\n ></tiptap-bubble-menu>\r\n }\r\n\r\n <!-- Bubble Menu pour les images -->\r\n @if (showImageBubbleMenu() && editor()) {\r\n <tiptap-image-bubble-menu\r\n [editor]=\"editor()!\"\r\n [config]=\"imageBubbleMenuConfig()\"\r\n [style.display]=\"editorFullyInitialized() ? 'block' : 'none'\"\r\n ></tiptap-image-bubble-menu>\r\n }\r\n\r\n <!-- Slash Commands -->\r\n @if (enableSlashCommands() && editor()) {\r\n <tiptap-slash-commands\r\n [editor]=\"editor()!\"\r\n [config]=\"slashCommandsConfigComputed()\"\r\n [style.display]=\"editorFullyInitialized() ? 'block' : 'none'\"\r\n (imageUploadRequested)=\"onSlashCommandImageUpload($event)\"\r\n ></tiptap-slash-commands>\r\n }\r\n\r\n <!-- Table Menu -->\r\n @if (editor()) {\r\n <tiptap-table-bubble-menu\r\n [editor]=\"editor()!\"\r\n [config]=\"tableBubbleMenuConfig()\"\r\n [style.display]=\"editorFullyInitialized() ? 'block' : 'none'\"\r\n ></tiptap-table-bubble-menu>\r\n }\r\n\r\n <!-- Cell Menu -->\r\n @if (editor()) {\r\n <tiptap-cell-bubble-menu\r\n [editor]=\"editor()!\"\r\n [config]=\"cellBubbleMenuConfig()\"\r\n [style.display]=\"editorFullyInitialized() ? 'block' : 'none'\"\r\n ></tiptap-cell-bubble-menu>\r\n }\r\n\r\n <!-- Table Edit Button - Supprimé car remplacé par le menu bubble -->\r\n\r\n <!-- Compteur de caractères -->\r\n @if (showCharacterCount()) {\r\n <div class=\"character-count\">\r\n {{ characterCount() }}\r\n {{ i18nService.editor().character\r\n }}{{ characterCount() > 1 ? \"s\" : \"\" }}, {{ wordCount() }}\r\n {{ i18nService.editor().word }}{{ wordCount() > 1 ? \"s\" : \"\" }}\r\n @if (maxCharacters()) { /\r\n {{ maxCharacters() }}\r\n }\r\n </div>\r\n }\r\n </div>\r\n `,\r\n\r\n styles: [\r\n `\r\n /* Styles de base pour l'éditeur Tiptap */\r\n\r\n /* Conteneur principal de l'éditeur */\r\n .tiptap-editor {\r\n border: 2px solid #e2e8f0;\r\n border-radius: 8px;\r\n background: white;\r\n overflow: hidden;\r\n transition: border-color 0.2s ease;\r\n }\r\n\r\n .tiptap-editor:focus-within {\r\n border-color: #3182ce;\r\n }\r\n\r\n /* Contenu de l'éditeur */\r\n .tiptap-content {\r\n padding: 16px;\r\n min-height: var(--editor-min-height, 200px);\r\n height: var(--editor-height, auto);\r\n max-height: var(--editor-max-height, none);\r\n overflow-y: var(--editor-overflow, visible);\r\n outline: none;\r\n position: relative;\r\n }\r\n\r\n .tiptap-content.drag-over {\r\n background: #f0f8ff;\r\n border: 2px dashed #3182ce;\r\n }\r\n\r\n /* Compteur de caractères */\r\n .character-count {\r\n padding: 8px 16px;\r\n font-size: 12px;\r\n color: #718096;\r\n text-align: right;\r\n border-top: 1px solid #e2e8f0;\r\n background: #f8f9fa;\r\n }\r\n\r\n /* Styles spécifiques au composant */\r\n .image-upload-container {\r\n position: relative;\r\n display: inline-block;\r\n }\r\n\r\n /* Styles ProseMirror avec :host ::ng-deep */\r\n :host ::ng-deep .ProseMirror {\r\n outline: none;\r\n line-height: 1.6;\r\n color: #2d3748;\r\n min-height: 100%;\r\n height: 100%;\r\n /* S'assurer que le contenu s'étend correctement dans un conteneur scrollable */\r\n word-wrap: break-word;\r\n overflow-wrap: break-word;\r\n }\r\n\r\n /* Titres */\r\n :host ::ng-deep .ProseMirror h1 {\r\n font-size: 2em;\r\n font-weight: bold;\r\n margin-top: 0;\r\n margin-bottom: 0.5em;\r\n }\r\n\r\n :host ::ng-deep .ProseMirror h2 {\r\n font-size: 1.5em;\r\n font-weight: bold;\r\n margin-top: 1em;\r\n margin-bottom: 0.5em;\r\n }\r\n\r\n :host ::ng-deep .ProseMirror h3 {\r\n font-size: 1.25em;\r\n font-weight: bold;\r\n margin-top: 1em;\r\n margin-bottom: 0.5em;\r\n }\r\n\r\n /* Paragraphes et listes */\r\n :host ::ng-deep .ProseMirror p {\r\n margin: 0.5em 0;\r\n }\r\n\r\n :host ::ng-deep .ProseMirror ul,\r\n :host ::ng-deep .ProseMirror ol {\r\n padding-left: 2em;\r\n margin: 0.5em 0;\r\n }\r\n\r\n /* Citations */\r\n :host ::ng-deep .ProseMirror blockquote {\r\n border-left: 4px solid #e2e8f0;\r\n padding-left: 1em;\r\n margin: 1em 0;\r\n font-style: italic;\r\n background: #f8f9fa;\r\n padding: 0.5em 1em;\r\n border-radius: 0 4px 4px 0;\r\n }\r\n\r\n /* Code */\r\n :host ::ng-deep .ProseMirror code {\r\n background: #f1f5f9;\r\n padding: 0.2em 0.4em;\r\n border-radius: 3px;\r\n font-family: \"Monaco\", \"Consolas\", monospace;\r\n font-size: 0.9em;\r\n }\r\n\r\n :host ::ng-deep .ProseMirror pre {\r\n background: #1a202c;\r\n color: #e2e8f0;\r\n padding: 1em;\r\n border-radius: 6px;\r\n overflow-x: auto;\r\n margin: 1em 0;\r\n }\r\n\r\n :host ::ng-deep .ProseMirror pre code {\r\n background: none;\r\n color: inherit;\r\n padding: 0;\r\n }\r\n\r\n /* Placeholder */\r\n :host ::ng-deep .ProseMirror p.is-editor-empty:first-child::before {\r\n content: attr(data-placeholder);\r\n color: #a0aec0;\r\n pointer-events: none;\r\n float: left;\r\n height: 0;\r\n }\r\n\r\n /* Mode lecture seule */\r\n :host ::ng-deep .ProseMirror[contenteditable=\"false\"] {\r\n pointer-events: none;\r\n }\r\n\r\n :host ::ng-deep .ProseMirror[contenteditable=\"false\"] img {\r\n cursor: default;\r\n pointer-events: none;\r\n }\r\n\r\n :host ::ng-deep .ProseMirror[contenteditable=\"false\"] img:hover {\r\n transform: none;\r\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\r\n }\r\n\r\n :host\r\n ::ng-deep\r\n .ProseMirror[contenteditable=\"false\"]\r\n img.ProseMirror-selectednode {\r\n outline: none;\r\n }\r\n\r\n /* Styles pour les images */\r\n :host ::ng-deep .ProseMirror img {\r\n position: relative;\r\n display: inline-block;\r\n max-width: 100%;\r\n height: auto;\r\n cursor: pointer;\r\n transition: all 0.2s ease;\r\n border: 2px solid transparent;\r\n border-radius: 8px;\r\n }\r\n\r\n :host ::ng-deep .ProseMirror img:hover {\r\n border-color: #e2e8f0;\r\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\r\n }\r\n\r\n :host ::ng-deep .ProseMirror img.ProseMirror-selectednode {\r\n border-color: #3182ce;\r\n box-shadow: 0 0 0 3px rgba(49, 130, 206, 0.1);\r\n transition: all 0.2s ease;\r\n }\r\n\r\n /* Images avec classe tiptap-image */\r\n :host ::ng-deep .ProseMirror .tiptap-image {\r\n max-width: 100%;\r\n height: auto;\r\n border-radius: 16px;\r\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08);\r\n margin: 0.5em 0;\r\n cursor: pointer;\r\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\r\n display: block;\r\n filter: brightness(1) contrast(1);\r\n }\r\n\r\n :host ::ng-deep .ProseMirror .tiptap-image:hover {\r\n box-shadow: 0 8px 30px rgba(0, 0, 0, 0.12);\r\n filter: brightness(1.02) contrast(1.02);\r\n }\r\n\r\n :host ::ng-deep .ProseMirror .tiptap-image.ProseMirror-selectednode {\r\n outline: 2px solid #6366f1;\r\n outline-offset: 2px;\r\n border-radius: 16px;\r\n box-shadow: 0 0 0 4px rgba(99, 102, 241, 0.1);\r\n }\r\n\r\n /* Conteneurs d'images avec alignement */\r\n :host ::ng-deep .image-container {\r\n margin: 0.5em 0;\r\n text-align: center;\r\n border-radius: 16px;\r\n overflow: hidden;\r\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\r\n }\r\n\r\n :host ::ng-deep .image-container.image-align-left {\r\n text-align: left;\r\n }\r\n\r\n :host ::ng-deep .image-container.image-align-center {\r\n text-align: center;\r\n }\r\n\r\n :host ::ng-deep .image-container.image-align-right {\r\n text-align: right;\r\n }\r\n\r\n :host ::ng-deep .image-container img {\r\n display: inline-block;\r\n max-width: 100%;\r\n height: auto;\r\n border-radius: 16px;\r\n }\r\n\r\n /* Conteneur pour les images redimensionnables */\r\n :host ::ng-deep .resizable-image-container {\r\n position: relative;\r\n display: inline-block;\r\n margin: 0.5em 0;\r\n }\r\n\r\n /* Conteneur des contrôles de redimensionnement */\r\n :host ::ng-deep .resize-controls {\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n bottom: 0;\r\n pointer-events: none;\r\n z-index: 1000;\r\n }\r\n\r\n /* Poignées de redimensionnement */\r\n :host ::ng-deep .resize-handle {\r\n position: absolute;\r\n width: 12px;\r\n height: 12px;\r\n background: #3b82f6;\r\n border: 2px solid white;\r\n border-radius: 50%;\r\n pointer-events: all;\r\n cursor: pointer;\r\n z-index: 1001;\r\n transition: all 0.15s ease;\r\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.2);\r\n }\r\n\r\n :host ::ng-deep .resize-handle:hover {\r\n background: #2563eb;\r\n box-shadow: 0 3px 8px rgba(0, 0, 0, 0.3);\r\n }\r\n\r\n :host ::ng-deep .resize-handle:active {\r\n background: #1d4ed8;\r\n }\r\n\r\n /* Poignées du milieu avec scale séparé */\r\n :host ::ng-deep .resize-handle-n:hover,\r\n :host ::ng-deep .resize-handle-s:hover {\r\n transform: translateX(-50%) scale(1.2);\r\n }\r\n\r\n :host ::ng-deep .resize-handle-w:hover,\r\n :host ::ng-deep .resize-handle-e:hover {\r\n transform: translateY(-50%) scale(1.2);\r\n }\r\n\r\n :host ::ng-deep .resize-handle-n:active,\r\n :host ::ng-deep .resize-handle-s:active {\r\n transform: translateX(-50%) scale(0.9);\r\n }\r\n\r\n :host ::ng-deep .resize-handle-w:active,\r\n :host ::ng-deep .resize-handle-e:active {\r\n transform: translateY(-50%) scale(0.9);\r\n }\r\n\r\n /* Poignées des coins avec scale simple */\r\n :host ::ng-deep .resize-handle-nw:hover,\r\n :host ::ng-deep .resize-handle-ne:hover,\r\n :host ::ng-deep .resize-handle-sw:hover,\r\n :host ::ng-deep .resize-handle-se:hover {\r\n transform: scale(1.2);\r\n }\r\n\r\n :host ::ng-deep .resize-handle-nw:active,\r\n :host ::ng-deep .resize-handle-ne:active,\r\n :host ::ng-deep .resize-handle-sw:active,\r\n :host ::ng-deep .resize-handle-se:active {\r\n transform: scale(0.9);\r\n }\r\n\r\n /* Positions spécifiques pour chaque poignée */\r\n :host ::ng-deep .resize-handle-nw {\r\n top: 0;\r\n left: -6px;\r\n cursor: nw-resize;\r\n }\r\n :host ::ng-deep .resize-handle-n {\r\n top: 0;\r\n left: 50%;\r\n transform: translateX(-50%);\r\n cursor: n-resize;\r\n }\r\n :host ::ng-deep .resize-handle-ne {\r\n top: 0;\r\n right: -6px;\r\n cursor: ne-resize;\r\n }\r\n :host ::ng-deep .resize-handle-w {\r\n top: 50%;\r\n left: -6px;\r\n transform: translateY(-50%);\r\n cursor: w-resize;\r\n }\r\n :host ::ng-deep .resize-handle-e {\r\n top: 50%;\r\n right: -6px;\r\n transform: translateY(-50%);\r\n cursor: e-resize;\r\n }\r\n :host ::ng-deep .resize-handle-sw {\r\n bottom: 0;\r\n left: -6px;\r\n cursor: sw-resize;\r\n }\r\n :host ::ng-deep .resize-handle-s {\r\n bottom: 0;\r\n left: 50%;\r\n transform: translateX(-50%);\r\n cursor: s-resize;\r\n }\r\n :host ::ng-deep .resize-handle-se {\r\n bottom: 0;\r\n right: -6px;\r\n cursor: se-resize;\r\n }\r\n\r\n /* Styles pour le redimensionnement en cours */\r\n :host ::ng-deep body.resizing {\r\n user-select: none;\r\n cursor: crosshair;\r\n }\r\n\r\n :host ::ng-deep body.resizing .ProseMirror {\r\n pointer-events: none;\r\n }\r\n\r\n :host ::ng-deep body.resizing .ProseMirror .tiptap-image {\r\n pointer-events: none;\r\n }\r\n\r\n /* Styles pour les informations de taille d'image */\r\n :host ::ng-deep .image-size-info {\r\n position: absolute;\r\n bottom: -20px;\r\n left: 50%;\r\n transform: translateX(-50%);\r\n background: rgba(0, 0, 0, 0.8);\r\n color: white;\r\n padding: 2px 6px;\r\n border-radius: 3px;\r\n font-size: 11px;\r\n white-space: nowrap;\r\n opacity: 0;\r\n transition: opacity 0.2s ease;\r\n }\r\n\r\n :host ::ng-deep .image-container:hover .image-size-info {\r\n opacity: 1;\r\n }\r\n /* Styles pour les tables */\r\n :host ::ng-deep .ProseMirror table {\r\n border-collapse: separate;\r\n border-spacing: 0;\r\n margin: 0;\r\n table-layout: fixed;\r\n width: 100%;\r\n border-radius: 8px;\r\n overflow: hidden;\r\n }\r\n\r\n :host ::ng-deep .ProseMirror table td,\r\n :host ::ng-deep .ProseMirror table th {\r\n border: none;\r\n border-right: 1px solid #e2e8f0;\r\n border-bottom: 1px solid #e2e8f0;\r\n box-sizing: border-box;\r\n min-width: 1em;\r\n padding: 8px 12px;\r\n position: relative;\r\n vertical-align: top;\r\n background: white;\r\n }\r\n\r\n /* Ajouter les bordures externes manquantes pour former la bordure du tableau */\r\n :host ::ng-deep .ProseMirror table td:first-child,\r\n :host ::ng-deep .ProseMirror table th:first-child {\r\n border-left: 1px solid #e2e8f0;\r\n }\r\n\r\n :host ::ng-deep .ProseMirror table tr:first-child td,\r\n :host ::ng-deep .ProseMirror table tr:first-child th {\r\n border-top: 1px solid #e2e8f0;\r\n }\r\n\r\n /* Coins arrondis */\r\n :host ::ng-deep .ProseMirror table tr:first-child th:first-child {\r\n border-top-left-radius: 8px;\r\n }\r\n\r\n :host ::ng-deep .ProseMirror table tr:first-child th:last-child {\r\n border-top-right-radius: 8px;\r\n }\r\n\r\n :host ::ng-deep .ProseMirror table tr:last-child td:first-child {\r\n border-bottom-left-radius: 8px;\r\n }\r\n\r\n :host ::ng-deep .ProseMirror table tr:last-child td:last-child {\r\n border-bottom-right-radius: 8px;\r\n }\r\n\r\n /* En-têtes de table */\r\n :host ::ng-deep .ProseMirror table th {\r\n background: #f8f9fa;\r\n font-weight: 600;\r\n color: #374151;\r\n }\r\n\r\n /* Cellules sélectionnées */\r\n :host ::ng-deep .ProseMirror table .selectedCell:after {\r\n background: rgba(200, 200, 255, 0.4);\r\n content: \"\";\r\n left: 0;\r\n right: 0;\r\n top: 0;\r\n bottom: 0;\r\n pointer-events: none;\r\n position: absolute;\r\n z-index: 2;\r\n }\r\n\r\n /* Poignées de redimensionnement */\r\n :host ::ng-deep .ProseMirror table .column-resize-handle {\r\n position: absolute;\r\n right: -2px;\r\n top: 0;\r\n bottom: 0;\r\n width: 4px;\r\n background-color: #6366f1;\r\n opacity: 0;\r\n transition: opacity 0.2s ease;\r\n }\r\n\r\n :host ::ng-deep .ProseMirror table:hover .column-resize-handle {\r\n opacity: 1;\r\n }\r\n\r\n :host ::ng-deep .ProseMirror table .column-resize-handle:hover {\r\n background-color: #4f46e5;\r\n }\r\n\r\n /* Container avec scroll horizontal */\r\n :host ::ng-deep .ProseMirror .tableWrapper {\r\n overflow-x: auto;\r\n margin: 1em 0;\r\n border-radius: 8px;\r\n }\r\n\r\n :host ::ng-deep .ProseMirror .tableWrapper table {\r\n margin: 0;\r\n border-radius: 8px;\r\n min-width: 600px;\r\n overflow: hidden;\r\n }\r\n\r\n /* Paragraphes dans les tables */\r\n :host ::ng-deep .ProseMirror table p {\r\n margin: 0;\r\n }\r\n\r\n /* Styles pour les cellules sélectionnées */\r\n :host ::ng-deep .ProseMirror table .selectedCell {\r\n background-color: rgba(99, 102, 241, 0.1);\r\n }\r\n\r\n /* Styles pour les en-têtes de table */\r\n :host ::ng-deep .ProseMirror table th {\r\n background-color: #f8f9fa;\r\n font-weight: 600;\r\n color: #374151;\r\n text-align: left;\r\n }\r\n\r\n /* Styles pour les lignes alternées (optionnel) */\r\n :host ::ng-deep .ProseMirror table tbody tr:nth-child(even) {\r\n background-color: #fafbfc;\r\n }\r\n\r\n :host ::ng-deep .ProseMirror table tbody tr:hover {\r\n background-color: #f1f5f9;\r\n }\r\n `,\r\n ],\r\n})\r\nexport class AngularTiptapEditorComponent implements AfterViewInit, OnDestroy {\r\n // Nouveaux inputs avec signal\r\n content = input<string>(\"\");\r\n placeholder = input<string>(\"\");\r\n editable = input<boolean>(true);\r\n minHeight = input<number>(200);\r\n height = input<number | undefined>(undefined);\r\n maxHeight = input<number | undefined>(undefined);\r\n showToolbar = input<boolean>(true);\r\n showCharacterCount = input<boolean>(true);\r\n maxCharacters = input<number | undefined>(undefined);\r\n enableOfficePaste = input<boolean>(true);\r\n enableSlashCommands = input<boolean>(true);\r\n slashCommandsConfig = input<SlashCommandsConfig | undefined>(undefined);\r\n locale = input<SupportedLocale | undefined>(undefined);\r\n autofocus = input<boolean | 'start' | 'end' | 'all' | number>(false);\r\n\r\n // Nouveaux inputs pour les bubble menus\r\n showBubbleMenu = input<boolean>(true);\r\n bubbleMenu = input<Partial<BubbleMenuConfig>>(DEFAULT_BUBBLE_MENU_CONFIG);\r\n showImageBubbleMenu = input<boolean>(true);\r\n imageBubbleMenu = input<Partial<ImageBubbleMenuConfig>>(\r\n DEFAULT_IMAGE_BUBBLE_MENU_CONFIG\r\n );\r\n\r\n // Nouveau input pour la configuration de la toolbar\r\n toolbar = input<Partial<ToolbarConfig>>({});\r\n\r\n // Nouveau input pour la configuration de l'upload d'images\r\n imageUpload = input<Partial<any>>({});\r\n\r\n /**\r\n * Custom handler for image uploads.\r\n * When provided, images will be processed through this handler instead of being converted to base64.\r\n * This allows you to upload images to your own server/storage and use the returned URL.\r\n *\r\n * @example\r\n * ```typescript\r\n * myUploadHandler: ImageUploadHandler = async (context) => {\r\n * const formData = new FormData();\r\n * formData.append('image', context.file);\r\n * const response = await fetch('/api/upload', { method: 'POST', body: formData });\r\n * const data = await response.json();\r\n * return { src: data.imageUrl };\r\n * };\r\n *\r\n * // In template:\r\n * // <angular-tiptap-editor [imageUploadHandler]=\"myUploadHandler\" />\r\n * ```\r\n */\r\n imageUploadHandler = input<ImageUploadHandler | undefined>(undefined);\r\n\r\n\r\n // Nouveaux outputs\r\n contentChange = output<string>();\r\n editorCreated = output<Editor>();\r\n editorUpdate = output<{ editor: Editor; transaction: any }>();\r\n editorFocus = output<{ editor: Editor; event: FocusEvent }>();\r\n editorBlur = output<{ editor: Editor; event: FocusEvent }>();\r\n\r\n // ViewChild avec signal\r\n editorElement = viewChild.required<ElementRef>(\"editorElement\");\r\n\r\n // Signals privés pour l'état interne\r\n private _editor = signal<Editor | null>(null);\r\n private _characterCount = signal<number>(0);\r\n private _wordCount = signal<number>(0);\r\n private _isDragOver = signal<boolean>(false);\r\n private _editorFullyInitialized = signal<boolean>(false);\r\n\r\n // Accès en lecture seule aux signaux\r\n readonly editor = this._editor.asReadonly();\r\n readonly characterCount = this._characterCount.asReadonly();\r\n readonly wordCount = this._wordCount.asReadonly();\r\n readonly isDragOver = this._isDragOver.asReadonly();\r\n readonly editorFullyInitialized = this._editorFullyInitialized.asReadonly();\r\n\r\n // Computed pour les états de l'éditeur\r\n isEditorReady = computed(() => this.editor() !== null);\r\n\r\n // Computed pour la configuration de la toolbar\r\n toolbarConfig = computed(() =>\r\n Object.keys(this.toolbar()).length === 0\r\n ? DEFAULT_TOOLBAR_CONFIG\r\n : this.toolbar()\r\n );\r\n\r\n // Computed pour la configuration du bubble menu\r\n bubbleMenuConfig = computed(() =>\r\n Object.keys(this.bubbleMenu()).length === 0\r\n ? DEFAULT_BUBBLE_MENU_CONFIG\r\n : { ...DEFAULT_BUBBLE_MENU_CONFIG, ...this.bubbleMenu() }\r\n );\r\n\r\n // Computed pour la configuration du bubble menu image\r\n imageBubbleMenuConfig = computed(() =>\r\n Object.keys(this.imageBubbleMenu()).length === 0\r\n ? DEFAULT_IMAGE_BUBBLE_MENU_CONFIG\r\n : { ...DEFAULT_IMAGE_BUBBLE_MENU_CONFIG, ...this.imageBubbleMenu() }\r\n );\r\n\r\n // Computed pour la configuration du bubble menu table\r\n tableBubbleMenuConfig = computed(() => ({\r\n addRowBefore: true,\r\n addRowAfter: true,\r\n deleteRow: true,\r\n addColumnBefore: true,\r\n addColumnAfter: true,\r\n deleteColumn: true,\r\n deleteTable: true,\r\n toggleHeaderRow: true,\r\n toggleHeaderColumn: true,\r\n }));\r\n\r\n // Computed pour la configuration du menu de cellules\r\n cellBubbleMenuConfig = computed(() => ({\r\n mergeCells: true,\r\n splitCell: true,\r\n }));\r\n\r\n // Computed pour la configuration de l'upload d'images\r\n imageUploadConfig = computed(() => ({\r\n maxSize: 5,\r\n maxWidth: 1920,\r\n maxHeight: 1080,\r\n allowedTypes: [\"image/jpeg\", \"image/png\", \"image/gif\", \"image/webp\"],\r\n enableDragDrop: true,\r\n showPreview: true,\r\n multiple: false,\r\n compressImages: true,\r\n quality: 0.8,\r\n ...this.imageUpload(),\r\n }));\r\n\r\n // Computed pour la configuration des slash commands\r\n slashCommandsConfigComputed = computed(() => {\r\n const config = this.slashCommandsConfig();\r\n if (config) {\r\n return config;\r\n }\r\n\r\n // Configuration par défaut avec toutes les commandes\r\n const allCommands = filterSlashCommands(\r\n new Set(SLASH_COMMAND_KEYS),\r\n this.i18nService\r\n );\r\n return { commands: allCommands };\r\n });\r\n\r\n private _destroyRef = inject(DestroyRef);\r\n // NgControl pour gérer les FormControls\r\n private ngControl = inject(NgControl, { self: true, optional: true });\r\n\r\n readonly i18nService = inject(TiptapI18nService);\r\n readonly imageService = inject(ImageService);\r\n readonly editorCommandsService = inject(EditorCommandsService);\r\n\r\n constructor() {\r\n // Effet pour gérer le changement de langue\r\n effect(() => {\r\n const locale = this.locale();\r\n if (locale) {\r\n this.i18nService.setLocale(locale);\r\n }\r\n });\r\n\r\n // Effet pour mettre à jour le contenu de l'éditeur\r\n effect(() => {\r\n const editor = this.editor();\r\n const content = this.content();\r\n const hasFormControl = !!(this.ngControl as any)?.control;\r\n\r\n // Ne pas écraser le contenu si on a un FormControl et que le content est vide\r\n if (editor && content !== undefined && content !== editor.getHTML()) {\r\n if (hasFormControl && !content) {\r\n return;\r\n }\r\n this.setContent(content, false);\r\n }\r\n });\r\n\r\n // Effet pour mettre à jour les propriétés de hauteur\r\n effect(() => {\r\n const minHeight = this.minHeight();\r\n const height = this.height();\r\n const maxHeight = this.maxHeight();\r\n const element = this.editorElement()?.nativeElement;\r\n\r\n // Calculer automatiquement si le scroll est nécessaire\r\n const needsScroll = height !== undefined || maxHeight !== undefined;\r\n\r\n if (element) {\r\n element.style.setProperty(\"--editor-min-height\", `${minHeight}px`);\r\n element.style.setProperty(\r\n \"--editor-height\",\r\n height ? `${height}px` : \"auto\"\r\n );\r\n element.style.setProperty(\r\n \"--editor-max-height\",\r\n maxHeight ? `${maxHeight}px` : \"none\"\r\n );\r\n element.style.setProperty(\r\n \"--editor-overflow\",\r\n needsScroll ? \"auto\" : \"visible\"\r\n );\r\n }\r\n });\r\n\r\n // Effect pour surveiller les changements d'édition\r\n effect(() => {\r\n const currentEditor = this.editor();\r\n const isEditable = this.editable();\r\n\r\n if (currentEditor) {\r\n this.editorCommandsService.setEditable(currentEditor, isEditable);\r\n }\r\n });\r\n\r\n // Effect pour synchroniser le handler d'upload d'images avec le service\r\n effect(() => {\r\n const handler = this.imageUploadHandler();\r\n this.imageService.uploadHandler = handler || null;\r\n });\r\n\r\n // Effect pour la détection du survol des tables\r\n effect(() => {\r\n const currentEditor = this.editor();\r\n if (!currentEditor) return;\r\n\r\n // Table hover detection supprimée car remplacée par le menu bubble\r\n });\r\n }\r\n\r\n ngAfterViewInit() {\r\n // La vue est déjà complètement initialisée dans ngAfterViewInit\r\n this.initEditor();\r\n\r\n // S'abonner aux changements du FormControl\r\n this.setupFormControlSubscription();\r\n }\r\n\r\n ngOnDestroy() {\r\n const currentEditor = this.editor();\r\n if (currentEditor) {\r\n currentEditor.destroy();\r\n }\r\n this._editorFullyInitialized.set(false);\r\n }\r\n\r\n private initEditor() {\r\n const extensions: (Extension | Node | Mark)[] = [\r\n StarterKit,\r\n Placeholder.configure({\r\n placeholder:\r\n this.placeholder() || this.i18nService.editor().placeholder,\r\n }),\r\n Underline,\r\n Superscript,\r\n Subscript,\r\n TextAlign.configure({\r\n types: [\"heading\", \"paragraph\"],\r\n }),\r\n Link.configure({\r\n openOnClick: false,\r\n HTMLAttributes: {\r\n class: \"tiptap-link\",\r\n },\r\n }),\r\n Highlight.configure({\r\n multicolor: true,\r\n HTMLAttributes: {\r\n class: \"tiptap-highlight\",\r\n },\r\n }),\r\n ResizableImage.configure({\r\n inline: false,\r\n allowBase64: true,\r\n HTMLAttributes: {\r\n class: \"tiptap-image\",\r\n },\r\n }),\r\n UploadProgress.configure({\r\n isUploading: () => this.imageService.isUploading(),\r\n uploadProgress: () => this.imageService.uploadProgress(),\r\n uploadMessage: () => this.imageService.uploadMessage(),\r\n }),\r\n TableExtension,\r\n ];\r\n\r\n // Ajouter l'extension Office Paste si activée\r\n if (this.enableOfficePaste()) {\r\n extensions.push(\r\n OfficePaste.configure({\r\n // Configuration par défaut pour une meilleure compatibilité\r\n transformPastedHTML: true,\r\n transformPastedText: true,\r\n })\r\n );\r\n }\r\n\r\n if (this.showCharacterCount()) {\r\n extensions.push(\r\n CharacterCount.configure({\r\n limit: this.maxCharacters(),\r\n })\r\n );\r\n }\r\n\r\n const newEditor = new Editor({\r\n element: this.editorElement().nativeElement,\r\n extensions,\r\n content: this.content(),\r\n editable: this.editable(),\r\n autofocus: this.autofocus(),\r\n onUpdate: ({ editor, transaction }) => {\r\n const html = editor.getHTML();\r\n this.contentChange.emit(html);\r\n // Mettre à jour le FormControl si il existe (dans le prochain cycle)\r\n if ((this.ngControl as any)?.control) {\r\n setTimeout(() => {\r\n (this.ngControl as any).control.setValue(html, {\r\n emitEvent: false,\r\n });\r\n }, 0);\r\n }\r\n this.editorUpdate.emit({ editor, transaction });\r\n this.updateCharacterCount(editor);\r\n },\r\n onCreate: ({ editor }) => {\r\n this.editorCreated.emit(editor);\r\n this.updateCharacterCount(editor);\r\n\r\n // Marquer l'éditeur comme complètement initialisé après un court délai\r\n // pour s'assurer que tous les plugins et extensions sont prêts\r\n setTimeout(() => {\r\n this._editorFullyInitialized.set(true);\r\n }, 100);\r\n },\r\n onFocus: ({ editor, event }) => {\r\n this.editorFocus.emit({ editor, event });\r\n },\r\n onBlur: ({ editor, event }) => {\r\n // Marquer le FormControl comme touché si il existe\r\n if ((this.ngControl as any)?.control) {\r\n (this.ngControl as any).control.markAsTouched();\r\n }\r\n this.editorBlur.emit({ editor, event });\r\n },\r\n });\r\n\r\n // Stocker la référence de l'éditeur immédiatement\r\n this._editor.set(newEditor);\r\n }\r\n\r\n private updateCharacterCount(editor: Editor) {\r\n if (this.showCharacterCount() && editor.storage[\"characterCount\"]) {\r\n const storage = editor.storage[\"characterCount\"];\r\n this._characterCount.set(storage.characters());\r\n this._wordCount.set(storage.words());\r\n }\r\n }\r\n\r\n // Méthodes pour l'upload d'images\r\n onImageUploaded(result: ImageUploadResult) {\r\n const currentEditor = this.editor();\r\n if (currentEditor) {\r\n this.imageService.insertImage(currentEditor, {\r\n src: result.src,\r\n alt: result.name,\r\n title: `${result.name} (${result.width}×${result.height})`,\r\n width: result.width,\r\n height: result.height,\r\n });\r\n }\r\n }\r\n\r\n onImageUploadError(error: string) {\r\n // Ici vous pourriez afficher une notification à l'utilisateur\r\n }\r\n\r\n // Gestion de l'upload d'image depuis les slash commands\r\n async onSlashCommandImageUpload(file: File) {\r\n const currentEditor = this.editor();\r\n if (currentEditor) {\r\n try {\r\n await this.imageService.uploadAndInsertImage(currentEditor, file);\r\n } catch (error) {\r\n // Gérer l'erreur silencieusement ou afficher une notification\r\n }\r\n }\r\n }\r\n\r\n onDragOver(event: DragEvent) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this._isDragOver.set(true);\r\n }\r\n\r\n onDrop(event: DragEvent) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this._isDragOver.set(false);\r\n\r\n const files = event.dataTransfer?.files;\r\n if (files && files.length > 0) {\r\n const file = files[0];\r\n if (file.type.startsWith(\"image/\")) {\r\n this.insertImageFromFile(file);\r\n }\r\n }\r\n }\r\n\r\n private async insertImageFromFile(file: File) {\r\n const currentEditor = this.editor();\r\n if (currentEditor) {\r\n try {\r\n await this.imageService.uploadAndInsertImage(currentEditor, file);\r\n } catch (error) {\r\n // Gérer l'erreur silencieusement ou afficher une notification\r\n }\r\n }\r\n }\r\n\r\n // Public methods\r\n getHTML(): string {\r\n return this.editor()?.getHTML() || \"\";\r\n }\r\n\r\n getJSON(): any {\r\n return this.editor()?.getJSON();\r\n }\r\n\r\n getText(): string {\r\n return this.editor()?.getText() || \"\";\r\n }\r\n\r\n setContent(content: string, emitUpdate = true) {\r\n const editor = this.editor();\r\n if (editor) {\r\n this.editorCommandsService.setContent(editor, content, emitUpdate);\r\n }\r\n }\r\n\r\n focus() {\r\n const editor = this.editor();\r\n if (editor) {\r\n this.editorCommandsService.focus(editor);\r\n }\r\n }\r\n\r\n blur() {\r\n const editor = this.editor();\r\n if (editor) {\r\n this.editorCommandsService.blur(editor);\r\n }\r\n }\r\n\r\n clearContent() {\r\n const editor = this.editor();\r\n if (editor) {\r\n this.editorCommandsService.clearContent(editor);\r\n }\r\n }\r\n\r\n // Méthode publique pour obtenir l'éditeur\r\n getEditor(): Editor | null {\r\n return this.editor();\r\n }\r\n\r\n private setupFormControlSubscription(): void {\r\n const control = (this.ngControl as any)?.control;\r\n if (control) {\r\n const formValue$ = concat(\r\n defer(() => of(control.value)),\r\n control.valueChanges\r\n );\r\n\r\n formValue$\r\n .pipe(\r\n tap((value: any) => {\r\n const editor = this.editor();\r\n if (editor) {\r\n this.setContent(value, false);\r\n }\r\n }),\r\n takeUntilDestroyed(this._destroyRef)\r\n )\r\n .subscribe();\r\n }\r\n }\r\n\r\n // Méthode pour gérer l'état disabled\r\n setDisabledState(isDisabled: boolean): void {\r\n const currentEditor = this.editor();\r\n if (currentEditor) {\r\n this.editorCommandsService.setEditable(currentEditor, !isDisabled);\r\n }\r\n }\r\n\r\n onEditorClick(event: MouseEvent) {\r\n const editor = this.editor();\r\n if (!editor) return;\r\n\r\n // Vérifier si on clique sur l'élément conteneur et non sur le contenu\r\n const target = event.target as HTMLElement;\r\n const editorElement = this.editorElement()?.nativeElement;\r\n\r\n if (\r\n target === editorElement ||\r\n target.classList.contains(\"tiptap-content\")\r\n ) {\r\n // On clique dans l'espace vide, positionner le curseur à la fin\r\n setTimeout(() => {\r\n const { doc } = editor.state;\r\n const endPos = doc.content.size;\r\n editor.commands.setTextSelection(endPos);\r\n editor.commands.focus();\r\n }, 0);\r\n }\r\n }\r\n\r\n // Méthodes pour le bouton d'édition de table - Supprimées car remplacées par le menu bubble\r\n}\r\n","/*\r\n * Public API Surface of tiptap-editor\r\n */\r\n\r\n// Main component - only public component\r\nexport * from \"./lib/tiptap-editor.component\";\r\n\r\n// Host directive for FormControl integration\r\nexport * from \"./lib/noop-value-accessor.directive\";\r\n\r\n// Internationalization service\r\nexport * from \"./lib/services/i18n.service\";\r\n\r\n// Editor commands service\r\nexport * from \"./lib/services/editor-commands.service\";\r\n\r\n// Image service\r\nexport * from \"./lib/services/image.service\";\r\n\r\n// Types and interfaces for configuration\r\nexport type { ToolbarConfig } from \"./lib/tiptap-toolbar.component\";\r\nexport type {\r\n BubbleMenuConfig,\r\n ImageBubbleMenuConfig,\r\n TableBubbleMenuConfig,\r\n CellBubbleMenuConfig,\r\n} from \"./lib/models/bubble-menu.model\";\r\nexport type {\r\n SlashCommandsConfig,\r\n SlashCommandItem,\r\n} from \"./lib/tiptap-slash-commands.component\";\r\n// Default configurations\r\nexport { DEFAULT_TOOLBAR_CONFIG } from \"./lib/tiptap-editor.component\";\r\nexport { DEFAULT_BUBBLE_MENU_CONFIG } from \"./lib/tiptap-editor.component\";\r\nexport { DEFAULT_IMAGE_BUBBLE_MENU_CONFIG } from \"./lib/tiptap-editor.component\";\r\nexport { DEFAULT_TABLE_MENU_CONFIG } from \"./lib/tiptap-editor.component\";\r\nexport { DEFAULT_SLASH_COMMANDS } from \"./lib/tiptap-slash-commands.component\";\r\n\r\n// Utility functions to create and filter internationalized slash commands\r\nexport {\r\n createI18nSlashCommands,\r\n filterSlashCommands,\r\n SLASH_COMMAND_KEYS,\r\n} from \"./lib/config/i18n-slash-commands\";\r\n\r\n// Types for height configuration\r\nexport type HeightConfig = {\r\n minHeight?: number;\r\n height?: number;\r\n maxHeight?: number;\r\n};\r\n\r\n// Supported locales type\r\nexport type { SupportedLocale } from \"./lib/services/i18n.service\";\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.EditorCommandsService","DEFAULT_SLASH_COMMANDS","Plugin","PluginKey","i1.NoopValueAccessorDirective"],"mappings":"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"}