@flogeez/angular-tiptap-editor 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +281 -0
- package/fesm2022/flogeez-angular-tiptap-editor.mjs +4240 -0
- package/fesm2022/flogeez-angular-tiptap-editor.mjs.map +1 -0
- package/index.d.ts +564 -0
- package/package.json +58 -0
- package/src/lib/styles/bubble-menu.global.css +32 -0
- package/src/lib/styles/index.css +53 -0
|
@@ -0,0 +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/tiptap-button.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/services/i18n.service.ts","../../../projects/angular-tiptap-editor/src/lib/services/editor-commands.service.ts","../../../projects/angular-tiptap-editor/src/lib/toolbar.component.ts","../../../projects/angular-tiptap-editor/src/lib/tiptap-image-upload.component.ts","../../../projects/angular-tiptap-editor/src/lib/tiptap-bubble-menu.component.ts","../../../projects/angular-tiptap-editor/src/lib/tiptap-image-bubble-menu.component.ts","../../../projects/angular-tiptap-editor/src/lib/tiptap-slash-commands.component.ts","../../../projects/angular-tiptap-editor/src/lib/tiptap-editor.component.ts","../../../projects/angular-tiptap-editor/src/lib/config/i18n-slash-commands.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 { Component, input, output } from \"@angular/core\";\n\nexport interface TiptapButtonConfig {\n icon: string;\n title: string;\n active?: boolean;\n disabled?: boolean;\n variant?: \"default\" | \"text\" | \"danger\";\n size?: \"small\" | \"medium\" | \"large\";\n iconSize?: \"small\" | \"medium\" | \"large\";\n}\n\n@Component({\n selector: \"tiptap-button\",\n standalone: true,\n template: `\n <button\n class=\"tiptap-button\"\n [class.is-active]=\"active()\"\n [class.is-disabled]=\"disabled()\"\n [class.text-button]=\"variant() === 'text'\"\n [class.danger]=\"variant() === 'danger'\"\n [class.small]=\"size() === 'small'\"\n [class.medium]=\"size() === 'medium'\"\n [class.large]=\"size() === 'large'\"\n [disabled]=\"disabled()\"\n [attr.title]=\"title()\"\n (mousedown)=\"onMouseDown($event)\"\n (click)=\"onClick.emit($event)\"\n type=\"button\"\n >\n <span\n class=\"material-symbols-outlined\"\n [class.icon-small]=\"iconSize() === 'small'\"\n [class.icon-medium]=\"iconSize() === 'medium'\"\n [class.icon-large]=\"iconSize() === 'large'\"\n >{{ icon() }}</span\n >\n <ng-content></ng-content>\n </button>\n `,\n styles: [\n `\n /* Styles de base pour les boutons Tiptap */\n .tiptap-button {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border: none;\n background: transparent;\n border-radius: 8px;\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n color: #64748b;\n position: relative;\n overflow: hidden;\n }\n\n .tiptap-button::before {\n content: \"\";\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: linear-gradient(135deg, #6366f1, #8b5cf6);\n opacity: 0;\n transition: opacity 0.2s ease;\n border-radius: 8px;\n }\n\n .tiptap-button:hover {\n color: #6366f1;\n transform: translateY(-1px);\n }\n\n .tiptap-button:hover::before {\n opacity: 0.1;\n }\n\n .tiptap-button:active {\n transform: translateY(0);\n }\n\n .tiptap-button.is-active {\n color: #6366f1;\n background: rgba(99, 102, 241, 0.1);\n }\n\n .tiptap-button.is-active::before {\n opacity: 0.15;\n }\n\n .tiptap-button.is-active:hover {\n background: rgba(99, 102, 241, 0.15);\n }\n\n .tiptap-button:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n pointer-events: none;\n }\n\n .tiptap-button:disabled:hover {\n transform: none;\n color: #64748b;\n }\n\n .tiptap-button:disabled::before {\n opacity: 0;\n }\n\n /* Icônes Material Symbols */\n .tiptap-button .material-symbols-outlined {\n font-size: 20px;\n position: relative;\n z-index: 1;\n }\n\n .tiptap-button .material-symbols-outlined.icon-small {\n font-size: 16px;\n }\n\n .tiptap-button .material-symbols-outlined.icon-medium {\n font-size: 20px;\n }\n\n .tiptap-button .material-symbols-outlined.icon-large {\n font-size: 24px;\n }\n\n /* Boutons avec texte */\n .tiptap-button.text-button {\n width: auto;\n padding: 0 12px;\n font-size: 14px;\n font-weight: 500;\n }\n\n /* Boutons de couleur */\n .tiptap-button.color-button {\n width: 28px;\n height: 28px;\n border-radius: 50%;\n border: 2px solid transparent;\n transition: all 0.2s ease;\n }\n\n .tiptap-button.color-button:hover {\n border-color: #e2e8f0;\n transform: scale(1.1);\n }\n\n .tiptap-button.color-button.is-active {\n border-color: #6366f1;\n box-shadow: 0 0 0 2px rgba(99, 102, 241, 0.2);\n }\n\n /* Boutons avec variantes */\n .tiptap-button.primary {\n background: linear-gradient(135deg, #6366f1, #8b5cf6);\n color: white;\n }\n\n .tiptap-button.primary:hover {\n background: linear-gradient(135deg, #5b21b6, #7c3aed);\n color: white;\n }\n\n .tiptap-button.secondary {\n background: #f1f5f9;\n color: #64748b;\n }\n\n .tiptap-button.secondary:hover {\n background: #e2e8f0;\n color: #475569;\n }\n\n .tiptap-button.danger {\n color: #ef4444;\n }\n\n .tiptap-button.danger:hover {\n color: #dc2626;\n background: rgba(239, 68, 68, 0.1);\n }\n\n .tiptap-button.danger::before {\n background: linear-gradient(135deg, #ef4444, #dc2626);\n }\n\n /* Boutons de taille différente */\n .tiptap-button.small {\n width: 24px;\n height: 24px;\n }\n\n .tiptap-button.medium {\n width: 32px;\n height: 32px;\n }\n\n .tiptap-button.large {\n width: 40px;\n height: 40px;\n }\n\n /* Boutons avec badge */\n .tiptap-button.has-badge {\n position: relative;\n }\n\n .tiptap-button .badge {\n position: absolute;\n top: -4px;\n right: -4px;\n background: #ef4444;\n color: white;\n font-size: 10px;\n padding: 2px 4px;\n border-radius: 8px;\n min-width: 16px;\n text-align: center;\n line-height: 1;\n }\n\n /* Boutons avec tooltip */\n .tiptap-button.has-tooltip {\n position: relative;\n }\n\n .tiptap-button .tooltip {\n position: absolute;\n bottom: -30px;\n left: 50%;\n transform: translateX(-50%);\n background: rgba(0, 0, 0, 0.8);\n color: white;\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 12px;\n white-space: nowrap;\n opacity: 0;\n visibility: hidden;\n transition: all 0.2s ease;\n z-index: 1000;\n }\n\n .tiptap-button:hover .tooltip {\n opacity: 1;\n visibility: visible;\n }\n\n /* Animation de pulsation pour les boutons actifs */\n @keyframes pulse {\n 0%,\n 100% {\n box-shadow: 0 0 0 0 rgba(99, 102, 241, 0.4);\n }\n 50% {\n box-shadow: 0 0 0 4px rgba(99, 102, 241, 0);\n }\n }\n\n .tiptap-button.is-active.pulse {\n animation: pulse 2s infinite;\n }\n\n /* Responsive */\n @media (max-width: 768px) {\n .tiptap-button {\n width: 32px;\n height: 32px;\n }\n\n .tiptap-button .material-symbols-outlined {\n font-size: 18px;\n }\n\n .tiptap-button.text-button {\n padding: 0 8px;\n font-size: 13px;\n }\n }\n `,\n ],\n})\nexport class TiptapButtonComponent {\n // Inputs\n icon = input.required<string>();\n title = input.required<string>();\n active = input(false);\n disabled = input(false);\n variant = input<\"default\" | \"text\" | \"danger\">(\"default\");\n size = input<\"small\" | \"medium\" | \"large\">(\"medium\");\n iconSize = input<\"small\" | \"medium\" | \"large\">(\"medium\");\n\n // Outputs\n onClick = output<Event>();\n\n onMouseDown(event: MouseEvent) {\n event.preventDefault();\n }\n}\n","import { Component, input } 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\";\nimport { Editor } from \"@tiptap/core\";\n\nexport interface ImageData {\n src: string;\n alt?: string;\n title?: string;\n width?: number;\n height?: number;\n}\n\nexport interface ImageUploadResult {\n src: string;\n name: string;\n size: number;\n type: string;\n width?: number;\n height?: number;\n originalSize?: number;\n}\n\nexport interface ResizeOptions {\n width?: number;\n height?: number;\n maintainAspectRatio?: boolean;\n}\n\n@Injectable({\n providedIn: \"root\",\n})\nexport class ImageService {\n // Signals pour l'état des images\n selectedImage = signal<ImageData | null>(null);\n isImageSelected = computed(() => this.selectedImage() !== null);\n isResizing = signal(false);\n\n // Signaux pour l'upload\n isUploading = signal(false);\n uploadProgress = signal(0);\n uploadMessage = signal(\"\");\n\n // Référence à l'éditeur pour les mises à jour\n private currentEditor: Editor | null = null;\n\n // Méthodes pour la gestion des images\n selectImage(editor: Editor): void {\n if (editor.isActive(\"resizableImage\")) {\n const attrs = editor.getAttributes(\"resizableImage\");\n this.selectedImage.set({\n src: attrs[\"src\"],\n alt: attrs[\"alt\"],\n title: attrs[\"title\"],\n width: attrs[\"width\"],\n height: attrs[\"height\"],\n });\n } else {\n this.selectedImage.set(null);\n }\n }\n\n clearSelection(): void {\n this.selectedImage.set(null);\n }\n\n // Méthodes pour manipuler les images\n insertImage(editor: Editor, imageData: ImageData): void {\n editor.chain().focus().setResizableImage(imageData).run();\n }\n\n updateImageAttributes(editor: Editor, attributes: Partial<ImageData>): void {\n if (editor.isActive(\"resizableImage\")) {\n editor\n .chain()\n .focus()\n .updateAttributes(\"resizableImage\", attributes)\n .run();\n this.updateSelectedImage(attributes);\n }\n }\n\n // Nouvelles méthodes pour le redimensionnement\n resizeImage(editor: Editor, options: ResizeOptions): void {\n if (!editor.isActive(\"resizableImage\")) return;\n\n const currentAttrs = editor.getAttributes(\"resizableImage\");\n let newWidth = options.width;\n let newHeight = options.height;\n\n // Maintenir le ratio d'aspect si demandé\n if (\n options.maintainAspectRatio !== false &&\n currentAttrs[\"width\"] &&\n currentAttrs[\"height\"]\n ) {\n const aspectRatio = currentAttrs[\"width\"] / currentAttrs[\"height\"];\n\n if (newWidth && !newHeight) {\n newHeight = Math.round(newWidth / aspectRatio);\n } else if (newHeight && !newWidth) {\n newWidth = Math.round(newHeight * aspectRatio);\n }\n }\n\n // Appliquer des limites minimales\n if (newWidth) newWidth = Math.max(50, newWidth);\n if (newHeight) newHeight = Math.max(50, newHeight);\n\n this.updateImageAttributes(editor, {\n width: newWidth,\n height: newHeight,\n });\n }\n\n // Méthodes pour redimensionner par pourcentage\n resizeImageByPercentage(editor: Editor, percentage: number): void {\n if (!editor.isActive(\"resizableImage\")) return;\n\n const currentAttrs = editor.getAttributes(\"resizableImage\");\n if (!currentAttrs[\"width\"] || !currentAttrs[\"height\"]) return;\n\n const newWidth = Math.round(currentAttrs[\"width\"] * (percentage / 100));\n const newHeight = Math.round(currentAttrs[\"height\"] * (percentage / 100));\n\n this.resizeImage(editor, { width: newWidth, height: newHeight });\n }\n\n // Méthodes pour redimensionner à des tailles prédéfinies\n resizeImageToSmall(editor: Editor): void {\n this.resizeImage(editor, {\n width: 300,\n height: 200,\n maintainAspectRatio: true,\n });\n }\n\n resizeImageToMedium(editor: Editor): void {\n this.resizeImage(editor, {\n width: 500,\n height: 350,\n maintainAspectRatio: true,\n });\n }\n\n resizeImageToLarge(editor: Editor): void {\n this.resizeImage(editor, {\n width: 800,\n height: 600,\n maintainAspectRatio: true,\n });\n }\n\n resizeImageToOriginal(editor: Editor): void {\n if (!editor.isActive(\"resizableImage\")) return;\n\n const img = new Image();\n img.onload = () => {\n this.resizeImage(editor, {\n width: img.naturalWidth,\n height: img.naturalHeight,\n });\n };\n img.src = editor.getAttributes(\"resizableImage\")[\"src\"];\n }\n\n // Méthode pour redimensionner librement (sans maintenir le ratio)\n resizeImageFreely(editor: Editor, width: number, height: number): void {\n this.resizeImage(editor, {\n width,\n height,\n maintainAspectRatio: false,\n });\n }\n\n // Méthode pour obtenir les dimensions actuelles de l'image\n getImageDimensions(editor: Editor): { width: number; height: number } | null {\n if (!editor.isActive(\"resizableImage\")) return null;\n\n const attrs = editor.getAttributes(\"resizableImage\");\n return {\n width: attrs[\"width\"] || 0,\n height: attrs[\"height\"] || 0,\n };\n }\n\n // Méthode pour obtenir les dimensions naturelles de l'image\n getNaturalImageDimensions(\n src: string\n ): Promise<{ width: number; height: number }> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => {\n resolve({ width: img.naturalWidth, height: img.naturalHeight });\n };\n img.onerror = () => {\n reject(new Error(\"Impossible de charger l'image\"));\n };\n img.src = src;\n });\n }\n\n deleteImage(editor: Editor): void {\n if (editor.isActive(\"resizableImage\")) {\n editor.chain().focus().deleteSelection().run();\n this.clearSelection();\n }\n }\n\n // Méthodes utilitaires\n private updateSelectedImage(attributes: Partial<ImageData>): void {\n const current = this.selectedImage();\n if (current) {\n this.selectedImage.set({ ...current, ...attributes });\n }\n }\n\n // Validation des images\n validateImage(\n file: File,\n maxSize: number = 5 * 1024 * 1024\n ): { valid: boolean; error?: string } {\n if (!file.type.startsWith(\"image/\")) {\n return { valid: false, error: \"Le fichier doit être une image\" };\n }\n\n if (file.size > maxSize) {\n return {\n valid: false,\n error: `L'image est trop volumineuse (max ${maxSize / 1024 / 1024}MB)`,\n };\n }\n\n return { valid: true };\n }\n\n // Compression d'image\n async compressImage(\n file: File,\n quality: number = 0.8,\n maxWidth: number = 1920,\n maxHeight: number = 1080\n ): Promise<ImageUploadResult> {\n return new Promise((resolve, reject) => {\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n const img = new Image();\n\n img.onload = () => {\n // Mise à jour du progrès\n if (this.isUploading()) {\n this.uploadProgress.set(40);\n this.uploadMessage.set(\"Redimensionnement...\");\n this.forceEditorUpdate();\n }\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 // Mise à jour du progrès\n if (this.isUploading()) {\n this.uploadProgress.set(60);\n this.uploadMessage.set(\"Compression...\");\n this.forceEditorUpdate();\n }\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 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: file.size,\n };\n resolve(result);\n } else {\n reject(new Error(\"Erreur lors de la compression\"));\n }\n };\n reader.readAsDataURL(blob);\n } else {\n reject(new Error(\"Erreur lors de la compression\"));\n }\n },\n file.type,\n quality\n );\n };\n\n img.onerror = () =>\n reject(new Error(\"Erreur lors du chargement de l'image\"));\n img.src = URL.createObjectURL(file);\n });\n }\n\n // Méthode privée générique pour uploader avec progression\n private async uploadImageWithProgress(\n editor: Editor,\n file: File,\n insertionStrategy: (editor: Editor, result: ImageUploadResult) => void,\n actionMessage: string,\n options?: {\n quality?: number;\n maxWidth?: number;\n maxHeight?: number;\n }\n ): Promise<void> {\n try {\n // Stocker la référence à l'éditeur\n this.currentEditor = editor;\n\n this.isUploading.set(true);\n this.uploadProgress.set(0);\n this.uploadMessage.set(\"Validation du fichier...\");\n this.forceEditorUpdate();\n\n // Validation\n const validation = this.validateImage(file);\n if (!validation.valid) {\n throw new Error(validation.error);\n }\n\n this.uploadProgress.set(20);\n this.uploadMessage.set(\"Compression en cours...\");\n this.forceEditorUpdate();\n\n // Petit délai pour permettre à l'utilisateur de voir la progression\n await new Promise((resolve) => setTimeout(resolve, 200));\n\n const result = await this.compressImage(\n file,\n options?.quality || 0.8,\n options?.maxWidth || 1920,\n options?.maxHeight || 1080\n );\n\n this.uploadProgress.set(80);\n this.uploadMessage.set(actionMessage);\n this.forceEditorUpdate();\n\n // Petit délai pour l'action\n await new Promise((resolve) => setTimeout(resolve, 100));\n\n // Exécuter la stratégie d'insertion\n insertionStrategy(editor, result);\n\n // L'action est terminée, maintenant on peut cacher l'indicateur\n this.isUploading.set(false);\n this.uploadProgress.set(0);\n this.uploadMessage.set(\"\");\n this.forceEditorUpdate();\n this.currentEditor = null;\n } catch (error) {\n this.isUploading.set(false);\n this.uploadProgress.set(0);\n this.uploadMessage.set(\"\");\n this.forceEditorUpdate();\n this.currentEditor = null;\n console.error(\"Erreur lors de l'upload d'image:\", error);\n throw error;\n }\n }\n\n // Méthode unifiée pour uploader et insérer une image\n async uploadAndInsertImage(\n editor: Editor,\n file: File,\n options?: {\n quality?: number;\n maxWidth?: number;\n maxHeight?: number;\n }\n ): Promise<void> {\n return this.uploadImageWithProgress(\n editor,\n file,\n (editor, result) => {\n this.insertImage(editor, {\n src: result.src,\n alt: result.name,\n title: `${result.name} (${result.width}×${result.height})`,\n width: result.width,\n height: result.height,\n });\n },\n \"Insertion dans l'éditeur...\",\n options\n );\n }\n\n // Méthode pour forcer la mise à jour de l'éditeur\n private forceEditorUpdate() {\n if (this.currentEditor) {\n // Déclencher une transaction vide pour forcer la mise à jour des décorations\n const { tr } = this.currentEditor.state;\n this.currentEditor.view.dispatch(tr);\n }\n }\n\n // Méthode privée générique pour créer un sélecteur de fichier\n private async selectFileAndProcess(\n editor: Editor,\n uploadMethod: (editor: Editor, file: File, options?: any) => Promise<void>,\n options?: {\n quality?: number;\n maxWidth?: number;\n maxHeight?: number;\n accept?: string;\n }\n ): Promise<void> {\n return new Promise((resolve, reject) => {\n const input = document.createElement(\"input\");\n input.type = \"file\";\n input.accept = options?.accept || \"image/*\";\n input.style.display = \"none\";\n\n input.addEventListener(\"change\", async (e) => {\n const file = (e.target as HTMLInputElement).files?.[0];\n if (file && file.type.startsWith(\"image/\")) {\n try {\n await uploadMethod(editor, file, options);\n resolve();\n } catch (error) {\n reject(error);\n }\n } else {\n reject(new Error(\"Aucun fichier image sélectionné\"));\n }\n document.body.removeChild(input);\n });\n\n input.addEventListener(\"cancel\", () => {\n document.body.removeChild(input);\n reject(new Error(\"Sélection annulée\"));\n });\n\n document.body.appendChild(input);\n input.click();\n });\n }\n\n // Méthode pour créer un sélecteur de fichier et uploader une image\n async selectAndUploadImage(\n editor: Editor,\n options?: {\n quality?: number;\n maxWidth?: number;\n maxHeight?: number;\n accept?: string;\n }\n ): Promise<void> {\n return this.selectFileAndProcess(\n editor,\n this.uploadAndInsertImage.bind(this),\n options\n );\n }\n\n // Méthode pour sélectionner et remplacer une image existante\n async selectAndReplaceImage(\n editor: Editor,\n options?: {\n quality?: number;\n maxWidth?: number;\n maxHeight?: number;\n accept?: string;\n }\n ): Promise<void> {\n return this.selectFileAndProcess(\n editor,\n this.uploadAndReplaceImage.bind(this),\n options\n );\n }\n\n // Méthode pour remplacer une image existante avec indicateur de progression\n async uploadAndReplaceImage(\n editor: Editor,\n file: File,\n options?: {\n quality?: number;\n maxWidth?: number;\n maxHeight?: number;\n }\n ): Promise<void> {\n // Sauvegarder les attributs de l'image actuelle pour restauration en cas d'échec\n const currentImageAttrs = editor.getAttributes(\"resizableImage\");\n const backupImage = { ...currentImageAttrs };\n\n try {\n // Supprimer visuellement l'ancienne image immédiatement\n editor.chain().focus().deleteSelection().run();\n\n // Stocker la référence à l'éditeur\n this.currentEditor = editor;\n\n this.isUploading.set(true);\n this.uploadProgress.set(0);\n this.uploadMessage.set(\"Validation du fichier...\");\n this.forceEditorUpdate();\n\n // Validation\n const validation = this.validateImage(file);\n if (!validation.valid) {\n throw new Error(validation.error);\n }\n\n this.uploadProgress.set(20);\n this.uploadMessage.set(\"Compression en cours...\");\n this.forceEditorUpdate();\n\n // Petit délai pour permettre à l'utilisateur de voir la progression\n await new Promise((resolve) => setTimeout(resolve, 200));\n\n const result = await this.compressImage(\n file,\n options?.quality || 0.8,\n options?.maxWidth || 1920,\n options?.maxHeight || 1080\n );\n\n this.uploadProgress.set(80);\n this.uploadMessage.set(\"Remplacement de l'image...\");\n this.forceEditorUpdate();\n\n // Petit délai pour le remplacement\n await new Promise((resolve) => setTimeout(resolve, 100));\n\n // Insérer la nouvelle image à la position actuelle\n this.insertImage(editor, {\n src: result.src,\n alt: result.name,\n title: `${result.name} (${result.width}×${result.height})`,\n width: result.width,\n height: result.height,\n });\n\n // L'image est remplacée, maintenant on peut cacher l'indicateur\n this.isUploading.set(false);\n this.uploadProgress.set(0);\n this.uploadMessage.set(\"\");\n this.forceEditorUpdate();\n this.currentEditor = null;\n } catch (error) {\n // En cas d'erreur, restaurer l'image originale\n if (backupImage[\"src\"]) {\n this.insertImage(editor, {\n src: backupImage[\"src\"] as string,\n alt: backupImage[\"alt\"] as string,\n title: backupImage[\"title\"] as string,\n width: backupImage[\"width\"] as number,\n height: backupImage[\"height\"] as number,\n });\n }\n\n this.isUploading.set(false);\n this.uploadProgress.set(0);\n this.uploadMessage.set(\"\");\n this.forceEditorUpdate();\n this.currentEditor = null;\n console.error(\"Erreur lors du remplacement d'image:\", error);\n throw error;\n }\n }\n}\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 undo: string;\r\n redo: 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 };\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 characters: string;\r\n words: 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 undo: \"Undo\",\r\n redo: \"Redo\",\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 },\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 characters: \"characters\",\r\n words: \"words\",\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 undo: \"Annuler\",\r\n redo: \"Refaire\",\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 },\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 characters: \"caractères\",\r\n words: \"mots\",\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 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\";\r\nimport { Editor } from \"@tiptap/core\";\r\n\r\n@Injectable({\r\n providedIn: \"root\",\r\n})\r\nexport class EditorCommandsService {\r\n // Méthodes pour vérifier l'état actif\r\n isActive(\r\n editor: Editor,\r\n name: string,\r\n attributes?: Record<string, any>\r\n ): boolean {\r\n return editor.isActive(name, attributes);\r\n }\r\n\r\n // Méthodes pour vérifier si une commande peut être exécutée\r\n canExecute(editor: Editor, command: string): boolean {\r\n if (!editor) return false;\r\n\r\n switch (command) {\r\n case \"toggleBold\":\r\n return editor.can().chain().focus().toggleBold().run();\r\n case \"toggleItalic\":\r\n return editor.can().chain().focus().toggleItalic().run();\r\n case \"toggleStrike\":\r\n return editor.can().chain().focus().toggleStrike().run();\r\n case \"toggleCode\":\r\n return editor.can().chain().focus().toggleCode().run();\r\n case \"toggleUnderline\":\r\n return editor.can().chain().focus().toggleUnderline().run();\r\n case \"toggleSuperscript\":\r\n return editor.can().chain().focus().toggleSuperscript().run();\r\n case \"toggleSubscript\":\r\n return editor.can().chain().focus().toggleSubscript().run();\r\n case \"setTextAlign\":\r\n return editor.can().chain().focus().setTextAlign(\"left\").run();\r\n case \"toggleLink\":\r\n return editor.can().chain().focus().toggleLink({ href: \"\" }).run();\r\n case \"insertHorizontalRule\":\r\n return editor.can().chain().focus().setHorizontalRule().run();\r\n case \"toggleHighlight\":\r\n return editor.can().chain().focus().toggleHighlight().run();\r\n case \"undo\":\r\n return editor.can().chain().focus().undo().run();\r\n case \"redo\":\r\n return editor.can().chain().focus().redo().run();\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n // Méthodes pour exécuter les commandes\r\n toggleBold(editor: Editor): void {\r\n editor.chain().focus().toggleBold().run();\r\n }\r\n\r\n toggleItalic(editor: Editor): void {\r\n editor.chain().focus().toggleItalic().run();\r\n }\r\n\r\n toggleStrike(editor: Editor): void {\r\n editor.chain().focus().toggleStrike().run();\r\n }\r\n\r\n toggleCode(editor: Editor): void {\r\n editor.chain().focus().toggleCode().run();\r\n }\r\n\r\n toggleHeading(editor: Editor, level: 1 | 2 | 3): void {\r\n editor.chain().focus().toggleHeading({ level }).run();\r\n }\r\n\r\n toggleBulletList(editor: Editor): void {\r\n editor.chain().focus().toggleBulletList().run();\r\n }\r\n\r\n toggleOrderedList(editor: Editor): void {\r\n editor.chain().focus().toggleOrderedList().run();\r\n }\r\n\r\n toggleBlockquote(editor: Editor): void {\r\n editor.chain().focus().toggleBlockquote().run();\r\n }\r\n\r\n undo(editor: Editor): void {\r\n editor.chain().focus().undo().run();\r\n }\r\n\r\n redo(editor: Editor): void {\r\n editor.chain().focus().redo().run();\r\n }\r\n\r\n // Nouvelles méthodes pour les formatages supplémentaires\r\n toggleUnderline(editor: Editor): void {\r\n editor.chain().focus().toggleUnderline().run();\r\n }\r\n\r\n toggleSuperscript(editor: Editor): void {\r\n editor.chain().focus().toggleSuperscript().run();\r\n }\r\n\r\n toggleSubscript(editor: Editor): void {\r\n editor.chain().focus().toggleSubscript().run();\r\n }\r\n\r\n setTextAlign(\r\n editor: Editor,\r\n alignment: \"left\" | \"center\" | \"right\" | \"justify\"\r\n ): void {\r\n editor.chain().focus().setTextAlign(alignment).run();\r\n }\r\n\r\n toggleLink(editor: Editor, url?: string): void {\r\n if (url) {\r\n editor.chain().focus().toggleLink({ href: url }).run();\r\n } else {\r\n // Si pas d'URL fournie, on demande à l'utilisateur\r\n const href = window.prompt(\"URL du lien:\");\r\n if (href) {\r\n editor.chain().focus().toggleLink({ href }).run();\r\n }\r\n }\r\n }\r\n\r\n insertHorizontalRule(editor: Editor): void {\r\n editor.chain().focus().setHorizontalRule().run();\r\n }\r\n\r\n toggleHighlight(editor: Editor, color?: string): void {\r\n if (color) {\r\n editor.chain().focus().toggleHighlight({ color }).run();\r\n } else {\r\n editor.chain().focus().toggleHighlight().run();\r\n }\r\n }\r\n}\r\n","import { Component, input, output, signal, inject } from \"@angular/core\";\nimport { Editor } from \"@tiptap/core\";\nimport { TiptapButtonComponent } from \"./tiptap-button.component\";\nimport { TiptapSeparatorComponent } from \"./tiptap-separator.component\";\nimport { ImageUploadResult, ImageService } from \"./services/image.service\";\nimport { EditorCommandsService } from \"./services/editor-commands.service\";\nimport { TiptapI18nService } from \"./services/i18n.service\";\n\nexport interface ToolbarConfig {\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 heading1?: boolean;\n heading2?: boolean;\n heading3?: boolean;\n bulletList?: boolean;\n orderedList?: boolean;\n blockquote?: boolean;\n alignLeft?: boolean;\n alignCenter?: boolean;\n alignRight?: boolean;\n alignJustify?: boolean;\n link?: boolean;\n image?: boolean;\n horizontalRule?: boolean;\n undo?: boolean;\n redo?: boolean;\n separator?: boolean;\n}\n\n@Component({\n selector: \"tiptap-toolbar\",\n standalone: true,\n imports: [TiptapButtonComponent, TiptapSeparatorComponent],\n template: `\n <div class=\"tiptap-toolbar\">\n @if (config().bold) {\n <tiptap-button\n icon=\"format_bold\"\n [title]=\"t().bold\"\n [active]=\"isActive('bold')\"\n [disabled]=\"!canExecute('toggleBold')\"\n (onClick)=\"toggleBold()\"\n />\n } @if (config().italic) {\n <tiptap-button\n icon=\"format_italic\"\n [title]=\"t().italic\"\n [active]=\"isActive('italic')\"\n [disabled]=\"!canExecute('toggleItalic')\"\n (onClick)=\"toggleItalic()\"\n />\n } @if (config().underline) {\n <tiptap-button\n icon=\"format_underlined\"\n [title]=\"t().underline\"\n [active]=\"isActive('underline')\"\n [disabled]=\"!canExecute('toggleUnderline')\"\n (onClick)=\"toggleUnderline()\"\n />\n } @if (config().strike) {\n <tiptap-button\n icon=\"strikethrough_s\"\n [title]=\"t().strike\"\n [active]=\"isActive('strike')\"\n [disabled]=\"!canExecute('toggleStrike')\"\n (onClick)=\"toggleStrike()\"\n />\n } @if (config().code) {\n <tiptap-button\n icon=\"code\"\n [title]=\"t().code\"\n [active]=\"isActive('code')\"\n [disabled]=\"!canExecute('toggleCode')\"\n (onClick)=\"toggleCode()\"\n />\n } @if (config().superscript) {\n <tiptap-button\n icon=\"superscript\"\n [title]=\"t().superscript\"\n [active]=\"isActive('superscript')\"\n [disabled]=\"!canExecute('toggleSuperscript')\"\n (onClick)=\"toggleSuperscript()\"\n />\n } @if (config().subscript) {\n <tiptap-button\n icon=\"subscript\"\n [title]=\"t().subscript\"\n [active]=\"isActive('subscript')\"\n [disabled]=\"!canExecute('toggleSubscript')\"\n (onClick)=\"toggleSubscript()\"\n />\n } @if (config().highlight) {\n <tiptap-button\n icon=\"highlight\"\n [title]=\"t().highlight\"\n [active]=\"isActive('highlight')\"\n [disabled]=\"!canExecute('toggleHighlight')\"\n (onClick)=\"toggleHighlight()\"\n />\n } @if (config().separator && (config().heading1 || config().heading2 ||\n config().heading3)) {\n <tiptap-separator />\n } @if (config().heading1) {\n <tiptap-button\n icon=\"format_h1\"\n [title]=\"t().heading1\"\n variant=\"text\"\n [active]=\"isActive('heading', { level: 1 })\"\n (onClick)=\"toggleHeading(1)\"\n />\n } @if (config().heading2) {\n <tiptap-button\n icon=\"format_h2\"\n [title]=\"t().heading2\"\n variant=\"text\"\n [active]=\"isActive('heading', { level: 2 })\"\n (onClick)=\"toggleHeading(2)\"\n />\n } @if (config().heading3) {\n <tiptap-button\n icon=\"format_h3\"\n [title]=\"t().heading3\"\n variant=\"text\"\n [active]=\"isActive('heading', { level: 3 })\"\n (onClick)=\"toggleHeading(3)\"\n />\n } @if (config().separator && (config().bulletList || config().orderedList\n || config().blockquote)) {\n <tiptap-separator />\n } @if (config().bulletList) {\n <tiptap-button\n icon=\"format_list_bulleted\"\n [title]=\"t().bulletList\"\n [active]=\"isActive('bulletList')\"\n (onClick)=\"toggleBulletList()\"\n />\n } @if (config().orderedList) {\n <tiptap-button\n icon=\"format_list_numbered\"\n [title]=\"t().orderedList\"\n [active]=\"isActive('orderedList')\"\n (onClick)=\"toggleOrderedList()\"\n />\n } @if (config().blockquote) {\n <tiptap-button\n icon=\"format_quote\"\n [title]=\"t().blockquote\"\n [active]=\"isActive('blockquote')\"\n (onClick)=\"toggleBlockquote()\"\n />\n } @if (config().separator && (config().alignLeft || config().alignCenter\n || config().alignRight || config().alignJustify)) {\n <tiptap-separator />\n } @if (config().alignLeft) {\n <tiptap-button\n icon=\"format_align_left\"\n [title]=\"t().alignLeft\"\n [active]=\"isActive('textAlign', { textAlign: 'left' })\"\n (onClick)=\"setTextAlign('left')\"\n />\n } @if (config().alignCenter) {\n <tiptap-button\n icon=\"format_align_center\"\n [title]=\"t().alignCenter\"\n [active]=\"isActive('textAlign', { textAlign: 'center' })\"\n (onClick)=\"setTextAlign('center')\"\n />\n } @if (config().alignRight) {\n <tiptap-button\n icon=\"format_align_right\"\n [title]=\"t().alignRight\"\n [active]=\"isActive('textAlign', { textAlign: 'right' })\"\n (onClick)=\"setTextAlign('right')\"\n />\n } @if (config().alignJustify) {\n <tiptap-button\n icon=\"format_align_justify\"\n [title]=\"t().alignJustify\"\n [active]=\"isActive('textAlign', { textAlign: 'justify' })\"\n (onClick)=\"setTextAlign('justify')\"\n />\n } @if (config().separator && (config().link || config().horizontalRule)) {\n <tiptap-separator />\n } @if (config().link) {\n <tiptap-button\n icon=\"link\"\n [title]=\"t().link\"\n [active]=\"isActive('link')\"\n (onClick)=\"toggleLink()\"\n />\n } @if (config().horizontalRule) {\n <tiptap-button\n icon=\"horizontal_rule\"\n [title]=\"t().horizontalRule\"\n (onClick)=\"insertHorizontalRule()\"\n />\n } @if (config().separator && config().image) {\n <tiptap-separator />\n } @if (config().image) {\n <tiptap-button\n icon=\"image\"\n [title]=\"t().image\"\n (onClick)=\"insertImage()\"\n />\n } @if (config().separator && (config().undo || config().redo)) {\n <tiptap-separator />\n } @if (config().undo) {\n <tiptap-button\n icon=\"undo\"\n [title]=\"t().undo\"\n [disabled]=\"!canExecute('undo')\"\n (onClick)=\"undo()\"\n />\n } @if (config().redo) {\n <tiptap-button\n icon=\"redo\"\n [title]=\"t().redo\"\n [disabled]=\"!canExecute('redo')\"\n (onClick)=\"redo()\"\n />\n }\n </div>\n `,\n styles: [\n `\n /* Styles de base pour la toolbar */\n .tiptap-toolbar {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 4px 8px;\n background: #f8f9fa;\n border-bottom: 1px solid #e2e8f0;\n flex-wrap: wrap;\n min-height: 32px;\n position: relative;\n }\n\n /* Groupe de boutons */\n .toolbar-group {\n display: flex;\n align-items: center;\n gap: 2px;\n padding: 0 4px;\n }\n\n /* Séparateur entre groupes */\n .toolbar-separator {\n width: 1px;\n height: 24px;\n background: #e2e8f0;\n margin: 0 4px;\n }\n\n /* Responsive */\n @media (max-width: 768px) {\n .tiptap-toolbar {\n padding: 6px 8px;\n gap: 2px;\n }\n\n .toolbar-group {\n gap: 1px;\n }\n }\n\n /* Animation d'apparition */\n @keyframes toolbarSlideIn {\n from {\n opacity: 0;\n transform: translateY(-10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n\n .tiptap-toolbar {\n animation: toolbarSlideIn 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n `,\n ],\n})\nexport class TiptapToolbarComponent {\n editor = input.required<Editor>();\n config = input.required<ToolbarConfig>();\n\n // Outputs pour les événements d'image\n imageUploaded = output<ImageUploadResult>();\n imageError = output<string>();\n\n private imageService = inject(ImageService);\n private i18nService = inject(TiptapI18nService);\n\n // Computed values pour les traductions\n readonly t = this.i18nService.toolbar;\n\n constructor(private editorCommands: EditorCommandsService) {}\n\n isActive(name: string, attributes?: Record<string, any>): boolean {\n return this.editorCommands.isActive(this.editor(), name, attributes);\n }\n\n canExecute(command: string): boolean {\n return this.editorCommands.canExecute(this.editor(), command);\n }\n\n toggleBold() {\n this.editorCommands.toggleBold(this.editor());\n }\n toggleItalic() {\n this.editorCommands.toggleItalic(this.editor());\n }\n toggleStrike() {\n this.editorCommands.toggleStrike(this.editor());\n }\n toggleCode() {\n this.editorCommands.toggleCode(this.editor());\n }\n toggleHeading(level: 1 | 2 | 3) {\n this.editorCommands.toggleHeading(this.editor(), level);\n }\n toggleBulletList() {\n this.editorCommands.toggleBulletList(this.editor());\n }\n toggleOrderedList() {\n this.editorCommands.toggleOrderedList(this.editor());\n }\n toggleBlockquote() {\n this.editorCommands.toggleBlockquote(this.editor());\n }\n undo() {\n this.editorCommands.undo(this.editor());\n }\n redo() {\n this.editorCommands.redo(this.editor());\n }\n\n // Nouvelles méthodes pour les formatages supplémentaires\n toggleUnderline() {\n this.editorCommands.toggleUnderline(this.editor());\n }\n toggleSuperscript() {\n this.editorCommands.toggleSuperscript(this.editor());\n }\n toggleSubscript() {\n this.editorCommands.toggleSubscript(this.editor());\n }\n setTextAlign(alignment: \"left\" | \"center\" | \"right\" | \"justify\") {\n this.editorCommands.setTextAlign(this.editor(), alignment);\n }\n toggleLink() {\n this.editorCommands.toggleLink(this.editor());\n }\n insertHorizontalRule() {\n this.editorCommands.insertHorizontalRule(this.editor());\n }\n toggleHighlight() {\n this.editorCommands.toggleHighlight(this.editor());\n }\n\n // Méthode pour insérer une image\n async insertImage() {\n try {\n await this.imageService.selectAndUploadImage(this.editor());\n } catch (error) {\n console.error(\"Erreur lors de l'upload d'image:\", error);\n this.imageError.emit(\"Erreur lors de l'upload d'image\");\n }\n }\n\n // Méthodes pour les événements d'image (conservées pour compatibilité)\n onImageSelected(result: ImageUploadResult) {\n this.imageUploaded.emit(result);\n }\n\n onImageError(error: string) {\n this.imageError.emit(error);\n }\n}\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 {\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 { 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 { from, to } = ed.state.selection;\n const hasTextSelection = from !== to;\n const isImageSelected =\n ed.isActive(\"image\") || ed.isActive(\"resizableImage\");\n\n // Ne montrer le menu texte que si :\n // - Il y a une sélection de texte\n // - Aucune image n'est sélectionnée (priorité aux images)\n // - L'éditeur est éditable\n const shouldShow = hasTextSelection && !isImageSelected && 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 private 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 {\n Component,\n input,\n ViewChild,\n ElementRef,\n OnInit,\n OnDestroy,\n computed,\n inject,\n effect,\n} from \"@angular/core\";\nimport tippy, { Instance as TippyInstance } from \"tippy.js\";\nimport type { Editor } from \"@tiptap/core\";\nimport { TiptapButtonComponent } from \"./tiptap-button.component\";\nimport { TiptapSeparatorComponent } from \"./tiptap-separator.component\";\nimport { ImageService } from \"./services/image.service\";\nimport { ImageBubbleMenuConfig } from \"./models/bubble-menu.model\";\n\n@Component({\n selector: \"tiptap-image-bubble-menu\",\n standalone: true,\n imports: [TiptapButtonComponent, TiptapSeparatorComponent],\n template: `\n <div #menuRef class=\"bubble-menu\">\n @if (imageBubbleMenuConfig().changeImage) {\n <tiptap-button\n icon=\"drive_file_rename_outline\"\n title=\"Changer l'image\"\n (click)=\"onCommand('changeImage', $event)\"\n ></tiptap-button>\n } @if (imageBubbleMenuConfig().separator && hasResizeButtons()) {\n <tiptap-separator></tiptap-separator>\n } @if (imageBubbleMenuConfig().resizeSmall) {\n <tiptap-button\n icon=\"crop_square\"\n iconSize=\"small\"\n title=\"Petite (300×200)\"\n (click)=\"onCommand('resizeSmall', $event)\"\n ></tiptap-button>\n } @if (imageBubbleMenuConfig().resizeMedium) {\n <tiptap-button\n icon=\"crop_square\"\n iconSize=\"medium\"\n title=\"Moyenne (500×350)\"\n (click)=\"onCommand('resizeMedium', $event)\"\n ></tiptap-button>\n } @if (imageBubbleMenuConfig().resizeLarge) {\n <tiptap-button\n icon=\"crop_square\"\n iconSize=\"large\"\n title=\"Grande (800×600)\"\n (click)=\"onCommand('resizeLarge', $event)\"\n ></tiptap-button>\n } @if (imageBubbleMenuConfig().resizeOriginal) {\n <tiptap-button\n icon=\"photo_size_select_actual\"\n title=\"Taille originale\"\n (click)=\"onCommand('resizeOriginal', $event)\"\n ></tiptap-button>\n } @if (imageBubbleMenuConfig().separator &&\n imageBubbleMenuConfig().deleteImage) {\n <tiptap-separator></tiptap-separator>\n } @if (imageBubbleMenuConfig().deleteImage) {\n <tiptap-button\n icon=\"delete\"\n title=\"Supprimer l'image\"\n variant=\"danger\"\n (click)=\"onCommand('deleteImage', $event)\"\n ></tiptap-button>\n }\n </div>\n `,\n styles: [],\n})\nexport class TiptapImageBubbleMenuComponent implements OnInit, OnDestroy {\n editor = input.required<Editor>();\n config = input<ImageBubbleMenuConfig>({\n changeImage: true,\n resizeSmall: true,\n resizeMedium: true,\n resizeLarge: true,\n resizeOriginal: true,\n deleteImage: true,\n separator: true,\n });\n\n @ViewChild(\"menuRef\", { static: false }) menuRef!: ElementRef<HTMLDivElement>;\n\n private tippyInstance: TippyInstance | null = null;\n private imageService = inject(ImageService);\n private updateTimeout: any = null;\n\n imageBubbleMenuConfig = computed(() => ({\n changeImage: true,\n resizeSmall: true,\n resizeMedium: true,\n resizeLarge: true,\n resizeOriginal: true,\n deleteImage: true,\n separator: true,\n ...this.config(),\n }));\n\n hasResizeButtons = computed(() => {\n const config = this.imageBubbleMenuConfig();\n return (\n config.resizeSmall ||\n config.resizeMedium ||\n config.resizeLarge ||\n config.resizeOriginal\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 // 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.getImageRect(),\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 getImageRect(): DOMRect {\n const ed = this.editor();\n if (!ed) return new DOMRect(0, 0, 0, 0);\n\n // Trouver l'image sélectionnée dans le DOM\n const { from } = ed.state.selection;\n\n // Fonction pour trouver toutes les images dans l'éditeur\n const getAllImages = (): HTMLImageElement[] => {\n const editorElement = ed.view.dom;\n return Array.from(editorElement.querySelectorAll(\"img\"));\n };\n\n // Fonction pour trouver l'image à la position spécifique\n const findImageAtPosition = (): HTMLImageElement | null => {\n const allImages = getAllImages();\n\n for (const img of allImages) {\n try {\n // Obtenir la position ProseMirror de cette image\n const imgPos = ed.view.posAtDOM(img, 0);\n // Vérifier si cette image correspond à la position sélectionnée\n if (Math.abs(imgPos - from) <= 1) {\n return img;\n }\n } catch (error) {\n // Continuer si on ne peut pas obtenir la position de cette image\n continue;\n }\n }\n\n return null;\n };\n\n // Chercher l'image à la position exacte\n const imageElement = findImageAtPosition();\n\n if (imageElement) {\n return imageElement.getBoundingClientRect();\n }\n\n return new DOMRect(0, 0, 0, 0);\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 isImageSelected =\n ed.isActive(\"resizableImage\") || ed.isActive(\"image\");\n const { from, to } = ed.state.selection;\n const hasTextSelection = from !== to;\n\n // Ne montrer le menu image que si :\n // - Une image est sélectionnée\n // - L'éditeur est éditable\n const shouldShow = isImageSelected && 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.getImageRect(),\n });\n\n this.tippyInstance.show();\n }\n\n private hideTippy() {\n if (this.tippyInstance) {\n this.tippyInstance.hide();\n }\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 \"changeImage\":\n this.changeImage();\n break;\n case \"resizeSmall\":\n this.imageService.resizeImageToSmall(ed);\n break;\n case \"resizeMedium\":\n this.imageService.resizeImageToMedium(ed);\n break;\n case \"resizeLarge\":\n this.imageService.resizeImageToLarge(ed);\n break;\n case \"resizeOriginal\":\n this.imageService.resizeImageToOriginal(ed);\n break;\n case \"deleteImage\":\n this.deleteImage();\n break;\n }\n }\n\n private async changeImage() {\n const ed = this.editor();\n if (!ed) return;\n\n try {\n // Utiliser la méthode spécifique pour remplacer une image existante\n await this.imageService.selectAndReplaceImage(ed, {\n quality: 0.8,\n maxWidth: 1920,\n maxHeight: 1080,\n accept: \"image/*\",\n });\n } catch (error) {\n console.error(\"Erreur lors du changement d'image:\", error);\n }\n }\n\n private deleteImage() {\n const ed = this.editor();\n if (ed) {\n ed.chain().focus().deleteSelection().run();\n }\n }\n}\n","import {\n Component,\n input,\n 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","import {\n Component,\n ElementRef,\n input,\n output,\n OnInit,\n OnDestroy,\n viewChild,\n forwardRef,\n effect,\n signal,\n computed,\n AfterViewInit,\n inject,\n} from \"@angular/core\";\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from \"@angular/forms\";\nimport { Editor, Extension, Node, Mark } from \"@tiptap/core\";\nimport StarterKit from \"@tiptap/starter-kit\";\nimport Placeholder from \"@tiptap/extension-placeholder\";\nimport CharacterCount from \"@tiptap/extension-character-count\";\nimport Underline from \"@tiptap/extension-underline\";\nimport Superscript from \"@tiptap/extension-superscript\";\nimport Subscript from \"@tiptap/extension-subscript\";\nimport TextAlign from \"@tiptap/extension-text-align\";\nimport Link from \"@tiptap/extension-link\";\nimport Highlight from \"@tiptap/extension-highlight\";\nimport OfficePaste from \"@intevation/tiptap-extension-office-paste\";\n\nimport { ResizableImage } from \"./extensions/resizable-image.extension\";\nimport { UploadProgress } from \"./extensions/upload-progress.extension\";\nimport { TiptapToolbarComponent } from \"./toolbar.component\";\nimport { TiptapImageUploadComponent } from \"./tiptap-image-upload.component\";\nimport { TiptapBubbleMenuComponent } from \"./tiptap-bubble-menu.component\";\nimport { TiptapImageBubbleMenuComponent } from \"./tiptap-image-bubble-menu.component\";\nimport {\n TiptapSlashCommandsComponent,\n SlashCommandsConfig,\n} from \"./tiptap-slash-commands.component\";\nimport { ImageService } from \"./services/image.service\";\nimport { TiptapI18nService, SupportedLocale } from \"./services/i18n.service\";\n\nimport { ImageUploadResult } from \"./services/image.service\";\nimport { ToolbarConfig } from \"./toolbar.component\";\nimport {\n BubbleMenuConfig,\n ImageBubbleMenuConfig,\n} from \"./models/bubble-menu.model\";\n\n// Configuration par défaut de la toolbar\nexport const DEFAULT_TOOLBAR_CONFIG: ToolbarConfig = {\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 heading1: true,\n heading2: true,\n heading3: true,\n bulletList: true,\n orderedList: true,\n blockquote: true,\n alignLeft: false,\n alignCenter: false,\n alignRight: false,\n alignJustify: false,\n link: true,\n image: true,\n horizontalRule: true,\n undo: true,\n redo: true,\n separator: true,\n};\n\n// Configuration par défaut du bubble menu\nexport const DEFAULT_BUBBLE_MENU_CONFIG: BubbleMenuConfig = {\n bold: true,\n italic: true,\n underline: true,\n strike: true,\n code: true,\n superscript: false,\n subscript: false,\n highlight: true,\n link: true,\n separator: true,\n};\n\n// Configuration par défaut du bubble menu image\nexport const DEFAULT_IMAGE_BUBBLE_MENU_CONFIG: ImageBubbleMenuConfig = {\n changeImage: true,\n resizeSmall: true,\n resizeMedium: true,\n resizeLarge: true,\n resizeOriginal: true,\n deleteImage: true,\n separator: true,\n};\n\n@Component({\n selector: \"angular-tiptap-editor\",\n standalone: true,\n imports: [\n TiptapToolbarComponent,\n TiptapImageUploadComponent,\n TiptapBubbleMenuComponent,\n TiptapImageBubbleMenuComponent,\n TiptapSlashCommandsComponent,\n ],\n template: `\n <div class=\"tiptap-editor\">\n <!-- Toolbar -->\n @if (showToolbar() && editor()) {\n <tiptap-toolbar [editor]=\"editor()!\" [config]=\"toolbarConfig()\">\n <div image-upload class=\"image-upload-container\">\n <tiptap-image-upload\n [config]=\"imageUploadConfig()\"\n (imageSelected)=\"onImageUploaded($event)\"\n (error)=\"onImageUploadError($event)\"\n />\n </div>\n </tiptap-toolbar>\n }\n\n <!-- Contenu de l'éditeur -->\n <div\n #editorElement\n class=\"tiptap-content\"\n [class.drag-over]=\"isDragOver()\"\n (dragover)=\"onDragOver($event)\"\n (drop)=\"onDrop($event)\"\n (click)=\"onEditorClick($event)\"\n ></div>\n\n <!-- Bubble Menu pour le texte -->\n @if (showBubbleMenu() && editor()) {\n <tiptap-bubble-menu\n [editor]=\"editor()!\"\n [config]=\"bubbleMenuConfig()\"\n [style.display]=\"editorFullyInitialized() ? 'block' : 'none'\"\n ></tiptap-bubble-menu>\n }\n\n <!-- Bubble Menu pour les images -->\n @if (showImageBubbleMenu() && editor()) {\n <tiptap-image-bubble-menu\n [editor]=\"editor()!\"\n [config]=\"imageBubbleMenuConfig()\"\n [style.display]=\"editorFullyInitialized() ? 'block' : 'none'\"\n ></tiptap-image-bubble-menu>\n }\n\n <!-- Slash Commands -->\n @if (enableSlashCommands() && editor()) {\n <tiptap-slash-commands\n [editor]=\"editor()!\"\n [config]=\"slashCommandsConfigComputed()\"\n [style.display]=\"editorFullyInitialized() ? 'block' : 'none'\"\n (imageUploadRequested)=\"onSlashCommandImageUpload($event)\"\n ></tiptap-slash-commands>\n }\n\n <!-- Compteur de caractères -->\n @if (showCharacterCount() && characterCountData()) {\n <div class=\"character-count\">\n {{ characterCountData()?.characters }}\n {{ i18nService.editor().characters }},\n {{ characterCountData()?.words }} {{ i18nService.editor().words }} @if\n (maxCharacters()) { /\n {{ maxCharacters() }}\n }\n </div>\n }\n </div>\n `,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => AngularTiptapEditorComponent),\n multi: true,\n },\n ],\n styles: [\n `\n /* Styles de base pour l'éditeur Tiptap */\n\n /* Conteneur principal de l'éditeur */\n .tiptap-editor {\n border: 2px solid #e2e8f0;\n border-radius: 8px;\n background: white;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n overflow: hidden;\n transition: border-color 0.2s ease;\n }\n\n .tiptap-editor:focus-within {\n border-color: #3182ce;\n box-shadow: 0 0 0 3px rgba(49, 130, 206, 0.1);\n }\n\n /* Contenu de l'éditeur */\n .tiptap-content {\n padding: 16px;\n min-height: var(--editor-min-height, 200px);\n height: var(--editor-height, auto);\n max-height: var(--editor-max-height, none);\n overflow-y: var(--editor-overflow, visible);\n outline: none;\n position: relative;\n }\n\n .tiptap-content.drag-over {\n background: #f0f8ff;\n border: 2px dashed #3182ce;\n }\n\n /* Compteur de caractères */\n .character-count {\n padding: 8px 16px;\n font-size: 12px;\n color: #718096;\n text-align: right;\n border-top: 1px solid #e2e8f0;\n background: #f8f9fa;\n }\n\n /* Styles spécifiques au composant */\n .image-upload-container {\n position: relative;\n display: inline-block;\n }\n\n /* Styles ProseMirror avec :host ::ng-deep */\n :host ::ng-deep .ProseMirror {\n outline: none;\n line-height: 1.6;\n color: #2d3748;\n min-height: 100%;\n height: 100%;\n /* S'assurer que le contenu s'étend correctement dans un conteneur scrollable */\n word-wrap: break-word;\n overflow-wrap: break-word;\n }\n\n /* Titres */\n :host ::ng-deep .ProseMirror h1 {\n font-size: 2em;\n font-weight: bold;\n margin-top: 0;\n margin-bottom: 0.5em;\n }\n\n :host ::ng-deep .ProseMirror h2 {\n font-size: 1.5em;\n font-weight: bold;\n margin-top: 1em;\n margin-bottom: 0.5em;\n }\n\n :host ::ng-deep .ProseMirror h3 {\n font-size: 1.25em;\n font-weight: bold;\n margin-top: 1em;\n margin-bottom: 0.5em;\n }\n\n /* Paragraphes et listes */\n :host ::ng-deep .ProseMirror p {\n margin: 0.5em 0;\n }\n\n :host ::ng-deep .ProseMirror ul,\n :host ::ng-deep .ProseMirror ol {\n padding-left: 2em;\n margin: 0.5em 0;\n }\n\n /* Citations */\n :host ::ng-deep .ProseMirror blockquote {\n border-left: 4px solid #e2e8f0;\n padding-left: 1em;\n margin: 1em 0;\n font-style: italic;\n background: #f8f9fa;\n padding: 0.5em 1em;\n border-radius: 0 4px 4px 0;\n }\n\n /* Code */\n :host ::ng-deep .ProseMirror code {\n background: #f1f5f9;\n padding: 0.2em 0.4em;\n border-radius: 3px;\n font-family: \"Monaco\", \"Consolas\", monospace;\n font-size: 0.9em;\n }\n\n :host ::ng-deep .ProseMirror pre {\n background: #1a202c;\n color: #e2e8f0;\n padding: 1em;\n border-radius: 6px;\n overflow-x: auto;\n margin: 1em 0;\n }\n\n :host ::ng-deep .ProseMirror pre code {\n background: none;\n color: inherit;\n padding: 0;\n }\n\n /* Placeholder */\n :host ::ng-deep .ProseMirror .placeholder {\n color: #a0aec0;\n pointer-events: none;\n height: 0;\n }\n\n :host ::ng-deep .ProseMirror .placeholder::before {\n content: attr(data-placeholder);\n float: left;\n height: 0;\n pointer-events: none;\n }\n\n /* Mode lecture seule */\n :host ::ng-deep .ProseMirror[contenteditable=\"false\"] {\n pointer-events: none;\n }\n\n :host ::ng-deep .ProseMirror[contenteditable=\"false\"] img {\n cursor: default;\n pointer-events: none;\n }\n\n :host ::ng-deep .ProseMirror[contenteditable=\"false\"] img:hover {\n transform: none;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n }\n\n :host\n ::ng-deep\n .ProseMirror[contenteditable=\"false\"]\n img.ProseMirror-selectednode {\n outline: none;\n }\n\n /* Styles pour les images */\n :host ::ng-deep .ProseMirror img {\n position: relative;\n display: inline-block;\n max-width: 100%;\n height: auto;\n cursor: pointer;\n transition: all 0.2s ease;\n border: 2px solid transparent;\n border-radius: 8px;\n }\n\n :host ::ng-deep .ProseMirror img:hover {\n border-color: #e2e8f0;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n }\n\n :host ::ng-deep .ProseMirror img.selected {\n border-color: #3182ce;\n box-shadow: 0 0 0 3px rgba(49, 130, 206, 0.1);\n transition: all 0.2s ease;\n }\n\n /* Images avec classe tiptap-image */\n :host ::ng-deep .ProseMirror .tiptap-image {\n max-width: 100%;\n height: auto;\n border-radius: 16px;\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08);\n margin: 0.5em 0;\n cursor: pointer;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n display: block;\n filter: brightness(1) contrast(1);\n }\n\n :host ::ng-deep .ProseMirror .tiptap-image:hover {\n box-shadow: 0 8px 30px rgba(0, 0, 0, 0.12);\n filter: brightness(1.02) contrast(1.02);\n }\n\n :host ::ng-deep .ProseMirror .tiptap-image.ProseMirror-selectednode {\n outline: 2px solid #6366f1;\n outline-offset: 2px;\n border-radius: 16px;\n box-shadow: 0 0 0 4px rgba(99, 102, 241, 0.1);\n }\n\n /* Conteneurs d'images avec alignement */\n :host ::ng-deep .image-container {\n margin: 0.5em 0;\n text-align: center;\n border-radius: 16px;\n overflow: hidden;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n :host ::ng-deep .image-container.image-align-left {\n text-align: left;\n }\n\n :host ::ng-deep .image-container.image-align-center {\n text-align: center;\n }\n\n :host ::ng-deep .image-container.image-align-right {\n text-align: right;\n }\n\n :host ::ng-deep .image-container img {\n display: inline-block;\n max-width: 100%;\n height: auto;\n border-radius: 16px;\n }\n\n /* Conteneur pour les images redimensionnables */\n :host ::ng-deep .resizable-image-container {\n position: relative;\n display: inline-block;\n margin: 0.5em 0;\n }\n\n /* Conteneur des contrôles de redimensionnement */\n :host ::ng-deep .resize-controls {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n pointer-events: none;\n z-index: 1000;\n }\n\n /* Poignées de redimensionnement */\n :host ::ng-deep .resize-handle {\n position: absolute;\n width: 12px;\n height: 12px;\n background: #3b82f6;\n border: 2px solid white;\n border-radius: 50%;\n pointer-events: all;\n cursor: pointer;\n z-index: 1001;\n transition: all 0.15s ease;\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.2);\n }\n\n :host ::ng-deep .resize-handle:hover {\n background: #2563eb;\n box-shadow: 0 3px 8px rgba(0, 0, 0, 0.3);\n }\n\n :host ::ng-deep .resize-handle:active {\n background: #1d4ed8;\n }\n\n /* Poignées du milieu avec scale séparé */\n :host ::ng-deep .resize-handle-n:hover,\n :host ::ng-deep .resize-handle-s:hover {\n transform: translateX(-50%) scale(1.2);\n }\n\n :host ::ng-deep .resize-handle-w:hover,\n :host ::ng-deep .resize-handle-e:hover {\n transform: translateY(-50%) scale(1.2);\n }\n\n :host ::ng-deep .resize-handle-n:active,\n :host ::ng-deep .resize-handle-s:active {\n transform: translateX(-50%) scale(0.9);\n }\n\n :host ::ng-deep .resize-handle-w:active,\n :host ::ng-deep .resize-handle-e:active {\n transform: translateY(-50%) scale(0.9);\n }\n\n /* Poignées des coins avec scale simple */\n :host ::ng-deep .resize-handle-nw:hover,\n :host ::ng-deep .resize-handle-ne:hover,\n :host ::ng-deep .resize-handle-sw:hover,\n :host ::ng-deep .resize-handle-se:hover {\n transform: scale(1.2);\n }\n\n :host ::ng-deep .resize-handle-nw:active,\n :host ::ng-deep .resize-handle-ne:active,\n :host ::ng-deep .resize-handle-sw:active,\n :host ::ng-deep .resize-handle-se:active {\n transform: scale(0.9);\n }\n\n /* Positions spécifiques pour chaque poignée */\n :host ::ng-deep .resize-handle-nw {\n top: 0;\n left: -6px;\n cursor: nw-resize;\n }\n :host ::ng-deep .resize-handle-n {\n top: 0;\n left: 50%;\n transform: translateX(-50%);\n cursor: n-resize;\n }\n :host ::ng-deep .resize-handle-ne {\n top: 0;\n right: -6px;\n cursor: ne-resize;\n }\n :host ::ng-deep .resize-handle-w {\n top: 50%;\n left: -6px;\n transform: translateY(-50%);\n cursor: w-resize;\n }\n :host ::ng-deep .resize-handle-e {\n top: 50%;\n right: -6px;\n transform: translateY(-50%);\n cursor: e-resize;\n }\n :host ::ng-deep .resize-handle-sw {\n bottom: 0;\n left: -6px;\n cursor: sw-resize;\n }\n :host ::ng-deep .resize-handle-s {\n bottom: 0;\n left: 50%;\n transform: translateX(-50%);\n cursor: s-resize;\n }\n :host ::ng-deep .resize-handle-se {\n bottom: 0;\n right: -6px;\n cursor: se-resize;\n }\n\n /* Styles pour le redimensionnement en cours */\n :host ::ng-deep body.resizing {\n user-select: none;\n cursor: crosshair;\n }\n\n :host ::ng-deep body.resizing .ProseMirror {\n pointer-events: none;\n }\n\n :host ::ng-deep body.resizing .ProseMirror .tiptap-image {\n pointer-events: none;\n }\n\n /* Styles pour les informations de taille d'image */\n :host ::ng-deep .image-size-info {\n position: absolute;\n bottom: -20px;\n left: 50%;\n transform: translateX(-50%);\n background: rgba(0, 0, 0, 0.8);\n color: white;\n padding: 2px 6px;\n border-radius: 3px;\n font-size: 11px;\n white-space: nowrap;\n opacity: 0;\n transition: opacity 0.2s ease;\n }\n\n :host ::ng-deep .image-container:hover .image-size-info {\n opacity: 1;\n }\n `,\n ],\n})\nexport class AngularTiptapEditorComponent\n implements OnInit, AfterViewInit, OnDestroy, ControlValueAccessor\n{\n // Nouveaux inputs avec signal\n content = input<string>(\"\");\n placeholder = input<string>(\"\");\n editable = input<boolean>(true);\n minHeight = input<number>(200);\n height = input<number | undefined>(undefined);\n maxHeight = input<number | undefined>(undefined);\n showToolbar = input<boolean>(true);\n showCharacterCount = input<boolean>(true);\n maxCharacters = input<number | undefined>(undefined);\n enableOfficePaste = input<boolean>(true);\n enableSlashCommands = input<boolean>(true);\n slashCommandsConfig = input<SlashCommandsConfig | undefined>(undefined);\n locale = input<SupportedLocale | undefined>(undefined);\n\n // Nouveaux inputs pour les bubble menus\n showBubbleMenu = input<boolean>(true);\n bubbleMenu = input<Partial<BubbleMenuConfig>>(DEFAULT_BUBBLE_MENU_CONFIG);\n showImageBubbleMenu = input<boolean>(true);\n imageBubbleMenu = input<Partial<ImageBubbleMenuConfig>>(\n DEFAULT_IMAGE_BUBBLE_MENU_CONFIG\n );\n\n // Nouveau input pour la configuration de la toolbar\n toolbar = input<Partial<ToolbarConfig>>({});\n\n // Nouveau input pour la configuration de l'upload d'images\n imageUpload = input<Partial<any>>({});\n\n // Nouveaux outputs\n contentChange = output<string>();\n editorCreated = output<Editor>();\n editorUpdate = output<{ editor: Editor; transaction: any }>();\n editorFocus = output<{ editor: Editor; event: FocusEvent }>();\n editorBlur = output<{ editor: Editor; event: FocusEvent }>();\n\n // ViewChild avec signal\n editorElement = viewChild.required<ElementRef>(\"editorElement\");\n\n // Signals pour l'état interne\n editor = signal<Editor | null>(null);\n characterCountData = signal<{ characters: number; words: number } | null>(\n null\n );\n isDragOver = signal<boolean>(false);\n editorFullyInitialized = signal<boolean>(false);\n\n // Computed pour les états de l'éditeur\n isEditorReady = computed(() => this.editor() !== null);\n\n // Computed pour la configuration de la toolbar\n toolbarConfig = computed(() => {\n const userConfig = this.toolbar();\n // Si aucune configuration n'est fournie, utiliser la configuration par défaut\n if (Object.keys(userConfig).length === 0) {\n return DEFAULT_TOOLBAR_CONFIG;\n }\n // Sinon, utiliser uniquement la configuration fournie par l'utilisateur\n return userConfig;\n });\n\n // Computed pour la configuration du bubble menu\n bubbleMenuConfig = computed(() => {\n const userConfig = this.bubbleMenu();\n // Si aucune configuration n'est fournie, utiliser la configuration par défaut\n if (Object.keys(userConfig).length === 0) {\n return DEFAULT_BUBBLE_MENU_CONFIG;\n }\n // Sinon, fusionner avec la configuration par défaut\n return {\n ...DEFAULT_BUBBLE_MENU_CONFIG,\n ...userConfig,\n };\n });\n\n // Computed pour la configuration du bubble menu image\n imageBubbleMenuConfig = computed(() => {\n const userConfig = this.imageBubbleMenu();\n // Si aucune configuration n'est fournie, utiliser la configuration par défaut\n if (Object.keys(userConfig).length === 0) {\n return DEFAULT_IMAGE_BUBBLE_MENU_CONFIG;\n }\n // Sinon, fusionner avec la configuration par défaut\n return {\n ...DEFAULT_IMAGE_BUBBLE_MENU_CONFIG,\n ...userConfig,\n };\n });\n\n // Computed pour la configuration de l'upload d'images\n imageUploadConfig = computed(() => {\n const userConfig = this.imageUpload();\n return {\n maxSize: 5,\n maxWidth: 1920,\n maxHeight: 1080,\n allowedTypes: [\"image/jpeg\", \"image/png\", \"image/gif\", \"image/webp\"],\n enableDragDrop: true,\n showPreview: true,\n multiple: false,\n compressImages: true,\n quality: 0.8,\n ...userConfig,\n };\n });\n\n // Computed pour la configuration des slash commands\n slashCommandsConfigComputed = computed(() => {\n const userConfig = this.slashCommandsConfig();\n if (userConfig) {\n return userConfig;\n }\n // Configuration par défaut si aucune n'est fournie\n return { commands: undefined }; // Le composant utilisera DEFAULT_SLASH_COMMANDS\n });\n\n // ControlValueAccessor implementation\n private onChange = (value: string) => {};\n private onTouched = () => {};\n\n readonly i18nService = inject(TiptapI18nService);\n\n constructor(private imageService: ImageService) {\n // Effet pour gérer le changement de langue\n effect(() => {\n const locale = this.locale();\n if (locale) {\n this.i18nService.setLocale(locale);\n }\n });\n\n // Effet pour mettre à jour le contenu de l'éditeur\n effect(() => {\n const editor = this.editor();\n const content = this.content();\n if (editor && content !== editor.getHTML()) {\n editor.commands.setContent(content, false);\n }\n });\n\n // Effet pour mettre à jour les propriétés de hauteur\n effect(() => {\n const minHeight = this.minHeight();\n const height = this.height();\n const maxHeight = this.maxHeight();\n const element = this.editorElement()?.nativeElement;\n\n // Calculer automatiquement si le scroll est nécessaire\n const needsScroll = height !== undefined || maxHeight !== undefined;\n\n if (element) {\n element.style.setProperty(\"--editor-min-height\", `${minHeight}px`);\n element.style.setProperty(\n \"--editor-height\",\n height ? `${height}px` : \"auto\"\n );\n element.style.setProperty(\n \"--editor-max-height\",\n maxHeight ? `${maxHeight}px` : \"none\"\n );\n element.style.setProperty(\n \"--editor-overflow\",\n needsScroll ? \"auto\" : \"visible\"\n );\n }\n });\n\n // Effect pour surveiller les changements d'édition\n effect(() => {\n const currentEditor = this.editor();\n const isEditable = this.editable();\n\n if (currentEditor) {\n currentEditor.setEditable(isEditable);\n }\n });\n }\n\n ngOnInit() {\n // L'initialisation se fait maintenant dans ngAfterViewInit\n }\n\n ngAfterViewInit() {\n // Attendre que la vue soit complètement initialisée avant de créer l'éditeur\n setTimeout(() => {\n this.initEditor();\n }, 0);\n }\n\n ngOnDestroy() {\n const currentEditor = this.editor();\n if (currentEditor) {\n currentEditor.destroy();\n }\n this.editorFullyInitialized.set(false);\n }\n\n private initEditor() {\n const extensions: (Extension | Node | Mark)[] = [\n StarterKit,\n Placeholder.configure({\n placeholder:\n this.placeholder() || this.i18nService.editor().placeholder,\n }),\n Underline,\n Superscript,\n Subscript,\n TextAlign.configure({\n types: [\"heading\", \"paragraph\"],\n }),\n Link.configure({\n openOnClick: false,\n HTMLAttributes: {\n class: \"tiptap-link\",\n },\n }),\n Highlight.configure({\n multicolor: true,\n HTMLAttributes: {\n class: \"tiptap-highlight\",\n },\n }),\n ResizableImage.configure({\n inline: false,\n allowBase64: true,\n HTMLAttributes: {\n class: \"tiptap-image\",\n },\n }),\n UploadProgress.configure({\n isUploading: () => this.imageService.isUploading(),\n uploadProgress: () => this.imageService.uploadProgress(),\n uploadMessage: () => this.imageService.uploadMessage(),\n }),\n ];\n\n // Ajouter l'extension Office Paste si activée\n if (this.enableOfficePaste()) {\n extensions.push(\n OfficePaste.configure({\n // Configuration par défaut pour une meilleure compatibilité\n transformPastedHTML: true,\n transformPastedText: true,\n })\n );\n }\n\n if (this.showCharacterCount()) {\n extensions.push(\n CharacterCount.configure({\n limit: this.maxCharacters(),\n })\n );\n }\n\n const newEditor = new Editor({\n element: this.editorElement().nativeElement,\n extensions,\n content: this.content(),\n editable: this.editable(),\n onUpdate: ({ editor, transaction }) => {\n const html = editor.getHTML();\n this.contentChange.emit(html);\n // Defer the onChange call to prevent ExpressionChangedAfterItHasBeenCheckedError\n Promise.resolve().then(() => {\n this.onChange(html);\n });\n this.editorUpdate.emit({ editor, transaction });\n this.updateCharacterCount(editor);\n },\n onSelectionUpdate: ({ editor, transaction }) => {\n // Note: La mise à jour des états des boutons est maintenant gérée par TiptapBubbleMenuComponent\n },\n onCreate: ({ editor }) => {\n this.editor.set(editor);\n this.editorCreated.emit(editor);\n this.updateCharacterCount(editor);\n\n // Marquer l'éditeur comme complètement initialisé après un court délai\n // pour s'assurer que tous les plugins et extensions sont prêts\n setTimeout(() => {\n this.editorFullyInitialized.set(true);\n }, 100);\n },\n onFocus: ({ editor, event }) => {\n this.editorFocus.emit({ editor, event });\n },\n onBlur: ({ editor, event }) => {\n this.onTouched();\n this.editorBlur.emit({ editor, event });\n },\n });\n }\n\n private updateCharacterCount(editor: Editor) {\n if (this.showCharacterCount() && editor.storage[\"characterCount\"]) {\n const storage = editor.storage[\"characterCount\"];\n this.characterCountData.set({\n characters: storage.characters(),\n words: storage.words(),\n });\n }\n }\n\n // Méthodes pour l'upload d'images\n onImageUploaded(result: ImageUploadResult) {\n const currentEditor = this.editor();\n if (currentEditor) {\n this.imageService.insertImage(currentEditor, {\n src: result.src,\n alt: result.name,\n title: `${result.name} (${result.width}×${result.height})`,\n width: result.width,\n height: result.height,\n });\n }\n }\n\n onImageUploadError(error: string) {\n // Ici vous pourriez afficher une notification à l'utilisateur\n }\n\n // Gestion de l'upload d'image depuis les slash commands\n async onSlashCommandImageUpload(file: File) {\n const currentEditor = this.editor();\n if (currentEditor) {\n try {\n await this.imageService.uploadAndInsertImage(currentEditor, file);\n } catch (error) {\n // Gérer l'erreur silencieusement ou afficher une notification\n }\n }\n }\n\n onDragOver(event: DragEvent) {\n event.preventDefault();\n event.stopPropagation();\n this.isDragOver.set(true);\n }\n\n onDrop(event: DragEvent) {\n event.preventDefault();\n event.stopPropagation();\n this.isDragOver.set(false);\n\n const files = event.dataTransfer?.files;\n if (files && files.length > 0) {\n const file = files[0];\n if (file.type.startsWith(\"image/\")) {\n this.insertImageFromFile(file);\n }\n }\n }\n\n private async insertImageFromFile(file: File) {\n const currentEditor = this.editor();\n if (currentEditor) {\n try {\n await this.imageService.uploadAndInsertImage(currentEditor, file);\n } catch (error) {\n // Gérer l'erreur silencieusement ou afficher une notification\n }\n }\n }\n\n // Public methods\n getHTML(): string {\n return this.editor()?.getHTML() || \"\";\n }\n\n getJSON(): any {\n return this.editor()?.getJSON();\n }\n\n getText(): string {\n return this.editor()?.getText() || \"\";\n }\n\n setContent(content: string, emitUpdate = true) {\n this.editor()?.commands.setContent(content, emitUpdate);\n }\n\n focus() {\n this.editor()?.commands.focus();\n }\n\n blur() {\n this.editor()?.commands.blur();\n }\n\n clearContent() {\n this.editor()?.commands.clearContent();\n }\n\n // ControlValueAccessor methods\n writeValue(value: string): void {\n const currentEditor = this.editor();\n if (currentEditor && value !== currentEditor.getHTML()) {\n currentEditor.commands.setContent(value || \"\", false);\n }\n }\n\n registerOnChange(fn: (value: string) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n const currentEditor = this.editor();\n if (currentEditor) {\n currentEditor.setEditable(!isDisabled);\n }\n }\n\n onEditorClick(event: MouseEvent) {\n const editor = this.editor();\n if (!editor) return;\n\n // Vérifier si on clique sur l'élément conteneur et non sur le contenu\n const target = event.target as HTMLElement;\n const editorElement = this.editorElement()?.nativeElement;\n\n if (\n target === editorElement ||\n target.classList.contains(\"tiptap-content\")\n ) {\n // On clique dans l'espace vide, positionner le curseur à la fin\n setTimeout(() => {\n const { doc } = editor.state;\n const endPos = doc.content.size;\n editor.commands.setTextSelection(endPos);\n editor.commands.focus();\n }, 0);\n }\n }\n}\n","import { Editor } from \"@tiptap/core\";\r\nimport { SlashCommandItem } from \"../tiptap-slash-commands.component\";\r\nimport { TiptapI18nService } from \"../services/i18n.service\";\r\n\r\n/**\r\n * Factory function pour créer les slash commands traduits\r\n */\r\nexport function createI18nSlashCommands(\r\n i18nService: TiptapI18nService\r\n): SlashCommandItem[] {\r\n const slashCommands = i18nService.slashCommands();\r\n\r\n return [\r\n {\r\n title: slashCommands.heading1.title,\r\n description: slashCommands.heading1.description,\r\n icon: \"format_h1\",\r\n keywords: slashCommands.heading1.keywords,\r\n command: (editor: Editor) =>\r\n editor.chain().focus().toggleHeading({ level: 1 }).run(),\r\n },\r\n {\r\n title: slashCommands.heading2.title,\r\n description: slashCommands.heading2.description,\r\n icon: \"format_h2\",\r\n keywords: slashCommands.heading2.keywords,\r\n command: (editor: Editor) =>\r\n editor.chain().focus().toggleHeading({ level: 2 }).run(),\r\n },\r\n {\r\n title: slashCommands.heading3.title,\r\n description: slashCommands.heading3.description,\r\n icon: \"format_h3\",\r\n keywords: slashCommands.heading3.keywords,\r\n command: (editor: Editor) =>\r\n editor.chain().focus().toggleHeading({ level: 3 }).run(),\r\n },\r\n {\r\n title: slashCommands.bulletList.title,\r\n description: slashCommands.bulletList.description,\r\n icon: \"format_list_bulleted\",\r\n keywords: slashCommands.bulletList.keywords,\r\n command: (editor: Editor) =>\r\n editor.chain().focus().toggleBulletList().run(),\r\n },\r\n {\r\n title: slashCommands.orderedList.title,\r\n description: slashCommands.orderedList.description,\r\n icon: \"format_list_numbered\",\r\n keywords: slashCommands.orderedList.keywords,\r\n command: (editor: Editor) =>\r\n editor.chain().focus().toggleOrderedList().run(),\r\n },\r\n {\r\n title: slashCommands.blockquote.title,\r\n description: slashCommands.blockquote.description,\r\n icon: \"format_quote\",\r\n keywords: slashCommands.blockquote.keywords,\r\n command: (editor: Editor) =>\r\n editor.chain().focus().toggleBlockquote().run(),\r\n },\r\n {\r\n title: slashCommands.code.title,\r\n description: slashCommands.code.description,\r\n icon: \"code\",\r\n keywords: slashCommands.code.keywords,\r\n command: (editor: Editor) =>\r\n editor.chain().focus().toggleCodeBlock().run(),\r\n },\r\n {\r\n title: slashCommands.image.title,\r\n description: slashCommands.image.description,\r\n icon: \"image\",\r\n keywords: slashCommands.image.keywords,\r\n command: (editor: Editor) => {\r\n // Créer un input file temporaire pour sélectionner une image\r\n const input = document.createElement(\"input\");\r\n input.type = \"file\";\r\n input.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 // Utiliser la méthode de compression unifiée\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 // Vérifier les dimensions (max 1920x1080)\r\n const maxWidth = 1920;\r\n const maxHeight = 1080;\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 // 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 // Utiliser setResizableImage avec toutes les propriétés\r\n editor\r\n .chain()\r\n .focus()\r\n .setResizableImage({\r\n src: base64,\r\n alt: file.name,\r\n title: `${file.name} (${Math.round(\r\n width\r\n )}×${Math.round(height)})`,\r\n width: Math.round(width),\r\n height: Math.round(height),\r\n })\r\n .run();\r\n }\r\n };\r\n reader.readAsDataURL(blob);\r\n }\r\n },\r\n file.type,\r\n 0.8 // qualité de compression\r\n );\r\n };\r\n\r\n img.onerror = () => {\r\n console.error(i18nService.editor().imageLoadError);\r\n };\r\n\r\n img.src = URL.createObjectURL(file);\r\n } catch (error) {\r\n console.error(\"Error uploading image:\", error);\r\n }\r\n }\r\n document.body.removeChild(input);\r\n });\r\n\r\n document.body.appendChild(input);\r\n input.click();\r\n },\r\n },\r\n {\r\n title: slashCommands.horizontalRule.title,\r\n description: slashCommands.horizontalRule.description,\r\n icon: \"horizontal_rule\",\r\n keywords: slashCommands.horizontalRule.keywords,\r\n command: (editor: Editor) =>\r\n editor.chain().focus().setHorizontalRule().run(),\r\n },\r\n ];\r\n}\r\n\r\n/**\r\n * Mapping des clés de commandes pour la compatibilité\r\n */\r\nexport const SLASH_COMMAND_KEYS = {\r\n heading1: \"heading1\",\r\n heading2: \"heading2\",\r\n heading3: \"heading3\",\r\n bulletList: \"bulletList\",\r\n orderedList: \"orderedList\",\r\n blockquote: \"blockquote\",\r\n code: \"code\",\r\n image: \"image\",\r\n horizontalRule: \"horizontalRule\",\r\n} as const;\r\n\r\nexport type SlashCommandKey = keyof typeof SLASH_COMMAND_KEYS;\r\n","/*\n * Public API Surface of tiptap-editor\n */\n\n// Main component - only public component\nexport * from \"./lib/tiptap-editor.component\";\n\n// Internationalization service\nexport * from \"./lib/services/i18n.service\";\n\n// Types and interfaces for configuration\nexport type { ToolbarConfig } from \"./lib/toolbar.component\";\nexport type {\n BubbleMenuConfig,\n ImageBubbleMenuConfig,\n} from \"./lib/models/bubble-menu.model\";\nexport type {\n SlashCommandsConfig,\n SlashCommandItem,\n} from \"./lib/tiptap-slash-commands.component\";\n\n// Default configurations\nexport { DEFAULT_TOOLBAR_CONFIG } from \"./lib/tiptap-editor.component\";\nexport { DEFAULT_BUBBLE_MENU_CONFIG } from \"./lib/tiptap-editor.component\";\nexport { DEFAULT_IMAGE_BUBBLE_MENU_CONFIG } from \"./lib/tiptap-editor.component\";\nexport { DEFAULT_SLASH_COMMANDS } from \"./lib/tiptap-slash-commands.component\";\n\n// Utility function to create internationalized slash commands\nexport { createI18nSlashCommands } from \"./lib/config/i18n-slash-commands\";\n\n// Types for height configuration\nexport type HeightConfig = {\n minHeight?: number;\n height?: number;\n maxHeight?: number;\n};\n\n// Supported locales type\nexport type { SupportedLocale } from \"./lib/services/i18n.service\";\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.EditorCommandsService","Plugin","PluginKey","i1.ImageService"],"mappings":"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"}
|