@stackch/angular-material-richtext-editor 1.2.1 → 1.2.2

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-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\n// Structured metrics for editor content sizes (extendable in future)\r\nexport interface StackchRichtextMetrics {\r\n htmlLength: number;\r\n textLength: number;\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 // Structured metrics event (future-proof)\r\n @Output() metricsChange = new EventEmitter<StackchRichtextMetrics>();\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 // Emit initial metrics when value is written programmatically\r\n this.emitMetrics();\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.applySelectionStyles({ color });\r\n this.saveSelection();\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 this.applySelectionStyles({ backgroundColor: color });\r\n this.saveSelection();\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.emitMetrics();\r\n this.updateInlineStates();\r\n }\r\n\r\n private emitMetrics() {\r\n const editor = this.editorRef?.nativeElement;\r\n if (!editor) return;\r\n const htmlLen = editor.innerHTML.length;\r\n const textLen = (editor.textContent || '').length;\r\n this.metricsChange.emit({ htmlLength: htmlLen, textLength: textLen });\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 console.log('[RTE-material] cleanupEmptyStylesAndSpans: start cleanup');\r\n const editor = root || this.editorRef.nativeElement;\r\n const toUnwrap: HTMLElement[] = [];\r\n const toRemove: 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 if (el.tagName === 'SPAN') {\r\n if (!el.firstChild) {\r\n console.log('[RTE-material] cleanup: removing empty span', el);\r\n toRemove.push(el);\r\n continue;\r\n }\r\n if (el.attributes.length === 0) {\r\n console.log('[RTE-material] cleanup: unwrapping style-free span', el);\r\n toUnwrap.push(el);\r\n }\r\n }\r\n }\r\n for (const span of toUnwrap) {\r\n console.log('[RTE-material] cleanup: unwrap span', { span, childCount: span.childNodes.length });\r\n while (span.firstChild) span.parentNode?.insertBefore(span.firstChild, span);\r\n span.remove();\r\n }\r\n for (const span of toRemove) {\r\n console.log('[RTE-material] cleanup: remove span without children', 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 // Delegate to a generic, style-agnostic applier\r\n this.applySelectionStyles({ [cssProp]: value });\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 // Use generic, which handles single vs. multi-block selection\r\n this.applySelectionStyles({ [cssProp]: value });\r\n }\r\n\r\n private applySelectionStyles(styles: Record<string, string>) {\r\n this.focusEditor();\r\n this.restoreSelection();\r\n const sel = window.getSelection();\r\n if (!sel || sel.rangeCount === 0) {\r\n console.warn('[RTE-material] applySelectionStyles: no selection available', { styles });\r\n return;\r\n }\r\n let range = sel.getRangeAt(0);\r\n if (range.collapsed) {\r\n console.warn('[RTE-material] applySelectionStyles: range is collapsed', { styles });\r\n return;\r\n }\r\n\r\n const entries = Object.entries(styles).filter(([, v]) => v != null && v !== '');\r\n if (entries.length === 0) {\r\n console.warn('[RTE-material] applySelectionStyles: no style entries to apply', { styles });\r\n return;\r\n }\r\n\r\n const propsToClear = Array.from(new Set(entries.map(([prop]) => this.toCssProperty(prop))));\r\n console.log('[RTE-material] applySelectionStyles: clearing props before apply', { propsToClear, entries });\r\n for (const cssProp of propsToClear) {\r\n const beforeClear = range.cloneRange();\r\n const clearedRange = this.removeInlineStyleInRange(range, cssProp, { suppressEmit: true });\r\n const refreshedSel = window.getSelection();\r\n if (refreshedSel && refreshedSel.rangeCount > 0) {\r\n range = refreshedSel.getRangeAt(0);\r\n } else if (clearedRange) {\r\n range = clearedRange;\r\n }\r\n if (range.collapsed && !beforeClear.collapsed) {\r\n console.warn('[RTE-material] applySelectionStyles: range collapsed after clearing, restoring previous range');\r\n const sel = window.getSelection();\r\n if (sel) {\r\n sel.removeAllRanges();\r\n sel.addRange(beforeClear);\r\n }\r\n range = beforeClear;\r\n }\r\n }\r\n\r\n const segments = this.collectTextSegments(range);\r\n if (segments.length === 0) {\r\n console.warn('[RTE-material] applySelectionStyles: no text segments found', {\r\n entries,\r\n commonAncestor: range.commonAncestorContainer\r\n });\r\n return;\r\n }\r\n console.log('[RTE-material] applySelectionStyles: applying styles to segments', {\r\n entries,\r\n segmentCount: segments.length\r\n });\r\n\r\n const wrappedSegments: HTMLElement[] = [];\r\n for (let i = segments.length - 1; i >= 0; i--) {\r\n const wrapped = this.applyStylesToSegment(segments[i], entries);\r\n if (wrapped) wrappedSegments.unshift(wrapped);\r\n }\r\n\r\n if (wrappedSegments.length) {\r\n const first = wrappedSegments[0];\r\n const last = wrappedSegments[wrappedSegments.length - 1];\r\n const newRange = document.createRange();\r\n newRange.setStartBefore(first);\r\n newRange.setEndAfter(last);\r\n const selAfter = window.getSelection();\r\n if (selAfter) {\r\n selAfter.removeAllRanges();\r\n selAfter.addRange(newRange);\r\n }\r\n this.saveSelectionFromRange(newRange);\r\n }\r\n\r\n this.emitValue();\r\n this.takeSnapshot('style');\r\n }\r\n\r\n private collectTextSegments(range: Range): Array<{ node: Text; start: number; end: number }> {\r\n const segments: Array<{ node: Text; start: number; end: number }> = [];\r\n const root = range.commonAncestorContainer;\r\n if (root.nodeType === Node.TEXT_NODE) {\r\n const text = root as Text;\r\n const start = text === range.startContainer ? range.startOffset : 0;\r\n const end = text === range.endContainer ? range.endOffset : text.data.length;\r\n if (start < end) segments.push({ node: text, start, end });\r\n return segments;\r\n }\r\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT);\r\n while (walker.nextNode()) {\r\n const text = walker.currentNode as Text;\r\n if (!text.data) continue;\r\n if (!this.intersectsRange(range, text)) continue;\r\n const start = text === range.startContainer ? range.startOffset : 0;\r\n const end = text === range.endContainer ? range.endOffset : text.data.length;\r\n if (start >= end) continue;\r\n segments.push({ node: text, start, end });\r\n }\r\n return segments;\r\n }\r\n\r\n private intersectsRange(range: Range, node: Node): boolean {\r\n try {\r\n return (range as any).intersectsNode ? range.intersectsNode(node) : true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n private applyStylesToSegment(\r\n segment: { node: Text; start: number; end: number },\r\n entries: Array<[string, string]>\r\n ): HTMLElement | null {\r\n const segRange = document.createRange();\r\n segRange.setStart(segment.node, segment.start);\r\n segRange.setEnd(segment.node, segment.end);\r\n const wrapper = document.createElement('span');\r\n for (const [prop, value] of entries) {\r\n wrapper.style.setProperty(this.toCssProperty(prop), value);\r\n }\r\n try {\r\n segRange.surroundContents(wrapper);\r\n return this.mergeAdjacentStyledSpans(wrapper);\r\n } catch (err) {\r\n console.error('[RTE-material] applyStylesToSegment: failed to surround contents', {\r\n error: err,\r\n segment,\r\n entries\r\n });\r\n }\r\n return null;\r\n }\r\n\r\n private toCssProperty(prop: string): string {\r\n return prop.replace(/([A-Z])/g, '-$1').toLowerCase();\r\n }\r\n\r\n private mergeAdjacentStyledSpans(span: HTMLElement): HTMLElement {\r\n if (span.tagName !== 'SPAN') return span;\r\n let current = span;\r\n const normalize = (el: HTMLElement | null) => el && el.tagName === 'SPAN' ? el : null;\r\n const styleText = (el: HTMLElement | null) => (el ? el.getAttribute('style') || '' : '');\r\n\r\n let parent = normalize(current.parentElement);\r\n if (parent && styleText(parent) === styleText(current) && parent.attributes.length === current.attributes.length) {\r\n while (current.firstChild) parent.insertBefore(current.firstChild, current);\r\n current.remove();\r\n current = parent;\r\n }\r\n\r\n let prev: Node | null = current.previousSibling;\r\n while (prev && prev.nodeType === Node.TEXT_NODE && !(prev as Text).data.trim()) prev = prev.previousSibling;\r\n if (prev instanceof HTMLElement && prev.tagName === 'SPAN' && styleText(prev) === styleText(current) && prev.attributes.length === current.attributes.length) {\r\n while (current.firstChild) prev.appendChild(current.firstChild);\r\n current.remove();\r\n current = prev;\r\n }\r\n\r\n let next: Node | null = current.nextSibling;\r\n while (next && next.nodeType === Node.TEXT_NODE && !(next as Text).data.trim()) next = next.nextSibling;\r\n if (next instanceof HTMLElement && next.tagName === 'SPAN' && styleText(next) === styleText(current) && next.attributes.length === current.attributes.length) {\r\n while (next.firstChild) current.appendChild(next.firstChild);\r\n next.remove();\r\n }\r\n return current;\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 isItalicCarrier(el: HTMLElement | null): boolean {\r\n if (!el) return false;\r\n if (el.tagName === 'I' || el.tagName === '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 if (el.tagName === 'U') return true;\r\n const td = (el.style as any)?.textDecoration || (el.style as any)?.textDecorationLine || '';\r\n return typeof td === 'string' && td.includes('underline');\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 (avoid Document-level issues)\r\n const pParent = parent.parentNode as (ParentNode & Node) | null;\r\n if (pParent && pParent.nodeType !== Node.DOCUMENT_NODE) {\r\n (pParent as any).insertBefore(right, (parent as any).nextSibling);\r\n } else {\r\n while (right.firstChild) parent.appendChild(right.firstChild);\r\n }\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) | null;\r\n if (!gp) return;\r\n if ((gp as any).nodeType === Node.DOCUMENT_NODE) {\r\n if (before.childNodes.length) {\r\n while (before.firstChild) ancestor.parentNode?.insertBefore(before.firstChild, ancestor);\r\n }\r\n ancestor.parentNode?.insertBefore(node, ancestor);\r\n if (after.childNodes.length) {\r\n while (after.firstChild) ancestor.parentNode?.insertBefore(after.firstChild, ancestor);\r\n }\r\n ancestor.remove();\r\n return;\r\n }\r\n if (before.childNodes.length) (gp as any).insertBefore(before, ancestor);\r\n // move node out, place where ancestor was\r\n (gp as any).insertBefore(node, ancestor);\r\n if (after.childNodes.length) (gp as any).insertBefore(after, ancestor);\r\n ancestor.remove();\r\n }\r\n\r\n private saveSelectionFromRange(range: Range) {\r\n this.savedRange = range.cloneRange();\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 return this.selectionHasStyle(range, 'font-weight');\r\n }\r\n\r\n private computeItalicAnyForRange(range: Range): boolean {\r\n return this.selectionHasStyle(range, 'font-style');\r\n }\r\n\r\n private computeUnderlineAnyForRange(range: Range): boolean {\r\n return this.selectionHasStyle(range, 'text-decoration');\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 removeInlineStyleInRange(\r\n range: Range,\r\n cssPropKebab: string,\r\n options?: { suppressEmit?: boolean; restoreSelection?: boolean }\r\n ): Range | null {\r\n const shouldRestoreSelection = options?.restoreSelection !== false;\r\n this.isolateRangeFromStyleCarriers(range, cssPropKebab);\r\n const editor = this.editorRef.nativeElement;\r\n const selAfter = window.getSelection();\r\n const effectiveRange = selAfter && selAfter.rangeCount > 0 ? selAfter.getRangeAt(0) : range;\r\n const common = effectiveRange.commonAncestorContainer.nodeType === Node.ELEMENT_NODE\r\n ? (effectiveRange.commonAncestorContainer as Element)\r\n : (effectiveRange.commonAncestorContainer.parentElement || editor);\r\n const affected: HTMLElement[] = [];\r\n const intersects = (node: Node) => {\r\n try {\r\n return (effectiveRange as any).intersectsNode ? effectiveRange.intersectsNode(node) : true;\r\n } catch {\r\n return false;\r\n }\r\n };\r\n const matchesEl = (el: HTMLElement) => this.isStyleCarrier(el, cssPropKebab);\r\n\r\n console.log('[RTE-material] removeInlineStyleInRange:start', {\r\n cssPropKebab,\r\n rangeCollapsed: effectiveRange.collapsed,\r\n commonTag: (common as Element).tagName,\r\n commonHasStyle: (common as HTMLElement).style ? (common as HTMLElement).style.getPropertyValue?.(cssPropKebab) : undefined\r\n });\r\n\r\n if (common instanceof HTMLElement && matchesEl(common) && intersects(common)) {\r\n affected.push(common);\r\n }\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 if (!matchesEl(el)) continue;\r\n if (intersects(el)) {\r\n affected.push(el);\r\n console.log('[RTE-material] removeInlineStyleInRange:match', el.tagName, el.getAttribute('style'));\r\n }\r\n }\r\n\r\n let removedTags = 0;\r\n let removedProps = 0;\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 console.log('[RTE-material] unwrap tag', el.tagName);\r\n while (el.firstChild) el.parentNode?.insertBefore(el.firstChild, el);\r\n el.remove();\r\n removedTags++;\r\n continue;\r\n }\r\n console.log('[RTE-material] remove style', cssPropKebab, 'from', el.tagName, el.getAttribute('style'));\r\n el.style.removeProperty(cssPropKebab);\r\n if (!el.style.length) {\r\n console.log('[RTE-material] removeInlineStyleInRange: style attribute now empty, removing attribute', el);\r\n el.removeAttribute('style');\r\n }\r\n removedProps++;\r\n if (!el.getAttribute('style')) {\r\n console.log('[RTE-material] unwrap empty styled span', el.tagName);\r\n while (el.firstChild) el.parentNode?.insertBefore(el.firstChild, el);\r\n el.remove();\r\n }\r\n }\r\n this.pruneDanglingStyleCarriers(common, cssPropKebab);\r\n console.log('[RTE-material] removeInlineStyleInRange:done', { affected: affected.length, removedTags, removedProps });\r\n let resultRange: Range | null = null;\r\n if (!options?.suppressEmit) {\r\n this.emitValue();\r\n resultRange = null;\r\n } else {\r\n const sel = window.getSelection();\r\n if (sel && sel.rangeCount > 0) {\r\n resultRange = sel.getRangeAt(0).cloneRange();\r\n } else if (shouldRestoreSelection) {\r\n resultRange = effectiveRange.cloneRange();\r\n }\r\n if (shouldRestoreSelection && resultRange) {\r\n const selRestore = window.getSelection();\r\n if (selRestore) {\r\n selRestore.removeAllRanges();\r\n selRestore.addRange(resultRange);\r\n this.saveSelectionFromRange(resultRange);\r\n }\r\n }\r\n }\r\n return resultRange;\r\n }\r\n\r\n private pruneDanglingStyleCarriers(root: Element, cssPropKebab: string) {\r\n const toRemove: HTMLElement[] = [];\r\n if (root instanceof HTMLElement && this.isStyleCarrier(root, cssPropKebab) && !this.elementHasVisibleContent(root)) {\r\n toRemove.push(root);\r\n }\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 if (!this.isStyleCarrier(el, cssPropKebab)) continue;\r\n if (this.elementHasVisibleContent(el)) continue;\r\n toRemove.push(el);\r\n }\r\n for (const el of toRemove) {\r\n console.log('[RTE-material] pruneDanglingStyleCarriers: removing empty carrier', { tag: el.tagName, style: el.getAttribute('style') });\r\n if (el.tagName === 'B' || el.tagName === 'STRONG' || el.tagName === 'I' || el.tagName === 'EM' || el.tagName === 'U') {\r\n el.remove();\r\n continue;\r\n }\r\n el.remove();\r\n }\r\n }\r\n\r\n private elementHasVisibleContent(node: Node): boolean {\r\n if (node.nodeType === Node.TEXT_NODE) {\r\n const text = (node as Text).data;\r\n for (let i = 0; i < text.length; i++) {\r\n const ch = text[i];\r\n if (ch === '\\u00a0') return true;\r\n if (!/\\s/.test(ch) && ch !== '\\u200b' && ch !== '\\u200c' && ch !== '\\u200d' && ch !== '\\ufeff') {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n if (node.nodeType === Node.ELEMENT_NODE) {\r\n const el = node as HTMLElement;\r\n if (el.tagName === 'BR') return true;\r\n for (const child of Array.from(node.childNodes)) {\r\n if (this.elementHasVisibleContent(child)) return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n private isolateRangeFromStyleCarriers(range: Range, cssPropKebab: string) {\r\n let carrier = this.findCarrierContainingRange(range, cssPropKebab);\r\n while (carrier) {\r\n this.splitCarrierAroundSelection(range, carrier);\r\n carrier = this.findCarrierContainingRange(range, cssPropKebab);\r\n }\r\n }\r\n\r\n private selectionHasStyle(range: Range, cssPropKebab: 'font-weight' | 'font-style' | 'text-decoration'): boolean {\r\n const editor = this.editorRef.nativeElement;\r\n const common = range.commonAncestorContainer.nodeType === Node.ELEMENT_NODE\r\n ? (range.commonAncestorContainer as Element)\r\n : (range.commonAncestorContainer.parentElement || editor);\r\n const intersects = (node: Node) => this.intersectsRange(range, node);\r\n if (common instanceof HTMLElement && this.isStyleCarrier(common, cssPropKebab) && intersects(common)) {\r\n return true;\r\n }\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 if (!this.isStyleCarrier(el, cssPropKebab)) continue;\r\n if (intersects(el)) return true;\r\n }\r\n return false;\r\n }\r\n\r\n private findCarrierContainingRange(range: Range, cssPropKebab: string): 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.isStyleCarrier(el, cssPropKebab)) {\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 isStyleCarrier(el: HTMLElement, cssPropKebab: string): boolean {\r\n const tag = el.tagName;\r\n if (cssPropKebab === 'font-weight') {\r\n if (tag === 'B' || tag === 'STRONG') return true;\r\n const fw = el.style?.fontWeight || '';\r\n return !!fw && fw !== 'normal' && fw !== '400';\r\n }\r\n if (cssPropKebab === 'font-style') {\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 if (cssPropKebab === 'text-decoration') {\r\n if (tag === 'U') return true;\r\n const td = (el.style as any)?.textDecoration || (el.style as any)?.textDecorationLine || '';\r\n return typeof td === 'string' && td.includes('underline');\r\n }\r\n const inline = el.style?.getPropertyValue(cssPropKebab) || '';\r\n if (!inline) return false;\r\n if (cssPropKebab === 'color') {\r\n return inline !== 'inherit' && inline !== 'initial';\r\n }\r\n if (cssPropKebab === 'background-color') {\r\n return inline !== 'transparent' && inline !== 'initial';\r\n }\r\n return true;\r\n }\r\n\r\n private splitCarrierAroundSelection(range: Range, carrier: HTMLElement) {\r\n const parent = carrier.parentNode as (ParentNode & Node) | null;\r\n if (!parent) return;\r\n const rightRange = document.createRange();\r\n rightRange.setStart(range.endContainer, range.endOffset);\r\n try { rightRange.setEnd(carrier, carrier.childNodes.length); } catch {}\r\n const rightFrag = rightRange.extractContents();\r\n const leftRange = document.createRange();\r\n leftRange.setStart(carrier, 0);\r\n try { leftRange.setEnd(range.startContainer, range.startOffset); } catch {}\r\n const leftFrag = leftRange.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 insertAfter: 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 insertAfter = rightClone;\r\n }\r\n while (carrier.firstChild) parent.insertBefore(carrier.firstChild, insertAfter);\r\n carrier.remove();\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 if (anyActive) {\r\n this.removeInlineStyleInRange(range, 'font-weight');\r\n } else {\r\n this.applySelectionStyles({ fontWeight: 'bold' } as any);\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 this.removeInlineStyleInRange(range, 'font-style');\r\n } else {\r\n this.applySelectionStyles({ fontStyle: 'italic' } as any);\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 this.removeInlineStyleInRange(range, 'text-decoration');\r\n } else {\r\n this.applySelectionStyles({ textDecoration: 'underline' } as any);\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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"}
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, forwardRef, ChangeDetectorRef } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { StackchRichtextEditorMaterialToolbar } from './toolbar/stackch-richtext-editor-material-toolbar';\nimport { StackchRichtextEditorBase } from '@stackch/angular-richtext-editor';\n\n// Re-export all shared types and i18n bundles from the core library\n// so consumers of the material package can import from here too.\nexport {\n StackchRichtextEditorConfig,\n StackchRichtextEditorI18n,\n StackchRichtextEditorBase,\n STACKCH_RTE_I18N_DE,\n STACKCH_RTE_I18N_FR,\n STACKCH_RTE_I18N_IT,\n} from '@stackch/angular-richtext-editor';\nexport type { StackchRichtextMetrics } from '@stackch/angular-richtext-editor';\n\n@Component({\n selector: 'stackch-richtext-editor-material',\n standalone: true,\n imports: [CommonModule, StackchRichtextEditorMaterialToolbar],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => StackchRichtextEditorMaterial),\n multi: true,\n },\n ],\n templateUrl: './stackch-richtext-editor-material.html',\n styleUrls: ['./stackch-richtext-editor-material.scss']\n})\nexport class StackchRichtextEditorMaterial extends StackchRichtextEditorBase {\n protected override logPrefix = '[RTE-material]';\n\n constructor(cdr: ChangeDetectorRef) {\n super(cdr);\n }\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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"}