@stackch/angular-richtext-editor 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"stackch-angular-richtext-editor.mjs","sources":["../../../projects/stackch-richtext-editor/src/lib/toolbar/stackch-richtext-editor-toolbar.ts","../../../projects/stackch-richtext-editor/src/lib/toolbar/stackch-richtext-editor-toolbar.html","../../../projects/stackch-richtext-editor/src/lib/stackch-richtext-editor.ts","../../../projects/stackch-richtext-editor/src/lib/stackch-richtext-editor.html","../../../projects/stackch-richtext-editor/src/public-api.ts","../../../projects/stackch-richtext-editor/src/stackch-angular-richtext-editor.ts"],"sourcesContent":["import { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { StackchRichtextEditorConfig, StackchRichtextEditorI18n } from '../stackch-richtext-editor';\r\n\r\n@Component({\r\n selector: 'stackch-richtext-editor-toolbar',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './stackch-richtext-editor-toolbar.html',\r\n // Reuse the editor stylesheet for consistent visuals\r\n styleUrls: ['../stackch-richtext-editor.scss']\r\n})\r\nexport class StackchRichtextEditorToolbar {\r\n // State/config from parent editor\r\n @Input() cfg!: StackchRichtextEditorConfig;\r\n @Input() i18n!: StackchRichtextEditorI18n;\r\n @Input() disabled = false;\r\n @Input() fonts: string[] = [];\r\n @Input() fontSizes: number[] = [];\r\n\r\n @Input() isBoldActive = false;\r\n @Input() isItalicActive = false;\r\n @Input() isUnderlineActive = false;\r\n @Input() canUndo = false;\r\n @Input() canRedo = false;\r\n\r\n // Consolidated UI state\r\n @Input() uiState?: {\r\n showFontPanel?: boolean;\r\n showHeadingMenu?: boolean;\r\n showSpacingMenu?: boolean;\r\n showAlignMenu?: boolean;\r\n showColorMenu?: boolean;\r\n showListMenu?: boolean;\r\n };\r\n\r\n // Actions -> bubble to parent editor\r\n @Output() undo = new EventEmitter<void>();\r\n @Output() redo = new EventEmitter<void>();\r\n\r\n @Output() toggleFontPanel = new EventEmitter<Event>();\r\n @Output() toggleHeadingMenu = new EventEmitter<Event>();\r\n @Output() toggleSpacingMenu = new EventEmitter<Event>();\r\n @Output() toggleAlignMenu = new EventEmitter<Event>();\r\n @Output() toggleColorMenu = new EventEmitter<Event>();\r\n @Output() toggleListMenu = new EventEmitter<Event>();\r\n\r\n @Output() pickFont = new EventEmitter<string>();\r\n @Output() pickFontSize = new EventEmitter<number>();\r\n @Output() pickAlign = new EventEmitter<'left' | 'center' | 'right' | 'justify'>();\r\n @Output() pickList = new EventEmitter<'ul' | 'ol'>();\r\n @Output() pickHeading = new EventEmitter<'p' | 'pre' | 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6'>();\r\n @Output() pickSpacing = new EventEmitter<{ kind: 'margin' | 'padding'; target: 'all' | 'vertical' | 'horizontal'; value: number }>();\r\n\r\n @Output() applyColor = new EventEmitter<string>();\r\n @Output() applyHighlight = new EventEmitter<string>();\r\n\r\n @Output() toggleBold = new EventEmitter<void>();\r\n @Output() toggleItalic = new EventEmitter<void>();\r\n @Output() toggleUnderline = new EventEmitter<void>();\r\n\r\n @Output() insertLink = new EventEmitter<void>();\r\n @Output() removeFormat = new EventEmitter<void>();\r\n\r\n // Ask parent to preserve selection before toolbar interactions (mousedown/pointerdown/focus)\r\n @Output() saveSelectionRequest = new EventEmitter<void>();\r\n\r\n onToolbarMouseDown(evt: Event) {\r\n // Prevent focus stealing and keep selection in the editor\r\n evt.preventDefault();\r\n evt.stopPropagation();\r\n this.saveSelectionRequest.emit();\r\n }\r\n\r\n onColorPointerDown(evt: Event) {\r\n // Do not preventDefault to allow the color picker to open, just preserve selection\r\n evt.stopPropagation();\r\n this.saveSelectionRequest.emit();\r\n }\r\n}\r\n","<div class=\"stackch_rte__toolbar\">\r\n <!-- Undo / Redo -->\r\n @if (cfg.showUndoRedo) {\r\n <button type=\"button\" class=\"stackch_rte__btn\" (click)=\"undo.emit()\" [disabled]=\"disabled || !canUndo\" [title]=\"i18n.undoTitle\">↶</button>\r\n <button type=\"button\" class=\"stackch_rte__btn\" (click)=\"redo.emit()\" [disabled]=\"disabled || !canRedo\" [title]=\"i18n.redoTitle\">↷</button>\r\n <span class=\"stackch_rte__sep\"></span>\r\n }\r\n\r\n <!-- Schrift & Größe (kombinierter Layer) -->\r\n @if (cfg.showFontPanel) {\r\n <div class=\"stackch_rte__dropdown\">\r\n <button type=\"button\" class=\"stackch_rte__btn\" (click)=\"toggleFontPanel.emit($event)\" [disabled]=\"disabled\" [title]=\"i18n.fontPanelTitle\">Aᵃ ▾</button>\r\n @if (uiState?.showFontPanel) {\r\n <div class=\"stackch_rte__menu stackch_rte__menu--grid\" (mousedown)=\"$event.stopPropagation()\">\r\n <div class=\"stackch_rte__menu-section\">\r\n <div class=\"stackch_rte__menu-title\">{{ i18n.fontSectionTitle }}</div>\r\n @for (f of fonts; track f) {\r\n <button type=\"button\" class=\"stackch_rte__menu-item\" [style.fontFamily]=\"f\" (click)=\"pickFont.emit(f)\">{{ f }}</button>\r\n }\r\n </div>\r\n <div class=\"stackch_rte__menu-section\">\r\n <div class=\"stackch_rte__menu-title\">{{ i18n.sizeSectionTitle }}</div>\r\n @for (s of fontSizes; track s) {\r\n <button type=\"button\" class=\"stackch_rte__menu-item\" (click)=\"pickFontSize.emit(s)\">{{ s }}px</button>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Überschriften -->\r\n @if (cfg.showHeading) {\r\n <div class=\"stackch_rte__dropdown\">\r\n <button type=\"button\" class=\"stackch_rte__btn\" (click)=\"toggleHeadingMenu.emit($event)\" [disabled]=\"disabled\" [title]=\"i18n.headingTitle\">H ▾</button>\r\n @if (uiState?.showHeadingMenu) {\r\n <div class=\"stackch_rte__menu\" (mousedown)=\"$event.stopPropagation()\">\r\n <button type=\"button\" class=\"stackch_rte__menu-item\" (click)=\"pickHeading.emit('p')\">{{ i18n.paragraphLabel }}</button>\r\n <button type=\"button\" class=\"stackch_rte__menu-item\" (click)=\"pickHeading.emit('pre')\"><span style=\"font-family:monospace;\">{{ i18n.codeLabel }}</span></button>\r\n <button type=\"button\" class=\"stackch_rte__menu-item\" (click)=\"pickHeading.emit('h1')\"><h1 style=\"display:inline; margin:0;\">{{ i18n.h1Label }}</h1></button>\r\n <button type=\"button\" class=\"stackch_rte__menu-item\" (click)=\"pickHeading.emit('h2')\"><h2 style=\"display:inline; margin:0;\">{{ i18n.h2Label }}</h2></button>\r\n <button type=\"button\" class=\"stackch_rte__menu-item\" (click)=\"pickHeading.emit('h3')\"><h3 style=\"display:inline; margin:0;\">{{ i18n.h3Label }}</h3></button>\r\n <button type=\"button\" class=\"stackch_rte__menu-item\" (click)=\"pickHeading.emit('h4')\"><h4 style=\"display:inline; margin:0;\">{{ i18n.h4Label }}</h4></button>\r\n <button type=\"button\" class=\"stackch_rte__menu-item\" (click)=\"pickHeading.emit('h5')\"><h5 style=\"display:inline; margin:0;\">{{ i18n.h5Label }}</h5></button>\r\n <button type=\"button\" class=\"stackch_rte__menu-item\" (click)=\"pickHeading.emit('h6')\"><h6 style=\"display:inline; margin:0;\">{{ i18n.h6Label }}</h6></button>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Spacing (Margin/Padding) -->\r\n @if (cfg.showSpacing) {\r\n <div class=\"stackch_rte__dropdown\">\r\n <button type=\"button\" class=\"stackch_rte__btn\" (click)=\"toggleSpacingMenu.emit($event)\" [disabled]=\"disabled\" [title]=\"i18n.spacingTitle\">M/P ▾</button>\r\n @if (uiState?.showSpacingMenu) {\r\n <div class=\"stackch_rte__menu\" (mousedown)=\"$event.stopPropagation()\">\r\n <div class=\"stackch_rte__menu-title\">{{ i18n.marginTitle }}</div>\r\n <button type=\"button\" class=\"stackch_rte__menu-item\" (click)=\"pickSpacing.emit({kind:'margin',target:'all',value:0})\">0</button>\r\n <button type=\"button\" class=\"stackch_rte__menu-item\" (click)=\"pickSpacing.emit({kind:'margin',target:'all',value:4})\">4px</button>\r\n <button type=\"button\" class=\"stackch_rte__menu-item\" (click)=\"pickSpacing.emit({kind:'margin',target:'all',value:8})\">8px</button>\r\n <button type=\"button\" class=\"stackch_rte__menu-item\" (click)=\"pickSpacing.emit({kind:'margin',target:'all',value:12})\">12px</button>\r\n <button type=\"button\" class=\"stackch_rte__menu-item\" (click)=\"pickSpacing.emit({kind:'margin',target:'vertical',value:16})\">Vert 16px</button>\r\n <button type=\"button\" class=\"stackch_rte__menu-item\" (click)=\"pickSpacing.emit({kind:'margin',target:'horizontal',value:16})\">Horiz 16px</button>\r\n <div class=\"stackch_rte__menu-title\" style=\"margin-top:.25rem;\">{{ i18n.paddingTitle }}</div>\r\n <button type=\"button\" class=\"stackch_rte__menu-item\" (click)=\"pickSpacing.emit({kind:'padding',target:'all',value:0})\">0</button>\r\n <button type=\"button\" class=\"stackch_rte__menu-item\" (click)=\"pickSpacing.emit({kind:'padding',target:'all',value:4})\">4px</button>\r\n <button type=\"button\" class=\"stackch_rte__menu-item\" (click)=\"pickSpacing.emit({kind:'padding',target:'all',value:8})\">8px</button>\r\n <button type=\"button\" class=\"stackch_rte__menu-item\" (click)=\"pickSpacing.emit({kind:'padding',target:'all',value:12})\">12px</button>\r\n <button type=\"button\" class=\"stackch_rte__menu-item\" (click)=\"pickSpacing.emit({kind:'padding',target:'vertical',value:16})\">Vert 16px</button>\r\n <button type=\"button\" class=\"stackch_rte__menu-item\" (click)=\"pickSpacing.emit({kind:'padding',target:'horizontal',value:16})\">Horiz 16px</button>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Farben (Dropdown horizontal) -->\r\n @if (cfg.showColor) {\r\n <div class=\"stackch_rte__dropdown\">\r\n <button type=\"button\" class=\"stackch_rte__btn\" (click)=\"toggleColorMenu.emit($event)\" [disabled]=\"disabled\" [title]=\"i18n.colorsTitle\">🎨 ▾</button>\r\n @if (uiState?.showColorMenu) {\r\n <div class=\"stackch_rte__menu stackch_rte__menu--row\" (mousedown)=\"$event.stopPropagation()\" (click)=\"$event.stopPropagation()\" [title]=\"i18n.colorMenuTitle\">\r\n <label class=\"stackch_rte__color\" (mousedown)=\"$event.stopPropagation(); onColorPointerDown($event)\" (click)=\"$event.stopPropagation()\" (pointerdown)=\"onColorPointerDown($event)\" (touchstart)=\"onColorPointerDown($event)\">\r\n <input type=\"color\" (mousedown)=\"onColorPointerDown($event)\" (click)=\"$event.stopPropagation()\" (pointerdown)=\"onColorPointerDown($event)\" (touchstart)=\"onColorPointerDown($event)\" (focus)=\"saveSelectionRequest.emit()\" (input)=\"applyColor.emit($any($event.target).value)\" (change)=\"applyColor.emit($any($event.target).value)\" [disabled]=\"disabled\" [title]=\"i18n.textColorTitle\" />\r\n A\r\n </label>\r\n <label class=\"stackch_rte__color\" [title]=\"i18n.highlightTitle\" (mousedown)=\"$event.stopPropagation(); onColorPointerDown($event)\" (click)=\"$event.stopPropagation()\" (pointerdown)=\"onColorPointerDown($event)\" (touchstart)=\"onColorPointerDown($event)\">\r\n <input type=\"color\" (mousedown)=\"onColorPointerDown($event)\" (click)=\"$event.stopPropagation()\" (pointerdown)=\"onColorPointerDown($event)\" (touchstart)=\"onColorPointerDown($event)\" (focus)=\"saveSelectionRequest.emit()\" (input)=\"applyHighlight.emit($any($event.target).value)\" (change)=\"applyHighlight.emit($any($event.target).value)\" [disabled]=\"disabled\" />\r\n ⧉\r\n </label>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Stil-Buttons -->\r\n @if (cfg.showBold) {<button type=\"button\" class=\"stackch_rte__btn\" [class.is-active]=\"isBoldActive\" (mousedown)=\"onToolbarMouseDown($event)\" (click)=\"toggleBold.emit()\" [disabled]=\"disabled\" aria-pressed=\"{{isBoldActive}}\" [title]=\"i18n.boldTitle\"><b>B</b></button>}\r\n @if (cfg.showItalic) {<button type=\"button\" class=\"stackch_rte__btn\" [class.is-active]=\"isItalicActive\" (mousedown)=\"onToolbarMouseDown($event)\" (click)=\"toggleItalic.emit()\" [disabled]=\"disabled\" aria-pressed=\"{{isItalicActive}}\" [title]=\"i18n.italicTitle\"><i>I</i></button>}\r\n @if (cfg.showUnderline) {<button type=\"button\" class=\"stackch_rte__btn\" [class.is-active]=\"isUnderlineActive\" (mousedown)=\"onToolbarMouseDown($event)\" (click)=\"toggleUnderline.emit()\" [disabled]=\"disabled\" aria-pressed=\"{{isUnderlineActive}}\" [title]=\"i18n.underlineTitle\"><u>U</u></button>}\r\n <span class=\"stackch_rte__sep\"></span>\r\n\r\n @if (cfg.showLists) {\r\n <div class=\"stackch_rte__dropdown\">\r\n <button type=\"button\" class=\"stackch_rte__btn\" (click)=\"toggleListMenu.emit($event)\" [disabled]=\"disabled\" [title]=\"i18n.listsTitle\">☰ ▾</button>\r\n @if (uiState?.showListMenu) {\r\n <div class=\"stackch_rte__menu stackch_rte__menu--row\" (mousedown)=\"$event.stopPropagation()\">\r\n <button type=\"button\" class=\"stackch_rte__menu-item\" [title]=\"i18n.bulletListTitle\" (mousedown)=\"saveSelectionRequest.emit()\" (click)=\"pickList.emit('ul')\">{{ i18n.bulletListTitle }}</button>\r\n <button type=\"button\" class=\"stackch_rte__menu-item\" [title]=\"i18n.numberedListTitle\" (mousedown)=\"saveSelectionRequest.emit()\" (click)=\"pickList.emit('ol')\">{{ i18n.numberedListTitle }}</button>\r\n </div>\r\n }\r\n </div>\r\n }\r\n <span class=\"stackch_rte__sep\"></span>\r\n\r\n @if (cfg.showAlign) {\r\n <div class=\"stackch_rte__dropdown\">\r\n <button type=\"button\" class=\"stackch_rte__btn\" (click)=\"toggleAlignMenu.emit($event)\" [disabled]=\"disabled\" [title]=\"i18n.alignTitle\">≡ ▾</button>\r\n @if (uiState?.showAlignMenu) {\r\n <div class=\"stackch_rte__menu stackch_rte__menu--row\" (mousedown)=\"$event.stopPropagation()\">\r\n <button type=\"button\" class=\"stackch_rte__menu-item\" [title]=\"i18n.alignLeftTitle\" (click)=\"pickAlign.emit('left')\">\r\n <svg viewBox=\"0 0 18 18\" width=\"18\" height=\"18\" aria-hidden=\"true\">\r\n <line x1=\"2\" y1=\"4\" x2=\"14\" y2=\"4\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\"/>\r\n <line x1=\"2\" y1=\"9\" x2=\"12\" y2=\"9\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\"/>\r\n <line x1=\"2\" y1=\"14\" x2=\"16\" y2=\"14\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\"/>\r\n </svg>\r\n </button>\r\n <button type=\"button\" class=\"stackch_rte__menu-item\" [title]=\"i18n.alignCenterTitle\" (click)=\"pickAlign.emit('center')\">\r\n <svg viewBox=\"0 0 18 18\" width=\"18\" height=\"18\" aria-hidden=\"true\">\r\n <line x1=\"3\" y1=\"4\" x2=\"15\" y2=\"4\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\"/>\r\n <line x1=\"5\" y1=\"9\" x2=\"13\" y2=\"9\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\"/>\r\n <line x1=\"3\" y1=\"14\" x2=\"15\" y2=\"14\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\"/>\r\n </svg>\r\n </button>\r\n <button type=\"button\" class=\"stackch_rte__menu-item\" [title]=\"i18n.alignRightTitle\" (click)=\"pickAlign.emit('right')\">\r\n <svg viewBox=\"0 0 18 18\" width=\"18\" height=\"18\" aria-hidden=\"true\">\r\n <line x1=\"4\" y1=\"4\" x2=\"16\" y2=\"4\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\"/>\r\n <line x1=\"6\" y1=\"9\" x2=\"16\" y2=\"9\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\"/>\r\n <line x1=\"2\" y1=\"14\" x2=\"16\" y2=\"14\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\"/>\r\n </svg>\r\n </button>\r\n <button type=\"button\" class=\"stackch_rte__menu-item\" [title]=\"i18n.alignJustifyTitle\" (click)=\"pickAlign.emit('justify')\">\r\n <svg viewBox=\"0 0 18 18\" width=\"18\" height=\"18\" aria-hidden=\"true\">\r\n <line x1=\"2\" y1=\"4\" x2=\"16\" y2=\"4\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\"/>\r\n <line x1=\"2\" y1=\"9\" x2=\"16\" y2=\"9\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\"/>\r\n <line x1=\"2\" y1=\"14\" x2=\"16\" y2=\"14\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\"/>\r\n </svg>\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n }\r\n <span class=\"stackch_rte__sep\"></span>\r\n\r\n @if (cfg.showLink) {<button type=\"button\" class=\"stackch_rte__btn\" (click)=\"insertLink.emit()\" [disabled]=\"disabled\" [title]=\"i18n.linkTitle\">🔗</button>}\r\n @if (cfg.showRemoveFormat) {<button type=\"button\" class=\"stackch_rte__btn\" (click)=\"removeFormat.emit()\" [disabled]=\"disabled\" [title]=\"i18n.removeFormatTitle\">Tx</button>}\r\n</div>\r\n","import { Component, ElementRef, EventEmitter, forwardRef, HostListener, Input, Output, ViewChild, ChangeDetectorRef } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { StackchRichtextEditorToolbar } from './toolbar/stackch-richtext-editor-toolbar';\r\n\r\nexport class StackchRichtextEditorConfig {\r\n\t// Sichtbarkeit einzelner Toolbar-Elemente (Default: an)\r\n\tshowUndoRedo = true;\r\n\tshowFontPanel = true;\r\n\tshowHeading = true;\r\n\tshowSpacing = true;\r\n\tshowColor = true;\r\n\tshowBold = true;\r\n\tshowItalic = true;\r\n\tshowUnderline = true;\r\n\tshowLists = true;\r\n\tshowAlign = true;\r\n\tshowLink = true;\r\n\tshowRemoveFormat = true;\r\n\r\n\t// i18n overrides (partial), default is English\r\n\ti18n?: Partial<StackchRichtextEditorI18n>;\r\n} 1\r\n\r\nexport class StackchRichtextEditorI18n {\r\n\t// Generic\r\n\tplaceholder = 'Write…';\r\n\r\n\t// Toolbar titles\r\n\tundoTitle = 'Undo (Ctrl+Z)';\r\n\tredoTitle = 'Redo (Ctrl+Y)';\r\n\tfontPanelTitle = 'Font & Size';\r\n\tfontSectionTitle = 'Font';\r\n\tsizeSectionTitle = 'Size';\r\n\theadingTitle = 'Heading';\r\n\tspacingTitle = 'Spacing (Margin/Padding)';\r\n\tmarginTitle = 'Margin';\r\n\tpaddingTitle = 'Padding';\r\n\tcolorsTitle = 'Colors';\r\n\tcolorMenuTitle = 'Pick a color';\r\n\ttextColorTitle = 'Text color';\r\n\thighlightTitle = 'Highlight';\r\n\tboldTitle = 'Bold';\r\n\titalicTitle = 'Italic';\r\n\tunderlineTitle = 'Underline';\r\n\tlistsTitle = 'Lists';\r\n\tbulletListTitle = 'Bullet list';\r\n\tnumberedListTitle = 'Numbered list';\r\n\talignTitle = 'Alignment';\r\n\talignLeftTitle = 'Left';\r\n\talignCenterTitle = 'Center';\r\n\talignRightTitle = 'Right';\r\n\talignJustifyTitle = 'Justify';\r\n\tlinkTitle = 'Link';\r\n\tremoveFormatTitle = 'Remove format';\r\n\r\n\t// Heading menu labels\r\n\tparagraphLabel = 'Paragraph (P)';\r\n\tcodeLabel = 'Code (pre)';\r\n\th1Label = 'H1';\r\n\th2Label = 'H2';\r\n\th3Label = 'H3';\r\n\th4Label = 'H4';\r\n\th5Label = 'H5';\r\n\th6Label = 'H6';\r\n}\r\n\r\n// Predefined i18n bundles\r\n// Consumers can import these and pass via config.i18n to localize the toolbar/labels.\r\nexport const STACKCH_RTE_I18N_DE: Partial<StackchRichtextEditorI18n> = {\r\n\t// Generic\r\n\tplaceholder: 'Schreiben…',\r\n\r\n\t// Toolbar titles\r\n\tundoTitle: 'Rückgängig (Strg+Z)',\r\n\tredoTitle: 'Wiederholen (Strg+Y)',\r\n\tfontPanelTitle: 'Schrift & Größe',\r\n\tfontSectionTitle: 'Schrift',\r\n\tsizeSectionTitle: 'Größe',\r\n\theadingTitle: 'Überschrift',\r\n\tspacingTitle: 'Abstand (Außen/Innen)',\r\n\tmarginTitle: 'Außenabstand',\r\n\tpaddingTitle: 'Innenabstand',\r\n\tcolorsTitle: 'Farben',\r\n\tcolorMenuTitle: 'Farbe wählen',\r\n\ttextColorTitle: 'Textfarbe',\r\n\thighlightTitle: 'Hervorheben',\r\n\tboldTitle: 'Fett',\r\n\titalicTitle: 'Kursiv',\r\n\tunderlineTitle: 'Unterstreichen',\r\n\tlistsTitle: 'Listen',\r\n\tbulletListTitle: 'Aufzählung',\r\n\tnumberedListTitle: 'Nummeriert',\r\n\talignTitle: 'Ausrichtung',\r\n\talignLeftTitle: 'Links',\r\n\talignCenterTitle: 'Zentriert',\r\n\talignRightTitle: 'Rechts',\r\n\talignJustifyTitle: 'Blocksatz',\r\n\tlinkTitle: 'Link',\r\n\tremoveFormatTitle: 'Formatierung entfernen',\r\n\r\n\t// Heading menu labels\r\n\tparagraphLabel: 'Absatz (P)',\r\n\tcodeLabel: 'Code (pre)',\r\n\th1Label: 'H1',\r\n\th2Label: 'H2',\r\n\th3Label: 'H3',\r\n\th4Label: 'H4',\r\n\th5Label: 'H5',\r\n\th6Label: 'H6',\r\n};\r\n\r\nexport const STACKCH_RTE_I18N_FR: Partial<StackchRichtextEditorI18n> = {\r\n\t// Generic\r\n\tplaceholder: 'Écrire…',\r\n\r\n\t// Toolbar titles\r\n\tundoTitle: 'Annuler (Ctrl+Z)',\r\n\tredoTitle: 'Rétablir (Ctrl+Y)',\r\n\tfontPanelTitle: 'Police et taille',\r\n\tfontSectionTitle: 'Police',\r\n\tsizeSectionTitle: 'Taille',\r\n\theadingTitle: 'Titre',\r\n\tspacingTitle: 'Espacement (Marge/Remplissage)',\r\n\tmarginTitle: 'Marge',\r\n\tpaddingTitle: 'Remplissage',\r\n\tcolorsTitle: 'Couleurs',\r\n\tcolorMenuTitle: 'Choisir une couleur',\r\n\ttextColorTitle: 'Couleur du texte',\r\n\thighlightTitle: 'Surligner',\r\n\tboldTitle: 'Gras',\r\n\titalicTitle: 'Italique',\r\n\tunderlineTitle: 'Souligné',\r\n\tlistsTitle: 'Listes',\r\n\tbulletListTitle: 'Liste à puces',\r\n\tnumberedListTitle: 'Liste numérotée',\r\n\talignTitle: 'Alignement',\r\n\talignLeftTitle: 'Gauche',\r\n\talignCenterTitle: 'Centré',\r\n\talignRightTitle: 'Droite',\r\n\talignJustifyTitle: 'Justifié',\r\n\tlinkTitle: 'Lien',\r\n\tremoveFormatTitle: 'Effacer la mise en forme',\r\n\r\n\t// Heading menu labels\r\n\tparagraphLabel: 'Paragraphe (P)',\r\n\tcodeLabel: 'Code (pre)',\r\n\th1Label: 'H1',\r\n\th2Label: 'H2',\r\n\th3Label: 'H3',\r\n\th4Label: 'H4',\r\n\th5Label: 'H5',\r\n\th6Label: 'H6',\r\n};\r\n\r\nexport const STACKCH_RTE_I18N_IT: Partial<StackchRichtextEditorI18n> = {\r\n\t// Generic\r\n\tplaceholder: 'Scrivi…',\r\n\r\n\t// Toolbar titles\r\n\tundoTitle: 'Annulla (Ctrl+Z)',\r\n\tredoTitle: 'Ripristina (Ctrl+Y)',\r\n\tfontPanelTitle: 'Carattere e dimensione',\r\n\tfontSectionTitle: 'Carattere',\r\n\tsizeSectionTitle: 'Dimensione',\r\n\theadingTitle: 'Titolo',\r\n\tspacingTitle: 'Spaziatura (Margine/Riempimento)',\r\n\tmarginTitle: 'Margine',\r\n\tpaddingTitle: 'Riempimento',\r\n\tcolorsTitle: 'Colori',\r\n\tcolorMenuTitle: 'Scegli un colore',\r\n\ttextColorTitle: 'Colore del testo',\r\n\thighlightTitle: 'Evidenzia',\r\n\tboldTitle: 'Grassetto',\r\n\titalicTitle: 'Corsivo',\r\n\tunderlineTitle: 'Sottolineato',\r\n\tlistsTitle: 'Elenchi',\r\n\tbulletListTitle: 'Elenco puntato',\r\n\tnumberedListTitle: 'Elenco numerato',\r\n\talignTitle: 'Allineamento',\r\n\talignLeftTitle: 'Sinistra',\r\n\talignCenterTitle: 'Centrato',\r\n\talignRightTitle: 'Destra',\r\n\talignJustifyTitle: 'Giustificato',\r\n\tlinkTitle: 'Collegamento',\r\n\tremoveFormatTitle: 'Rimuovi formattazione',\r\n\r\n\t// Heading menu labels\r\n\tparagraphLabel: 'Paragrafo (P)',\r\n\tcodeLabel: 'Codice (pre)',\r\n\th1Label: 'H1',\r\n\th2Label: 'H2',\r\n\th3Label: 'H3',\r\n\th4Label: 'H4',\r\n\th5Label: 'H5',\r\n\th6Label: 'H6',\r\n};\r\n\r\n@Component({\r\n\tselector: 'stackch-richtext-editor',\r\n\tstandalone: true,\r\n\timports: [CommonModule, StackchRichtextEditorToolbar],\r\n\t\tproviders: [\r\n\t\t{\r\n\t\t\tprovide: NG_VALUE_ACCESSOR,\r\n\t\t\t\tuseExisting: forwardRef(() => StackchRichtextEditor),\r\n\t\t\tmulti: true,\r\n\t\t},\r\n\t],\r\n\ttemplateUrl: './stackch-richtext-editor.html',\r\n\tstyleUrls: ['./stackch-richtext-editor.scss']\r\n})\r\nexport class StackchRichtextEditor implements ControlValueAccessor {\r\n\t@Input() placeholder = '';\r\n\t@Input() showToolbar = true;\r\n\t@Input() fonts: string[] = [\r\n\t\t'Arial, Helvetica, sans-serif',\r\n\t\t'Georgia, serif',\r\n\t\t'Times New Roman, Times, serif',\r\n\t\t'Trebuchet MS, sans-serif',\r\n\t\t'Verdana, Geneva, sans-serif',\r\n\t\t'Courier New, Courier, monospace',\r\n\t\t'Monaco, monospace'\r\n\t];\r\n\t@Input() fontSizes: number[] = [12, 14, 16, 18, 20, 24, 28, 32];\r\n\r\n\r\n\t@Input() height?: number;\r\n\t@Input() minHeight = 160;\r\n\t@Input() maxHeight?: number;\r\n\r\n\t@Input() set disabled(value: boolean) { this._disabled = value; }\r\n\tget disabled() { return this._disabled; }\r\n\tprivate _disabled = false;\r\n\r\n\t@Output() valueChange = new EventEmitter<string>();\r\n\r\n\t@ViewChild('editor', { static: true }) editorRef!: ElementRef<HTMLDivElement>;\r\n\r\n\tconstructor(private cdr: ChangeDetectorRef) {}\r\n\r\n\t// Toolbar-Konfiguration (default: alles an). Wir halten die übergebene Referenz\r\n\t// und mergen Defaults im Getter, damit auch Eigenschaftsänderungen via ngModel sofort wirken.\r\n\t@Input() config?: Partial<StackchRichtextEditorConfig> | null;\r\n\tget cfg(): StackchRichtextEditorConfig {\r\n\t\treturn Object.assign(new StackchRichtextEditorConfig(), this.config || {});\r\n\t}\r\n\r\n\tget i18n(): StackchRichtextEditorI18n {\r\n\t\treturn Object.assign(new StackchRichtextEditorI18n(), this.cfg.i18n || {});\r\n\t}\r\n\r\n\tprivate onChange: (value: string) => void = () => {};\r\n\tonTouched: () => void = () => {};\r\n\tprivate savedRange: Range | null = null;\r\n\t// History (Undo/Redo)\r\n\tprivate history: Array<{ html: string; range: { startPath: number[]; startOffset: number; endPath: number[]; endOffset: number; } | null }> = [];\r\n\tprivate historyIndex = -1;\r\n\tprivate isRestoringHistory = false;\r\n\tprivate snapshotTimer: any = null;\r\n\t// UI state for compact dropdowns / panel\r\n\tshowFontMenu = false;\r\n\tshowSizeMenu = false;\r\n\tshowFontPanel = false;\r\n\tshowHeadingMenu = false;\r\n\tshowSpacingMenu = false;\r\n\tshowAlignMenu = false;\r\n\tshowColorMenu = false;\r\n\tshowListMenu = false;\r\n\r\n\t// Inline state flags for active buttons\r\n\tisBoldActive = false;\r\n\tisItalicActive = false;\r\n\tisUnderlineActive = false;\r\n\r\n\t// Selection helpers\r\n\tsaveSelection() {\r\n\t\tconst sel = window.getSelection();\r\n\t\tif (!sel || sel.rangeCount === 0) return;\r\n\t\tconst range = sel.getRangeAt(0);\r\n\t\tif (!this.isRangeInEditor(range)) return;\r\n\t\tthis.savedRange = range.cloneRange();\r\n\t\tthis.updateInlineStates();\r\n\t}\r\n\r\n\t// Prevent toolbar buttons from stealing focus from the editor while preserving selection\r\n\tonToolbarMouseDown(evt: Event) {\r\n\t\t// Keep focus on the editor to avoid persistent button focus outlines\r\n\t\tevt.preventDefault();\r\n\t\tevt.stopPropagation();\r\n\t\tthis.saveSelection();\r\n\t}\r\n\r\n\t// Beim Öffnen des Color-Pickers: Selektion sichern\r\n\tonColorPointerDown(_evt: Event) {\r\n\t\tthis.saveSelection();\r\n\t}\r\n\r\n\tprivate restoreSelection() {\r\n\t\tconst sel = window.getSelection();\r\n\t\tif (!sel || !this.savedRange) return;\r\n\t\tif (!this.isRangeInEditor(this.savedRange)) return;\r\n\t\tsel.removeAllRanges();\r\n\t\tsel.addRange(this.savedRange);\r\n\t}\r\n\r\n\tprivate isRangeInEditor(range: Range) {\r\n\t\tconst editor = this.editorRef?.nativeElement;\r\n\t\tif (!editor) return false;\r\n\t\tconst container = range.commonAncestorContainer;\r\n\t\tconst node = container.nodeType === Node.ELEMENT_NODE ? (container as Element) : container.parentElement;\r\n\t\treturn !!node && editor.contains(node);\r\n\t}\r\n\r\n\t// Update active-state on selection changes inside the editor\r\n\t@HostListener('document:selectionchange')\r\n\tonSelectionChange() {\r\n\t\tconst sel = window.getSelection();\r\n\t\tif (!sel || sel.rangeCount === 0) return;\r\n\t\tconst range = sel.getRangeAt(0);\r\n\t\tif (!this.isRangeInEditor(range)) return;\r\n\t\tthis.updateInlineStates();\r\n\t}\r\n\r\n\t// Close dropdowns when clicking anywhere in the document\r\n\t@HostListener('document:click')\r\n\tcloseMenus() {\r\n\t\tthis.showFontMenu = false;\r\n\t\tthis.showSizeMenu = false;\r\n\t\tthis.showFontPanel = false;\r\n\t\tthis.showHeadingMenu = false;\r\n\t\tthis.showSpacingMenu = false;\r\n\t\tthis.showAlignMenu = false;\r\n\t\tthis.showColorMenu = false;\r\n\t\tthis.showListMenu = false;\r\n\t}\r\n\r\n\t// Keyboard: Undo/Redo\r\n\t@HostListener('keydown', ['$event'])\r\n\tonKeydown(evt: KeyboardEvent) {\r\n\t\tconst isMac = navigator.platform.toLowerCase().includes('mac');\r\n\t\tconst mod = isMac ? evt.metaKey : evt.ctrlKey;\r\n\t\tif (mod && !evt.shiftKey && (evt.key === 'z' || evt.key === 'Z')) {\r\n\t\t\tevt.preventDefault();\r\n\t\t\tthis.undo();\r\n\t\t} else if (mod && (evt.key === 'y' || evt.key === 'Y' || (evt.shiftKey && (evt.key === 'z' || evt.key === 'Z')))) {\r\n\t\t\tevt.preventDefault();\r\n\t\t\tthis.redo();\r\n\t\t}\r\n\t}\r\n\r\n\ttoggleFontMenu(evt: Event) {\r\n\t\tthis.saveSelection();\r\n\t\tthis.showFontMenu = !this.showFontMenu;\r\n\t\tif (this.showFontMenu) this.showSizeMenu = false;\r\n\t\tevt.stopPropagation();\r\n\t}\r\n\r\n\ttoggleSizeMenu(evt: Event) {\r\n\t\tthis.saveSelection();\r\n\t\tthis.showSizeMenu = !this.showSizeMenu;\r\n\t\tif (this.showSizeMenu) this.showFontMenu = false;\r\n\t\tevt.stopPropagation();\r\n\t}\r\n\r\n\ttoggleFontPanel(evt: Event) {\r\n\t\tthis.saveSelection();\r\n\t\tthis.showFontPanel = !this.showFontPanel;\r\n\t\t// close others if open\r\n\t\tif (this.showFontPanel) {\r\n\t\t\tthis.showFontMenu = false;\r\n\t\t\tthis.showSizeMenu = false;\r\n\t\t\tthis.showHeadingMenu = false;\r\n\t\t\tthis.showSpacingMenu = false;\r\n\t\t\tthis.showAlignMenu = false;\r\n\t\t\tthis.showColorMenu = false;\r\n\t\t}\r\n\t\tevt.stopPropagation();\r\n\t}\r\n\r\n\ttoggleHeadingMenu(evt: Event) {\r\n\t\tthis.saveSelection();\r\n\t\tthis.showHeadingMenu = !this.showHeadingMenu;\r\n\t\tif (this.showHeadingMenu) {\r\n\t\t\tthis.showFontMenu = false;\r\n\t\t\tthis.showSizeMenu = false;\r\n\t\t\tthis.showFontPanel = false;\r\n\t\t\tthis.showSpacingMenu = false;\r\n\t\t\tthis.showAlignMenu = false;\r\n\t\t\tthis.showColorMenu = false;\r\n\t\t}\r\n\t\tevt.stopPropagation();\r\n\t}\r\n\r\n\ttoggleSpacingMenu(evt: Event) {\r\n\t\tthis.saveSelection();\r\n\t\tthis.showSpacingMenu = !this.showSpacingMenu;\r\n\t\tif (this.showSpacingMenu) {\r\n\t\t\tthis.showFontMenu = false;\r\n\t\t\tthis.showSizeMenu = false;\r\n\t\t\tthis.showFontPanel = false;\r\n\t\t\tthis.showHeadingMenu = false;\r\n\t\t\tthis.showAlignMenu = false;\r\n\t\t\tthis.showColorMenu = false;\r\n\t\t}\r\n\t\tevt.stopPropagation();\r\n\t}\r\n\r\n\ttoggleAlignMenu(evt: Event) {\r\n\t\tthis.saveSelection();\r\n\t\tthis.showAlignMenu = !this.showAlignMenu;\r\n\t\tif (this.showAlignMenu) {\r\n\t\t\tthis.showFontMenu = false;\r\n\t\t\tthis.showSizeMenu = false;\r\n\t\t\tthis.showFontPanel = false;\r\n\t\t\tthis.showHeadingMenu = false;\r\n\t\t\tthis.showSpacingMenu = false;\r\n\t\t\tthis.showColorMenu = false;\r\n\t\t\tthis.showListMenu = false;\r\n\t\t}\r\n\t\tevt.stopPropagation();\r\n\t}\r\n\r\n\ttoggleColorMenu(evt: Event) {\r\n\t\tthis.saveSelection();\r\n\t\tthis.showColorMenu = !this.showColorMenu;\r\n\t\tif (this.showColorMenu) {\r\n\t\t\tthis.showFontMenu = false;\r\n\t\t\tthis.showSizeMenu = false;\r\n\t\t\tthis.showFontPanel = false;\r\n\t\t\tthis.showHeadingMenu = false;\r\n\t\t\tthis.showSpacingMenu = false;\r\n\t\t\tthis.showAlignMenu = false;\r\n\t\t\tthis.showListMenu = false;\r\n\t\t}\r\n\t\tevt.stopPropagation();\r\n\t}\r\n\r\n\ttoggleListMenu(evt: Event) {\r\n\t\tthis.saveSelection();\r\n\t\tthis.showListMenu = !this.showListMenu;\r\n\t\tif (this.showListMenu) {\r\n\t\t\tthis.showFontMenu = false;\r\n\t\t\tthis.showSizeMenu = false;\r\n\t\t\tthis.showFontPanel = false;\r\n\t\t\tthis.showHeadingMenu = false;\r\n\t\t\tthis.showSpacingMenu = false;\r\n\t\t\tthis.showAlignMenu = false;\r\n\t\t\tthis.showColorMenu = false;\r\n\t\t}\r\n\t\tevt.stopPropagation();\r\n\t}\r\n\r\n\tonPickAlign(where: 'left' | 'center' | 'right' | 'justify') {\r\n\t\tthis.focusEditor();\r\n\t\tthis.restoreSelection();\r\n\t\tthis.alignBlocks(where);\r\n\t\tthis.showAlignMenu = false;\r\n\t\tthis.emitValue();\r\n\t\tthis.takeSnapshot('align');\r\n\t}\r\n\r\n\tonPickFont(font: string) {\r\n\t\tif (!font) return;\r\n\t\tthis.focusEditor();\r\n\t\tthis.restoreSelection();\r\n\t\tthis.applyInlineStyle('fontFamily', font);\r\n\t\tthis.showFontMenu = false;\r\n\t}\r\n\r\n\tonPickFontSize(size: number) {\r\n\t\tif (!Number.isFinite(size)) return;\r\n\t\tthis.focusEditor();\r\n\t\tthis.restoreSelection();\r\n\t\tthis.applyInlineStyle('fontSize', `${size}px`);\r\n\t\tthis.showSizeMenu = false;\r\n\t}\r\n\r\n\tonPickList(kind: 'ul' | 'ol') {\r\n\t\tthis.focusEditor();\r\n\t\tthis.restoreSelection();\r\n\t\tthis.toggleList(kind);\r\n\t\tthis.showListMenu = false;\r\n\t\tthis.emitValue();\r\n\t\tthis.takeSnapshot('list');\r\n\t}\r\n\r\n\tonPickHeading(tag: 'p' | 'pre' | 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6') {\r\n\t\tthis.focusEditor();\r\n\t\tthis.restoreSelection();\r\n\t\tthis.setHeading(tag);\r\n\t\tthis.showHeadingMenu = false;\r\n\t\tthis.emitValue();\r\n\t\tthis.takeSnapshot('heading');\r\n\t}\r\n\r\n\tonPickSpacing(kind: 'margin' | 'padding', target: 'all' | 'vertical' | 'horizontal', value: number) {\r\n\t\tthis.focusEditor();\r\n\t\tthis.restoreSelection();\r\n\t\t// Bevorzugt: direkt auf die Selektion anwenden (inline Wrapper)\r\n\t\tif (!this.applySpacingToSelection(kind, target, value)) {\r\n\t\t\t// Fallback: Block-Spacing, wenn Auswahl blockübergreifend ist\r\n\t\t\tthis.setBlockSpacing(kind, target, value);\r\n\t\t}\r\n\t\tthis.showSpacingMenu = false;\r\n\t\tthis.emitValue();\r\n\t\tthis.takeSnapshot('spacing');\r\n\t}\r\n\r\n\t// ControlValueAccessor\r\n\twriteValue(value: string | null): void {\r\n\t\tconst el = this.editorRef?.nativeElement;\r\n\t\tif (!el) return;\r\n\t\tel.innerHTML = value || '';\r\n\t\t// Initial snapshot nur einmal anlegen\r\n\t\tif (this.history.length === 0) {\r\n\t\t\tthis.takeSnapshot('init');\r\n\t\t}\r\n\t}\r\n\tregisterOnChange(fn: any): void { this.onChange = fn; }\r\n\tregisterOnTouched(fn: any): void { this.onTouched = fn; }\r\n\tsetDisabledState(isDisabled: boolean): void { this.disabled = isDisabled; }\r\n\r\n\t// Toolbar actions using document.execCommand (deprecated but broadly supported)\r\n\tcmd(command: string, value?: string) {\r\n\t\t// Restore last selection from editor before applying an action triggered by toolbar\r\n\t\tthis.focusEditor();\r\n\t\tthis.restoreSelection();\r\n\r\n\t\t// Bevorzugt: eigene Range-basierte Implementierungen\r\n\t\tswitch (command) {\r\n\t\t\tcase 'bold':\r\n\t\t\t\tthis.applyInlineStyleSmart('fontWeight', 'bold');\r\n\t\t\t\treturn;\r\n\t\t\tcase 'italic':\r\n\t\t\t\tthis.applyInlineStyleSmart('fontStyle', 'italic');\r\n\t\t\t\treturn;\r\n\t\t\tcase 'underline':\r\n\t\t\t\tthis.applyInlineStyleSmart('textDecoration', 'underline');\r\n\t\t\t\treturn;\r\n\t\t\tcase 'foreColor':\r\n\t\t\t\tthis.applyInlineStyle('color', value || '');\r\n\t\t\t\treturn;\r\n\t\t\tcase 'hiliteColor':\r\n\t\t\tcase 'backColor':\r\n\t\t\t\tthis.applyInlineStyle('backgroundColor', value || '');\r\n\t\t\t\treturn;\r\n\t\t\tcase 'createLink':\r\n\t\t\t\tif (value) {\r\n\t\t\t\t\tthis.wrapSelectionWith('a', { href: value });\r\n\t\t\t\t\tthis.emitValue();\r\n\t\t\t\t\tthis.takeSnapshot('link');\r\n\t\t\t\t}\r\n\t\t\t\treturn;\r\n\t\t\tcase 'insertText': {\r\n\t\t\t\tconst text = value ?? '';\r\n\t\t\t\tthis.insertTextAtSelection(text);\r\n\t\t\t\tthis.emitValue();\r\n\t\t\t\tthis.takeSnapshot('insertText');\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tcase 'insertUnorderedList':\r\n\t\t\t\tthis.toggleList('ul');\r\n\t\t\t\tthis.emitValue();\r\n\t\t\t\tthis.takeSnapshot('list');\r\n\t\t\t\treturn;\r\n\t\t\tcase 'insertOrderedList':\r\n\t\t\t\tthis.toggleList('ol');\r\n\t\t\t\tthis.emitValue();\r\n\t\t\t\tthis.takeSnapshot('list');\r\n\t\t\t\treturn;\r\n\t\t\tcase 'justifyLeft':\r\n\t\t\t\tthis.alignBlocks('left');\r\n\t\t\t\tthis.emitValue();\r\n\t\t\t\tthis.takeSnapshot('align');\r\n\t\t\t\treturn;\r\n\t\t\tcase 'justifyCenter':\r\n\t\t\t\tthis.alignBlocks('center');\r\n\t\t\t\tthis.emitValue();\r\n\t\t\t\tthis.takeSnapshot('align');\r\n\t\t\t\treturn;\r\n\t\t\tcase 'justifyRight':\r\n\t\t\t\tthis.alignBlocks('right');\r\n\t\t\t\tthis.emitValue();\r\n\t\t\t\tthis.takeSnapshot('align');\r\n\t\t\t\treturn;\r\n\t\t\tcase 'justifyFull':\r\n\t\t\t\tthis.alignBlocks('justify');\r\n\t\t\t\tthis.emitValue();\r\n\t\t\t\tthis.takeSnapshot('align');\r\n\t\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Fallback (deprecated): nur für Format entfernen / Links lösen als Übergang\r\n\t\ttry {\r\n\t\t\t// Hinweis im Dev-Mode ausgeben\r\n\t\t\tif (!('___rteWarned' in (this as any))) {\r\n\t\t\t\tconsole.warn('[richtext-editor] document.execCommand ist deprecated; Fallback wird nur für removeFormat/unlink verwendet.');\r\n\t\t\t\t(this as any).___rteWarned = true;\r\n\t\t\t}\r\n\t\t\tif (command === 'removeFormat' || command === 'unlink') {\r\n\t\t\t\tdocument.execCommand(command, false, value);\r\n\t\t\t}\r\n\t\t} catch {\r\n\t\t\t// Ignorieren, wenn nicht unterstützt\r\n\t\t}\r\n\t\tthis.emitValue();\r\n\t\tthis.takeSnapshot('fallback');\r\n\t}\r\n\r\n\tapplyFont(font: string) {\r\n\t\tif (!font) return;\r\n\t\tthis.applyInlineStyle('fontFamily', font);\r\n\t}\r\n\r\n\tapplyFontSize(sizePx: string) {\r\n\t\tif (!sizePx) return;\r\n\t\tconst size = Number(sizePx);\r\n\t\tif (!Number.isFinite(size)) return;\r\n\t\tthis.applyInlineStyle('fontSize', `${size}px`);\r\n\t}\r\n\r\n\tapplyColor(color: string) {\r\n\t\tthis.focusEditor();\r\n\t\tthis.restoreSelection();\r\n\t\tconst sel = window.getSelection();\r\n\t\tif (!sel || sel.rangeCount === 0) return;\r\n\t\tconst r = sel.getRangeAt(0);\r\n\t\tif (r.collapsed) {\r\n\t\t\t// Firefox/Edge: wenn keine explizite Auswahl, erweitere auf nächstes Wort\r\n\t\t\tthis.expandRangeToWord(r);\r\n\t\t}\r\n\t\tthis.applyInlineStyle('color', color);\r\n\t}\r\n\r\n\tapplyHighlight(color: string) {\r\n\t\tthis.focusEditor();\r\n\t\tthis.restoreSelection();\r\n\t\tconst sel = window.getSelection();\r\n\t\tif (!sel || sel.rangeCount === 0) return;\r\n\t\tconst r = sel.getRangeAt(0);\r\n\t\tif (r.collapsed) {\r\n\t\t\tthis.expandRangeToWord(r);\r\n\t\t}\r\n\t\t// Some browsers use 'hiliteColor', others 'backColor'\r\n\t\tthis.applyInlineStyle('backgroundColor', color);\r\n\t}\r\n\r\n\tprivate expandRangeToWord(range: Range) {\r\n\t\ttry {\r\n\t\t\tconst editor = this.editorRef.nativeElement;\r\n\t\t\tlet node: Node = range.startContainer;\r\n\t\t\tif (node.nodeType !== Node.TEXT_NODE) {\r\n\t\t\t\t// Versuche, einen Textknoten in der Nähe zu finden\r\n\t\t\t\tconst walker = document.createTreeWalker(editor, NodeFilter.SHOW_TEXT);\r\n\t\t\t\tlet found: Text | null = null;\r\n\t\t\t\twhile (walker.nextNode()) {\r\n\t\t\t\t\tconst n = walker.currentNode as Text;\r\n\t\t\t\t\tif (n.parentElement && editor.contains(n.parentElement)) { found = n; break; }\r\n\t\t\t\t}\r\n\t\t\t\tif (found) node = found;\r\n\t\t\t}\r\n\t\t\tconst text = node.nodeType === Node.TEXT_NODE ? (node as Text).data : '';\r\n\t\t\tlet start = 0, end = text.length;\r\n\t\t\t// einfache Wortgrenzen-Heuristik\r\n\t\t\tconst pos = range.startOffset;\r\n\t\t\tfor (let i = pos; i > 0; i--) { if (/\\s/.test(text[i-1])) { start = i; break; } }\r\n\t\t\tfor (let i = pos; i < text.length; i++) { if (/\\s/.test(text[i])) { end = i; break; } }\r\n\t\t\trange.setStart(node, start);\r\n\t\t\trange.setEnd(node, end);\r\n\t\t\tconst sel = window.getSelection();\r\n\t\t\tif (sel) { sel.removeAllRanges(); sel.addRange(range); }\r\n\t\t} catch { /* noop */ }\r\n\t}\r\n\r\n\r\n\r\n\tinsertLink() {\r\n\t\tconst url = prompt('Link-URL eingeben:', 'https://');\r\n\t\tif (url) {\r\n\t\t\tthis.cmd('createLink', url);\r\n\t\t}\r\n\t}\r\n\r\n\tremoveFormat() {\r\n\t\tthis.cmd('removeFormat');\r\n\t\tthis.cmd('unlink');\r\n\t}\r\n\r\n\tonInput() {\r\n\t\tthis.emitValue();\r\n\t\tthis.scheduleSnapshot();\r\n\t}\r\n\r\n\tonKeyup(_evt: KeyboardEvent) {\r\n\t\tthis.saveSelection();\r\n\t\tthis.emitValue();\r\n\t\tthis.updateInlineStates();\r\n\t}\r\n\r\n\tonPaste(evt: ClipboardEvent) {\r\n\t\t// Optional: Clean paste to plain text while keeping basic formatting minimal.\r\n\t\tif (!evt.clipboardData) return;\r\n\t\tevt.preventDefault();\r\n\t\tconst text = evt.clipboardData.getData('text/plain');\r\n\t\tthis.insertTextAtSelection(text);\r\n\t\tthis.emitValue();\r\n\t\tthis.takeSnapshot('paste');\r\n\t}\r\n\r\n\tprivate emitValue() {\r\n\t\t// Clean up empty style attributes and redundant spans before emitting\r\n\t\tthis.cleanupEmptyStylesAndSpans();\r\n\t\tconst val = this.editorRef.nativeElement.innerHTML;\r\n\t\tthis.onChange(val);\r\n\t\tthis.valueChange.emit(val);\r\n\t\tthis.updateInlineStates();\r\n\t}\r\n\r\n\t// Remove empty style attributes (style=\"\") and unwrap spans without any attributes\r\n\tprivate cleanupEmptyStylesAndSpans(root?: HTMLElement) {\r\n\t\tconst editor = root || this.editorRef.nativeElement;\r\n\t\tconst toUnwrap: HTMLElement[] = [];\r\n\t\tconst walker = document.createTreeWalker(editor, NodeFilter.SHOW_ELEMENT);\r\n\t\twhile (walker.nextNode()) {\r\n\t\t\tconst el = walker.currentNode as HTMLElement;\r\n\t\t\tif (el.hasAttribute('style')) {\r\n\t\t\t\t// If no style declarations remain, drop the attribute\r\n\t\t\t\tconst cssText = el.getAttribute('style') || '';\r\n\t\t\t\tconst byApiEmpty = (el.style ? el.style.length === 0 : false);\r\n\t\t\t\tconst normalized = cssText.replace(/[\\s;]/g, '');\r\n\t\t\t\tif (byApiEmpty || normalized.length === 0) {\r\n\t\t\t\t\tel.removeAttribute('style');\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t// Unwrap spans that have no attributes left\r\n\t\t\tif (el.tagName === 'SPAN' && el.attributes.length === 0) {\r\n\t\t\t\ttoUnwrap.push(el);\r\n\t\t\t}\r\n\t\t}\r\n\t\tfor (const span of toUnwrap) {\r\n\t\t\twhile (span.firstChild) span.parentNode?.insertBefore(span.firstChild, span);\r\n\t\t\tspan.remove();\r\n\t\t}\r\n\t}\r\n\r\n\t// History API\r\n\tget canUndo() { return this.historyIndex > 0; }\r\n\tget canRedo() { return this.historyIndex >= 0 && this.historyIndex < this.history.length - 1; }\r\n\r\n\tundo() {\r\n\t\tif (!this.canUndo) return;\r\n\t\tthis.applySnapshot(this.historyIndex - 1);\r\n\t}\r\n\r\n\tredo() {\r\n\t\tif (!this.canRedo) return;\r\n\t\tthis.applySnapshot(this.historyIndex + 1);\r\n\t}\r\n\r\n\tprivate scheduleSnapshot() {\r\n\t\tif (this.isRestoringHistory) return;\r\n\t\tif (this.snapshotTimer) clearTimeout(this.snapshotTimer);\r\n\t\tthis.snapshotTimer = setTimeout(() => this.takeSnapshot('input'), 250);\r\n\t}\r\n\r\n\tprivate takeSnapshot(_reason?: string) {\r\n\t\tif (this.isRestoringHistory) return;\r\n\t\tconst editor = this.editorRef.nativeElement;\r\n\t\tconst html = editor.innerHTML;\r\n\t\tconst sel = window.getSelection();\r\n\t\tlet rangeData: { startPath: number[]; startOffset: number; endPath: number[]; endOffset: number; } | null = null;\r\n\t\tif (sel && sel.rangeCount > 0) {\r\n\t\t\tconst r = sel.getRangeAt(0);\r\n\t\t\tif (this.isRangeInEditor(r)) {\r\n\t\t\t\tconst ser = this.serializeRange(r);\r\n\t\t\t\tif (ser) rangeData = ser;\r\n\t\t\t}\r\n\t\t}\r\n\t\t// Verhindere Duplikate nacheinander\r\n\t\tconst last = this.history[this.historyIndex];\r\n\t\tif (last && last.html === html) return;\r\n\t\t// Zukunft verwerfen bei neuem Snapshot\r\n\t\tif (this.historyIndex < this.history.length - 1) {\r\n\t\t\tthis.history = this.history.slice(0, this.historyIndex + 1);\r\n\t\t}\r\n\t\tthis.history.push({ html, range: rangeData });\r\n\t\tthis.historyIndex = this.history.length - 1;\r\n\t\t// Begrenze Historie\r\n\t\tconst MAX = 50;\r\n\t\tif (this.history.length > MAX) {\r\n\t\t\tconst drop = this.history.length - MAX;\r\n\t\t\tthis.history.splice(0, drop);\r\n\t\t\tthis.historyIndex -= drop;\r\n\t\t\tif (this.historyIndex < 0) this.historyIndex = 0;\r\n\t\t}\r\n\t}\r\n\r\n\tprivate applySnapshot(index: number) {\r\n\t\tif (index < 0 || index >= this.history.length) return;\r\n\t\tconst snap = this.history[index];\r\n\t\tconst editor = this.editorRef.nativeElement;\r\n\t\tthis.isRestoringHistory = true;\r\n\t\teditor.innerHTML = snap.html;\r\n\t\t// Selektion wiederherstellen\r\n\t\tif (snap.range) {\r\n\t\t\tthis.restoreSerializedRange(snap.range);\r\n\t\t} else {\r\n\t\t\t// Cursor ans Ende\r\n\t\t\tconst sel = window.getSelection();\r\n\t\t\tif (sel) {\r\n\t\t\t\tsel.removeAllRanges();\r\n\t\t\t\tconst r = document.createRange();\r\n\t\t\t\tr.selectNodeContents(editor);\r\n\t\t\t\tr.collapse(false);\r\n\t\t\t\tsel.addRange(r);\r\n\t\t\t}\r\n\t\t}\r\n\t\tthis.historyIndex = index;\r\n\t\tthis.isRestoringHistory = false;\r\n\t\t// Werte emittieren nach Restore\r\n\t\tthis.emitValue();\r\n\t}\r\n\r\n\tprivate serializeRange(range: Range) {\r\n\t\tconst s = this.nodePathFromNode(range.startContainer);\r\n\t\tconst e = this.nodePathFromNode(range.endContainer);\r\n\t\tif (!s || !e) return null;\r\n\t\treturn {\r\n\t\t\tstartPath: s,\r\n\t\t\tstartOffset: range.startOffset,\r\n\t\t\tendPath: e,\r\n\t\t\tendOffset: range.endOffset,\r\n\t\t};\r\n\t}\r\n\r\n\tprivate restoreSerializedRange(data: { startPath: number[]; startOffset: number; endPath: number[]; endOffset: number; }) {\r\n\t\tconst editor = this.editorRef.nativeElement;\r\n\t\tconst startNode = this.nodeFromPath(data.startPath);\r\n\t\tconst endNode = this.nodeFromPath(data.endPath);\r\n\t\tif (!startNode || !endNode) return;\r\n\t\tconst r = document.createRange();\r\n\t\ttry {\r\n\t\t\tr.setStart(startNode, Math.min(data.startOffset, this.maxOffset(startNode)));\r\n\t\t\tr.setEnd(endNode, Math.min(data.endOffset, this.maxOffset(endNode)));\r\n\t\t} catch {\r\n\t\t\tr.selectNodeContents(editor);\r\n\t\t\tr.collapse(false);\r\n\t\t}\r\n\t\tconst sel = window.getSelection();\r\n\t\tif (sel) { sel.removeAllRanges(); sel.addRange(r); }\r\n\t}\r\n\r\n\tprivate nodePathFromNode(node: Node): number[] | null {\r\n\t\tconst editor = this.editorRef.nativeElement;\r\n\t\tconst path: number[] = [];\r\n\t\tlet n: Node | null = node;\r\n\t\twhile (n && n !== editor) {\r\n\t\t\tconst pnode = n.parentNode as (Node & ParentNode) | null;\r\n\t\t\tif (!pnode) return null;\r\n\t\t\tconst idx = Array.prototype.indexOf.call(pnode.childNodes, n);\r\n\t\t\tpath.push(idx);\r\n\t\t\tn = pnode;\r\n\t\t}\r\n\t\tif (n !== editor) return null;\r\n\t\tpath.reverse();\r\n\t\treturn path;\r\n\t}\r\n\r\n\tprivate nodeFromPath(path: number[]): Node | null {\r\n\t\tconst editor = this.editorRef.nativeElement;\r\n\t\tlet n: Node = editor;\r\n\t\tfor (const idx of path) {\r\n\t\t\tif (!n.childNodes || idx < 0 || idx >= n.childNodes.length) return null;\r\n\t\t\tn = n.childNodes[idx];\r\n\t\t}\r\n\t\treturn n;\r\n\t}\r\n\r\n\tprivate maxOffset(node: Node): number {\r\n\t\tif (node.nodeType === Node.TEXT_NODE) return (node as Text).data.length;\r\n\t\treturn node.childNodes.length;\r\n\t}\r\n\r\n\tprivate focusEditor() {\r\n\t\tconst el = this.editorRef.nativeElement;\r\n\t\tif (document.activeElement !== el) {\r\n\t\t\tel.focus();\r\n\t\t}\r\n\t}\r\n\r\n\t// Minimal inline style applier for inline styles\r\n\tprivate applyInlineStyle(\r\n\t\tcssProp: 'fontFamily' | 'fontSize' | 'color' | 'backgroundColor' | 'fontWeight' | 'fontStyle' | 'textDecoration',\r\n\t\tvalue: string\r\n\t) {\r\n\t\tthis.focusEditor();\r\n\t\tthis.restoreSelection();\r\n\t\tconst sel = window.getSelection();\r\n\t\tif (!sel || sel.rangeCount === 0) return;\r\n\t\tconst range = sel.getRangeAt(0);\r\n\t\tif (range.collapsed) return;\r\n\r\n\t\tconst span = document.createElement('span');\r\n\t\t(span.style as any)[cssProp] = value;\r\n\t\t// Robuster als surroundContents: extract + wrap + insert\r\n\t\tconst frag = range.extractContents();\r\n\t\tspan.appendChild(frag);\r\n\t\trange.insertNode(span);\r\n\t\t// Cursor hinter das eingefügte Element setzen\r\n\t\tsel.removeAllRanges();\r\n\t\tconst after = document.createRange();\r\n\t\tafter.setStartAfter(span);\r\n\t\tafter.collapse(true);\r\n\t\tsel.addRange(after);\r\n\t\tthis.emitValue();\r\n\t\tthis.takeSnapshot('style');\r\n\t}\r\n\r\n\tprivate applyInlineStyleSmart(\r\n\t\tcssProp: 'fontFamily' | 'fontSize' | 'color' | 'backgroundColor' | 'fontWeight' | 'fontStyle' | 'textDecoration',\r\n\t\tvalue: string\r\n\t) {\r\n\t\tthis.focusEditor();\r\n\t\tthis.restoreSelection();\r\n\t\tconst sel = window.getSelection();\r\n\t\tif (!sel || sel.rangeCount === 0) return;\r\n\t\tconst range = sel.getRangeAt(0);\r\n\t\tif (range.collapsed) return;\r\n\r\n\t\tconst isBlockTag = (tag: string) => /^(P|DIV|PRE|H1|H2|H3|H4|H5|H6|LI|TD|TH)$/i.test(tag);\r\n\t\tconst getBlockAncestor = (node: Node): HTMLElement | null => {\r\n\t\t\tconst editor = this.editorRef.nativeElement;\r\n\t\t\tlet el: HTMLElement | null = node.nodeType === Node.ELEMENT_NODE ? node as HTMLElement : node.parentElement;\r\n\t\t\twhile (el && el !== editor && !isBlockTag(el.tagName)) el = el.parentElement;\r\n\t\t\treturn (el && el !== editor) ? el : null;\r\n\t\t};\r\n\r\n\t\tconst startBlock = getBlockAncestor(range.startContainer);\r\n\t\tconst endBlock = getBlockAncestor(range.endContainer);\r\n\t\tconst crossesBlocks = !!startBlock && !!endBlock && startBlock !== endBlock;\r\n\r\n\t\tif (!crossesBlocks) {\r\n\t\t\t// Single block selection: keep using inline wrapper for precise range\r\n\t\t\tthis.applyInlineStyle(cssProp, value);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Multi-block selection: apply style to each intersecting block element (avoid invalid span structure)\r\n\t\tconst common: Element = range.commonAncestorContainer.nodeType === Node.ELEMENT_NODE\r\n\t\t\t? range.commonAncestorContainer as Element\r\n\t\t\t: (range.commonAncestorContainer.parentElement || this.editorRef.nativeElement);\r\n\t\tconst walker = document.createTreeWalker(common, NodeFilter.SHOW_ELEMENT);\r\n\t\tconst styled = new Set<HTMLElement>();\r\n\t\twhile (walker.nextNode()) {\r\n\t\t\tconst el = walker.currentNode as HTMLElement;\r\n\t\t\tif (!isBlockTag(el.tagName)) continue;\r\n\t\t\ttry { if ((range as any).intersectsNode && range.intersectsNode(el)) styled.add(el); } catch {}\r\n\t\t}\r\n\t\tfor (const el of styled) {\r\n\t\t\t(el.style as any)[cssProp] = value;\r\n\t\t}\r\n\t\tthis.emitValue();\r\n\t\tthis.takeSnapshot('style-blocks');\r\n\t}\r\n\r\n\tprivate getIntersectingBlocks(range: Range): HTMLElement[] {\r\n\t\tconst isBlockTag = (tag: string) => /^(P|DIV|PRE|H1|H2|H3|H4|H5|H6|LI|TD|TH)$/i.test(tag);\r\n\t\tconst common: Element = range.commonAncestorContainer.nodeType === Node.ELEMENT_NODE\r\n\t\t\t? range.commonAncestorContainer as Element\r\n\t\t\t: (range.commonAncestorContainer.parentElement || this.editorRef.nativeElement);\r\n\t\tconst walker = document.createTreeWalker(common, NodeFilter.SHOW_ELEMENT);\r\n\t\tconst blocks: HTMLElement[] = [];\r\n\t\twhile (walker.nextNode()) {\r\n\t\t\tconst el = walker.currentNode as HTMLElement;\r\n\t\t\tif (!isBlockTag(el.tagName)) continue;\r\n\t\t\ttry { if ((range as any).intersectsNode && range.intersectsNode(el)) blocks.push(el); } catch {}\r\n\t\t}\r\n\t\treturn blocks;\r\n\t}\r\n\r\n\t// Variant of applyInlineStyle that returns the created span and does not emit/snapshot by itself\r\n\tprivate wrapSelectionInline(\r\n\t\tcssProp: 'fontFamily' | 'fontSize' | 'color' | 'backgroundColor' | 'fontWeight' | 'fontStyle' | 'textDecoration',\r\n\t\tvalue: string\r\n\t): HTMLElement | null {\r\n\t\tthis.focusEditor();\r\n\t\tthis.restoreSelection();\r\n\t\tconst sel = window.getSelection();\r\n\t\tif (!sel || sel.rangeCount === 0) return null;\r\n\t\tconst range = sel.getRangeAt(0);\r\n\t\tif (range.collapsed) return null;\r\n\r\n\t\tconst span = document.createElement('span');\r\n\t\t(span.style as any)[cssProp] = value;\r\n\t\tconst frag = range.extractContents();\r\n\t\tspan.appendChild(frag);\r\n\t\trange.insertNode(span);\r\n\t\t// Restore selection just after for continuity\r\n\t\tsel.removeAllRanges();\r\n\t\tconst after = document.createRange();\r\n\t\tafter.setStartAfter(span);\r\n\t\tafter.collapse(true);\r\n\t\tsel.addRange(after);\r\n\t\treturn span;\r\n\t}\r\n\r\n\tprivate isBoldCarrier(el: HTMLElement | null): boolean {\r\n\t\tif (!el) return false;\r\n\t\tconst tag = el.tagName;\r\n\t\tif (tag === 'B' || tag === 'STRONG') return true;\r\n\t\tconst fw = el.style?.fontWeight || '';\r\n\t\tif (fw && fw !== 'normal' && fw !== '400') return true;\r\n\t\treturn false;\r\n\t}\r\n\r\n\tprivate boldAncestorContainingRange(range: Range): HTMLElement | null {\r\n\t\tlet el: HTMLElement | null = range.commonAncestorContainer.nodeType === Node.ELEMENT_NODE\r\n\t\t\t? (range.commonAncestorContainer as HTMLElement)\r\n\t\t\t: range.commonAncestorContainer.parentElement;\r\n\t\tconst editor = this.editorRef.nativeElement;\r\n\t\twhile (el && el !== editor) {\r\n\t\t\tif (this.isBoldCarrier(el)) {\r\n\t\t\t\t// ensure el contains both boundary containers fully\r\n\t\t\t\tconst sc = range.startContainer;\r\n\t\t\t\tconst ec = range.endContainer;\r\n\t\t\t\tif (el.contains(sc) && el.contains(ec)) return el;\r\n\t\t\t}\r\n\t\t\tel = el.parentElement;\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n\r\n\tprivate ancestorContainingRange(range: Range, isCarrier: (el: HTMLElement) => boolean): HTMLElement | null {\r\n\t\tlet el: HTMLElement | null = range.commonAncestorContainer.nodeType === Node.ELEMENT_NODE\r\n\t\t\t? (range.commonAncestorContainer as HTMLElement)\r\n\t\t\t: range.commonAncestorContainer.parentElement;\r\n\t\tconst editor = this.editorRef.nativeElement;\r\n\t\twhile (el && el !== editor) {\r\n\t\t\tif (isCarrier(el)) {\r\n\t\t\t\tconst sc = range.startContainer;\r\n\t\t\t\tconst ec = range.endContainer;\r\n\t\t\t\tif (el.contains(sc) && el.contains(ec)) return el;\r\n\t\t\t}\r\n\t\t\tel = el.parentElement;\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n\r\n\tprivate splitCarrierAroundSelection(range: Range, carrier: HTMLElement) {\r\n\t\tconst parent = carrier.parentNode as Node & ParentNode;\r\n\t\tif (!parent) return;\r\n\t\tconst rRight = document.createRange();\r\n\t\trRight.setStart(range.endContainer, range.endOffset);\r\n\t\trightGuard(carrier, rRight);\r\n\t\tconst rightFrag = rRight.extractContents();\r\n\t\tconst rLeft = document.createRange();\r\n\t\trLeft.setStart(carrier, 0);\r\n\t\tleftGuard(range, rLeft);\r\n\t\tconst leftFrag = rLeft.extractContents();\r\n\t\tif (leftFrag.childNodes.length) {\r\n\t\t\tconst leftClone = carrier.cloneNode(false) as HTMLElement;\r\n\t\t\tleftClone.appendChild(leftFrag);\r\n\t\t\tparent.insertBefore(leftClone, carrier);\r\n\t\t}\r\n\t\tlet insertAfterRef: ChildNode = carrier;\r\n\t\tif (rightFrag.childNodes.length) {\r\n\t\t\tconst rightClone = carrier.cloneNode(false) as HTMLElement;\r\n\t\t\trightClone.appendChild(rightFrag);\r\n\t\t\tparent.insertBefore(rightClone, carrier.nextSibling);\r\n\t\t\tinsertAfterRef = rightClone;\r\n\t\t}\r\n\t\twhile (carrier.firstChild) parent.insertBefore(carrier.firstChild, insertAfterRef);\r\n\t\tcarrier.remove();\r\n\r\n\t\tfunction rightGuard(node: HTMLElement, r: Range) {\r\n\t\t\ttry { r.setEnd(node, node.childNodes.length); } catch {}\r\n\t\t}\r\n\t\tfunction leftGuard(rng: Range, r: Range) {\r\n\t\t\ttry { r.setEnd(rng.startContainer, rng.startOffset); } catch {}\r\n\t\t}\r\n\t}\r\n\r\n\t// Unwrap bold formatting only for the selected content inside a containing bold ancestor by splitting it into left/selection/right parts\r\n\tprivate deselectBoldBySplitting(range: Range): boolean {\r\n\t\tconst ancestor = this.boldAncestorContainingRange(range);\r\n\t\tif (!ancestor) return false;\r\n\t\tthis.splitCarrierAroundSelection(range, ancestor);\r\n\t\treturn true;\r\n\t}\r\n\r\n\tprivate deselectItalicBySplitting(range: Range): boolean {\r\n\t\tconst anc = this.ancestorContainingRange(range, el => this.isItalicCarrier(el));\r\n\t\tif (!anc) return false;\r\n\t\tthis.splitCarrierAroundSelection(range, anc);\r\n\t\treturn true;\r\n\t}\r\n\r\n\tprivate deselectUnderlineBySplitting(range: Range): boolean {\r\n\t\tconst anc = this.ancestorContainingRange(range, el => this.isUnderlineCarrier(el));\r\n\t\tif (!anc) return false;\r\n\t\tthis.splitCarrierAroundSelection(range, anc);\r\n\t\treturn true;\r\n\t}\r\n\r\n\tprivate cleanupEmptyItalicSpans(root: HTMLElement) {\r\n\t\tconst toRemove: HTMLElement[] = [];\r\n\t\tconst walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT);\r\n\t\twhile (walker.nextNode()) {\r\n\t\t\tconst el = walker.currentNode as HTMLElement;\r\n\t\t\tconst isItalic = (el.tagName === 'I' || el.tagName === 'EM' || (el.tagName === 'SPAN' && el.style.fontStyle && el.style.fontStyle !== 'normal'));\r\n\t\t\tif (!isItalic) continue;\r\n\t\t\tconst text = el.textContent ?? '';\r\n\t\t\tconst normalized = text.replace(/[\\u00A0\\u200B\\s]/g, '');\r\n\t\t\tconst onlyWhitespace = !el.firstChild || (normalized.length === 0 && el.querySelectorAll('*').length === 0);\r\n\t\t\tif (onlyWhitespace) toRemove.push(el);\r\n\t\t}\r\n\t\tfor (const el of toRemove) el.remove();\r\n\t}\r\n\r\n\tprivate cleanupEmptyUnderlineSpans(root: HTMLElement) {\r\n\t\tconst toRemove: HTMLElement[] = [];\r\n\t\tconst walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT);\r\n\t\twhile (walker.nextNode()) {\r\n\t\t\tconst el = walker.currentNode as HTMLElement;\r\n\t\t\tconst isU = (el.tagName === 'U' || (el.tagName === 'SPAN' && typeof (el.style as any).textDecoration === 'string' && (el.style as any).textDecoration.includes('underline')));\r\n\t\t\tif (!isU) continue;\r\n\t\t\tconst text = el.textContent ?? '';\r\n\t\t\tconst normalized = text.replace(/[\\u00A0\\u200B\\s]/g, '');\r\n\t\t\tconst onlyWhitespace = !el.firstChild || (normalized.length === 0 && el.querySelectorAll('*').length === 0);\r\n\t\t\tif (onlyWhitespace) toRemove.push(el);\r\n\t\t}\r\n\t\tfor (const el of toRemove) el.remove();\r\n\t}\r\n\r\n\t// Remove bold wrappers and inline font-weight style inside a container\r\n\tprivate stripBoldWithin(container: HTMLElement) {\r\n\t\tconst toProcess: HTMLElement[] = [];\r\n\t\tconst walker = document.createTreeWalker(container, NodeFilter.SHOW_ELEMENT);\r\n\t\twhile (walker.nextNode()) {\r\n\t\t\ttoProcess.push(walker.currentNode as HTMLElement);\r\n\t\t}\r\n\t\tfor (const el of toProcess) {\r\n\t\t\tif (el.tagName === 'B' || el.tagName === 'STRONG') {\r\n\t\t\t\twhile (el.firstChild) el.parentNode?.insertBefore(el.firstChild, el);\r\n\t\t\t\tel.remove();\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tif (el.tagName === 'SPAN') {\r\n\t\t\t\tif (el.style.fontWeight) el.style.removeProperty('font-weight');\r\n\t\t\t\t// Clean empty style spans\r\n\t\t\t\tif (!el.getAttribute('style')) {\r\n\t\t\t\t\twhile (el.firstChild) el.parentNode?.insertBefore(el.firstChild, el);\r\n\t\t\t\t\tel.remove();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// Pull the given node out of any bold carrier ancestors by splitting them around the node\r\n\tprivate liftOutOfBoldAncestors(node: HTMLElement) {\r\n\t\tconst editor = this.editorRef.nativeElement;\r\n\t\tlet currentBold = this.findClosest(node, 'b,strong,span[style*=\"font-weight\"]') as HTMLElement | null;\r\n\t\twhile (currentBold && currentBold !== editor) {\r\n\t\t\tthis.splitOutOfAncestor(currentBold, node);\r\n\t\t\tcurrentBold = this.findClosest(node, 'b,strong,span[style*=\"font-weight\"]') as HTMLElement | null;\r\n\t\t}\r\n\t}\r\n\r\n\t// Split arbitrary ancestor element so that `node` becomes a sibling outside of it, preserving order even if `node` is nested deeply\r\n\tprivate splitOutOfAncestor(ancestor: HTMLElement, node: HTMLElement) {\r\n\t\t// First, climb from node up to direct child of ancestor, splitting wrappers after `node` at each level\r\n\t\tlet child: HTMLElement = node;\r\n\t\tlet parent = child.parentElement as HTMLElement | null;\r\n\t\twhile (parent && parent !== ancestor) {\r\n\t\t\tconst right = parent.cloneNode(false) as HTMLElement;\r\n\t\t\t// move siblings after `child` into right clone\r\n\t\t\twhile (child.nextSibling) right.appendChild(child.nextSibling);\r\n\t\t\t// insert right after parent\r\n\t\t\tparent.after(right);\r\n\t\t\t// ascend\r\n\t\t\tchild = parent;\r\n\t\t\tparent = child.parentElement as HTMLElement | null;\r\n\t\t}\r\n\t\tif (!parent) return;\r\n\t\t// Now `child` is a direct child of ancestor\r\n\t\tconst before = ancestor.cloneNode(false) as HTMLElement;\r\n\t\twhile (ancestor.firstChild && ancestor.firstChild !== child) {\r\n\t\t\tbefore.appendChild(ancestor.firstChild);\r\n\t\t}\r\n\t\tconst after = ancestor.cloneNode(false) as HTMLElement;\r\n\t\twhile (child.nextSibling) after.appendChild(child.nextSibling);\r\n\t\tconst gp = ancestor.parentNode as Node & ParentNode;\r\n\t\tif (!gp) return;\r\n\t\tif (before.childNodes.length) gp.insertBefore(before, ancestor);\r\n\t\t// move node out, place where ancestor was\r\n\t\tgp.insertBefore(node, ancestor);\r\n\t\tif (after.childNodes.length) gp.insertBefore(after, ancestor);\r\n\t\tancestor.remove();\r\n\t}\r\n\r\n\tprivate cleanupEmptyBoldSpans(root: HTMLElement) {\r\n\t\tconst toRemove: HTMLElement[] = [];\r\n\t\tconst walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT);\r\n\t\twhile (walker.nextNode()) {\r\n\t\t\tconst el = walker.currentNode as HTMLElement;\r\n\t\t\tconst isBoldEl = (el.tagName === 'B' || el.tagName === 'STRONG' || (el.tagName === 'SPAN' && el.style.fontWeight && el.style.fontWeight !== 'normal' && el.style.fontWeight !== '400'));\r\n\t\t\tif (!isBoldEl) continue;\r\n\t\t\t// remove if no children or only whitespace (including NBSP \\u00A0 and zero-width space \\u200B)\r\n\t\t\tconst text = el.textContent ?? '';\r\n\t\t\tconst normalized = text.replace(/[\\u00A0\\u200B\\s]/g, '');\r\n\t\t\tconst onlyWhitespace = !el.firstChild || (normalized.length === 0 && el.querySelectorAll('*').length === 0);\r\n\t\t\tif (onlyWhitespace) {\r\n\t\t\t\ttoRemove.push(el);\r\n\t\t\t}\r\n\t\t}\r\n\t\tfor (const el of toRemove) el.remove();\r\n\t}\r\n\r\n\tprivate maybeUnwrapNormalSpan(span: HTMLElement) {\r\n\t\tif (span.tagName !== 'SPAN') return;\r\n\t\t// If no bold applies from ancestors, drop the 400 style and unwrap if style empty\r\n\t\tconst hasBoldAbove = this.isNodeBold(span.parentElement);\r\n\t\tif (!hasBoldAbove) {\r\n\t\t\tif (span.style.fontWeight === '400') span.style.removeProperty('font-weight');\r\n\t\t\tif (!span.getAttribute('style')) {\r\n\t\t\t\twhile (span.firstChild) span.parentNode?.insertBefore(span.firstChild, span);\r\n\t\t\t\tspan.remove();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tprivate wrapSelectionWith(tag: 'a' | 'span', attrs?: Record<string, string>) {\r\n\t\tconst sel = window.getSelection();\r\n\t\tif (!sel || sel.rangeCount === 0) return;\r\n\t\tconst range = sel.getRangeAt(0);\r\n\t\tif (range.collapsed) return;\r\n\r\n\t\tconst el = document.createElement(tag);\r\n\t\tif (attrs) {\r\n\t\t\tfor (const [k, v] of Object.entries(attrs)) {\r\n\t\t\t\tif (v != null) el.setAttribute(k, v);\r\n\t\t\t}\r\n\t\t}\r\n\t\tconst frag = range.extractContents();\r\n\t\tel.appendChild(frag);\r\n\t\trange.insertNode(el);\r\n\r\n\t\t// Auswahl hinter das Element setzen\r\n\t\tsel.removeAllRanges();\r\n\t\tconst after = document.createRange();\r\n\t\tafter.setStartAfter(el);\r\n\t\tafter.collapse(true);\r\n\t\tsel.addRange(after);\r\n\t}\r\n\r\n\tprivate insertTextAtSelection(text: string) {\r\n\t\tconst sel = window.getSelection();\r\n\t\tif (!sel || sel.rangeCount === 0) return;\r\n\t\tconst range = sel.getRangeAt(0);\r\n\t\trange.deleteContents();\r\n\t\tconst node = document.createTextNode(text);\r\n\t\trange.insertNode(node);\r\n\t\t// Cursor ans Ende des eingefügten Textes\r\n\t\tsel.removeAllRanges();\r\n\t\tconst after = document.createRange();\r\n\t\tafter.setStartAfter(node);\r\n\t\tafter.collapse(true);\r\n\t\tsel.addRange(after);\r\n\t}\r\n\r\n\t// ----- Inline toggle logic (Bold/Italic/Underline) -----\r\n\r\n\tprivate updateInlineStates() {\r\n\t\tconst sel = window.getSelection();\r\n\t\tif (!sel || sel.rangeCount === 0) { this.isBoldActive = this.isItalicActive = this.isUnderlineActive = false; return; }\r\n\t\tconst range = sel.getRangeAt(0);\r\n\t\tif (!this.isRangeInEditor(range)) { this.isBoldActive = this.isItalicActive = this.isUnderlineActive = false; return; }\r\n\t\tif (range.collapsed) {\r\n\t\t\tconst node = range.startContainer.nodeType === Node.ELEMENT_NODE ? (range.startContainer as HTMLElement) : range.startContainer.parentElement;\r\n\t\t\tthis.isBoldActive = this.isNodeBold(node);\r\n\t\t\tthis.isItalicActive = this.isNodeItalic(node);\r\n\t\t\tthis.isUnderlineActive = this.isNodeUnderline(node);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tthis.isBoldActive = this.computeBoldAnyForRange(range);\r\n\t\tthis.isItalicActive = this.computeItalicAnyForRange(range);\r\n\t\tthis.isUnderlineActive = this.computeUnderlineAnyForRange(range);\r\n\t\t// ensure UI reflects changes immediately\r\n\t\ttry { this.cdr.detectChanges(); } catch {}\r\n\t}\r\n\r\n\tprivate computeBoldAnyForRange(range: Range): boolean {\r\n\t\tconst editor = this.editorRef.nativeElement;\r\n\t\tconst root: Element = (this.editorRef.nativeElement as Element);\r\n\t\tconst walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT);\r\n\t\twhile (walker.nextNode()) {\r\n\t\t\tconst n = walker.currentNode as Text;\r\n\t\t\tif (!n.data.trim()) continue;\r\n\t\t\ttry { if (range.intersectsNode(n)) { if (this.isNodeBold(n.parentElement)) return true; } } catch {}\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tprivate computeItalicAnyForRange(range: Range): boolean {\r\n\t\tconst root: Element = (this.editorRef.nativeElement as Element);\r\n\t\tconst walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT);\r\n\t\twhile (walker.nextNode()) {\r\n\t\t\tconst n = walker.currentNode as Text;\r\n\t\t\tif (!n.data.trim()) continue;\r\n\t\t\ttry { if (range.intersectsNode(n)) { if (this.isNodeItalic(n.parentElement)) return true; } } catch {}\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tprivate computeUnderlineAnyForRange(range: Range): boolean {\r\n\t\tconst root: Element = (this.editorRef.nativeElement as Element);\r\n\t\tconst walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT);\r\n\t\twhile (walker.nextNode()) {\r\n\t\t\tconst n = walker.currentNode as Text;\r\n\t\t\tif (!n.data.trim()) continue;\r\n\t\t\ttry { if (range.intersectsNode(n)) { if (this.isNodeUnderline(n.parentElement)) return true; } } catch {}\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tprivate isNodeBold(node: HTMLElement | null): boolean {\r\n\t\tlet el: HTMLElement | null = node;\r\n\t\twhile (el) {\r\n\t\t\tif (el.tagName === 'B' || el.tagName === 'STRONG') return true;\r\n\t\t\tconst cs = getComputedStyle(el);\r\n\t\t\tif (cs.fontWeight && cs.fontWeight !== 'normal' && cs.fontWeight !== '400') {\r\n\t\t\t\tconst w = cs.fontWeight === 'bold' ? 700 : parseInt(cs.fontWeight, 10);\r\n\t\t\t\tif (!Number.isNaN(w) && w >= 600) return true;\r\n\t\t\t}\r\n\t\t\tel = el.parentElement;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tprivate isNodeItalic(node: HTMLElement | null): boolean {\r\n\t\tlet el: HTMLElement | null = node;\r\n\t\twhile (el) {\r\n\t\t\tif (el.tagName === 'I' || el.tagName === 'EM') return true;\r\n\t\t\tconst cs = getComputedStyle(el);\r\n\t\t\tif (cs.fontStyle && cs.fontStyle !== 'normal') return true;\r\n\t\t\tel = el.parentElement;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tprivate isNodeUnderline(node: HTMLElement | null): boolean {\r\n\t\tlet el: HTMLElement | null = node;\r\n\t\twhile (el) {\r\n\t\t\tif (el.tagName === 'U') return true;\r\n\t\t\tconst cs = getComputedStyle(el);\r\n\t\t\tif (cs.textDecorationLine && cs.textDecorationLine.includes('underline')) return true;\r\n\t\t\tel = el.parentElement;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tprivate isItalicCarrier(el: HTMLElement | null): boolean {\r\n\t\tif (!el) return false;\r\n\t\tconst tag = el.tagName;\r\n\t\tif (tag === 'I' || tag === 'EM') return true;\r\n\t\tconst fs = el.style?.fontStyle || '';\r\n\t\treturn !!fs && fs !== 'normal';\r\n\t}\r\n\r\n\tprivate isUnderlineCarrier(el: HTMLElement | null): boolean {\r\n\t\tif (!el) return false;\r\n\t\tconst tag = el.tagName;\r\n\t\tif (tag === 'U') return true;\r\n\t\tconst td = (el.style as any)?.textDecoration || '';\r\n\t\treturn typeof td === 'string' && td.includes('underline');\r\n\t}\r\n\r\n\tprivate computeBoldActiveForRange(range: Range): boolean {\r\n\t\tconst editor = this.editorRef.nativeElement;\r\n\t\tconst root: Element = this.isRangeInEditor(range) ? (this.editorRef.nativeElement as Element) : (range.commonAncestorContainer as Element);\r\n\t\tconst walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT);\r\n\t\tconst nodes: Text[] = [];\r\n\t\twhile (walker.nextNode()) {\r\n\t\t\tconst n = walker.currentNode as Text;\r\n\t\t\tif (!n.data.trim()) continue;\r\n\t\t\ttry { if (range.intersectsNode(n)) nodes.push(n); } catch { /* Safari may throw if node not in same tree */ }\r\n\t\t}\r\n\t\tif (nodes.length === 0) return false;\r\n\t\treturn nodes.every(t => this.isNodeBold(t.parentElement));\r\n\t}\r\n\r\n\tprivate computeItalicActiveForRange(range: Range): boolean {\r\n\t\tconst editor = this.editorRef.nativeElement;\r\n\t\tconst root: Element = this.isRangeInEditor(range) ? (this.editorRef.nativeElement as Element) : (range.commonAncestorContainer as Element);\r\n\t\tconst walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT);\r\n\t\tconst nodes: Text[] = [];\r\n\t\twhile (walker.nextNode()) {\r\n\t\t\tconst n = walker.currentNode as Text;\r\n\t\t\tif (!n.data.trim()) continue;\r\n\t\t\ttry { if (range.intersectsNode(n)) nodes.push(n); } catch {}\r\n\t\t}\r\n\t\tif (nodes.length === 0) return false;\r\n\t\treturn nodes.every(t => this.isNodeItalic(t.parentElement));\r\n\t}\r\n\r\n\tprivate computeUnderlineActiveForRange(range: Range): boolean {\r\n\t\tconst editor = this.editorRef.nativeElement;\r\n\t\tconst root: Element = this.isRangeInEditor(range) ? (this.editorRef.nativeElement as Element) : (range.commonAncestorContainer as Element);\r\n\t\tconst walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT);\r\n\t\tconst nodes: Text[] = [];\r\n\t\twhile (walker.nextNode()) {\r\n\t\t\tconst n = walker.currentNode as Text;\r\n\t\t\tif (!n.data.trim()) continue;\r\n\t\t\ttry { if (range.intersectsNode(n)) nodes.push(n); } catch {}\r\n\t\t}\r\n\t\tif (nodes.length === 0) return false;\r\n\t\treturn nodes.every(t => this.isNodeUnderline(t.parentElement));\r\n\t}\r\n\r\n\tprivate removeInlineStyleInRange(\r\n\t\trange: Range,\r\n\t\tcssPropKebab: 'font-weight' | 'font-style' | 'text-decoration'\r\n\t) {\r\n\t\tconst editor = this.editorRef.nativeElement;\r\n\t\tconst common = range.commonAncestorContainer.nodeType === Node.ELEMENT_NODE ? range.commonAncestorContainer as Element : range.commonAncestorContainer.parentElement || editor;\r\n\t\tconst affected: HTMLElement[] = [];\r\n\t\tconst walker = document.createTreeWalker(common, NodeFilter.SHOW_ELEMENT);\r\n\t\twhile (walker.nextNode()) {\r\n\t\t\tconst el = walker.currentNode as HTMLElement;\r\n\t\t\tlet matches = false;\r\n\t\t\tif (el.tagName === 'SPAN' && el.style && el.style.getPropertyValue(cssPropKebab)) matches = true;\r\n\t\t\tif (cssPropKebab === 'font-weight' && (el.tagName === 'B' || el.tagName === 'STRONG')) matches = true;\r\n\t\t\tif (cssPropKebab === 'font-style' && (el.tagName === 'I' || el.tagName === 'EM')) matches = true;\r\n\t\t\tif (cssPropKebab === 'text-decoration' && el.tagName === 'U') matches = true;\r\n\t\t\tif (!matches) continue;\r\n\t\t\ttry { if ((range as any).intersectsNode ? range.intersectsNode(el) : true) affected.push(el); } catch {}\r\n\t\t}\r\n\t\tfor (const el of affected) {\r\n\t\t\tif (el.tagName === 'B' || el.tagName === 'STRONG' || el.tagName === 'I' || el.tagName === 'EM' || el.tagName === 'U') {\r\n\t\t\t\twhile (el.firstChild) el.parentNode?.insertBefore(el.firstChild, el);\r\n\t\t\t\tel.remove();\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tel.style.removeProperty(cssPropKebab);\r\n\t\t\tif (!el.getAttribute('style')) {\r\n\t\t\t\twhile (el.firstChild) el.parentNode?.insertBefore(el.firstChild, el);\r\n\t\t\t\tel.remove();\r\n\t\t\t}\r\n\t\t}\r\n\t\tthis.emitValue();\r\n\t}\r\n\r\n\ttoggleBold() {\r\n\t\tthis.focusEditor();\r\n\t\tthis.restoreSelection();\r\n\t\tconst sel = window.getSelection();\r\n\t\tif (!sel || sel.rangeCount === 0) return;\r\n\t\tconst range = sel.getRangeAt(0);\r\n\t\tif (range.collapsed) this.expandRangeToWord(range);\r\n\t\tconst anyActive = this.computeBoldAnyForRange(range);\r\n\t\t\tconst blocks = this.getIntersectingBlocks(range);\r\n\t\t\tconst multiBlock = blocks.length > 1;\r\n\t\t\tif (anyActive) {\r\n\t\t\t\tif (multiBlock) {\r\n\t\t\t\t\tfor (const b of blocks) b.style.removeProperty('font-weight');\r\n\t\t\t\t\tthis.emitValue();\r\n\t\t\t\t\tthis.updateInlineStates();\r\n\t\t\t\t\tthis.takeSnapshot('toggle-bold-blocks');\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t// Preferred: split bold ancestor around selection so we keep surrounding text intact\r\n\t\t\tconst changed = this.deselectBoldBySplitting(range);\r\n\t\t\tif (changed) {\r\n\t\t\t\tthis.cleanupEmptyBoldSpans(this.editorRef.nativeElement);\r\n\t\t\t\tthis.emitValue();\r\n\t\t\t} else {\r\n\t\t\t\t// Fallback: previous neutralization approach for complex cases\r\n\t\t\t\tconst normal = this.wrapSelectionInline('fontWeight', '400');\r\n\t\t\t\tif (normal) {\r\n\t\t\t\t\tthis.stripBoldWithin(normal);\r\n\t\t\t\t\tthis.liftOutOfBoldAncestors(normal);\r\n\t\t\t\t\tthis.cleanupEmptyBoldSpans(this.editorRef.nativeElement);\r\n\t\t\t\t\tthis.maybeUnwrapNormalSpan(normal);\r\n\t\t\t\t\tthis.emitValue();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tif (multiBlock) {\r\n\t\t\t\tfor (const b of blocks) (b.style as any).fontWeight = 'bold';\r\n\t\t\t\tthis.emitValue();\r\n\t\t\t\tthis.updateInlineStates();\r\n\t\t\t\tthis.takeSnapshot('toggle-bold-blocks');\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tthis.applyInlineStyleSmart('fontWeight', 'bold');\r\n\t\t}\r\n\t\tthis.updateInlineStates();\r\n\t\tthis.takeSnapshot('toggle-bold');\r\n\t}\r\n\r\n\ttoggleItalic() {\r\n\t\tthis.focusEditor();\r\n\t\tthis.restoreSelection();\r\n\t\tconst sel = window.getSelection();\r\n\t\tif (!sel || sel.rangeCount === 0) return;\r\n\t\tconst range = sel.getRangeAt(0);\r\n\t\tif (range.collapsed) this.expandRangeToWord(range);\r\n\t\tconst anyActive = this.computeItalicAnyForRange(range);\r\n\t\tif (anyActive) {\r\n\t\t\tconst changed = this.deselectItalicBySplitting(range);\r\n\t\t\tif (changed) {\r\n\t\t\t\tthis.cleanupEmptyItalicSpans(this.editorRef.nativeElement);\r\n\t\t\t\tthis.emitValue();\r\n\t\t\t} else {\r\n\t\t\t\tthis.removeInlineStyleInRange(range, 'font-style');\r\n\t\t\t\tthis.applyInlineStyle('fontStyle', 'normal');\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tthis.applyInlineStyleSmart('fontStyle', 'italic');\r\n\t\t}\r\n\t\tthis.updateInlineStates();\r\n\t\tthis.takeSnapshot('toggle-italic');\r\n\t}\r\n\r\n\ttoggleUnderline() {\r\n\t\tthis.focusEditor();\r\n\t\tthis.restoreSelection();\r\n\t\tconst sel = window.getSelection();\r\n\t\tif (!sel || sel.rangeCount === 0) return;\r\n\t\tconst range = sel.getRangeAt(0);\r\n\t\tif (range.collapsed) this.expandRangeToWord(range);\r\n\t\tconst anyActive = this.computeUnderlineAnyForRange(range);\r\n\t\tif (anyActive) {\r\n\t\t\tconst changed = this.deselectUnderlineBySplitting(range);\r\n\t\t\tif (changed) {\r\n\t\t\t\tthis.cleanupEmptyUnderlineSpans(this.editorRef.nativeElement);\r\n\t\t\t\tthis.emitValue();\r\n\t\t\t} else {\r\n\t\t\t\tthis.removeInlineStyleInRange(range, 'text-decoration');\r\n\t\t\t\tthis.applyInlineStyle('textDecoration', 'none');\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tthis.applyInlineStyleSmart('textDecoration', 'underline');\r\n\t\t}\r\n\t\tthis.updateInlineStates();\r\n\t\tthis.takeSnapshot('toggle-underline');\r\n\t}\r\n\r\n\tprivate getCurrentRange(): Range | null {\r\n\t\tconst sel = window.getSelection();\r\n\t\tif (!sel || sel.rangeCount === 0) return null;\r\n\t\tconst range = sel.getRangeAt(0);\r\n\t\treturn this.isRangeInEditor(range) ? range : null;\r\n\t}\r\n\r\n\tprivate getEditorChildAncestor(node: Node): HTMLElement | null {\r\n\t\tconst editor = this.editorRef.nativeElement;\r\n\t\tlet el: HTMLElement | null = node.nodeType === Node.ELEMENT_NODE ? (node as HTMLElement) : node.parentElement;\r\n\t\twhile (el && el.parentElement && el.parentElement !== editor) {\r\n\t\t\tel = el.parentElement;\r\n\t\t}\r\n\t\t// Wenn direktes Kind des Editors\r\n\t\tif (el && el.parentElement === editor) return el;\r\n\t\treturn editor;\r\n\t}\r\n\r\n\tprivate findClosest(node: Node | null, selector: string): HTMLElement | null {\r\n\t\tlet el: HTMLElement | null = node && (node as HTMLElement).nodeType === 1 ? (node as HTMLElement) : node?.parentElement ?? null;\r\n\t\twhile (el) {\r\n\t\t\tif (el.matches(selector)) return el;\r\n\t\t\tel = el.parentElement;\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n\r\n\tprivate toggleList(kind: 'ul' | 'ol') {\r\n\t\tconst range = this.getCurrentRange();\r\n\t\tif (!range) return;\r\n\t\tconst editor = this.editorRef.nativeElement;\r\n\t\t// Wenn bereits in einer Liste, Liste aufheben\r\n\t\tconst listAncestor = this.findClosest(range.commonAncestorContainer, 'ul,ol');\r\n\t\tif (listAncestor) {\r\n\t\t\t// unwrap: li-Inhalte an die Stelle der Liste setzen\r\n\t\t\tconst frag = document.createDocumentFragment();\r\n\t\t\tconst items = Array.from(listAncestor.children) as HTMLElement[]; // li\r\n\t\t\tfor (const li of items) {\r\n\t\t\t\twhile (li.firstChild) frag.appendChild(li.firstChild);\r\n\t\t\t\t// Optional: Zeilenumbruch zwischen Items\r\n\t\t\t\tfrag.appendChild(document.createElement('br'));\r\n\t\t\t}\r\n\t\t\tlistAncestor.replaceWith(frag);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Neue Liste um die aktuelle Auswahl legen\r\n\t\tconst list = document.createElement(kind);\r\n\t\tconst li = document.createElement('li');\r\n\t\tconst contents = range.extractContents();\r\n\t\tif (!contents.hasChildNodes()) {\r\n\t\t\tli.textContent = '\\u200b'; // zero-width space um leere li zu vermeiden\r\n\t\t} else {\r\n\t\t\tli.appendChild(contents);\r\n\t\t}\r\n\t\tlist.appendChild(li);\r\n\t\trange.insertNode(list);\r\n\r\n\t\t// Cursor ins li setzen\r\n\t\tconst sel = window.getSelection();\r\n\t\tif (sel) {\r\n\t\t\tsel.removeAllRanges();\r\n\t\t\tconst after = document.createRange();\r\n\t\t\tafter.selectNodeContents(li);\r\n\t\t\tafter.collapse(false);\r\n\t\t\tsel.addRange(after);\r\n\t\t}\r\n\t}\r\n\r\n\tprivate alignBlocks(align: 'left' | 'center' | 'right' | 'justify') {\r\n\t\tconst range = this.getCurrentRange();\r\n\t\tif (!range) return;\r\n\t\tconst startBlock = this.getEditorChildAncestor(range.startContainer);\r\n\t\tconst endBlock = this.getEditorChildAncestor(range.endContainer);\r\n\t\tconst editor = this.editorRef.nativeElement;\r\n\r\n\t\tconst applyAlign = (el: HTMLElement | null) => {\r\n\t\t\tif (!el) return;\r\n\t\t\t(el.style as any).textAlign = align;\r\n\t\t};\r\n\r\n\t\tif (startBlock === endBlock) {\r\n\t\t\tapplyAlign(startBlock);\r\n\t\t} else {\r\n\t\t\t// grob: alle direkten Kinder zwischen start und end ausrichten\r\n\t\t\tconst children = Array.from(editor.children) as HTMLElement[];\r\n\t\t\tconst i1 = children.indexOf(startBlock as HTMLElement);\r\n\t\t\tconst i2 = children.indexOf(endBlock as HTMLElement);\r\n\t\t\tif (i1 >= 0 && i2 >= 0) {\r\n\t\t\t\tconst [from, to] = i1 <= i2 ? [i1, i2] : [i2, i1];\r\n\t\t\t\tfor (let i = from; i <= to; i++) applyAlign(children[i]);\r\n\t\t\t} else {\r\n\t\t\t\tapplyAlign(startBlock);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tprivate setBlockSpacing(kind: 'margin' | 'padding', target: 'all' | 'vertical' | 'horizontal', value: number) {\r\n\t\tconst range = this.getCurrentRange();\r\n\t\tif (!range) return;\r\n\t\tconst editor = this.editorRef.nativeElement;\r\n\r\n\t\tconst apply = (el: HTMLElement | null) => {\r\n\t\t\tif (!el) return;\r\n\t\t\tconst v = `${value}px`;\r\n\t\t\tif (target === 'all') {\r\n\t\t\t\t(el.style as any)[kind] = v;\r\n\t\t\t} else if (target === 'vertical') {\r\n\t\t\t\t(el.style as any)[`${kind}Top`] = v;\r\n\t\t\t\t(el.style as any)[`${kind}Bottom`] = v;\r\n\t\t\t} else if (target === 'horizontal') {\r\n\t\t\t\t(el.style as any)[`${kind}Left`] = v;\r\n\t\t\t\t(el.style as any)[`${kind}Right`] = v;\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tconst startBlock = this.getEditorChildAncestor(range.startContainer);\r\n\t\tconst endBlock = this.getEditorChildAncestor(range.endContainer);\r\n\r\n\t\tif (startBlock === endBlock) {\r\n\t\t\tapply(startBlock);\r\n\t\t} else {\r\n\t\t\tconst children = Array.from(editor.children) as HTMLElement[];\r\n\t\t\tconst i1 = children.indexOf(startBlock as HTMLElement);\r\n\t\t\tconst i2 = children.indexOf(endBlock as HTMLElement);\r\n\t\t\tif (i1 >= 0 && i2 >= 0) {\r\n\t\t\t\tconst [from, to] = i1 <= i2 ? [i1, i2] : [i2, i1];\r\n\t\t\t\tfor (let i = from; i <= to; i++) apply(children[i]);\r\n\t\t\t} else {\r\n\t\t\t\tapply(startBlock);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// Versucht, Margin/Padding auf die konkrete Text-Selektion anzuwenden, indem die Auswahl mit einem Span umschlossen wird.\r\n\t// Liefert true, wenn inline angewendet werden konnte; sonst false (z. B. wenn Auswahl blockübergreifend ist).\r\n\tprivate applySpacingToSelection(kind: 'margin' | 'padding', target: 'all' | 'vertical' | 'horizontal', value: number): boolean {\r\n\t\tconst sel = window.getSelection();\r\n\t\tif (!sel || sel.rangeCount === 0) return false;\r\n\t\tconst range = sel.getRangeAt(0);\r\n\t\tif (range.collapsed) return false;\r\n\r\n\t\tconst startBlock = this.getEditorChildAncestor(range.startContainer);\r\n\t\tconst endBlock = this.getEditorChildAncestor(range.endContainer);\r\n\t\t// Nur inline, wenn innerhalb desselben Blocks\r\n\t\tif (!startBlock || !endBlock || startBlock !== endBlock) return false;\r\n\r\n\t\tconst wrapper = document.createElement('span');\r\n\t\tconst px = `${value}px`;\r\n\t\tif (target === 'all') {\r\n\t\t\t(wrapper.style as any)[kind] = px;\r\n\t\t} else if (target === 'vertical') {\r\n\t\t\t(wrapper.style as any)[`${kind}Top`] = px;\r\n\t\t\t(wrapper.style as any)[`${kind}Bottom`] = px;\r\n\t\t} else if (target === 'horizontal') {\r\n\t\t\t(wrapper.style as any)[`${kind}Left`] = px;\r\n\t\t\t(wrapper.style as any)[`${kind}Right`] = px;\r\n\t\t}\r\n\t\t// Für vertikale Margins auf Inline-Elementen sicherstellen, dass sie greifen\r\n\t\tif (kind === 'margin' && (target === 'all' || target === 'vertical')) {\r\n\t\t\twrapper.style.display = 'inline-block';\r\n\t\t}\r\n\r\n\t\t// Auswahl extrahieren und in Wrapper einsetzen\r\n\t\tconst frag = range.extractContents();\r\n\t\twrapper.appendChild(frag);\r\n\t\trange.insertNode(wrapper);\r\n\r\n\t\t// Gleichartige Wrapper zusammenführen und Cursor korrekt setzen\r\n\t\tconst normalized = this.normalizeSpacingSpans(wrapper, kind, target, value) || wrapper;\r\n\t\tsel.removeAllRanges();\r\n\t\tconst after = document.createRange();\r\n\t\tif (normalized.isConnected) {\r\n\t\t\tafter.setStartAfter(normalized);\r\n\t\t} else {\r\n\t\t\t// Fallback: an das Ende des Startblocks\r\n\t\t\tconst sb = this.getEditorChildAncestor(range.startContainer);\r\n\t\t\tif (sb) after.selectNodeContents(sb);\r\n\t\t}\r\n\t\tafter.collapse(true);\r\n\t\tsel.addRange(after);\r\n\t\treturn true;\r\n\t}\r\n\r\n\tprivate normalizeSpacingSpans(\r\n\t\tspan: HTMLElement,\r\n\t\tkind: 'margin' | 'padding',\r\n\t\ttarget: 'all' | 'vertical' | 'horizontal',\r\n\t\tvalue: number\r\n\t): HTMLElement | null {\r\n\t\tconst props: string[] = [];\r\n\t\tif (target === 'all') props.push(kind);\r\n\t\tif (target === 'vertical') props.push(`${kind}Top`, `${kind}Bottom`);\r\n\t\tif (target === 'horizontal') props.push(`${kind}Left`, `${kind}Right`);\r\n\t\tconst displayNeeded = kind === 'margin' && (target === 'all' || target === 'vertical');\r\n\t\tconst v = `${value}px`;\r\n\r\n\t\tconst hasSameSpacing = (a: HTMLElement, b: HTMLElement) => {\r\n\t\t\tfor (const p of props) {\r\n\t\t\t\tif ((a.style as any)[p] !== (b.style as any)[p]) return false;\r\n\t\t\t}\r\n\t\t\tif (displayNeeded) {\r\n\t\t\t\tif (a.style.display !== b.style.display) return false;\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t};\r\n\r\n\t\t// Downward: verschachtelte identische Spans in span zusammenführen\r\n\t\tif (span.children.length === 1) {\r\n\t\t\tconst only = span.children[0] as HTMLElement;\r\n\t\t\tif (only && only.tagName === 'SPAN' && hasSameSpacing(span, only)) {\r\n\t\t\t\twhile (only.firstChild) span.appendChild(only.firstChild);\r\n\t\t\t\tonly.remove();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tlet current: HTMLElement | null = span;\r\n\r\n\t\t// Upward: mit Elternelement verschmelzen, wenn identischer Span\r\n\t\tconst parent = current.parentElement;\r\n\t\tif (parent && parent.tagName === 'SPAN' && hasSameSpacing(parent, current)) {\r\n\t\t\twhile (current.firstChild) parent.insertBefore(current.firstChild, current);\r\n\t\t\tcurrent.remove();\r\n\t\t\tcurrent = parent;\r\n\t\t}\r\n\r\n\t\tif (!current) return null;\r\n\r\n\t\t// Left merge: vorherige Geschwister-Spans mit gleicher Formatierung in current ziehen\r\n\t\tlet prev = current.previousElementSibling as HTMLElement | null;\r\n\t\tif (prev && prev.tagName === 'SPAN' && hasSameSpacing(prev, current)) {\r\n\t\t\twhile (current.firstChild) prev.appendChild(current.firstChild);\r\n\t\t\tcurrent.remove();\r\n\t\t\tcurrent = prev;\r\n\t\t}\r\n\r\n\t\t// Right merge: folgende Geschwister-Spans in current ziehen\r\n\t\tlet next = current.nextElementSibling as HTMLElement | null;\r\n\t\twhile (next && next.tagName === 'SPAN' && hasSameSpacing(current, next)) {\r\n\t\t\twhile (next.firstChild) current.appendChild(next.firstChild);\r\n\t\t\tconst toRemove = next;\r\n\t\t\tnext = next.nextElementSibling as HTMLElement | null;\r\n\t\t\ttoRemove.remove();\r\n\t\t}\r\n\r\n\t\treturn current;\r\n\t}\r\n\r\n\tprivate setHeading(tag: 'p' | 'pre' | 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6') {\r\n\t\tconst range = this.getCurrentRange();\r\n\t\tif (!range) return;\r\n\t\tconst editor = this.editorRef.nativeElement;\r\n\r\n\t\tconst replaceTag = (el: HTMLElement, newTag: string) => {\r\n\t\t\tif (!el || el === editor) return null;\r\n\t\t\tconst neo = document.createElement(newTag);\r\n\t\t\twhile (el.firstChild) neo.appendChild(el.firstChild);\r\n\t\t\tel.replaceWith(neo);\r\n\t\t\treturn neo as HTMLElement;\r\n\t\t};\r\n\r\n\t\tconst startBlock = this.getEditorChildAncestor(range.startContainer);\r\n\t\tconst endBlock = this.getEditorChildAncestor(range.endContainer);\r\n\r\n\t\tif (startBlock && startBlock !== editor && (startBlock === endBlock)) {\r\n\t\t\tconst currentTag = (startBlock.tagName || '').toLowerCase();\r\n\t\t\tif (currentTag === tag) return;\r\n\t\t\tconst convertible = /^(p|div|pre|h1|h2|h3|h4|h5|h6)$/i.test(currentTag);\r\n\t\t\tif (convertible) {\r\n\t\t\t\tconst neo = replaceTag(startBlock, tag);\r\n\t\t\t\tif (neo && tag === 'pre') {\r\n\t\t\t\t\tneo.setAttribute('style', 'white-space: pre-wrap; font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;');\r\n\t\t\t\t}\r\n\t\t\t\tif (neo) {\r\n\t\t\t\t\tconst sel = window.getSelection();\r\n\t\t\t\t\tif (sel) {\r\n\t\t\t\t\t\tsel.removeAllRanges();\r\n\t\t\t\t\t\tconst after = document.createRange();\r\n\t\t\t\t\t\tafter.selectNodeContents(neo);\r\n\t\t\t\t\t\tafter.collapse(false);\r\n\t\t\t\t\t\tsel.addRange(after);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (startBlock && endBlock && startBlock !== editor && endBlock !== editor) {\r\n\t\t\tconst children = Array.from(editor.children) as HTMLElement[];\r\n\t\t\tconst i1 = children.indexOf(startBlock as HTMLElement);\r\n\t\t\tconst i2 = children.indexOf(endBlock as HTMLElement);\r\n\t\t\tif (i1 >= 0 && i2 >= 0) {\r\n\t\t\t\tconst [from, to] = i1 <= i2 ? [i1, i2] : [i2, i1];\r\n\t\t\t\tlet last: HTMLElement | null = null;\r\n\t\t\t\tfor (let i = from; i <= to; i++) {\r\n\t\t\t\t\tconst el = children[i];\r\n\t\t\t\t\tconst currentTag = (el.tagName || '').toLowerCase();\r\n\t\t\t\t\tif (/^(p|div|pre|h1|h2|h3|h4|h5|h6)$/i.test(currentTag)) {\r\n\t\t\t\t\t\tconst neo = replaceTag(el, tag);\r\n\t\t\t\t\t\tif (neo && tag === 'pre') {\r\n\t\t\t\t\t\t\tneo.setAttribute('style', 'white-space: pre-wrap; font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;');\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (neo) last = neo;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (last) {\r\n\t\t\t\t\tconst sel = window.getSelection();\r\n\t\t\t\t\tif (sel) {\r\n\t\t\t\t\t\tsel.removeAllRanges();\r\n\t\t\t\t\t\tconst after = document.createRange();\r\n\t\t\t\t\t\tafter.selectNodeContents(last);\r\n\t\t\t\t\t\tafter.collapse(false);\r\n\t\t\t\t\t\tsel.addRange(after);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (!range.collapsed) {\r\n\t\t\tconst el = document.createElement(tag);\r\n\t\t\tif (tag === 'pre') {\r\n\t\t\t\tel.setAttribute('style', 'white-space: pre-wrap; font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;');\r\n\t\t\t}\r\n\t\t\tconst frag = range.extractContents();\r\n\t\t\tel.appendChild(frag);\r\n\t\t\trange.insertNode(el);\r\n\t\t\tconst sel = window.getSelection();\r\n\t\t\tif (sel) {\r\n\t\t\t\tsel.removeAllRanges();\r\n\t\t\t\tconst after = document.createRange();\r\n\t\t\t\tafter.selectNodeContents(el);\r\n\t\t\t\tafter.collapse(false);\r\n\t\t\t\tsel.addRange(after);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}","<div class=\"stackch_rte\" [class.stackch_rte--disabled]=\"disabled\">\r\n @if (showToolbar) {\r\n <stackch-richtext-editor-toolbar\r\n [cfg]=\"cfg\"\r\n [i18n]=\"i18n\"\r\n [disabled]=\"disabled\"\r\n [fonts]=\"fonts\"\r\n [fontSizes]=\"fontSizes\"\r\n [isBoldActive]=\"isBoldActive\"\r\n [isItalicActive]=\"isItalicActive\"\r\n [isUnderlineActive]=\"isUnderlineActive\"\r\n [canUndo]=\"canUndo\"\r\n [canRedo]=\"canRedo\"\r\n [uiState]=\"{ showFontPanel: showFontPanel, showHeadingMenu: showHeadingMenu, showSpacingMenu: showSpacingMenu, showAlignMenu: showAlignMenu, showColorMenu: showColorMenu, showListMenu: showListMenu }\"\r\n\r\n (undo)=\"undo()\"\r\n (redo)=\"redo()\"\r\n (toggleFontPanel)=\"toggleFontPanel($event)\"\r\n (toggleHeadingMenu)=\"toggleHeadingMenu($event)\"\r\n (toggleSpacingMenu)=\"toggleSpacingMenu($event)\"\r\n (toggleAlignMenu)=\"toggleAlignMenu($event)\"\r\n (toggleColorMenu)=\"toggleColorMenu($event)\"\r\n (toggleListMenu)=\"toggleListMenu($event)\"\r\n (pickFont)=\"onPickFont($any($event))\"\r\n (pickFontSize)=\"onPickFontSize($any($event))\"\r\n (pickAlign)=\"onPickAlign($any($event))\"\r\n (pickList)=\"onPickList($any($event))\"\r\n (pickHeading)=\"onPickHeading($any($event))\"\r\n (pickSpacing)=\"onPickSpacing($any($event).kind, $any($event).target, $any($event).value)\"\r\n (applyColor)=\"applyColor($any($event))\"\r\n (applyHighlight)=\"applyHighlight($any($event))\"\r\n (toggleBold)=\"toggleBold()\"\r\n (toggleItalic)=\"toggleItalic()\"\r\n (toggleUnderline)=\"toggleUnderline()\"\r\n (insertLink)=\"insertLink()\"\r\n (removeFormat)=\"removeFormat()\"\r\n (saveSelectionRequest)=\"saveSelection()\"\r\n />\r\n }\r\n\r\n <div #editor\r\n class=\"stackch_rte__editor\"\r\n [attr.contenteditable]=\"!disabled\"\r\n [attr.data-placeholder]=\"placeholder || i18n.placeholder\"\r\n [style.minHeight.px]=\"minHeight\"\r\n [style.maxHeight.px]=\"maxHeight\"\r\n [style.height.px]=\"height\"\r\n (mouseup)=\"saveSelection()\"\r\n (keyup)=\"onKeyup($event)\"\r\n (input)=\"onInput()\"\r\n (blur)=\"onTouched()\"\r\n (paste)=\"onPaste($event)\"></div>\r\n</div>\r\n","/*\r\n * Public API Surface of richtext-editor\r\n */\r\n\r\nexport * from './lib/stackch-richtext-editor';\r\nexport * from './lib/toolbar/stackch-richtext-editor-toolbar';\r\nexport { STACKCH_RTE_I18N_DE, STACKCH_RTE_I18N_FR, STACKCH_RTE_I18N_IT, StackchRichtextEditorI18n } from './lib/stackch-richtext-editor';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"stackch-angular-richtext-editor.mjs","sources":["../../../projects/stackch-richtext-editor/src/lib/toolbar/stackch-richtext-editor-toolbar.ts","../../../projects/stackch-richtext-editor/src/lib/toolbar/stackch-richtext-editor-toolbar.html","../../../projects/stackch-richtext-editor/src/lib/stackch-richtext-editor.ts","../../../projects/stackch-richtext-editor/src/lib/stackch-richtext-editor.html","../../../projects/stackch-richtext-editor/src/public-api.ts","../../../projects/stackch-richtext-editor/src/stackch-angular-richtext-editor.ts"],"sourcesContent":["import { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { StackchRichtextEditorConfig, StackchRichtextEditorI18n } from '../stackch-richtext-editor';\r\n\r\n@Component({\r\n selector: 'stackch-richtext-editor-toolbar',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './stackch-richtext-editor-toolbar.html',\r\n // Reuse the editor stylesheet for consistent visuals\r\n styleUrls: ['../stackch-richtext-editor.scss']\r\n})\r\nexport class StackchRichtextEditorToolbar {\r\n // State/config from parent editor\r\n @Input() cfg!: StackchRichtextEditorConfig;\r\n @Input() i18n!: StackchRichtextEditorI18n;\r\n @Input() disabled = false;\r\n @Input() fonts: string[] = [];\r\n @Input() fontSizes: number[] = [];\r\n\r\n @Input() isBoldActive = false;\r\n @Input() isItalicActive = false;\r\n @Input() isUnderlineActive = false;\r\n @Input() canUndo = false;\r\n @Input() canRedo = false;\r\n\r\n // Consolidated UI state\r\n @Input() uiState?: {\r\n showFontPanel?: boolean;\r\n showHeadingMenu?: boolean;\r\n showSpacingMenu?: boolean;\r\n showAlignMenu?: boolean;\r\n showColorMenu?: boolean;\r\n showListMenu?: boolean;\r\n };\r\n\r\n // Actions -> bubble to parent editor\r\n @Output() undo = new EventEmitter<void>();\r\n @Output() redo = new EventEmitter<void>();\r\n\r\n @Output() toggleFontPanel = new EventEmitter<Event>();\r\n @Output() toggleHeadingMenu = new EventEmitter<Event>();\r\n @Output() toggleSpacingMenu = new EventEmitter<Event>();\r\n @Output() toggleAlignMenu = new EventEmitter<Event>();\r\n @Output() toggleColorMenu = new EventEmitter<Event>();\r\n @Output() toggleListMenu = new EventEmitter<Event>();\r\n\r\n @Output() pickFont = new EventEmitter<string>();\r\n @Output() pickFontSize = new EventEmitter<number>();\r\n @Output() pickAlign = new EventEmitter<'left' | 'center' | 'right' | 'justify'>();\r\n @Output() pickList = new EventEmitter<'ul' | 'ol'>();\r\n @Output() pickHeading = new EventEmitter<'p' | 'pre' | 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6'>();\r\n @Output() pickSpacing = new EventEmitter<{ kind: 'margin' | 'padding'; target: 'all' | 'vertical' | 'horizontal'; value: number }>();\r\n\r\n @Output() applyColor = new EventEmitter<string>();\r\n @Output() applyHighlight = new EventEmitter<string>();\r\n\r\n @Output() toggleBold = new EventEmitter<void>();\r\n @Output() toggleItalic = new EventEmitter<void>();\r\n @Output() toggleUnderline = new EventEmitter<void>();\r\n\r\n @Output() insertLink = new EventEmitter<void>();\r\n @Output() removeFormat = new EventEmitter<void>();\r\n\r\n // Ask parent to preserve selection before toolbar interactions (mousedown/pointerdown/focus)\r\n @Output() saveSelectionRequest = new EventEmitter<void>();\r\n\r\n onToolbarMouseDown(evt: Event) {\r\n // Prevent focus stealing and keep selection in the editor\r\n evt.preventDefault();\r\n evt.stopPropagation();\r\n this.saveSelectionRequest.emit();\r\n }\r\n\r\n onColorPointerDown(evt: Event) {\r\n // Do not preventDefault to allow the color picker to open, just preserve selection\r\n evt.stopPropagation();\r\n this.saveSelectionRequest.emit();\r\n }\r\n}\r\n","<div class=\"stackch_rte__toolbar\">\r\n <!-- Undo / Redo -->\r\n @if (cfg.showUndoRedo) {\r\n <button type=\"button\" class=\"stackch_rte__btn\" (click)=\"undo.emit()\" [disabled]=\"disabled || !canUndo\" [title]=\"i18n.undoTitle\">↶</button>\r\n <button type=\"button\" class=\"stackch_rte__btn\" (click)=\"redo.emit()\" [disabled]=\"disabled || !canRedo\" [title]=\"i18n.redoTitle\">↷</button>\r\n <span class=\"stackch_rte__sep\"></span>\r\n }\r\n\r\n <!-- Schrift & Größe (kombinierter Layer) -->\r\n @if (cfg.showFontPanel) {\r\n <div class=\"stackch_rte__dropdown\">\r\n <button type=\"button\" class=\"stackch_rte__btn\" (click)=\"toggleFontPanel.emit($event)\" [disabled]=\"disabled\" [title]=\"i18n.fontPanelTitle\">Aᵃ ▾</button>\r\n @if (uiState?.showFontPanel) {\r\n <div class=\"stackch_rte__menu stackch_rte__menu--grid\" (mousedown)=\"$event.stopPropagation()\">\r\n <div class=\"stackch_rte__menu-section\">\r\n <div class=\"stackch_rte__menu-title\">{{ i18n.fontSectionTitle }}</div>\r\n @for (f of fonts; track f) {\r\n <button type=\"button\" class=\"stackch_rte__menu-item\" [style.fontFamily]=\"f\" (click)=\"pickFont.emit(f)\">{{ f }}</button>\r\n }\r\n </div>\r\n <div class=\"stackch_rte__menu-section\">\r\n <div class=\"stackch_rte__menu-title\">{{ i18n.sizeSectionTitle }}</div>\r\n @for (s of fontSizes; track s) {\r\n <button type=\"button\" class=\"stackch_rte__menu-item\" (click)=\"pickFontSize.emit(s)\">{{ s }}px</button>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Überschriften -->\r\n @if (cfg.showHeading) {\r\n <div class=\"stackch_rte__dropdown\">\r\n <button type=\"button\" class=\"stackch_rte__btn\" (click)=\"toggleHeadingMenu.emit($event)\" [disabled]=\"disabled\" [title]=\"i18n.headingTitle\">H ▾</button>\r\n @if (uiState?.showHeadingMenu) {\r\n <div class=\"stackch_rte__menu\" (mousedown)=\"$event.stopPropagation()\">\r\n <button type=\"button\" class=\"stackch_rte__menu-item\" (click)=\"pickHeading.emit('p')\">{{ i18n.paragraphLabel }}</button>\r\n <button type=\"button\" class=\"stackch_rte__menu-item\" (click)=\"pickHeading.emit('pre')\"><span style=\"font-family:monospace;\">{{ i18n.codeLabel }}</span></button>\r\n <button type=\"button\" class=\"stackch_rte__menu-item\" (click)=\"pickHeading.emit('h1')\"><h1 style=\"display:inline; margin:0;\">{{ i18n.h1Label }}</h1></button>\r\n <button type=\"button\" class=\"stackch_rte__menu-item\" (click)=\"pickHeading.emit('h2')\"><h2 style=\"display:inline; margin:0;\">{{ i18n.h2Label }}</h2></button>\r\n <button type=\"button\" class=\"stackch_rte__menu-item\" (click)=\"pickHeading.emit('h3')\"><h3 style=\"display:inline; margin:0;\">{{ i18n.h3Label }}</h3></button>\r\n <button type=\"button\" class=\"stackch_rte__menu-item\" (click)=\"pickHeading.emit('h4')\"><h4 style=\"display:inline; margin:0;\">{{ i18n.h4Label }}</h4></button>\r\n <button type=\"button\" class=\"stackch_rte__menu-item\" (click)=\"pickHeading.emit('h5')\"><h5 style=\"display:inline; margin:0;\">{{ i18n.h5Label }}</h5></button>\r\n <button type=\"button\" class=\"stackch_rte__menu-item\" (click)=\"pickHeading.emit('h6')\"><h6 style=\"display:inline; margin:0;\">{{ i18n.h6Label }}</h6></button>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Spacing (Margin/Padding) -->\r\n @if (cfg.showSpacing) {\r\n <div class=\"stackch_rte__dropdown\">\r\n <button type=\"button\" class=\"stackch_rte__btn\" (click)=\"toggleSpacingMenu.emit($event)\" [disabled]=\"disabled\" [title]=\"i18n.spacingTitle\">M/P ▾</button>\r\n @if (uiState?.showSpacingMenu) {\r\n <div class=\"stackch_rte__menu\" (mousedown)=\"$event.stopPropagation()\">\r\n <div class=\"stackch_rte__menu-title\">{{ i18n.marginTitle }}</div>\r\n <button type=\"button\" class=\"stackch_rte__menu-item\" (click)=\"pickSpacing.emit({kind:'margin',target:'all',value:0})\">0</button>\r\n <button type=\"button\" class=\"stackch_rte__menu-item\" (click)=\"pickSpacing.emit({kind:'margin',target:'all',value:4})\">4px</button>\r\n <button type=\"button\" class=\"stackch_rte__menu-item\" (click)=\"pickSpacing.emit({kind:'margin',target:'all',value:8})\">8px</button>\r\n <button type=\"button\" class=\"stackch_rte__menu-item\" (click)=\"pickSpacing.emit({kind:'margin',target:'all',value:12})\">12px</button>\r\n <button type=\"button\" class=\"stackch_rte__menu-item\" (click)=\"pickSpacing.emit({kind:'margin',target:'vertical',value:16})\">Vert 16px</button>\r\n <button type=\"button\" class=\"stackch_rte__menu-item\" (click)=\"pickSpacing.emit({kind:'margin',target:'horizontal',value:16})\">Horiz 16px</button>\r\n <div class=\"stackch_rte__menu-title\" style=\"margin-top:.25rem;\">{{ i18n.paddingTitle }}</div>\r\n <button type=\"button\" class=\"stackch_rte__menu-item\" (click)=\"pickSpacing.emit({kind:'padding',target:'all',value:0})\">0</button>\r\n <button type=\"button\" class=\"stackch_rte__menu-item\" (click)=\"pickSpacing.emit({kind:'padding',target:'all',value:4})\">4px</button>\r\n <button type=\"button\" class=\"stackch_rte__menu-item\" (click)=\"pickSpacing.emit({kind:'padding',target:'all',value:8})\">8px</button>\r\n <button type=\"button\" class=\"stackch_rte__menu-item\" (click)=\"pickSpacing.emit({kind:'padding',target:'all',value:12})\">12px</button>\r\n <button type=\"button\" class=\"stackch_rte__menu-item\" (click)=\"pickSpacing.emit({kind:'padding',target:'vertical',value:16})\">Vert 16px</button>\r\n <button type=\"button\" class=\"stackch_rte__menu-item\" (click)=\"pickSpacing.emit({kind:'padding',target:'horizontal',value:16})\">Horiz 16px</button>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Farben (Dropdown horizontal) -->\r\n @if (cfg.showColor) {\r\n <div class=\"stackch_rte__dropdown\">\r\n <button type=\"button\" class=\"stackch_rte__btn\" (click)=\"toggleColorMenu.emit($event)\" [disabled]=\"disabled\" [title]=\"i18n.colorsTitle\">🎨 ▾</button>\r\n @if (uiState?.showColorMenu) {\r\n <div class=\"stackch_rte__menu stackch_rte__menu--row\" (mousedown)=\"$event.stopPropagation()\" (click)=\"$event.stopPropagation()\" [title]=\"i18n.colorMenuTitle\">\r\n <label class=\"stackch_rte__color\" (mousedown)=\"$event.stopPropagation(); onColorPointerDown($event)\" (click)=\"$event.stopPropagation()\" (pointerdown)=\"onColorPointerDown($event)\" (touchstart)=\"onColorPointerDown($event)\">\r\n <input type=\"color\" (mousedown)=\"onColorPointerDown($event)\" (click)=\"$event.stopPropagation()\" (pointerdown)=\"onColorPointerDown($event)\" (touchstart)=\"onColorPointerDown($event)\" (focus)=\"saveSelectionRequest.emit()\" (input)=\"applyColor.emit($any($event.target).value)\" (change)=\"applyColor.emit($any($event.target).value)\" [disabled]=\"disabled\" [title]=\"i18n.textColorTitle\" />\r\n A\r\n </label>\r\n <label class=\"stackch_rte__color\" [title]=\"i18n.highlightTitle\" (mousedown)=\"$event.stopPropagation(); onColorPointerDown($event)\" (click)=\"$event.stopPropagation()\" (pointerdown)=\"onColorPointerDown($event)\" (touchstart)=\"onColorPointerDown($event)\">\r\n <input type=\"color\" (mousedown)=\"onColorPointerDown($event)\" (click)=\"$event.stopPropagation()\" (pointerdown)=\"onColorPointerDown($event)\" (touchstart)=\"onColorPointerDown($event)\" (focus)=\"saveSelectionRequest.emit()\" (input)=\"applyHighlight.emit($any($event.target).value)\" (change)=\"applyHighlight.emit($any($event.target).value)\" [disabled]=\"disabled\" />\r\n ⧉\r\n </label>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Stil-Buttons -->\r\n @if (cfg.showBold) {<button type=\"button\" class=\"stackch_rte__btn\" [class.is-active]=\"isBoldActive\" (mousedown)=\"onToolbarMouseDown($event)\" (click)=\"toggleBold.emit()\" [disabled]=\"disabled\" aria-pressed=\"{{isBoldActive}}\" [title]=\"i18n.boldTitle\"><b>B</b></button>}\r\n @if (cfg.showItalic) {<button type=\"button\" class=\"stackch_rte__btn\" [class.is-active]=\"isItalicActive\" (mousedown)=\"onToolbarMouseDown($event)\" (click)=\"toggleItalic.emit()\" [disabled]=\"disabled\" aria-pressed=\"{{isItalicActive}}\" [title]=\"i18n.italicTitle\"><i>I</i></button>}\r\n @if (cfg.showUnderline) {<button type=\"button\" class=\"stackch_rte__btn\" [class.is-active]=\"isUnderlineActive\" (mousedown)=\"onToolbarMouseDown($event)\" (click)=\"toggleUnderline.emit()\" [disabled]=\"disabled\" aria-pressed=\"{{isUnderlineActive}}\" [title]=\"i18n.underlineTitle\"><u>U</u></button>}\r\n <span class=\"stackch_rte__sep\"></span>\r\n\r\n @if (cfg.showLists) {\r\n <div class=\"stackch_rte__dropdown\">\r\n <button type=\"button\" class=\"stackch_rte__btn\" (click)=\"toggleListMenu.emit($event)\" [disabled]=\"disabled\" [title]=\"i18n.listsTitle\">☰ ▾</button>\r\n @if (uiState?.showListMenu) {\r\n <div class=\"stackch_rte__menu stackch_rte__menu--row\" (mousedown)=\"$event.stopPropagation()\">\r\n <button type=\"button\" class=\"stackch_rte__menu-item\" [title]=\"i18n.bulletListTitle\" (mousedown)=\"saveSelectionRequest.emit()\" (click)=\"pickList.emit('ul')\">{{ i18n.bulletListTitle }}</button>\r\n <button type=\"button\" class=\"stackch_rte__menu-item\" [title]=\"i18n.numberedListTitle\" (mousedown)=\"saveSelectionRequest.emit()\" (click)=\"pickList.emit('ol')\">{{ i18n.numberedListTitle }}</button>\r\n </div>\r\n }\r\n </div>\r\n }\r\n <span class=\"stackch_rte__sep\"></span>\r\n\r\n @if (cfg.showAlign) {\r\n <div class=\"stackch_rte__dropdown\">\r\n <button type=\"button\" class=\"stackch_rte__btn\" (click)=\"toggleAlignMenu.emit($event)\" [disabled]=\"disabled\" [title]=\"i18n.alignTitle\">≡ ▾</button>\r\n @if (uiState?.showAlignMenu) {\r\n <div class=\"stackch_rte__menu stackch_rte__menu--row\" (mousedown)=\"$event.stopPropagation()\">\r\n <button type=\"button\" class=\"stackch_rte__menu-item\" [title]=\"i18n.alignLeftTitle\" (click)=\"pickAlign.emit('left')\">\r\n <svg viewBox=\"0 0 18 18\" width=\"18\" height=\"18\" aria-hidden=\"true\">\r\n <line x1=\"2\" y1=\"4\" x2=\"14\" y2=\"4\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\"/>\r\n <line x1=\"2\" y1=\"9\" x2=\"12\" y2=\"9\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\"/>\r\n <line x1=\"2\" y1=\"14\" x2=\"16\" y2=\"14\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\"/>\r\n </svg>\r\n </button>\r\n <button type=\"button\" class=\"stackch_rte__menu-item\" [title]=\"i18n.alignCenterTitle\" (click)=\"pickAlign.emit('center')\">\r\n <svg viewBox=\"0 0 18 18\" width=\"18\" height=\"18\" aria-hidden=\"true\">\r\n <line x1=\"3\" y1=\"4\" x2=\"15\" y2=\"4\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\"/>\r\n <line x1=\"5\" y1=\"9\" x2=\"13\" y2=\"9\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\"/>\r\n <line x1=\"3\" y1=\"14\" x2=\"15\" y2=\"14\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\"/>\r\n </svg>\r\n </button>\r\n <button type=\"button\" class=\"stackch_rte__menu-item\" [title]=\"i18n.alignRightTitle\" (click)=\"pickAlign.emit('right')\">\r\n <svg viewBox=\"0 0 18 18\" width=\"18\" height=\"18\" aria-hidden=\"true\">\r\n <line x1=\"4\" y1=\"4\" x2=\"16\" y2=\"4\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\"/>\r\n <line x1=\"6\" y1=\"9\" x2=\"16\" y2=\"9\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\"/>\r\n <line x1=\"2\" y1=\"14\" x2=\"16\" y2=\"14\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\"/>\r\n </svg>\r\n </button>\r\n <button type=\"button\" class=\"stackch_rte__menu-item\" [title]=\"i18n.alignJustifyTitle\" (click)=\"pickAlign.emit('justify')\">\r\n <svg viewBox=\"0 0 18 18\" width=\"18\" height=\"18\" aria-hidden=\"true\">\r\n <line x1=\"2\" y1=\"4\" x2=\"16\" y2=\"4\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\"/>\r\n <line x1=\"2\" y1=\"9\" x2=\"16\" y2=\"9\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\"/>\r\n <line x1=\"2\" y1=\"14\" x2=\"16\" y2=\"14\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\"/>\r\n </svg>\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n }\r\n <span class=\"stackch_rte__sep\"></span>\r\n\r\n @if (cfg.showLink) {<button type=\"button\" class=\"stackch_rte__btn\" (click)=\"insertLink.emit()\" [disabled]=\"disabled\" [title]=\"i18n.linkTitle\">🔗</button>}\r\n @if (cfg.showRemoveFormat) {<button type=\"button\" class=\"stackch_rte__btn\" (click)=\"removeFormat.emit()\" [disabled]=\"disabled\" [title]=\"i18n.removeFormatTitle\">Tx</button>}\r\n</div>\r\n","import { Component, ElementRef, EventEmitter, forwardRef, HostListener, Input, Output, ViewChild, ChangeDetectorRef } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { StackchRichtextEditorToolbar } from './toolbar/stackch-richtext-editor-toolbar';\r\n\r\nexport class StackchRichtextEditorConfig {\r\n\t// Sichtbarkeit einzelner Toolbar-Elemente (Default: an)\r\n\tshowUndoRedo = true;\r\n\tshowFontPanel = true;\r\n\tshowHeading = true;\r\n\tshowSpacing = true;\r\n\tshowColor = true;\r\n\tshowBold = true;\r\n\tshowItalic = true;\r\n\tshowUnderline = true;\r\n\tshowLists = true;\r\n\tshowAlign = true;\r\n\tshowLink = true;\r\n\tshowRemoveFormat = true;\r\n\r\n\t// i18n overrides (partial), default is English\r\n\ti18n?: Partial<StackchRichtextEditorI18n>;\r\n}\r\n\r\n// Structured metrics for editor content sizes (extendable in future)\r\nexport interface StackchRichtextMetrics {\r\n\thtmlLength: number;\r\n\ttextLength: number;\r\n}\r\n\r\nexport class StackchRichtextEditorI18n {\r\n\t// Generic\r\n\tplaceholder = 'Write…';\r\n\r\n\t// Toolbar titles\r\n\tundoTitle = 'Undo (Ctrl+Z)';\r\n\tredoTitle = 'Redo (Ctrl+Y)';\r\n\tfontPanelTitle = 'Font & Size';\r\n\tfontSectionTitle = 'Font';\r\n\tsizeSectionTitle = 'Size';\r\n\theadingTitle = 'Heading';\r\n\tspacingTitle = 'Spacing (Margin/Padding)';\r\n\tmarginTitle = 'Margin';\r\n\tpaddingTitle = 'Padding';\r\n\tcolorsTitle = 'Colors';\r\n\tcolorMenuTitle = 'Pick a color';\r\n\ttextColorTitle = 'Text color';\r\n\thighlightTitle = 'Highlight';\r\n\tboldTitle = 'Bold';\r\n\titalicTitle = 'Italic';\r\n\tunderlineTitle = 'Underline';\r\n\tlistsTitle = 'Lists';\r\n\tbulletListTitle = 'Bullet list';\r\n\tnumberedListTitle = 'Numbered list';\r\n\talignTitle = 'Alignment';\r\n\talignLeftTitle = 'Left';\r\n\talignCenterTitle = 'Center';\r\n\talignRightTitle = 'Right';\r\n\talignJustifyTitle = 'Justify';\r\n\tlinkTitle = 'Link';\r\n\tremoveFormatTitle = 'Remove format';\r\n\r\n\t// Heading menu labels\r\n\tparagraphLabel = 'Paragraph (P)';\r\n\tcodeLabel = 'Code (pre)';\r\n\th1Label = 'H1';\r\n\th2Label = 'H2';\r\n\th3Label = 'H3';\r\n\th4Label = 'H4';\r\n\th5Label = 'H5';\r\n\th6Label = 'H6';\r\n}\r\n\r\n// Predefined i18n bundles\r\n// Consumers can import these and pass via config.i18n to localize the toolbar/labels.\r\nexport const STACKCH_RTE_I18N_DE: Partial<StackchRichtextEditorI18n> = {\r\n\t// Generic\r\n\tplaceholder: 'Schreiben…',\r\n\r\n\t// Toolbar titles\r\n\tundoTitle: 'Rückgängig (Strg+Z)',\r\n\tredoTitle: 'Wiederholen (Strg+Y)',\r\n\tfontPanelTitle: 'Schrift & Größe',\r\n\tfontSectionTitle: 'Schrift',\r\n\tsizeSectionTitle: 'Größe',\r\n\theadingTitle: 'Überschrift',\r\n\tspacingTitle: 'Abstand (Außen/Innen)',\r\n\tmarginTitle: 'Außenabstand',\r\n\tpaddingTitle: 'Innenabstand',\r\n\tcolorsTitle: 'Farben',\r\n\tcolorMenuTitle: 'Farbe wählen',\r\n\ttextColorTitle: 'Textfarbe',\r\n\thighlightTitle: 'Hervorheben',\r\n\tboldTitle: 'Fett',\r\n\titalicTitle: 'Kursiv',\r\n\tunderlineTitle: 'Unterstreichen',\r\n\tlistsTitle: 'Listen',\r\n\tbulletListTitle: 'Aufzählung',\r\n\tnumberedListTitle: 'Nummeriert',\r\n\talignTitle: 'Ausrichtung',\r\n\talignLeftTitle: 'Links',\r\n\talignCenterTitle: 'Zentriert',\r\n\talignRightTitle: 'Rechts',\r\n\talignJustifyTitle: 'Blocksatz',\r\n\tlinkTitle: 'Link',\r\n\tremoveFormatTitle: 'Formatierung entfernen',\r\n\r\n\t// Heading menu labels\r\n\tparagraphLabel: 'Absatz (P)',\r\n\tcodeLabel: 'Code (pre)',\r\n\th1Label: 'H1',\r\n\th2Label: 'H2',\r\n\th3Label: 'H3',\r\n\th4Label: 'H4',\r\n\th5Label: 'H5',\r\n\th6Label: 'H6',\r\n};\r\n\r\nexport const STACKCH_RTE_I18N_FR: Partial<StackchRichtextEditorI18n> = {\r\n\t// Generic\r\n\tplaceholder: 'Écrire…',\r\n\t// Toolbar titles\r\n\tundoTitle: 'Annuler (Ctrl+Z)',\r\n\tredoTitle: 'Rétablir (Ctrl+Y)',\r\n\tfontPanelTitle: 'Police et taille',\r\n\tfontSectionTitle: 'Police',\r\n\tsizeSectionTitle: 'Taille',\r\n\theadingTitle: 'Titre',\r\n\tspacingTitle: 'Espacement (Marge/Remplissage)',\r\n\tmarginTitle: 'Marge',\r\n\tpaddingTitle: 'Remplissage',\r\n\tcolorsTitle: 'Couleurs',\r\n\tcolorMenuTitle: 'Choisir une couleur',\r\n\ttextColorTitle: 'Couleur du texte',\r\n\thighlightTitle: 'Surligner',\r\n\tboldTitle: 'Gras',\r\n\titalicTitle: 'Italique',\r\n\tunderlineTitle: 'Souligné',\r\n\tlistsTitle: 'Listes',\r\n\tbulletListTitle: 'Liste à puces',\r\n\tnumberedListTitle: 'Liste numérotée',\r\n\talignTitle: 'Alignement',\r\n\talignLeftTitle: 'Gauche',\r\n\talignCenterTitle: 'Centré',\r\n\talignRightTitle: 'Droite',\r\n\talignJustifyTitle: 'Justifié',\r\n\tlinkTitle: 'Lien',\r\n\tremoveFormatTitle: 'Effacer la mise en forme',\r\n\r\n\t// Heading menu labels\r\n\tparagraphLabel: 'Paragraphe (P)',\r\n\tcodeLabel: 'Code (pre)',\r\n\th1Label: 'H1',\r\n\th2Label: 'H2',\r\n\th3Label: 'H3',\r\n\th4Label: 'H4',\r\n\th5Label: 'H5',\r\n\th6Label: 'H6',\r\n};\r\n\r\nexport const STACKCH_RTE_I18N_IT: Partial<StackchRichtextEditorI18n> = {\r\n\t// Generic\r\n\tplaceholder: 'Scrivi…',\r\n\r\n\t// Toolbar titles\r\n\tundoTitle: 'Annulla (Ctrl+Z)',\r\n\tredoTitle: 'Ripristina (Ctrl+Y)',\r\n\tfontPanelTitle: 'Carattere e dimensione',\r\n\tfontSectionTitle: 'Carattere',\r\n\tsizeSectionTitle: 'Dimensione',\r\n\theadingTitle: 'Titolo',\r\n\tspacingTitle: 'Spaziatura (Margine/Riempimento)',\r\n\tmarginTitle: 'Margine',\r\n\tpaddingTitle: 'Riempimento',\r\n\tcolorsTitle: 'Colori',\r\n\tcolorMenuTitle: 'Scegli un colore',\r\n\ttextColorTitle: 'Colore del testo',\r\n\thighlightTitle: 'Evidenzia',\r\n\tboldTitle: 'Grassetto',\r\n\titalicTitle: 'Corsivo',\r\n\tunderlineTitle: 'Sottolineato',\r\n\tlistsTitle: 'Elenchi',\r\n\tbulletListTitle: 'Elenco puntato',\r\n\tnumberedListTitle: 'Elenco numerato',\r\n\talignTitle: 'Allineamento',\r\n\talignLeftTitle: 'Sinistra',\r\n\talignCenterTitle: 'Centrato',\r\n\talignRightTitle: 'Destra',\r\n\talignJustifyTitle: 'Giustificato',\r\n\tlinkTitle: 'Collegamento',\r\n\tremoveFormatTitle: 'Rimuovi formattazione',\r\n\r\n\t// Heading menu labels\r\n\tparagraphLabel: 'Paragrafo (P)',\r\n\tcodeLabel: 'Codice (pre)',\r\n\th1Label: 'H1',\r\n\th2Label: 'H2',\r\n\th3Label: 'H3',\r\n\th4Label: 'H4',\r\n\th5Label: 'H5',\r\n\th6Label: 'H6',\r\n};\r\n\r\n@Component({\r\n\tselector: 'stackch-richtext-editor',\r\n\tstandalone: true,\r\n\timports: [CommonModule, StackchRichtextEditorToolbar],\r\n\t\tproviders: [\r\n\t\t{\r\n\t\t\tprovide: NG_VALUE_ACCESSOR,\r\n\t\t\t\tuseExisting: forwardRef(() => StackchRichtextEditor),\r\n\t\t\tmulti: true,\r\n\t\t},\r\n\t],\r\n\ttemplateUrl: './stackch-richtext-editor.html',\r\n\tstyleUrls: ['./stackch-richtext-editor.scss']\r\n})\r\nexport class StackchRichtextEditor implements ControlValueAccessor {\r\n\t@Input() placeholder = '';\r\n\t@Input() showToolbar = true;\r\n\t@Input() fonts: string[] = [\r\n\t\t'Arial, Helvetica, sans-serif',\r\n\t\t'Georgia, serif',\r\n\t\t'Times New Roman, Times, serif',\r\n\t\t'Trebuchet MS, sans-serif',\r\n\t\t'Verdana, Geneva, sans-serif',\r\n\t\t'Courier New, Courier, monospace',\r\n\t\t'Monaco, monospace'\r\n\t];\r\n\t@Input() fontSizes: number[] = [12, 14, 16, 18, 20, 24, 28, 32];\r\n\r\n\r\n\t@Input() height?: number;\r\n\t@Input() minHeight = 160;\r\n\t@Input() maxHeight?: number;\r\n\r\n\t@Input() set disabled(value: boolean) { this._disabled = value; }\r\n\tget disabled() { return this._disabled; }\r\n\tprivate _disabled = false;\r\n\r\n\t@Output() valueChange = new EventEmitter<string>();\r\n\r\n\t// Structured metrics event (future-proof)\r\n\t@Output() metricsChange = new EventEmitter<StackchRichtextMetrics>();\r\n\r\n\t@ViewChild('editor', { static: true }) editorRef!: ElementRef<HTMLDivElement>;\r\n\r\n\tconstructor(private cdr: ChangeDetectorRef) {}\r\n\r\n\t// Toolbar-Konfiguration (default: alles an). Wir halten die übergebene Referenz\r\n\t// und mergen Defaults im Getter, damit auch Eigenschaftsänderungen via ngModel sofort wirken.\r\n\t@Input() config?: Partial<StackchRichtextEditorConfig> | null;\r\n\tget cfg(): StackchRichtextEditorConfig {\r\n\t\treturn Object.assign(new StackchRichtextEditorConfig(), this.config || {});\r\n\t}\r\n\r\n\tget i18n(): StackchRichtextEditorI18n {\r\n\t\treturn Object.assign(new StackchRichtextEditorI18n(), this.cfg.i18n || {});\r\n\t}\r\n\r\n\tprivate onChange: (value: string) => void = () => {};\r\n\tonTouched: () => void = () => {};\r\n\tprivate savedRange: Range | null = null;\r\n\t// History (Undo/Redo)\r\n\tprivate history: Array<{ html: string; range: { startPath: number[]; startOffset: number; endPath: number[]; endOffset: number; } | null }> = [];\r\n\tprivate historyIndex = -1;\r\n\tprivate isRestoringHistory = false;\r\n\tprivate snapshotTimer: any = null;\r\n\t// UI state for compact dropdowns / panel\r\n\tshowFontMenu = false;\r\n\tshowSizeMenu = false;\r\n\tshowFontPanel = false;\r\n\tshowHeadingMenu = false;\r\n\tshowSpacingMenu = false;\r\n\tshowAlignMenu = false;\r\n\tshowColorMenu = false;\r\n\tshowListMenu = false;\r\n\r\n\t// Inline state flags for active buttons\r\n\tisBoldActive = false;\r\n\tisItalicActive = false;\r\n\tisUnderlineActive = false;\r\n\r\n\t// Selection helpers\r\n\tsaveSelection() {\r\n\t\tconst sel = window.getSelection();\r\n\t\tif (!sel || sel.rangeCount === 0) return;\r\n\t\tconst range = sel.getRangeAt(0);\r\n\t\tif (!this.isRangeInEditor(range)) return;\r\n\t\tthis.savedRange = range.cloneRange();\r\n\t\tthis.updateInlineStates();\r\n\t}\r\n\r\n\t// Prevent toolbar buttons from stealing focus from the editor while preserving selection\r\n\tonToolbarMouseDown(evt: Event) {\r\n\t\t// Keep focus on the editor to avoid persistent button focus outlines\r\n\t\tevt.preventDefault();\r\n\t\tevt.stopPropagation();\r\n\t\tthis.saveSelection();\r\n\t}\r\n\r\n\t// Beim Öffnen des Color-Pickers: Selektion sichern\r\n\tonColorPointerDown(_evt: Event) {\r\n\t\tthis.saveSelection();\r\n\t}\r\n\r\n\tprivate restoreSelection() {\r\n\t\tconst sel = window.getSelection();\r\n\t\tif (!sel || !this.savedRange) return;\r\n\t\tif (!this.isRangeInEditor(this.savedRange)) return;\r\n\t\tsel.removeAllRanges();\r\n\t\tsel.addRange(this.savedRange);\r\n\t}\r\n\r\n\tprivate isRangeInEditor(range: Range) {\r\n\t\tconst editor = this.editorRef?.nativeElement;\r\n\t\tif (!editor) return false;\r\n\t\tconst container = range.commonAncestorContainer;\r\n\t\tconst node = container.nodeType === Node.ELEMENT_NODE ? (container as Element) : container.parentElement;\r\n\t\treturn !!node && editor.contains(node);\r\n\t}\r\n\r\n\t// Update active-state on selection changes inside the editor\r\n\t@HostListener('document:selectionchange')\r\n\tonSelectionChange() {\r\n\t\tconst sel = window.getSelection();\r\n\t\tif (!sel || sel.rangeCount === 0) return;\r\n\t\tconst range = sel.getRangeAt(0);\r\n\t\tif (!this.isRangeInEditor(range)) return;\r\n\t\tthis.updateInlineStates();\r\n\t}\r\n\r\n\t// Close dropdowns when clicking anywhere in the document\r\n\t@HostListener('document:click')\r\n\tcloseMenus() {\r\n\t\tthis.showFontMenu = false;\r\n\t\tthis.showSizeMenu = false;\r\n\t\tthis.showFontPanel = false;\r\n\t\tthis.showHeadingMenu = false;\r\n\t\tthis.showSpacingMenu = false;\r\n\t\tthis.showAlignMenu = false;\r\n\t\tthis.showColorMenu = false;\r\n\t\tthis.showListMenu = false;\r\n\t}\r\n\r\n\t// Keyboard: Undo/Redo\r\n\t@HostListener('keydown', ['$event'])\r\n\tonKeydown(evt: KeyboardEvent) {\r\n\t\tconst isMac = navigator.platform.toLowerCase().includes('mac');\r\n\t\tconst mod = isMac ? evt.metaKey : evt.ctrlKey;\r\n\t\tif (mod && !evt.shiftKey && (evt.key === 'z' || evt.key === 'Z')) {\r\n\t\t\tevt.preventDefault();\r\n\t\t\tthis.undo();\r\n\t\t} else if (mod && (evt.key === 'y' || evt.key === 'Y' || (evt.shiftKey && (evt.key === 'z' || evt.key === 'Z')))) {\r\n\t\t\tevt.preventDefault();\r\n\t\t\tthis.redo();\r\n\t\t}\r\n\t}\r\n\r\n\ttoggleFontMenu(evt: Event) {\r\n\t\tthis.saveSelection();\r\n\t\tthis.showFontMenu = !this.showFontMenu;\r\n\t\tif (this.showFontMenu) this.showSizeMenu = false;\r\n\t\tevt.stopPropagation();\r\n\t}\r\n\r\n\ttoggleSizeMenu(evt: Event) {\r\n\t\tthis.saveSelection();\r\n\t\tthis.showSizeMenu = !this.showSizeMenu;\r\n\t\tif (this.showSizeMenu) this.showFontMenu = false;\r\n\t\tevt.stopPropagation();\r\n\t}\r\n\r\n\ttoggleFontPanel(evt: Event) {\r\n\t\tthis.saveSelection();\r\n\t\tthis.showFontPanel = !this.showFontPanel;\r\n\t\t// close others if open\r\n\t\tif (this.showFontPanel) {\r\n\t\t\tthis.showFontMenu = false;\r\n\t\t\tthis.showSizeMenu = false;\r\n\t\t\tthis.showHeadingMenu = false;\r\n\t\t\tthis.showSpacingMenu = false;\r\n\t\t\tthis.showAlignMenu = false;\r\n\t\t\tthis.showColorMenu = false;\r\n\t\t}\r\n\t\tevt.stopPropagation();\r\n\t}\r\n\r\n\ttoggleHeadingMenu(evt: Event) {\r\n\t\tthis.saveSelection();\r\n\t\tthis.showHeadingMenu = !this.showHeadingMenu;\r\n\t\tif (this.showHeadingMenu) {\r\n\t\t\tthis.showFontMenu = false;\r\n\t\t\tthis.showSizeMenu = false;\r\n\t\t\tthis.showFontPanel = false;\r\n\t\t\tthis.showSpacingMenu = false;\r\n\t\t\tthis.showAlignMenu = false;\r\n\t\t\tthis.showColorMenu = false;\r\n\t\t}\r\n\t\tevt.stopPropagation();\r\n\t}\r\n\r\n\ttoggleSpacingMenu(evt: Event) {\r\n\t\tthis.saveSelection();\r\n\t\tthis.showSpacingMenu = !this.showSpacingMenu;\r\n\t\tif (this.showSpacingMenu) {\r\n\t\t\tthis.showFontMenu = false;\r\n\t\t\tthis.showSizeMenu = false;\r\n\t\t\tthis.showFontPanel = false;\r\n\t\t\tthis.showHeadingMenu = false;\r\n\t\t\tthis.showAlignMenu = false;\r\n\t\t\tthis.showColorMenu = false;\r\n\t\t}\r\n\t\tevt.stopPropagation();\r\n\t}\r\n\r\n\ttoggleAlignMenu(evt: Event) {\r\n\t\tthis.saveSelection();\r\n\t\tthis.showAlignMenu = !this.showAlignMenu;\r\n\t\tif (this.showAlignMenu) {\r\n\t\t\tthis.showFontMenu = false;\r\n\t\t\tthis.showSizeMenu = false;\r\n\t\t\tthis.showFontPanel = false;\r\n\t\t\tthis.showHeadingMenu = false;\r\n\t\t\tthis.showSpacingMenu = false;\r\n\t\t\tthis.showColorMenu = false;\r\n\t\t\tthis.showListMenu = false;\r\n\t\t}\r\n\t\tevt.stopPropagation();\r\n\t}\r\n\r\n\ttoggleColorMenu(evt: Event) {\r\n\t\tthis.saveSelection();\r\n\t\tthis.showColorMenu = !this.showColorMenu;\r\n\t\tif (this.showColorMenu) {\r\n\t\t\tthis.showFontMenu = false;\r\n\t\t\tthis.showSizeMenu = false;\r\n\t\t\tthis.showFontPanel = false;\r\n\t\t\tthis.showHeadingMenu = false;\r\n\t\t\tthis.showSpacingMenu = false;\r\n\t\t\tthis.showAlignMenu = false;\r\n\t\t\tthis.showListMenu = false;\r\n\t\t}\r\n\t\tevt.stopPropagation();\r\n\t}\r\n\r\n\ttoggleListMenu(evt: Event) {\r\n\t\tthis.saveSelection();\r\n\t\tthis.showListMenu = !this.showListMenu;\r\n\t\tif (this.showListMenu) {\r\n\t\t\tthis.showFontMenu = false;\r\n\t\t\tthis.showSizeMenu = false;\r\n\t\t\tthis.showFontPanel = false;\r\n\t\t\tthis.showHeadingMenu = false;\r\n\t\t\tthis.showSpacingMenu = false;\r\n\t\t\tthis.showAlignMenu = false;\r\n\t\t\tthis.showColorMenu = false;\r\n\t\t}\r\n\t\tevt.stopPropagation();\r\n\t}\r\n\r\n\tonPickAlign(where: 'left' | 'center' | 'right' | 'justify') {\r\n\t\tthis.focusEditor();\r\n\t\tthis.restoreSelection();\r\n\t\tthis.alignBlocks(where);\r\n\t\tthis.showAlignMenu = false;\r\n\t\tthis.emitValue();\r\n\t\tthis.takeSnapshot('align');\r\n\t}\r\n\r\n\tonPickFont(font: string) {\r\n\t\tif (!font) return;\r\n\t\tthis.focusEditor();\r\n\t\tthis.restoreSelection();\r\n\t\tthis.applyInlineStyle('fontFamily', font);\r\n\t\tthis.showFontMenu = false;\r\n\t}\r\n\r\n\tonPickFontSize(size: number) {\r\n\t\tif (!Number.isFinite(size)) return;\r\n\t\tthis.focusEditor();\r\n\t\tthis.restoreSelection();\r\n\t\tthis.applyInlineStyle('fontSize', `${size}px`);\r\n\t\tthis.showSizeMenu = false;\r\n\t}\r\n\r\n\tonPickList(kind: 'ul' | 'ol') {\r\n\t\tthis.focusEditor();\r\n\t\tthis.restoreSelection();\r\n\t\tthis.toggleList(kind);\r\n\t\tthis.showListMenu = false;\r\n\t\tthis.emitValue();\r\n\t\tthis.takeSnapshot('list');\r\n\t}\r\n\r\n\tonPickHeading(tag: 'p' | 'pre' | 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6') {\r\n\t\tthis.focusEditor();\r\n\t\tthis.restoreSelection();\r\n\t\tthis.setHeading(tag);\r\n\t\tthis.showHeadingMenu = false;\r\n\t\tthis.emitValue();\r\n\t\tthis.takeSnapshot('heading');\r\n\t}\r\n\r\n\tonPickSpacing(kind: 'margin' | 'padding', target: 'all' | 'vertical' | 'horizontal', value: number) {\r\n\t\tthis.focusEditor();\r\n\t\tthis.restoreSelection();\r\n\t\t// Bevorzugt: direkt auf die Selektion anwenden (inline Wrapper)\r\n\t\tif (!this.applySpacingToSelection(kind, target, value)) {\r\n\t\t\t// Fallback: Block-Spacing, wenn Auswahl blockübergreifend ist\r\n\t\t\tthis.setBlockSpacing(kind, target, value);\r\n\t\t}\r\n\t\tthis.showSpacingMenu = false;\r\n\t\tthis.emitValue();\r\n\t\tthis.takeSnapshot('spacing');\r\n\t}\r\n\r\n\t// ControlValueAccessor\r\n\twriteValue(value: string | null): void {\r\n\t\tconst el = this.editorRef?.nativeElement;\r\n\t\tif (!el) return;\r\n\t\tel.innerHTML = value || '';\r\n\t\t// Initial snapshot nur einmal anlegen\r\n\t\tif (this.history.length === 0) {\r\n\t\t\tthis.takeSnapshot('init');\r\n\t\t}\r\n\t\t// Emit initial metrics when value is written programmatically\r\n\t\tthis.emitMetrics();\r\n\t}\r\n\tregisterOnChange(fn: any): void { this.onChange = fn; }\r\n\tregisterOnTouched(fn: any): void { this.onTouched = fn; }\r\n\tsetDisabledState(isDisabled: boolean): void { this.disabled = isDisabled; }\r\n\r\n\t// Toolbar actions using document.execCommand (deprecated but broadly supported)\r\n\tcmd(command: string, value?: string) {\r\n\t\t// Restore last selection from editor before applying an action triggered by toolbar\r\n\t\tthis.focusEditor();\r\n\t\tthis.restoreSelection();\r\n\r\n\t\t// Bevorzugt: eigene Range-basierte Implementierungen\r\n\t\tswitch (command) {\r\n\t\t\tcase 'bold':\r\n\t\t\t\tthis.applyInlineStyleSmart('fontWeight', 'bold');\r\n\t\t\t\treturn;\r\n\t\t\tcase 'italic':\r\n\t\t\t\tthis.applyInlineStyleSmart('fontStyle', 'italic');\r\n\t\t\t\treturn;\r\n\t\t\tcase 'underline':\r\n\t\t\t\tthis.applyInlineStyleSmart('textDecoration', 'underline');\r\n\t\t\t\treturn;\r\n\t\t\tcase 'foreColor':\r\n\t\t\t\tthis.applyInlineStyle('color', value || '');\r\n\t\t\t\treturn;\r\n\t\t\tcase 'hiliteColor':\r\n\t\t\tcase 'backColor':\r\n\t\t\t\tthis.applyInlineStyle('backgroundColor', value || '');\r\n\t\t\t\treturn;\r\n\t\t\tcase 'createLink':\r\n\t\t\t\tif (value) {\r\n\t\t\t\t\tthis.wrapSelectionWith('a', { href: value });\r\n\t\t\t\t\tthis.emitValue();\r\n\t\t\t\t\tthis.takeSnapshot('link');\r\n\t\t\t\t}\r\n\t\t\t\treturn;\r\n\t\t\tcase 'insertText': {\r\n\t\t\t\tconst text = value ?? '';\r\n\t\t\t\tthis.insertTextAtSelection(text);\r\n\t\t\t\tthis.emitValue();\r\n\t\t\t\tthis.takeSnapshot('insertText');\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tcase 'insertUnorderedList':\r\n\t\t\t\tthis.toggleList('ul');\r\n\t\t\t\tthis.emitValue();\r\n\t\t\t\tthis.takeSnapshot('list');\r\n\t\t\t\treturn;\r\n\t\t\tcase 'insertOrderedList':\r\n\t\t\t\tthis.toggleList('ol');\r\n\t\t\t\tthis.emitValue();\r\n\t\t\t\tthis.takeSnapshot('list');\r\n\t\t\t\treturn;\r\n\t\t\tcase 'justifyLeft':\r\n\t\t\t\tthis.alignBlocks('left');\r\n\t\t\t\tthis.emitValue();\r\n\t\t\t\tthis.takeSnapshot('align');\r\n\t\t\t\treturn;\r\n\t\t\tcase 'justifyCenter':\r\n\t\t\t\tthis.alignBlocks('center');\r\n\t\t\t\tthis.emitValue();\r\n\t\t\t\tthis.takeSnapshot('align');\r\n\t\t\t\treturn;\r\n\t\t\tcase 'justifyRight':\r\n\t\t\t\tthis.alignBlocks('right');\r\n\t\t\t\tthis.emitValue();\r\n\t\t\t\tthis.takeSnapshot('align');\r\n\t\t\t\treturn;\r\n\t\t\tcase 'justifyFull':\r\n\t\t\t\tthis.alignBlocks('justify');\r\n\t\t\t\tthis.emitValue();\r\n\t\t\t\tthis.takeSnapshot('align');\r\n\t\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Fallback (deprecated): nur für Format entfernen / Links lösen als Übergang\r\n\t\ttry {\r\n\t\t\t// Hinweis im Dev-Mode ausgeben\r\n\t\t\tif (!('___rteWarned' in (this as any))) {\r\n\t\t\t\tconsole.warn('[richtext-editor] document.execCommand ist deprecated; Fallback wird nur für removeFormat/unlink verwendet.');\r\n\t\t\t\t(this as any).___rteWarned = true;\r\n\t\t\t}\r\n\t\t\tif (command === 'removeFormat' || command === 'unlink') {\r\n\t\t\t\tdocument.execCommand(command, false, value);\r\n\t\t\t}\r\n\t\t} catch {\r\n\t\t\t// Ignorieren, wenn nicht unterstützt\r\n\t\t}\r\n\t\tthis.emitValue();\r\n\t\tthis.takeSnapshot('fallback');\r\n\t}\r\n\r\n\tapplyFont(font: string) {\r\n\t\tif (!font) return;\r\n\t\tthis.applyInlineStyle('fontFamily', font);\r\n\t}\r\n\r\n\tapplyFontSize(sizePx: string) {\r\n\t\tif (!sizePx) return;\r\n\t\tconst size = Number(sizePx);\r\n\t\tif (!Number.isFinite(size)) return;\r\n\t\tthis.applyInlineStyle('fontSize', `${size}px`);\r\n\t}\r\n\r\n\tapplyColor(color: string) {\r\n\t\tthis.focusEditor();\r\n\t\tthis.restoreSelection();\r\n\t\tconst sel = window.getSelection();\r\n\t\tif (!sel || sel.rangeCount === 0) return;\r\n\t\tconst r = sel.getRangeAt(0);\r\n\t\tif (r.collapsed) {\r\n\t\t\t// Firefox/Edge: wenn keine explizite Auswahl, erweitere auf nächstes Wort\r\n\t\t\tthis.expandRangeToWord(r);\r\n\t\t}\r\n\t\tthis.applySelectionStyles({ color });\r\n\t\t\tthis.saveSelection();\r\n\t}\r\n\r\n\tapplyHighlight(color: string) {\r\n\t\tthis.focusEditor();\r\n\t\tthis.restoreSelection();\r\n\t\tconst sel = window.getSelection();\r\n\t\tif (!sel || sel.rangeCount === 0) return;\r\n\t\tconst r = sel.getRangeAt(0);\r\n\t\tif (r.collapsed) {\r\n\t\t\tthis.expandRangeToWord(r);\r\n\t\t}\r\n\t\tthis.applySelectionStyles({ backgroundColor: color });\r\n\t\t\tthis.saveSelection();\r\n\t}\r\n\r\n\tprivate expandRangeToWord(range: Range) {\r\n\t\ttry {\r\n\t\t\tconst editor = this.editorRef.nativeElement;\r\n\t\t\tlet node: Node = range.startContainer;\r\n\t\t\tif (node.nodeType !== Node.TEXT_NODE) {\r\n\t\t\t\t// Versuche, einen Textknoten in der Nähe zu finden\r\n\t\t\t\tconst walker = document.createTreeWalker(editor, NodeFilter.SHOW_TEXT);\r\n\t\t\t\tlet found: Text | null = null;\r\n\t\t\t\twhile (walker.nextNode()) {\r\n\t\t\t\t\tconst n = walker.currentNode as Text;\r\n\t\t\t\t\tif (n.parentElement && editor.contains(n.parentElement)) { found = n; break; }\r\n\t\t\t\t}\r\n\t\t\t\tif (found) node = found;\r\n\t\t\t}\r\n\t\t\tconst text = node.nodeType === Node.TEXT_NODE ? (node as Text).data : '';\r\n\t\t\tlet start = 0, end = text.length;\r\n\t\t\t// einfache Wortgrenzen-Heuristik\r\n\t\t\tconst pos = range.startOffset;\r\n\t\t\tfor (let i = pos; i > 0; i--) { if (/\\s/.test(text[i-1])) { start = i; break; } }\r\n\t\t\tfor (let i = pos; i < text.length; i++) { if (/\\s/.test(text[i])) { end = i; break; } }\r\n\t\t\trange.setStart(node, start);\r\n\t\t\trange.setEnd(node, end);\r\n\t\t\tconst sel = window.getSelection();\r\n\t\t\tif (sel) { sel.removeAllRanges(); sel.addRange(range); }\r\n\t\t} catch { /* noop */ }\r\n\t}\r\n\r\n\r\n\r\n\tinsertLink() {\r\n\t\tconst url = prompt('Link-URL eingeben:', 'https://');\r\n\t\tif (url) {\r\n\t\t\tthis.cmd('createLink', url);\r\n\t\t}\r\n\t}\r\n\r\n\tremoveFormat() {\r\n\t\tthis.cmd('removeFormat');\r\n\t\tthis.cmd('unlink');\r\n\t}\r\n\r\n\tonInput() {\r\n\t\tthis.emitValue();\r\n\t\tthis.scheduleSnapshot();\r\n\t}\r\n\r\n\tonKeyup(_evt: KeyboardEvent) {\r\n\t\tthis.saveSelection();\r\n\t\tthis.emitValue();\r\n\t\tthis.updateInlineStates();\r\n\t}\r\n\r\n\tonPaste(evt: ClipboardEvent) {\r\n\t\t// Optional: Clean paste to plain text while keeping basic formatting minimal.\r\n\t\tif (!evt.clipboardData) return;\r\n\t\tevt.preventDefault();\r\n\t\tconst text = evt.clipboardData.getData('text/plain');\r\n\t\tthis.insertTextAtSelection(text);\r\n\t\tthis.emitValue();\r\n\t\tthis.takeSnapshot('paste');\r\n\t}\r\n\r\n\tprivate emitValue() {\r\n\t\t// Clean up empty style attributes and redundant spans before emitting\r\n\t\tthis.cleanupEmptyStylesAndSpans();\r\n\t\tconst val = this.editorRef.nativeElement.innerHTML;\r\n\t\tthis.onChange(val);\r\n\t\tthis.valueChange.emit(val);\r\n\t\tthis.emitMetrics();\r\n\t\tthis.updateInlineStates();\r\n\t}\r\n\r\n\tprivate emitMetrics() {\r\n\t\tconst editor = this.editorRef?.nativeElement;\r\n\t\tif (!editor) return;\r\n\t\tconst htmlLen = editor.innerHTML.length;\r\n\t\t// textContent excludes markup; normalize null to empty string\r\n\t\tconst textLen = (editor.textContent || '').length;\r\n\t\t// Structured metrics event\r\n\t\tthis.metricsChange.emit({ htmlLength: htmlLen, textLength: textLen });\r\n\t}\r\n\r\n\t// Remove empty style attributes (style=\"\") and unwrap spans without any attributes\r\n\tprivate cleanupEmptyStylesAndSpans(root?: HTMLElement) {\r\n\t\tconsole.log('[RTE] cleanupEmptyStylesAndSpans: start cleanup');\r\n\t\tconst editor = root || this.editorRef.nativeElement;\r\n\t\tconst toUnwrap: HTMLElement[] = [];\r\n\t\tconst toRemove: HTMLElement[] = [];\r\n\t\tconst walker = document.createTreeWalker(editor, NodeFilter.SHOW_ELEMENT);\r\n\t\twhile (walker.nextNode()) {\r\n\t\t\tconst el = walker.currentNode as HTMLElement;\r\n\t\t\tif (el.hasAttribute('style')) {\r\n\t\t\t\t// If no style declarations remain, drop the attribute\r\n\t\t\t\tconst cssText = el.getAttribute('style') || '';\r\n\t\t\t\tconst byApiEmpty = (el.style ? el.style.length === 0 : false);\r\n\t\t\t\tconst normalized = cssText.replace(/[\\s;]/g, '');\r\n\t\t\t\tif (byApiEmpty || normalized.length === 0) {\r\n\t\t\t\t\tel.removeAttribute('style');\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (el.tagName === 'SPAN') {\r\n\t\t\t\tif (!el.firstChild) {\r\n\t\t\t\t\tconsole.log('[RTE] cleanup: removing empty span', el);\r\n\t\t\t\t\ttoRemove.push(el);\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tif (el.attributes.length === 0) {\r\n\t\t\t\t\tconsole.log('[RTE] cleanup: unwrapping style-free span', el);\r\n\t\t\t\t\ttoUnwrap.push(el);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tfor (const span of toUnwrap) {\r\n\t\t\tconsole.log('[RTE] cleanup: unwrap span', { span, childCount: span.childNodes.length });\r\n\t\t\twhile (span.firstChild) span.parentNode?.insertBefore(span.firstChild, span);\r\n\t\t\tspan.remove();\r\n\t\t}\r\n\t\tfor (const span of toRemove) {\r\n\t\t\tconsole.log('[RTE] cleanup: remove span without children', span);\r\n\t\t\tspan.remove();\r\n\t\t}\r\n\t}\r\n\r\n\t// History API\r\n\tget canUndo() { return this.historyIndex > 0; }\r\n\tget canRedo() { return this.historyIndex >= 0 && this.historyIndex < this.history.length - 1; }\r\n\r\n\tundo() {\r\n\t\tif (!this.canUndo) return;\r\n\t\tthis.applySnapshot(this.historyIndex - 1);\r\n\t}\r\n\r\n\tredo() {\r\n\t\tif (!this.canRedo) return;\r\n\t\tthis.applySnapshot(this.historyIndex + 1);\r\n\t}\r\n\r\n\tprivate scheduleSnapshot() {\r\n\t\tif (this.isRestoringHistory) return;\r\n\t\tif (this.snapshotTimer) clearTimeout(this.snapshotTimer);\r\n\t\tthis.snapshotTimer = setTimeout(() => this.takeSnapshot('input'), 250);\r\n\t}\r\n\r\n\tprivate takeSnapshot(_reason?: string) {\r\n\t\tif (this.isRestoringHistory) return;\r\n\t\tconst editor = this.editorRef.nativeElement;\r\n\t\tconst html = editor.innerHTML;\r\n\t\tconst sel = window.getSelection();\r\n\t\tlet rangeData: { startPath: number[]; startOffset: number; endPath: number[]; endOffset: number; } | null = null;\r\n\t\tif (sel && sel.rangeCount > 0) {\r\n\t\t\tconst r = sel.getRangeAt(0);\r\n\t\t\tif (this.isRangeInEditor(r)) {\r\n\t\t\t\tconst ser = this.serializeRange(r);\r\n\t\t\t\tif (ser) rangeData = ser;\r\n\t\t\t}\r\n\t\t}\r\n\t\t// Verhindere Duplikate nacheinander\r\n\t\tconst last = this.history[this.historyIndex];\r\n\t\tif (last && last.html === html) return;\r\n\t\t// Zukunft verwerfen bei neuem Snapshot\r\n\t\tif (this.historyIndex < this.history.length - 1) {\r\n\t\t\tthis.history = this.history.slice(0, this.historyIndex + 1);\r\n\t\t}\r\n\t\tthis.history.push({ html, range: rangeData });\r\n\t\tthis.historyIndex = this.history.length - 1;\r\n\t\t// Begrenze Historie\r\n\t\tconst MAX = 50;\r\n\t\tif (this.history.length > MAX) {\r\n\t\t\tconst drop = this.history.length - MAX;\r\n\t\t\tthis.history.splice(0, drop);\r\n\t\t\tthis.historyIndex -= drop;\r\n\t\t\tif (this.historyIndex < 0) this.historyIndex = 0;\r\n\t\t}\r\n\t}\r\n\r\n\tprivate applySnapshot(index: number) {\r\n\t\tif (index < 0 || index >= this.history.length) return;\r\n\t\tconst snap = this.history[index];\r\n\t\tconst editor = this.editorRef.nativeElement;\r\n\t\tthis.isRestoringHistory = true;\r\n\t\teditor.innerHTML = snap.html;\r\n\t\t// Selektion wiederherstellen\r\n\t\tif (snap.range) {\r\n\t\t\tthis.restoreSerializedRange(snap.range);\r\n\t\t} else {\r\n\t\t\t// Cursor ans Ende\r\n\t\t\tconst sel = window.getSelection();\r\n\t\t\tif (sel) {\r\n\t\t\t\tsel.removeAllRanges();\r\n\t\t\t\tconst r = document.createRange();\r\n\t\t\t\tr.selectNodeContents(editor);\r\n\t\t\t\tr.collapse(false);\r\n\t\t\t\tsel.addRange(r);\r\n\t\t\t}\r\n\t\t}\r\n\t\tthis.historyIndex = index;\r\n\t\tthis.isRestoringHistory = false;\r\n\t\t// Werte emittieren nach Restore\r\n\t\tthis.emitValue();\r\n\t}\r\n\r\n\tprivate serializeRange(range: Range) {\r\n\t\tconst s = this.nodePathFromNode(range.startContainer);\r\n\t\tconst e = this.nodePathFromNode(range.endContainer);\r\n\t\tif (!s || !e) return null;\r\n\t\treturn {\r\n\t\t\tstartPath: s,\r\n\t\t\tstartOffset: range.startOffset,\r\n\t\t\tendPath: e,\r\n\t\t\tendOffset: range.endOffset,\r\n\t\t};\r\n\t}\r\n\r\n\tprivate restoreSerializedRange(data: { startPath: number[]; startOffset: number; endPath: number[]; endOffset: number; }) {\r\n\t\tconst editor = this.editorRef.nativeElement;\r\n\t\tconst startNode = this.nodeFromPath(data.startPath);\r\n\t\tconst endNode = this.nodeFromPath(data.endPath);\r\n\t\tif (!startNode || !endNode) return;\r\n\t\tconst r = document.createRange();\r\n\t\ttry {\r\n\t\t\tr.setStart(startNode, Math.min(data.startOffset, this.maxOffset(startNode)));\r\n\t\t\tr.setEnd(endNode, Math.min(data.endOffset, this.maxOffset(endNode)));\r\n\t\t} catch {\r\n\t\t\tr.selectNodeContents(editor);\r\n\t\t\tr.collapse(false);\r\n\t\t}\r\n\t\tconst sel = window.getSelection();\r\n\t\tif (sel) { sel.removeAllRanges(); sel.addRange(r); }\r\n\t}\r\n\r\n\tprivate nodePathFromNode(node: Node): number[] | null {\r\n\t\tconst editor = this.editorRef.nativeElement;\r\n\t\tconst path: number[] = [];\r\n\t\tlet n: Node | null = node;\r\n\t\twhile (n && n !== editor) {\r\n\t\t\tconst pnode = n.parentNode as (Node & ParentNode) | null;\r\n\t\t\tif (!pnode) return null;\r\n\t\t\tconst idx = Array.prototype.indexOf.call(pnode.childNodes, n);\r\n\t\t\tpath.push(idx);\r\n\t\t\tn = pnode;\r\n\t\t}\r\n\t\tif (n !== editor) return null;\r\n\t\tpath.reverse();\r\n\t\treturn path;\r\n\t}\r\n\r\n\tprivate nodeFromPath(path: number[]): Node | null {\r\n\t\tconst editor = this.editorRef.nativeElement;\r\n\t\tlet n: Node = editor;\r\n\t\tfor (const idx of path) {\r\n\t\t\tif (!n.childNodes || idx < 0 || idx >= n.childNodes.length) return null;\r\n\t\t\tn = n.childNodes[idx];\r\n\t\t}\r\n\t\treturn n;\r\n\t}\r\n\r\n\tprivate maxOffset(node: Node): number {\r\n\t\tif (node.nodeType === Node.TEXT_NODE) return (node as Text).data.length;\r\n\t\treturn node.childNodes.length;\r\n\t}\r\n\r\n\tprivate focusEditor() {\r\n\t\tconst el = this.editorRef.nativeElement;\r\n\t\tif (document.activeElement !== el) {\r\n\t\t\tel.focus();\r\n\t\t}\r\n\t}\r\n\r\n\t// Minimal inline style applier for inline styles\r\n\tprivate applyInlineStyle(\r\n\t\tcssProp: 'fontFamily' | 'fontSize' | 'color' | 'backgroundColor' | 'fontWeight' | 'fontStyle' | 'textDecoration',\r\n\t\tvalue: string\r\n\t) {\r\n\t\t// Delegate to generic, style-agnostic applier\r\n\t\tthis.applySelectionStyles({ [cssProp]: value });\r\n\t}\r\n\r\n\tprivate applyInlineStyleSmart(\r\n\t\tcssProp: 'fontFamily' | 'fontSize' | 'color' | 'backgroundColor' | 'fontWeight' | 'fontStyle' | 'textDecoration',\r\n\t\tvalue: string\r\n\t) {\r\n\t\t// Delegate to generic applier which handles selection/logging\r\n\t\tthis.applySelectionStyles({ [cssProp]: value });\r\n\t}\r\n\r\n\tprivate applySelectionStyles(styles: Record<string, string>) {\r\n\t\tthis.focusEditor();\r\n\t\tthis.restoreSelection();\r\n\t\tconst sel = window.getSelection();\r\n\t\tif (!sel || sel.rangeCount === 0) {\r\n\t\t\tconsole.warn('[RTE] applySelectionStyles: no selection available', { styles });\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tlet range = sel.getRangeAt(0);\r\n\t\tif (range.collapsed) {\r\n\t\t\tconsole.warn('[RTE] applySelectionStyles: range is collapsed', { styles });\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst entries = Object.entries(styles).filter(([, v]) => v != null && v !== '');\r\n\t\tif (entries.length === 0) {\r\n\t\t\tconsole.warn('[RTE] applySelectionStyles: no style entries to apply', { styles });\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst propsToClear = Array.from(new Set(entries.map(([prop]) => this.toCssProperty(prop))));\r\n\t\tconsole.log('[RTE] applySelectionStyles: clearing props before apply', { propsToClear, entries });\r\n\t\tfor (const cssProp of propsToClear) {\r\n\t\t\tconst beforeClear = range.cloneRange();\r\n\t\t\tconst clearedRange = this.removeInlineStyleInRange(range, cssProp, { suppressEmit: true });\r\n\t\t\tconst refreshedSel = window.getSelection();\r\n\t\t\tif (refreshedSel && refreshedSel.rangeCount > 0) {\r\n\t\t\t\trange = refreshedSel.getRangeAt(0);\r\n\t\t\t} else if (clearedRange) {\r\n\t\t\t\trange = clearedRange;\r\n\t\t\t}\r\n\t\t\tif (range.collapsed && !beforeClear.collapsed) {\r\n\t\t\t\tconsole.warn('[RTE] applySelectionStyles: range collapsed after clearing, restoring previous range');\r\n\t\t\t\tconst sel = window.getSelection();\r\n\t\t\t\tif (sel) {\r\n\t\t\t\t\tsel.removeAllRanges();\r\n\t\t\t\t\tsel.addRange(beforeClear);\r\n\t\t\t\t}\r\n\t\t\t\trange = beforeClear;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst segments = this.collectTextSegments(range);\r\n\t\tif (segments.length === 0) {\r\n\t\t\tconsole.warn('[RTE] applySelectionStyles: no text segments found', {\r\n\t\t\t\tentries,\r\n\t\t\t\tcommonAncestor: range.commonAncestorContainer\r\n\t\t\t});\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconsole.log('[RTE] applySelectionStyles: applying styles to segments', {\r\n\t\t\tentries,\r\n\t\t\tsegmentCount: segments.length\r\n\t\t});\r\n\r\n\t\tconst wrappedSegments: HTMLElement[] = [];\r\n\t\tfor (let i = segments.length - 1; i >= 0; i--) {\r\n\t\t\tconst wrapped = this.applyStylesToSegment(segments[i], entries);\r\n\t\t\tif (wrapped) wrappedSegments.unshift(wrapped);\r\n\t\t}\r\n\r\n\t\tif (wrappedSegments.length) {\r\n\t\t\tconst first = wrappedSegments[0];\r\n\t\t\tconst last = wrappedSegments[wrappedSegments.length - 1];\r\n\t\t\tconst newRange = document.createRange();\r\n\t\t\tnewRange.setStartBefore(first);\r\n\t\t\tnewRange.setEndAfter(last);\r\n\t\t\tconst selAfter = window.getSelection();\r\n\t\t\tif (selAfter) {\r\n\t\t\t\tselAfter.removeAllRanges();\r\n\t\t\t\tselAfter.addRange(newRange);\r\n\t\t\t}\r\n\t\t\tthis.saveSelectionFromRange(newRange);\r\n\t\t}\r\n\r\n\t\tthis.emitValue();\r\n\t\tthis.takeSnapshot('style');\r\n\t}\r\n\r\n\tprivate collectTextSegments(range: Range): Array<{ node: Text; start: number; end: number }> {\r\n\t\tconst segments: Array<{ node: Text; start: number; end: number }> = [];\r\n\t\tconst root = range.commonAncestorContainer;\r\n\t\tif (root.nodeType === Node.TEXT_NODE) {\r\n\t\t\tconst text = root as Text;\r\n\t\t\tconst start = text === range.startContainer ? range.startOffset : 0;\r\n\t\t\tconst end = text === range.endContainer ? range.endOffset : text.data.length;\r\n\t\t\tif (start < end) segments.push({ node: text, start, end });\r\n\t\t\treturn segments;\r\n\t\t}\r\n\t\tconst walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT);\r\n\t\twhile (walker.nextNode()) {\r\n\t\t\tconst text = walker.currentNode as Text;\r\n\t\t\tif (!text.data) continue;\r\n\t\t\tif (!this.intersectsRange(range, text)) continue;\r\n\t\t\tconst start = text === range.startContainer ? range.startOffset : 0;\r\n\t\t\tconst end = text === range.endContainer ? range.endOffset : text.data.length;\r\n\t\t\tif (start >= end) continue;\r\n\t\t\tsegments.push({ node: text, start, end });\r\n\t\t}\r\n\t\treturn segments;\r\n\t}\r\n\r\n\tprivate intersectsRange(range: Range, node: Node): boolean {\r\n\t\ttry {\r\n\t\t\treturn (range as any).intersectsNode ? range.intersectsNode(node) : true;\r\n\t\t} catch {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t}\r\n\r\n\tprivate applyStylesToSegment(\r\n\t\tsegment: { node: Text; start: number; end: number },\r\n\t\tentries: Array<[string, string]>\r\n\t): HTMLElement | null {\r\n\t\tconst segRange = document.createRange();\r\n\t\tsegRange.setStart(segment.node, segment.start);\r\n\t\tsegRange.setEnd(segment.node, segment.end);\r\n\t\tconst wrapper = document.createElement('span');\r\n\t\tfor (const [prop, value] of entries) {\r\n\t\t\twrapper.style.setProperty(this.toCssProperty(prop), value);\r\n\t\t}\r\n\t\ttry {\r\n\t\t\tsegRange.surroundContents(wrapper);\r\n\t\t\treturn this.mergeAdjacentStyledSpans(wrapper);\r\n\t\t} catch (err) {\r\n\t\t\tconsole.error('[RTE] applyStylesToSegment: failed to surround contents', {\r\n\t\t\t\terror: err,\r\n\t\t\t\tsegment,\r\n\t\t\t\tentries\r\n\t\t\t});\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n\r\n\tprivate toCssProperty(prop: string): string {\r\n\t\treturn prop.replace(/([A-Z])/g, '-$1').toLowerCase();\r\n\t}\r\n\r\n\tprivate mergeAdjacentStyledSpans(span: HTMLElement): HTMLElement {\r\n\t\tif (span.tagName !== 'SPAN') return span;\r\n\t\tlet current = span;\r\n\t\tconst normalize = (el: HTMLElement | null) => el && el.tagName === 'SPAN' ? el : null;\r\n\t\tconst styleText = (el: HTMLElement | null) => (el ? el.getAttribute('style') || '' : '');\r\n\r\n\t\t// Merge with parent if identical\r\n\t\tlet parent = normalize(current.parentElement);\r\n\t\tif (parent && styleText(parent) === styleText(current) && parent.attributes.length === current.attributes.length) {\r\n\t\t\twhile (current.firstChild) parent.insertBefore(current.firstChild, current);\r\n\t\t\tcurrent.remove();\r\n\t\t\tcurrent = parent;\r\n\t\t}\r\n\r\n\t\t// Merge with previous sibling ignoring empty text nodes\r\n\t\tlet prev: Node | null = current.previousSibling;\r\n\t\twhile (prev && prev.nodeType === Node.TEXT_NODE && !(prev as Text).data.trim()) prev = prev.previousSibling;\r\n\t\tif (prev instanceof HTMLElement && prev.tagName === 'SPAN' && styleText(prev) === styleText(current) && prev.attributes.length === current.attributes.length) {\r\n\t\t\twhile (current.firstChild) prev.appendChild(current.firstChild);\r\n\t\t\tcurrent.remove();\r\n\t\t\tcurrent = prev;\r\n\t\t}\r\n\r\n\t\t// Merge with next sibling ignoring empty text nodes\r\n\t\tlet next: Node | null = current.nextSibling;\r\n\t\twhile (next && next.nodeType === Node.TEXT_NODE && !(next as Text).data.trim()) next = next.nextSibling;\r\n\t\tif (next instanceof HTMLElement && next.tagName === 'SPAN' && styleText(next) === styleText(current) && next.attributes.length === current.attributes.length) {\r\n\t\t\twhile (next.firstChild) current.appendChild(next.firstChild);\r\n\t\t\tnext.remove();\r\n\t\t}\r\n\t\treturn current;\r\n\t}\r\n\r\n\tprivate saveSelectionFromRange(range: Range) {\r\n\t\tthis.savedRange = range.cloneRange();\r\n\t}\r\n\r\n\tprivate wrapSelectionWith(tag: 'a' | 'span', attrs?: Record<string, string>) {\r\n\t\tconst sel = window.getSelection();\r\n\t\tif (!sel || sel.rangeCount === 0) return;\r\n\t\tconst range = sel.getRangeAt(0);\r\n\t\tif (range.collapsed) return;\r\n\r\n\t\tconst el = document.createElement(tag);\r\n\t\tif (attrs) {\r\n\t\t\tfor (const [k, v] of Object.entries(attrs)) {\r\n\t\t\t\tif (v != null) el.setAttribute(k, v);\r\n\t\t\t}\r\n\t\t}\r\n\t\tconst frag = range.extractContents();\r\n\t\tel.appendChild(frag);\r\n\t\trange.insertNode(el);\r\n\r\n\t\t// Auswahl hinter das Element setzen\r\n\t\tsel.removeAllRanges();\r\n\t\tconst after = document.createRange();\r\n\t\tafter.setStartAfter(el);\r\n\t\tafter.collapse(true);\r\n\t\tsel.addRange(after);\r\n\t}\r\n\r\n\tprivate insertTextAtSelection(text: string) {\r\n\t\tconst sel = window.getSelection();\r\n\t\tif (!sel || sel.rangeCount === 0) return;\r\n\t\tconst range = sel.getRangeAt(0);\r\n\t\trange.deleteContents();\r\n\t\tconst node = document.createTextNode(text);\r\n\t\trange.insertNode(node);\r\n\t\t// Cursor ans Ende des eingefügten Textes\r\n\t\tsel.removeAllRanges();\r\n\t\tconst after = document.createRange();\r\n\t\tafter.setStartAfter(node);\r\n\t\tafter.collapse(true);\r\n\t\tsel.addRange(after);\r\n\t}\r\n\r\n\t// ----- Inline toggle logic (Bold/Italic/Underline) -----\r\n\r\n\tprivate updateInlineStates() {\r\n\t\tconst sel = window.getSelection();\r\n\t\tif (!sel || sel.rangeCount === 0) { this.isBoldActive = this.isItalicActive = this.isUnderlineActive = false; return; }\r\n\t\tconst range = sel.getRangeAt(0);\r\n\t\tif (!this.isRangeInEditor(range)) { this.isBoldActive = this.isItalicActive = this.isUnderlineActive = false; return; }\r\n\t\tif (range.collapsed) {\r\n\t\t\tconst node = range.startContainer.nodeType === Node.ELEMENT_NODE ? (range.startContainer as HTMLElement) : range.startContainer.parentElement;\r\n\t\t\tthis.isBoldActive = this.isNodeBold(node);\r\n\t\t\tthis.isItalicActive = this.isNodeItalic(node);\r\n\t\t\tthis.isUnderlineActive = this.isNodeUnderline(node);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tthis.isBoldActive = this.computeBoldAnyForRange(range);\r\n\t\tthis.isItalicActive = this.computeItalicAnyForRange(range);\r\n\t\tthis.isUnderlineActive = this.computeUnderlineAnyForRange(range);\r\n\t\t// ensure UI reflects changes immediately\r\n\t\ttry { this.cdr.detectChanges(); } catch {}\r\n\t}\r\n\r\n\tprivate computeBoldAnyForRange(range: Range): boolean {\r\n\t\treturn this.selectionHasStyle(range, 'font-weight');\r\n\t}\r\n\r\n\tprivate computeItalicAnyForRange(range: Range): boolean {\r\n\t\treturn this.selectionHasStyle(range, 'font-style');\r\n\t}\r\n\r\n\tprivate computeUnderlineAnyForRange(range: Range): boolean {\r\n\t\treturn this.selectionHasStyle(range, 'text-decoration');\r\n\t}\r\n\r\n\tprivate isNodeBold(node: HTMLElement | null): boolean {\r\n\t\tlet el: HTMLElement | null = node;\r\n\t\twhile (el) {\r\n\t\t\tif (el.tagName === 'B' || el.tagName === 'STRONG') return true;\r\n\t\t\tconst cs = getComputedStyle(el);\r\n\t\t\tif (cs.fontWeight && cs.fontWeight !== 'normal' && cs.fontWeight !== '400') {\r\n\t\t\t\tconst w = cs.fontWeight === 'bold' ? 700 : parseInt(cs.fontWeight, 10);\r\n\t\t\t\tif (!Number.isNaN(w) && w >= 600) return true;\r\n\t\t\t}\r\n\t\t\tel = el.parentElement;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tprivate isNodeItalic(node: HTMLElement | null): boolean {\r\n\t\tlet el: HTMLElement | null = node;\r\n\t\twhile (el) {\r\n\t\t\tif (el.tagName === 'I' || el.tagName === 'EM') return true;\r\n\t\t\tconst cs = getComputedStyle(el);\r\n\t\t\tif (cs.fontStyle && cs.fontStyle !== 'normal') return true;\r\n\t\t\tel = el.parentElement;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tprivate isNodeUnderline(node: HTMLElement | null): boolean {\r\n\t\tlet el: HTMLElement | null = node;\r\n\t\twhile (el) {\r\n\t\t\tif (el.tagName === 'U') return true;\r\n\t\t\tconst cs = getComputedStyle(el);\r\n\t\t\tif (cs.textDecorationLine && cs.textDecorationLine.includes('underline')) return true;\r\n\t\t\tel = el.parentElement;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tprivate removeInlineStyleInRange(\r\n\t\trange: Range,\r\n\t\tcssPropKebab: string,\r\n\t\toptions?: { suppressEmit?: boolean; restoreSelection?: boolean }\r\n\t): Range | null {\r\n\t\tconst shouldRestoreSelection = options?.restoreSelection !== false;\r\n\t\tthis.isolateRangeFromStyleCarriers(range, cssPropKebab);\r\n\t\tconst editor = this.editorRef.nativeElement;\r\n\t\tconst selAfter = window.getSelection();\r\n\t\tconst effectiveRange = selAfter && selAfter.rangeCount > 0 ? selAfter.getRangeAt(0) : range;\r\n\t\tconst common = effectiveRange.commonAncestorContainer.nodeType === Node.ELEMENT_NODE\r\n\t\t\t? (effectiveRange.commonAncestorContainer as Element)\r\n\t\t\t: (effectiveRange.commonAncestorContainer.parentElement || editor);\r\n\t\tconst affected: HTMLElement[] = [];\r\n\t\tconst intersects = (node: Node) => {\r\n\t\t\ttry {\r\n\t\t\t\treturn (effectiveRange as any).intersectsNode ? effectiveRange.intersectsNode(node) : true;\r\n\t\t\t} catch {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t};\r\n\t\tconst matchesEl = (el: HTMLElement) => this.isStyleCarrier(el, cssPropKebab);\r\n\r\n\t\tconsole.log('[RTE] removeInlineStyleInRange:start', {\r\n\t\t\tcssPropKebab,\r\n\t\t\trangeCollapsed: effectiveRange.collapsed,\r\n\t\t\tcommonTag: (common as Element).tagName,\r\n\t\t\tcommonHasStyle: (common as HTMLElement).style ? (common as HTMLElement).style.getPropertyValue?.(cssPropKebab) : undefined\r\n\t\t});\r\n\r\n\t\t// Include the common element itself if it matches and intersects (TreeWalker won't visit the root)\r\n\t\tif (common instanceof HTMLElement && matchesEl(common) && intersects(common)) {\r\n\t\t\taffected.push(common);\r\n\t\t}\r\n\t\tconst walker = document.createTreeWalker(common, NodeFilter.SHOW_ELEMENT);\r\n\t\twhile (walker.nextNode()) {\r\n\t\t\tconst el = walker.currentNode as HTMLElement;\r\n\t\t\tif (!matchesEl(el)) continue;\r\n\t\t\tif (intersects(el)) {\r\n\t\t\t\taffected.push(el);\r\n\t\t\t\tconsole.log('[RTE] removeInlineStyleInRange:match', el.tagName, el.getAttribute('style'));\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tlet removedTags = 0;\r\n\t\tlet removedProps = 0;\r\n\t\tfor (const el of affected) {\r\n\t\t\tif (el.tagName === 'B' || el.tagName === 'STRONG' || el.tagName === 'I' || el.tagName === 'EM' || el.tagName === 'U') {\r\n\t\t\t\tconsole.log('[RTE] unwrap tag', el.tagName);\r\n\t\t\t\twhile (el.firstChild) el.parentNode?.insertBefore(el.firstChild, el);\r\n\t\t\t\tel.remove();\r\n\t\t\t\tremovedTags++;\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tconsole.log('[RTE] remove style', cssPropKebab, 'from', el.tagName, el.getAttribute('style'));\r\n\t\t\tel.style.removeProperty(cssPropKebab);\r\n\t\t\tif (!el.style.length) {\r\n\t\t\t\tconsole.log('[RTE] removeInlineStyleInRange: style attribute now empty, removing attribute', el);\r\n\t\t\t\tel.removeAttribute('style');\r\n\t\t\t}\r\n\t\t\tremovedProps++;\r\n\t\t\tif (!el.getAttribute('style')) {\r\n\t\t\t\tconsole.log('[RTE] unwrap empty styled span', el.tagName);\r\n\t\t\t\twhile (el.firstChild) el.parentNode?.insertBefore(el.firstChild, el);\r\n\t\t\t\tel.remove();\r\n\t\t\t}\r\n\t\t}\r\n\t\tthis.pruneDanglingStyleCarriers(common, cssPropKebab);\r\n\t\tconsole.log('[RTE] removeInlineStyleInRange:done', { affected: affected.length, removedTags, removedProps });\r\n\t\tlet resultRange: Range | null = null;\r\n\t\tif (!options?.suppressEmit) {\r\n\t\t\tthis.emitValue();\r\n\t\t\tresultRange = null;\r\n\t\t} else {\r\n\t\t\tconst sel = window.getSelection();\r\n\t\t\tif (sel && sel.rangeCount > 0) {\r\n\t\t\t\tresultRange = sel.getRangeAt(0).cloneRange();\r\n\t\t\t} else if (shouldRestoreSelection) {\r\n\t\t\t\tresultRange = effectiveRange.cloneRange();\r\n\t\t\t}\r\n\t\t\tif (shouldRestoreSelection && resultRange) {\r\n\t\t\t\tconst selRestore = window.getSelection();\r\n\t\t\t\tif (selRestore) {\r\n\t\t\t\t\tselRestore.removeAllRanges();\r\n\t\t\t\t\tselRestore.addRange(resultRange);\r\n\t\t\t\t\tthis.saveSelectionFromRange(resultRange);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn resultRange;\r\n\t}\r\n\r\n\tprivate pruneDanglingStyleCarriers(root: Element, cssPropKebab: string) {\r\n\t\tconst toRemove: HTMLElement[] = [];\r\n\t\tconst walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT);\r\n\t\tif (root instanceof HTMLElement && this.isStyleCarrier(root, cssPropKebab) && !this.elementHasVisibleContent(root)) {\r\n\t\t\ttoRemove.push(root);\r\n\t\t}\r\n\t\twhile (walker.nextNode()) {\r\n\t\t\tconst el = walker.currentNode as HTMLElement;\r\n\t\t\tif (!this.isStyleCarrier(el, cssPropKebab)) continue;\r\n\t\t\tif (this.elementHasVisibleContent(el)) continue;\r\n\t\t\ttoRemove.push(el);\r\n\t\t}\r\n\t\tfor (const el of toRemove) {\r\n\t\t\tconsole.log('[RTE] pruneDanglingStyleCarriers: removing empty carrier', { tag: el.tagName, style: el.getAttribute('style') });\r\n\t\t\tif (el.tagName === 'B' || el.tagName === 'STRONG' || el.tagName === 'I' || el.tagName === 'EM' || el.tagName === 'U') {\r\n\t\t\t\tel.remove();\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tel.remove();\r\n\t\t}\r\n\t}\r\n\r\n\tprivate elementHasVisibleContent(node: Node): boolean {\r\n\t\tif (node.nodeType === Node.TEXT_NODE) {\r\n\t\t\tconst text = (node as Text).data;\r\n\t\t\tfor (let i = 0; i < text.length; i++) {\r\n\t\t\t\tconst ch = text[i];\r\n\t\t\t\tif (ch === '\\u00a0') return true;\r\n\t\t\t\tif (!/\\s/.test(ch) && ch !== '\\u200b' && ch !== '\\u200c' && ch !== '\\u200d' && ch !== '\\ufeff') {\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tif (node.nodeType === Node.ELEMENT_NODE) {\r\n\t\t\tconst el = node as HTMLElement;\r\n\t\t\tif (el.tagName === 'BR') return true;\r\n\t\t\tfor (const child of Array.from(node.childNodes)) {\r\n\t\t\t\tif (this.elementHasVisibleContent(child)) return true;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tprivate isolateRangeFromStyleCarriers(range: Range, cssPropKebab: string) {\r\n\t\tlet carrier = this.findCarrierContainingRange(range, cssPropKebab);\r\n\t\twhile (carrier) {\r\n\t\t\tthis.splitCarrierAroundSelection(range, carrier);\r\n\t\t\tcarrier = this.findCarrierContainingRange(range, cssPropKebab);\r\n\t\t}\r\n\t}\r\n\r\n\tprivate selectionHasStyle(range: Range, cssPropKebab: 'font-weight' | 'font-style' | 'text-decoration'): boolean {\r\n\t\tconst editor = this.editorRef.nativeElement;\r\n\t\tconst common = range.commonAncestorContainer.nodeType === Node.ELEMENT_NODE\r\n\t\t\t? (range.commonAncestorContainer as Element)\r\n\t\t\t: (range.commonAncestorContainer.parentElement || editor);\r\n\t\tconst intersects = (node: Node) => this.intersectsRange(range, node);\r\n\t\tif (common instanceof HTMLElement && this.isStyleCarrier(common, cssPropKebab) && intersects(common)) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\tconst walker = document.createTreeWalker(common, NodeFilter.SHOW_ELEMENT);\r\n\t\twhile (walker.nextNode()) {\r\n\t\t\tconst el = walker.currentNode as HTMLElement;\r\n\t\t\tif (!this.isStyleCarrier(el, cssPropKebab)) continue;\r\n\t\t\tif (intersects(el)) return true;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tprivate findCarrierContainingRange(range: Range, cssPropKebab: string): HTMLElement | null {\r\n\t\tlet el: HTMLElement | null = range.commonAncestorContainer.nodeType === Node.ELEMENT_NODE\r\n\t\t\t? (range.commonAncestorContainer as HTMLElement)\r\n\t\t\t: range.commonAncestorContainer.parentElement;\r\n\t\tconst editor = this.editorRef.nativeElement;\r\n\t\twhile (el && el !== editor) {\r\n\t\t\tif (this.isStyleCarrier(el, cssPropKebab)) {\r\n\t\t\t\tconst sc = range.startContainer;\r\n\t\t\t\tconst ec = range.endContainer;\r\n\t\t\t\tif (el.contains(sc) && el.contains(ec)) return el;\r\n\t\t\t}\r\n\t\t\tel = el.parentElement;\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n\r\n\tprivate isStyleCarrier(el: HTMLElement, cssPropKebab: string): boolean {\r\n\t\tconst tag = el.tagName;\r\n\t\tif (cssPropKebab === 'font-weight') {\r\n\t\t\tif (tag === 'B' || tag === 'STRONG') return true;\r\n\t\t\tconst fw = el.style?.fontWeight || '';\r\n\t\t\treturn !!fw && fw !== 'normal' && fw !== '400';\r\n\t\t}\r\n\t\tif (cssPropKebab === 'font-style') {\r\n\t\t\tif (tag === 'I' || tag === 'EM') return true;\r\n\t\t\tconst fs = el.style?.fontStyle || '';\r\n\t\t\treturn !!fs && fs !== 'normal';\r\n\t\t}\r\n\t\tif (cssPropKebab === 'text-decoration') {\r\n\t\t\tif (tag === 'U') return true;\r\n\t\t\tconst td = (el.style as any)?.textDecoration || (el.style as any)?.textDecorationLine || '';\r\n\t\t\treturn typeof td === 'string' && td.includes('underline');\r\n\t\t}\r\n\t\tconst inline = el.style?.getPropertyValue(cssPropKebab) || '';\r\n\t\tif (!inline) return false;\r\n\t\tif (cssPropKebab === 'color') {\r\n\t\t\treturn inline !== 'inherit' && inline !== 'initial';\r\n\t\t}\r\n\t\tif (cssPropKebab === 'background-color') {\r\n\t\t\treturn inline !== 'transparent' && inline !== 'initial';\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tprivate splitCarrierAroundSelection(range: Range, carrier: HTMLElement) {\r\n\t\tconst parent = carrier.parentNode as (ParentNode & Node) | null;\r\n\t\tif (!parent) return;\r\n\t\tconst rightRange = document.createRange();\r\n\t\trightRange.setStart(range.endContainer, range.endOffset);\r\n\t\ttry { rightRange.setEnd(carrier, carrier.childNodes.length); } catch {}\r\n\t\tconst rightFrag = rightRange.extractContents();\r\n\t\tconst leftRange = document.createRange();\r\n\t\tleftRange.setStart(carrier, 0);\r\n\t\ttry { leftRange.setEnd(range.startContainer, range.startOffset); } catch {}\r\n\t\tconst leftFrag = leftRange.extractContents();\r\n\t\tif (leftFrag.childNodes.length) {\r\n\t\t\tconst leftClone = carrier.cloneNode(false) as HTMLElement;\r\n\t\t\tleftClone.appendChild(leftFrag);\r\n\t\t\tparent.insertBefore(leftClone, carrier);\r\n\t\t}\r\n\t\tlet insertAfter: ChildNode = carrier;\r\n\t\tif (rightFrag.childNodes.length) {\r\n\t\t\tconst rightClone = carrier.cloneNode(false) as HTMLElement;\r\n\t\t\trightClone.appendChild(rightFrag);\r\n\t\t\tparent.insertBefore(rightClone, carrier.nextSibling);\r\n\t\t\tinsertAfter = rightClone;\r\n\t\t}\r\n\t\twhile (carrier.firstChild) parent.insertBefore(carrier.firstChild, insertAfter);\r\n\t\tcarrier.remove();\r\n\t}\r\n\r\n\ttoggleBold() {\r\n\t\tthis.focusEditor();\r\n\t\tthis.restoreSelection();\r\n\t\tconst sel = window.getSelection();\r\n\t\tif (!sel || sel.rangeCount === 0) return;\r\n\t\tconst range = sel.getRangeAt(0);\r\n\t\tif (range.collapsed) this.expandRangeToWord(range);\r\n\t\tconst anyActive = this.computeBoldAnyForRange(range);\r\n\t\tconsole.log('[RTE] toggleBold', { anyActive, rangeCollapsed: range.collapsed });\r\n\t\tif (anyActive) {\r\n\t\t\tthis.removeInlineStyleInRange(range, 'font-weight');\r\n\t\t} else {\r\n\t\t\tthis.applySelectionStyles({ fontWeight: 'bold' } as any);\r\n\t\t}\r\n\t\tthis.updateInlineStates();\r\n\t\tthis.takeSnapshot('toggle-bold');\r\n\t}\r\n\r\n\ttoggleItalic() {\r\n\t\tthis.focusEditor();\r\n\t\tthis.restoreSelection();\r\n\t\tconst sel = window.getSelection();\r\n\t\tif (!sel || sel.rangeCount === 0) return;\r\n\t\tconst range = sel.getRangeAt(0);\r\n\t\tif (range.collapsed) this.expandRangeToWord(range);\r\n\t\tconst anyActive = this.computeItalicAnyForRange(range);\r\n\t\tif (anyActive) {\r\n\t\t\tthis.removeInlineStyleInRange(range, 'font-style');\r\n\t\t} else {\r\n\t\t\tthis.applySelectionStyles({ fontStyle: 'italic' } as any);\r\n\t\t}\r\n\t\tthis.updateInlineStates();\r\n\t\tthis.takeSnapshot('toggle-italic');\r\n\t}\r\n\r\n\ttoggleUnderline() {\r\n\t\tthis.focusEditor();\r\n\t\tthis.restoreSelection();\r\n\t\tconst sel = window.getSelection();\r\n\t\tif (!sel || sel.rangeCount === 0) return;\r\n\t\tconst range = sel.getRangeAt(0);\r\n\t\tif (range.collapsed) this.expandRangeToWord(range);\r\n\t\tconst anyActive = this.computeUnderlineAnyForRange(range);\r\n\t\tif (anyActive) {\r\n\t\t\tthis.removeInlineStyleInRange(range, 'text-decoration');\r\n\t\t} else {\r\n\t\t\tthis.applySelectionStyles({ textDecoration: 'underline' } as any);\r\n\t\t}\r\n\t\tthis.updateInlineStates();\r\n\t\tthis.takeSnapshot('toggle-underline');\r\n\t}\r\n\r\n\tprivate getCurrentRange(): Range | null {\r\n\t\tconst sel = window.getSelection();\r\n\t\tif (!sel || sel.rangeCount === 0) return null;\r\n\t\tconst range = sel.getRangeAt(0);\r\n\t\treturn this.isRangeInEditor(range) ? range : null;\r\n\t}\r\n\r\n\tprivate getEditorChildAncestor(node: Node): HTMLElement | null {\r\n\t\tconst editor = this.editorRef.nativeElement;\r\n\t\tlet el: HTMLElement | null = node.nodeType === Node.ELEMENT_NODE ? (node as HTMLElement) : node.parentElement;\r\n\t\twhile (el && el.parentElement && el.parentElement !== editor) {\r\n\t\t\tel = el.parentElement;\r\n\t\t}\r\n\t\t// Wenn direktes Kind des Editors\r\n\t\tif (el && el.parentElement === editor) return el;\r\n\t\treturn editor;\r\n\t}\r\n\r\n\tprivate findClosest(node: Node | null, selector: string): HTMLElement | null {\r\n\t\tlet el: HTMLElement | null = node && (node as HTMLElement).nodeType === 1 ? (node as HTMLElement) : node?.parentElement ?? null;\r\n\t\twhile (el) {\r\n\t\t\tif (el.matches(selector)) return el;\r\n\t\t\tel = el.parentElement;\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n\r\n\tprivate toggleList(kind: 'ul' | 'ol') {\r\n\t\tconst range = this.getCurrentRange();\r\n\t\tif (!range) return;\r\n\t\tconst editor = this.editorRef.nativeElement;\r\n\t\t// Wenn bereits in einer Liste, Liste aufheben\r\n\t\tconst listAncestor = this.findClosest(range.commonAncestorContainer, 'ul,ol');\r\n\t\tif (listAncestor) {\r\n\t\t\t// unwrap: li-Inhalte an die Stelle der Liste setzen\r\n\t\t\tconst frag = document.createDocumentFragment();\r\n\t\t\tconst items = Array.from(listAncestor.children) as HTMLElement[]; // li\r\n\t\t\tfor (const li of items) {\r\n\t\t\t\twhile (li.firstChild) frag.appendChild(li.firstChild);\r\n\t\t\t\t// Optional: Zeilenumbruch zwischen Items\r\n\t\t\t\tfrag.appendChild(document.createElement('br'));\r\n\t\t\t}\r\n\t\t\tlistAncestor.replaceWith(frag);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Neue Liste um die aktuelle Auswahl legen\r\n\t\tconst list = document.createElement(kind);\r\n\t\tconst li = document.createElement('li');\r\n\t\tconst contents = range.extractContents();\r\n\t\tif (!contents.hasChildNodes()) {\r\n\t\t\tli.textContent = '\\u200b'; // zero-width space um leere li zu vermeiden\r\n\t\t} else {\r\n\t\t\tli.appendChild(contents);\r\n\t\t}\r\n\t\tlist.appendChild(li);\r\n\t\trange.insertNode(list);\r\n\r\n\t\t// Cursor ins li setzen\r\n\t\tconst sel = window.getSelection();\r\n\t\tif (sel) {\r\n\t\t\tsel.removeAllRanges();\r\n\t\t\tconst after = document.createRange();\r\n\t\t\tafter.selectNodeContents(li);\r\n\t\t\tafter.collapse(false);\r\n\t\t\tsel.addRange(after);\r\n\t\t}\r\n\t}\r\n\r\n\tprivate alignBlocks(align: 'left' | 'center' | 'right' | 'justify') {\r\n\t\tconst range = this.getCurrentRange();\r\n\t\tif (!range) return;\r\n\t\tconst startBlock = this.getEditorChildAncestor(range.startContainer);\r\n\t\tconst endBlock = this.getEditorChildAncestor(range.endContainer);\r\n\t\tconst editor = this.editorRef.nativeElement;\r\n\r\n\t\tconst applyAlign = (el: HTMLElement | null) => {\r\n\t\t\tif (!el) return;\r\n\t\t\t(el.style as any).textAlign = align;\r\n\t\t};\r\n\r\n\t\tif (startBlock === endBlock) {\r\n\t\t\tapplyAlign(startBlock);\r\n\t\t} else {\r\n\t\t\t// grob: alle direkten Kinder zwischen start und end ausrichten\r\n\t\t\tconst children = Array.from(editor.children) as HTMLElement[];\r\n\t\t\tconst i1 = children.indexOf(startBlock as HTMLElement);\r\n\t\t\tconst i2 = children.indexOf(endBlock as HTMLElement);\r\n\t\t\tif (i1 >= 0 && i2 >= 0) {\r\n\t\t\t\tconst [from, to] = i1 <= i2 ? [i1, i2] : [i2, i1];\r\n\t\t\t\tfor (let i = from; i <= to; i++) applyAlign(children[i]);\r\n\t\t\t} else {\r\n\t\t\t\tapplyAlign(startBlock);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tprivate setBlockSpacing(kind: 'margin' | 'padding', target: 'all' | 'vertical' | 'horizontal', value: number) {\r\n\t\tconst range = this.getCurrentRange();\r\n\t\tif (!range) return;\r\n\t\tconst editor = this.editorRef.nativeElement;\r\n\r\n\t\tconst apply = (el: HTMLElement | null) => {\r\n\t\t\tif (!el) return;\r\n\t\t\tconst v = `${value}px`;\r\n\t\t\tif (target === 'all') {\r\n\t\t\t\t(el.style as any)[kind] = v;\r\n\t\t\t} else if (target === 'vertical') {\r\n\t\t\t\t(el.style as any)[`${kind}Top`] = v;\r\n\t\t\t\t(el.style as any)[`${kind}Bottom`] = v;\r\n\t\t\t} else if (target === 'horizontal') {\r\n\t\t\t\t(el.style as any)[`${kind}Left`] = v;\r\n\t\t\t\t(el.style as any)[`${kind}Right`] = v;\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tconst startBlock = this.getEditorChildAncestor(range.startContainer);\r\n\t\tconst endBlock = this.getEditorChildAncestor(range.endContainer);\r\n\r\n\t\tif (startBlock === endBlock) {\r\n\t\t\tapply(startBlock);\r\n\t\t} else {\r\n\t\t\tconst children = Array.from(editor.children) as HTMLElement[];\r\n\t\t\tconst i1 = children.indexOf(startBlock as HTMLElement);\r\n\t\t\tconst i2 = children.indexOf(endBlock as HTMLElement);\r\n\t\t\tif (i1 >= 0 && i2 >= 0) {\r\n\t\t\t\tconst [from, to] = i1 <= i2 ? [i1, i2] : [i2, i1];\r\n\t\t\t\tfor (let i = from; i <= to; i++) apply(children[i]);\r\n\t\t\t} else {\r\n\t\t\t\tapply(startBlock);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// Versucht, Margin/Padding auf die konkrete Text-Selektion anzuwenden, indem die Auswahl mit einem Span umschlossen wird.\r\n\t// Liefert true, wenn inline angewendet werden konnte; sonst false (z. B. wenn Auswahl blockübergreifend ist).\r\n\tprivate applySpacingToSelection(kind: 'margin' | 'padding', target: 'all' | 'vertical' | 'horizontal', value: number): boolean {\r\n\t\tconst sel = window.getSelection();\r\n\t\tif (!sel || sel.rangeCount === 0) return false;\r\n\t\tconst range = sel.getRangeAt(0);\r\n\t\tif (range.collapsed) return false;\r\n\r\n\t\tconst startBlock = this.getEditorChildAncestor(range.startContainer);\r\n\t\tconst endBlock = this.getEditorChildAncestor(range.endContainer);\r\n\t\t// Nur inline, wenn innerhalb desselben Blocks\r\n\t\tif (!startBlock || !endBlock || startBlock !== endBlock) return false;\r\n\r\n\t\tconst wrapper = document.createElement('span');\r\n\t\tconst px = `${value}px`;\r\n\t\tif (target === 'all') {\r\n\t\t\t(wrapper.style as any)[kind] = px;\r\n\t\t} else if (target === 'vertical') {\r\n\t\t\t(wrapper.style as any)[`${kind}Top`] = px;\r\n\t\t\t(wrapper.style as any)[`${kind}Bottom`] = px;\r\n\t\t} else if (target === 'horizontal') {\r\n\t\t\t(wrapper.style as any)[`${kind}Left`] = px;\r\n\t\t\t(wrapper.style as any)[`${kind}Right`] = px;\r\n\t\t}\r\n\t\t// Für vertikale Margins auf Inline-Elementen sicherstellen, dass sie greifen\r\n\t\tif (kind === 'margin' && (target === 'all' || target === 'vertical')) {\r\n\t\t\twrapper.style.display = 'inline-block';\r\n\t\t}\r\n\r\n\t\t// Auswahl extrahieren und in Wrapper einsetzen\r\n\t\tconst frag = range.extractContents();\r\n\t\twrapper.appendChild(frag);\r\n\t\trange.insertNode(wrapper);\r\n\r\n\t\t// Gleichartige Wrapper zusammenführen und Cursor korrekt setzen\r\n\t\tconst normalized = this.normalizeSpacingSpans(wrapper, kind, target, value) || wrapper;\r\n\t\tsel.removeAllRanges();\r\n\t\tconst after = document.createRange();\r\n\t\tif (normalized.isConnected) {\r\n\t\t\tafter.setStartAfter(normalized);\r\n\t\t} else {\r\n\t\t\t// Fallback: an das Ende des Startblocks\r\n\t\t\tconst sb = this.getEditorChildAncestor(range.startContainer);\r\n\t\t\tif (sb) after.selectNodeContents(sb);\r\n\t\t}\r\n\t\tafter.collapse(true);\r\n\t\tsel.addRange(after);\r\n\t\treturn true;\r\n\t}\r\n\r\n\tprivate normalizeSpacingSpans(\r\n\t\tspan: HTMLElement,\r\n\t\tkind: 'margin' | 'padding',\r\n\t\ttarget: 'all' | 'vertical' | 'horizontal',\r\n\t\tvalue: number\r\n\t): HTMLElement | null {\r\n\t\tconst props: string[] = [];\r\n\t\tif (target === 'all') props.push(kind);\r\n\t\tif (target === 'vertical') props.push(`${kind}Top`, `${kind}Bottom`);\r\n\t\tif (target === 'horizontal') props.push(`${kind}Left`, `${kind}Right`);\r\n\t\tconst displayNeeded = kind === 'margin' && (target === 'all' || target === 'vertical');\r\n\t\tconst v = `${value}px`;\r\n\r\n\t\tconst hasSameSpacing = (a: HTMLElement, b: HTMLElement) => {\r\n\t\t\tfor (const p of props) {\r\n\t\t\t\tif ((a.style as any)[p] !== (b.style as any)[p]) return false;\r\n\t\t\t}\r\n\t\t\tif (displayNeeded) {\r\n\t\t\t\tif (a.style.display !== b.style.display) return false;\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t};\r\n\r\n\t\t// Downward: verschachtelte identische Spans in span zusammenführen\r\n\t\tif (span.children.length === 1) {\r\n\t\t\tconst only = span.children[0] as HTMLElement;\r\n\t\t\tif (only && only.tagName === 'SPAN' && hasSameSpacing(span, only)) {\r\n\t\t\t\twhile (only.firstChild) span.appendChild(only.firstChild);\r\n\t\t\t\tonly.remove();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tlet current: HTMLElement | null = span;\r\n\r\n\t\t// Upward: mit Elternelement verschmelzen, wenn identischer Span\r\n\t\tconst parent = current.parentElement;\r\n\t\tif (parent && parent.tagName === 'SPAN' && hasSameSpacing(parent, current)) {\r\n\t\t\twhile (current.firstChild) parent.insertBefore(current.firstChild, current);\r\n\t\t\tcurrent.remove();\r\n\t\t\tcurrent = parent;\r\n\t\t}\r\n\r\n\t\tif (!current) return null;\r\n\r\n\t\t// Left merge: vorherige Geschwister-Spans mit gleicher Formatierung in current ziehen\r\n\t\tlet prev = current.previousElementSibling as HTMLElement | null;\r\n\t\tif (prev && prev.tagName === 'SPAN' && hasSameSpacing(prev, current)) {\r\n\t\t\twhile (current.firstChild) prev.appendChild(current.firstChild);\r\n\t\t\tcurrent.remove();\r\n\t\t\tcurrent = prev;\r\n\t\t}\r\n\r\n\t\t// Right merge: folgende Geschwister-Spans in current ziehen\r\n\t\tlet next = current.nextElementSibling as HTMLElement | null;\r\n\t\twhile (next && next.tagName === 'SPAN' && hasSameSpacing(current, next)) {\r\n\t\t\twhile (next.firstChild) current.appendChild(next.firstChild);\r\n\t\t\tconst toRemove = next;\r\n\t\t\tnext = next.nextElementSibling as HTMLElement | null;\r\n\t\t\ttoRemove.remove();\r\n\t\t}\r\n\r\n\t\treturn current;\r\n\t}\r\n\r\n\tprivate setHeading(tag: 'p' | 'pre' | 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6') {\r\n\t\tconst range = this.getCurrentRange();\r\n\t\tif (!range) return;\r\n\t\tconst editor = this.editorRef.nativeElement;\r\n\r\n\t\tconst replaceTag = (el: HTMLElement, newTag: string) => {\r\n\t\t\tif (!el || el === editor) return null;\r\n\t\t\tconst neo = document.createElement(newTag);\r\n\t\t\twhile (el.firstChild) neo.appendChild(el.firstChild);\r\n\t\t\tel.replaceWith(neo);\r\n\t\t\treturn neo as HTMLElement;\r\n\t\t};\r\n\r\n\t\tconst startBlock = this.getEditorChildAncestor(range.startContainer);\r\n\t\tconst endBlock = this.getEditorChildAncestor(range.endContainer);\r\n\r\n\t\tif (startBlock && startBlock !== editor && (startBlock === endBlock)) {\r\n\t\t\tconst currentTag = (startBlock.tagName || '').toLowerCase();\r\n\t\t\tif (currentTag === tag) return;\r\n\t\t\tconst convertible = /^(p|div|pre|h1|h2|h3|h4|h5|h6)$/i.test(currentTag);\r\n\t\t\tif (convertible) {\r\n\t\t\t\tconst neo = replaceTag(startBlock, tag);\r\n\t\t\t\tif (neo && tag === 'pre') {\r\n\t\t\t\t\tneo.setAttribute('style', 'white-space: pre-wrap; font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;');\r\n\t\t\t\t}\r\n\t\t\t\tif (neo) {\r\n\t\t\t\t\tconst sel = window.getSelection();\r\n\t\t\t\t\tif (sel) {\r\n\t\t\t\t\t\tsel.removeAllRanges();\r\n\t\t\t\t\t\tconst after = document.createRange();\r\n\t\t\t\t\t\tafter.selectNodeContents(neo);\r\n\t\t\t\t\t\tafter.collapse(false);\r\n\t\t\t\t\t\tsel.addRange(after);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (startBlock && endBlock && startBlock !== editor && endBlock !== editor) {\r\n\t\t\tconst children = Array.from(editor.children) as HTMLElement[];\r\n\t\t\tconst i1 = children.indexOf(startBlock as HTMLElement);\r\n\t\t\tconst i2 = children.indexOf(endBlock as HTMLElement);\r\n\t\t\tif (i1 >= 0 && i2 >= 0) {\r\n\t\t\t\tconst [from, to] = i1 <= i2 ? [i1, i2] : [i2, i1];\r\n\t\t\t\tlet last: HTMLElement | null = null;\r\n\t\t\t\tfor (let i = from; i <= to; i++) {\r\n\t\t\t\t\tconst el = children[i];\r\n\t\t\t\t\tconst currentTag = (el.tagName || '').toLowerCase();\r\n\t\t\t\t\tif (/^(p|div|pre|h1|h2|h3|h4|h5|h6)$/i.test(currentTag)) {\r\n\t\t\t\t\t\tconst neo = replaceTag(el, tag);\r\n\t\t\t\t\t\tif (neo && tag === 'pre') {\r\n\t\t\t\t\t\t\tneo.setAttribute('style', 'white-space: pre-wrap; font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;');\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (neo) last = neo;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (last) {\r\n\t\t\t\t\tconst sel = window.getSelection();\r\n\t\t\t\t\tif (sel) {\r\n\t\t\t\t\t\tsel.removeAllRanges();\r\n\t\t\t\t\t\tconst after = document.createRange();\r\n\t\t\t\t\t\tafter.selectNodeContents(last);\r\n\t\t\t\t\t\tafter.collapse(false);\r\n\t\t\t\t\t\tsel.addRange(after);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (!range.collapsed) {\r\n\t\t\tconst el = document.createElement(tag);\r\n\t\t\tif (tag === 'pre') {\r\n\t\t\t\tel.setAttribute('style', 'white-space: pre-wrap; font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;');\r\n\t\t\t}\r\n\t\t\tconst frag = range.extractContents();\r\n\t\t\tel.appendChild(frag);\r\n\t\t\trange.insertNode(el);\r\n\t\t\tconst sel = window.getSelection();\r\n\t\t\tif (sel) {\r\n\t\t\t\tsel.removeAllRanges();\r\n\t\t\t\tconst after = document.createRange();\r\n\t\t\t\tafter.selectNodeContents(el);\r\n\t\t\t\tafter.collapse(false);\r\n\t\t\t\tsel.addRange(after);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}","<div class=\"stackch_rte\" [class.stackch_rte--disabled]=\"disabled\">\r\n @if (showToolbar) {\r\n <stackch-richtext-editor-toolbar\r\n [cfg]=\"cfg\"\r\n [i18n]=\"i18n\"\r\n [disabled]=\"disabled\"\r\n [fonts]=\"fonts\"\r\n [fontSizes]=\"fontSizes\"\r\n [isBoldActive]=\"isBoldActive\"\r\n [isItalicActive]=\"isItalicActive\"\r\n [isUnderlineActive]=\"isUnderlineActive\"\r\n [canUndo]=\"canUndo\"\r\n [canRedo]=\"canRedo\"\r\n [uiState]=\"{ showFontPanel: showFontPanel, showHeadingMenu: showHeadingMenu, showSpacingMenu: showSpacingMenu, showAlignMenu: showAlignMenu, showColorMenu: showColorMenu, showListMenu: showListMenu }\"\r\n\r\n (undo)=\"undo()\"\r\n (redo)=\"redo()\"\r\n (toggleFontPanel)=\"toggleFontPanel($event)\"\r\n (toggleHeadingMenu)=\"toggleHeadingMenu($event)\"\r\n (toggleSpacingMenu)=\"toggleSpacingMenu($event)\"\r\n (toggleAlignMenu)=\"toggleAlignMenu($event)\"\r\n (toggleColorMenu)=\"toggleColorMenu($event)\"\r\n (toggleListMenu)=\"toggleListMenu($event)\"\r\n (pickFont)=\"onPickFont($any($event))\"\r\n (pickFontSize)=\"onPickFontSize($any($event))\"\r\n (pickAlign)=\"onPickAlign($any($event))\"\r\n (pickList)=\"onPickList($any($event))\"\r\n (pickHeading)=\"onPickHeading($any($event))\"\r\n (pickSpacing)=\"onPickSpacing($any($event).kind, $any($event).target, $any($event).value)\"\r\n (applyColor)=\"applyColor($any($event))\"\r\n (applyHighlight)=\"applyHighlight($any($event))\"\r\n (toggleBold)=\"toggleBold()\"\r\n (toggleItalic)=\"toggleItalic()\"\r\n (toggleUnderline)=\"toggleUnderline()\"\r\n (insertLink)=\"insertLink()\"\r\n (removeFormat)=\"removeFormat()\"\r\n (saveSelectionRequest)=\"saveSelection()\"\r\n />\r\n }\r\n\r\n <div #editor\r\n class=\"stackch_rte__editor\"\r\n [attr.contenteditable]=\"!disabled\"\r\n [attr.data-placeholder]=\"placeholder || i18n.placeholder\"\r\n [style.minHeight.px]=\"minHeight\"\r\n [style.maxHeight.px]=\"maxHeight\"\r\n [style.height.px]=\"height\"\r\n (mouseup)=\"saveSelection()\"\r\n (keyup)=\"onKeyup($event)\"\r\n (input)=\"onInput()\"\r\n (blur)=\"onTouched()\"\r\n (paste)=\"onPaste($event)\"></div>\r\n</div>\r\n","/*\r\n * Public API Surface of richtext-editor\r\n */\r\n\r\nexport * from './lib/stackch-richtext-editor';\r\nexport * from './lib/toolbar/stackch-richtext-editor-toolbar';\r\nexport { STACKCH_RTE_I18N_DE, STACKCH_RTE_I18N_FR, STACKCH_RTE_I18N_IT } from './lib/stackch-richtext-editor';\r\nexport type { StackchRichtextEditorI18n, StackchRichtextMetrics } from './lib/stackch-richtext-editor';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}