{"version":3,"file":"kolkov-angular-editor.mjs","names":[],"sources":["../../../projects/angular-editor/src/lib/config.ts","../../../projects/angular-editor/src/lib/angular-editor.service.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"],"sourcesContent":["import { inject, InjectionToken, Provider, SecurityContext } from '@angular/core';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { UploadResponse } from './angular-editor.service';\nimport { HttpEvent } from '@angular/common/http';\nimport { Observable } from 'rxjs';\n\nexport type AeSanitizeFn = (html: string) => string;\n\nexport const AE_SANITIZER = new InjectionToken<AeSanitizeFn>('AE_SANITIZER', {\n  providedIn: 'root',\n  factory: () => {\n    const domSanitizer = inject(DomSanitizer);\n    return (html: string) => domSanitizer.sanitize(SecurityContext.HTML, html) ?? '';\n  },\n});\n\nexport function provideEditorSanitizer(sanitizeFn: AeSanitizeFn): Provider {\n  return { provide: AE_SANITIZER, useValue: sanitizeFn };\n}\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 EditorFormattingState {\n  bold: boolean;\n  italic: boolean;\n  underline: boolean;\n  strikeThrough: boolean;\n  subscript: boolean;\n  superscript: boolean;\n  justifyLeft: boolean;\n  justifyCenter: boolean;\n  justifyRight: boolean;\n  justifyFull: boolean;\n  insertUnorderedList: boolean;\n  insertOrderedList: boolean;\n  indent: boolean;\n  link: boolean;\n  block: string;\n  fontName: string;\n  fontSize: string;\n  foreColor: string;\n  backColor: string;\n  linkSelected: boolean;\n  customClassId: string;\n}\n\nexport const DEFAULT_FORMATTING_STATE: EditorFormattingState = {\n  bold: false,\n  italic: false,\n  underline: false,\n  strikeThrough: false,\n  subscript: false,\n  superscript: false,\n  justifyLeft: false,\n  justifyCenter: false,\n  justifyRight: false,\n  justifyFull: false,\n  insertUnorderedList: false,\n  insertOrderedList: false,\n  indent: false,\n  link: false,\n  block: 'default',\n  fontName: '',\n  fontSize: '3',\n  foreColor: '',\n  backColor: '',\n  linkSelected: false,\n  customClassId: '-1',\n};\n\nexport const TOGGLE_COMMANDS = [\n  'bold', 'italic', 'underline', 'strikeThrough',\n  'subscript', 'superscript',\n  'justifyLeft', 'justifyCenter', 'justifyRight', 'justifyFull',\n  'insertUnorderedList', 'insertOrderedList',\n] as const;\n\nexport const BLOCK_TAGS = ['H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'P', 'PRE', 'DIV'];\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  outputFormat?: 'html' | 'markdown';\n  pasteMarkdown?: boolean;\n}\n\nexport interface MarkdownConverter {\n  toMarkdown(html: string): string;\n  toHtml(markdown: string): string;\n}\n\nexport const AE_MARKDOWN_CONVERTER = new InjectionToken<MarkdownConverter>(\n  'AE_MARKDOWN_CONVERTER'\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","import {computed, inject, Injectable, signal, DOCUMENT} from '@angular/core';\nimport {HttpClient, HttpEvent} from '@angular/common/http';\nimport {Observable} from 'rxjs';\n\nimport {\n  CustomClass,\n  EditorFormattingState,\n  DEFAULT_FORMATTING_STATE,\n  TOGGLE_COMMANDS,\n  BLOCK_TAGS,\n} from './config';\n\nexport interface UploadResponse {\n  imageUrl: string;\n}\n\n@Injectable()\nexport class AngularEditorService {\n\n  savedSelection: Range | null = null;\n  selectedText: string = '';\n  uploadUrl: string = '';\n  uploadWithCredentials: boolean = false;\n\n  private readonly _formattingState = signal<EditorFormattingState>(DEFAULT_FORMATTING_STATE);\n  readonly formattingState = this._formattingState.asReadonly();\n\n  readonly isBold = computed(() => this.formattingState().bold);\n  readonly isItalic = computed(() => this.formattingState().italic);\n  readonly isUnderline = computed(() => this.formattingState().underline);\n  readonly isStrikeThrough = computed(() => this.formattingState().strikeThrough);\n  readonly isSubscript = computed(() => this.formattingState().subscript);\n  readonly isSuperscript = computed(() => this.formattingState().superscript);\n  readonly isJustifyLeft = computed(() => this.formattingState().justifyLeft);\n  readonly isJustifyCenter = computed(() => this.formattingState().justifyCenter);\n  readonly isJustifyRight = computed(() => this.formattingState().justifyRight);\n  readonly isJustifyFull = computed(() => this.formattingState().justifyFull);\n  readonly isUnorderedList = computed(() => this.formattingState().insertUnorderedList);\n  readonly isOrderedList = computed(() => this.formattingState().insertOrderedList);\n  readonly isIndent = computed(() => this.formattingState().indent);\n  readonly isLink = computed(() => this.formattingState().link);\n  readonly currentBlock = computed(() => this.formattingState().block);\n  readonly currentFontName = computed(() => this.formattingState().fontName);\n  readonly currentFontSize = computed(() => this.formattingState().fontSize);\n  readonly currentForeColor = computed(() => this.formattingState().foreColor);\n  readonly currentBackColor = computed(() => this.formattingState().backColor);\n  readonly isLinkSelected = computed(() => this.formattingState().linkSelected);\n  readonly currentCustomClassId = computed(() => this.formattingState().customClassId);\n\n  private http = inject(HttpClient);\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  private doc: any = inject(DOCUMENT);\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 {\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      }\n    }\n    return false;\n  }\n\n  /**\n   * setTimeout used for execute 'saveSelection' method in next event loop iteration\n   */\n  public executeInNextQueueIteration(callbackFn: (...args: unknown[]) => unknown, timeout = 1e2): void {\n    setTimeout(callbackFn, timeout);\n  }\n\n  /** check any selection is made or not */\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  private checkSelection(): any {\n    if (!this.savedSelection) {\n      throw new Error('No Selection Made');\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  setInitialState(overrides: Partial<EditorFormattingState>): void {\n    this._formattingState.update(state => ({...state, ...overrides}));\n  }\n\n  detectFormattingState(ancestorNodes: Node[], customClasses?: CustomClass[]): void {\n    const state: EditorFormattingState = { ...DEFAULT_FORMATTING_STATE };\n\n    for (const cmd of TOGGLE_COMMANDS) {\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      (state as any)[cmd] = this.doc.queryCommandState(cmd);\n    }\n\n    // Indent: check queryCommandState OR BLOCKQUOTE ancestor (unified, no double-toggle)\n    state.indent = this.doc.queryCommandState('indent') ||\n      ancestorNodes.some(n => n.nodeName === 'BLOCKQUOTE');\n\n    state.linkSelected = ancestorNodes.some(n => n.nodeName === 'A');\n    state.link = state.linkSelected;\n\n    let blockFound = false;\n    for (const node of ancestorNodes) {\n      if (!blockFound && BLOCK_TAGS.includes(node.nodeName)) {\n        state.block = node.nodeName.toLowerCase();\n        blockFound = true;\n      }\n    }\n\n    if (customClasses) {\n      let classFound = false;\n      for (let i = 0; i < customClasses.length; i++) {\n        const cc = customClasses[i];\n        const match = ancestorNodes.find(n => n instanceof Element && n.className === cc.class);\n        if (match && !classFound) {\n          state.customClassId = i.toString();\n          classFound = true;\n        }\n      }\n    }\n\n    state.foreColor = this.doc.queryCommandValue('ForeColor');\n    state.fontSize = this.doc.queryCommandValue('FontSize') || state.fontSize;\n    state.fontName = this.doc.queryCommandValue('FontName').replace(/\"/g, '');\n    state.backColor = this.doc.queryCommandValue('backColor');\n\n    this._formattingState.set(state);\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: HTMLElement | null = 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    // eslint-disable-next-line @typescript-eslint/no-explicit-any\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  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  nextNode(node: any): any {\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  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  getRangeSelectedNodes(range: any, includePartiallySelectedContainers: boolean): any[] {\n    let node = range.startContainer;\n    const endNode = range.endContainer;\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    let rangeNodes: any[] = [];\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  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  getSelectedNodes(): any[] {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    const nodes: any[] = [];\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(...this.getRangeSelectedNodes(sel.getRangeAt(i), true));\n      }\n    }\n    return nodes;\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  replaceWithOwnChildren(el: any) {\n    const parent = el.parentNode;\n    while (el.hasChildNodes()) {\n      parent.insertBefore(el.firstChild, el);\n    }\n    parent.removeChild(el);\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  removeSelectedElements(tagNames: any) {\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","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  inject,\n  Input,\n  OnInit,\n  Output,\n  Renderer2,\n  ViewChild,\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 = false;\n\n  selectedOption!: SelectOption;\n  disabled = false;\n  optionId = 0;\n\n  get label(): string {\n    return this.selectedOption && Object.prototype.hasOwnProperty.call(this.selectedOption, '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  private elRef = inject(ElementRef);\n  private r = inject(Renderer2);\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  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  writeValue(value: any) {\n    if (!value || typeof value !== 'string') {\n      return;\n    }\n    this.setValue(value);\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  setValue(value: any) {\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  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  onChange: any = () => {};\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  onTouched: any = () => {};\n\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  registerOnChange(fn: any) {\n    this.onChange = fn;\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  registerOnTouched(fn: any) {\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  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  _handleArrowDown($event: any) {\n    if (this.optionId < this.options.length - 1) {\n      this.optionId++;\n    }\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  _handleArrowUp($event: any) {\n    if (this.optionId >= 1) {\n      this.optionId--;\n    }\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  _handleSpace($event: any) {\n\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  _handleEnter($event: any) {\n    this.optionSelect(this.options[this.optionId], $event);\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  _handleTab($event: any) {\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    @for (item of options; track item.value; let i = $index) {\n      <span tabindex=\"-1\" type=\"button\" role=\"button\" class=\"ae-picker-item\"\n            [ngClass]=\"{'selected': item.value === value, 'focused': i === optionId}\"\n            (mousedown)=\"optionSelect(item, $event)\">\n            {{item.label}}\n      </span>\n    }\n    @if (!options.length) {\n      <span class=\"dropdown-item\">No items for select</span>\n    }\n  </span>\n</span>\n","import {Component, Input} 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    host: {\n        'class': 'angular-editor-button',\n        '[attr.tabIndex]': '-1',\n        '[attr.type]': '\"button\"',\n    },\n    standalone: false\n})\nexport class AeButtonComponent {\n\n  @Input() iconName = '';\n\n}\n","@if (iconName) {\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} @else {\n  <ng-content></ng-content>\n}\n","import {Component} 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  ViewChild,\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\n  headings: SelectOption[] = [\n    {label: 'Heading 1', value: 'h1'},\n    {label: 'Heading 2', value: 'h2'},\n    {label: 'Heading 3', value: 'h3'},\n    {label: 'Heading 4', value: 'h4'},\n    {label: 'Heading 5', value: 'h5'},\n    {label: 'Heading 6', value: 'h6'},\n    {label: 'Paragraph', value: 'p'},\n    {label: 'Predefined', value: 'pre'},\n    {label: 'Standard', value: 'div'},\n    {label: 'default', value: 'default'}\n  ];\n\n  fontSizes: SelectOption[] = [\n    {label: '1', value: '1'},\n    {label: '2', value: '2'},\n    {label: '3', value: '3'},\n    {label: '4', value: '4'},\n    {label: '5', value: '5'},\n    {label: '6', value: '6'},\n    {label: '7', value: '7'}\n  ];\n\n  _customClasses: CustomClass[] = [];\n  customClassList: SelectOption[] = [{label: '', value: ''}];\n\n  @Input() id: string = '';\n  @Input() uploadUrl: string = '';\n  @Input() upload!: (file: File) => Observable<HttpEvent<UploadResponse>>;\n  @Input() showToolbar: boolean = false;\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.editorService.setInitialState({fontName: value});\n    }\n  }\n\n  @Input()\n  set defaultFontSize(value: string) {\n    if (value) {\n      this.editorService.setInitialState({fontSize: value});\n    }\n  }\n\n  @Input() hiddenButtons: string[][] = [];\n\n  @Output() execute: EventEmitter<string> = new EventEmitter<string>();\n\n  @ViewChild('fileInput', {static: false}) myInputFile!: ElementRef;\n\n  public get isLinkButtonDisabled(): boolean {\n    return this.htmlMode || !this.editorService.selectedText;\n  }\n\n  protected editorService = inject(AngularEditorService);\n\n  triggerCommand(command: string) {\n    this.execute.emit(command);\n  }\n\n  setEditorMode(m: boolean) {\n    this.htmlMode = m;\n  }\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      const href = parent.getAttribute('href');\n      if (href !== '' && href !== null) {\n        url = href;\n      }\n    }\n    const promptUrl = prompt('Insert URL link', url);\n    if (promptUrl && promptUrl !== '' && promptUrl !== 'https://') {\n      this.editorService.createLink(promptUrl);\n    }\n  }\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  insertColor(color: string, where: string) {\n    this.editorService.insertColor(color, where);\n    this.execute.emit('');\n  }\n\n  setFontName(fontName: string): void {\n    this.editorService.setFontName(fontName);\n    this.execute.emit('');\n  }\n\n  setFontSize(fontSize: string): void {\n    this.editorService.setFontSize(fontSize);\n    this.execute.emit('');\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  onFileChanged(event: any) {\n    const file = event.target.files[0];\n    if (file.type.includes('image/')) {\n      if (this.upload) {\n        this.upload(file).subscribe((response) => {\n          if (response instanceof HttpResponse) {\n            this.watchUploadImage(response as HttpResponse<{ imageUrl: string }>, event);\n          }\n        });\n      } else if (this.uploadUrl) {\n        this.editorService.uploadImage(file).subscribe((response) => {\n          if (response instanceof HttpResponse) {\n            this.watchUploadImage(response as HttpResponse<{ imageUrl: string }>, event);\n          }\n        });\n      } else {\n        const reader = new FileReader();\n        reader.onload = (e: ProgressEvent) => {\n          const fr = e.currentTarget as FileReader;\n          if (fr.result !== null) {\n            this.editorService.insertImage(fr.result.toString());\n          }\n          event.target.value = null;\n        };\n        reader.readAsDataURL(file);\n      }\n    }\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  watchUploadImage(response: HttpResponse<{ imageUrl: string }>, event: any) {\n    const body = response.body;\n    if (body) {\n      const {imageUrl} = body;\n      this.editorService.insertImage(imageUrl);\n    }\n    event.srcElement.value = null;\n  }\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    // eslint-disable-next-line @typescript-eslint/no-explicit-any\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","@if (showToolbar) {\n  <div class=\"angular-editor-toolbar\">\n    @if (!isButtonHidden('undo') || !isButtonHidden('redo')) {\n      <div aeToolbarSet>\n        @if (!isButtonHidden('undo')) {\n          <button aeButton title=\"Undo\" iconName=\"undo\" (click)=\"triggerCommand('undo')\">\n          </button>\n        }\n        @if (!isButtonHidden('redo')) {\n          <button aeButton title=\"Redo\" iconName=\"redo\" (click)=\"triggerCommand('redo')\">\n          </button>\n        }\n      </div>\n    }\n    @if (!isButtonHidden('bold') || !isButtonHidden('italic') || !isButtonHidden('underline') || !isButtonHidden('strikeThrough') || !isButtonHidden('subscript') || !isButtonHidden('superscript')) {\n      <div aeToolbarSet>\n        @if (!isButtonHidden('bold')) {\n          <button [id]=\"'bold-'+id\" aeButton title=\"Bold\" iconName=\"bold\" (click)=\"triggerCommand('bold')\"\n                  [class.active]=\"editorService.isBold()\" [disabled]=\"htmlMode\">\n          </button>\n        }\n        @if (!isButtonHidden('italic')) {\n          <button [id]=\"'italic-'+id\" aeButton iconName=\"italic\" title=\"Italic\" (click)=\"triggerCommand('italic')\"\n                  [class.active]=\"editorService.isItalic()\" [disabled]=\"htmlMode\">\n          </button>\n        }\n        @if (!isButtonHidden('underline')) {\n          <button [id]=\"'underline-'+id\" aeButton title=\"Underline\" iconName=\"underline\"\n                  (click)=\"triggerCommand('underline')\" [class.active]=\"editorService.isUnderline()\" [disabled]=\"htmlMode\">\n          </button>\n        }\n        @if (!isButtonHidden('strikeThrough')) {\n          <button [id]=\"'strikeThrough-'+id\" aeButton iconName=\"strikeThrough\" title=\"Strikethrough\"\n                  (click)=\"triggerCommand('strikeThrough')\" [class.active]=\"editorService.isStrikeThrough()\" [disabled]=\"htmlMode\">\n          </button>\n        }\n        @if (!isButtonHidden('subscript')) {\n          <button [id]=\"'subscript-'+id\" aeButton title=\"Subscript\" iconName=\"subscript\"\n                  (click)=\"triggerCommand('subscript')\" [class.active]=\"editorService.isSubscript()\" [disabled]=\"htmlMode\">\n          </button>\n        }\n        @if (!isButtonHidden('superscript')) {\n          <button [id]=\"'superscript-'+id\" aeButton iconName=\"superscript\" title=\"Superscript\"\n                  (click)=\"triggerCommand('superscript')\" [class.active]=\"editorService.isSuperscript()\" [disabled]=\"htmlMode\">\n          </button>\n        }\n      </div>\n    }\n    @if (!isButtonHidden('justifyLeft') || !isButtonHidden('justifyCenter') || !isButtonHidden('justifyRight') || !isButtonHidden('justifyFull')) {\n      <div aeToolbarSet>\n        @if (!isButtonHidden('justifyLeft')) {\n          <button [id]=\"'justifyLeft-'+id\" aeButton iconName=\"justifyLeft\" title=\"Justify Left\"\n                  (click)=\"triggerCommand('justifyLeft')\" [class.active]=\"editorService.isJustifyLeft()\" [disabled]=\"htmlMode\">\n          </button>\n        }\n        @if (!isButtonHidden('justifyCenter')) {\n          <button [id]=\"'justifyCenter-'+id\" aeButton iconName=\"justifyCenter\" title=\"Justify Center\"\n                  (click)=\"triggerCommand('justifyCenter')\" [class.active]=\"editorService.isJustifyCenter()\" [disabled]=\"htmlMode\">\n          </button>\n        }\n        @if (!isButtonHidden('justifyRight')) {\n          <button [id]=\"'justifyRight-'+id\" aeButton iconName=\"justifyRight\" title=\"Justify Right\"\n                  (click)=\"triggerCommand('justifyRight')\" [class.active]=\"editorService.isJustifyRight()\" [disabled]=\"htmlMode\">\n          </button>\n        }\n        @if (!isButtonHidden('justifyFull')) {\n          <button [id]=\"'justifyFull-'+id\" aeButton iconName=\"justifyFull\" title=\"Justify Full\"\n                  (click)=\"triggerCommand('justifyFull')\" [class.active]=\"editorService.isJustifyFull()\" [disabled]=\"htmlMode\">\n          </button>\n        }\n      </div>\n    }\n    @if (!isButtonHidden('indent') || !isButtonHidden('outdent')) {\n      <div aeToolbarSet>\n        @if (!isButtonHidden('indent')) {\n          <button [id]=\"'indent-'+id\" aeButton iconName=\"indent\" title=\"Indent\"\n                  (click)=\"triggerCommand('indent')\"\n                  [class.active]=\"editorService.isIndent()\" [disabled]=\"htmlMode\">\n          </button>\n        }\n        @if (!isButtonHidden('outdent')) {\n          <button [id]=\"'outdent-'+id\" aeButton iconName=\"outdent\" title=\"Outdent\"\n                  (click)=\"triggerCommand('outdent')\"\n                  [disabled]=\"htmlMode\">\n          </button>\n        }\n      </div>\n    }\n    @if (!isButtonHidden('insertUnorderedList') || !isButtonHidden('insertOrderedList')) {\n      <div aeToolbarSet>\n        @if (!isButtonHidden('insertUnorderedList')) {\n          <button [id]=\"'insertUnorderedList-'+id\" aeButton iconName=\"unorderedList\" title=\"Unordered List\"\n                  (click)=\"triggerCommand('insertUnorderedList')\" [class.active]=\"editorService.isUnorderedList()\" [disabled]=\"htmlMode\">\n          </button>\n        }\n        @if (!isButtonHidden('insertOrderedList')) {\n          <button [id]=\"'insertOrderedList-'+id\" aeButton iconName=\"orderedList\" title=\"Ordered List\"\n                  (click)=\"triggerCommand('insertOrderedList')\" [class.active]=\"editorService.isOrderedList()\" [disabled]=\"htmlMode\">\n          </button>\n        }\n      </div>\n    }\n    @if (!isButtonHidden('heading')) {\n      <div aeToolbarSet>\n        <ae-select class=\"select-heading\" [options]=\"headings\"\n                   [ngModel]=\"editorService.currentBlock()\"\n                   (ngModelChange)=\"triggerCommand($event)\"\n                   [disabled]=\"htmlMode\"\n                   tabindex=\"-1\"></ae-select>\n      </div>\n    }\n    @if (!isButtonHidden('fontName')) {\n      <div aeToolbarSet>\n        <ae-select class=\"select-font\" [options]=\"fonts\"\n                   [ngModel]=\"editorService.currentFontName()\"\n                   (ngModelChange)=\"setFontName($event)\"\n                   [disabled]=\"htmlMode\"\n                   tabindex=\"-1\"></ae-select>\n      </div>\n    }\n    @if (!isButtonHidden('fontSize')) {\n      <div aeToolbarSet>\n        <ae-select class=\"select-font-size\" [options]=\"fontSizes\"\n                   [ngModel]=\"editorService.currentFontSize()\"\n                   (ngModelChange)=\"setFontSize($event)\"\n                   [disabled]=\"htmlMode\"\n                   tabindex=\"-1\">\n        </ae-select>\n      </div>\n    }\n    @if (!isButtonHidden('textColor') || !isButtonHidden('backgroundColor')) {\n      <div aeToolbarSet>\n        @if (!isButtonHidden('textColor')) {\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\">\n          </button>\n        }\n        @if (!isButtonHidden('backgroundColor')) {\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\">\n          </button>\n        }\n      </div>\n    }\n    @if (_customClasses && !isButtonHidden('customClasses')) {\n      <div aeToolbarSet>\n        <ae-select class=\"select-custom-style\" [options]=\"customClassList\"\n                   [ngModel]=\"editorService.currentCustomClassId()\"\n                   (ngModelChange)=\"setCustomClass($event)\"\n                   [disabled]=\"htmlMode\"\n                   tabindex=\"-1\"></ae-select>\n      </div>\n    }\n    @if (!isButtonHidden('link') || !isButtonHidden('unlink') || !isButtonHidden('insertImage') || !isButtonHidden('insertVideo') || !isButtonHidden('insertHorizontalRule')) {\n      <div aeToolbarSet>\n        @if (!isButtonHidden('link')) {\n          <button [id]=\"'link-'+id\" aeButton iconName=\"link\" (click)=\"insertUrl()\"\n                  title=\"Insert Link\" [class.active]=\"editorService.isLink()\" [disabled]=\"isLinkButtonDisabled\">\n          </button>\n        }\n        @if (!isButtonHidden('unlink')) {\n          <button [id]=\"'unlink-'+id\" aeButton iconName=\"unlink\" (click)=\"triggerCommand('unlink')\"\n                  title=\"Unlink\" [disabled]=\"htmlMode || !editorService.isLinkSelected()\">\n          </button>\n        }\n        @if (!isButtonHidden('insertImage')) {\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\">\n          </button>\n        }\n        @if (!isButtonHidden('insertVideo')) {\n          <button [id]=\"'insertVideo-'+id\" aeButton iconName=\"video\"\n                  (click)=\"insertVideo()\" title=\"Insert Video\" [disabled]=\"htmlMode\">\n          </button>\n        }\n        @if (!isButtonHidden('insertHorizontalRule')) {\n          <button [id]=\"'insertHorizontalRule-'+id\" aeButton iconName=\"horizontalLine\" title=\"Horizontal Line\"\n                  (click)=\"triggerCommand('insertHorizontalRule')\" [disabled]=\"htmlMode\">\n          </button>\n        }\n      </div>\n    }\n    @if (!isButtonHidden('removeFormat')) {\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\">\n        </button>\n      </div>\n    }\n    @if (!isButtonHidden('toggleEditorMode')) {\n      <div aeToolbarSet>\n        <button [id]=\"'toggleEditorMode-'+id\" aeButton iconName=\"htmlCode\" title=\"HTML Code\"\n                [class.active]=\"htmlMode\"\n                (click)=\"triggerCommand('toggleEditorMode')\">\n        </button>\n      </div>\n    }\n    <ng-content></ng-content>\n  </div>\n}\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  TemplateRef,\n  ViewChild,\n  ViewEncapsulation,\n  DOCUMENT\n} from '@angular/core';\nimport {ControlValueAccessor, NG_VALUE_ACCESSOR} from '@angular/forms';\nimport {AeToolbarComponent} from '../ae-toolbar/ae-toolbar.component';\nimport {AngularEditorService} from '../angular-editor.service';\nimport {AE_SANITIZER, AE_MARKDOWN_CONVERTER, AngularEditorConfig, angularEditorConfig} from '../config';\nimport type {MarkdownConverter} 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) | undefined;\n  private onTouched: (() => void) | undefined;\n\n  modeVisual = true;\n  showPlaceholder = false;\n  disabled = false;\n  focused = false;\n  touched = false;\n  changed = false;\n\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  focusInstance: any;\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  blurInstance: any;\n\n  @Input() id = '';\n\n  @Input() config: AngularEditorConfig = angularEditorConfig;\n\n  private pendingValue: string | undefined;\n  private viewInitialized = false;\n  @Input() placeholder = '';\n  @Input() tabIndex: number | null = null;\n\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  @Output() html: EventEmitter<any> = new EventEmitter<any>();\n\n  @ViewChild('editor', {static: true}) textArea!: ElementRef;\n  @ViewChild('editorWrapper', {static: true}) editorWrapper!: ElementRef;\n  @ViewChild('editorToolbar') editorToolbar!: AeToolbarComponent;\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\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  private r = inject(Renderer2);\n  private editorService = inject(AngularEditorService);\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  private doc: any = inject(DOCUMENT);\n  private sanitizeFn = inject(AE_SANITIZER);\n  private markdownConverter: MarkdownConverter | null = inject(AE_MARKDOWN_CONVERTER, {optional: true});\n  private cdRef = inject(ChangeDetectorRef);\n\n  @Output() contentChanged = new EventEmitter<{html: string; markdown?: string; text: string}>();\n\n  private get isMarkdownOutput(): boolean {\n    return this.config.outputFormat === 'markdown' && this.markdownConverter !== null;\n  }\n\n  private sanitizeHtml(html: string): string {\n    if (this.config.sanitize === false) {\n      return html;\n    }\n    return this.sanitizeFn(html);\n  }\n\n  getHtml(): string {\n    return this.textArea.nativeElement.innerHTML;\n  }\n\n  getMarkdown(): string {\n    if (!this.markdownConverter) {\n      throw new Error('AE_MARKDOWN_CONVERTER must be provided to use getMarkdown(). Import provideMarkdownConverter() from @kolkov/angular-editor/markdown.');\n    }\n    const html = this.sanitizeHtml(this.textArea.nativeElement.innerHTML);\n    return this.markdownConverter.toMarkdown(html);\n  }\n\n  constructor(\n    @Attribute('tabindex') defaultTabIndex: string,\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\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    if (this.config.outputFormat === 'markdown' && !this.markdownConverter) {\n      throw new Error(\n        'outputFormat \"markdown\" requires AE_MARKDOWN_CONVERTER. ' +\n        'Import provideMarkdownConverter() from @kolkov/angular-editor/markdown.'\n      );\n    }\n  }\n\n  ngAfterViewInit() {\n    this.viewInitialized = true;\n    if (this.pendingValue !== undefined) {\n      this.applyValue(this.pendingValue);\n      this.pendingValue = undefined;\n    }\n    if (isDefined(this.autoFocus)) {\n      this.focus();\n    }\n  }\n\n  onPaste(event: ClipboardEvent): string | undefined {\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    const shouldPasteMarkdown = this.config.pasteMarkdown ?? this.isMarkdownOutput;\n    if (shouldPasteMarkdown && this.markdownConverter) {\n      const html = event.clipboardData?.getData('text/html') ?? '';\n      const text = event.clipboardData?.getData('text/plain') ?? '';\n      if (!html && text) {\n        event.preventDefault();\n        const converted = this.markdownConverter.toHtml(text);\n        document.execCommand('insertHTML', false, converted);\n        return converted;\n      }\n    }\n\n    return undefined;\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      return;\n    }\n    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    }\n    this.exec();\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: string = this.modeVisual ? element.innerHTML : element.innerText;\n    if ((!html || html === '<br>')) {\n      html = '';\n    }\n    if (typeof this.onChange === 'function') {\n      const sanitized = this.sanitizeHtml(html);\n      const output = this.isMarkdownOutput\n        ? this.markdownConverter!.toMarkdown(sanitized)\n        : sanitized;\n      (this.onChange)(output);\n\n      if (this.contentChanged.observed) {\n        const event: {html: string; markdown?: string; text: string} = {\n          html: sanitized,\n          text: element.innerText,\n        };\n        if (this.markdownConverter) {\n          event.markdown = this.isMarkdownOutput\n            ? output\n            : this.markdownConverter.toMarkdown(sanitized);\n        }\n        this.contentChanged.emit(event);\n      }\n\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  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  registerOnChange(fn: any): void {\n    this.onChange = (e: string) => (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  // eslint-disable-next-line @typescript-eslint/no-explicit-any\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  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  writeValue(value: any): void {\n    if (!this.viewInitialized) {\n      this.pendingValue = value;\n      return;\n    }\n    this.applyValue(value);\n  }\n\n  private applyValue(value: any): void {\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    if (value && this.isMarkdownOutput) {\n      value = this.markdownConverter!.toHtml(value);\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    this.r.setProperty(this.textArea.nativeElement, 'innerHTML', this.sanitizeHtml(normalizedValue));\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    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    let oContent: any;\n    const editableElement = this.textArea.nativeElement;\n\n    if (bToSource) {\n      let sourceText: string;\n      if (this.isMarkdownOutput) {\n        sourceText = this.markdownConverter!.toMarkdown(\n          this.sanitizeHtml(editableElement.innerHTML)\n        );\n      } else {\n        sourceText = editableElement.innerHTML;\n      }\n\n      oContent = this.r.createText(sourceText);\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', this.isMarkdownOutput ? '#e8f5e9' : '#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      this.doc.execCommand('defaultParagraphSeparator', false, 'div');\n\n      this.modeVisual = false;\n      this.viewMode.emit(false);\n      oCode.focus();\n    } else {\n      const sourceContent = editableElement.innerText;\n\n      if (this.isMarkdownOutput) {\n        const html = this.markdownConverter!.toHtml(sourceContent);\n        this.r.setProperty(editableElement, 'innerHTML', this.sanitizeHtml(html));\n      } else {\n        const sanitized = this.sanitizeHtml(sourceContent);\n        this.r.setProperty(editableElement, 'innerHTML', sanitized);\n      }\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    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: Node[] = [];\n    while (a && a.id !== 'editor') {\n      els.unshift(a);\n      a = a.parentNode;\n    }\n\n    this.editorService.detectFormattingState(els, this.config.customClasses);\n  }\n\n  private configure() {\n    this.editorService.uploadUrl = this.config.uploadUrl ?? '';\n    this.editorService.uploadWithCredentials = this.config.uploadWithCredentials ?? false;\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]=\"$any(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, formattingState: this.editorService.formattingState }\"\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"],"mappings":"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"}