@kolkov/angular-editor 3.0.3 → 3.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,40 @@
1
+ <a name="3.0.5"></a>
2
+ ## [3.0.5](https://github.com/kolkov/angular-editor/compare/v3.0.4...v3.0.5) (2026-01-30)
3
+
4
+ ### Bug Fixes
5
+ * **custom-class:** Preserve HTML structure in multiline selections ([#594](https://github.com/kolkov/angular-editor/issues/594)) ([#595](https://github.com/kolkov/angular-editor/pull/595))
6
+ - Fixed `createCustomClass()` stripping HTML when applying custom classes to multiline content
7
+ - Added `mode` option to `CustomClass`: `'inline'`, `'block'`, `'auto'` (default)
8
+ - Smart detection: inline mode for single blocks, block mode for multiple paragraphs
9
+ - Block mode applies class to each block element (P, DIV, H1-H6, LI, etc.)
10
+ - Uses DOM Range API with `extractContents()` + `insertNode()` instead of `sel.toString()`
11
+
12
+ ### Features
13
+ * **config:** Add `textDirection` option for RTL/LTR support ([#520](https://github.com/kolkov/angular-editor/issues/520)) ([#592](https://github.com/kolkov/angular-editor/pull/592))
14
+ - New config property: `textDirection?: 'ltr' | 'rtl' | 'auto'`
15
+ - Binds to HTML `dir` attribute on editor element
16
+ - Thanks to @jamesey2001 for the contribution
17
+
18
+ ---
19
+
20
+ <a name="3.0.4"></a>
21
+ ## [3.0.4](https://github.com/kolkov/angular-editor/compare/v3.0.3...v3.0.4) (2025-12-18) - Security Hotfix
22
+
23
+ ### Security
24
+ * **CRITICAL:** Fixed XSS vulnerability in `toggleEditorMode()` method ([#580](https://github.com/kolkov/angular-editor/issues/580)) ([#587](https://github.com/kolkov/angular-editor/pull/587))
25
+ - XSS could execute when switching from HTML source mode back to WYSIWYG
26
+ - User-entered HTML was set via innerHTML without sanitization
27
+ - Sanitization now properly applied in both code paths
28
+ - Thanks to @MarioTesoro for finding the root cause and submitting the fix
29
+
30
+ ### Note
31
+ v3.0.3 fix was incomplete - it only covered `refreshView()` but not `toggleEditorMode()`. This release provides complete XSS protection.
32
+
33
+ ### Upgrade Recommendation
34
+ **IMMEDIATE UPGRADE RECOMMENDED** for all users. This release completes the security fix started in v3.0.3.
35
+
36
+ ---
37
+
1
38
  <a name="3.0.3"></a>
2
39
  ## [3.0.3](https://github.com/kolkov/angular-editor/compare/v3.0.2...v3.0.3) (2025-01-22) - Security Hotfix
3
40
 
package/README.md CHANGED
@@ -4,11 +4,12 @@
4
4
 
5
5
  # AngularEditor
6
6
  [![npm version](https://badge.fury.io/js/%40kolkov%2Fangular-editor.svg)](https://badge.fury.io/js/%40kolkov%2Fangular-editor)
7
+ [![npm](https://img.shields.io/npm/v/@kolkov/angular-editor.svg)](https://www.npmjs.com/package/@kolkov/angular-editor)
7
8
  [![CI](https://github.com/kolkov/angular-editor/actions/workflows/publish.yml/badge.svg)](https://github.com/kolkov/angular-editor/actions/workflows/publish.yml)
9
+ [![npm downloads](https://img.shields.io/npm/dm/@kolkov/angular-editor.svg)](https://www.npmjs.com/package/@kolkov/angular-editor)
8
10
  [![demo](https://img.shields.io/badge/demo-StackBlitz-blueviolet.svg)](https://stackblitz.com/edit/angular-editor-wysiwyg)
9
- [![npm](https://img.shields.io/npm/dm/@kolkov/angular-editor.svg)](https://www.npmjs.com/package/@kolkov/angular-editor)
10
11
  [![](https://data.jsdelivr.com/v1/package/npm/@kolkov/angular-editor/badge?style=rounded)](https://www.jsdelivr.com/package/npm/@kolkov/angular-editor)
11
- [![codecov](https://codecov.io/gh/kolkov/angular-editor/branch/main/graph/badge.svg)](https://codecov.io/gh/kolkov/angular-editor)
12
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
12
13
  [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://paypal.me/AndreyKolkov)
13
14
 
14
15
  A simple native WYSIWYG/Rich Text editor for Angular 20+
@@ -162,14 +162,189 @@ class AngularEditorService {
162
162
  setDefaultParagraphSeparator(separator) {
163
163
  this.doc.execCommand('defaultParagraphSeparator', false, separator);
164
164
  }
165
+ /**
166
+ * Apply custom class to selection with enterprise-level HTML structure preservation.
167
+ * Supports three modes:
168
+ * - 'inline': Wrap selection in a single element (legacy behavior)
169
+ * - 'block': Apply class to each block element in selection
170
+ * - 'auto': Smart detection based on selection span (default)
171
+ *
172
+ * @param customClass The custom class configuration
173
+ */
165
174
  createCustomClass(customClass) {
166
- let newTag = this.selectedText;
167
- if (customClass) {
168
- const tagName = customClass.tag ? customClass.tag : 'span';
169
- newTag = '<' + tagName + ' class="' + customClass.class + '">' + this.selectedText + '</' + tagName + '>';
175
+ if (!customClass || !this.savedSelection) {
176
+ return;
177
+ }
178
+ const mode = customClass.mode || 'auto';
179
+ const range = this.savedSelection;
180
+ // Restore selection before applying
181
+ this.restoreSelection();
182
+ if (mode === 'inline') {
183
+ this.applyClassInline(range, customClass);
184
+ }
185
+ else if (mode === 'block') {
186
+ this.applyClassToBlocks(range, customClass);
187
+ }
188
+ else {
189
+ // Auto mode: detect if selection spans multiple blocks
190
+ const blocks = this.getBlockElementsInRange(range);
191
+ if (blocks.length > 1) {
192
+ this.applyClassToBlocks(range, customClass);
193
+ }
194
+ else {
195
+ this.applyClassInline(range, customClass);
196
+ }
170
197
  }
198
+ }
199
+ /**
200
+ * Apply class inline by wrapping selection in a single element.
201
+ * Uses extractContents + insertNode pattern for safety.
202
+ */
203
+ applyClassInline(range, customClass) {
204
+ const tagName = customClass.tag || 'span';
205
+ try {
206
+ // Create wrapper element
207
+ const wrapper = this.doc.createElement(tagName);
208
+ wrapper.className = customClass.class;
209
+ // Extract contents and wrap (safer than surroundContents)
210
+ const contents = range.extractContents();
211
+ wrapper.appendChild(contents);
212
+ range.insertNode(wrapper);
213
+ // Normalize to merge adjacent text nodes
214
+ if (wrapper.parentNode) {
215
+ wrapper.parentNode.normalize();
216
+ }
217
+ // Update selection to the new wrapper
218
+ range.selectNodeContents(wrapper);
219
+ const sel = this.doc.getSelection();
220
+ sel.removeAllRanges();
221
+ sel.addRange(range);
222
+ }
223
+ catch (e) {
224
+ // Fallback to legacy method if DOM manipulation fails
225
+ console.warn('applyClassInline failed, using fallback:', e);
226
+ this.applyClassInlineFallback(customClass);
227
+ }
228
+ }
229
+ /**
230
+ * Fallback method for inline class application (legacy behavior).
231
+ */
232
+ applyClassInlineFallback(customClass) {
233
+ const tagName = customClass.tag || 'span';
234
+ const newTag = '<' + tagName + ' class="' + customClass.class + '">' + this.selectedText + '</' + tagName + '>';
171
235
  this.insertHtml(newTag);
172
236
  }
237
+ /**
238
+ * Apply class to each block element in selection.
239
+ * Preserves HTML structure by adding class to existing elements.
240
+ */
241
+ applyClassToBlocks(range, customClass) {
242
+ const blocks = this.getBlockElementsInRange(range);
243
+ if (blocks.length === 0) {
244
+ // No blocks found, fall back to inline
245
+ this.applyClassInline(range, customClass);
246
+ return;
247
+ }
248
+ // Apply class to each block element
249
+ blocks.forEach(block => {
250
+ // Toggle class: remove if present, add if not
251
+ if (block.classList.contains(customClass.class)) {
252
+ block.classList.remove(customClass.class);
253
+ }
254
+ else {
255
+ block.classList.add(customClass.class);
256
+ }
257
+ });
258
+ // Trigger change detection by moving cursor
259
+ const sel = this.doc.getSelection();
260
+ if (sel && blocks.length > 0) {
261
+ // Reselect the original range
262
+ sel.removeAllRanges();
263
+ sel.addRange(range);
264
+ }
265
+ }
266
+ /**
267
+ * Get all block-level elements within a range.
268
+ * Returns elements that are fully or partially selected.
269
+ */
270
+ getBlockElementsInRange(range) {
271
+ const blockTags = [
272
+ 'P', 'DIV', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6',
273
+ 'LI', 'BLOCKQUOTE', 'PRE', 'ADDRESS', 'ARTICLE',
274
+ 'ASIDE', 'FIGCAPTION', 'FIGURE', 'FOOTER', 'HEADER',
275
+ 'MAIN', 'NAV', 'SECTION'
276
+ ];
277
+ const blocks = [];
278
+ const seen = new Set();
279
+ // Get the common ancestor
280
+ const container = range.commonAncestorContainer;
281
+ const root = container.nodeType === Node.ELEMENT_NODE
282
+ ? container
283
+ : container.parentElement;
284
+ if (!root) {
285
+ return blocks;
286
+ }
287
+ // If root itself is a block element and fully contains the range
288
+ if (blockTags.includes(root.tagName) && this.isNodeFullyInRange(root, range)) {
289
+ return [root];
290
+ }
291
+ // Find all block elements within the range using TreeWalker
292
+ const walker = this.doc.createTreeWalker(root, NodeFilter.SHOW_ELEMENT, {
293
+ acceptNode: (node) => {
294
+ if (!blockTags.includes(node.tagName)) {
295
+ return NodeFilter.FILTER_SKIP;
296
+ }
297
+ // Check if node intersects with selection
298
+ if (range.intersectsNode(node)) {
299
+ return NodeFilter.FILTER_ACCEPT;
300
+ }
301
+ return NodeFilter.FILTER_SKIP;
302
+ }
303
+ });
304
+ let node;
305
+ while ((node = walker.nextNode())) {
306
+ const element = node;
307
+ // Avoid duplicates and nested blocks
308
+ if (!seen.has(element) && !this.hasAncestorInSet(element, seen)) {
309
+ seen.add(element);
310
+ blocks.push(element);
311
+ }
312
+ }
313
+ // If no blocks found, check if we're inside a block
314
+ if (blocks.length === 0) {
315
+ let parent = root;
316
+ while (parent && parent !== this.doc.body) {
317
+ if (blockTags.includes(parent.tagName)) {
318
+ blocks.push(parent);
319
+ break;
320
+ }
321
+ parent = parent.parentElement;
322
+ }
323
+ }
324
+ return blocks;
325
+ }
326
+ /**
327
+ * Check if a node is fully contained within a range.
328
+ */
329
+ isNodeFullyInRange(node, range) {
330
+ const nodeRange = this.doc.createRange();
331
+ nodeRange.selectNodeContents(node);
332
+ return range.compareBoundaryPoints(Range.START_TO_START, nodeRange) <= 0 &&
333
+ range.compareBoundaryPoints(Range.END_TO_END, nodeRange) >= 0;
334
+ }
335
+ /**
336
+ * Check if element has an ancestor in the given set.
337
+ */
338
+ hasAncestorInSet(element, set) {
339
+ let parent = element.parentElement;
340
+ while (parent) {
341
+ if (set.has(parent)) {
342
+ return true;
343
+ }
344
+ parent = parent.parentElement;
345
+ }
346
+ return false;
347
+ }
173
348
  insertVideo(videoUrl) {
174
349
  if (videoUrl.match('www.youtube.com') || videoUrl.match('youtu.be')) {
175
350
  this.insertYouTubeVideoTag(videoUrl);
@@ -1202,12 +1377,21 @@ class AngularEditorComponent {
1202
1377
  }
1203
1378
  else {
1204
1379
  if (this.doc.querySelectorAll) {
1380
+ // Apply sanitization to prevent XSS when switching from HTML mode
1381
+ if (this.config.sanitize !== false) {
1382
+ editableElement.innerText = this.sanitizer.sanitize(SecurityContext.HTML, editableElement.innerText);
1383
+ }
1205
1384
  this.r.setProperty(editableElement, 'innerHTML', editableElement.innerText);
1206
1385
  }
1207
1386
  else {
1208
1387
  oContent = this.doc.createRange();
1209
1388
  oContent.selectNodeContents(editableElement.firstChild);
1210
- this.r.setProperty(editableElement, 'innerHTML', oContent.toString());
1389
+ let oContentString = oContent.toString();
1390
+ // Apply sanitization to prevent XSS when switching from HTML mode
1391
+ if (this.config.sanitize !== false) {
1392
+ oContentString = this.sanitizer.sanitize(SecurityContext.HTML, oContentString);
1393
+ }
1394
+ this.r.setProperty(editableElement, 'innerHTML', oContentString);
1211
1395
  }
1212
1396
  this.r.setProperty(editableElement, 'contentEditable', true);
1213
1397
  this.modeVisual = true;
@@ -1287,7 +1471,7 @@ class AngularEditorComponent {
1287
1471
  multi: true
1288
1472
  },
1289
1473
  AngularEditorService
1290
- ], queries: [{ propertyName: "customButtonsTemplateRef", first: true, predicate: ["customButtons"], descendants: true }], viewQueries: [{ propertyName: "textArea", first: true, predicate: ["editor"], descendants: true, static: true }, { propertyName: "editorWrapper", first: true, predicate: ["editorWrapper"], descendants: true, static: true }, { propertyName: "editorToolbar", first: true, predicate: ["editorToolbar"], descendants: true }], ngImport: i0, template: "<div\n class=\"angular-editor\"\n #angularEditor\n [style.width]=\"config.width\"\n [style.minWidth]=\"config.minWidth\"\n [ngClass]=\"{\n 'bottom': config.toolbarPosition === 'bottom'\n }\"\n>\n <angular-editor-toolbar\n #editorToolbar\n [id]=\"id\"\n [uploadUrl]=\"config.uploadUrl\"\n [upload]=\"config.upload\"\n [showToolbar]=\"config.showToolbar !== undefined ? config.showToolbar : true\"\n [fonts]=\"getFonts()\"\n [customClasses]=\"config.customClasses\"\n [defaultFontName]=\"config.defaultFontName\"\n [defaultFontSize]=\"config.defaultFontSize\"\n [hiddenButtons]=\"config.toolbarHiddenButtons\"\n (execute)=\"executeCommand($event)\"\n >\n <ng-container\n [ngTemplateOutlet]=\"customButtonsTemplateRef\"\n [ngTemplateOutletContext]=\"{ executeCommandFn: this.executeCommandFn}\"\n >\n </ng-container>\n </angular-editor-toolbar>\n\n <div\n class=\"angular-editor-wrapper\"\n #editorWrapper\n >\n <div\n #editor\n class=\"angular-editor-textarea\"\n [attr.contenteditable]=\"config.editable\"\n [attr.tabindex]=\"disabled ? -1 : tabIndex\"\n [attr.translate]=\"config.translate\"\n [attr.spellcheck]=\"config.spellcheck\"\n [style.height]=\"config.height\"\n [style.minHeight]=\"config.minHeight\"\n [style.maxHeight]=\"config.maxHeight\"\n [style.outline]=\"config.outline === false ? 'none': undefined\"\n (input)=\"onContentChange($any($event.target))\"\n (focus)=\"onTextAreaFocus($event)\"\n (blur)=\"onTextAreaBlur($event)\"\n (click)=\"exec()\"\n (keyup)=\"exec()\"\n (mouseout)=\"onTextAreaMouseOut($event)\"\n (paste)=\"onPaste($event)\"\n >\n </div>\n <span class=\"angular-editor-placeholder\">{{ placeholder || config['placeholder'] }}</span>\n </div>\n</div>\n", styles: ["a{cursor:pointer}.angular-editor{display:flex;flex-direction:column;gap:var(--ae-gap, 5px)}.angular-editor.bottom{flex-direction:column-reverse}.angular-editor ::ng-deep [contenteditable=true]:empty:before{content:attr(placeholder);color:#868e96;opacity:1}.angular-editor .angular-editor-wrapper{position:relative}.angular-editor .angular-editor-wrapper .angular-editor-textarea{min-height:150px;overflow:auto;resize:vertical}.angular-editor .angular-editor-wrapper .angular-editor-textarea:after{content:\"\";position:absolute;bottom:0;right:0;display:block;width:8px;height:8px;cursor:nwse-resize;background-color:#ffffff80}.angular-editor .angular-editor-wrapper .angular-editor-textarea{min-height:5rem;padding:.5rem .8rem 1rem;border-radius:var(--ae-text-area-border-radius, .3rem);border:var(--ae-text-area-border, 1px solid #ddd);background-color:transparent;overflow-x:hidden;overflow-y:auto;position:relative}.angular-editor .angular-editor-wrapper .angular-editor-textarea:focus,.angular-editor .angular-editor-wrapper .angular-editor-textarea.focus{outline:var(--ae-focus-outline-color, -webkit-focus-ring-color auto 1px)}.angular-editor .angular-editor-wrapper .angular-editor-textarea ::ng-deep blockquote{margin-left:1rem;border-left:.2em solid #dfe2e5;padding-left:.5rem}.angular-editor .angular-editor-wrapper ::ng-deep p{margin-bottom:0}.angular-editor .angular-editor-wrapper .angular-editor-placeholder{display:none;position:absolute;top:0;padding:.6rem .8rem 1rem .9rem;color:#6c757d;opacity:.75}.angular-editor .angular-editor-wrapper.show-placeholder .angular-editor-placeholder{display:block}.angular-editor .angular-editor-wrapper.disabled{cursor:not-allowed;opacity:.5;pointer-events:none}\n"], dependencies: [{ kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: AeToolbarComponent, selector: "angular-editor-toolbar, ae-toolbar, div[aeToolbar]", inputs: ["id", "uploadUrl", "upload", "showToolbar", "fonts", "customClasses", "defaultFontName", "defaultFontSize", "hiddenButtons"], outputs: ["execute"] }], encapsulation: i0.ViewEncapsulation.None });
1474
+ ], queries: [{ propertyName: "customButtonsTemplateRef", first: true, predicate: ["customButtons"], descendants: true }], viewQueries: [{ propertyName: "textArea", first: true, predicate: ["editor"], descendants: true, static: true }, { propertyName: "editorWrapper", first: true, predicate: ["editorWrapper"], descendants: true, static: true }, { propertyName: "editorToolbar", first: true, predicate: ["editorToolbar"], descendants: true }], ngImport: i0, template: "<div\n class=\"angular-editor\"\n #angularEditor\n [style.width]=\"config.width\"\n [style.minWidth]=\"config.minWidth\"\n [ngClass]=\"{\n 'bottom': config.toolbarPosition === 'bottom'\n }\"\n>\n <angular-editor-toolbar\n #editorToolbar\n [id]=\"id\"\n [uploadUrl]=\"config.uploadUrl\"\n [upload]=\"config.upload\"\n [showToolbar]=\"config.showToolbar !== undefined ? config.showToolbar : true\"\n [fonts]=\"getFonts()\"\n [customClasses]=\"config.customClasses\"\n [defaultFontName]=\"config.defaultFontName\"\n [defaultFontSize]=\"config.defaultFontSize\"\n [hiddenButtons]=\"config.toolbarHiddenButtons\"\n (execute)=\"executeCommand($event)\"\n >\n <ng-container\n [ngTemplateOutlet]=\"customButtonsTemplateRef\"\n [ngTemplateOutletContext]=\"{ executeCommandFn: this.executeCommandFn}\"\n >\n </ng-container>\n </angular-editor-toolbar>\n\n <div\n class=\"angular-editor-wrapper\"\n #editorWrapper\n >\n <div\n #editor\n class=\"angular-editor-textarea\"\n [attr.contenteditable]=\"config.editable\"\n [attr.tabindex]=\"disabled ? -1 : tabIndex\"\n [attr.translate]=\"config.translate\"\n [attr.spellcheck]=\"config.spellcheck\"\n [attr.dir]=\"config.textDirection\"\n [style.height]=\"config.height\"\n [style.minHeight]=\"config.minHeight\"\n [style.maxHeight]=\"config.maxHeight\"\n [style.outline]=\"config.outline === false ? 'none': undefined\"\n (input)=\"onContentChange($any($event.target))\"\n (focus)=\"onTextAreaFocus($event)\"\n (blur)=\"onTextAreaBlur($event)\"\n (click)=\"exec()\"\n (keyup)=\"exec()\"\n (mouseout)=\"onTextAreaMouseOut($event)\"\n (paste)=\"onPaste($event)\"\n >\n </div>\n <span class=\"angular-editor-placeholder\">{{ placeholder || config['placeholder'] }}</span>\n </div>\n</div>\n", styles: ["a{cursor:pointer}.angular-editor{display:flex;flex-direction:column;gap:var(--ae-gap, 5px)}.angular-editor.bottom{flex-direction:column-reverse}.angular-editor ::ng-deep [contenteditable=true]:empty:before{content:attr(placeholder);color:#868e96;opacity:1}.angular-editor .angular-editor-wrapper{position:relative}.angular-editor .angular-editor-wrapper .angular-editor-textarea{min-height:150px;overflow:auto;resize:vertical}.angular-editor .angular-editor-wrapper .angular-editor-textarea:after{content:\"\";position:absolute;bottom:0;right:0;display:block;width:8px;height:8px;cursor:nwse-resize;background-color:#ffffff80}.angular-editor .angular-editor-wrapper .angular-editor-textarea{min-height:5rem;padding:.5rem .8rem 1rem;border-radius:var(--ae-text-area-border-radius, .3rem);border:var(--ae-text-area-border, 1px solid #ddd);background-color:transparent;overflow-x:hidden;overflow-y:auto;position:relative}.angular-editor .angular-editor-wrapper .angular-editor-textarea:focus,.angular-editor .angular-editor-wrapper .angular-editor-textarea.focus{outline:var(--ae-focus-outline-color, -webkit-focus-ring-color auto 1px)}.angular-editor .angular-editor-wrapper .angular-editor-textarea ::ng-deep blockquote{margin-left:1rem;border-left:.2em solid #dfe2e5;padding-left:.5rem}.angular-editor .angular-editor-wrapper ::ng-deep p{margin-bottom:0}.angular-editor .angular-editor-wrapper .angular-editor-placeholder{display:none;position:absolute;top:0;padding:.6rem .8rem 1rem .9rem;color:#6c757d;opacity:.75}.angular-editor .angular-editor-wrapper.show-placeholder .angular-editor-placeholder{display:block}.angular-editor .angular-editor-wrapper.disabled{cursor:not-allowed;opacity:.5;pointer-events:none}\n"], dependencies: [{ kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: AeToolbarComponent, selector: "angular-editor-toolbar, ae-toolbar, div[aeToolbar]", inputs: ["id", "uploadUrl", "upload", "showToolbar", "fonts", "customClasses", "defaultFontName", "defaultFontSize", "hiddenButtons"], outputs: ["execute"] }], encapsulation: i0.ViewEncapsulation.None });
1291
1475
  }
1292
1476
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.13", ngImport: i0, type: AngularEditorComponent, decorators: [{
1293
1477
  type: Component,
@@ -1298,7 +1482,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.13", ngImpo
1298
1482
  multi: true
1299
1483
  },
1300
1484
  AngularEditorService
1301
- ], standalone: false, template: "<div\n class=\"angular-editor\"\n #angularEditor\n [style.width]=\"config.width\"\n [style.minWidth]=\"config.minWidth\"\n [ngClass]=\"{\n 'bottom': config.toolbarPosition === 'bottom'\n }\"\n>\n <angular-editor-toolbar\n #editorToolbar\n [id]=\"id\"\n [uploadUrl]=\"config.uploadUrl\"\n [upload]=\"config.upload\"\n [showToolbar]=\"config.showToolbar !== undefined ? config.showToolbar : true\"\n [fonts]=\"getFonts()\"\n [customClasses]=\"config.customClasses\"\n [defaultFontName]=\"config.defaultFontName\"\n [defaultFontSize]=\"config.defaultFontSize\"\n [hiddenButtons]=\"config.toolbarHiddenButtons\"\n (execute)=\"executeCommand($event)\"\n >\n <ng-container\n [ngTemplateOutlet]=\"customButtonsTemplateRef\"\n [ngTemplateOutletContext]=\"{ executeCommandFn: this.executeCommandFn}\"\n >\n </ng-container>\n </angular-editor-toolbar>\n\n <div\n class=\"angular-editor-wrapper\"\n #editorWrapper\n >\n <div\n #editor\n class=\"angular-editor-textarea\"\n [attr.contenteditable]=\"config.editable\"\n [attr.tabindex]=\"disabled ? -1 : tabIndex\"\n [attr.translate]=\"config.translate\"\n [attr.spellcheck]=\"config.spellcheck\"\n [style.height]=\"config.height\"\n [style.minHeight]=\"config.minHeight\"\n [style.maxHeight]=\"config.maxHeight\"\n [style.outline]=\"config.outline === false ? 'none': undefined\"\n (input)=\"onContentChange($any($event.target))\"\n (focus)=\"onTextAreaFocus($event)\"\n (blur)=\"onTextAreaBlur($event)\"\n (click)=\"exec()\"\n (keyup)=\"exec()\"\n (mouseout)=\"onTextAreaMouseOut($event)\"\n (paste)=\"onPaste($event)\"\n >\n </div>\n <span class=\"angular-editor-placeholder\">{{ placeholder || config['placeholder'] }}</span>\n </div>\n</div>\n", styles: ["a{cursor:pointer}.angular-editor{display:flex;flex-direction:column;gap:var(--ae-gap, 5px)}.angular-editor.bottom{flex-direction:column-reverse}.angular-editor ::ng-deep [contenteditable=true]:empty:before{content:attr(placeholder);color:#868e96;opacity:1}.angular-editor .angular-editor-wrapper{position:relative}.angular-editor .angular-editor-wrapper .angular-editor-textarea{min-height:150px;overflow:auto;resize:vertical}.angular-editor .angular-editor-wrapper .angular-editor-textarea:after{content:\"\";position:absolute;bottom:0;right:0;display:block;width:8px;height:8px;cursor:nwse-resize;background-color:#ffffff80}.angular-editor .angular-editor-wrapper .angular-editor-textarea{min-height:5rem;padding:.5rem .8rem 1rem;border-radius:var(--ae-text-area-border-radius, .3rem);border:var(--ae-text-area-border, 1px solid #ddd);background-color:transparent;overflow-x:hidden;overflow-y:auto;position:relative}.angular-editor .angular-editor-wrapper .angular-editor-textarea:focus,.angular-editor .angular-editor-wrapper .angular-editor-textarea.focus{outline:var(--ae-focus-outline-color, -webkit-focus-ring-color auto 1px)}.angular-editor .angular-editor-wrapper .angular-editor-textarea ::ng-deep blockquote{margin-left:1rem;border-left:.2em solid #dfe2e5;padding-left:.5rem}.angular-editor .angular-editor-wrapper ::ng-deep p{margin-bottom:0}.angular-editor .angular-editor-wrapper .angular-editor-placeholder{display:none;position:absolute;top:0;padding:.6rem .8rem 1rem .9rem;color:#6c757d;opacity:.75}.angular-editor .angular-editor-wrapper.show-placeholder .angular-editor-placeholder{display:block}.angular-editor .angular-editor-wrapper.disabled{cursor:not-allowed;opacity:.5;pointer-events:none}\n"] }]
1485
+ ], standalone: false, template: "<div\n class=\"angular-editor\"\n #angularEditor\n [style.width]=\"config.width\"\n [style.minWidth]=\"config.minWidth\"\n [ngClass]=\"{\n 'bottom': config.toolbarPosition === 'bottom'\n }\"\n>\n <angular-editor-toolbar\n #editorToolbar\n [id]=\"id\"\n [uploadUrl]=\"config.uploadUrl\"\n [upload]=\"config.upload\"\n [showToolbar]=\"config.showToolbar !== undefined ? config.showToolbar : true\"\n [fonts]=\"getFonts()\"\n [customClasses]=\"config.customClasses\"\n [defaultFontName]=\"config.defaultFontName\"\n [defaultFontSize]=\"config.defaultFontSize\"\n [hiddenButtons]=\"config.toolbarHiddenButtons\"\n (execute)=\"executeCommand($event)\"\n >\n <ng-container\n [ngTemplateOutlet]=\"customButtonsTemplateRef\"\n [ngTemplateOutletContext]=\"{ executeCommandFn: this.executeCommandFn}\"\n >\n </ng-container>\n </angular-editor-toolbar>\n\n <div\n class=\"angular-editor-wrapper\"\n #editorWrapper\n >\n <div\n #editor\n class=\"angular-editor-textarea\"\n [attr.contenteditable]=\"config.editable\"\n [attr.tabindex]=\"disabled ? -1 : tabIndex\"\n [attr.translate]=\"config.translate\"\n [attr.spellcheck]=\"config.spellcheck\"\n [attr.dir]=\"config.textDirection\"\n [style.height]=\"config.height\"\n [style.minHeight]=\"config.minHeight\"\n [style.maxHeight]=\"config.maxHeight\"\n [style.outline]=\"config.outline === false ? 'none': undefined\"\n (input)=\"onContentChange($any($event.target))\"\n (focus)=\"onTextAreaFocus($event)\"\n (blur)=\"onTextAreaBlur($event)\"\n (click)=\"exec()\"\n (keyup)=\"exec()\"\n (mouseout)=\"onTextAreaMouseOut($event)\"\n (paste)=\"onPaste($event)\"\n >\n </div>\n <span class=\"angular-editor-placeholder\">{{ placeholder || config['placeholder'] }}</span>\n </div>\n</div>\n", styles: ["a{cursor:pointer}.angular-editor{display:flex;flex-direction:column;gap:var(--ae-gap, 5px)}.angular-editor.bottom{flex-direction:column-reverse}.angular-editor ::ng-deep [contenteditable=true]:empty:before{content:attr(placeholder);color:#868e96;opacity:1}.angular-editor .angular-editor-wrapper{position:relative}.angular-editor .angular-editor-wrapper .angular-editor-textarea{min-height:150px;overflow:auto;resize:vertical}.angular-editor .angular-editor-wrapper .angular-editor-textarea:after{content:\"\";position:absolute;bottom:0;right:0;display:block;width:8px;height:8px;cursor:nwse-resize;background-color:#ffffff80}.angular-editor .angular-editor-wrapper .angular-editor-textarea{min-height:5rem;padding:.5rem .8rem 1rem;border-radius:var(--ae-text-area-border-radius, .3rem);border:var(--ae-text-area-border, 1px solid #ddd);background-color:transparent;overflow-x:hidden;overflow-y:auto;position:relative}.angular-editor .angular-editor-wrapper .angular-editor-textarea:focus,.angular-editor .angular-editor-wrapper .angular-editor-textarea.focus{outline:var(--ae-focus-outline-color, -webkit-focus-ring-color auto 1px)}.angular-editor .angular-editor-wrapper .angular-editor-textarea ::ng-deep blockquote{margin-left:1rem;border-left:.2em solid #dfe2e5;padding-left:.5rem}.angular-editor .angular-editor-wrapper ::ng-deep p{margin-bottom:0}.angular-editor .angular-editor-wrapper .angular-editor-placeholder{display:none;position:absolute;top:0;padding:.6rem .8rem 1rem .9rem;color:#6c757d;opacity:.75}.angular-editor .angular-editor-wrapper.show-placeholder .angular-editor-placeholder{display:block}.angular-editor .angular-editor-wrapper.disabled{cursor:not-allowed;opacity:.5;pointer-events:none}\n"] }]
1302
1486
  }], ctorParameters: () => [{ type: i0.Renderer2 }, { type: AngularEditorService }, { type: undefined, decorators: [{
1303
1487
  type: Inject,
1304
1488
  args: [DOCUMENT]
@@ -1 +1 @@
1
- {"version":3,"file":"kolkov-angular-editor.mjs","sources":["../../../projects/angular-editor/src/lib/angular-editor.service.ts","../../../projects/angular-editor/src/lib/config.ts","../../../projects/angular-editor/src/lib/utils.ts","../../../projects/angular-editor/src/lib/ae-select/ae-select.component.ts","../../../projects/angular-editor/src/lib/ae-select/ae-select.component.html","../../../projects/angular-editor/src/lib/ae-button/ae-button.component.ts","../../../projects/angular-editor/src/lib/ae-button/ae-button.component.html","../../../projects/angular-editor/src/lib/ae-toolbar-set/ae-toolbar-set.component.ts","../../../projects/angular-editor/src/lib/ae-toolbar-set/ae-toolbar-set.component.html","../../../projects/angular-editor/src/lib/ae-toolbar/ae-toolbar.component.ts","../../../projects/angular-editor/src/lib/ae-toolbar/ae-toolbar.component.html","../../../projects/angular-editor/src/lib/editor/angular-editor.component.ts","../../../projects/angular-editor/src/lib/editor/angular-editor.component.html","../../../projects/angular-editor/src/lib/angular-editor.module.ts","../../../projects/angular-editor/src/public-api.ts","../../../projects/angular-editor/src/kolkov-angular-editor.ts"],"sourcesContent":["import {Inject, Injectable, DOCUMENT} from '@angular/core';\nimport {HttpClient, HttpEvent} from '@angular/common/http';\nimport {Observable} from 'rxjs';\n\nimport {CustomClass} from './config';\n\nexport interface UploadResponse {\n imageUrl: string;\n}\n\n@Injectable()\nexport class AngularEditorService {\n\n savedSelection: Range | null;\n selectedText: string;\n uploadUrl: string;\n uploadWithCredentials: boolean;\n\n constructor(\n private http: HttpClient,\n @Inject(DOCUMENT) private doc: any\n ) { }\n\n /**\n * Executed command from editor header buttons exclude toggleEditorMode\n * @param command string from triggerCommand\n * @param value\n */\n executeCommand(command: string, value?: string) {\n const commands = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'p', 'pre'];\n if (commands.includes(command)) {\n this.doc.execCommand('formatBlock', false, command);\n return;\n }\n this.doc.execCommand(command, false, value);\n }\n\n /**\n * Create URL link\n * @param url string from UI prompt\n */\n createLink(url: string) {\n if (!url.includes('http')) {\n this.doc.execCommand('createlink', false, url);\n } else {\n const newUrl = '<a href=\"' + url + '\" target=\"_blank\">' + this.selectedText + '</a>';\n this.insertHtml(newUrl);\n }\n }\n\n /**\n * insert color either font or background\n *\n * @param color color to be inserted\n * @param where where the color has to be inserted either text/background\n */\n insertColor(color: string, where: string): void {\n const restored = this.restoreSelection();\n if (restored) {\n if (where === 'textColor') {\n this.doc.execCommand('foreColor', false, color);\n } else {\n this.doc.execCommand('hiliteColor', false, color);\n }\n }\n }\n\n /**\n * Set font name\n * @param fontName string\n */\n setFontName(fontName: string) {\n this.doc.execCommand('fontName', false, fontName);\n }\n\n /**\n * Set font size\n * @param fontSize string\n */\n setFontSize(fontSize: string) {\n this.doc.execCommand('fontSize', false, fontSize);\n }\n\n /**\n * Create raw HTML\n * @param html HTML string\n */\n insertHtml(html: string): void {\n\n const isHTMLInserted = this.doc.execCommand('insertHTML', false, html);\n\n if (!isHTMLInserted) {\n throw new Error('Unable to perform the operation');\n }\n }\n\n /**\n * save selection when the editor is focussed out\n */\n public saveSelection = (): void => {\n if (this.doc.getSelection) {\n const sel = this.doc.getSelection();\n if (sel.getRangeAt && sel.rangeCount) {\n this.savedSelection = sel.getRangeAt(0);\n this.selectedText = sel.toString();\n }\n } else if (this.doc.getSelection && this.doc.createRange) {\n this.savedSelection = document.createRange();\n } else {\n this.savedSelection = null;\n }\n }\n\n /**\n * restore selection when the editor is focused in\n *\n * saved selection when the editor is focused out\n */\n restoreSelection(): boolean {\n if (this.savedSelection) {\n if (this.doc.getSelection) {\n const sel = this.doc.getSelection();\n sel.removeAllRanges();\n sel.addRange(this.savedSelection);\n return true;\n } else if (this.doc.getSelection /*&& this.savedSelection.select*/) {\n // this.savedSelection.select();\n return true;\n }\n } else {\n return false;\n }\n }\n\n /**\n * setTimeout used for execute 'saveSelection' method in next event loop iteration\n */\n public executeInNextQueueIteration(callbackFn: (...args: any[]) => any, timeout = 1e2): void {\n setTimeout(callbackFn, timeout);\n }\n\n /** check any selection is made or not */\n private checkSelection(): any {\n\n const selectedText = this.savedSelection.toString();\n\n if (selectedText.length === 0) {\n throw new Error('No Selection Made');\n }\n return true;\n }\n\n /**\n * Upload file to uploadUrl\n * @param file The file\n */\n uploadImage(file: File): Observable<HttpEvent<UploadResponse>> {\n\n const uploadData: FormData = new FormData();\n\n uploadData.append('file', file, file.name);\n\n return this.http.post<UploadResponse>(this.uploadUrl, uploadData, {\n reportProgress: true,\n observe: 'events',\n withCredentials: this.uploadWithCredentials,\n });\n }\n\n /**\n * Insert image with Url\n * @param imageUrl The imageUrl.\n */\n insertImage(imageUrl: string) {\n this.doc.execCommand('insertImage', false, imageUrl);\n }\n\n setDefaultParagraphSeparator(separator: string) {\n this.doc.execCommand('defaultParagraphSeparator', false, separator);\n }\n\n createCustomClass(customClass: CustomClass) {\n let newTag = this.selectedText;\n if (customClass) {\n const tagName = customClass.tag ? customClass.tag : 'span';\n newTag = '<' + tagName + ' class=\"' + customClass.class + '\">' + this.selectedText + '</' + tagName + '>';\n }\n this.insertHtml(newTag);\n }\n\n insertVideo(videoUrl: string) {\n if (videoUrl.match('www.youtube.com') || videoUrl.match('youtu.be')) {\n this.insertYouTubeVideoTag(videoUrl);\n }\n if (videoUrl.match('vimeo.com')) {\n this.insertVimeoVideoTag(videoUrl);\n }\n }\n\n private insertYouTubeVideoTag(videoUrl: string): void {\n // Support both formats: youtube.com/watch?v=ID and youtu.be/ID\n let id: string;\n if (videoUrl.includes('youtu.be/')) {\n id = videoUrl.split('youtu.be/')[1].split('?')[0];\n } else {\n id = videoUrl.split('v=')[1].split('&')[0];\n }\n const imageUrl = `https://img.youtube.com/vi/${id}/0.jpg`;\n const thumbnail = `\n <div style='position: relative'>\n <a href='${videoUrl}' target='_blank'>\n <img src=\"${imageUrl}\" alt=\"click to watch\"/>\n <img style='position: absolute; left:200px; top:140px'\n src=\"https://img.icons8.com/color/96/000000/youtube-play.png\"/>\n </a>\n </div>`;\n this.insertHtml(thumbnail);\n }\n\n private insertVimeoVideoTag(videoUrl: string): void {\n const sub = this.http.get<any>(`https://vimeo.com/api/oembed.json?url=${videoUrl}`).subscribe(data => {\n const imageUrl = data.thumbnail_url_with_play_button;\n const thumbnail = `<div>\n <a href='${videoUrl}' target='_blank'>\n <img src=\"${imageUrl}\" alt=\"${data.title}\"/>\n </a>\n </div>`;\n this.insertHtml(thumbnail);\n sub.unsubscribe();\n });\n }\n\n nextNode(node) {\n if (node.hasChildNodes()) {\n return node.firstChild;\n } else {\n while (node && !node.nextSibling) {\n node = node.parentNode;\n }\n if (!node) {\n return null;\n }\n return node.nextSibling;\n }\n }\n\n getRangeSelectedNodes(range, includePartiallySelectedContainers) {\n let node = range.startContainer;\n const endNode = range.endContainer;\n let rangeNodes = [];\n\n // Special case for a range that is contained within a single node\n if (node === endNode) {\n rangeNodes = [node];\n } else {\n // Iterate nodes until we hit the end container\n while (node && node !== endNode) {\n rangeNodes.push( node = this.nextNode(node) );\n }\n\n // Add partially selected nodes at the start of the range\n node = range.startContainer;\n while (node && node !== range.commonAncestorContainer) {\n rangeNodes.unshift(node);\n node = node.parentNode;\n }\n }\n\n // Add ancestors of the range container, if required\n if (includePartiallySelectedContainers) {\n node = range.commonAncestorContainer;\n while (node) {\n rangeNodes.push(node);\n node = node.parentNode;\n }\n }\n\n return rangeNodes;\n }\n\n getSelectedNodes() {\n const nodes = [];\n if (this.doc.getSelection) {\n const sel = this.doc.getSelection();\n for (let i = 0, len = sel.rangeCount; i < len; ++i) {\n nodes.push.apply(nodes, this.getRangeSelectedNodes(sel.getRangeAt(i), true));\n }\n }\n return nodes;\n }\n\n replaceWithOwnChildren(el) {\n const parent = el.parentNode;\n while (el.hasChildNodes()) {\n parent.insertBefore(el.firstChild, el);\n }\n parent.removeChild(el);\n }\n\n removeSelectedElements(tagNames) {\n const tagNamesArray = tagNames.toLowerCase().split(',');\n this.getSelectedNodes().forEach((node) => {\n if (node.nodeType === 1 &&\n tagNamesArray.indexOf(node.tagName.toLowerCase()) > -1) {\n // Remove the node and replace it with its children\n this.replaceWithOwnChildren(node);\n }\n });\n }\n}\n","import { UploadResponse } from './angular-editor.service';\nimport { HttpEvent } from '@angular/common/http';\nimport { Observable } from 'rxjs';\n\nexport interface CustomClass {\n name: string;\n class: string;\n tag?: string;\n}\n\nexport interface Font {\n name: string;\n class: string;\n}\n\nexport interface AngularEditorConfig {\n editable?: boolean;\n spellcheck?: boolean;\n height?: 'auto' | string;\n minHeight?: '0' | string;\n maxHeight?: 'auto' | string;\n width?: 'auto' | string;\n minWidth?: '0' | string;\n translate?: 'yes' | 'now' | string;\n enableToolbar?: boolean;\n showToolbar?: boolean;\n placeholder?: string;\n defaultParagraphSeparator?: string;\n defaultFontName?: string;\n defaultFontSize?: '1' | '2' | '3' | '4' | '5' | '6' | '7' | string;\n uploadUrl?: string;\n upload?: (file: File) => Observable<HttpEvent<UploadResponse>>;\n uploadWithCredentials?: boolean;\n fonts?: Font[];\n customClasses?: CustomClass[];\n sanitize?: boolean;\n toolbarPosition?: 'top' | 'bottom';\n outline?: boolean;\n toolbarHiddenButtons?: string[][];\n rawPaste?: boolean;\n}\n\nexport const angularEditorConfig: AngularEditorConfig = {\n editable: true,\n spellcheck: true,\n height: 'auto',\n minHeight: '0',\n maxHeight: 'auto',\n width: 'auto',\n minWidth: '0',\n translate: 'yes',\n enableToolbar: true,\n showToolbar: true,\n placeholder: 'Enter text here...',\n defaultParagraphSeparator: '',\n defaultFontName: '',\n defaultFontSize: '',\n fonts: [\n {class: 'arial', name: 'Arial'},\n {class: 'times-new-roman', name: 'Times New Roman'},\n {class: 'calibri', name: 'Calibri'},\n {class: 'comic-sans-ms', name: 'Comic Sans MS'}\n ],\n uploadUrl: 'v1/image',\n uploadWithCredentials: false,\n sanitize: true,\n toolbarPosition: 'top',\n outline: true,\n /*toolbarHiddenButtons: [\n ['bold', 'italic', 'underline', 'strikeThrough', 'superscript', 'subscript'],\n ['heading', 'fontName', 'fontSize', 'color'],\n ['justifyLeft', 'justifyCenter', 'justifyRight', 'justifyFull', 'indent', 'outdent'],\n ['cut', 'copy', 'delete', 'removeFormat', 'undo', 'redo'],\n ['paragraph', 'blockquote', 'removeBlockquote', 'horizontalLine', 'orderedList', 'unorderedList'],\n ['link', 'unlink', 'image', 'video']\n ]*/\n};\n","export function isDefined(value: any) {\n return value !== undefined && value !== null;\n}\n","import {\n Component,\n ElementRef,\n EventEmitter,\n forwardRef,\n HostBinding,\n HostListener,\n Input,\n OnInit,\n Output,\n Renderer2,\n ViewChild,\n ViewEncapsulation\n} from '@angular/core';\nimport {ControlValueAccessor, NG_VALUE_ACCESSOR} from '@angular/forms';\nimport {isDefined} from '../utils';\n\nexport interface SelectOption {\n label: string;\n value: string;\n}\n\n@Component({\n selector: 'ae-select',\n templateUrl: './ae-select.component.html',\n styleUrls: ['./ae-select.component.scss'],\n //encapsulation: ViewEncapsulation.None,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => AeSelectComponent),\n multi: true,\n }\n ],\n standalone: false\n})\nexport class AeSelectComponent implements OnInit, ControlValueAccessor {\n @Input() options: SelectOption[] = [];\n // eslint-disable-next-line @angular-eslint/no-input-rename\n @Input('hidden') isHidden: boolean;\n\n selectedOption: SelectOption;\n disabled = false;\n optionId = 0;\n\n get label(): string {\n return this.selectedOption && this.selectedOption.hasOwnProperty('label') ? this.selectedOption.label : 'Select';\n }\n\n opened = false;\n\n get value(): string {\n return this.selectedOption.value;\n }\n\n @HostBinding('style.display') hidden = 'inline-block';\n\n // eslint-disable-next-line @angular-eslint/no-output-native, @angular-eslint/no-output-rename\n @Output('change') changeEvent = new EventEmitter();\n\n @ViewChild('labelButton', {static: true}) labelButton: ElementRef;\n\n constructor(private elRef: ElementRef,\n private r: Renderer2,\n ) {\n }\n\n ngOnInit() {\n this.selectedOption = this.options[0];\n if (isDefined(this.isHidden) && this.isHidden) {\n this.hide();\n }\n }\n\n hide() {\n this.hidden = 'none';\n }\n\n optionSelect(option: SelectOption, event: MouseEvent) {\n //console.log(event.button, event.buttons);\n if (event.buttons !== 1) {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n this.setValue(option.value);\n this.onChange(this.selectedOption.value);\n this.changeEvent.emit(this.selectedOption.value);\n this.onTouched();\n this.opened = false;\n }\n\n toggleOpen(event: MouseEvent) {\n // event.stopPropagation();\n if (this.disabled) {\n return;\n }\n this.opened = !this.opened;\n }\n\n @HostListener('document:click', ['$event'])\n onClick($event: MouseEvent) {\n if (!this.elRef.nativeElement.contains($event.target)) {\n this.close();\n }\n }\n\n close() {\n this.opened = false;\n }\n\n get isOpen(): boolean {\n return this.opened;\n }\n\n writeValue(value) {\n if (!value || typeof value !== 'string') {\n return;\n }\n this.setValue(value);\n }\n\n setValue(value) {\n let index = 0;\n const selectedEl = this.options.find((el, i) => {\n index = i;\n return el.value === value;\n });\n if (selectedEl) {\n this.selectedOption = selectedEl;\n this.optionId = index;\n }\n }\n\n onChange: any = () => {\n }\n onTouched: any = () => {\n }\n\n registerOnChange(fn) {\n this.onChange = fn;\n }\n\n registerOnTouched(fn) {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.labelButton.nativeElement.disabled = isDisabled;\n const div = this.labelButton.nativeElement;\n const action = isDisabled ? 'addClass' : 'removeClass';\n this.r[action](div, 'disabled');\n this.disabled = isDisabled;\n }\n\n @HostListener('keydown', ['$event'])\n handleKeyDown($event: KeyboardEvent) {\n if (!this.opened) {\n return;\n }\n // console.log($event.key);\n // if (KeyCode[$event.key]) {\n switch ($event.key) {\n case 'ArrowDown':\n this._handleArrowDown($event);\n break;\n case 'ArrowUp':\n this._handleArrowUp($event);\n break;\n case 'Space':\n this._handleSpace($event);\n break;\n case 'Enter':\n this._handleEnter($event);\n break;\n case 'Tab':\n this._handleTab($event);\n break;\n case 'Escape':\n this.close();\n $event.preventDefault();\n break;\n case 'Backspace':\n this._handleBackspace();\n break;\n }\n // } else if ($event.key && $event.key.length === 1) {\n // this._keyPress$.next($event.key.toLocaleLowerCase());\n // }\n }\n\n _handleArrowDown($event) {\n if (this.optionId < this.options.length - 1) {\n this.optionId++;\n }\n }\n\n _handleArrowUp($event) {\n if (this.optionId >= 1) {\n this.optionId--;\n }\n }\n\n _handleSpace($event) {\n\n }\n\n _handleEnter($event) {\n this.optionSelect(this.options[this.optionId], $event);\n }\n\n _handleTab($event) {\n\n }\n\n _handleBackspace() {\n\n }\n}\n","<span class=\"ae-picker\" [ngClass]=\"{'ae-expanded':isOpen}\">\n <button [tabIndex]=\"-1\" #labelButton tabindex=\"-1\" type=\"button\" role=\"button\" class=\"ae-picker-label\" (click)=\"toggleOpen($event);\">{{label}}\n <svg>\n <use [attr.href]=\"'assets/ae-icons/icons.svg#sort'\" [attr.xlink:href]=\"'assets/ae-icons/icons.svg#sort'\"></use>\n </svg>\n </button>\n <span class=\"ae-picker-options\">\n <span tabindex=\"-1\" type=\"button\" role=\"button\" class=\"ae-picker-item\"\n *ngFor=\"let item of options; let i = index\"\n [ngClass]=\"{'selected': item.value === value, 'focused': i === optionId}\"\n (mousedown)=\"optionSelect(item, $event)\">\n {{item.label}}\n </span>\n <span class=\"dropdown-item\" *ngIf=\"!options.length\">No items for select</span>\n </span>\n</span>\n","import {Component, Input, ViewEncapsulation} from '@angular/core';\n\n@Component({\n selector: 'ae-button, button[aeButton]',\n templateUrl: './ae-button.component.html',\n styleUrls: ['./ae-button.component.scss'],\n //encapsulation: ViewEncapsulation.None,\n host: {\n 'class': 'angular-editor-button',\n '[tabIndex]': '-1',\n '[type]': '\"button\"',\n },\n standalone: false\n})\nexport class AeButtonComponent {\n\n @Input() iconName = '';\n\n constructor() {\n }\n\n}\n","<ng-container *ngIf=\"iconName; else contentTemplate\">\n <svg>\n <use [attr.href]=\"'assets/ae-icons/icons.svg#' + iconName\" [attr.xlink:href]=\"'assets/ae-icons/icons.svg#' + iconName\"></use>\n </svg>\n</ng-container>\n<ng-template #contentTemplate>\n <ng-content></ng-content>\n</ng-template>\n","import {Component, ViewEncapsulation} from '@angular/core';\n\n@Component({\n selector: 'ae-toolbar-set, [aeToolbarSet]',\n templateUrl: './ae-toolbar-set.component.html',\n styleUrls: ['./ae-toolbar-set.component.scss'],\n //encapsulation: ViewEncapsulation.None,\n host: {\n 'class': 'angular-editor-toolbar-set'\n },\n standalone: false\n})\nexport class AeToolbarSetComponent {\n\n constructor() {\n }\n\n}\n","<ng-content></ng-content>\n","import {\n Component,\n ElementRef,\n EventEmitter,\n Inject,\n Input,\n Output,\n Renderer2,\n ViewChild,\n ViewEncapsulation,\n DOCUMENT\n} from '@angular/core';\nimport {AngularEditorService, UploadResponse} from '../angular-editor.service';\nimport {HttpEvent, HttpResponse} from '@angular/common/http';\n\nimport {CustomClass} from '../config';\nimport {SelectOption} from '../ae-select/ae-select.component';\nimport {Observable} from 'rxjs';\n\n@Component({\n selector: 'angular-editor-toolbar, ae-toolbar, div[aeToolbar]',\n templateUrl: './ae-toolbar.component.html',\n styleUrls: ['./ae-toolbar.component.scss'],\n standalone: false\n})\n\nexport class AeToolbarComponent {\n htmlMode = false;\n linkSelected = false;\n block = 'default';\n fontName = 'Times New Roman';\n fontSize = '3';\n foreColour;\n backColor;\n\n headings: SelectOption[] = [\n {\n label: 'Heading 1',\n value: 'h1',\n },\n {\n label: 'Heading 2',\n value: 'h2',\n },\n {\n label: 'Heading 3',\n value: 'h3',\n },\n {\n label: 'Heading 4',\n value: 'h4',\n },\n {\n label: 'Heading 5',\n value: 'h5',\n },\n {\n label: 'Heading 6',\n value: 'h6',\n },\n {\n label: 'Paragraph',\n value: 'p',\n },\n {\n label: 'Predefined',\n value: 'pre'\n },\n {\n label: 'Standard',\n value: 'div'\n },\n {\n label: 'default',\n value: 'default'\n }\n ];\n\n fontSizes: SelectOption[] = [\n {\n label: '1',\n value: '1',\n },\n {\n label: '2',\n value: '2',\n },\n {\n label: '3',\n value: '3',\n },\n {\n label: '4',\n value: '4',\n },\n {\n label: '5',\n value: '5',\n },\n {\n label: '6',\n value: '6',\n },\n {\n label: '7',\n value: '7',\n }\n ];\n\n customClassId = '-1';\n // eslint-disable-next-line no-underscore-dangle, id-blacklist, id-match\n _customClasses: CustomClass[];\n customClassList: SelectOption[] = [{label: '', value: ''}];\n // uploadUrl: string;\n\n tagMap = {\n BLOCKQUOTE: 'indent',\n A: 'link'\n };\n\n select = ['H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'P', 'PRE', 'DIV'];\n\n buttons = ['bold', 'italic', 'underline', 'strikeThrough', 'subscript', 'superscript', 'justifyLeft', 'justifyCenter',\n 'justifyRight', 'justifyFull', 'indent', 'outdent', 'insertUnorderedList', 'insertOrderedList', 'link'];\n\n @Input() id: string;\n @Input() uploadUrl: string;\n @Input() upload: (file: File) => Observable<HttpEvent<UploadResponse>>;\n @Input() showToolbar: boolean;\n @Input() fonts: SelectOption[] = [{label: '', value: ''}];\n\n @Input()\n set customClasses(classes: CustomClass[]) {\n if (classes) {\n this._customClasses = classes;\n this.customClassList = this._customClasses.map((x, i) => ({label: x.name, value: i.toString()}));\n this.customClassList.unshift({label: 'Clear Class', value: '-1'});\n }\n }\n\n @Input()\n set defaultFontName(value: string) {\n if (value) {\n this.fontName = value;\n }\n }\n\n @Input()\n set defaultFontSize(value: string) {\n if (value) {\n this.fontSize = value;\n }\n }\n\n @Input() hiddenButtons: string[][];\n\n @Output() execute: EventEmitter<string> = new EventEmitter<string>();\n\n @ViewChild('fileInput', {static: true}) myInputFile: ElementRef;\n\n public get isLinkButtonDisabled(): boolean {\n return this.htmlMode || !Boolean(this.editorService.selectedText);\n }\n\n constructor(\n private r: Renderer2,\n private editorService: AngularEditorService,\n private er: ElementRef,\n @Inject(DOCUMENT) private doc: any\n ) {\n }\n\n /**\n * Trigger command from editor header buttons\n * @param command string from toolbar buttons\n */\n triggerCommand(command: string) {\n this.execute.emit(command);\n }\n\n /**\n * highlight editor buttons when cursor moved or positioning\n */\n triggerButtons() {\n if (!this.showToolbar) {\n return;\n }\n this.buttons.forEach(e => {\n const result = this.doc.queryCommandState(e);\n const elementById = this.doc.getElementById(e + '-' + this.id);\n if (result) {\n this.r.addClass(elementById, 'active');\n } else {\n this.r.removeClass(elementById, 'active');\n }\n });\n }\n\n /**\n * trigger highlight editor buttons when cursor moved or positioning in block\n */\n triggerBlocks(nodes: Node[]) {\n if (!this.showToolbar) {\n return;\n }\n this.linkSelected = nodes.findIndex(x => x.nodeName === 'A') > -1;\n let found = false;\n this.select.forEach(y => {\n const node = nodes.find(x => x.nodeName === y);\n if (node !== undefined && y === node.nodeName) {\n if (found === false) {\n this.block = node.nodeName.toLowerCase();\n found = true;\n }\n } else if (found === false) {\n this.block = 'default';\n }\n });\n\n found = false;\n if (this._customClasses) {\n this._customClasses.forEach((y, index) => {\n const node = nodes.find(x => {\n if (x instanceof Element) {\n return x.className === y.class;\n }\n });\n if (node !== undefined) {\n if (found === false) {\n this.customClassId = index.toString();\n found = true;\n }\n } else if (found === false) {\n this.customClassId = '-1';\n }\n });\n }\n\n Object.keys(this.tagMap).map(e => {\n const elementById = this.doc.getElementById(this.tagMap[e] + '-' + this.id);\n const node = nodes.find(x => x.nodeName === e);\n if (node !== undefined && e === node.nodeName) {\n this.r.addClass(elementById, 'active');\n } else {\n this.r.removeClass(elementById, 'active');\n }\n });\n\n this.foreColour = this.doc.queryCommandValue('ForeColor');\n this.fontSize = this.doc.queryCommandValue('FontSize');\n this.fontName = this.doc.queryCommandValue('FontName').replace(/\"/g, '');\n this.backColor = this.doc.queryCommandValue('backColor');\n }\n\n /**\n * insert URL link\n */\n insertUrl() {\n let url = 'https:\\/\\/';\n const selection = this.editorService.savedSelection;\n if (selection && selection.commonAncestorContainer.parentElement.nodeName === 'A') {\n const parent = selection.commonAncestorContainer.parentElement as HTMLAnchorElement;\n // Use getAttribute to preserve relative URLs instead of href which returns absolute URL\n const href = parent.getAttribute('href');\n if (href !== '' && href !== null) {\n url = href;\n }\n }\n url = prompt('Insert URL link', url);\n if (url && url !== '' && url !== 'https://') {\n this.editorService.createLink(url);\n }\n }\n\n /**\n * insert Video link\n */\n insertVideo() {\n this.execute.emit('');\n const url = prompt('Insert Video link', `https://`);\n if (url && url !== '' && url !== `https://`) {\n this.editorService.insertVideo(url);\n }\n }\n\n /** insert color */\n insertColor(color: string, where: string) {\n this.editorService.insertColor(color, where);\n this.execute.emit('');\n }\n\n /**\n * set font Name/family\n * @param foreColor string\n */\n setFontName(foreColor: string): void {\n this.editorService.setFontName(foreColor);\n this.execute.emit('');\n }\n\n /**\n * set font Size\n * @param fontSize string\n */\n setFontSize(fontSize: string): void {\n this.editorService.setFontSize(fontSize);\n this.execute.emit('');\n }\n\n /**\n * toggle editor mode (WYSIWYG or SOURCE)\n * @param m boolean\n */\n setEditorMode(m: boolean) {\n const toggleEditorModeButton = this.doc.getElementById('toggleEditorMode' + '-' + this.id);\n if (m) {\n this.r.addClass(toggleEditorModeButton, 'active');\n } else {\n this.r.removeClass(toggleEditorModeButton, 'active');\n }\n this.htmlMode = m;\n }\n\n /**\n * Upload image when file is selected.\n */\n onFileChanged(event) {\n const file = event.target.files[0];\n if (file.type.includes('image/')) {\n if (this.upload) {\n this.upload(file).subscribe((response: HttpResponse<UploadResponse>) => this.watchUploadImage(response, event));\n } else if (this.uploadUrl) {\n this.editorService.uploadImage(file).subscribe((response: HttpResponse<UploadResponse>) => this.watchUploadImage(response, event));\n } else {\n const reader = new FileReader();\n reader.onload = (e: ProgressEvent) => {\n const fr = e.currentTarget as FileReader;\n this.editorService.insertImage(fr.result.toString());\n // Reset input value to allow re-uploading the same file\n event.target.value = null;\n };\n reader.readAsDataURL(file);\n }\n }\n }\n\n watchUploadImage(response: HttpResponse<{ imageUrl: string }>, event) {\n const {imageUrl} = response.body;\n this.editorService.insertImage(imageUrl);\n event.srcElement.value = null;\n }\n\n /**\n * Set custom class\n */\n setCustomClass(classId: string) {\n if (classId === '-1') {\n this.execute.emit('clear');\n } else {\n this.editorService.createCustomClass(this._customClasses[+classId]);\n }\n }\n\n isButtonHidden(name: string): boolean {\n if (!name) {\n return false;\n }\n if (!(this.hiddenButtons instanceof Array)) {\n return false;\n }\n let result: any;\n for (const arr of this.hiddenButtons) {\n if (arr instanceof Array) {\n result = arr.find(item => item === name);\n }\n if (result) {\n break;\n }\n }\n return result !== undefined;\n }\n\n focus() {\n this.execute.emit('focus');\n }\n}\n","<div class=\"angular-editor-toolbar\" *ngIf=\"showToolbar\">\n <div aeToolbarSet>\n <button aeButton title=\"Undo\" iconName=\"undo\" (click)=\"triggerCommand('undo')\" [hidden]=\"isButtonHidden('undo')\">\n </button>\n <button aeButton title=\"Redo\" iconName=\"redo\" (click)=\"triggerCommand('redo')\"\n [hidden]=\"isButtonHidden('redo')\">\n </button>\n </div>\n <div aeToolbarSet>\n <button [id]=\"'bold-'+id\" aeButton title=\"Bold\" iconName=\"bold\" (click)=\"triggerCommand('bold')\"\n [disabled]=\"htmlMode\" [hidden]=\"isButtonHidden('bold')\">\n </button>\n <button [id]=\"'italic-'+id\" aeButton iconName=\"italic\" title=\"Italic\" (click)=\"triggerCommand('italic')\"\n [disabled]=\"htmlMode\" [hidden]=\"isButtonHidden('italic')\">\n </button>\n <button [id]=\"'underline-'+id\" aeButton title=\"Underline\" iconName=\"underline\"\n (click)=\"triggerCommand('underline')\" [disabled]=\"htmlMode\" [hidden]=\"isButtonHidden('underline')\">\n </button>\n <button [id]=\"'strikeThrough-'+id\" aeButton iconName=\"strikeThrough\" title=\"Strikethrough\"\n (click)=\"triggerCommand('strikeThrough')\" [disabled]=\"htmlMode\"\n [hidden]=\"isButtonHidden('strikeThrough')\">\n </button>\n <button [id]=\"'subscript-'+id\" aeButton title=\"Subscript\" iconName=\"subscript\"\n (click)=\"triggerCommand('subscript')\" [disabled]=\"htmlMode\" [hidden]=\"isButtonHidden('subscript')\">\n </button>\n <button [id]=\"'superscript-'+id\" aeButton iconName=\"superscript\" title=\"Superscript\"\n (click)=\"triggerCommand('superscript')\" [disabled]=\"htmlMode\"\n [hidden]=\"isButtonHidden('superscript')\">\n </button>\n </div>\n <div aeToolbarSet>\n <button [id]=\"'justifyLeft-'+id\" aeButton iconName=\"justifyLeft\" title=\"Justify Left\"\n (click)=\"triggerCommand('justifyLeft')\" [disabled]=\"htmlMode\"\n [hidden]=\"isButtonHidden('justifyLeft')\">\n </button>\n <button [id]=\"'justifyCenter-'+id\" aeButton iconName=\"justifyCenter\" title=\"Justify Center\"\n (click)=\"triggerCommand('justifyCenter')\" [disabled]=\"htmlMode\"\n [hidden]=\"isButtonHidden('justifyCenter')\">\n </button>\n <button [id]=\"'justifyRight-'+id\" aeButton iconName=\"justifyRight\" title=\"Justify Right\"\n (click)=\"triggerCommand('justifyRight')\" [disabled]=\"htmlMode\"\n [hidden]=\"isButtonHidden('justifyRight')\">\n </button>\n <button [id]=\"'justifyFull-'+id\" aeButton iconName=\"justifyFull\" title=\"Justify Full\"\n (click)=\"triggerCommand('justifyFull')\" [disabled]=\"htmlMode\"\n [hidden]=\"isButtonHidden('justifyFull')\">\n </button>\n </div>\n <div aeToolbarSet>\n <button [id]=\"'indent-'+id\" aeButton iconName=\"indent\" title=\"Indent\"\n (click)=\"triggerCommand('indent')\"\n [disabled]=\"htmlMode\" [hidden]=\"isButtonHidden('indent')\">\n </button>\n <button [id]=\"'outdent-'+id\" aeButton iconName=\"outdent\" title=\"Outdent\"\n (click)=\"triggerCommand('outdent')\"\n [disabled]=\"htmlMode\" [hidden]=\"isButtonHidden('outdent')\">\n </button>\n </div>\n <div aeToolbarSet>\n <button [id]=\"'insertUnorderedList-'+id\" aeButton iconName=\"unorderedList\" title=\"Unordered List\"\n (click)=\"triggerCommand('insertUnorderedList')\" [disabled]=\"htmlMode\"\n [hidden]=\"isButtonHidden('insertUnorderedList')\">\n </button>\n <button [id]=\"'insertOrderedList-'+id\" aeButton iconName=\"orderedList\" title=\"Ordered List\"\n (click)=\"triggerCommand('insertOrderedList')\" [disabled]=\"htmlMode\"\n [hidden]=\"isButtonHidden('insertOrderedList')\">\n </button>\n </div>\n <div aeToolbarSet>\n <ae-select class=\"select-heading\" [options]=\"headings\"\n [(ngModel)]=\"block\"\n (change)=\"triggerCommand(block)\"\n [disabled]=\"htmlMode\"\n [hidden]=\"isButtonHidden('heading')\"\n tabindex=\"-1\"></ae-select>\n </div>\n <div aeToolbarSet>\n <ae-select class=\"select-font\" [options]=\"fonts\"\n [(ngModel)]=\"fontName\"\n (change)=\"setFontName(fontName)\"\n [disabled]=\"htmlMode\"\n [hidden]=\"isButtonHidden('fontName')\"\n tabindex=\"-1\"></ae-select>\n </div>\n <div aeToolbarSet>\n <ae-select class=\"select-font-size\" [options]=\"fontSizes\"\n [(ngModel)]=\"fontSize\"\n (change)=\"setFontSize(fontSize)\"\n [disabled]=\"htmlMode\"\n [hidden]=\"isButtonHidden('fontSize')\"\n tabindex=\"-1\">\n </ae-select>\n </div>\n <div aeToolbarSet>\n <input\n style=\"display: none\"\n type=\"color\" (change)=\"insertColor(fgInput.value, 'textColor')\"\n #fgInput>\n <button [id]=\"'foregroundColorPicker-'+id\" aeButton iconName=\"textColor\"\n (click)=\"focus(); ; fgInput.click()\"\n title=\"Text Color\"\n [disabled]=\"htmlMode\" [hidden]=\"isButtonHidden('textColor')\">\n </button>\n <input\n style=\"display: none\"\n type=\"color\" (change)=\"insertColor(bgInput.value, 'backgroundColor')\"\n #bgInput>\n <button [id]=\"'backgroundColorPicker-'+id\" aeButton iconName=\"backgroundColor\"\n (click)=\"focus(); ; bgInput.click()\"\n title=\"Background Color\"\n [disabled]=\"htmlMode\" [hidden]=\"isButtonHidden('backgroundColor')\">\n </button>\n </div>\n <div *ngIf=\"_customClasses\" aeToolbarSet>\n <ae-select class=\"select-custom-style\" [options]=\"customClassList\"\n [(ngModel)]=\"customClassId\"\n (change)=\"setCustomClass(customClassId)\"\n [disabled]=\"htmlMode\"\n [hidden]=\"isButtonHidden('customClasses')\"\n tabindex=\"-1\"></ae-select>\n </div>\n <div aeToolbarSet>\n <button [id]=\"'link-'+id\" aeButton iconName=\"link\" (click)=\"insertUrl()\"\n title=\"Insert Link\" [disabled]=\"isLinkButtonDisabled\" [hidden]=\"isButtonHidden('link')\">\n </button>\n <button [id]=\"'unlink-'+id\" aeButton iconName=\"unlink\" (click)=\"triggerCommand('unlink')\"\n title=\"Unlink\" [disabled]=\"htmlMode || !linkSelected\" [hidden]=\"isButtonHidden('unlink')\">\n </button>\n <input\n style=\"display: none\"\n accept=\"image/*\"\n type=\"file\" (change)=\"onFileChanged($event)\"\n #fileInput>\n <button [id]=\"'insertImage-'+id\" aeButton iconName=\"image\" (click)=\"focus(); fileInput.click()\"\n title=\"Insert Image\"\n [disabled]=\"htmlMode\" [hidden]=\"isButtonHidden('insertImage')\">\n </button>\n <button [id]=\"'insertVideo-'+id\" aeButton iconName=\"video\"\n (click)=\"insertVideo()\" title=\"Insert Video\" [disabled]=\"htmlMode\"\n [hidden]=\"isButtonHidden('insertVideo')\">\n </button>\n <button [id]=\"'insertHorizontalRule-'+id\" aeButton iconName=\"horizontalLine\" title=\"Horizontal Line\"\n (click)=\"triggerCommand('insertHorizontalRule')\" [disabled]=\"htmlMode\"\n [hidden]=\"isButtonHidden('insertHorizontalRule')\">\n </button>\n </div>\n <div aeToolbarSet>\n <button [id]=\"'clearFormatting-'+id\" aeButton iconName=\"removeFormat\" title=\"Clear Formatting\"\n class=\"angular-editor-button\"\n (click)=\"triggerCommand('removeFormat')\" [disabled]=\"htmlMode\" [hidden]=\"isButtonHidden('removeFormat')\">\n </button>\n </div>\n <div aeToolbarSet>\n <button [id]=\"'toggleEditorMode-'+id\" aeButton iconName=\"htmlCode\" title=\"HTML Code\"\n (click)=\"triggerCommand('toggleEditorMode')\" [hidden]=\"isButtonHidden('toggleEditorMode')\">\n </button>\n </div>\n <ng-content></ng-content>\n</div>\n","\nimport {\n AfterViewInit,\n Attribute,\n ChangeDetectorRef,\n Component,\n ContentChild,\n ElementRef,\n EventEmitter,\n forwardRef,\n HostBinding,\n HostListener,\n Inject,\n Input,\n OnDestroy,\n OnInit,\n Output,\n Renderer2,\n SecurityContext,\n TemplateRef,\n ViewChild, ViewEncapsulation,\n DOCUMENT\n} from '@angular/core';\nimport {ControlValueAccessor, NG_VALUE_ACCESSOR} from '@angular/forms';\nimport {DomSanitizer} from '@angular/platform-browser';\nimport {AeToolbarComponent} from '../ae-toolbar/ae-toolbar.component';\nimport {AngularEditorService} from '../angular-editor.service';\nimport {AngularEditorConfig, angularEditorConfig} from '../config';\nimport {isDefined} from '../utils';\n\n@Component({\n selector: 'angular-editor',\n templateUrl: './angular-editor.component.html',\n styleUrls: ['./angular-editor.component.scss'],\n encapsulation: ViewEncapsulation.None,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => AngularEditorComponent),\n multi: true\n },\n AngularEditorService\n ],\n standalone: false\n})\nexport class AngularEditorComponent implements OnInit, ControlValueAccessor, AfterViewInit, OnDestroy {\n\n private onChange: (value: string) => void;\n private onTouched: () => void;\n\n modeVisual = true;\n showPlaceholder = false;\n disabled = false;\n focused = false;\n touched = false;\n changed = false;\n\n focusInstance: any;\n blurInstance: any;\n\n @Input() id = '';\n @Input() config: AngularEditorConfig = angularEditorConfig;\n @Input() placeholder = '';\n @Input() tabIndex: number | null;\n\n @Output() html;\n\n @ViewChild('editor', {static: true}) textArea: ElementRef;\n @ViewChild('editorWrapper', {static: true}) editorWrapper: ElementRef;\n @ViewChild('editorToolbar') editorToolbar: AeToolbarComponent;\n @ContentChild(\"customButtons\") customButtonsTemplateRef?: TemplateRef<any>;\n executeCommandFn = this.executeCommand.bind(this);\n\n @Output() viewMode = new EventEmitter<boolean>();\n\n /** emits `blur` event when focused out from the textarea */\n // eslint-disable-next-line @angular-eslint/no-output-native, @angular-eslint/no-output-rename\n @Output('blur') blurEvent: EventEmitter<FocusEvent> = new EventEmitter<FocusEvent>();\n\n /** emits `focus` event when focused in to the textarea */\n // eslint-disable-next-line @angular-eslint/no-output-rename, @angular-eslint/no-output-native\n @Output('focus') focusEvent: EventEmitter<FocusEvent> = new EventEmitter<FocusEvent>();\n\n @HostBinding('attr.tabindex') tabindex = -1;\n\n @HostListener('focus')\n onFocus() {\n this.focus();\n }\n\n constructor(\n private r: Renderer2,\n private editorService: AngularEditorService,\n @Inject(DOCUMENT) private doc: any,\n private sanitizer: DomSanitizer,\n private cdRef: ChangeDetectorRef,\n @Attribute('tabindex') defaultTabIndex: string,\n @Attribute('autofocus') private autoFocus: any\n ) {\n const parsedTabIndex = Number(defaultTabIndex);\n this.tabIndex = (parsedTabIndex || parsedTabIndex === 0) ? parsedTabIndex : null;\n }\n\n ngOnInit() {\n this.config.toolbarPosition = this.config.toolbarPosition ? this.config.toolbarPosition : angularEditorConfig.toolbarPosition;\n }\n\n ngAfterViewInit() {\n if (isDefined(this.autoFocus)) {\n this.focus();\n }\n }\n\n onPaste(event: ClipboardEvent) {\n if (this.config.rawPaste) {\n event.preventDefault();\n const text = event.clipboardData.getData('text/plain');\n document.execCommand('insertHTML', false, text);\n return text;\n }\n }\n\n /**\n * Executed command from editor header buttons\n * @param command string from triggerCommand\n * @param value\n */\n executeCommand(command: string, value?: string) {\n this.focus();\n if (command === 'focus') {\n return;\n }\n if (command === 'toggleEditorMode') {\n this.toggleEditorMode(this.modeVisual);\n } else if (command !== '') {\n if (command === 'clear') {\n this.editorService.removeSelectedElements(this.getCustomTags());\n this.onContentChange(this.textArea.nativeElement);\n } else if (command === 'default') {\n this.editorService.removeSelectedElements('h1,h2,h3,h4,h5,h6,p,pre');\n this.onContentChange(this.textArea.nativeElement);\n } else {\n this.editorService.executeCommand(command, value);\n }\n this.exec();\n }\n }\n\n /**\n * focus event\n */\n onTextAreaFocus(event: FocusEvent): void {\n if (this.focused) {\n event.stopPropagation();\n return;\n }\n this.focused = true;\n this.focusEvent.emit(event);\n if (!this.touched || !this.changed) {\n this.editorService.executeInNextQueueIteration(() => {\n this.configure();\n this.touched = true;\n });\n }\n }\n\n /**\n * @description fires when cursor leaves textarea\n */\n public onTextAreaMouseOut(event: MouseEvent): void {\n this.editorService.saveSelection();\n }\n\n /**\n * blur event\n */\n onTextAreaBlur(event: FocusEvent) {\n /**\n * save selection if focussed out\n */\n this.editorService.executeInNextQueueIteration(this.editorService.saveSelection);\n\n if (typeof this.onTouched === 'function') {\n this.onTouched();\n }\n\n if (event.relatedTarget !== null) {\n const parent = (event.relatedTarget as HTMLElement).parentElement;\n if (!parent.classList.contains('angular-editor-toolbar-set') && !parent.classList.contains('ae-picker')) {\n this.blurEvent.emit(event);\n this.focused = false;\n }\n }\n }\n\n /**\n * focus the text area when the editor is focused\n */\n focus() {\n if (this.modeVisual) {\n this.textArea.nativeElement.focus();\n } else {\n const sourceText = this.doc.getElementById('sourceText' + this.id);\n sourceText.focus();\n this.focused = true;\n }\n }\n\n /**\n * Executed from the contenteditable section while the input property changes\n * @param element html element from contenteditable\n */\n onContentChange(element: HTMLElement): void {\n let html = '';\n if (this.modeVisual) {\n html = element.innerHTML;\n } else {\n html = element.innerText;\n }\n if ((!html || html === '<br>')) {\n html = '';\n }\n if (typeof this.onChange === 'function') {\n this.onChange(this.config.sanitize || this.config.sanitize === undefined ?\n this.sanitizer.sanitize(SecurityContext.HTML, html) : html);\n if ((!html) !== this.showPlaceholder) {\n this.togglePlaceholder(this.showPlaceholder);\n }\n }\n this.changed = true;\n }\n\n /**\n * Set the function to be called\n * when the control receives a change event.\n *\n * @param fn a function\n */\n registerOnChange(fn: any): void {\n this.onChange = e => (e === '<br>' ? fn('') : fn(e));\n }\n\n /**\n * Set the function to be called\n * when the control receives a touch event.\n *\n * @param fn a function\n */\n registerOnTouched(fn: any): void {\n this.onTouched = fn;\n }\n\n /**\n * Write a new value to the element.\n *\n * @param value value to be executed when there is a change in contenteditable\n */\n writeValue(value: any): void {\n\n if ((!value || value === '<br>' || value === '') !== this.showPlaceholder) {\n this.togglePlaceholder(this.showPlaceholder);\n }\n\n if (value === undefined || value === '' || value === '<br>') {\n value = null;\n }\n\n this.refreshView(value);\n }\n\n /**\n * refresh view/HTML of the editor\n *\n * @param value html string from the editor\n */\n refreshView(value: string): void {\n const normalizedValue = value === null ? '' : value;\n // Apply sanitization to prevent XSS when setting innerHTML\n const sanitizedValue = this.config.sanitize !== false\n ? this.sanitizer.sanitize(SecurityContext.HTML, normalizedValue)\n : normalizedValue;\n this.r.setProperty(this.textArea.nativeElement, 'innerHTML', sanitizedValue);\n\n return;\n }\n\n /**\n * toggles placeholder based on input string\n *\n * @param value A HTML string from the editor\n */\n togglePlaceholder(value: boolean): void {\n if (!value) {\n this.r.addClass(this.editorWrapper.nativeElement, 'show-placeholder');\n this.showPlaceholder = true;\n\n } else {\n this.r.removeClass(this.editorWrapper.nativeElement, 'show-placeholder');\n this.showPlaceholder = false;\n }\n }\n\n /**\n * Implements disabled state for this element\n *\n * @param isDisabled Disabled flag\n */\n setDisabledState(isDisabled: boolean): void {\n const div = this.textArea.nativeElement;\n const action = isDisabled ? 'addClass' : 'removeClass';\n this.r[action](div, 'disabled');\n this.disabled = isDisabled;\n }\n\n /**\n * toggles editor mode based on bToSource bool\n *\n * @param bToSource A boolean value from the editor\n */\n toggleEditorMode(bToSource: boolean) {\n let oContent: any;\n const editableElement = this.textArea.nativeElement;\n\n if (bToSource) {\n oContent = this.r.createText(editableElement.innerHTML);\n this.r.setProperty(editableElement, 'innerHTML', '');\n this.r.setProperty(editableElement, 'contentEditable', false);\n\n const oPre = this.r.createElement('pre');\n this.r.setStyle(oPre, 'margin', '0');\n this.r.setStyle(oPre, 'outline', 'none');\n\n const oCode = this.r.createElement('code');\n this.r.setProperty(oCode, 'id', 'sourceText' + this.id);\n this.r.setStyle(oCode, 'display', 'block');\n this.r.setStyle(oCode, 'white-space', 'pre-wrap');\n this.r.setStyle(oCode, 'word-break', 'keep-all');\n this.r.setStyle(oCode, 'outline', 'none');\n this.r.setStyle(oCode, 'margin', '0');\n this.r.setStyle(oCode, 'background-color', '#fff5b9');\n this.r.setProperty(oCode, 'contentEditable', true);\n this.r.appendChild(oCode, oContent);\n this.focusInstance = this.r.listen(oCode, 'focus', (event) => this.onTextAreaFocus(event));\n this.blurInstance = this.r.listen(oCode, 'blur', (event) => this.onTextAreaBlur(event));\n this.r.appendChild(oPre, oCode);\n this.r.appendChild(editableElement, oPre);\n\n // ToDo move to service\n this.doc.execCommand('defaultParagraphSeparator', false, 'div');\n\n this.modeVisual = false;\n this.viewMode.emit(false);\n oCode.focus();\n } else {\n if (this.doc.querySelectorAll) {\n this.r.setProperty(editableElement, 'innerHTML', editableElement.innerText);\n } else {\n oContent = this.doc.createRange();\n oContent.selectNodeContents(editableElement.firstChild);\n this.r.setProperty(editableElement, 'innerHTML', oContent.toString());\n }\n this.r.setProperty(editableElement, 'contentEditable', true);\n this.modeVisual = true;\n this.viewMode.emit(true);\n this.onContentChange(editableElement);\n editableElement.focus();\n }\n this.editorToolbar.setEditorMode(!this.modeVisual);\n }\n\n /**\n * toggles editor buttons when cursor moved or positioning\n *\n * Send a node array from the contentEditable of the editor\n */\n exec() {\n this.editorToolbar.triggerButtons();\n\n let userSelection;\n if (this.doc.getSelection) {\n userSelection = this.doc.getSelection();\n this.editorService.executeInNextQueueIteration(this.editorService.saveSelection);\n }\n\n let a = userSelection.focusNode;\n const els = [];\n while (a && a.id !== 'editor') {\n els.unshift(a);\n a = a.parentNode;\n }\n this.editorToolbar.triggerBlocks(els);\n }\n\n private configure() {\n this.editorService.uploadUrl = this.config.uploadUrl;\n this.editorService.uploadWithCredentials = this.config.uploadWithCredentials;\n if (this.config.defaultParagraphSeparator) {\n this.editorService.setDefaultParagraphSeparator(this.config.defaultParagraphSeparator);\n }\n if (this.config.defaultFontName) {\n this.editorService.setFontName(this.config.defaultFontName);\n }\n if (this.config.defaultFontSize) {\n this.editorService.setFontSize(this.config.defaultFontSize);\n }\n }\n\n getFonts() {\n const fonts = this.config.fonts ? this.config.fonts : angularEditorConfig.fonts;\n return fonts.map(x => {\n return {label: x.name, value: x.name};\n });\n }\n\n getCustomTags() {\n const tags = ['span'];\n this.config.customClasses.forEach(x => {\n if (x.tag !== undefined) {\n if (!tags.includes(x.tag)) {\n tags.push(x.tag);\n }\n }\n });\n return tags.join(',');\n }\n\n ngOnDestroy() {\n if (this.blurInstance) {\n this.blurInstance();\n }\n if (this.focusInstance) {\n this.focusInstance();\n }\n }\n\n filterStyles(html: string): string {\n html = html.replace('position: fixed;', '');\n return html;\n }\n}\n","<div\n class=\"angular-editor\"\n #angularEditor\n [style.width]=\"config.width\"\n [style.minWidth]=\"config.minWidth\"\n [ngClass]=\"{\n 'bottom': config.toolbarPosition === 'bottom'\n }\"\n>\n <angular-editor-toolbar\n #editorToolbar\n [id]=\"id\"\n [uploadUrl]=\"config.uploadUrl\"\n [upload]=\"config.upload\"\n [showToolbar]=\"config.showToolbar !== undefined ? config.showToolbar : true\"\n [fonts]=\"getFonts()\"\n [customClasses]=\"config.customClasses\"\n [defaultFontName]=\"config.defaultFontName\"\n [defaultFontSize]=\"config.defaultFontSize\"\n [hiddenButtons]=\"config.toolbarHiddenButtons\"\n (execute)=\"executeCommand($event)\"\n >\n <ng-container\n [ngTemplateOutlet]=\"customButtonsTemplateRef\"\n [ngTemplateOutletContext]=\"{ executeCommandFn: this.executeCommandFn}\"\n >\n </ng-container>\n </angular-editor-toolbar>\n\n <div\n class=\"angular-editor-wrapper\"\n #editorWrapper\n >\n <div\n #editor\n class=\"angular-editor-textarea\"\n [attr.contenteditable]=\"config.editable\"\n [attr.tabindex]=\"disabled ? -1 : tabIndex\"\n [attr.translate]=\"config.translate\"\n [attr.spellcheck]=\"config.spellcheck\"\n [style.height]=\"config.height\"\n [style.minHeight]=\"config.minHeight\"\n [style.maxHeight]=\"config.maxHeight\"\n [style.outline]=\"config.outline === false ? 'none': undefined\"\n (input)=\"onContentChange($any($event.target))\"\n (focus)=\"onTextAreaFocus($event)\"\n (blur)=\"onTextAreaBlur($event)\"\n (click)=\"exec()\"\n (keyup)=\"exec()\"\n (mouseout)=\"onTextAreaMouseOut($event)\"\n (paste)=\"onPaste($event)\"\n >\n </div>\n <span class=\"angular-editor-placeholder\">{{ placeholder || config['placeholder'] }}</span>\n </div>\n</div>\n","import {NgModule} from '@angular/core';\nimport {AngularEditorComponent} from './editor/angular-editor.component';\nimport {AeToolbarComponent} from './ae-toolbar/ae-toolbar.component';\nimport {FormsModule, ReactiveFormsModule} from '@angular/forms';\nimport {CommonModule} from '@angular/common';\nimport { AeSelectComponent } from './ae-select/ae-select.component';\nimport {AeButtonComponent} from \"./ae-button/ae-button.component\";\nimport { AeToolbarSetComponent } from './ae-toolbar-set/ae-toolbar-set.component';\n\n@NgModule({\n imports: [\n CommonModule, FormsModule, ReactiveFormsModule\n ],\n declarations: [AngularEditorComponent, AeToolbarComponent, AeSelectComponent, AeButtonComponent, AeToolbarSetComponent],\n exports: [AngularEditorComponent, AeToolbarComponent, AeButtonComponent, AeToolbarSetComponent]\n})\nexport class AngularEditorModule {\n}\n","/*\n * Public API Surface of angular-editor\n */\n\nexport * from './lib/angular-editor.service';\nexport * from './lib/editor/angular-editor.component';\nexport * from './lib/ae-button/ae-button.component';\nexport * from './lib/ae-toolbar-set/ae-toolbar-set.component';\nexport * from './lib/ae-select/ae-select.component';\nexport * from './lib/ae-toolbar/ae-toolbar.component';\nexport * from './lib/angular-editor.module';\nexport { AngularEditorConfig, CustomClass } from './lib/config';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2","i4.AeSelectComponent","i5.AeButtonComponent","i6.AeToolbarSetComponent","i1.AngularEditorService","i3","i4.AeToolbarComponent"],"mappings":"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"}
1
+ {"version":3,"file":"kolkov-angular-editor.mjs","sources":["../../../projects/angular-editor/src/lib/angular-editor.service.ts","../../../projects/angular-editor/src/lib/config.ts","../../../projects/angular-editor/src/lib/utils.ts","../../../projects/angular-editor/src/lib/ae-select/ae-select.component.ts","../../../projects/angular-editor/src/lib/ae-select/ae-select.component.html","../../../projects/angular-editor/src/lib/ae-button/ae-button.component.ts","../../../projects/angular-editor/src/lib/ae-button/ae-button.component.html","../../../projects/angular-editor/src/lib/ae-toolbar-set/ae-toolbar-set.component.ts","../../../projects/angular-editor/src/lib/ae-toolbar-set/ae-toolbar-set.component.html","../../../projects/angular-editor/src/lib/ae-toolbar/ae-toolbar.component.ts","../../../projects/angular-editor/src/lib/ae-toolbar/ae-toolbar.component.html","../../../projects/angular-editor/src/lib/editor/angular-editor.component.ts","../../../projects/angular-editor/src/lib/editor/angular-editor.component.html","../../../projects/angular-editor/src/lib/angular-editor.module.ts","../../../projects/angular-editor/src/public-api.ts","../../../projects/angular-editor/src/kolkov-angular-editor.ts"],"sourcesContent":["import {Inject, Injectable, DOCUMENT} from '@angular/core';\nimport {HttpClient, HttpEvent} from '@angular/common/http';\nimport {Observable} from 'rxjs';\n\nimport {CustomClass} from './config';\n\nexport interface UploadResponse {\n imageUrl: string;\n}\n\n@Injectable()\nexport class AngularEditorService {\n\n savedSelection: Range | null;\n selectedText: string;\n uploadUrl: string;\n uploadWithCredentials: boolean;\n\n constructor(\n private http: HttpClient,\n @Inject(DOCUMENT) private doc: any\n ) { }\n\n /**\n * Executed command from editor header buttons exclude toggleEditorMode\n * @param command string from triggerCommand\n * @param value\n */\n executeCommand(command: string, value?: string) {\n const commands = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'p', 'pre'];\n if (commands.includes(command)) {\n this.doc.execCommand('formatBlock', false, command);\n return;\n }\n this.doc.execCommand(command, false, value);\n }\n\n /**\n * Create URL link\n * @param url string from UI prompt\n */\n createLink(url: string) {\n if (!url.includes('http')) {\n this.doc.execCommand('createlink', false, url);\n } else {\n const newUrl = '<a href=\"' + url + '\" target=\"_blank\">' + this.selectedText + '</a>';\n this.insertHtml(newUrl);\n }\n }\n\n /**\n * insert color either font or background\n *\n * @param color color to be inserted\n * @param where where the color has to be inserted either text/background\n */\n insertColor(color: string, where: string): void {\n const restored = this.restoreSelection();\n if (restored) {\n if (where === 'textColor') {\n this.doc.execCommand('foreColor', false, color);\n } else {\n this.doc.execCommand('hiliteColor', false, color);\n }\n }\n }\n\n /**\n * Set font name\n * @param fontName string\n */\n setFontName(fontName: string) {\n this.doc.execCommand('fontName', false, fontName);\n }\n\n /**\n * Set font size\n * @param fontSize string\n */\n setFontSize(fontSize: string) {\n this.doc.execCommand('fontSize', false, fontSize);\n }\n\n /**\n * Create raw HTML\n * @param html HTML string\n */\n insertHtml(html: string): void {\n\n const isHTMLInserted = this.doc.execCommand('insertHTML', false, html);\n\n if (!isHTMLInserted) {\n throw new Error('Unable to perform the operation');\n }\n }\n\n /**\n * save selection when the editor is focussed out\n */\n public saveSelection = (): void => {\n if (this.doc.getSelection) {\n const sel = this.doc.getSelection();\n if (sel.getRangeAt && sel.rangeCount) {\n this.savedSelection = sel.getRangeAt(0);\n this.selectedText = sel.toString();\n }\n } else if (this.doc.getSelection && this.doc.createRange) {\n this.savedSelection = document.createRange();\n } else {\n this.savedSelection = null;\n }\n }\n\n /**\n * restore selection when the editor is focused in\n *\n * saved selection when the editor is focused out\n */\n restoreSelection(): boolean {\n if (this.savedSelection) {\n if (this.doc.getSelection) {\n const sel = this.doc.getSelection();\n sel.removeAllRanges();\n sel.addRange(this.savedSelection);\n return true;\n } else if (this.doc.getSelection /*&& this.savedSelection.select*/) {\n // this.savedSelection.select();\n return true;\n }\n } else {\n return false;\n }\n }\n\n /**\n * setTimeout used for execute 'saveSelection' method in next event loop iteration\n */\n public executeInNextQueueIteration(callbackFn: (...args: any[]) => any, timeout = 1e2): void {\n setTimeout(callbackFn, timeout);\n }\n\n /** check any selection is made or not */\n private checkSelection(): any {\n\n const selectedText = this.savedSelection.toString();\n\n if (selectedText.length === 0) {\n throw new Error('No Selection Made');\n }\n return true;\n }\n\n /**\n * Upload file to uploadUrl\n * @param file The file\n */\n uploadImage(file: File): Observable<HttpEvent<UploadResponse>> {\n\n const uploadData: FormData = new FormData();\n\n uploadData.append('file', file, file.name);\n\n return this.http.post<UploadResponse>(this.uploadUrl, uploadData, {\n reportProgress: true,\n observe: 'events',\n withCredentials: this.uploadWithCredentials,\n });\n }\n\n /**\n * Insert image with Url\n * @param imageUrl The imageUrl.\n */\n insertImage(imageUrl: string) {\n this.doc.execCommand('insertImage', false, imageUrl);\n }\n\n setDefaultParagraphSeparator(separator: string) {\n this.doc.execCommand('defaultParagraphSeparator', false, separator);\n }\n\n /**\n * Apply custom class to selection with enterprise-level HTML structure preservation.\n * Supports three modes:\n * - 'inline': Wrap selection in a single element (legacy behavior)\n * - 'block': Apply class to each block element in selection\n * - 'auto': Smart detection based on selection span (default)\n *\n * @param customClass The custom class configuration\n */\n createCustomClass(customClass: CustomClass): void {\n if (!customClass || !this.savedSelection) {\n return;\n }\n\n const mode = customClass.mode || 'auto';\n const range = this.savedSelection;\n\n // Restore selection before applying\n this.restoreSelection();\n\n if (mode === 'inline') {\n this.applyClassInline(range, customClass);\n } else if (mode === 'block') {\n this.applyClassToBlocks(range, customClass);\n } else {\n // Auto mode: detect if selection spans multiple blocks\n const blocks = this.getBlockElementsInRange(range);\n if (blocks.length > 1) {\n this.applyClassToBlocks(range, customClass);\n } else {\n this.applyClassInline(range, customClass);\n }\n }\n }\n\n /**\n * Apply class inline by wrapping selection in a single element.\n * Uses extractContents + insertNode pattern for safety.\n */\n private applyClassInline(range: Range, customClass: CustomClass): void {\n const tagName = customClass.tag || 'span';\n\n try {\n // Create wrapper element\n const wrapper = this.doc.createElement(tagName);\n wrapper.className = customClass.class;\n\n // Extract contents and wrap (safer than surroundContents)\n const contents = range.extractContents();\n wrapper.appendChild(contents);\n range.insertNode(wrapper);\n\n // Normalize to merge adjacent text nodes\n if (wrapper.parentNode) {\n wrapper.parentNode.normalize();\n }\n\n // Update selection to the new wrapper\n range.selectNodeContents(wrapper);\n const sel = this.doc.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n } catch (e) {\n // Fallback to legacy method if DOM manipulation fails\n console.warn('applyClassInline failed, using fallback:', e);\n this.applyClassInlineFallback(customClass);\n }\n }\n\n /**\n * Fallback method for inline class application (legacy behavior).\n */\n private applyClassInlineFallback(customClass: CustomClass): void {\n const tagName = customClass.tag || 'span';\n const newTag = '<' + tagName + ' class=\"' + customClass.class + '\">' + this.selectedText + '</' + tagName + '>';\n this.insertHtml(newTag);\n }\n\n /**\n * Apply class to each block element in selection.\n * Preserves HTML structure by adding class to existing elements.\n */\n private applyClassToBlocks(range: Range, customClass: CustomClass): void {\n const blocks = this.getBlockElementsInRange(range);\n\n if (blocks.length === 0) {\n // No blocks found, fall back to inline\n this.applyClassInline(range, customClass);\n return;\n }\n\n // Apply class to each block element\n blocks.forEach(block => {\n // Toggle class: remove if present, add if not\n if (block.classList.contains(customClass.class)) {\n block.classList.remove(customClass.class);\n } else {\n block.classList.add(customClass.class);\n }\n });\n\n // Trigger change detection by moving cursor\n const sel = this.doc.getSelection();\n if (sel && blocks.length > 0) {\n // Reselect the original range\n sel.removeAllRanges();\n sel.addRange(range);\n }\n }\n\n /**\n * Get all block-level elements within a range.\n * Returns elements that are fully or partially selected.\n */\n private getBlockElementsInRange(range: Range): HTMLElement[] {\n const blockTags = [\n 'P', 'DIV', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6',\n 'LI', 'BLOCKQUOTE', 'PRE', 'ADDRESS', 'ARTICLE',\n 'ASIDE', 'FIGCAPTION', 'FIGURE', 'FOOTER', 'HEADER',\n 'MAIN', 'NAV', 'SECTION'\n ];\n const blocks: HTMLElement[] = [];\n const seen = new Set<HTMLElement>();\n\n // Get the common ancestor\n const container = range.commonAncestorContainer;\n const root = container.nodeType === Node.ELEMENT_NODE\n ? container as HTMLElement\n : container.parentElement;\n\n if (!root) {\n return blocks;\n }\n\n // If root itself is a block element and fully contains the range\n if (blockTags.includes(root.tagName) && this.isNodeFullyInRange(root, range)) {\n return [root];\n }\n\n // Find all block elements within the range using TreeWalker\n const walker = this.doc.createTreeWalker(\n root,\n NodeFilter.SHOW_ELEMENT,\n {\n acceptNode: (node: Element) => {\n if (!blockTags.includes(node.tagName)) {\n return NodeFilter.FILTER_SKIP;\n }\n // Check if node intersects with selection\n if (range.intersectsNode(node)) {\n return NodeFilter.FILTER_ACCEPT;\n }\n return NodeFilter.FILTER_SKIP;\n }\n }\n );\n\n let node: Node | null;\n while ((node = walker.nextNode())) {\n const element = node as HTMLElement;\n // Avoid duplicates and nested blocks\n if (!seen.has(element) && !this.hasAncestorInSet(element, seen)) {\n seen.add(element);\n blocks.push(element);\n }\n }\n\n // If no blocks found, check if we're inside a block\n if (blocks.length === 0) {\n let parent = root;\n while (parent && parent !== this.doc.body) {\n if (blockTags.includes(parent.tagName)) {\n blocks.push(parent);\n break;\n }\n parent = parent.parentElement;\n }\n }\n\n return blocks;\n }\n\n /**\n * Check if a node is fully contained within a range.\n */\n private isNodeFullyInRange(node: Node, range: Range): boolean {\n const nodeRange = this.doc.createRange();\n nodeRange.selectNodeContents(node);\n return range.compareBoundaryPoints(Range.START_TO_START, nodeRange) <= 0 &&\n range.compareBoundaryPoints(Range.END_TO_END, nodeRange) >= 0;\n }\n\n /**\n * Check if element has an ancestor in the given set.\n */\n private hasAncestorInSet(element: HTMLElement, set: Set<HTMLElement>): boolean {\n let parent = element.parentElement;\n while (parent) {\n if (set.has(parent)) {\n return true;\n }\n parent = parent.parentElement;\n }\n return false;\n }\n\n insertVideo(videoUrl: string) {\n if (videoUrl.match('www.youtube.com') || videoUrl.match('youtu.be')) {\n this.insertYouTubeVideoTag(videoUrl);\n }\n if (videoUrl.match('vimeo.com')) {\n this.insertVimeoVideoTag(videoUrl);\n }\n }\n\n private insertYouTubeVideoTag(videoUrl: string): void {\n // Support both formats: youtube.com/watch?v=ID and youtu.be/ID\n let id: string;\n if (videoUrl.includes('youtu.be/')) {\n id = videoUrl.split('youtu.be/')[1].split('?')[0];\n } else {\n id = videoUrl.split('v=')[1].split('&')[0];\n }\n const imageUrl = `https://img.youtube.com/vi/${id}/0.jpg`;\n const thumbnail = `\n <div style='position: relative'>\n <a href='${videoUrl}' target='_blank'>\n <img src=\"${imageUrl}\" alt=\"click to watch\"/>\n <img style='position: absolute; left:200px; top:140px'\n src=\"https://img.icons8.com/color/96/000000/youtube-play.png\"/>\n </a>\n </div>`;\n this.insertHtml(thumbnail);\n }\n\n private insertVimeoVideoTag(videoUrl: string): void {\n const sub = this.http.get<any>(`https://vimeo.com/api/oembed.json?url=${videoUrl}`).subscribe(data => {\n const imageUrl = data.thumbnail_url_with_play_button;\n const thumbnail = `<div>\n <a href='${videoUrl}' target='_blank'>\n <img src=\"${imageUrl}\" alt=\"${data.title}\"/>\n </a>\n </div>`;\n this.insertHtml(thumbnail);\n sub.unsubscribe();\n });\n }\n\n nextNode(node) {\n if (node.hasChildNodes()) {\n return node.firstChild;\n } else {\n while (node && !node.nextSibling) {\n node = node.parentNode;\n }\n if (!node) {\n return null;\n }\n return node.nextSibling;\n }\n }\n\n getRangeSelectedNodes(range, includePartiallySelectedContainers) {\n let node = range.startContainer;\n const endNode = range.endContainer;\n let rangeNodes = [];\n\n // Special case for a range that is contained within a single node\n if (node === endNode) {\n rangeNodes = [node];\n } else {\n // Iterate nodes until we hit the end container\n while (node && node !== endNode) {\n rangeNodes.push( node = this.nextNode(node) );\n }\n\n // Add partially selected nodes at the start of the range\n node = range.startContainer;\n while (node && node !== range.commonAncestorContainer) {\n rangeNodes.unshift(node);\n node = node.parentNode;\n }\n }\n\n // Add ancestors of the range container, if required\n if (includePartiallySelectedContainers) {\n node = range.commonAncestorContainer;\n while (node) {\n rangeNodes.push(node);\n node = node.parentNode;\n }\n }\n\n return rangeNodes;\n }\n\n getSelectedNodes() {\n const nodes = [];\n if (this.doc.getSelection) {\n const sel = this.doc.getSelection();\n for (let i = 0, len = sel.rangeCount; i < len; ++i) {\n nodes.push.apply(nodes, this.getRangeSelectedNodes(sel.getRangeAt(i), true));\n }\n }\n return nodes;\n }\n\n replaceWithOwnChildren(el) {\n const parent = el.parentNode;\n while (el.hasChildNodes()) {\n parent.insertBefore(el.firstChild, el);\n }\n parent.removeChild(el);\n }\n\n removeSelectedElements(tagNames) {\n const tagNamesArray = tagNames.toLowerCase().split(',');\n this.getSelectedNodes().forEach((node) => {\n if (node.nodeType === 1 &&\n tagNamesArray.indexOf(node.tagName.toLowerCase()) > -1) {\n // Remove the node and replace it with its children\n this.replaceWithOwnChildren(node);\n }\n });\n }\n}\n","import { UploadResponse } from './angular-editor.service';\nimport { HttpEvent } from '@angular/common/http';\nimport { Observable } from 'rxjs';\n\n/**\n * Custom class configuration for applying styles to selected content.\n *\n * @example\n * // Basic usage (inline span)\n * { name: 'Red Text', class: 'text-red' }\n *\n * // Block-level class (applies to each paragraph)\n * { name: 'Highlight', class: 'highlight', mode: 'block' }\n *\n * // Auto mode (smart detection)\n * { name: 'Quote', class: 'quote', mode: 'auto', tag: 'div' }\n */\nexport interface CustomClass {\n /** Display name shown in dropdown */\n name: string;\n /** CSS class to apply */\n class: string;\n /** HTML tag to use for wrapping (default: 'span') */\n tag?: string;\n /**\n * Application mode:\n * - 'inline': Always wrap selection in a single element (legacy behavior)\n * - 'block': Apply class to each block element in selection\n * - 'auto': Smart detection - inline for single block, block for multiple (default)\n */\n mode?: 'inline' | 'block' | 'auto';\n}\n\nexport interface Font {\n name: string;\n class: string;\n}\n\nexport interface AngularEditorConfig {\n editable?: boolean;\n spellcheck?: boolean;\n height?: 'auto' | string;\n minHeight?: '0' | string;\n maxHeight?: 'auto' | string;\n width?: 'auto' | string;\n minWidth?: '0' | string;\n translate?: 'yes' | 'now' | string;\n enableToolbar?: boolean;\n showToolbar?: boolean;\n placeholder?: string;\n defaultParagraphSeparator?: string;\n defaultFontName?: string;\n defaultFontSize?: '1' | '2' | '3' | '4' | '5' | '6' | '7' | string;\n uploadUrl?: string;\n upload?: (file: File) => Observable<HttpEvent<UploadResponse>>;\n uploadWithCredentials?: boolean;\n fonts?: Font[];\n customClasses?: CustomClass[];\n sanitize?: boolean;\n toolbarPosition?: 'top' | 'bottom';\n outline?: boolean;\n toolbarHiddenButtons?: string[][];\n rawPaste?: boolean;\n textDirection?: 'ltr' | 'rtl' | 'auto';\n}\n\nexport const angularEditorConfig: AngularEditorConfig = {\n editable: true,\n spellcheck: true,\n height: 'auto',\n minHeight: '0',\n maxHeight: 'auto',\n width: 'auto',\n minWidth: '0',\n translate: 'yes',\n enableToolbar: true,\n showToolbar: true,\n placeholder: 'Enter text here...',\n defaultParagraphSeparator: '',\n defaultFontName: '',\n defaultFontSize: '',\n fonts: [\n {class: 'arial', name: 'Arial'},\n {class: 'times-new-roman', name: 'Times New Roman'},\n {class: 'calibri', name: 'Calibri'},\n {class: 'comic-sans-ms', name: 'Comic Sans MS'}\n ],\n uploadUrl: 'v1/image',\n uploadWithCredentials: false,\n sanitize: true,\n toolbarPosition: 'top',\n outline: true,\n /*toolbarHiddenButtons: [\n ['bold', 'italic', 'underline', 'strikeThrough', 'superscript', 'subscript'],\n ['heading', 'fontName', 'fontSize', 'color'],\n ['justifyLeft', 'justifyCenter', 'justifyRight', 'justifyFull', 'indent', 'outdent'],\n ['cut', 'copy', 'delete', 'removeFormat', 'undo', 'redo'],\n ['paragraph', 'blockquote', 'removeBlockquote', 'horizontalLine', 'orderedList', 'unorderedList'],\n ['link', 'unlink', 'image', 'video']\n ]*/\n};\n","export function isDefined(value: any) {\n return value !== undefined && value !== null;\n}\n","import {\n Component,\n ElementRef,\n EventEmitter,\n forwardRef,\n HostBinding,\n HostListener,\n Input,\n OnInit,\n Output,\n Renderer2,\n ViewChild,\n ViewEncapsulation\n} from '@angular/core';\nimport {ControlValueAccessor, NG_VALUE_ACCESSOR} from '@angular/forms';\nimport {isDefined} from '../utils';\n\nexport interface SelectOption {\n label: string;\n value: string;\n}\n\n@Component({\n selector: 'ae-select',\n templateUrl: './ae-select.component.html',\n styleUrls: ['./ae-select.component.scss'],\n //encapsulation: ViewEncapsulation.None,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => AeSelectComponent),\n multi: true,\n }\n ],\n standalone: false\n})\nexport class AeSelectComponent implements OnInit, ControlValueAccessor {\n @Input() options: SelectOption[] = [];\n // eslint-disable-next-line @angular-eslint/no-input-rename\n @Input('hidden') isHidden: boolean;\n\n selectedOption: SelectOption;\n disabled = false;\n optionId = 0;\n\n get label(): string {\n return this.selectedOption && this.selectedOption.hasOwnProperty('label') ? this.selectedOption.label : 'Select';\n }\n\n opened = false;\n\n get value(): string {\n return this.selectedOption.value;\n }\n\n @HostBinding('style.display') hidden = 'inline-block';\n\n // eslint-disable-next-line @angular-eslint/no-output-native, @angular-eslint/no-output-rename\n @Output('change') changeEvent = new EventEmitter();\n\n @ViewChild('labelButton', {static: true}) labelButton: ElementRef;\n\n constructor(private elRef: ElementRef,\n private r: Renderer2,\n ) {\n }\n\n ngOnInit() {\n this.selectedOption = this.options[0];\n if (isDefined(this.isHidden) && this.isHidden) {\n this.hide();\n }\n }\n\n hide() {\n this.hidden = 'none';\n }\n\n optionSelect(option: SelectOption, event: MouseEvent) {\n //console.log(event.button, event.buttons);\n if (event.buttons !== 1) {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n this.setValue(option.value);\n this.onChange(this.selectedOption.value);\n this.changeEvent.emit(this.selectedOption.value);\n this.onTouched();\n this.opened = false;\n }\n\n toggleOpen(event: MouseEvent) {\n // event.stopPropagation();\n if (this.disabled) {\n return;\n }\n this.opened = !this.opened;\n }\n\n @HostListener('document:click', ['$event'])\n onClick($event: MouseEvent) {\n if (!this.elRef.nativeElement.contains($event.target)) {\n this.close();\n }\n }\n\n close() {\n this.opened = false;\n }\n\n get isOpen(): boolean {\n return this.opened;\n }\n\n writeValue(value) {\n if (!value || typeof value !== 'string') {\n return;\n }\n this.setValue(value);\n }\n\n setValue(value) {\n let index = 0;\n const selectedEl = this.options.find((el, i) => {\n index = i;\n return el.value === value;\n });\n if (selectedEl) {\n this.selectedOption = selectedEl;\n this.optionId = index;\n }\n }\n\n onChange: any = () => {\n }\n onTouched: any = () => {\n }\n\n registerOnChange(fn) {\n this.onChange = fn;\n }\n\n registerOnTouched(fn) {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.labelButton.nativeElement.disabled = isDisabled;\n const div = this.labelButton.nativeElement;\n const action = isDisabled ? 'addClass' : 'removeClass';\n this.r[action](div, 'disabled');\n this.disabled = isDisabled;\n }\n\n @HostListener('keydown', ['$event'])\n handleKeyDown($event: KeyboardEvent) {\n if (!this.opened) {\n return;\n }\n // console.log($event.key);\n // if (KeyCode[$event.key]) {\n switch ($event.key) {\n case 'ArrowDown':\n this._handleArrowDown($event);\n break;\n case 'ArrowUp':\n this._handleArrowUp($event);\n break;\n case 'Space':\n this._handleSpace($event);\n break;\n case 'Enter':\n this._handleEnter($event);\n break;\n case 'Tab':\n this._handleTab($event);\n break;\n case 'Escape':\n this.close();\n $event.preventDefault();\n break;\n case 'Backspace':\n this._handleBackspace();\n break;\n }\n // } else if ($event.key && $event.key.length === 1) {\n // this._keyPress$.next($event.key.toLocaleLowerCase());\n // }\n }\n\n _handleArrowDown($event) {\n if (this.optionId < this.options.length - 1) {\n this.optionId++;\n }\n }\n\n _handleArrowUp($event) {\n if (this.optionId >= 1) {\n this.optionId--;\n }\n }\n\n _handleSpace($event) {\n\n }\n\n _handleEnter($event) {\n this.optionSelect(this.options[this.optionId], $event);\n }\n\n _handleTab($event) {\n\n }\n\n _handleBackspace() {\n\n }\n}\n","<span class=\"ae-picker\" [ngClass]=\"{'ae-expanded':isOpen}\">\n <button [tabIndex]=\"-1\" #labelButton tabindex=\"-1\" type=\"button\" role=\"button\" class=\"ae-picker-label\" (click)=\"toggleOpen($event);\">{{label}}\n <svg>\n <use [attr.href]=\"'assets/ae-icons/icons.svg#sort'\" [attr.xlink:href]=\"'assets/ae-icons/icons.svg#sort'\"></use>\n </svg>\n </button>\n <span class=\"ae-picker-options\">\n <span tabindex=\"-1\" type=\"button\" role=\"button\" class=\"ae-picker-item\"\n *ngFor=\"let item of options; let i = index\"\n [ngClass]=\"{'selected': item.value === value, 'focused': i === optionId}\"\n (mousedown)=\"optionSelect(item, $event)\">\n {{item.label}}\n </span>\n <span class=\"dropdown-item\" *ngIf=\"!options.length\">No items for select</span>\n </span>\n</span>\n","import {Component, Input, ViewEncapsulation} from '@angular/core';\n\n@Component({\n selector: 'ae-button, button[aeButton]',\n templateUrl: './ae-button.component.html',\n styleUrls: ['./ae-button.component.scss'],\n //encapsulation: ViewEncapsulation.None,\n host: {\n 'class': 'angular-editor-button',\n '[tabIndex]': '-1',\n '[type]': '\"button\"',\n },\n standalone: false\n})\nexport class AeButtonComponent {\n\n @Input() iconName = '';\n\n constructor() {\n }\n\n}\n","<ng-container *ngIf=\"iconName; else contentTemplate\">\n <svg>\n <use [attr.href]=\"'assets/ae-icons/icons.svg#' + iconName\" [attr.xlink:href]=\"'assets/ae-icons/icons.svg#' + iconName\"></use>\n </svg>\n</ng-container>\n<ng-template #contentTemplate>\n <ng-content></ng-content>\n</ng-template>\n","import {Component, ViewEncapsulation} from '@angular/core';\n\n@Component({\n selector: 'ae-toolbar-set, [aeToolbarSet]',\n templateUrl: './ae-toolbar-set.component.html',\n styleUrls: ['./ae-toolbar-set.component.scss'],\n //encapsulation: ViewEncapsulation.None,\n host: {\n 'class': 'angular-editor-toolbar-set'\n },\n standalone: false\n})\nexport class AeToolbarSetComponent {\n\n constructor() {\n }\n\n}\n","<ng-content></ng-content>\n","import {\n Component,\n ElementRef,\n EventEmitter,\n Inject,\n Input,\n Output,\n Renderer2,\n ViewChild,\n ViewEncapsulation,\n DOCUMENT\n} from '@angular/core';\nimport {AngularEditorService, UploadResponse} from '../angular-editor.service';\nimport {HttpEvent, HttpResponse} from '@angular/common/http';\n\nimport {CustomClass} from '../config';\nimport {SelectOption} from '../ae-select/ae-select.component';\nimport {Observable} from 'rxjs';\n\n@Component({\n selector: 'angular-editor-toolbar, ae-toolbar, div[aeToolbar]',\n templateUrl: './ae-toolbar.component.html',\n styleUrls: ['./ae-toolbar.component.scss'],\n standalone: false\n})\n\nexport class AeToolbarComponent {\n htmlMode = false;\n linkSelected = false;\n block = 'default';\n fontName = 'Times New Roman';\n fontSize = '3';\n foreColour;\n backColor;\n\n headings: SelectOption[] = [\n {\n label: 'Heading 1',\n value: 'h1',\n },\n {\n label: 'Heading 2',\n value: 'h2',\n },\n {\n label: 'Heading 3',\n value: 'h3',\n },\n {\n label: 'Heading 4',\n value: 'h4',\n },\n {\n label: 'Heading 5',\n value: 'h5',\n },\n {\n label: 'Heading 6',\n value: 'h6',\n },\n {\n label: 'Paragraph',\n value: 'p',\n },\n {\n label: 'Predefined',\n value: 'pre'\n },\n {\n label: 'Standard',\n value: 'div'\n },\n {\n label: 'default',\n value: 'default'\n }\n ];\n\n fontSizes: SelectOption[] = [\n {\n label: '1',\n value: '1',\n },\n {\n label: '2',\n value: '2',\n },\n {\n label: '3',\n value: '3',\n },\n {\n label: '4',\n value: '4',\n },\n {\n label: '5',\n value: '5',\n },\n {\n label: '6',\n value: '6',\n },\n {\n label: '7',\n value: '7',\n }\n ];\n\n customClassId = '-1';\n // eslint-disable-next-line no-underscore-dangle, id-blacklist, id-match\n _customClasses: CustomClass[];\n customClassList: SelectOption[] = [{label: '', value: ''}];\n // uploadUrl: string;\n\n tagMap = {\n BLOCKQUOTE: 'indent',\n A: 'link'\n };\n\n select = ['H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'P', 'PRE', 'DIV'];\n\n buttons = ['bold', 'italic', 'underline', 'strikeThrough', 'subscript', 'superscript', 'justifyLeft', 'justifyCenter',\n 'justifyRight', 'justifyFull', 'indent', 'outdent', 'insertUnorderedList', 'insertOrderedList', 'link'];\n\n @Input() id: string;\n @Input() uploadUrl: string;\n @Input() upload: (file: File) => Observable<HttpEvent<UploadResponse>>;\n @Input() showToolbar: boolean;\n @Input() fonts: SelectOption[] = [{label: '', value: ''}];\n\n @Input()\n set customClasses(classes: CustomClass[]) {\n if (classes) {\n this._customClasses = classes;\n this.customClassList = this._customClasses.map((x, i) => ({label: x.name, value: i.toString()}));\n this.customClassList.unshift({label: 'Clear Class', value: '-1'});\n }\n }\n\n @Input()\n set defaultFontName(value: string) {\n if (value) {\n this.fontName = value;\n }\n }\n\n @Input()\n set defaultFontSize(value: string) {\n if (value) {\n this.fontSize = value;\n }\n }\n\n @Input() hiddenButtons: string[][];\n\n @Output() execute: EventEmitter<string> = new EventEmitter<string>();\n\n @ViewChild('fileInput', {static: true}) myInputFile: ElementRef;\n\n public get isLinkButtonDisabled(): boolean {\n return this.htmlMode || !Boolean(this.editorService.selectedText);\n }\n\n constructor(\n private r: Renderer2,\n private editorService: AngularEditorService,\n private er: ElementRef,\n @Inject(DOCUMENT) private doc: any\n ) {\n }\n\n /**\n * Trigger command from editor header buttons\n * @param command string from toolbar buttons\n */\n triggerCommand(command: string) {\n this.execute.emit(command);\n }\n\n /**\n * highlight editor buttons when cursor moved or positioning\n */\n triggerButtons() {\n if (!this.showToolbar) {\n return;\n }\n this.buttons.forEach(e => {\n const result = this.doc.queryCommandState(e);\n const elementById = this.doc.getElementById(e + '-' + this.id);\n if (result) {\n this.r.addClass(elementById, 'active');\n } else {\n this.r.removeClass(elementById, 'active');\n }\n });\n }\n\n /**\n * trigger highlight editor buttons when cursor moved or positioning in block\n */\n triggerBlocks(nodes: Node[]) {\n if (!this.showToolbar) {\n return;\n }\n this.linkSelected = nodes.findIndex(x => x.nodeName === 'A') > -1;\n let found = false;\n this.select.forEach(y => {\n const node = nodes.find(x => x.nodeName === y);\n if (node !== undefined && y === node.nodeName) {\n if (found === false) {\n this.block = node.nodeName.toLowerCase();\n found = true;\n }\n } else if (found === false) {\n this.block = 'default';\n }\n });\n\n found = false;\n if (this._customClasses) {\n this._customClasses.forEach((y, index) => {\n const node = nodes.find(x => {\n if (x instanceof Element) {\n return x.className === y.class;\n }\n });\n if (node !== undefined) {\n if (found === false) {\n this.customClassId = index.toString();\n found = true;\n }\n } else if (found === false) {\n this.customClassId = '-1';\n }\n });\n }\n\n Object.keys(this.tagMap).map(e => {\n const elementById = this.doc.getElementById(this.tagMap[e] + '-' + this.id);\n const node = nodes.find(x => x.nodeName === e);\n if (node !== undefined && e === node.nodeName) {\n this.r.addClass(elementById, 'active');\n } else {\n this.r.removeClass(elementById, 'active');\n }\n });\n\n this.foreColour = this.doc.queryCommandValue('ForeColor');\n this.fontSize = this.doc.queryCommandValue('FontSize');\n this.fontName = this.doc.queryCommandValue('FontName').replace(/\"/g, '');\n this.backColor = this.doc.queryCommandValue('backColor');\n }\n\n /**\n * insert URL link\n */\n insertUrl() {\n let url = 'https:\\/\\/';\n const selection = this.editorService.savedSelection;\n if (selection && selection.commonAncestorContainer.parentElement.nodeName === 'A') {\n const parent = selection.commonAncestorContainer.parentElement as HTMLAnchorElement;\n // Use getAttribute to preserve relative URLs instead of href which returns absolute URL\n const href = parent.getAttribute('href');\n if (href !== '' && href !== null) {\n url = href;\n }\n }\n url = prompt('Insert URL link', url);\n if (url && url !== '' && url !== 'https://') {\n this.editorService.createLink(url);\n }\n }\n\n /**\n * insert Video link\n */\n insertVideo() {\n this.execute.emit('');\n const url = prompt('Insert Video link', `https://`);\n if (url && url !== '' && url !== `https://`) {\n this.editorService.insertVideo(url);\n }\n }\n\n /** insert color */\n insertColor(color: string, where: string) {\n this.editorService.insertColor(color, where);\n this.execute.emit('');\n }\n\n /**\n * set font Name/family\n * @param foreColor string\n */\n setFontName(foreColor: string): void {\n this.editorService.setFontName(foreColor);\n this.execute.emit('');\n }\n\n /**\n * set font Size\n * @param fontSize string\n */\n setFontSize(fontSize: string): void {\n this.editorService.setFontSize(fontSize);\n this.execute.emit('');\n }\n\n /**\n * toggle editor mode (WYSIWYG or SOURCE)\n * @param m boolean\n */\n setEditorMode(m: boolean) {\n const toggleEditorModeButton = this.doc.getElementById('toggleEditorMode' + '-' + this.id);\n if (m) {\n this.r.addClass(toggleEditorModeButton, 'active');\n } else {\n this.r.removeClass(toggleEditorModeButton, 'active');\n }\n this.htmlMode = m;\n }\n\n /**\n * Upload image when file is selected.\n */\n onFileChanged(event) {\n const file = event.target.files[0];\n if (file.type.includes('image/')) {\n if (this.upload) {\n this.upload(file).subscribe((response: HttpResponse<UploadResponse>) => this.watchUploadImage(response, event));\n } else if (this.uploadUrl) {\n this.editorService.uploadImage(file).subscribe((response: HttpResponse<UploadResponse>) => this.watchUploadImage(response, event));\n } else {\n const reader = new FileReader();\n reader.onload = (e: ProgressEvent) => {\n const fr = e.currentTarget as FileReader;\n this.editorService.insertImage(fr.result.toString());\n // Reset input value to allow re-uploading the same file\n event.target.value = null;\n };\n reader.readAsDataURL(file);\n }\n }\n }\n\n watchUploadImage(response: HttpResponse<{ imageUrl: string }>, event) {\n const {imageUrl} = response.body;\n this.editorService.insertImage(imageUrl);\n event.srcElement.value = null;\n }\n\n /**\n * Set custom class\n */\n setCustomClass(classId: string) {\n if (classId === '-1') {\n this.execute.emit('clear');\n } else {\n this.editorService.createCustomClass(this._customClasses[+classId]);\n }\n }\n\n isButtonHidden(name: string): boolean {\n if (!name) {\n return false;\n }\n if (!(this.hiddenButtons instanceof Array)) {\n return false;\n }\n let result: any;\n for (const arr of this.hiddenButtons) {\n if (arr instanceof Array) {\n result = arr.find(item => item === name);\n }\n if (result) {\n break;\n }\n }\n return result !== undefined;\n }\n\n focus() {\n this.execute.emit('focus');\n }\n}\n","<div class=\"angular-editor-toolbar\" *ngIf=\"showToolbar\">\n <div aeToolbarSet>\n <button aeButton title=\"Undo\" iconName=\"undo\" (click)=\"triggerCommand('undo')\" [hidden]=\"isButtonHidden('undo')\">\n </button>\n <button aeButton title=\"Redo\" iconName=\"redo\" (click)=\"triggerCommand('redo')\"\n [hidden]=\"isButtonHidden('redo')\">\n </button>\n </div>\n <div aeToolbarSet>\n <button [id]=\"'bold-'+id\" aeButton title=\"Bold\" iconName=\"bold\" (click)=\"triggerCommand('bold')\"\n [disabled]=\"htmlMode\" [hidden]=\"isButtonHidden('bold')\">\n </button>\n <button [id]=\"'italic-'+id\" aeButton iconName=\"italic\" title=\"Italic\" (click)=\"triggerCommand('italic')\"\n [disabled]=\"htmlMode\" [hidden]=\"isButtonHidden('italic')\">\n </button>\n <button [id]=\"'underline-'+id\" aeButton title=\"Underline\" iconName=\"underline\"\n (click)=\"triggerCommand('underline')\" [disabled]=\"htmlMode\" [hidden]=\"isButtonHidden('underline')\">\n </button>\n <button [id]=\"'strikeThrough-'+id\" aeButton iconName=\"strikeThrough\" title=\"Strikethrough\"\n (click)=\"triggerCommand('strikeThrough')\" [disabled]=\"htmlMode\"\n [hidden]=\"isButtonHidden('strikeThrough')\">\n </button>\n <button [id]=\"'subscript-'+id\" aeButton title=\"Subscript\" iconName=\"subscript\"\n (click)=\"triggerCommand('subscript')\" [disabled]=\"htmlMode\" [hidden]=\"isButtonHidden('subscript')\">\n </button>\n <button [id]=\"'superscript-'+id\" aeButton iconName=\"superscript\" title=\"Superscript\"\n (click)=\"triggerCommand('superscript')\" [disabled]=\"htmlMode\"\n [hidden]=\"isButtonHidden('superscript')\">\n </button>\n </div>\n <div aeToolbarSet>\n <button [id]=\"'justifyLeft-'+id\" aeButton iconName=\"justifyLeft\" title=\"Justify Left\"\n (click)=\"triggerCommand('justifyLeft')\" [disabled]=\"htmlMode\"\n [hidden]=\"isButtonHidden('justifyLeft')\">\n </button>\n <button [id]=\"'justifyCenter-'+id\" aeButton iconName=\"justifyCenter\" title=\"Justify Center\"\n (click)=\"triggerCommand('justifyCenter')\" [disabled]=\"htmlMode\"\n [hidden]=\"isButtonHidden('justifyCenter')\">\n </button>\n <button [id]=\"'justifyRight-'+id\" aeButton iconName=\"justifyRight\" title=\"Justify Right\"\n (click)=\"triggerCommand('justifyRight')\" [disabled]=\"htmlMode\"\n [hidden]=\"isButtonHidden('justifyRight')\">\n </button>\n <button [id]=\"'justifyFull-'+id\" aeButton iconName=\"justifyFull\" title=\"Justify Full\"\n (click)=\"triggerCommand('justifyFull')\" [disabled]=\"htmlMode\"\n [hidden]=\"isButtonHidden('justifyFull')\">\n </button>\n </div>\n <div aeToolbarSet>\n <button [id]=\"'indent-'+id\" aeButton iconName=\"indent\" title=\"Indent\"\n (click)=\"triggerCommand('indent')\"\n [disabled]=\"htmlMode\" [hidden]=\"isButtonHidden('indent')\">\n </button>\n <button [id]=\"'outdent-'+id\" aeButton iconName=\"outdent\" title=\"Outdent\"\n (click)=\"triggerCommand('outdent')\"\n [disabled]=\"htmlMode\" [hidden]=\"isButtonHidden('outdent')\">\n </button>\n </div>\n <div aeToolbarSet>\n <button [id]=\"'insertUnorderedList-'+id\" aeButton iconName=\"unorderedList\" title=\"Unordered List\"\n (click)=\"triggerCommand('insertUnorderedList')\" [disabled]=\"htmlMode\"\n [hidden]=\"isButtonHidden('insertUnorderedList')\">\n </button>\n <button [id]=\"'insertOrderedList-'+id\" aeButton iconName=\"orderedList\" title=\"Ordered List\"\n (click)=\"triggerCommand('insertOrderedList')\" [disabled]=\"htmlMode\"\n [hidden]=\"isButtonHidden('insertOrderedList')\">\n </button>\n </div>\n <div aeToolbarSet>\n <ae-select class=\"select-heading\" [options]=\"headings\"\n [(ngModel)]=\"block\"\n (change)=\"triggerCommand(block)\"\n [disabled]=\"htmlMode\"\n [hidden]=\"isButtonHidden('heading')\"\n tabindex=\"-1\"></ae-select>\n </div>\n <div aeToolbarSet>\n <ae-select class=\"select-font\" [options]=\"fonts\"\n [(ngModel)]=\"fontName\"\n (change)=\"setFontName(fontName)\"\n [disabled]=\"htmlMode\"\n [hidden]=\"isButtonHidden('fontName')\"\n tabindex=\"-1\"></ae-select>\n </div>\n <div aeToolbarSet>\n <ae-select class=\"select-font-size\" [options]=\"fontSizes\"\n [(ngModel)]=\"fontSize\"\n (change)=\"setFontSize(fontSize)\"\n [disabled]=\"htmlMode\"\n [hidden]=\"isButtonHidden('fontSize')\"\n tabindex=\"-1\">\n </ae-select>\n </div>\n <div aeToolbarSet>\n <input\n style=\"display: none\"\n type=\"color\" (change)=\"insertColor(fgInput.value, 'textColor')\"\n #fgInput>\n <button [id]=\"'foregroundColorPicker-'+id\" aeButton iconName=\"textColor\"\n (click)=\"focus(); ; fgInput.click()\"\n title=\"Text Color\"\n [disabled]=\"htmlMode\" [hidden]=\"isButtonHidden('textColor')\">\n </button>\n <input\n style=\"display: none\"\n type=\"color\" (change)=\"insertColor(bgInput.value, 'backgroundColor')\"\n #bgInput>\n <button [id]=\"'backgroundColorPicker-'+id\" aeButton iconName=\"backgroundColor\"\n (click)=\"focus(); ; bgInput.click()\"\n title=\"Background Color\"\n [disabled]=\"htmlMode\" [hidden]=\"isButtonHidden('backgroundColor')\">\n </button>\n </div>\n <div *ngIf=\"_customClasses\" aeToolbarSet>\n <ae-select class=\"select-custom-style\" [options]=\"customClassList\"\n [(ngModel)]=\"customClassId\"\n (change)=\"setCustomClass(customClassId)\"\n [disabled]=\"htmlMode\"\n [hidden]=\"isButtonHidden('customClasses')\"\n tabindex=\"-1\"></ae-select>\n </div>\n <div aeToolbarSet>\n <button [id]=\"'link-'+id\" aeButton iconName=\"link\" (click)=\"insertUrl()\"\n title=\"Insert Link\" [disabled]=\"isLinkButtonDisabled\" [hidden]=\"isButtonHidden('link')\">\n </button>\n <button [id]=\"'unlink-'+id\" aeButton iconName=\"unlink\" (click)=\"triggerCommand('unlink')\"\n title=\"Unlink\" [disabled]=\"htmlMode || !linkSelected\" [hidden]=\"isButtonHidden('unlink')\">\n </button>\n <input\n style=\"display: none\"\n accept=\"image/*\"\n type=\"file\" (change)=\"onFileChanged($event)\"\n #fileInput>\n <button [id]=\"'insertImage-'+id\" aeButton iconName=\"image\" (click)=\"focus(); fileInput.click()\"\n title=\"Insert Image\"\n [disabled]=\"htmlMode\" [hidden]=\"isButtonHidden('insertImage')\">\n </button>\n <button [id]=\"'insertVideo-'+id\" aeButton iconName=\"video\"\n (click)=\"insertVideo()\" title=\"Insert Video\" [disabled]=\"htmlMode\"\n [hidden]=\"isButtonHidden('insertVideo')\">\n </button>\n <button [id]=\"'insertHorizontalRule-'+id\" aeButton iconName=\"horizontalLine\" title=\"Horizontal Line\"\n (click)=\"triggerCommand('insertHorizontalRule')\" [disabled]=\"htmlMode\"\n [hidden]=\"isButtonHidden('insertHorizontalRule')\">\n </button>\n </div>\n <div aeToolbarSet>\n <button [id]=\"'clearFormatting-'+id\" aeButton iconName=\"removeFormat\" title=\"Clear Formatting\"\n class=\"angular-editor-button\"\n (click)=\"triggerCommand('removeFormat')\" [disabled]=\"htmlMode\" [hidden]=\"isButtonHidden('removeFormat')\">\n </button>\n </div>\n <div aeToolbarSet>\n <button [id]=\"'toggleEditorMode-'+id\" aeButton iconName=\"htmlCode\" title=\"HTML Code\"\n (click)=\"triggerCommand('toggleEditorMode')\" [hidden]=\"isButtonHidden('toggleEditorMode')\">\n </button>\n </div>\n <ng-content></ng-content>\n</div>\n","\nimport {\n AfterViewInit,\n Attribute,\n ChangeDetectorRef,\n Component,\n ContentChild,\n ElementRef,\n EventEmitter,\n forwardRef,\n HostBinding,\n HostListener,\n Inject,\n Input,\n OnDestroy,\n OnInit,\n Output,\n Renderer2,\n SecurityContext,\n TemplateRef,\n ViewChild, ViewEncapsulation,\n DOCUMENT\n} from '@angular/core';\nimport {ControlValueAccessor, NG_VALUE_ACCESSOR} from '@angular/forms';\nimport {DomSanitizer} from '@angular/platform-browser';\nimport {AeToolbarComponent} from '../ae-toolbar/ae-toolbar.component';\nimport {AngularEditorService} from '../angular-editor.service';\nimport {AngularEditorConfig, angularEditorConfig} from '../config';\nimport {isDefined} from '../utils';\n\n@Component({\n selector: 'angular-editor',\n templateUrl: './angular-editor.component.html',\n styleUrls: ['./angular-editor.component.scss'],\n encapsulation: ViewEncapsulation.None,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => AngularEditorComponent),\n multi: true\n },\n AngularEditorService\n ],\n standalone: false\n})\nexport class AngularEditorComponent implements OnInit, ControlValueAccessor, AfterViewInit, OnDestroy {\n\n private onChange: (value: string) => void;\n private onTouched: () => void;\n\n modeVisual = true;\n showPlaceholder = false;\n disabled = false;\n focused = false;\n touched = false;\n changed = false;\n\n focusInstance: any;\n blurInstance: any;\n\n @Input() id = '';\n @Input() config: AngularEditorConfig = angularEditorConfig;\n @Input() placeholder = '';\n @Input() tabIndex: number | null;\n\n @Output() html;\n\n @ViewChild('editor', {static: true}) textArea: ElementRef;\n @ViewChild('editorWrapper', {static: true}) editorWrapper: ElementRef;\n @ViewChild('editorToolbar') editorToolbar: AeToolbarComponent;\n @ContentChild(\"customButtons\") customButtonsTemplateRef?: TemplateRef<any>;\n executeCommandFn = this.executeCommand.bind(this);\n\n @Output() viewMode = new EventEmitter<boolean>();\n\n /** emits `blur` event when focused out from the textarea */\n // eslint-disable-next-line @angular-eslint/no-output-native, @angular-eslint/no-output-rename\n @Output('blur') blurEvent: EventEmitter<FocusEvent> = new EventEmitter<FocusEvent>();\n\n /** emits `focus` event when focused in to the textarea */\n // eslint-disable-next-line @angular-eslint/no-output-rename, @angular-eslint/no-output-native\n @Output('focus') focusEvent: EventEmitter<FocusEvent> = new EventEmitter<FocusEvent>();\n\n @HostBinding('attr.tabindex') tabindex = -1;\n\n @HostListener('focus')\n onFocus() {\n this.focus();\n }\n\n constructor(\n private r: Renderer2,\n private editorService: AngularEditorService,\n @Inject(DOCUMENT) private doc: any,\n private sanitizer: DomSanitizer,\n private cdRef: ChangeDetectorRef,\n @Attribute('tabindex') defaultTabIndex: string,\n @Attribute('autofocus') private autoFocus: any\n ) {\n const parsedTabIndex = Number(defaultTabIndex);\n this.tabIndex = (parsedTabIndex || parsedTabIndex === 0) ? parsedTabIndex : null;\n }\n\n ngOnInit() {\n this.config.toolbarPosition = this.config.toolbarPosition ? this.config.toolbarPosition : angularEditorConfig.toolbarPosition;\n }\n\n ngAfterViewInit() {\n if (isDefined(this.autoFocus)) {\n this.focus();\n }\n }\n\n onPaste(event: ClipboardEvent) {\n if (this.config.rawPaste) {\n event.preventDefault();\n const text = event.clipboardData.getData('text/plain');\n document.execCommand('insertHTML', false, text);\n return text;\n }\n }\n\n /**\n * Executed command from editor header buttons\n * @param command string from triggerCommand\n * @param value\n */\n executeCommand(command: string, value?: string) {\n this.focus();\n if (command === 'focus') {\n return;\n }\n if (command === 'toggleEditorMode') {\n this.toggleEditorMode(this.modeVisual);\n } else if (command !== '') {\n if (command === 'clear') {\n this.editorService.removeSelectedElements(this.getCustomTags());\n this.onContentChange(this.textArea.nativeElement);\n } else if (command === 'default') {\n this.editorService.removeSelectedElements('h1,h2,h3,h4,h5,h6,p,pre');\n this.onContentChange(this.textArea.nativeElement);\n } else {\n this.editorService.executeCommand(command, value);\n }\n this.exec();\n }\n }\n\n /**\n * focus event\n */\n onTextAreaFocus(event: FocusEvent): void {\n if (this.focused) {\n event.stopPropagation();\n return;\n }\n this.focused = true;\n this.focusEvent.emit(event);\n if (!this.touched || !this.changed) {\n this.editorService.executeInNextQueueIteration(() => {\n this.configure();\n this.touched = true;\n });\n }\n }\n\n /**\n * @description fires when cursor leaves textarea\n */\n public onTextAreaMouseOut(event: MouseEvent): void {\n this.editorService.saveSelection();\n }\n\n /**\n * blur event\n */\n onTextAreaBlur(event: FocusEvent) {\n /**\n * save selection if focussed out\n */\n this.editorService.executeInNextQueueIteration(this.editorService.saveSelection);\n\n if (typeof this.onTouched === 'function') {\n this.onTouched();\n }\n\n if (event.relatedTarget !== null) {\n const parent = (event.relatedTarget as HTMLElement).parentElement;\n if (!parent.classList.contains('angular-editor-toolbar-set') && !parent.classList.contains('ae-picker')) {\n this.blurEvent.emit(event);\n this.focused = false;\n }\n }\n }\n\n /**\n * focus the text area when the editor is focused\n */\n focus() {\n if (this.modeVisual) {\n this.textArea.nativeElement.focus();\n } else {\n const sourceText = this.doc.getElementById('sourceText' + this.id);\n sourceText.focus();\n this.focused = true;\n }\n }\n\n /**\n * Executed from the contenteditable section while the input property changes\n * @param element html element from contenteditable\n */\n onContentChange(element: HTMLElement): void {\n let html = '';\n if (this.modeVisual) {\n html = element.innerHTML;\n } else {\n html = element.innerText;\n }\n if ((!html || html === '<br>')) {\n html = '';\n }\n if (typeof this.onChange === 'function') {\n this.onChange(this.config.sanitize || this.config.sanitize === undefined ?\n this.sanitizer.sanitize(SecurityContext.HTML, html) : html);\n if ((!html) !== this.showPlaceholder) {\n this.togglePlaceholder(this.showPlaceholder);\n }\n }\n this.changed = true;\n }\n\n /**\n * Set the function to be called\n * when the control receives a change event.\n *\n * @param fn a function\n */\n registerOnChange(fn: any): void {\n this.onChange = e => (e === '<br>' ? fn('') : fn(e));\n }\n\n /**\n * Set the function to be called\n * when the control receives a touch event.\n *\n * @param fn a function\n */\n registerOnTouched(fn: any): void {\n this.onTouched = fn;\n }\n\n /**\n * Write a new value to the element.\n *\n * @param value value to be executed when there is a change in contenteditable\n */\n writeValue(value: any): void {\n\n if ((!value || value === '<br>' || value === '') !== this.showPlaceholder) {\n this.togglePlaceholder(this.showPlaceholder);\n }\n\n if (value === undefined || value === '' || value === '<br>') {\n value = null;\n }\n\n this.refreshView(value);\n }\n\n /**\n * refresh view/HTML of the editor\n *\n * @param value html string from the editor\n */\n refreshView(value: string): void {\n const normalizedValue = value === null ? '' : value;\n // Apply sanitization to prevent XSS when setting innerHTML\n const sanitizedValue = this.config.sanitize !== false\n ? this.sanitizer.sanitize(SecurityContext.HTML, normalizedValue)\n : normalizedValue;\n this.r.setProperty(this.textArea.nativeElement, 'innerHTML', sanitizedValue);\n\n return;\n }\n\n /**\n * toggles placeholder based on input string\n *\n * @param value A HTML string from the editor\n */\n togglePlaceholder(value: boolean): void {\n if (!value) {\n this.r.addClass(this.editorWrapper.nativeElement, 'show-placeholder');\n this.showPlaceholder = true;\n\n } else {\n this.r.removeClass(this.editorWrapper.nativeElement, 'show-placeholder');\n this.showPlaceholder = false;\n }\n }\n\n /**\n * Implements disabled state for this element\n *\n * @param isDisabled Disabled flag\n */\n setDisabledState(isDisabled: boolean): void {\n const div = this.textArea.nativeElement;\n const action = isDisabled ? 'addClass' : 'removeClass';\n this.r[action](div, 'disabled');\n this.disabled = isDisabled;\n }\n\n /**\n * toggles editor mode based on bToSource bool\n *\n * @param bToSource A boolean value from the editor\n */\n toggleEditorMode(bToSource: boolean) {\n let oContent: any;\n const editableElement = this.textArea.nativeElement;\n\n if (bToSource) {\n oContent = this.r.createText(editableElement.innerHTML);\n this.r.setProperty(editableElement, 'innerHTML', '');\n this.r.setProperty(editableElement, 'contentEditable', false);\n\n const oPre = this.r.createElement('pre');\n this.r.setStyle(oPre, 'margin', '0');\n this.r.setStyle(oPre, 'outline', 'none');\n\n const oCode = this.r.createElement('code');\n this.r.setProperty(oCode, 'id', 'sourceText' + this.id);\n this.r.setStyle(oCode, 'display', 'block');\n this.r.setStyle(oCode, 'white-space', 'pre-wrap');\n this.r.setStyle(oCode, 'word-break', 'keep-all');\n this.r.setStyle(oCode, 'outline', 'none');\n this.r.setStyle(oCode, 'margin', '0');\n this.r.setStyle(oCode, 'background-color', '#fff5b9');\n this.r.setProperty(oCode, 'contentEditable', true);\n this.r.appendChild(oCode, oContent);\n this.focusInstance = this.r.listen(oCode, 'focus', (event) => this.onTextAreaFocus(event));\n this.blurInstance = this.r.listen(oCode, 'blur', (event) => this.onTextAreaBlur(event));\n this.r.appendChild(oPre, oCode);\n this.r.appendChild(editableElement, oPre);\n\n // ToDo move to service\n this.doc.execCommand('defaultParagraphSeparator', false, 'div');\n\n this.modeVisual = false;\n this.viewMode.emit(false);\n oCode.focus();\n } else {\n if (this.doc.querySelectorAll) {\n // Apply sanitization to prevent XSS when switching from HTML mode\n if (this.config.sanitize !== false) {\n editableElement.innerText = this.sanitizer.sanitize(SecurityContext.HTML, editableElement.innerText);\n }\n this.r.setProperty(editableElement, 'innerHTML', editableElement.innerText);\n } else {\n oContent = this.doc.createRange();\n oContent.selectNodeContents(editableElement.firstChild);\n let oContentString = oContent.toString();\n // Apply sanitization to prevent XSS when switching from HTML mode\n if (this.config.sanitize !== false) {\n oContentString = this.sanitizer.sanitize(SecurityContext.HTML, oContentString);\n }\n this.r.setProperty(editableElement, 'innerHTML', oContentString);\n }\n this.r.setProperty(editableElement, 'contentEditable', true);\n this.modeVisual = true;\n this.viewMode.emit(true);\n this.onContentChange(editableElement);\n editableElement.focus();\n }\n this.editorToolbar.setEditorMode(!this.modeVisual);\n }\n\n /**\n * toggles editor buttons when cursor moved or positioning\n *\n * Send a node array from the contentEditable of the editor\n */\n exec() {\n this.editorToolbar.triggerButtons();\n\n let userSelection;\n if (this.doc.getSelection) {\n userSelection = this.doc.getSelection();\n this.editorService.executeInNextQueueIteration(this.editorService.saveSelection);\n }\n\n let a = userSelection.focusNode;\n const els = [];\n while (a && a.id !== 'editor') {\n els.unshift(a);\n a = a.parentNode;\n }\n this.editorToolbar.triggerBlocks(els);\n }\n\n private configure() {\n this.editorService.uploadUrl = this.config.uploadUrl;\n this.editorService.uploadWithCredentials = this.config.uploadWithCredentials;\n if (this.config.defaultParagraphSeparator) {\n this.editorService.setDefaultParagraphSeparator(this.config.defaultParagraphSeparator);\n }\n if (this.config.defaultFontName) {\n this.editorService.setFontName(this.config.defaultFontName);\n }\n if (this.config.defaultFontSize) {\n this.editorService.setFontSize(this.config.defaultFontSize);\n }\n }\n\n getFonts() {\n const fonts = this.config.fonts ? this.config.fonts : angularEditorConfig.fonts;\n return fonts.map(x => {\n return {label: x.name, value: x.name};\n });\n }\n\n getCustomTags() {\n const tags = ['span'];\n this.config.customClasses.forEach(x => {\n if (x.tag !== undefined) {\n if (!tags.includes(x.tag)) {\n tags.push(x.tag);\n }\n }\n });\n return tags.join(',');\n }\n\n ngOnDestroy() {\n if (this.blurInstance) {\n this.blurInstance();\n }\n if (this.focusInstance) {\n this.focusInstance();\n }\n }\n\n filterStyles(html: string): string {\n html = html.replace('position: fixed;', '');\n return html;\n }\n}\n","<div\n class=\"angular-editor\"\n #angularEditor\n [style.width]=\"config.width\"\n [style.minWidth]=\"config.minWidth\"\n [ngClass]=\"{\n 'bottom': config.toolbarPosition === 'bottom'\n }\"\n>\n <angular-editor-toolbar\n #editorToolbar\n [id]=\"id\"\n [uploadUrl]=\"config.uploadUrl\"\n [upload]=\"config.upload\"\n [showToolbar]=\"config.showToolbar !== undefined ? config.showToolbar : true\"\n [fonts]=\"getFonts()\"\n [customClasses]=\"config.customClasses\"\n [defaultFontName]=\"config.defaultFontName\"\n [defaultFontSize]=\"config.defaultFontSize\"\n [hiddenButtons]=\"config.toolbarHiddenButtons\"\n (execute)=\"executeCommand($event)\"\n >\n <ng-container\n [ngTemplateOutlet]=\"customButtonsTemplateRef\"\n [ngTemplateOutletContext]=\"{ executeCommandFn: this.executeCommandFn}\"\n >\n </ng-container>\n </angular-editor-toolbar>\n\n <div\n class=\"angular-editor-wrapper\"\n #editorWrapper\n >\n <div\n #editor\n class=\"angular-editor-textarea\"\n [attr.contenteditable]=\"config.editable\"\n [attr.tabindex]=\"disabled ? -1 : tabIndex\"\n [attr.translate]=\"config.translate\"\n [attr.spellcheck]=\"config.spellcheck\"\n [attr.dir]=\"config.textDirection\"\n [style.height]=\"config.height\"\n [style.minHeight]=\"config.minHeight\"\n [style.maxHeight]=\"config.maxHeight\"\n [style.outline]=\"config.outline === false ? 'none': undefined\"\n (input)=\"onContentChange($any($event.target))\"\n (focus)=\"onTextAreaFocus($event)\"\n (blur)=\"onTextAreaBlur($event)\"\n (click)=\"exec()\"\n (keyup)=\"exec()\"\n (mouseout)=\"onTextAreaMouseOut($event)\"\n (paste)=\"onPaste($event)\"\n >\n </div>\n <span class=\"angular-editor-placeholder\">{{ placeholder || config['placeholder'] }}</span>\n </div>\n</div>\n","import {NgModule} from '@angular/core';\nimport {AngularEditorComponent} from './editor/angular-editor.component';\nimport {AeToolbarComponent} from './ae-toolbar/ae-toolbar.component';\nimport {FormsModule, ReactiveFormsModule} from '@angular/forms';\nimport {CommonModule} from '@angular/common';\nimport { AeSelectComponent } from './ae-select/ae-select.component';\nimport {AeButtonComponent} from \"./ae-button/ae-button.component\";\nimport { AeToolbarSetComponent } from './ae-toolbar-set/ae-toolbar-set.component';\n\n@NgModule({\n imports: [\n CommonModule, FormsModule, ReactiveFormsModule\n ],\n declarations: [AngularEditorComponent, AeToolbarComponent, AeSelectComponent, AeButtonComponent, AeToolbarSetComponent],\n exports: [AngularEditorComponent, AeToolbarComponent, AeButtonComponent, AeToolbarSetComponent]\n})\nexport class AngularEditorModule {\n}\n","/*\n * Public API Surface of angular-editor\n */\n\nexport * from './lib/angular-editor.service';\nexport * from './lib/editor/angular-editor.component';\nexport * from './lib/ae-button/ae-button.component';\nexport * from './lib/ae-toolbar-set/ae-toolbar-set.component';\nexport * from './lib/ae-select/ae-select.component';\nexport * from './lib/ae-toolbar/ae-toolbar.component';\nexport * from './lib/angular-editor.module';\nexport { AngularEditorConfig, CustomClass } from './lib/config';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2","i4.AeSelectComponent","i5.AeButtonComponent","i6.AeToolbarSetComponent","i1.AngularEditorService","i3","i4.AeToolbarComponent"],"mappings":"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"}
package/index.d.ts CHANGED
@@ -7,10 +7,33 @@ import { ControlValueAccessor } from '@angular/forms';
7
7
  import { DomSanitizer } from '@angular/platform-browser';
8
8
  import * as i6 from '@angular/common';
9
9
 
10
+ /**
11
+ * Custom class configuration for applying styles to selected content.
12
+ *
13
+ * @example
14
+ * // Basic usage (inline span)
15
+ * { name: 'Red Text', class: 'text-red' }
16
+ *
17
+ * // Block-level class (applies to each paragraph)
18
+ * { name: 'Highlight', class: 'highlight', mode: 'block' }
19
+ *
20
+ * // Auto mode (smart detection)
21
+ * { name: 'Quote', class: 'quote', mode: 'auto', tag: 'div' }
22
+ */
10
23
  interface CustomClass {
24
+ /** Display name shown in dropdown */
11
25
  name: string;
26
+ /** CSS class to apply */
12
27
  class: string;
28
+ /** HTML tag to use for wrapping (default: 'span') */
13
29
  tag?: string;
30
+ /**
31
+ * Application mode:
32
+ * - 'inline': Always wrap selection in a single element (legacy behavior)
33
+ * - 'block': Apply class to each block element in selection
34
+ * - 'auto': Smart detection - inline for single block, block for multiple (default)
35
+ */
36
+ mode?: 'inline' | 'block' | 'auto';
14
37
  }
15
38
  interface Font {
16
39
  name: string;
@@ -41,6 +64,7 @@ interface AngularEditorConfig {
41
64
  outline?: boolean;
42
65
  toolbarHiddenButtons?: string[][];
43
66
  rawPaste?: boolean;
67
+ textDirection?: 'ltr' | 'rtl' | 'auto';
44
68
  }
45
69
 
46
70
  interface UploadResponse {
@@ -114,7 +138,43 @@ declare class AngularEditorService {
114
138
  */
115
139
  insertImage(imageUrl: string): void;
116
140
  setDefaultParagraphSeparator(separator: string): void;
141
+ /**
142
+ * Apply custom class to selection with enterprise-level HTML structure preservation.
143
+ * Supports three modes:
144
+ * - 'inline': Wrap selection in a single element (legacy behavior)
145
+ * - 'block': Apply class to each block element in selection
146
+ * - 'auto': Smart detection based on selection span (default)
147
+ *
148
+ * @param customClass The custom class configuration
149
+ */
117
150
  createCustomClass(customClass: CustomClass): void;
151
+ /**
152
+ * Apply class inline by wrapping selection in a single element.
153
+ * Uses extractContents + insertNode pattern for safety.
154
+ */
155
+ private applyClassInline;
156
+ /**
157
+ * Fallback method for inline class application (legacy behavior).
158
+ */
159
+ private applyClassInlineFallback;
160
+ /**
161
+ * Apply class to each block element in selection.
162
+ * Preserves HTML structure by adding class to existing elements.
163
+ */
164
+ private applyClassToBlocks;
165
+ /**
166
+ * Get all block-level elements within a range.
167
+ * Returns elements that are fully or partially selected.
168
+ */
169
+ private getBlockElementsInRange;
170
+ /**
171
+ * Check if a node is fully contained within a range.
172
+ */
173
+ private isNodeFullyInRange;
174
+ /**
175
+ * Check if element has an ancestor in the given set.
176
+ */
177
+ private hasAncestorInSet;
118
178
  insertVideo(videoUrl: string): void;
119
179
  private insertYouTubeVideoTag;
120
180
  private insertVimeoVideoTag;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kolkov/angular-editor",
3
- "version": "3.0.3",
3
+ "version": "3.0.5",
4
4
  "description": "A simple native WYSIWYG editor for Angular 20+. Rich Text editor component for Angular.",
5
5
  "author": "Andrey Kolkov <a.kolkov@gmail.com>",
6
6
  "repository": "https://github.com/kolkov/angular-editor",