@stackch/angular-material-richtext-editor 1.0.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.
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stackch-angular-material-richtext-editor.mjs","sources":["../../../projects/stackch-richtext-editor-material/src/lib/toolbar/stackch-richtext-editor-material-toolbar.ts","../../../projects/stackch-richtext-editor-material/src/lib/toolbar/stackch-richtext-editor-material-toolbar.html","../../../projects/stackch-richtext-editor-material/src/lib/stackch-richtext-editor-material.ts","../../../projects/stackch-richtext-editor-material/src/lib/stackch-richtext-editor-material.html","../../../projects/stackch-richtext-editor-material/src/stackch-angular-material-richtext-editor.ts"],"sourcesContent":["import { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { StackchRichtextEditorConfig, StackchRichtextEditorI18n } from '../stackch-richtext-editor-material';\r\n\r\n@Component({\r\n selector: 'stackch-richtext-editor-material-toolbar',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n MatButtonModule,\r\n MatIconModule,\r\n MatMenuModule,\r\n MatTooltipModule,\r\n MatFormFieldModule,\r\n MatSelectModule,\r\n ],\r\n templateUrl: './stackch-richtext-editor-material-toolbar.html',\r\n // Reuse the editor stylesheet for consistent visuals\r\n styleUrls: ['../stackch-richtext-editor-material.scss']\r\n})\r\nexport class StackchRichtextEditorMaterialToolbar {\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 mat-icon-button (click)=\"undo.emit()\" [disabled]=\"disabled || !canUndo\" [matTooltip]=\"i18n.undoTitle\" aria-label=\"{{i18n.undoTitle}}\">\r\n <mat-icon fontIcon=\"undo\"></mat-icon>\r\n </button>\r\n <button mat-icon-button (click)=\"redo.emit()\" [disabled]=\"disabled || !canRedo\" [matTooltip]=\"i18n.redoTitle\" aria-label=\"{{i18n.redoTitle}}\">\r\n <mat-icon fontIcon=\"redo\"></mat-icon>\r\n </button>\r\n <span class=\"stackch_rte__sep\"></span>\r\n }\r\n\r\n <!-- Font & Size: single icon opens a menu with two submenus (Fonts, Sizes) -->\r\n @if (cfg.showFontPanel) {\r\n <button mat-icon-button [matMenuTriggerFor]=\"fontPanelMenu\" [disabled]=\"disabled\" [matTooltip]=\"i18n.fontPanelTitle\" (menuOpened)=\"saveSelectionRequest.emit()\" aria-label=\"{{ i18n.fontPanelTitle }}\">\r\n <mat-icon fontIcon=\"text_fields\"></mat-icon>\r\n </button>\r\n <mat-menu #fontPanelMenu=\"matMenu\">\r\n <button mat-menu-item [matMenuTriggerFor]=\"fontMenu\">\r\n <mat-icon fontIcon=\"text_fields\"></mat-icon>\r\n <span style=\"margin-left:.5rem;\">{{ i18n.fontSectionTitle }}</span>\r\n </button>\r\n <button mat-menu-item [matMenuTriggerFor]=\"sizeMenu\">\r\n <mat-icon fontIcon=\"format_size\"></mat-icon>\r\n <span style=\"margin-left:.5rem;\">{{ i18n.sizeSectionTitle }}</span>\r\n </button>\r\n </mat-menu>\r\n\r\n <mat-menu #fontMenu=\"matMenu\" (menuOpened)=\"saveSelectionRequest.emit()\">\r\n @for (f of fonts; track f) {\r\n <button mat-menu-item (click)=\"pickFont.emit(f)\"><span [style.fontFamily]=\"f\">{{ f }}</span></button>\r\n }\r\n </mat-menu>\r\n\r\n <mat-menu #sizeMenu=\"matMenu\" class=\"stackch_rte__size-menu\" (menuOpened)=\"saveSelectionRequest.emit()\">\r\n <div style=\"display:grid; grid-template-columns: repeat(3, auto); gap:.25rem .5rem; padding:.25rem .5rem;\">\r\n @for (s of fontSizes; track s) {\r\n <button mat-menu-item style=\"min-width:auto; padding:0 .5rem; line-height:28px; height:28px;\" (click)=\"pickFontSize.emit(s)\">{{ s }}px</button>\r\n }\r\n </div>\r\n </mat-menu>\r\n }\r\n\r\n <!-- Headings menu -->\r\n @if (cfg.showHeading) {\r\n <button mat-button [matMenuTriggerFor]=\"headingMenu\" [disabled]=\"disabled\" [matTooltip]=\"i18n.headingTitle\" (menuOpened)=\"saveSelectionRequest.emit()\" aria-label=\"{{ i18n.headingTitle }}\">\r\n <mat-icon fontIcon=\"title\"></mat-icon>\r\n </button>\r\n <mat-menu #headingMenu=\"matMenu\">\r\n <button mat-menu-item (click)=\"pickHeading.emit('p')\">{{ i18n.paragraphLabel }}</button>\r\n <button mat-menu-item (click)=\"pickHeading.emit('pre')\"><span style=\"font-family:monospace;\">{{ i18n.codeLabel }}</span></button>\r\n <button mat-menu-item (click)=\"pickHeading.emit('h1')\"><h1 style=\"display:inline; margin:0;\">{{ i18n.h1Label }}</h1></button>\r\n <button mat-menu-item (click)=\"pickHeading.emit('h2')\"><h2 style=\"display:inline; margin:0;\">{{ i18n.h2Label }}</h2></button>\r\n <button mat-menu-item (click)=\"pickHeading.emit('h3')\"><h3 style=\"display:inline; margin:0;\">{{ i18n.h3Label }}</h3></button>\r\n <button mat-menu-item (click)=\"pickHeading.emit('h4')\"><h4 style=\"display:inline; margin:0;\">{{ i18n.h4Label }}</h4></button>\r\n <button mat-menu-item (click)=\"pickHeading.emit('h5')\"><h5 style=\"display:inline; margin:0;\">{{ i18n.h5Label }}</h5></button>\r\n <button mat-menu-item (click)=\"pickHeading.emit('h6')\"><h6 style=\"display:inline; margin:0;\">{{ i18n.h6Label }}</h6></button>\r\n </mat-menu>\r\n }\r\n\r\n <!-- Spacing menu -->\r\n @if (cfg.showSpacing) {\r\n <button mat-icon-button [matMenuTriggerFor]=\"spacingMenu\" [disabled]=\"disabled\" [matTooltip]=\"i18n.spacingTitle\" (menuOpened)=\"saveSelectionRequest.emit()\" aria-label=\"{{ i18n.spacingTitle }}\">\r\n <mat-icon fontIcon=\"space_bar\"></mat-icon>\r\n </button>\r\n <mat-menu #spacingMenu=\"matMenu\">\r\n <button mat-menu-item [matMenuTriggerFor]=\"marginMenu\">\r\n <mat-icon fontIcon=\"vertical_align_center\"></mat-icon>\r\n <span style=\"margin-left:.5rem;\">{{ i18n.marginTitle }}</span>\r\n </button>\r\n <button mat-menu-item [matMenuTriggerFor]=\"paddingMenu\">\r\n <mat-icon fontIcon=\"crop_square\"></mat-icon>\r\n <span style=\"margin-left:.5rem;\">{{ i18n.paddingTitle }}</span>\r\n </button>\r\n </mat-menu>\r\n\r\n <mat-menu #marginMenu=\"matMenu\" (menuOpened)=\"saveSelectionRequest.emit()\">\r\n <div style=\"padding:.5rem .75rem; font-weight:600; opacity:.8\">{{ i18n.marginTitle }}</div>\r\n <button mat-menu-item (click)=\"pickSpacing.emit({kind:'margin',target:'all',value:0})\">0</button>\r\n <button mat-menu-item (click)=\"pickSpacing.emit({kind:'margin',target:'all',value:4})\">4px</button>\r\n <button mat-menu-item (click)=\"pickSpacing.emit({kind:'margin',target:'all',value:8})\">8px</button>\r\n <button mat-menu-item (click)=\"pickSpacing.emit({kind:'margin',target:'all',value:12})\">12px</button>\r\n <button mat-menu-item (click)=\"pickSpacing.emit({kind:'margin',target:'vertical',value:16})\">Vert 16px</button>\r\n <button mat-menu-item (click)=\"pickSpacing.emit({kind:'margin',target:'horizontal',value:16})\">Horiz 16px</button>\r\n </mat-menu>\r\n\r\n <mat-menu #paddingMenu=\"matMenu\" (menuOpened)=\"saveSelectionRequest.emit()\">\r\n <div style=\"padding:.5rem .75rem; font-weight:600; opacity:.8\">{{ i18n.paddingTitle }}</div>\r\n <button mat-menu-item (click)=\"pickSpacing.emit({kind:'padding',target:'all',value:0})\">0</button>\r\n <button mat-menu-item (click)=\"pickSpacing.emit({kind:'padding',target:'all',value:4})\">4px</button>\r\n <button mat-menu-item (click)=\"pickSpacing.emit({kind:'padding',target:'all',value:8})\">8px</button>\r\n <button mat-menu-item (click)=\"pickSpacing.emit({kind:'padding',target:'all',value:12})\">12px</button>\r\n <button mat-menu-item (click)=\"pickSpacing.emit({kind:'padding',target:'vertical',value:16})\">Vert 16px</button>\r\n <button mat-menu-item (click)=\"pickSpacing.emit({kind:'padding',target:'horizontal',value:16})\">Horiz 16px</button>\r\n </mat-menu>\r\n }\r\n\r\n <!-- Colors: keep native color input but wrap with mat-menu trigger for layout -->\r\n @if (cfg.showColor) {\r\n <button mat-icon-button [matMenuTriggerFor]=\"colorMenu\" [disabled]=\"disabled\" [matTooltip]=\"i18n.colorsTitle\" (menuOpened)=\"saveSelectionRequest.emit()\" aria-label=\"{{ i18n.colorsTitle }}\">\r\n <mat-icon fontIcon=\"palette\"></mat-icon>\r\n </button>\r\n <mat-menu #colorMenu=\"matMenu\">\r\n <div style=\"padding:.5rem .75rem; display:flex; gap:.75rem; align-items:center;\">\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 </mat-menu>\r\n }\r\n\r\n <!-- Style buttons -->\r\n @if (cfg.showBold) {\r\n <button mat-icon-button [color]=\"isBoldActive ? 'primary' : undefined\" (mousedown)=\"onToolbarMouseDown($event)\" (click)=\"toggleBold.emit()\" [disabled]=\"disabled\" [matTooltip]=\"i18n.boldTitle\" aria-pressed=\"{{isBoldActive}}\">\r\n <mat-icon fontIcon=\"format_bold\"></mat-icon>\r\n </button>\r\n }\r\n @if (cfg.showItalic) {\r\n <button mat-icon-button [color]=\"isItalicActive ? 'primary' : undefined\" (mousedown)=\"onToolbarMouseDown($event)\" (click)=\"toggleItalic.emit()\" [disabled]=\"disabled\" [matTooltip]=\"i18n.italicTitle\" aria-pressed=\"{{isItalicActive}}\">\r\n <mat-icon fontIcon=\"format_italic\"></mat-icon>\r\n </button>\r\n }\r\n @if (cfg.showUnderline) {\r\n <button mat-icon-button [color]=\"isUnderlineActive ? 'primary' : undefined\" (mousedown)=\"onToolbarMouseDown($event)\" (click)=\"toggleUnderline.emit()\" [disabled]=\"disabled\" [matTooltip]=\"i18n.underlineTitle\" aria-pressed=\"{{isUnderlineActive}}\">\r\n <mat-icon fontIcon=\"format_underlined\"></mat-icon>\r\n </button>\r\n }\r\n <span class=\"stackch_rte__sep\"></span>\r\n\r\n @if (cfg.showLists) {\r\n <button mat-button [matMenuTriggerFor]=\"listMenu\" [disabled]=\"disabled\" [matTooltip]=\"i18n.listsTitle\" (menuOpened)=\"saveSelectionRequest.emit()\">\r\n <mat-icon fontIcon=\"format_list_bulleted\"></mat-icon>\r\n </button>\r\n <mat-menu #listMenu=\"matMenu\">\r\n <button mat-menu-item (click)=\"pickList.emit('ul')\">{{ i18n.bulletListTitle }}</button>\r\n <button mat-menu-item (click)=\"pickList.emit('ol')\">{{ i18n.numberedListTitle }}</button>\r\n </mat-menu>\r\n }\r\n <span class=\"stackch_rte__sep\"></span>\r\n\r\n @if (cfg.showAlign) {\r\n <button mat-button [matMenuTriggerFor]=\"alignMenu\" [disabled]=\"disabled\" [matTooltip]=\"i18n.alignTitle\" (menuOpened)=\"saveSelectionRequest.emit()\">\r\n <mat-icon fontIcon=\"format_align_left\"></mat-icon>\r\n </button>\r\n <mat-menu #alignMenu=\"matMenu\">\r\n <button mat-menu-item (click)=\"pickAlign.emit('left')\"><mat-icon fontIcon=\"format_align_left\"></mat-icon> {{ i18n.alignLeftTitle }}</button>\r\n <button mat-menu-item (click)=\"pickAlign.emit('center')\"><mat-icon fontIcon=\"format_align_center\"></mat-icon> {{ i18n.alignCenterTitle }}</button>\r\n <button mat-menu-item (click)=\"pickAlign.emit('right')\"><mat-icon fontIcon=\"format_align_right\"></mat-icon> {{ i18n.alignRightTitle }}</button>\r\n <button mat-menu-item (click)=\"pickAlign.emit('justify')\"><mat-icon fontIcon=\"format_align_justify\"></mat-icon> {{ i18n.alignJustifyTitle }}</button>\r\n </mat-menu>\r\n }\r\n <span class=\"stackch_rte__sep\"></span>\r\n\r\n @if (cfg.showLink) {\r\n <button mat-icon-button (click)=\"insertLink.emit()\" [disabled]=\"disabled\" [matTooltip]=\"i18n.linkTitle\" aria-label=\"{{i18n.linkTitle}}\">\r\n <mat-icon fontIcon=\"link\"></mat-icon>\r\n </button>\r\n }\r\n @if (cfg.showRemoveFormat) {\r\n <button mat-icon-button (click)=\"removeFormat.emit()\" [disabled]=\"disabled\" [matTooltip]=\"i18n.removeFormatTitle\" aria-label=\"{{i18n.removeFormatTitle}}\">\r\n <mat-icon fontIcon=\"format_clear\"></mat-icon>\r\n </button>\r\n }\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 { StackchRichtextEditorMaterialToolbar } from './toolbar/stackch-richtext-editor-material-toolbar';\r\n\r\nexport class StackchRichtextEditorConfig {\r\n // Sichtbarkeit einzelner Toolbar-Elemente (Default: an)\r\n showUndoRedo = true;\r\n showFontPanel = true;\r\n showHeading = true;\r\n showSpacing = true;\r\n showColor = true;\r\n showBold = true;\r\n showItalic = true;\r\n showUnderline = true;\r\n showLists = true;\r\n showAlign = true;\r\n showLink = true;\r\n showRemoveFormat = true;\r\n\r\n // i18n overrides (partial), default is English\r\n i18n?: Partial<StackchRichtextEditorI18n>;\r\n}\r\n\r\nexport class StackchRichtextEditorI18n {\r\n // Generic\r\n placeholder = 'Write…';\r\n\r\n // Toolbar titles\r\n undoTitle = 'Undo (Ctrl+Z)';\r\n redoTitle = 'Redo (Ctrl+Y)';\r\n fontPanelTitle = 'Font & Size';\r\n fontSectionTitle = 'Font';\r\n sizeSectionTitle = 'Size';\r\n headingTitle = 'Heading';\r\n spacingTitle = 'Spacing (Margin/Padding)';\r\n marginTitle = 'Margin';\r\n paddingTitle = 'Padding';\r\n colorsTitle = 'Colors';\r\n colorMenuTitle = 'Pick a color';\r\n textColorTitle = 'Text color';\r\n highlightTitle = 'Highlight';\r\n boldTitle = 'Bold';\r\n italicTitle = 'Italic';\r\n underlineTitle = 'Underline';\r\n listsTitle = 'Lists';\r\n bulletListTitle = 'Bullet list';\r\n numberedListTitle = 'Numbered list';\r\n alignTitle = 'Alignment';\r\n alignLeftTitle = 'Left';\r\n alignCenterTitle = 'Center';\r\n alignRightTitle = 'Right';\r\n alignJustifyTitle = 'Justify';\r\n linkTitle = 'Link';\r\n removeFormatTitle = 'Remove format';\r\n\r\n // Heading menu labels\r\n paragraphLabel = 'Paragraph (P)';\r\n codeLabel = 'Code (pre)';\r\n h1Label = 'H1';\r\n h2Label = 'H2';\r\n h3Label = 'H3';\r\n h4Label = 'H4';\r\n h5Label = 'H5';\r\n h6Label = '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 // Generic\r\n placeholder: 'Schreiben…',\r\n\r\n // Toolbar titles\r\n undoTitle: 'Rückgängig (Strg+Z)',\r\n redoTitle: 'Wiederholen (Strg+Y)',\r\n fontPanelTitle: 'Schrift & Größe',\r\n fontSectionTitle: 'Schrift',\r\n sizeSectionTitle: 'Größe',\r\n headingTitle: 'Überschrift',\r\n spacingTitle: 'Abstand (Außen/Innen)',\r\n marginTitle: 'Außenabstand',\r\n paddingTitle: 'Innenabstand',\r\n colorsTitle: 'Farben',\r\n colorMenuTitle: 'Farbe wählen',\r\n textColorTitle: 'Textfarbe',\r\n highlightTitle: 'Hervorheben',\r\n boldTitle: 'Fett',\r\n italicTitle: 'Kursiv',\r\n underlineTitle: 'Unterstreichen',\r\n listsTitle: 'Listen',\r\n bulletListTitle: 'Aufzählung',\r\n numberedListTitle: 'Nummeriert',\r\n alignTitle: 'Ausrichtung',\r\n alignLeftTitle: 'Links',\r\n alignCenterTitle: 'Zentriert',\r\n alignRightTitle: 'Rechts',\r\n alignJustifyTitle: 'Blocksatz',\r\n linkTitle: 'Link',\r\n removeFormatTitle: 'Formatierung entfernen',\r\n\r\n // Heading menu labels\r\n paragraphLabel: 'Absatz (P)',\r\n codeLabel: 'Code (pre)',\r\n h1Label: 'H1',\r\n h2Label: 'H2',\r\n h3Label: 'H3',\r\n h4Label: 'H4',\r\n h5Label: 'H5',\r\n h6Label: 'H6',\r\n};\r\n\r\nexport const STACKCH_RTE_I18N_FR: Partial<StackchRichtextEditorI18n> = {\r\n // Generic\r\n placeholder: 'Écrire…',\r\n\r\n // Toolbar titles\r\n undoTitle: 'Annuler (Ctrl+Z)',\r\n redoTitle: 'Rétablir (Ctrl+Y)',\r\n fontPanelTitle: 'Police et taille',\r\n fontSectionTitle: 'Police',\r\n sizeSectionTitle: 'Taille',\r\n headingTitle: 'Titre',\r\n spacingTitle: 'Espacement (Marge/Remplissage)',\r\n marginTitle: 'Marge',\r\n paddingTitle: 'Remplissage',\r\n colorsTitle: 'Couleurs',\r\n colorMenuTitle: 'Choisir une couleur',\r\n textColorTitle: 'Couleur du texte',\r\n highlightTitle: 'Surligner',\r\n boldTitle: 'Gras',\r\n italicTitle: 'Italique',\r\n underlineTitle: 'Souligné',\r\n listsTitle: 'Listes',\r\n bulletListTitle: 'Liste à puces',\r\n numberedListTitle: 'Liste numérotée',\r\n alignTitle: 'Alignement',\r\n alignLeftTitle: 'Gauche',\r\n alignCenterTitle: 'Centré',\r\n alignRightTitle: 'Droite',\r\n alignJustifyTitle: 'Justifié',\r\n linkTitle: 'Lien',\r\n removeFormatTitle: 'Effacer la mise en forme',\r\n\r\n // Heading menu labels\r\n paragraphLabel: 'Paragraphe (P)',\r\n codeLabel: 'Code (pre)',\r\n h1Label: 'H1',\r\n h2Label: 'H2',\r\n h3Label: 'H3',\r\n h4Label: 'H4',\r\n h5Label: 'H5',\r\n h6Label: 'H6',\r\n};\r\n\r\nexport const STACKCH_RTE_I18N_IT: Partial<StackchRichtextEditorI18n> = {\r\n // Generic\r\n placeholder: 'Scrivi…',\r\n\r\n // Toolbar titles\r\n undoTitle: 'Annulla (Ctrl+Z)',\r\n redoTitle: 'Ripristina (Ctrl+Y)',\r\n fontPanelTitle: 'Carattere e dimensione',\r\n fontSectionTitle: 'Carattere',\r\n sizeSectionTitle: 'Dimensione',\r\n headingTitle: 'Titolo',\r\n spacingTitle: 'Spaziatura (Margine/Riempimento)',\r\n marginTitle: 'Margine',\r\n paddingTitle: 'Riempimento',\r\n colorsTitle: 'Colori',\r\n colorMenuTitle: 'Scegli un colore',\r\n textColorTitle: 'Colore del testo',\r\n highlightTitle: 'Evidenzia',\r\n boldTitle: 'Grassetto',\r\n italicTitle: 'Corsivo',\r\n underlineTitle: 'Sottolineato',\r\n listsTitle: 'Elenchi',\r\n bulletListTitle: 'Elenco puntato',\r\n numberedListTitle: 'Elenco numerato',\r\n alignTitle: 'Allineamento',\r\n alignLeftTitle: 'Sinistra',\r\n alignCenterTitle: 'Centrato',\r\n alignRightTitle: 'Destra',\r\n alignJustifyTitle: 'Giustificato',\r\n linkTitle: 'Collegamento',\r\n removeFormatTitle: 'Rimuovi formattazione',\r\n\r\n // Heading menu labels\r\n paragraphLabel: 'Paragrafo (P)',\r\n codeLabel: 'Codice (pre)',\r\n h1Label: 'H1',\r\n h2Label: 'H2',\r\n h3Label: 'H3',\r\n h4Label: 'H4',\r\n h5Label: 'H5',\r\n h6Label: 'H6',\r\n};\r\n\r\n@Component({\r\n selector: 'stackch-richtext-editor-material',\r\n standalone: true,\r\n imports: [CommonModule, StackchRichtextEditorMaterialToolbar],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => StackchRichtextEditorMaterial),\r\n multi: true,\r\n },\r\n ],\r\n templateUrl: './stackch-richtext-editor-material.html',\r\n styleUrls: ['./stackch-richtext-editor-material.scss']\r\n})\r\nexport class StackchRichtextEditorMaterial implements ControlValueAccessor {\r\n @Input() placeholder = '';\r\n @Input() showToolbar = true;\r\n @Input() fonts: string[] = [\r\n 'Arial, Helvetica, sans-serif',\r\n 'Georgia, serif',\r\n 'Times New Roman, Times, serif',\r\n 'Trebuchet MS, sans-serif',\r\n 'Verdana, Geneva, sans-serif',\r\n 'Courier New, Courier, monospace',\r\n 'Monaco, monospace'\r\n ];\r\n @Input() fontSizes: number[] = [12, 14, 16, 18, 20, 24, 28, 32];\r\n\r\n\r\n @Input() height?: number;\r\n @Input() minHeight = 160;\r\n @Input() maxHeight?: number;\r\n\r\n @Input() set disabled(value: boolean) { this._disabled = value; }\r\n get disabled() { return this._disabled; }\r\n private _disabled = false;\r\n\r\n @Output() valueChange = new EventEmitter<string>();\r\n\r\n @ViewChild('editor', { static: true }) editorRef!: ElementRef<HTMLDivElement>;\r\n\r\n constructor(private cdr: ChangeDetectorRef) {}\r\n\r\n // Toolbar-Konfiguration (default: alles an). Wir halten die übergebene Referenz\r\n // und mergen Defaults im Getter, damit auch Eigenschaftsänderungen via ngModel sofort wirken.\r\n @Input() config?: Partial<StackchRichtextEditorConfig> | null;\r\n get cfg(): StackchRichtextEditorConfig {\r\n return Object.assign(new StackchRichtextEditorConfig(), this.config || {});\r\n }\r\n\r\n get i18n(): StackchRichtextEditorI18n {\r\n return Object.assign(new StackchRichtextEditorI18n(), this.cfg.i18n || {});\r\n }\r\n\r\n private onChange: (value: string) => void = () => {};\r\n onTouched: () => void = () => {};\r\n private savedRange: Range | null = null;\r\n // History (Undo/Redo)\r\n private history: Array<{ html: string; range: { startPath: number[]; startOffset: number; endPath: number[]; endOffset: number; } | null }> = [];\r\n private historyIndex = -1;\r\n private isRestoringHistory = false;\r\n private snapshotTimer: any = null;\r\n // UI state for compact dropdowns / panel\r\n showFontMenu = false;\r\n showSizeMenu = false;\r\n showFontPanel = false;\r\n showHeadingMenu = false;\r\n showSpacingMenu = false;\r\n showAlignMenu = false;\r\n showColorMenu = false;\r\n showListMenu = false;\r\n\r\n // Inline state flags for active buttons\r\n isBoldActive = false;\r\n isItalicActive = false;\r\n isUnderlineActive = false;\r\n\r\n // Selection helpers\r\n saveSelection() {\r\n const sel = window.getSelection();\r\n if (!sel || sel.rangeCount === 0) return;\r\n const range = sel.getRangeAt(0);\r\n if (!this.isRangeInEditor(range)) return;\r\n this.savedRange = range.cloneRange();\r\n this.updateInlineStates();\r\n }\r\n\r\n // Prevent toolbar buttons from stealing focus from the editor while preserving selection\r\n onToolbarMouseDown(evt: Event) {\r\n // Keep focus on the editor to avoid persistent button focus outlines\r\n evt.preventDefault();\r\n evt.stopPropagation();\r\n this.saveSelection();\r\n }\r\n\r\n // Beim Öffnen des Color-Pickers: Selektion sichern\r\n onColorPointerDown(_evt: Event) {\r\n this.saveSelection();\r\n }\r\n\r\n private restoreSelection() {\r\n const sel = window.getSelection();\r\n if (!sel || !this.savedRange) return;\r\n if (!this.isRangeInEditor(this.savedRange)) return;\r\n sel.removeAllRanges();\r\n sel.addRange(this.savedRange);\r\n }\r\n\r\n private isRangeInEditor(range: Range) {\r\n const editor = this.editorRef?.nativeElement;\r\n if (!editor) return false;\r\n const container = range.commonAncestorContainer;\r\n const node = container.nodeType === Node.ELEMENT_NODE ? (container as Element) : container.parentElement;\r\n return !!node && editor.contains(node);\r\n }\r\n\r\n // Update active-state on selection changes inside the editor\r\n @HostListener('document:selectionchange')\r\n onSelectionChange() {\r\n const sel = window.getSelection();\r\n if (!sel || sel.rangeCount === 0) return;\r\n const range = sel.getRangeAt(0);\r\n if (!this.isRangeInEditor(range)) return;\r\n this.updateInlineStates();\r\n }\r\n\r\n // Close dropdowns when clicking anywhere in the document\r\n @HostListener('document:click')\r\n closeMenus() {\r\n this.showFontMenu = false;\r\n this.showSizeMenu = false;\r\n this.showFontPanel = false;\r\n this.showHeadingMenu = false;\r\n this.showSpacingMenu = false;\r\n this.showAlignMenu = false;\r\n this.showColorMenu = false;\r\n this.showListMenu = false;\r\n }\r\n\r\n // Keyboard: Undo/Redo\r\n @HostListener('keydown', ['$event'])\r\n onKeydown(evt: KeyboardEvent) {\r\n const isMac = navigator.platform.toLowerCase().includes('mac');\r\n const mod = isMac ? evt.metaKey : evt.ctrlKey;\r\n if (mod && !evt.shiftKey && (evt.key === 'z' || evt.key === 'Z')) {\r\n evt.preventDefault();\r\n this.undo();\r\n } else if (mod && (evt.key === 'y' || evt.key === 'Y' || (evt.shiftKey && (evt.key === 'z' || evt.key === 'Z')))) {\r\n evt.preventDefault();\r\n this.redo();\r\n }\r\n }\r\n\r\n toggleFontMenu(evt: Event) {\r\n this.saveSelection();\r\n this.showFontMenu = !this.showFontMenu;\r\n if (this.showFontMenu) this.showSizeMenu = false;\r\n evt.stopPropagation();\r\n }\r\n\r\n toggleSizeMenu(evt: Event) {\r\n this.saveSelection();\r\n this.showSizeMenu = !this.showSizeMenu;\r\n if (this.showSizeMenu) this.showFontMenu = false;\r\n evt.stopPropagation();\r\n }\r\n\r\n toggleFontPanel(evt: Event) {\r\n this.saveSelection();\r\n this.showFontPanel = !this.showFontPanel;\r\n // close others if open\r\n if (this.showFontPanel) {\r\n this.showFontMenu = false;\r\n this.showSizeMenu = false;\r\n this.showHeadingMenu = false;\r\n this.showSpacingMenu = false;\r\n this.showAlignMenu = false;\r\n this.showColorMenu = false;\r\n }\r\n evt.stopPropagation();\r\n }\r\n\r\n toggleHeadingMenu(evt: Event) {\r\n this.saveSelection();\r\n this.showHeadingMenu = !this.showHeadingMenu;\r\n if (this.showHeadingMenu) {\r\n this.showFontMenu = false;\r\n this.showSizeMenu = false;\r\n this.showFontPanel = false;\r\n this.showSpacingMenu = false;\r\n this.showAlignMenu = false;\r\n this.showColorMenu = false;\r\n }\r\n evt.stopPropagation();\r\n }\r\n\r\n toggleSpacingMenu(evt: Event) {\r\n this.saveSelection();\r\n this.showSpacingMenu = !this.showSpacingMenu;\r\n if (this.showSpacingMenu) {\r\n this.showFontPanel = false;\r\n this.showHeadingMenu = false;\r\n this.showAlignMenu = false;\r\n this.showColorMenu = false;\r\n }\r\n evt.stopPropagation();\r\n }\r\n\r\n toggleAlignMenu(evt: Event) {\r\n this.saveSelection();\r\n this.showAlignMenu = !this.showAlignMenu;\r\n if (this.showAlignMenu) {\r\n this.showFontMenu = false;\r\n this.showSizeMenu = false;\r\n this.showFontPanel = false;\r\n this.showHeadingMenu = false;\r\n this.showSpacingMenu = false;\r\n this.showColorMenu = false;\r\n this.showListMenu = false;\r\n }\r\n evt.stopPropagation();\r\n }\r\n\r\n toggleColorMenu(evt: Event) {\r\n this.saveSelection();\r\n this.showColorMenu = !this.showColorMenu;\r\n if (this.showColorMenu) {\r\n this.showFontMenu = false;\r\n this.showSizeMenu = false;\r\n this.showFontPanel = false;\r\n this.showHeadingMenu = false;\r\n this.showSpacingMenu = false;\r\n this.showAlignMenu = false;\r\n this.showListMenu = false;\r\n }\r\n evt.stopPropagation();\r\n }\r\n\r\n toggleListMenu(evt: Event) {\r\n this.saveSelection();\r\n this.showListMenu = !this.showListMenu;\r\n if (this.showListMenu) {\r\n this.showFontMenu = false;\r\n this.showSizeMenu = false;\r\n this.showFontPanel = false;\r\n this.showHeadingMenu = false;\r\n this.showSpacingMenu = false;\r\n this.showAlignMenu = false;\r\n this.showColorMenu = false;\r\n }\r\n evt.stopPropagation();\r\n }\r\n\r\n onPickAlign(where: 'left' | 'center' | 'right' | 'justify') {\r\n this.focusEditor();\r\n this.restoreSelection();\r\n this.alignBlocks(where);\r\n this.showAlignMenu = false;\r\n this.emitValue();\r\n this.takeSnapshot('align');\r\n }\r\n\r\n onPickFont(font: string) {\r\n if (!font) return;\r\n this.focusEditor();\r\n this.restoreSelection();\r\n this.applyInlineStyle('fontFamily', font);\r\n this.showFontMenu = false;\r\n }\r\n\r\n onPickFontSize(size: number) {\r\n if (!Number.isFinite(size)) return;\r\n this.focusEditor();\r\n this.restoreSelection();\r\n this.applyInlineStyle('fontSize', `${size}px`);\r\n this.showSizeMenu = false;\r\n }\r\n\r\n onPickList(kind: 'ul' | 'ol') {\r\n this.focusEditor();\r\n this.restoreSelection();\r\n this.toggleList(kind);\r\n this.showListMenu = false;\r\n this.emitValue();\r\n this.takeSnapshot('list');\r\n }\r\n\r\n onPickHeading(tag: 'p' | 'pre' | 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6') {\r\n this.focusEditor();\r\n this.restoreSelection();\r\n this.setHeading(tag);\r\n this.showHeadingMenu = false;\r\n this.emitValue();\r\n this.takeSnapshot('heading');\r\n }\r\n\r\n onPickSpacing(kind: 'margin' | 'padding', target: 'all' | 'vertical' | 'horizontal', value: number) {\r\n this.focusEditor();\r\n this.restoreSelection();\r\n // Bevorzugt: direkt auf die Selektion anwenden (inline Wrapper)\r\n if (!this.applySpacingToSelection(kind, target, value)) {\r\n // Fallback: Block-Spacing, wenn Auswahl blockübergreifend ist\r\n this.setBlockSpacing(kind, target, value);\r\n }\r\n this.showSpacingMenu = false;\r\n this.emitValue();\r\n this.takeSnapshot('spacing');\r\n }\r\n\r\n // ControlValueAccessor\r\n writeValue(value: string | null): void {\r\n const el = this.editorRef?.nativeElement;\r\n if (!el) return;\r\n el.innerHTML = value || '';\r\n // Initial snapshot nur einmal anlegen\r\n if (this.history.length === 0) {\r\n this.takeSnapshot('init');\r\n }\r\n }\r\n registerOnChange(fn: any): void { this.onChange = fn; }\r\n registerOnTouched(fn: any): void { this.onTouched = fn; }\r\n setDisabledState(isDisabled: boolean): void { this.disabled = isDisabled; }\r\n\r\n // Toolbar actions using document.execCommand (deprecated but broadly supported)\r\n cmd(command: string, value?: string) {\r\n // Restore last selection from editor before applying an action triggered by toolbar\r\n this.focusEditor();\r\n this.restoreSelection();\r\n\r\n // Bevorzugt: eigene Range-basierte Implementierungen\r\n switch (command) {\r\n case 'bold':\r\n this.applyInlineStyleSmart('fontWeight', 'bold');\r\n return;\r\n case 'italic':\r\n this.applyInlineStyleSmart('fontStyle', 'italic');\r\n return;\r\n case 'underline':\r\n this.applyInlineStyleSmart('textDecoration', 'underline');\r\n return;\r\n case 'foreColor':\r\n this.applyInlineStyle('color', value || '');\r\n return;\r\n case 'hiliteColor':\r\n case 'backColor':\r\n this.applyInlineStyle('backgroundColor', value || '');\r\n return;\r\n case 'createLink':\r\n if (value) {\r\n this.wrapSelectionWith('a', { href: value });\r\n this.emitValue();\r\n this.takeSnapshot('link');\r\n }\r\n return;\r\n case 'insertText': {\r\n const text = value ?? '';\r\n this.insertTextAtSelection(text);\r\n this.emitValue();\r\n this.takeSnapshot('insertText');\r\n return;\r\n }\r\n case 'insertUnorderedList':\r\n this.toggleList('ul');\r\n this.emitValue();\r\n this.takeSnapshot('list');\r\n return;\r\n case 'insertOrderedList':\r\n this.toggleList('ol');\r\n this.emitValue();\r\n this.takeSnapshot('list');\r\n return;\r\n case 'justifyLeft':\r\n this.alignBlocks('left');\r\n this.emitValue();\r\n this.takeSnapshot('align');\r\n return;\r\n case 'justifyCenter':\r\n this.alignBlocks('center');\r\n this.emitValue();\r\n this.takeSnapshot('align');\r\n return;\r\n case 'justifyRight':\r\n this.alignBlocks('right');\r\n this.emitValue();\r\n this.takeSnapshot('align');\r\n return;\r\n case 'justifyFull':\r\n this.alignBlocks('justify');\r\n this.emitValue();\r\n this.takeSnapshot('align');\r\n return;\r\n }\r\n\r\n // Fallback (deprecated): nur für Format entfernen / Links lösen als Übergang\r\n try {\r\n // Hinweis im Dev-Mode ausgeben\r\n if (!('___rteWarned' in (this as any))) {\r\n console.warn('[richtext-editor] document.execCommand ist deprecated; Fallback wird nur für removeFormat/unlink verwendet.');\r\n (this as any).___rteWarned = true;\r\n }\r\n if (command === 'removeFormat' || command === 'unlink') {\r\n document.execCommand(command, false, value);\r\n }\r\n } catch {\r\n // Ignorieren, wenn nicht unterstützt\r\n }\r\n this.emitValue();\r\n this.takeSnapshot('fallback');\r\n }\r\n\r\n applyFont(font: string) {\r\n if (!font) return;\r\n this.applyInlineStyle('fontFamily', font);\r\n }\r\n\r\n applyFontSize(sizePx: string) {\r\n if (!sizePx) return;\r\n const size = Number(sizePx);\r\n if (!Number.isFinite(size)) return;\r\n this.applyInlineStyle('fontSize', `${size}px`);\r\n }\r\n\r\n applyColor(color: string) {\r\n this.focusEditor();\r\n this.restoreSelection();\r\n const sel = window.getSelection();\r\n if (!sel || sel.rangeCount === 0) return;\r\n const r = sel.getRangeAt(0);\r\n if (r.collapsed) {\r\n // Firefox/Edge: wenn keine explizite Auswahl, erweitere auf nächstes Wort\r\n this.expandRangeToWord(r);\r\n }\r\n this.applyInlineStyle('color', color);\r\n }\r\n\r\n applyHighlight(color: string) {\r\n this.focusEditor();\r\n this.restoreSelection();\r\n const sel = window.getSelection();\r\n if (!sel || sel.rangeCount === 0) return;\r\n const r = sel.getRangeAt(0);\r\n if (r.collapsed) {\r\n this.expandRangeToWord(r);\r\n }\r\n // Some browsers use 'hiliteColor', others 'backColor'\r\n this.applyInlineStyle('backgroundColor', color);\r\n }\r\n\r\n private expandRangeToWord(range: Range) {\r\n try {\r\n const editor = this.editorRef.nativeElement;\r\n let node: Node = range.startContainer;\r\n if (node.nodeType !== Node.TEXT_NODE) {\r\n // Versuche, einen Textknoten in der Nähe zu finden\r\n const walker = document.createTreeWalker(editor, NodeFilter.SHOW_TEXT);\r\n let found: Text | null = null;\r\n while (walker.nextNode()) {\r\n const n = walker.currentNode as Text;\r\n if (n.parentElement && editor.contains(n.parentElement)) { found = n; break; }\r\n }\r\n if (found) node = found;\r\n }\r\n const text = node.nodeType === Node.TEXT_NODE ? (node as Text).data : '';\r\n let start = 0, end = text.length;\r\n // einfache Wortgrenzen-Heuristik\r\n const pos = range.startOffset;\r\n for (let i = pos; i > 0; i--) { if (/\\s/.test(text[i-1])) { start = i; break; } }\r\n for (let i = pos; i < text.length; i++) { if (/\\s/.test(text[i])) { end = i; break; } }\r\n range.setStart(node, start);\r\n range.setEnd(node, end);\r\n const sel = window.getSelection();\r\n if (sel) { sel.removeAllRanges(); sel.addRange(range); }\r\n } catch { /* noop */ }\r\n }\r\n\r\n\r\n\r\n insertLink() {\r\n const url = prompt('Link-URL eingeben:', 'https://');\r\n if (url) {\r\n this.cmd('createLink', url);\r\n }\r\n }\r\n\r\n removeFormat() {\r\n this.cmd('removeFormat');\r\n this.cmd('unlink');\r\n }\r\n\r\n onInput() {\r\n this.emitValue();\r\n this.scheduleSnapshot();\r\n }\r\n\r\n onKeyup(_evt: KeyboardEvent) {\r\n this.saveSelection();\r\n this.emitValue();\r\n this.updateInlineStates();\r\n }\r\n\r\n onPaste(evt: ClipboardEvent) {\r\n // Optional: Clean paste to plain text while keeping basic formatting minimal.\r\n if (!evt.clipboardData) return;\r\n evt.preventDefault();\r\n const text = evt.clipboardData.getData('text/plain');\r\n this.insertTextAtSelection(text);\r\n this.emitValue();\r\n this.takeSnapshot('paste');\r\n }\r\n\r\n private emitValue() {\r\n // Clean up empty style attributes and redundant spans before emitting\r\n this.cleanupEmptyStylesAndSpans();\r\n const val = this.editorRef.nativeElement.innerHTML;\r\n this.onChange(val);\r\n this.valueChange.emit(val);\r\n this.updateInlineStates();\r\n }\r\n\r\n // Remove empty style attributes (style=\"\") and unwrap spans without any attributes\r\n private cleanupEmptyStylesAndSpans(root?: HTMLElement) {\r\n const editor = root || this.editorRef.nativeElement;\r\n const toUnwrap: HTMLElement[] = [];\r\n const walker = document.createTreeWalker(editor, NodeFilter.SHOW_ELEMENT);\r\n while (walker.nextNode()) {\r\n const el = walker.currentNode as HTMLElement;\r\n if (el.hasAttribute('style')) {\r\n // If no style declarations remain, drop the attribute\r\n const cssText = el.getAttribute('style') || '';\r\n const byApiEmpty = (el.style ? el.style.length === 0 : false);\r\n const normalized = cssText.replace(/[\\s;]/g, '');\r\n if (byApiEmpty || normalized.length === 0) {\r\n el.removeAttribute('style');\r\n }\r\n }\r\n // Unwrap spans that have no attributes left\r\n if (el.tagName === 'SPAN' && el.attributes.length === 0) {\r\n toUnwrap.push(el);\r\n }\r\n }\r\n for (const span of toUnwrap) {\r\n while (span.firstChild) span.parentNode?.insertBefore(span.firstChild, span);\r\n span.remove();\r\n }\r\n }\r\n\r\n // History API\r\n get canUndo() { return this.historyIndex > 0; }\r\n get canRedo() { return this.historyIndex >= 0 && this.historyIndex < this.history.length - 1; }\r\n\r\n undo() {\r\n if (!this.canUndo) return;\r\n this.applySnapshot(this.historyIndex - 1);\r\n }\r\n\r\n redo() {\r\n if (!this.canRedo) return;\r\n this.applySnapshot(this.historyIndex + 1);\r\n }\r\n\r\n private scheduleSnapshot() {\r\n if (this.isRestoringHistory) return;\r\n if (this.snapshotTimer) clearTimeout(this.snapshotTimer);\r\n this.snapshotTimer = setTimeout(() => this.takeSnapshot('input'), 250);\r\n }\r\n\r\n private takeSnapshot(_reason?: string) {\r\n if (this.isRestoringHistory) return;\r\n const editor = this.editorRef.nativeElement;\r\n const html = editor.innerHTML;\r\n const sel = window.getSelection();\r\n let rangeData: { startPath: number[]; startOffset: number; endPath: number[]; endOffset: number; } | null = null;\r\n if (sel && sel.rangeCount > 0) {\r\n const r = sel.getRangeAt(0);\r\n if (this.isRangeInEditor(r)) {\r\n const ser = this.serializeRange(r);\r\n if (ser) rangeData = ser;\r\n }\r\n }\r\n // Verhindere Duplikate nacheinander\r\n const last = this.history[this.historyIndex];\r\n if (last && last.html === html) return;\r\n // Zukunft verwerfen bei neuem Snapshot\r\n if (this.historyIndex < this.history.length - 1) {\r\n this.history = this.history.slice(0, this.historyIndex + 1);\r\n }\r\n this.history.push({ html, range: rangeData });\r\n this.historyIndex = this.history.length - 1;\r\n // Begrenze Historie\r\n const MAX = 50;\r\n if (this.history.length > MAX) {\r\n const drop = this.history.length - MAX;\r\n this.history.splice(0, drop);\r\n this.historyIndex -= drop;\r\n if (this.historyIndex < 0) this.historyIndex = 0;\r\n }\r\n }\r\n\r\n private applySnapshot(index: number) {\r\n if (index < 0 || index >= this.history.length) return;\r\n const snap = this.history[index];\r\n const editor = this.editorRef.nativeElement;\r\n this.isRestoringHistory = true;\r\n editor.innerHTML = snap.html;\r\n // Selektion wiederherstellen\r\n if (snap.range) {\r\n this.restoreSerializedRange(snap.range);\r\n } else {\r\n // Cursor ans Ende\r\n const sel = window.getSelection();\r\n if (sel) {\r\n sel.removeAllRanges();\r\n const r = document.createRange();\r\n r.selectNodeContents(editor);\r\n r.collapse(false);\r\n sel.addRange(r);\r\n }\r\n }\r\n this.historyIndex = index;\r\n this.isRestoringHistory = false;\r\n // Werte emittieren nach Restore\r\n this.emitValue();\r\n }\r\n\r\n private serializeRange(range: Range) {\r\n const s = this.nodePathFromNode(range.startContainer);\r\n const e = this.nodePathFromNode(range.endContainer);\r\n if (!s || !e) return null;\r\n return {\r\n startPath: s,\r\n startOffset: range.startOffset,\r\n endPath: e,\r\n endOffset: range.endOffset,\r\n };\r\n }\r\n\r\n private restoreSerializedRange(data: { startPath: number[]; startOffset: number; endPath: number[]; endOffset: number; }) {\r\n const editor = this.editorRef.nativeElement;\r\n const startNode = this.nodeFromPath(data.startPath);\r\n const endNode = this.nodeFromPath(data.endPath);\r\n if (!startNode || !endNode) return;\r\n const r = document.createRange();\r\n try {\r\n r.setStart(startNode, Math.min(data.startOffset, this.maxOffset(startNode)));\r\n r.setEnd(endNode, Math.min(data.endOffset, this.maxOffset(endNode)));\r\n } catch {\r\n r.selectNodeContents(editor);\r\n r.collapse(false);\r\n }\r\n const sel = window.getSelection();\r\n if (sel) { sel.removeAllRanges(); sel.addRange(r); }\r\n }\r\n\r\n private nodePathFromNode(node: Node): number[] | null {\r\n const editor = this.editorRef.nativeElement;\r\n const path: number[] = [];\r\n let n: Node | null = node;\r\n while (n && n !== editor) {\r\n const pnode = n.parentNode as (Node & ParentNode) | null;\r\n if (!pnode) return null;\r\n const idx = Array.prototype.indexOf.call(pnode.childNodes, n);\r\n path.push(idx);\r\n n = pnode;\r\n }\r\n if (n !== editor) return null;\r\n path.reverse();\r\n return path;\r\n }\r\n\r\n private nodeFromPath(path: number[]): Node | null {\r\n const editor = this.editorRef.nativeElement;\r\n let n: Node = editor;\r\n for (const idx of path) {\r\n if (!n.childNodes || idx < 0 || idx >= n.childNodes.length) return null;\r\n n = n.childNodes[idx];\r\n }\r\n return n;\r\n }\r\n\r\n private maxOffset(node: Node): number {\r\n if (node.nodeType === Node.TEXT_NODE) return (node as Text).data.length;\r\n return node.childNodes.length;\r\n }\r\n\r\n private focusEditor() {\r\n const el = this.editorRef.nativeElement;\r\n if (document.activeElement !== el) {\r\n el.focus();\r\n }\r\n }\r\n\r\n // Minimal inline style applier for inline styles\r\n private applyInlineStyle(\r\n cssProp: 'fontFamily' | 'fontSize' | 'color' | 'backgroundColor' | 'fontWeight' | 'fontStyle' | 'textDecoration',\r\n value: string\r\n ) {\r\n this.focusEditor();\r\n this.restoreSelection();\r\n const sel = window.getSelection();\r\n if (!sel || sel.rangeCount === 0) return;\r\n const range = sel.getRangeAt(0);\r\n if (range.collapsed) return;\r\n\r\n const span = document.createElement('span');\r\n (span.style as any)[cssProp] = value;\r\n // Robuster als surroundContents: extract + wrap + insert\r\n const frag = range.extractContents();\r\n span.appendChild(frag);\r\n range.insertNode(span);\r\n // Cursor hinter das eingefügte Element setzen\r\n sel.removeAllRanges();\r\n const after = document.createRange();\r\n after.setStartAfter(span);\r\n after.collapse(true);\r\n sel.addRange(after);\r\n this.emitValue();\r\n this.takeSnapshot('style');\r\n }\r\n\r\n private applyInlineStyleSmart(\r\n cssProp: 'fontFamily' | 'fontSize' | 'color' | 'backgroundColor' | 'fontWeight' | 'fontStyle' | 'textDecoration',\r\n value: string\r\n ) {\r\n this.focusEditor();\r\n this.restoreSelection();\r\n const sel = window.getSelection();\r\n if (!sel || sel.rangeCount === 0) return;\r\n const range = sel.getRangeAt(0);\r\n if (range.collapsed) return;\r\n\r\n const isBlockTag = (tag: string) => /^(P|DIV|PRE|H1|H2|H3|H4|H5|H6|LI|TD|TH)$/i.test(tag);\r\n const getBlockAncestor = (node: Node): HTMLElement | null => {\r\n const editor = this.editorRef.nativeElement;\r\n let el: HTMLElement | null = node.nodeType === Node.ELEMENT_NODE ? node as HTMLElement : node.parentElement;\r\n while (el && el !== editor && !isBlockTag(el.tagName)) el = el.parentElement;\r\n return (el && el !== editor) ? el : null;\r\n };\r\n\r\n const startBlock = getBlockAncestor(range.startContainer);\r\n const endBlock = getBlockAncestor(range.endContainer);\r\n const crossesBlocks = !!startBlock && !!endBlock && startBlock !== endBlock;\r\n\r\n if (!crossesBlocks) {\r\n // Single block selection: keep using inline wrapper for precise range\r\n this.applyInlineStyle(cssProp, value);\r\n return;\r\n }\r\n\r\n // Multi-block selection: apply style to each intersecting block element (avoid invalid span structure)\r\n const common: Element = range.commonAncestorContainer.nodeType === Node.ELEMENT_NODE\r\n ? range.commonAncestorContainer as Element\r\n : (range.commonAncestorContainer.parentElement || this.editorRef.nativeElement);\r\n const walker = document.createTreeWalker(common, NodeFilter.SHOW_ELEMENT);\r\n const styled = new Set<HTMLElement>();\r\n while (walker.nextNode()) {\r\n const el = walker.currentNode as HTMLElement;\r\n if (!isBlockTag(el.tagName)) continue;\r\n try { if ((range as any).intersectsNode && range.intersectsNode(el)) styled.add(el); } catch {}\r\n }\r\n for (const el of styled) {\r\n (el.style as any)[cssProp] = value;\r\n }\r\n this.emitValue();\r\n this.takeSnapshot('style-blocks');\r\n }\r\n\r\n private getIntersectingBlocks(range: Range): HTMLElement[] {\r\n const isBlockTag = (tag: string) => /^(P|DIV|PRE|H1|H2|H3|H4|H5|H6|LI|TD|TH)$/i.test(tag);\r\n const common: Element = range.commonAncestorContainer.nodeType === Node.ELEMENT_NODE\r\n ? range.commonAncestorContainer as Element\r\n : (range.commonAncestorContainer.parentElement || this.editorRef.nativeElement);\r\n const walker = document.createTreeWalker(common, NodeFilter.SHOW_ELEMENT);\r\n const blocks: HTMLElement[] = [];\r\n while (walker.nextNode()) {\r\n const el = walker.currentNode as HTMLElement;\r\n if (!isBlockTag(el.tagName)) continue;\r\n try { if ((range as any).intersectsNode && range.intersectsNode(el)) blocks.push(el); } catch {}\r\n }\r\n return blocks;\r\n }\r\n\r\n // Variant of applyInlineStyle that returns the created span and does not emit/snapshot by itself\r\n private wrapSelectionInline(\r\n cssProp: 'fontFamily' | 'fontSize' | 'color' | 'backgroundColor' | 'fontWeight' | 'fontStyle' | 'textDecoration',\r\n value: string\r\n ): HTMLElement | null {\r\n this.focusEditor();\r\n this.restoreSelection();\r\n const sel = window.getSelection();\r\n if (!sel || sel.rangeCount === 0) return null;\r\n const range = sel.getRangeAt(0);\r\n if (range.collapsed) return null;\r\n\r\n const span = document.createElement('span');\r\n (span.style as any)[cssProp] = value;\r\n const frag = range.extractContents();\r\n span.appendChild(frag);\r\n range.insertNode(span);\r\n // Restore selection just after for continuity\r\n sel.removeAllRanges();\r\n const after = document.createRange();\r\n after.setStartAfter(span);\r\n after.collapse(true);\r\n sel.addRange(after);\r\n return span;\r\n }\r\n\r\n private isBoldCarrier(el: HTMLElement | null): boolean {\r\n if (!el) return false;\r\n const tag = el.tagName;\r\n if (tag === 'B' || tag === 'STRONG') return true;\r\n const fw = el.style?.fontWeight || '';\r\n if (fw && fw !== 'normal' && fw !== '400') return true;\r\n return false;\r\n }\r\n\r\n private boldAncestorContainingRange(range: Range): HTMLElement | null {\r\n let el: HTMLElement | null = range.commonAncestorContainer.nodeType === Node.ELEMENT_NODE\r\n ? (range.commonAncestorContainer as HTMLElement)\r\n : range.commonAncestorContainer.parentElement;\r\n const editor = this.editorRef.nativeElement;\r\n while (el && el !== editor) {\r\n if (this.isBoldCarrier(el)) {\r\n // ensure el contains both boundary containers fully\r\n const sc = range.startContainer;\r\n const ec = range.endContainer;\r\n if (el.contains(sc) && el.contains(ec)) return el;\r\n }\r\n el = el.parentElement;\r\n }\r\n return null;\r\n }\r\n\r\n private ancestorContainingRange(range: Range, isCarrier: (el: HTMLElement) => boolean): HTMLElement | null {\r\n let el: HTMLElement | null = range.commonAncestorContainer.nodeType === Node.ELEMENT_NODE\r\n ? (range.commonAncestorContainer as HTMLElement)\r\n : range.commonAncestorContainer.parentElement;\r\n const editor = this.editorRef.nativeElement;\r\n while (el && el !== editor) {\r\n if (isCarrier(el)) {\r\n const sc = range.startContainer;\r\n const ec = range.endContainer;\r\n if (el.contains(sc) && el.contains(ec)) return el;\r\n }\r\n el = el.parentElement;\r\n }\r\n return null;\r\n }\r\n\r\n private splitCarrierAroundSelection(range: Range, carrier: HTMLElement) {\r\n const parent = carrier.parentNode as Node & ParentNode;\r\n if (!parent) return;\r\n const rRight = document.createRange();\r\n rRight.setStart(range.endContainer, range.endOffset);\r\n rightGuard(carrier, rRight);\r\n const rightFrag = rRight.extractContents();\r\n const rLeft = document.createRange();\r\n rLeft.setStart(carrier, 0);\r\n leftGuard(range, rLeft);\r\n const leftFrag = rLeft.extractContents();\r\n if (leftFrag.childNodes.length) {\r\n const leftClone = carrier.cloneNode(false) as HTMLElement;\r\n leftClone.appendChild(leftFrag);\r\n parent.insertBefore(leftClone, carrier);\r\n }\r\n let insertAfterRef: ChildNode = carrier;\r\n if (rightFrag.childNodes.length) {\r\n const rightClone = carrier.cloneNode(false) as HTMLElement;\r\n rightClone.appendChild(rightFrag);\r\n parent.insertBefore(rightClone, carrier.nextSibling);\r\n insertAfterRef = rightClone;\r\n }\r\n while (carrier.firstChild) parent.insertBefore(carrier.firstChild, insertAfterRef);\r\n carrier.remove();\r\n\r\n function rightGuard(node: HTMLElement, r: Range) {\r\n try { r.setEnd(node, node.childNodes.length); } catch {}\r\n }\r\n function leftGuard(rng: Range, r: Range) {\r\n try { r.setEnd(rng.startContainer, rng.startOffset); } catch {}\r\n }\r\n }\r\n\r\n // Unwrap bold formatting only for the selected content inside a containing bold ancestor by splitting it into left/selection/right parts\r\n private deselectBoldBySplitting(range: Range): boolean {\r\n const ancestor = this.boldAncestorContainingRange(range);\r\n if (!ancestor) return false;\r\n this.splitCarrierAroundSelection(range, ancestor);\r\n return true;\r\n }\r\n\r\n private deselectItalicBySplitting(range: Range): boolean {\r\n const anc = this.ancestorContainingRange(range, el => this.isItalicCarrier(el));\r\n if (!anc) return false;\r\n this.splitCarrierAroundSelection(range, anc);\r\n return true;\r\n }\r\n\r\n private deselectUnderlineBySplitting(range: Range): boolean {\r\n const anc = this.ancestorContainingRange(range, el => this.isUnderlineCarrier(el));\r\n if (!anc) return false;\r\n this.splitCarrierAroundSelection(range, anc);\r\n return true;\r\n }\r\n\r\n private cleanupEmptyItalicSpans(root: HTMLElement) {\r\n const toRemove: HTMLElement[] = [];\r\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT);\r\n while (walker.nextNode()) {\r\n const el = walker.currentNode as HTMLElement;\r\n const isItalic = (el.tagName === 'I' || el.tagName === 'EM' || (el.tagName === 'SPAN' && el.style.fontStyle && el.style.fontStyle !== 'normal'));\r\n if (!isItalic) continue;\r\n const text = el.textContent ?? '';\r\n const normalized = text.replace(/[\\u00A0\\u200B\\s]/g, '');\r\n const onlyWhitespace = !el.firstChild || (normalized.length === 0 && el.querySelectorAll('*').length === 0);\r\n if (onlyWhitespace) toRemove.push(el);\r\n }\r\n for (const el of toRemove) el.remove();\r\n }\r\n\r\n private cleanupEmptyUnderlineSpans(root: HTMLElement) {\r\n const toRemove: HTMLElement[] = [];\r\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT);\r\n while (walker.nextNode()) {\r\n const el = walker.currentNode as HTMLElement;\r\n const isU = (el.tagName === 'U' || (el.tagName === 'SPAN' && typeof (el.style as any).textDecoration === 'string' && (el.style as any).textDecoration.includes('underline')));\r\n if (!isU) continue;\r\n const text = el.textContent ?? '';\r\n const normalized = text.replace(/[\\u00A0\\u200B\\s]/g, '');\r\n const onlyWhitespace = !el.firstChild || (normalized.length === 0 && el.querySelectorAll('*').length === 0);\r\n if (onlyWhitespace) toRemove.push(el);\r\n }\r\n for (const el of toRemove) el.remove();\r\n }\r\n\r\n // Remove bold wrappers and inline font-weight style inside a container\r\n private stripBoldWithin(container: HTMLElement) {\r\n const toProcess: HTMLElement[] = [];\r\n const walker = document.createTreeWalker(container, NodeFilter.SHOW_ELEMENT);\r\n while (walker.nextNode()) {\r\n toProcess.push(walker.currentNode as HTMLElement);\r\n }\r\n for (const el of toProcess) {\r\n if (el.tagName === 'B' || el.tagName === 'STRONG') {\r\n while (el.firstChild) el.parentNode?.insertBefore(el.firstChild, el);\r\n el.remove();\r\n continue;\r\n }\r\n if (el.tagName === 'SPAN') {\r\n if (el.style.fontWeight) el.style.removeProperty('font-weight');\r\n // Clean empty style spans\r\n if (!el.getAttribute('style')) {\r\n while (el.firstChild) el.parentNode?.insertBefore(el.firstChild, el);\r\n el.remove();\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Pull the given node out of any bold carrier ancestors by splitting them around the node\r\n private liftOutOfBoldAncestors(node: HTMLElement) {\r\n const editor = this.editorRef.nativeElement;\r\n let currentBold = this.findClosest(node, 'b,strong,span[style*=\"font-weight\"]') as HTMLElement | null;\r\n while (currentBold && currentBold !== editor) {\r\n this.splitOutOfAncestor(currentBold, node);\r\n currentBold = this.findClosest(node, 'b,strong,span[style*=\"font-weight\"]') as HTMLElement | null;\r\n }\r\n }\r\n\r\n // Split arbitrary ancestor element so that `node` becomes a sibling outside of it, preserving order even if `node` is nested deeply\r\n private splitOutOfAncestor(ancestor: HTMLElement, node: HTMLElement) {\r\n // First, climb from node up to direct child of ancestor, splitting wrappers after `node` at each level\r\n let child: HTMLElement = node;\r\n let parent = child.parentElement as HTMLElement | null;\r\n while (parent && parent !== ancestor) {\r\n const right = parent.cloneNode(false) as HTMLElement;\r\n // move siblings after `child` into right clone\r\n while (child.nextSibling) right.appendChild(child.nextSibling);\r\n // insert right after parent\r\n parent.after(right);\r\n // ascend\r\n child = parent;\r\n parent = child.parentElement as HTMLElement | null;\r\n }\r\n if (!parent) return;\r\n // Now `child` is a direct child of ancestor\r\n const before = ancestor.cloneNode(false) as HTMLElement;\r\n while (ancestor.firstChild && ancestor.firstChild !== child) {\r\n before.appendChild(ancestor.firstChild);\r\n }\r\n const after = ancestor.cloneNode(false) as HTMLElement;\r\n while (child.nextSibling) after.appendChild(child.nextSibling);\r\n const gp = ancestor.parentNode as Node & ParentNode;\r\n if (!gp) return;\r\n if (before.childNodes.length) gp.insertBefore(before, ancestor);\r\n // move node out, place where ancestor was\r\n gp.insertBefore(node, ancestor);\r\n if (after.childNodes.length) gp.insertBefore(after, ancestor);\r\n ancestor.remove();\r\n }\r\n\r\n private cleanupEmptyBoldSpans(root: HTMLElement) {\r\n const toRemove: HTMLElement[] = [];\r\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT);\r\n while (walker.nextNode()) {\r\n const el = walker.currentNode as HTMLElement;\r\n const isBoldEl = (el.tagName === 'B' || el.tagName === 'STRONG' || (el.tagName === 'SPAN' && el.style.fontWeight && el.style.fontWeight !== 'normal' && el.style.fontWeight !== '400'));\r\n if (!isBoldEl) continue;\r\n // remove if no children or only whitespace (including NBSP \\u00A0 and zero-width space \\u200B)\r\n const text = el.textContent ?? '';\r\n const normalized = text.replace(/[\\u00A0\\u200B\\s]/g, '');\r\n const onlyWhitespace = !el.firstChild || (normalized.length === 0 && el.querySelectorAll('*').length === 0);\r\n if (onlyWhitespace) {\r\n toRemove.push(el);\r\n }\r\n }\r\n for (const el of toRemove) el.remove();\r\n }\r\n\r\n private maybeUnwrapNormalSpan(span: HTMLElement) {\r\n if (span.tagName !== 'SPAN') return;\r\n // If no bold applies from ancestors, drop the 400 style and unwrap if style empty\r\n const hasBoldAbove = this.isNodeBold(span.parentElement);\r\n if (!hasBoldAbove) {\r\n if (span.style.fontWeight === '400') span.style.removeProperty('font-weight');\r\n if (!span.getAttribute('style')) {\r\n while (span.firstChild) span.parentNode?.insertBefore(span.firstChild, span);\r\n span.remove();\r\n }\r\n }\r\n }\r\n\r\n private wrapSelectionWith(tag: 'a' | 'span', attrs?: Record<string, string>) {\r\n const sel = window.getSelection();\r\n if (!sel || sel.rangeCount === 0) return;\r\n const range = sel.getRangeAt(0);\r\n if (range.collapsed) return;\r\n\r\n const el = document.createElement(tag);\r\n if (attrs) {\r\n for (const [k, v] of Object.entries(attrs)) {\r\n if (v != null) el.setAttribute(k, v);\r\n }\r\n }\r\n const frag = range.extractContents();\r\n el.appendChild(frag);\r\n range.insertNode(el);\r\n\r\n // Auswahl hinter das Element setzen\r\n sel.removeAllRanges();\r\n const after = document.createRange();\r\n after.setStartAfter(el);\r\n after.collapse(true);\r\n sel.addRange(after);\r\n }\r\n\r\n private insertTextAtSelection(text: string) {\r\n const sel = window.getSelection();\r\n if (!sel || sel.rangeCount === 0) return;\r\n const range = sel.getRangeAt(0);\r\n range.deleteContents();\r\n const node = document.createTextNode(text);\r\n range.insertNode(node);\r\n // Cursor ans Ende des eingefügten Textes\r\n sel.removeAllRanges();\r\n const after = document.createRange();\r\n after.setStartAfter(node);\r\n after.collapse(true);\r\n sel.addRange(after);\r\n }\r\n\r\n // ----- Inline toggle logic (Bold/Italic/Underline) -----\r\n\r\n private updateInlineStates() {\r\n const sel = window.getSelection();\r\n if (!sel || sel.rangeCount === 0) { this.isBoldActive = this.isItalicActive = this.isUnderlineActive = false; return; }\r\n const range = sel.getRangeAt(0);\r\n if (!this.isRangeInEditor(range)) { this.isBoldActive = this.isItalicActive = this.isUnderlineActive = false; return; }\r\n if (range.collapsed) {\r\n const node = range.startContainer.nodeType === Node.ELEMENT_NODE ? (range.startContainer as HTMLElement) : range.startContainer.parentElement;\r\n this.isBoldActive = this.isNodeBold(node);\r\n this.isItalicActive = this.isNodeItalic(node);\r\n this.isUnderlineActive = this.isNodeUnderline(node);\r\n return;\r\n }\r\n this.isBoldActive = this.computeBoldAnyForRange(range);\r\n this.isItalicActive = this.computeItalicAnyForRange(range);\r\n this.isUnderlineActive = this.computeUnderlineAnyForRange(range);\r\n // ensure UI reflects changes immediately\r\n try { this.cdr.detectChanges(); } catch {}\r\n }\r\n\r\n private computeBoldAnyForRange(range: Range): boolean {\r\n const root: Element = (this.editorRef.nativeElement as Element);\r\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT);\r\n while (walker.nextNode()) {\r\n const n = walker.currentNode as Text;\r\n if (!n.data.trim()) continue;\r\n try { if (range.intersectsNode(n)) { if (this.isNodeBold(n.parentElement)) return true; } } catch {}\r\n }\r\n return false;\r\n }\r\n\r\n private computeItalicAnyForRange(range: Range): boolean {\r\n const root: Element = (this.editorRef.nativeElement as Element);\r\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT);\r\n while (walker.nextNode()) {\r\n const n = walker.currentNode as Text;\r\n if (!n.data.trim()) continue;\r\n try { if (range.intersectsNode(n)) { if (this.isNodeItalic(n.parentElement)) return true; } } catch {}\r\n }\r\n return false;\r\n }\r\n\r\n private computeUnderlineAnyForRange(range: Range): boolean {\r\n const root: Element = (this.editorRef.nativeElement as Element);\r\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT);\r\n while (walker.nextNode()) {\r\n const n = walker.currentNode as Text;\r\n if (!n.data.trim()) continue;\r\n try { if (range.intersectsNode(n)) { if (this.isNodeUnderline(n.parentElement)) return true; } } catch {}\r\n }\r\n return false;\r\n }\r\n\r\n private isNodeBold(node: HTMLElement | null): boolean {\r\n let el: HTMLElement | null = node;\r\n while (el) {\r\n if (el.tagName === 'B' || el.tagName === 'STRONG') return true;\r\n const cs = getComputedStyle(el);\r\n if (cs.fontWeight && cs.fontWeight !== 'normal' && cs.fontWeight !== '400') {\r\n const w = cs.fontWeight === 'bold' ? 700 : parseInt(cs.fontWeight, 10);\r\n if (!Number.isNaN(w) && w >= 600) return true;\r\n }\r\n el = el.parentElement;\r\n }\r\n return false;\r\n }\r\n\r\n private isNodeItalic(node: HTMLElement | null): boolean {\r\n let el: HTMLElement | null = node;\r\n while (el) {\r\n if (el.tagName === 'I' || el.tagName === 'EM') return true;\r\n const cs = getComputedStyle(el);\r\n if (cs.fontStyle && cs.fontStyle !== 'normal') return true;\r\n el = el.parentElement;\r\n }\r\n return false;\r\n }\r\n\r\n private isNodeUnderline(node: HTMLElement | null): boolean {\r\n let el: HTMLElement | null = node;\r\n while (el) {\r\n if (el.tagName === 'U') return true;\r\n const cs = getComputedStyle(el);\r\n if (cs.textDecorationLine && cs.textDecorationLine.includes('underline')) return true;\r\n el = el.parentElement;\r\n }\r\n return false;\r\n }\r\n\r\n private isItalicCarrier(el: HTMLElement | null): boolean {\r\n if (!el) return false;\r\n const tag = el.tagName;\r\n if (tag === 'I' || tag === 'EM') return true;\r\n const fs = el.style?.fontStyle || '';\r\n return !!fs && fs !== 'normal';\r\n }\r\n\r\n private isUnderlineCarrier(el: HTMLElement | null): boolean {\r\n if (!el) return false;\r\n const tag = el.tagName;\r\n if (tag === 'U') return true;\r\n const td = (el.style as any)?.textDecoration || '';\r\n return typeof td === 'string' && td.includes('underline');\r\n }\r\n\r\n private computeBoldActiveForRange(range: Range): boolean {\r\n const root: Element = this.isRangeInEditor(range) ? (this.editorRef.nativeElement as Element) : (range.commonAncestorContainer as Element);\r\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT);\r\n const nodes: Text[] = [];\r\n while (walker.nextNode()) {\r\n const n = walker.currentNode as Text;\r\n if (!n.data.trim()) continue;\r\n try { if (range.intersectsNode(n)) nodes.push(n); } catch { /* Safari may throw if node not in same tree */ }\r\n }\r\n if (nodes.length === 0) return false;\r\n return nodes.every(t => this.isNodeBold(t.parentElement));\r\n }\r\n\r\n private computeItalicActiveForRange(range: Range): boolean {\r\n const root: Element = this.isRangeInEditor(range) ? (this.editorRef.nativeElement as Element) : (range.commonAncestorContainer as Element);\r\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT);\r\n const nodes: Text[] = [];\r\n while (walker.nextNode()) {\r\n const n = walker.currentNode as Text;\r\n if (!n.data.trim()) continue;\r\n try { if (range.intersectsNode(n)) nodes.push(n); } catch {}\r\n }\r\n if (nodes.length === 0) return false;\r\n return nodes.every(t => this.isNodeItalic(t.parentElement));\r\n }\r\n\r\n private computeUnderlineActiveForRange(range: Range): boolean {\r\n const root: Element = this.isRangeInEditor(range) ? (this.editorRef.nativeElement as Element) : (range.commonAncestorContainer as Element);\r\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT);\r\n const nodes: Text[] = [];\r\n while (walker.nextNode()) {\r\n const n = walker.currentNode as Text;\r\n if (!n.data.trim()) continue;\r\n try { if (range.intersectsNode(n)) nodes.push(n); } catch {}\r\n }\r\n if (nodes.length === 0) return false;\r\n return nodes.every(t => this.isNodeUnderline(t.parentElement));\r\n }\r\n\r\n private removeInlineStyleInRange(\r\n range: Range,\r\n cssPropKebab: 'font-weight' | 'font-style' | 'text-decoration'\r\n ) {\r\n const editor = this.editorRef.nativeElement;\r\n const common = range.commonAncestorContainer.nodeType === Node.ELEMENT_NODE ? range.commonAncestorContainer as Element : range.commonAncestorContainer.parentElement || editor;\r\n const affected: HTMLElement[] = [];\r\n const walker = document.createTreeWalker(common, NodeFilter.SHOW_ELEMENT);\r\n while (walker.nextNode()) {\r\n const el = walker.currentNode as HTMLElement;\r\n let matches = false;\r\n if (el.tagName === 'SPAN' && el.style && el.style.getPropertyValue(cssPropKebab)) matches = true;\r\n if (cssPropKebab === 'font-weight' && (el.tagName === 'B' || el.tagName === 'STRONG')) matches = true;\r\n if (cssPropKebab === 'font-style' && (el.tagName === 'I' || el.tagName === 'EM')) matches = true;\r\n if (cssPropKebab === 'text-decoration' && el.tagName === 'U') matches = true;\r\n if (!matches) continue;\r\n try { if ((range as any).intersectsNode ? range.intersectsNode(el) : true) affected.push(el); } catch {}\r\n }\r\n for (const el of affected) {\r\n if (el.tagName === 'B' || el.tagName === 'STRONG' || el.tagName === 'I' || el.tagName === 'EM' || el.tagName === 'U') {\r\n while (el.firstChild) el.parentNode?.insertBefore(el.firstChild, el);\r\n el.remove();\r\n continue;\r\n }\r\n el.style.removeProperty(cssPropKebab);\r\n if (!el.getAttribute('style')) {\r\n while (el.firstChild) el.parentNode?.insertBefore(el.firstChild, el);\r\n el.remove();\r\n }\r\n }\r\n this.emitValue();\r\n }\r\n\r\n toggleBold() {\r\n this.focusEditor();\r\n this.restoreSelection();\r\n const sel = window.getSelection();\r\n if (!sel || sel.rangeCount === 0) return;\r\n const range = sel.getRangeAt(0);\r\n if (range.collapsed) this.expandRangeToWord(range);\r\n const anyActive = this.computeBoldAnyForRange(range);\r\n const blocks = this.getIntersectingBlocks(range);\r\n const multiBlock = blocks.length > 1;\r\n if (anyActive) {\r\n if (multiBlock) {\r\n for (const b of blocks) b.style.removeProperty('font-weight');\r\n this.emitValue();\r\n this.updateInlineStates();\r\n this.takeSnapshot('toggle-bold-blocks');\r\n return;\r\n }\r\n // Preferred: split bold ancestor around selection so we keep surrounding text intact\r\n const changed = this.deselectBoldBySplitting(range);\r\n if (changed) {\r\n this.cleanupEmptyBoldSpans(this.editorRef.nativeElement);\r\n this.emitValue();\r\n } else {\r\n // Fallback: previous neutralization approach for complex cases\r\n const normal = this.wrapSelectionInline('fontWeight', '400');\r\n if (normal) {\r\n this.stripBoldWithin(normal);\r\n this.liftOutOfBoldAncestors(normal);\r\n this.cleanupEmptyBoldSpans(this.editorRef.nativeElement);\r\n this.maybeUnwrapNormalSpan(normal);\r\n this.emitValue();\r\n }\r\n }\r\n } else {\r\n if (multiBlock) {\r\n for (const b of blocks) (b.style as any).fontWeight = 'bold';\r\n this.emitValue();\r\n this.updateInlineStates();\r\n this.takeSnapshot('toggle-bold-blocks');\r\n return;\r\n }\r\n this.applyInlineStyleSmart('fontWeight', 'bold');\r\n }\r\n this.updateInlineStates();\r\n this.takeSnapshot('toggle-bold');\r\n }\r\n\r\n toggleItalic() {\r\n this.focusEditor();\r\n this.restoreSelection();\r\n const sel = window.getSelection();\r\n if (!sel || sel.rangeCount === 0) return;\r\n const range = sel.getRangeAt(0);\r\n if (range.collapsed) this.expandRangeToWord(range);\r\n const anyActive = this.computeItalicAnyForRange(range);\r\n if (anyActive) {\r\n const changed = this.deselectItalicBySplitting(range);\r\n if (changed) {\r\n this.cleanupEmptyItalicSpans(this.editorRef.nativeElement);\r\n this.emitValue();\r\n } else {\r\n this.removeInlineStyleInRange(range, 'font-style');\r\n this.applyInlineStyle('fontStyle', 'normal');\r\n }\r\n } else {\r\n this.applyInlineStyleSmart('fontStyle', 'italic');\r\n }\r\n this.updateInlineStates();\r\n this.takeSnapshot('toggle-italic');\r\n }\r\n\r\n toggleUnderline() {\r\n this.focusEditor();\r\n this.restoreSelection();\r\n const sel = window.getSelection();\r\n if (!sel || sel.rangeCount === 0) return;\r\n const range = sel.getRangeAt(0);\r\n if (range.collapsed) this.expandRangeToWord(range);\r\n const anyActive = this.computeUnderlineAnyForRange(range);\r\n if (anyActive) {\r\n const changed = this.deselectUnderlineBySplitting(range);\r\n if (changed) {\r\n this.cleanupEmptyUnderlineSpans(this.editorRef.nativeElement);\r\n this.emitValue();\r\n } else {\r\n this.removeInlineStyleInRange(range, 'text-decoration');\r\n this.applyInlineStyle('textDecoration', 'none');\r\n }\r\n } else {\r\n this.applyInlineStyleSmart('textDecoration', 'underline');\r\n }\r\n this.updateInlineStates();\r\n this.takeSnapshot('toggle-underline');\r\n }\r\n\r\n private getCurrentRange(): Range | null {\r\n const sel = window.getSelection();\r\n if (!sel || sel.rangeCount === 0) return null;\r\n const range = sel.getRangeAt(0);\r\n return this.isRangeInEditor(range) ? range : null;\r\n }\r\n\r\n private getEditorChildAncestor(node: Node): HTMLElement | null {\r\n const editor = this.editorRef.nativeElement;\r\n let el: HTMLElement | null = node.nodeType === Node.ELEMENT_NODE ? (node as HTMLElement) : node.parentElement;\r\n while (el && el.parentElement && el.parentElement !== editor) {\r\n el = el.parentElement;\r\n }\r\n // Wenn direktes Kind des Editors\r\n if (el && el.parentElement === editor) return el;\r\n return editor;\r\n }\r\n\r\n private findClosest(node: Node | null, selector: string): HTMLElement | null {\r\n let el: HTMLElement | null = node && (node as HTMLElement).nodeType === 1 ? (node as HTMLElement) : node?.parentElement ?? null;\r\n while (el) {\r\n if (el.matches(selector)) return el;\r\n el = el.parentElement;\r\n }\r\n return null;\r\n }\r\n\r\n private toggleList(kind: 'ul' | 'ol') {\r\n const range = this.getCurrentRange();\r\n if (!range) return;\r\n const editor = this.editorRef.nativeElement;\r\n // Wenn bereits in einer Liste, Liste aufheben\r\n const listAncestor = this.findClosest(range.commonAncestorContainer, 'ul,ol');\r\n if (listAncestor) {\r\n // unwrap: li-Inhalte an die Stelle der Liste setzen\r\n const frag = document.createDocumentFragment();\r\n const items = Array.from(listAncestor.children) as HTMLElement[]; // li\r\n for (const li of items) {\r\n while (li.firstChild) frag.appendChild(li.firstChild);\r\n // Optional: Zeilenumbruch zwischen Items\r\n frag.appendChild(document.createElement('br'));\r\n }\r\n listAncestor.replaceWith(frag);\r\n return;\r\n }\r\n\r\n // Neue Liste um die aktuelle Auswahl legen\r\n const list = document.createElement(kind);\r\n const li = document.createElement('li');\r\n const contents = range.extractContents();\r\n if (!contents.hasChildNodes()) {\r\n li.textContent = '\\u200b'; // zero-width space um leere li zu vermeiden\r\n } else {\r\n li.appendChild(contents);\r\n }\r\n list.appendChild(li);\r\n range.insertNode(list);\r\n\r\n // Cursor ins li setzen\r\n const sel = window.getSelection();\r\n if (sel) {\r\n sel.removeAllRanges();\r\n const after = document.createRange();\r\n after.selectNodeContents(li);\r\n after.collapse(false);\r\n sel.addRange(after);\r\n }\r\n }\r\n\r\n private alignBlocks(align: 'left' | 'center' | 'right' | 'justify') {\r\n const range = this.getCurrentRange();\r\n if (!range) return;\r\n const startBlock = this.getEditorChildAncestor(range.startContainer);\r\n const endBlock = this.getEditorChildAncestor(range.endContainer);\r\n const editor = this.editorRef.nativeElement;\r\n\r\n const applyAlign = (el: HTMLElement | null) => {\r\n if (!el) return;\r\n (el.style as any).textAlign = align;\r\n };\r\n\r\n if (startBlock === endBlock) {\r\n applyAlign(startBlock);\r\n } else {\r\n // grob: alle direkten Kinder zwischen start und end ausrichten\r\n const children = Array.from(editor.children) as HTMLElement[];\r\n const i1 = children.indexOf(startBlock as HTMLElement);\r\n const i2 = children.indexOf(endBlock as HTMLElement);\r\n if (i1 >= 0 && i2 >= 0) {\r\n const [from, to] = i1 <= i2 ? [i1, i2] : [i2, i1];\r\n for (let i = from; i <= to; i++) applyAlign(children[i]);\r\n } else {\r\n applyAlign(startBlock);\r\n }\r\n }\r\n }\r\n\r\n private setBlockSpacing(kind: 'margin' | 'padding', target: 'all' | 'vertical' | 'horizontal', value: number) {\r\n const range = this.getCurrentRange();\r\n if (!range) return;\r\n const editor = this.editorRef.nativeElement;\r\n\r\n const apply = (el: HTMLElement | null) => {\r\n if (!el) return;\r\n const v = `${value}px`;\r\n if (target === 'all') {\r\n (el.style as any)[kind] = v;\r\n } else if (target === 'vertical') {\r\n (el.style as any)[`${kind}Top`] = v;\r\n (el.style as any)[`${kind}Bottom`] = v;\r\n } else if (target === 'horizontal') {\r\n (el.style as any)[`${kind}Left`] = v;\r\n (el.style as any)[`${kind}Right`] = v;\r\n }\r\n };\r\n\r\n const startBlock = this.getEditorChildAncestor(range.startContainer);\r\n const endBlock = this.getEditorChildAncestor(range.endContainer);\r\n\r\n if (startBlock === endBlock) {\r\n apply(startBlock);\r\n } else {\r\n const children = Array.from(editor.children) as HTMLElement[];\r\n const i1 = children.indexOf(startBlock as HTMLElement);\r\n const i2 = children.indexOf(endBlock as HTMLElement);\r\n if (i1 >= 0 && i2 >= 0) {\r\n const [from, to] = i1 <= i2 ? [i1, i2] : [i2, i1];\r\n for (let i = from; i <= to; i++) apply(children[i]);\r\n } else {\r\n apply(startBlock);\r\n }\r\n }\r\n }\r\n\r\n // Versucht, Margin/Padding auf die konkrete Text-Selektion anzuwenden, indem die Auswahl mit einem Span umschlossen wird.\r\n // Liefert true, wenn inline angewendet werden konnte; sonst false (z. B. wenn Auswahl blockübergreifend ist).\r\n private applySpacingToSelection(kind: 'margin' | 'padding', target: 'all' | 'vertical' | 'horizontal', value: number): boolean {\r\n const sel = window.getSelection();\r\n if (!sel || sel.rangeCount === 0) return false;\r\n const range = sel.getRangeAt(0);\r\n if (range.collapsed) return false;\r\n\r\n const startBlock = this.getEditorChildAncestor(range.startContainer);\r\n const endBlock = this.getEditorChildAncestor(range.endContainer);\r\n // Nur inline, wenn innerhalb desselben Blocks\r\n if (!startBlock || !endBlock || startBlock !== endBlock) return false;\r\n\r\n const wrapper = document.createElement('span');\r\n const px = `${value}px`;\r\n if (target === 'all') {\r\n (wrapper.style as any)[kind] = px;\r\n } else if (target === 'vertical') {\r\n (wrapper.style as any)[`${kind}Top`] = px;\r\n (wrapper.style as any)[`${kind}Bottom`] = px;\r\n } else if (target === 'horizontal') {\r\n (wrapper.style as any)[`${kind}Left`] = px;\r\n (wrapper.style as any)[`${kind}Right`] = px;\r\n }\r\n // Für vertikale Margins auf Inline-Elementen sicherstellen, dass sie greifen\r\n if (kind === 'margin' && (target === 'all' || target === 'vertical')) {\r\n wrapper.style.display = 'inline-block';\r\n }\r\n\r\n // Auswahl extrahieren und in Wrapper einsetzen\r\n const frag = range.extractContents();\r\n wrapper.appendChild(frag);\r\n range.insertNode(wrapper);\r\n\r\n // Gleichartige Wrapper zusammenführen und Cursor korrekt setzen\r\n const normalized = this.normalizeSpacingSpans(wrapper, kind, target, value) || wrapper;\r\n sel.removeAllRanges();\r\n const after = document.createRange();\r\n if (normalized.isConnected) {\r\n after.setStartAfter(normalized);\r\n } else {\r\n // Fallback: an das Ende des Startblocks\r\n const sb = this.getEditorChildAncestor(range.startContainer);\r\n if (sb) after.selectNodeContents(sb);\r\n }\r\n after.collapse(true);\r\n sel.addRange(after);\r\n return true;\r\n }\r\n\r\n private normalizeSpacingSpans(\r\n span: HTMLElement,\r\n kind: 'margin' | 'padding',\r\n target: 'all' | 'vertical' | 'horizontal',\r\n value: number\r\n ): HTMLElement | null {\r\n const props: string[] = [];\r\n if (target === 'all') props.push(kind);\r\n if (target === 'vertical') props.push(`${kind}Top`, `${kind}Bottom`);\r\n if (target === 'horizontal') props.push(`${kind}Left`, `${kind}Right`);\r\n const displayNeeded = kind === 'margin' && (target === 'all' || target === 'vertical');\r\n const v = `${value}px`;\r\n\r\n const hasSameSpacing = (a: HTMLElement, b: HTMLElement) => {\r\n for (const p of props) {\r\n if ((a.style as any)[p] !== (b.style as any)[p]) return false;\r\n }\r\n if (displayNeeded) {\r\n if (a.style.display !== b.style.display) return false;\r\n }\r\n return true;\r\n };\r\n\r\n // Downward: verschachtelte identische Spans in span zusammenführen\r\n if (span.children.length === 1) {\r\n const only = span.children[0] as HTMLElement;\r\n if (only && only.tagName === 'SPAN' && hasSameSpacing(span, only)) {\r\n while (only.firstChild) span.appendChild(only.firstChild);\r\n only.remove();\r\n }\r\n }\r\n\r\n let current: HTMLElement | null = span;\r\n\r\n // Upward: mit Elternelement verschmelzen, wenn identischer Span\r\n const parent = current.parentElement;\r\n if (parent && parent.tagName === 'SPAN' && hasSameSpacing(parent, current)) {\r\n while (current.firstChild) parent.insertBefore(current.firstChild, current);\r\n current.remove();\r\n current = parent;\r\n }\r\n\r\n if (!current) return null;\r\n\r\n // Left merge: vorherige Geschwister-Spans mit gleicher Formatierung in current ziehen\r\n let prev = current.previousElementSibling as HTMLElement | null;\r\n if (prev && prev.tagName === 'SPAN' && hasSameSpacing(prev, current)) {\r\n while (current.firstChild) prev.appendChild(current.firstChild);\r\n current.remove();\r\n current = prev;\r\n }\r\n\r\n // Right merge: folgende Geschwister-Spans in current ziehen\r\n let next = current.nextElementSibling as HTMLElement | null;\r\n while (next && next.tagName === 'SPAN' && hasSameSpacing(current, next)) {\r\n while (next.firstChild) current.appendChild(next.firstChild);\r\n const toRemove = next;\r\n next = next.nextElementSibling as HTMLElement | null;\r\n toRemove.remove();\r\n }\r\n\r\n return current;\r\n }\r\n\r\n private setHeading(tag: 'p' | 'pre' | 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6') {\r\n const range = this.getCurrentRange();\r\n if (!range) return;\r\n const editor = this.editorRef.nativeElement;\r\n\r\n const replaceTag = (el: HTMLElement, newTag: string) => {\r\n if (!el || el === editor) return null;\r\n const neo = document.createElement(newTag);\r\n while (el.firstChild) neo.appendChild(el.firstChild);\r\n el.replaceWith(neo);\r\n return neo as HTMLElement;\r\n };\r\n\r\n const startBlock = this.getEditorChildAncestor(range.startContainer);\r\n const endBlock = this.getEditorChildAncestor(range.endContainer);\r\n\r\n if (startBlock && startBlock !== editor && (startBlock === endBlock)) {\r\n const currentTag = (startBlock.tagName || '').toLowerCase();\r\n if (currentTag === tag) return;\r\n const convertible = /^(p|div|pre|h1|h2|h3|h4|h5|h6)$/i.test(currentTag);\r\n if (convertible) {\r\n const neo = replaceTag(startBlock, tag);\r\n if (neo && tag === 'pre') {\r\n neo.setAttribute('style', 'white-space: pre-wrap; font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;');\r\n }\r\n if (neo) {\r\n const sel = window.getSelection();\r\n if (sel) {\r\n sel.removeAllRanges();\r\n const after = document.createRange();\r\n after.selectNodeContents(neo);\r\n after.collapse(false);\r\n sel.addRange(after);\r\n }\r\n }\r\n return;\r\n }\r\n }\r\n\r\n if (startBlock && endBlock && startBlock !== editor && endBlock !== editor) {\r\n const children = Array.from(editor.children) as HTMLElement[];\r\n const i1 = children.indexOf(startBlock as HTMLElement);\r\n const i2 = children.indexOf(endBlock as HTMLElement);\r\n if (i1 >= 0 && i2 >= 0) {\r\n const [from, to] = i1 <= i2 ? [i1, i2] : [i2, i1];\r\n let last: HTMLElement | null = null;\r\n for (let i = from; i <= to; i++) {\r\n const el = children[i];\r\n const currentTag = (el.tagName || '').toLowerCase();\r\n if (/^(p|div|pre|h1|h2|h3|h4|h5|h6)$/i.test(currentTag)) {\r\n const neo = replaceTag(el, tag);\r\n if (neo && tag === 'pre') {\r\n neo.setAttribute('style', 'white-space: pre-wrap; font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;');\r\n }\r\n if (neo) last = neo;\r\n }\r\n }\r\n if (last) {\r\n const sel = window.getSelection();\r\n if (sel) {\r\n sel.removeAllRanges();\r\n const after = document.createRange();\r\n after.selectNodeContents(last);\r\n after.collapse(false);\r\n sel.addRange(after);\r\n }\r\n }\r\n return;\r\n }\r\n }\r\n\r\n if (!range.collapsed) {\r\n const el = document.createElement(tag);\r\n if (tag === 'pre') {\r\n el.setAttribute('style', 'white-space: pre-wrap; font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;');\r\n }\r\n const frag = range.extractContents();\r\n el.appendChild(frag);\r\n range.insertNode(el);\r\n const sel = window.getSelection();\r\n if (sel) {\r\n sel.removeAllRanges();\r\n const after = document.createRange();\r\n after.selectNodeContents(el);\r\n after.collapse(false);\r\n sel.addRange(after);\r\n }\r\n }\r\n }\r\n}\r\n","<div class=\"stackch_rte\" [class.stackch_rte--disabled]=\"disabled\">\r\n @if (showToolbar) {\r\n <stackch-richtext-editor-material-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","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|