{"version":3,"file":"el-text-editor.mjs","sources":["../../../projects/el-text-editor/src/lib/el-text-editor.service.ts","../../../projects/el-text-editor/src/lib/el-text-editor.component.ts","../../../projects/el-text-editor/src/lib/el-text-editor.component.html","../../../projects/el-text-editor/src/lib/el-text-editor.module.ts","../../../projects/el-text-editor/src/public-api.ts","../../../projects/el-text-editor/src/el-text-editor.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\nexport class ElTextEditorService {\r\n\r\n  constructor() { }\r\n}\r\n","import { AfterViewInit, Component, Input, OnInit, Output, EventEmitter, forwardRef, ViewChild, ElementRef, Renderer2, OnChanges, SimpleChanges } from '@angular/core';\r\nimport { ControlValueAccessor, FormControl, NG_VALUE_ACCESSOR } from '@angular/forms';\r\n// import { MatDialog } from '@angular/material/dialog';\r\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\r\nimport { Router, ActivatedRoute } from '@angular/router';\r\nimport { NgxFullscreenDirective } from '@ultimate/ngx-fullscreen';\r\nimport * as XLSX from 'xlsx';\r\n// import { ImageEditorModalComponent } from '../modals/image-editor-modal/image-editor-modal.component';\r\nimport { compress, decompress } from 'lz-string';\r\n\r\n\r\n@Component({\r\n  selector: 'text-editor',\r\n  templateUrl: './el-text-editor.component.html',\r\n  styleUrls: ['./el-text-editor.component.scss'],\r\n  providers: [\r\n    {\r\n      provide: NG_VALUE_ACCESSOR,\r\n      useExisting: forwardRef(() => ElTextEditorComponent),\r\n      multi: true,\r\n    },\r\n  ],\r\n})\r\nexport class ElTextEditorComponent\r\n  implements ControlValueAccessor, AfterViewInit, OnChanges\r\n{\r\n  @Input() editorText: string = '';\r\n  @Input() editorFrom: any;\r\n  @Input() editorAction: any;\r\n  @Input() UserRole: any;\r\n  @Input() style: any;\r\n  @Input() disableToolbar: any;\r\n  @Input() placeHolder: any;\r\n  @Input() reportId: any;\r\n  @Input() backgroundImage: any;\r\n  @Input() toolbarMode: 'fixed' | 'bubble' | 'none' = 'fixed';\r\n  @Input() contentEditable: boolean = true; // Input for initial value\r\n  @Output() contentEditableChange: EventEmitter<boolean> =\r\n    new EventEmitter<boolean>(); // Output for changes\r\n  @Output() editorTextChange = new EventEmitter<string>();\r\n  @Output() editorActionResponse = new EventEmitter<any>();\r\n  @Output() editorTextClear = new EventEmitter<any>();\r\n  @Output() imageEdit = new EventEmitter<any>();\r\n  @Output() imageEdit2 = new EventEmitter<any>();\r\n  @Output() placeHolderRemove = new EventEmitter<any>();\r\n  @Output() isOpen = new EventEmitter<any>();\r\n  @Output() newImageAdded = new EventEmitter<any>();\r\n\r\n  @Input() value: string = '';\r\n\r\n  @ViewChild('textEditor') TextEditor!: ElementRef<Element>;\r\n  @ViewChild('fullscreen') fullscreen!: NgxFullscreenDirective;\r\n\r\n  sanitizedContent!: SafeHtml;\r\n\r\n  showToolbar = false;\r\n  toolbarTop = 0;\r\n  toolbarLeft = 0;\r\n\r\n  fonts = ['Arial', 'Courier New', 'Georgia', 'Times New Roman', 'Verdana'];\r\n  fontSizes = [10, 12, 14, 16, 18, 20, 24, 28, 32, 36];\r\n  currentListLevel: number = 0; // Track the current list level\r\n  listStyles: string[] = ['decimal', 'lower-alpha', 'lower-roman'];\r\n  selectedFont = 'Arial';\r\n  selectedFontSize = 14;\r\n  isTableSelected = false;\r\n  tableAdded = false;\r\n  selectedTable: HTMLTableElement | null = null;\r\n  isPlaceholderVisible = true;\r\n  selectedCell: HTMLTableCellElement | null = null;\r\n\r\n  isBoldActive: boolean = false;\r\n  isItalicActive: boolean = false;\r\n  isUnderlineActive: boolean = false;\r\n  isStrikethroughActive: boolean = false;\r\n  isSubscriptActive: boolean = false;\r\n  isSuperscriptActive: boolean = false;\r\n\r\n  selectedFormatBlock: string = 'normal';\r\n\r\n  selectedImage: HTMLImageElement | null = null;\r\n  imageEditUrl: string = '';\r\n  imagePositionX = 0;\r\n  imagePositionY = 0;\r\n  imageResizeStartX = 0;\r\n  imageResizeStartY = 0;\r\n  imageResizeStartWidth = 0;\r\n  imageResizeStartHeight = 0;\r\n  imageResizeDirection:\r\n    | 'topLeft'\r\n    | 'topRight'\r\n    | 'bottomLeft'\r\n    | 'bottomRight'\r\n    | null = null;\r\n\r\n  undoStack: string[] = [];\r\n  redoStack: string[] = [];\r\n  history: string[] = [];\r\n  historyIndex = -1;\r\n  // editorText1 = ``;\r\n  selectedTextColor: any;\r\n  onChange: any = () => {};\r\n  onTouched: any = () => {};\r\n  color: any = '#ddd';\r\n  colorFormControl!: FormControl;\r\n  backgroundColor: any;\r\n  selectedItemIndex: number | null = null;\r\n\r\n  parsedTable: { headers: string[]; rows: string[][] } | null = null;\r\n\r\n  isFullScreen: boolean = false;\r\n  currentCaretPosition: any;\r\n  userRole: any[] = [];\r\n  showEditButton: boolean = false;\r\n  tHeadBgColor: any;\r\n\r\n  constructor(\r\n    private router: Router,\r\n    private route: ActivatedRoute,\r\n    private renderer: Renderer2,\r\n    private sanitizer: DomSanitizer\r\n  ) {\r\n    this.getUserRoles();\r\n  }\r\n\r\n  themeMode() {\r\n    const clrMode = document.body.getAttribute('data-layout-color');\r\n    if (clrMode == 'dark') {\r\n      return '2px solid #403F4A !important';\r\n    } else {\r\n      return '2px solid #D0D0D0 !important';\r\n    }\r\n  }\r\n\r\n  themeModeClr() {\r\n    const clrMode = document.body.getAttribute('data-layout-color');\r\n    if (clrMode == 'dark') {\r\n      return '#fff !important';\r\n    } else {\r\n      return '#000 !important';\r\n    }\r\n  }\r\n\r\n  themeModeClrVerticalLine() {\r\n    const clrMode = document.body.getAttribute('data-layout-color');\r\n    if (clrMode == 'dark') {\r\n      return '2px solid #FFFFFF !important';\r\n    } else {\r\n      return '2px solid #D0D0D0 !important';\r\n    }\r\n  }\r\n\r\n  themeModeBgClr() {\r\n    const clrMode = document.body.getAttribute('data-layout-color');\r\n    if (clrMode == 'dark') {\r\n      return '#282828 !important';\r\n    } else {\r\n      return '#F3F3F3 !important';\r\n    }\r\n  }\r\n\r\n  themeModeBorderTop() {\r\n    const clrMode = document.body.getAttribute('data-layout-color');\r\n    if (clrMode == 'dark') {\r\n      return '2px solid #000 !important';\r\n    } else {\r\n      return '2px solid #fff !important';\r\n    }\r\n  }\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    if (changes['placeHolder']) {\r\n      this.insertAtCaret(this.placeHolder);\r\n    }\r\n\r\n    if (changes['reportId']) {\r\n      sessionStorage.setItem('reportId', this.reportId);\r\n    }\r\n\r\n    if (changes['UserRole']) {\r\n      this.getUserRoles();\r\n    }\r\n  }\r\n  ngAfterViewInit() {\r\n    this.initEditor();\r\n    this.checkPlaceholder();\r\n    this.setupHistory();\r\n    document.addEventListener('fullscreenchange', this.onFullscreenChange);\r\n  }\r\n\r\n  ngOnInit(): void {\r\n    this.init_Func(this.editorText);\r\n    document.addEventListener('selectionchange', () => {\r\n      this.checkActiveStates();\r\n      this.checkFormatBlock();\r\n    });\r\n    this.addClickListenerToImages();\r\n    this.addClickListenerToElements();\r\n    // this.route.queryParams.subscribe(params => {\r\n    //   const data = JSON.parse(params['data']);\r\n    //   if (data.editedIMG) {\r\n    //     const imgUrl = sessionStorage.getItem('editImageFromTemp');\r\n    //     if (imgUrl) {\r\n    //       this.replaceImageSrc(imgUrl, data.index.index)\r\n    //     }\r\n    //     sessionStorage.removeItem('editImageFromTemp');\r\n    //   }\r\n    // })\r\n  }\r\n\r\n  ngOnDestroy() {\r\n    // Cleanup the event listener when the component is destroyed\r\n    document.removeEventListener('fullscreenchange', this.onFullscreenChange);\r\n  }\r\n\r\n  IsOpen: boolean = false;\r\n\r\n  toggleFullscreen1() {\r\n    this.IsOpen = !this.IsOpen;\r\n    this.isOpen.emit(this.IsOpen);\r\n    if (this.IsOpen) {\r\n      this.fullscreen.enter(this.TextEditor.nativeElement);\r\n    } else {\r\n      this.fullscreen.exit();\r\n    }\r\n  }\r\n\r\n  private onFullscreenChange = () => {\r\n    if (!document.fullscreenElement) {\r\n      // When fullscreen mode is exited\r\n      this.IsOpen = false;\r\n      this.isOpen.emit(this.IsOpen);\r\n    }\r\n  };\r\n\r\n  // enterFullscreenVideo() {\r\n  //   console.log('event:', event);\r\n  //   const fullscreen = event;\r\n  //   this.isOpen = event;\r\n  //   if (fullscreen) {\r\n  //     this.fullscreen.enter(this.TextEditor.nativeElement);\r\n  //   } else {\r\n  //     this.fullscreen.exit()\r\n  //   }\r\n\r\n  // }\r\n\r\n  writeValue(value: any): void {\r\n    if (value !== undefined) {\r\n      this.editorText = value;\r\n      this.initEditor();\r\n      this.init_Func(this.editorText);\r\n    }\r\n  }\r\n\r\n  //  private addClickListenerToImages() {\r\n  //   const editor = document.getElementById('editor');\r\n  //   if (editor) {\r\n  //     editor.addEventListener('click', (event) => {\r\n  //       const target = event.target as HTMLElement;\r\n  //       if (target.tagName === 'IMG') {\r\n  //         this.selectedImage = target as HTMLImageElement;\r\n  //         this.imageEditUrl = this.selectedImage.src;\r\n\r\n  //         let container = this.selectedImage.parentElement;\r\n  //         if (!container || container.className !== 'image-container') {\r\n  //           container = document.createElement('div');\r\n  //           container.className = 'image-container';\r\n  //           container.style.position = 'relative';\r\n  //           container.style.display = 'inline-block';\r\n  //           this.selectedImage.parentNode?.insertBefore(container, this.selectedImage);\r\n  //           container.appendChild(this.selectedImage);\r\n  //         }\r\n  //         const existingButton = container.querySelector('.image-edit-button');\r\n  //         if (existingButton) {\r\n  //           existingButton.remove();\r\n  //         }\r\n\r\n  //         const button = document.createElement('button');\r\n  //         // button.textContent = 'Edit';\r\n  //         button.innerText = 'Edit Image';\r\n\r\n  //         button.className = 'image-edit-button btn btn-sm';\r\n  //         button.style.position = 'absolute';\r\n  //         button.style.top = '50%';\r\n  //         button.style.left = '50%';\r\n  //         button.style.transform = 'translate(-50%, -50%)';\r\n  //         button.style.zIndex = '1000';\r\n  //         button.style.backgroundColor = '#fff';\r\n  //         button.style.border = '2px solid #fff';\r\n  //         // button.style.padding = '10px';\r\n  //         button.style.color = '#313a46';\r\n  //         button.style.cursor = 'pointer';\r\n\r\n  //         button.addEventListener('click', (e) => {\r\n  //           e.stopPropagation();\r\n  //           this.editImage();\r\n  //         });\r\n\r\n  //         container.appendChild(button);\r\n  //       } else {\r\n  //         this.selectedImage = null;\r\n  //         this.selectedItemIndex = null;\r\n  //       }\r\n  //     });\r\n  //   }\r\n  // }\r\n  getUserRoles() {\r\n    this.userRole = this.UserRole;\r\n  }\r\n  // roleCheck() {\r\n  //   for (let i = 0; i < this.userRole.length; ++i) {\r\n  //     const roleName = []\r\n  //       roleName.push(this.userRole[i]?.name);\r\n  //     return this.userRole[i]?.name;\r\n  //   }\r\n  // }\r\n\r\n  roleCheck() {\r\n    let userRoleName: string[] = [];\r\n    for (let i = 0; i <= this.userRole.length; ++i) {\r\n      userRoleName.push(this.userRole[i]?.name);\r\n    }\r\n    return userRoleName;\r\n  }\r\n\r\n  // private addClickListenerToImages() {\r\n  //   const editor = document.getElementById('editor');\r\n  //   const roles = this.roleCheck(); // Get user roles dynamically\r\n  //   const isAdmin = roles.includes('Admin');\r\n  //   const isCreator = roles.includes('Creator');\r\n  //   const isApprover = roles.includes('Approver');\r\n\r\n  //   if (isCreator || isAdmin) {\r\n  //     if (editor) {\r\n  //     editor.addEventListener('click', (event) => {\r\n  //       const target = event.target as HTMLElement;\r\n  //       if (target.tagName === 'IMG') {\r\n  //         this.selectedImage = target as HTMLImageElement;\r\n  //         this.imageEditUrl = this.selectedImage.src;\r\n  //         let container = this.selectedImage.parentElement;\r\n  //         if (!container || container.className !== 'image-container') {\r\n  //           container = document.createElement('div');\r\n  //           container.className = 'image-container';\r\n  //           container.style.position = 'relative';\r\n  //           container.style.display = 'inline-block';\r\n  //           this.selectedImage.parentNode?.insertBefore(container, this.selectedImage);\r\n  //           container.appendChild(this.selectedImage);\r\n  //         }\r\n\r\n  //         const existingButton = container.querySelector('.image-edit-button');\r\n  //         if (existingButton) {\r\n  //           existingButton.remove();\r\n  //         }\r\n\r\n  //         const button = document.createElement('button');\r\n  //         button.textContent  = 'Edit Image';\r\n  //         button.className = 'image-edit-button btn btn-sm';\r\n  //         button.style.position = 'absolute';\r\n  //         button.style.top = '50%';\r\n  //         button.style.left = '50%';\r\n  //         button.style.transform = 'translate(-50%, -50%)';\r\n  //         button.style.zIndex = '1000';\r\n  //         button.style.backgroundColor = '#fff';\r\n  //         button.style.border = '2px solid #fff';\r\n  //         button.style.color = '#313a46';\r\n  //         button.style.cursor = 'pointer';\r\n  //         button.style.userSelect = 'none';\r\n\r\n  //         button.addEventListener('click', (e) => {\r\n  //           e.stopPropagation();\r\n  //           this.editImage();\r\n  //         });\r\n\r\n  //         container.appendChild(button);\r\n\r\n  //       } else {\r\n  //         this.selectedImage = null;\r\n  //         this.selectedItemIndex = null;\r\n  //         const buttons = document.querySelectorAll('.image-edit-button');\r\n  //         buttons.forEach(button => button.remove());\r\n  //       }\r\n  //     });\r\n  //   }\r\n  //   }\r\n  // }\r\n  private addClickListenerToImages() {\r\n    const editor = document.getElementById('editor');\r\n    const roles = this.roleCheck(); // Get user roles dynamically\r\n    const isAdmin = roles.includes('Admin');\r\n    const isCreator = roles.includes('Creator');\r\n\r\n    if (isCreator || isAdmin) {\r\n      if (editor) {\r\n        editor.addEventListener('click', (event) => {\r\n          const target = event.target as HTMLElement;\r\n          if (target.tagName === 'IMG') {\r\n            this.selectedImage = target as HTMLImageElement;\r\n            this.imageEditUrl = this.selectedImage.src;\r\n            const images = editor.getElementsByTagName('img');\r\n            for (let i = 0; i < images.length; i++) {\r\n              if (images[i] === this.selectedImage) {\r\n                this.selectedItemIndex = i;\r\n                break;\r\n              }\r\n            }\r\n            let container = this.selectedImage.parentElement;\r\n            if (!container || container.className !== 'image-container') {\r\n              container = document.createElement('div');\r\n              container.className = 'image-container';\r\n              container.style.position = 'relative';\r\n              container.style.display = 'inline-block';\r\n              this.selectedImage.parentNode?.insertBefore(\r\n                container,\r\n                this.selectedImage\r\n              );\r\n              container.appendChild(this.selectedImage);\r\n            }\r\n\r\n            const existingButton =\r\n              container.querySelector('.image-edit-button');\r\n            if (existingButton) {\r\n              existingButton.remove();\r\n            }\r\n\r\n            const button = document.createElement('button');\r\n            button.textContent = 'Edit Image';\r\n            button.className = 'image-edit-button btn btn-sm';\r\n            button.style.position = 'absolute';\r\n            button.style.top = '50%';\r\n            button.style.left = '50%';\r\n            button.style.transform = 'translate(-50%, -50%)';\r\n            button.style.zIndex = '1000';\r\n            button.style.backgroundColor = '#fff';\r\n            button.style.border = '2px solid #fff';\r\n            button.style.color = '#313a46';\r\n            button.style.cursor = 'pointer';\r\n            button.style.userSelect = 'none';\r\n\r\n            button.addEventListener('click', (e) => {\r\n              e.stopPropagation();\r\n              this.editImage();\r\n            });\r\n\r\n            container.appendChild(button);\r\n          } else {\r\n            this.removeEditButtons();\r\n          }\r\n        });\r\n\r\n        // Monitor editor content changes to handle image deletion\r\n        const observer = new MutationObserver(() => {\r\n          const buttons = editor.querySelectorAll('.image-edit-button');\r\n          buttons.forEach((button) => {\r\n            const container = button.parentElement;\r\n            if (container && !container.querySelector('img')) {\r\n              button.remove(); // Remove the button if the associated image is gone\r\n              container.remove(); // Clean up the container\r\n            }\r\n          });\r\n        });\r\n\r\n        // Observe changes in the editor\r\n        observer.observe(editor, { childList: true, subtree: true });\r\n      }\r\n    }\r\n  }\r\n\r\n  private removeEditButtons() {\r\n    const buttons = document.querySelectorAll('.image-edit-button');\r\n    buttons.forEach((button) => button.remove());\r\n    this.selectedImage = null;\r\n    this.selectedItemIndex = null;\r\n  }\r\n\r\n  // private addClickListenerToImages() {\r\n  // const editor = document.getElementById('editor');\r\n  // if (editor) {\r\n  //   editor.addEventListener('click', (event) => {\r\n  //     const target = event.target as HTMLElement;\r\n  //     if (target.tagName === 'IMG') {\r\n  //       this.selectedImage = target as HTMLImageElement;\r\n  //       this.imageEditUrl = this.selectedImage.src;\r\n\r\n  //       // Get the index of the selected image\r\n  //       const images = editor.getElementsByTagName('img');\r\n  //       for (let i = 0; i < images.length; i++) {\r\n  //         if (images[i] === this.selectedImage) {\r\n  //           this.selectedItemIndex = i;\r\n  //           break;\r\n  //         }\r\n  //       }\r\n\r\n  //       if (this.toolbarMode === 'bubble') {\r\n  //         this.onTextSelect();\r\n  //       }\r\n  //     } else {\r\n  //       this.selectedImage = null;\r\n  //       this.selectedItemIndex = null;\r\n  //     }\r\n  //   });\r\n  // }\r\n  // }\r\n\r\n  private addClickListenerToElements() {\r\n    const editor = document.getElementById('editor');\r\n    if (editor) {\r\n      editor.addEventListener('click', (event) => {\r\n        const target = event.target as HTMLElement;\r\n        if (target.tagName === 'IMG') {\r\n          this.selectedImage = target as HTMLImageElement;\r\n          this.imageEditUrl = this.selectedImage.src;\r\n          const images = editor.getElementsByTagName('img');\r\n          for (let i = 0; i < images.length; i++) {\r\n            if (images[i] === this.selectedImage) {\r\n              this.selectedItemIndex = i;\r\n              break;\r\n            }\r\n          }\r\n        } else {\r\n          this.selectedImage = null;\r\n        }\r\n        if (target.tagName === 'TD' || target.tagName === 'TH') {\r\n          this.selectedTable = target.closest('table') as HTMLTableElement;\r\n          const cells = this.selectedTable.getElementsByTagName(target.tagName);\r\n          for (let i = 0; i < cells.length; i++) {\r\n            if (cells[i] === target) {\r\n              this.selectedItemIndex = i;\r\n              break;\r\n            }\r\n          }\r\n        } else {\r\n          this.selectedTable = null;\r\n        }\r\n\r\n        if (\r\n          target.tagName === 'P' ||\r\n          target.tagName === 'SPAN' ||\r\n          target.tagName === 'DIV'\r\n        ) {\r\n          const paragraphs = editor.getElementsByTagName(target.tagName);\r\n          for (let i = 0; i < paragraphs.length; i++) {\r\n            if (paragraphs[i] === target) {\r\n              this.selectedItemIndex = i;\r\n              break;\r\n            }\r\n          }\r\n        }\r\n      });\r\n    }\r\n  }\r\n\r\n  replaceImageSrc(newSrc: string, index: number) {\r\n    const editor = document.getElementById('editor');\r\n\r\n    if (editor) {\r\n      editor.focus();\r\n      const images = editor.getElementsByTagName('IMG');\r\n      if (index >= 0) {\r\n        images[index].setAttribute('src', newSrc);\r\n      }\r\n    }\r\n  }\r\n\r\n  private initEditor() {\r\n    // Initialize editor content and listeners\r\n    const editor = document.getElementById('editor');\r\n\r\n    if (editor) {\r\n      editor.innerHTML = this.editorText;\r\n      editor.addEventListener('input', () => {\r\n        this.onModelChange(editor.innerHTML);\r\n      });\r\n    }\r\n    this.checkPlaceholder();\r\n  }\r\n\r\n  registerOnChange(fn: any): void {\r\n    this.onChange = fn;\r\n  }\r\n\r\n  registerOnTouched(fn: any): void {\r\n    this.onTouched = fn;\r\n  }\r\n\r\n  setDisabledState?(isDisabled: boolean): void {\r\n    // Handle the disabled state if necessary\r\n  }\r\n\r\n  onModelChange(value: any): void {\r\n    if (value) {\r\n      const VALUE = value;\r\n      this.editorText = VALUE;\r\n      this.onChange(VALUE);\r\n      this.editorTextChange.emit(VALUE);\r\n    } else {\r\n      this.selectedImage = null;\r\n    }\r\n  }\r\n\r\n  applyImageStyles(content: string): string {\r\n    const div = document.createElement('div');\r\n    div.innerHTML = content;\r\n    const images = div.querySelectorAll('img');\r\n    images.forEach((img) => {\r\n      if (img.style.maxWidth >= '700px') {\r\n        img.style.maxWidth = '700px';\r\n        // img.width = 300;\r\n        img.style.height = 'auto';\r\n      } else {\r\n        img.style.maxWidth = '100%';\r\n        img.style.height = 'auto';\r\n      }\r\n    });\r\n    return div.innerHTML;\r\n  }\r\n\r\n  // init_Func(html: any) {\r\n  //   if (html) {\r\n  //     let editor = document.getElementById('editor');\r\n  //     if (editor) {\r\n  //       editor.focus()\r\n  //       editor.innerHTML = html;\r\n  //       this.sanitizedContent = this.sanitizer.bypassSecurityTrustHtml(this.applyImageStyles(html));\r\n  //       editor.innerHTML = this.sanitizedContent as string;\r\n  //       editor.addEventListener('input', () => {\r\n  //         if (editor) {\r\n  //           editor.focus()\r\n  //           this.onModelChange(editor.innerHTML);\r\n  //         }\r\n  //       });\r\n  //     }\r\n  //   } else {\r\n  //     this.selectedImage = null;\r\n  //   }\r\n  // }\r\n\r\n  //   init_Func(html: any) {\r\n  //   if (html) {\r\n  //     let editor = document.getElementById('editor');\r\n  //     if (editor) {\r\n  //       // Initialize the editor with sanitized content\r\n\r\n  //       this.setEditorContent(html);\r\n\r\n  //       // Set up a MutationObserver to handle content changes\r\n  //       this.setupMutationObserver(editor);\r\n\r\n  //       // Move the caret to the end after initial content setup\r\n  //       this.moveCaretToEnd(editor);\r\n\r\n  //       // Track caret position on mouse click\r\n  //       editor.addEventListener('click', () => {\r\n  //         if (editor) {  // Ensure editor is not null\r\n  //           // this.trackCaretPosition(editor);\r\n  //         }\r\n  //       });\r\n  //     }\r\n  //   } else {\r\n  //     this.selectedImage = null;\r\n  //   }\r\n  // }\r\n\r\n  // private setEditorContent(html: string) {\r\n  //   let editor = document.getElementById('editor');\r\n  //   if (editor) {\r\n  //     // Sanitize and apply styles to the HTML\r\n  //     this.sanitizedContent = this.sanitizer.bypassSecurityTrustHtml(this.applyImageStyles(html));\r\n  //     editor.innerHTML = this.sanitizedContent as string;\r\n  //   }\r\n  // }\r\n\r\n  // private setupMutationObserver(editor: HTMLElement) {\r\n  //   const observer = new MutationObserver(() => {\r\n  //     // Update model with the current content\r\n  //     this.onModelChange(editor.innerHTML);\r\n  //   });\r\n\r\n  //   observer.observe(editor, { childList: true, subtree: true, characterData: true });\r\n  // }\r\n\r\n  // This function tracks the caret position based on the mouse click\r\n  private trackCaretPosition(editor: HTMLElement) {\r\n    const selection = window.getSelection();\r\n    if (selection && selection.rangeCount > 0) {\r\n      const range = selection.getRangeAt(0);\r\n      const startNode = range.startContainer;\r\n      const startOffset = range.startOffset;\r\n\r\n      // You can use this information to insert content or perform actions based on the caret position\r\n      // Example: Save the current caret position for future use\r\n      this.currentCaretPosition = { node: startNode, offset: startOffset };\r\n    }\r\n  }\r\n\r\n  // Method to get caret position and insert new data\r\n  private insertAtCaret(newData: string): void {\r\n    const selection = window.getSelection();\r\n\r\n    if (selection && selection.rangeCount > 0) {\r\n      // Get the current range (caret position)\r\n      const range = selection.getRangeAt(0);\r\n\r\n      // Create a document fragment to insert (allows handling HTML strings)\r\n      const fragment = document.createDocumentFragment();\r\n      const tempDiv = document.createElement('div');\r\n      tempDiv.innerHTML = newData;\r\n\r\n      // Append the new data to the fragment (supports HTML insertion)\r\n      while (tempDiv.firstChild) {\r\n        fragment.appendChild(tempDiv.firstChild);\r\n      }\r\n\r\n      // Insert the fragment at the caret position\r\n      range.deleteContents(); // Remove any selected content if applicable\r\n      range.insertNode(fragment);\r\n\r\n      // Move the caret after the inserted content\r\n      const lastChild = fragment.lastChild;\r\n\r\n      if (lastChild) {\r\n        range.setStartAfter(lastChild);\r\n        range.setEndAfter(lastChild);\r\n        selection.removeAllRanges();\r\n        selection.addRange(range);\r\n      }\r\n      let editor = document.getElementById('editor');\r\n      if (editor) {\r\n        this.moveCaretToEnd(editor);\r\n      }\r\n\r\n      this.placeHolderRemove.emit();\r\n    }\r\n  }\r\n\r\n  //   // Move caret to the end of the editor content\r\n  //   private moveCaretToEnd(editor: HTMLElement) {\r\n  //     const selection = window.getSelection();\r\n  //     const range = document.createRange();\r\n\r\n  //     if (editor.lastChild) {\r\n  //       range.selectNodeContents(editor);\r\n  //       range.collapse(false); // Collapse to the end\r\n  //       selection?.removeAllRanges();\r\n  //       selection?.addRange(range);\r\n\r\n  //     }\r\n  //   }\r\n\r\n  init_Func(html: any) {\r\n    if (html) {\r\n      let editor = document.getElementById('editor');\r\n      if (editor) {\r\n        // Initialize the editor with sanitized content\r\n        this.setEditorContent(html);\r\n\r\n        // Set up a MutationObserver to handle content changes\r\n        this.setupMutationObserver(editor);\r\n\r\n        // Move the caret to the end after initial content setup\r\n        this.moveCaretToEnd(editor);\r\n        //  Track caret position on mouse click\r\n        editor.addEventListener('click', () => {\r\n          if (editor) {\r\n            // Ensure editor is not null\r\n            this.trackCaretPosition(editor);\r\n          }\r\n        });\r\n      }\r\n    } else {\r\n      this.selectedImage = null;\r\n    }\r\n  }\r\n\r\n  private setEditorContent(html: string) {\r\n    let editor = document.getElementById('editor');\r\n    if (editor) {\r\n      // Sanitize and apply styles to the HTML\r\n      this.sanitizedContent = this.sanitizer.bypassSecurityTrustHtml(\r\n        this.applyImageStyles(html)\r\n      );\r\n      editor.innerHTML = this.sanitizedContent as string;\r\n    }\r\n  }\r\n\r\n  private setupMutationObserver(editor: HTMLElement) {\r\n    const observer = new MutationObserver(() => {\r\n      // Move the caret to the end after content changes\r\n      // this.moveCaretToEnd(editor);\r\n      // Update model with the current content\r\n      this.onModelChange(editor.innerHTML);\r\n    });\r\n\r\n    observer.observe(editor, {\r\n      childList: true,\r\n      subtree: true,\r\n      characterData: true,\r\n    });\r\n  }\r\n\r\n  private moveCaretToEnd(editor: HTMLElement) {\r\n    const selection = window.getSelection();\r\n    const range = document.createRange();\r\n\r\n    if (editor.lastChild) {\r\n      range.selectNodeContents(editor);\r\n      range.collapse(false); // Collapse to the end\r\n      selection?.removeAllRanges();\r\n      selection?.addRange(range);\r\n    }\r\n  }\r\n\r\n  //   init_Func(html: any) {\r\n  //   if (html) {\r\n  //     let editor = document.getElementById('editor');\r\n  //     if (editor) {\r\n  //       editor.focus();\r\n  //       editor.innerHTML = html;\r\n\r\n  //       // Sanitize the content and apply styles\r\n  //       this.sanitizedContent = this.sanitizer.bypassSecurityTrustHtml(this.applyImageStyles(html));\r\n  //       editor.innerHTML = this.sanitizedContent as string;\r\n\r\n  //       // Place the caret at the end of the content\r\n  //       const range = document.createRange();\r\n  //       const selection = window.getSelection();\r\n\r\n  //       if (editor.lastChild) {\r\n  //         // Set the range at the end of the editor's content\r\n  //         range.selectNodeContents(editor);\r\n  //         range.collapse(false); // collapse to the end\r\n  //         selection?.removeAllRanges();\r\n  //         selection?.addRange(range);\r\n  //       }\r\n\r\n  //       editor.addEventListener('input', () => {\r\n  //         if (editor) {\r\n  //           this.onModelChange(editor.innerHTML);\r\n\r\n  //           // Ensure the caret remains at the end after new content is added\r\n  //           const range = document.createRange();\r\n  //           const selection = window.getSelection();\r\n\r\n  //           if (editor.lastChild) {\r\n  //             range.selectNodeContents(editor);\r\n  //             range.collapse(false); // collapse to the end\r\n  //             selection?.removeAllRanges();\r\n  //             selection?.addRange(range);\r\n  //           }\r\n  //         }\r\n  //       });\r\n  //     }\r\n  //   } else {\r\n  //     this.selectedImage = null;\r\n  //   }\r\n  // }\r\n\r\n  // format(command: string, value?: any) {\r\n  //   const editor = document.getElementById('editor');\r\n  //   if (editor) {\r\n  //     editor.focus();\r\n  //     if (command === 'subscript') {\r\n  //       this.isSubscriptActive = !this.isSubscriptActive;\r\n  //       document.execCommand('subscript', false, '');\r\n  //     } else if (command === 'superscript') {\r\n  //       this.isSuperscriptActive = !this.isSuperscriptActive;\r\n  //       document.execCommand('superscript', false, '');;\r\n  //     } else {\r\n  //       document.execCommand(command, false, value ?? '');\r\n  //       if (value) {\r\n  //         const tag = value.toLowerCase().replace(/[<>]/g, '')\r\n  //         this.selectedFormatBlock = this.formatBlockDecode(tag);\r\n  //       }\r\n  //     }\r\n  //   }\r\n  //    this.checkActiveStates();\r\n  //    this.checkFormatBlock();\r\n  // }\r\n\r\n  getClosestListItem(node: Node): HTMLElement | null {\r\n    while (node && node !== document) {\r\n      if (node.nodeName === 'LI') {\r\n        return node as HTMLElement;\r\n      }\r\n      node = node.parentNode!;\r\n    }\r\n    return null;\r\n  }\r\n\r\n  // Get the current nesting level of a list item\r\n  getListItemLevel(listItem: HTMLElement): number {\r\n    let level = 0;\r\n    let parent = listItem.parentElement;\r\n\r\n    while (parent) {\r\n      if (parent.nodeName === 'UL' || parent.nodeName === 'OL') {\r\n        let grandparent = parent.parentElement;\r\n        if (grandparent && grandparent.nodeName === 'LI') {\r\n          level++;\r\n          parent = grandparent.parentElement;\r\n        } else {\r\n          break;\r\n        }\r\n      } else {\r\n        parent = parent.parentElement;\r\n      }\r\n    }\r\n\r\n    return level;\r\n  }\r\n\r\n  // Increase the list level (Tab key)\r\n  increaseListLevel(listItem: HTMLElement) {\r\n    const currentLevel = this.getListItemLevel(listItem);\r\n    if (currentLevel >= this.listStyles.length - 1) return;\r\n    const parentList = listItem.parentElement as HTMLElement;\r\n    const previousSibling = listItem.previousElementSibling as HTMLElement;\r\n    if (!parentList || !previousSibling) return;\r\n    const isOrderedList = parentList.tagName === 'OL';\r\n    let sublist = previousSibling.querySelector('ol, ul') as HTMLElement;\r\n    if (!sublist) {\r\n      sublist = document.createElement(isOrderedList ? 'ol' : 'ul');\r\n      previousSibling.appendChild(sublist);\r\n    }\r\n    // Apply appropriate list styles\r\n    if (isOrderedList) {\r\n      sublist.style.listStyleType = this.listStyles[currentLevel + 1]; // For Ordered list styles\r\n    } else {\r\n      const unorderedStyles = ['disc', 'square', 'circle']; //For Unordered list styles\r\n      sublist.style.listStyleType =\r\n        unorderedStyles[Math.min(currentLevel + 1, unorderedStyles.length - 1)];\r\n    }\r\n\r\n    sublist.appendChild(listItem);\r\n\r\n    if (isOrderedList) {\r\n      listItem.style.listStyleType = this.listStyles[currentLevel + 1];\r\n    } else {\r\n      listItem.style.listStyleType = sublist.style.listStyleType;\r\n    }\r\n\r\n    const selection = window.getSelection()!;\r\n    const range = document.createRange();\r\n    range.selectNodeContents(listItem);\r\n    range.collapse(false);\r\n    selection.removeAllRanges();\r\n    selection.addRange(range);\r\n  }\r\n\r\n  // Decrease the list level (Shift+Tab key)\r\n  decreaseListLevel(listItem: HTMLElement) {\r\n    const currentLevel = this.getListItemLevel(listItem);\r\n    if (currentLevel === 0) return;\r\n    const parentList = listItem.parentElement as HTMLElement;\r\n    const grandparentListItem = parentList?.parentElement as HTMLElement;\r\n    if (\r\n      !parentList ||\r\n      !grandparentListItem ||\r\n      grandparentListItem.nodeName !== 'LI'\r\n    ) {\r\n      return;\r\n    }\r\n    const grandparentList = grandparentListItem.parentElement as HTMLElement;\r\n    if (\r\n      !grandparentList ||\r\n      (grandparentList.nodeName !== 'UL' && grandparentList.nodeName !== 'OL')\r\n    ) {\r\n      return;\r\n    }\r\n    grandparentList.insertBefore(\r\n      listItem,\r\n      grandparentListItem.nextElementSibling\r\n    );\r\n    if (!parentList.querySelector('li')) {\r\n      grandparentListItem.removeChild(parentList);\r\n    }\r\n    const isOrderedList = grandparentList.nodeName === 'OL';\r\n    const unorderedStyles = ['disc', 'square', 'circle'];\r\n    if (isOrderedList) {\r\n      listItem.style.listStyleType = this.listStyles[currentLevel - 1];\r\n    } else {\r\n      listItem.style.listStyleType =\r\n        unorderedStyles[Math.min(currentLevel - 1, unorderedStyles.length - 1)];\r\n    }\r\n\r\n    const selection = window.getSelection()!;\r\n    const range = document.createRange();\r\n    range.selectNodeContents(listItem);\r\n    range.collapse(false);\r\n    selection.removeAllRanges();\r\n    selection.addRange(range);\r\n  }\r\n\r\n  // Update the style of the current list item\r\n  updateCurrentListItemStyle(style: string) {\r\n    const selection = window.getSelection();\r\n    if (!selection || selection.rangeCount === 0) return;\r\n\r\n    const range = selection.getRangeAt(0);\r\n    const listItem = this.getClosestListItem(range.startContainer);\r\n    console.log('listitem', listItem);\r\n\r\n    if (listItem) {\r\n      let parentList = listItem.parentElement;\r\n      if (\r\n        parentList &&\r\n        (parentList.nodeName === 'OL' || parentList.nodeName === 'UL')\r\n      ) {\r\n        (parentList as HTMLElement).style.listStyleType = style;\r\n      }\r\n    }\r\n  }\r\n\r\n  format(command: string, value?: any) {\r\n    const editor = document.getElementById('editor');\r\n    if (editor) {\r\n      editor.focus();\r\n      if (command === 'subscript') {\r\n        this.isSubscriptActive = !this.isSubscriptActive;\r\n        document.execCommand('subscript', false, '');\r\n      } else if (command === 'superscript') {\r\n        this.isSuperscriptActive = !this.isSuperscriptActive;\r\n        document.execCommand('superscript', false, '');\r\n      } else if (command === 'insertOrderedList') {\r\n        document.execCommand(command, false, '');\r\n        // Apply the appropriate style for the current level\r\n        this.updateCurrentListItemStyle(this.listStyles[this.currentListLevel]);\r\n      } else {\r\n        document.execCommand(command, false, value ?? '');\r\n        if (value) {\r\n          const tag = value.toLowerCase().replace(/[<>]/g, '');\r\n          this.selectedFormatBlock = this.formatBlockDecode(tag);\r\n        }\r\n      }\r\n    }\r\n    this.checkActiveStates();\r\n    this.checkFormatBlock();\r\n  }\r\n\r\n  checkActiveStates() {\r\n    this.isBoldActive = document.queryCommandState('bold');\r\n    this.isItalicActive = document.queryCommandState('italic');\r\n    this.isUnderlineActive = document.queryCommandState('underline');\r\n    this.isStrikethroughActive = document.queryCommandState('strikethrough');\r\n    this.isSubscriptActive = document.queryCommandState('subscript');\r\n    this.isSuperscriptActive = document.queryCommandState('superscript');\r\n  }\r\n\r\n  checkFormatBlock() {\r\n    const editor = document.getElementById('editor');\r\n    if (editor) {\r\n      const formatBlock = document.queryCommandValue('formatBlock');\r\n      this.selectedFormatBlock = this.formatBlockDecode(formatBlock);\r\n      // You can further handle the formatBlock value as needed\r\n    }\r\n  }\r\n\r\n  formatBlockDecode(data: string): any {\r\n    switch (data) {\r\n      case 'h1':\r\n        return 'heading 1';\r\n        break;\r\n      case 'h2':\r\n        return 'heading 2';\r\n        break;\r\n      case 'h3':\r\n        return 'heading 3';\r\n        break;\r\n      case 'h4':\r\n        return 'heading 4';\r\n        break;\r\n      case 'h5':\r\n        return 'heading 5';\r\n        break;\r\n      case 'h6':\r\n        return 'heading 6';\r\n        break;\r\n      case 'p':\r\n        return 'normal';\r\n        break;\r\n      default:\r\n        return 'normal';\r\n        break;\r\n    }\r\n  }\r\n\r\n  changeFont(event: any) {\r\n    this.selectedFont = event;\r\n    document.execCommand('fontName', false, this.selectedFont);\r\n  }\r\n\r\n  insertCodeBlock() {\r\n    const code = `\r\n      <pre style=\"font-size: 12px;\r\n                  color: white;\r\n                  background-color: black;\r\n                  overflow-x: auto;\r\n                  margin-bottom: 5px;\r\n                  margin-top: 5px;\r\n                  padding: 5px 10px;\">\r\n        <code style=\"display: block;\r\n                     white-space: pre-wrap;\r\n                     height: auto;\r\n                     font-family: Menlo, Monaco, Consolas, 'Courier New', monospace;\r\n                     font-size: 14px;\" class=\"language-html\">Insert code here...</code>\r\n      </pre>\r\n    `;\r\n    document.execCommand('insertHTML', false, code);\r\n  }\r\n\r\n  // changeFontSize(event: any) {\r\n  //   document.execCommand('fontSize', false, '7');\r\n  //   let editor = document.getElementById('editor');\r\n  //   if (editor) {\r\n  //     let fontElements = editor.getElementsByTagName('font');\r\n  //     for (let i = 0; i < fontElements.length; i++) {\r\n  //       if (fontElements[i].size == \"7\") {\r\n  //         fontElements[i].removeAttribute(\"size\");\r\n  //         fontElements[i].style.fontSize = this.selectedFontSize + 'px';\r\n  //       }\r\n  //     }\r\n  //   }\r\n  // }\r\n  changeFontSize(event: any) {\r\n    const selectedText = window.getSelection();\r\n\r\n    if (selectedText && selectedText.rangeCount > 0) {\r\n      const range = selectedText.getRangeAt(0);\r\n      const span = document.createElement('span');\r\n      span.style.fontSize = this.selectedFontSize + 'px';\r\n      range.surroundContents(span);\r\n    }\r\n  }\r\n\r\n  addLink() {\r\n    let url = prompt('Enter the link here: ', 'http://');\r\n    if (url) {\r\n      document.execCommand('createLink', false, url);\r\n    }\r\n  }\r\n\r\n  insertsImage() {\r\n    const editor = document.getElementById('editor');\r\n    if (editor) {\r\n      editor.focus();\r\n      let imageInput = document.getElementById(\r\n        'imageInput'\r\n      ) as HTMLInputElement;\r\n      if (imageInput) {\r\n        imageInput.click();\r\n      }\r\n    }\r\n  }\r\n\r\n  // handleImageUpload(event: any) {\r\n  //   const file = event.target.files[0];\r\n  //   if (file) {\r\n  //     const reader = new FileReader();\r\n  //     reader.onload = (e: any) => {\r\n  //       const img = new Image();\r\n  //       img.src = e.target.result;\r\n  //       img.onload = () => {\r\n  //         // Create the HTML string with the exact width and height\r\n  //         const imgHTML = `<img src=\"${img.src}\" width=\"${794}\" >`;\r\n  //         // Insert the image into the editor\r\n  //         document.execCommand('insertHTML', false, imgHTML);\r\n  //       };\r\n  //     };\r\n  //     reader.readAsDataURL(file);\r\n  //   }\r\n  // }\r\n\r\n  handleImageUpload(event: any) {\r\n    const file = event.target.files[0];\r\n    const editorElement = document.getElementById('editor'); // Reference to the editor\r\n\r\n    if (file && editorElement) {\r\n      const editorWidth = editorElement.offsetWidth; // Get the editor's width\r\n      const reader = new FileReader();\r\n\r\n      reader.onload = (e: any) => {\r\n        const img = new Image();\r\n        img.src = e.target.result;\r\n\r\n        img.onload = () => {\r\n          const imgWidth = img.width;\r\n\r\n          // If the image width exceeds the editor's width, fit it to the editor\r\n          const imgHTML =\r\n            imgWidth > editorWidth\r\n              ? `<img src=\"${\r\n                  img.src\r\n                }\" style=\" max-width: ${700}px; height: auto;\">`\r\n              : `<img src=\"${img.src}\" style=\"width: ${imgWidth}px; height: auto;\">`;\r\n          this.newImageAdded.emit();\r\n          // Insert the image into the editor\r\n          document.execCommand('insertHTML', false, imgHTML);\r\n        };\r\n      };\r\n\r\n      reader.readAsDataURL(file);\r\n    }\r\n  }\r\n\r\n  // addTable() {\r\n  //   const tableWidth = 825; // Table width in pixels\r\n  //   const cols = 3; // Number of columns\r\n  //   const cellMinWidth = tableWidth / cols; // Calculate minimum width for each cell\r\n\r\n  //   let table = `<br /><table style=\"width: ${tableWidth}px;\">`;\r\n  //   for (let i = 0; i < 3; i++) { // Number of rows\r\n  //     table += '<tr >';\r\n  //     for (let j = 0; j < cols; j++) {\r\n  //       table += `<td style=\" word-wrap: break-word; word-break: break-all; white-space: normal; min-width: ${cellMinWidth}px;\">&nbsp;</td>`;\r\n  //     }\r\n  //     table += '</tr>';\r\n  //   }\r\n  //     table += '</table><br/ >';\r\n  //     // document.execCommand('insertHTML', false, table);\r\n  //     const editor = document.getElementById('editor');\r\n  //   if (editor) {\r\n  //     editor.focus();\r\n  //     document.execCommand('insertHTML', false, table);\r\n  //   }\r\n  //   this.tableAdded = true;\r\n  //   this.checkTableSelection();\r\n  // }\r\n\r\n  // handleTabKey(event: any) {\r\n  //   if (event.key === \"Tab\") {\r\n  //     event.preventDefault(); // Stop default tabbing behavior\r\n  //     const selection = window.getSelection();\r\n  //     if (!selection || selection.rangeCount === 0) return;\r\n\r\n  //     const range = selection.getRangeAt(0);\r\n  //     const tabNode = document.createElement(\"span\"); // Create a span element for the tab space\r\n  //     tabNode.innerHTML = \"&nbsp;&nbsp;&nbsp;&nbsp;\"; // Four non-breaking spaces to mimic tab\r\n\r\n  //     range.deleteContents(); // Remove any selected text\r\n  //     range.insertNode(tabNode); // Insert the tab space as span\r\n  //     range.setStartAfter(tabNode); // Move cursor after the inserted span\r\n  //     range.setEndAfter(tabNode);\r\n  //     selection.removeAllRanges();\r\n  //     selection.addRange(range);\r\n  //   }\r\n  // }\r\n\r\n  // handleTabKey(event: KeyboardEvent) {\r\n  //   if (event.key === \"Tab\") {\r\n  //     event.preventDefault(); // Prevent default tab behavior\r\n\r\n  //     const editor = document.getElementById(\"editor\");\r\n  //     if (!editor) return;\r\n\r\n  //     const selection = window.getSelection();\r\n  //     if (!selection || selection.rangeCount === 0) return;\r\n\r\n  //     const range = selection.getRangeAt(0);\r\n  //     const listItem = this.getClosestListItem(range.startContainer);\r\n\r\n  //     if (listItem) {\r\n  //       // If inside a list item, handle multi-level list indentation\r\n  //       if (event.shiftKey) {\r\n  //         this.decreaseListLevel(listItem);\r\n  //       } else {\r\n  //         this.increaseListLevel(listItem);\r\n  //       }\r\n  //     } else {\r\n  //       // If outside a list item, insert a tab space\r\n  //       const tabNode = document.createElement(\"span\");\r\n  //       tabNode.innerHTML = \"&nbsp;&nbsp;&nbsp;&nbsp;\";\r\n\r\n  //       range.deleteContents();\r\n  //       range.insertNode(tabNode);\r\n  //       range.setStartAfter(tabNode);\r\n  //       range.setEndAfter(tabNode);\r\n  //       selection.removeAllRanges();\r\n  //       selection.addRange(range);\r\n  //     }\r\n  //   }\r\n  // }\r\n\r\n  handleTabKey(event: KeyboardEvent) {\r\n    if (event.key === 'Tab') {\r\n      event.preventDefault(); // Prevent default tab behavior\r\n\r\n      const editor = document.getElementById('editor');\r\n      if (!editor) return;\r\n\r\n      const selection = window.getSelection();\r\n      if (!selection || selection.rangeCount === 0) return;\r\n\r\n      const range = selection.getRangeAt(0);\r\n      const listItem = this.getClosestListItem(range.startContainer);\r\n\r\n      if (listItem) {\r\n        // If inside a list item, handle multi-level list indentation\r\n        if (event.shiftKey) {\r\n          this.decreaseListLevel(listItem);\r\n        } else {\r\n          this.increaseListLevel(listItem);\r\n        }\r\n      } else {\r\n        // Check if the cursor is inside a table cell\r\n        const currentCell = this.getClosestTableCell(range.startContainer);\r\n        if (currentCell) {\r\n          this.handleTabInTable(currentCell, event.shiftKey);\r\n        } else {\r\n          // If outside a list item and not in a table, insert a tab space\r\n          const tabNode = document.createElement('span');\r\n          tabNode.innerHTML = '&nbsp;&nbsp;&nbsp;&nbsp;';\r\n\r\n          range.deleteContents();\r\n          range.insertNode(tabNode);\r\n          range.setStartAfter(tabNode);\r\n          range.setEndAfter(tabNode);\r\n          selection.removeAllRanges();\r\n          selection.addRange(range);\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  getClosestTableCell(node: Node): HTMLTableCellElement | null {\r\n    while (node && node !== document) {\r\n      if (node.nodeName === 'TD' || node.nodeName === 'TH') {\r\n        return node as HTMLTableCellElement;\r\n      }\r\n      node = node.parentNode!;\r\n    }\r\n    return null;\r\n  }\r\n\r\n  handleTabInTable(currentCell: HTMLTableCellElement, isShiftPressed: boolean) {\r\n    const table = currentCell.closest('table');\r\n    if (!table) return;\r\n\r\n    const rows = Array.from(table.rows);\r\n    const currentRow = currentCell.closest('tr');\r\n    if (!currentRow) return;\r\n\r\n    const cells = Array.from(currentRow.cells);\r\n    const currentCellIndex = cells.indexOf(currentCell);\r\n\r\n    let nextCell: HTMLTableCellElement | null = null;\r\n\r\n    if (isShiftPressed) {\r\n      // Move to the previous cell\r\n      if (currentCellIndex > 0) {\r\n        nextCell = cells[currentCellIndex - 1];\r\n      } else {\r\n        // Move to the last cell of the previous row\r\n        const prevRow =\r\n          currentRow.previousElementSibling as HTMLTableRowElement;\r\n        if (prevRow) {\r\n          nextCell = prevRow.cells[prevRow.cells.length - 1];\r\n        }\r\n      }\r\n    } else {\r\n      // Move to the next cell\r\n      if (currentCellIndex < cells.length - 1) {\r\n        nextCell = cells[currentCellIndex + 1];\r\n      } else {\r\n        // Move to the first cell of the next row\r\n        const nextRow = currentRow.nextElementSibling as HTMLTableRowElement;\r\n        if (nextRow) {\r\n          nextCell = nextRow.cells[0];\r\n        } else {\r\n          // If no next row exists, call addRow() to add a new row\r\n          this.addRow();\r\n          const newRow = table.rows[table.rows.length - 1];\r\n          nextCell = newRow.cells[0];\r\n        }\r\n      }\r\n    }\r\n\r\n    if (nextCell) {\r\n      // Move the cursor to the next cell\r\n      const range = document.createRange();\r\n      range.selectNodeContents(nextCell);\r\n      range.collapse(true); // Collapse the range to the start of the cell\r\n\r\n      const selection = window.getSelection();\r\n      if (selection) {\r\n        selection.removeAllRanges();\r\n        selection.addRange(range);\r\n      }\r\n    }\r\n  }\r\n  //   addTable() {\r\n  //   const tableWidth = 825; // Table width in pixels\r\n  //   const cols = 3; // Number of columns\r\n  //   const cellMinWidth = tableWidth / cols; // Calculate minimum width for each cell\r\n\r\n  //   let table = `<br /><table style=\"width: ${tableWidth}px;\">`;\r\n  //   for (let i = 0; i < 3; i++) { // Number of rows\r\n  //     table += `<tr style=\"border-bottom: ${this.themeModeClrVerticalLineForTable()}\">`; // Add border-bottom to the row\r\n  //     for (let j = 0; j < cols; j++) {\r\n  //       table += `<td style=\"word-wrap: break-word; word-break: break-all; white-space: normal; min-width: ${cellMinWidth}px;\">&nbsp;</td>`;\r\n  //     }\r\n  //     table += '</tr>';\r\n  //   }\r\n  //   table += '</table><br/>';\r\n\r\n  //   const editor = document.getElementById('editor');\r\n  //   if (editor) {\r\n  //     editor.focus();\r\n  //     document.execCommand('insertHTML', false, table);\r\n  //   }\r\n\r\n  //   this.tableAdded = true;\r\n  //   this.checkTableSelection();\r\n  // }\r\n  // addTable() {\r\n  //   const tableWidth = 825;\r\n  //   const cols = 3;\r\n  //   const cellMinWidth = tableWidth / cols;\r\n\r\n  //   let table = `<br /><table id=\"customTable\" style=\"width: ${tableWidth}px; border-collapse: collapse;\">`;\r\n\r\n  //   table += `<tbody>`;\r\n  //   table += `<tr id=\"tableHeaderRow\" style=\"border-bottom: ${this.themeModeClrVerticalLineForTable()};\" (click)=\"checkTableSelection()\">`;\r\n  //   for (let j = 0; j < cols; j++) {\r\n  //     table += `<td class=\"header-cell\"\r\n  //               style=\"border-top: 2px solid black;\r\n  //                      font-weight: bold;\r\n  //                      text-align: start;\r\n  //                      word-wrap: break-word;\r\n  //                      word-break: break-all;\r\n  //                      white-space: normal;\r\n  //                      min-width: ${cellMinWidth}px;\r\n  //                      background-color: inherit !important;\r\n  //                     //  pointer-events: none !important;\r\n  //                      display: table-cell !important;\r\n  //                      position: static !important;\r\n  // height:28px;\"></td>`;\r\n  //   }\r\n  //   table += `</tr>`;\r\n\r\n  //   for (let i = 0; i < 3; i++) {\r\n  //     table += `<tr style=\"border-bottom: ${this.themeModeClrVerticalLineForTable()}\">`;\r\n  //     for (let j = 0; j < cols; j++) {\r\n  //       table += `<td style=\"word-wrap: break-word;\r\n  //                         word-break: break-all;\r\n  //                         white-space: normal;\r\n  //                         min-width: ${cellMinWidth}px;\r\n  //                         display: table-cell !important;\r\n  //                         position: static !important;\">&nbsp;</td>`;\r\n  //     }\r\n  //     table += \"</tr>\";\r\n  //   }\r\n  //   table += `</tbody></table><br/>`;\r\n\r\n  //   const editor = document.getElementById(\"editor\");\r\n  //   if (editor) {\r\n  //     editor.focus();\r\n  //     document.execCommand(\"insertHTML\", false, table);\r\n  //   }\r\n\r\n  //   this.tableAdded = true;\r\n  //   this.checkTableSelection();\r\n\r\n  //   // Add styles to prevent table structure breaking\r\n  //   const style = document.createElement(\"style\");\r\n  //   style.innerHTML = `\r\n  //   #customTable {\r\n  //     table-layout: fixed !important;\r\n  //     border-collapse: collapse !important;\r\n  //   }\r\n  //   #customTable tr {\r\n  //     display: table-row !important;\r\n  //   }\r\n  //   #customTable td {\r\n  //     display: table-cell !important;\r\n  //     position: static !important;\r\n  //   }\r\n  //   #customTable .header-cell {\r\n  //     position: static !important;\r\n  //   }\r\n  //   #customTable .header-cell > span {\r\n  //     display: inline !important;\r\n  //     position: static !important;\r\n  //   }\r\n  //   #customTable .header-cell:hover {\r\n  //     cursor: default !important;\r\n  //   }\r\n  // `;\r\n  //   document.head.appendChild(style);\r\n  // }\r\n\r\n  addTable() {\r\n    const tableWidth = 825;\r\n    const cols = 3;\r\n    const cellMinWidth = tableWidth / cols;\r\n\r\n    let table = `<br /><table id=\"customTable\" style=\"width: ${tableWidth}px; border-collapse: collapse;\">`;\r\n    table += `<tbody>`;\r\n\r\n    // Table Header Row\r\n    table += `<tr id=\"tableHeaderRow\" style=\"border-bottom: ${this.themeModeClrVerticalLineForTable()};\" onclick=\"checkTableSelection()\">`;\r\n\r\n    for (let j = 0; j < cols; j++) {\r\n      table += `<td class=\"header-cell\" \r\n              style=\"border-top: 2px solid black; \r\n                     font-weight: bold; \r\n                     text-align: start; \r\n                     word-wrap: break-word; \r\n                     word-break: break-all; \r\n                     white-space: normal; \r\n                     min-width: ${cellMinWidth}px; \r\n                     background-color: inherit !important; \r\n                     display: table-cell !important;\r\n                     position: static !important;\r\n                     height:28px;\"></td>`;\r\n    }\r\n\r\n    // Properly closing the header row\r\n    table += `</tr>`;\r\n\r\n    // Data Rows\r\n    for (let i = 0; i < 3; i++) {\r\n      table += `<tr style=\"border-bottom: ${this.themeModeClrVerticalLineForTable()}\">`;\r\n      for (let j = 0; j < cols; j++) {\r\n        table += `<td style=\"word-wrap: break-word; \r\n                        word-break: break-all; \r\n                        white-space: normal; \r\n                        min-width: ${cellMinWidth}px;\r\n                        display: table-cell !important;\r\n                        position: static !important;\">&nbsp;</td>`;\r\n      }\r\n      table += `</tr>`;\r\n    }\r\n\r\n    table += `</tbody></table><br/>`;\r\n\r\n    // Inserting into the editor\r\n    const editor = document.getElementById('editor');\r\n    if (editor) {\r\n      editor.focus();\r\n      document.execCommand('insertHTML', false, table);\r\n    }\r\n\r\n    this.tableAdded = true;\r\n    this.checkTableSelection();\r\n\r\n    // Add styles to prevent table structure breaking\r\n    const style = document.createElement('style');\r\n    style.innerHTML = `\r\n  #customTable {\r\n    table-layout: fixed !important;\r\n    border-collapse: collapse !important;\r\n  }\r\n  #customTable tr {\r\n    display: table-row !important;\r\n  }\r\n  #customTable td {\r\n    display: table-cell !important;\r\n    position: static !important;\r\n  }\r\n  #customTable .header-cell {\r\n    position: static !important;\r\n  }\r\n  #customTable .header-cell > span {\r\n    display: inline !important;\r\n    position: static !important;\r\n  }\r\n  #customTable .header-cell:hover {\r\n    cursor: default !important;\r\n  }\r\n`;\r\n    document.head.appendChild(style);\r\n  }\r\n\r\n  // Function to change the first row (thead) background color\r\n  setTheadBgColor(event: any) {\r\n    const selectedColor = event.target.value;\r\n\r\n    if (this.selectedTable) {\r\n      const headerRow = this.selectedTable.querySelector('tr') as HTMLElement;\r\n\r\n      if (headerRow) {\r\n        const headerCells = headerRow.querySelectorAll('.header-cell');\r\n        headerCells.forEach((cell: Element) => {\r\n          (cell as HTMLElement).style.backgroundColor = selectedColor;\r\n        });\r\n      }\r\n    }\r\n  }\r\n\r\n  checkTableSelection(event?: MouseEvent) {\r\n    let target = event?.target as HTMLElement;\r\n    if (target && (target.tagName === 'TD' || target.tagName === 'TH')) {\r\n      this.isTableSelected = true;\r\n      this.selectedTable = target.closest('table') as HTMLTableElement;\r\n    } else {\r\n      this.isTableSelected = false;\r\n      this.selectedTable = null;\r\n    }\r\n\r\n    // this.checkPlaceholder();\r\n  }\r\n\r\n  checkPlaceholder() {\r\n    // let editor = document.getElementById('editor');\r\n    // if (editor) {\r\n    //   this.isPlaceholderVisible = editor.innerHTML === '' || editor.innerHTML === '<br>';\r\n    //   if (this.isPlaceholderVisible) {\r\n    //     // editor.innerHTML = '<span class=\"placeholder\" style=\"background: transparent; color: #000000\">Insert text here ...</span>';\r\n    //   } else {\r\n    //     let placeholder = editor.querySelector('.placeholder');\r\n    //     if (placeholder) {\r\n    //       editor.removeChild(placeholder);\r\n    //     }\r\n    //   }\r\n    // }\r\n  }\r\n\r\n  onFocus() {\r\n    // let editor = document.getElementById('editor');\r\n    // if (editor && this.isPlaceholderVisible) {\r\n    //   editor.innerHTML = '';\r\n    //   this.isPlaceholderVisible = false;\r\n    // }\r\n  }\r\n\r\n  // colorChange(newColor: string) {\r\n  //   this.color = newColor;\r\n  // }\r\n\r\n  onBlur() {\r\n    this.checkPlaceholder();\r\n  }\r\n\r\n  // addRow() {\r\n  //   if (this.selectedTable) {\r\n  //     let row = this.selectedTable.insertRow();\r\n  //     for (let i = 0; i < this.selectedTable.rows[0].cells.length; i++) {\r\n  //       let cell = row.insertCell(i);\r\n  //       cell.innerHTML = '&nbsp;';\r\n  //       cell.style.border = '1px solid black';\r\n  //     }\r\n  //   }\r\n  // }\r\n\r\n  addRow() {\r\n    if (this.selectedTable) {\r\n      let row = this.selectedTable.insertRow();\r\n\r\n      // Loop through the columns of the first row to determine the number of cells\r\n      for (let i = 0; i < this.selectedTable.rows[0].cells.length; i++) {\r\n        let cell = row.insertCell(i);\r\n        cell.innerHTML = '&nbsp;';\r\n\r\n        // Apply bottom border explicitly\r\n        cell.style.borderBottom = `2px solid ${this.themeModeClrVerticalLineColorForTable()}`; // You can replace 'black' with your theme color\r\n      }\r\n    }\r\n  }\r\n\r\n  //   addRow() {\r\n  //   if (this.selectedTable) {\r\n  //     let row = this.selectedTable.insertRow();\r\n  //     row.style.borderBottom = this.themeModeClrVerticalLineForTable(); // Add bottom border to the row\r\n  //     for (let i = 0; i < this.selectedTable.rows[0].cells.length; i++) {\r\n  //       let cell = row.insertCell(i);\r\n  //       cell.innerHTML = '&nbsp;';\r\n  //     }\r\n  //   }\r\n  // }\r\n\r\n  // deleteRow() {\r\n  //   if (this.selectedTable) {\r\n  //     this.selectedTable.deleteRow(-1);\r\n  //   }\r\n  // }\r\n\r\n  //   deleteRow() {\r\n  //   if (this.selectedTable) {\r\n  //     let rowIndex = this.selectedTable.rows.length - 1;\r\n  //     if (window.getSelection) {\r\n  //       let selection = window.getSelection();\r\n  //       if (selection) {\r\n  //         let row = selection.anchorNode?.parentElement?.closest('tr');\r\n  //         if (row) {\r\n  //           rowIndex = row.rowIndex;\r\n  //         }\r\n  //       }\r\n  //     }\r\n  //     this.selectedTable.deleteRow(rowIndex);\r\n  //   }\r\n  // }\r\n\r\n  deleteRow() {\r\n    const selection = window.getSelection();\r\n    if (selection) {\r\n      if (!selection.rangeCount) return;\r\n\r\n      const range = selection.getRangeAt(0);\r\n      const selectedNode = range.startContainer;\r\n      const row = selectedNode.parentElement?.closest('tr');\r\n\r\n      if (row) {\r\n        const table = row.closest('table');\r\n        if (table) {\r\n          table.deleteRow(row.rowIndex);\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  // addColumn() {\r\n  //   if (this.selectedTable) {\r\n  //     for (let i = 0; i < this.selectedTable.rows.length; i++) {\r\n  //       let cell = this.selectedTable.rows[i].insertCell(-1);\r\n  //       cell.innerHTML = '&nbsp;';\r\n  //       cell.style.border = '1px solid black';\r\n  //     }\r\n  //   }\r\n  // }\r\n\r\n  //   addColumn() {\r\n  //   if (this.selectedTable) {\r\n  //     const columnCount = this.selectedTable.rows[0].cells.length + 1; // New column count\r\n  //     const tableWidth = this.selectedTable.offsetWidth;\r\n  //     const minWidth = tableWidth / columnCount;\r\n\r\n  //     for (let i = 0; i < this.selectedTable.rows.length; i++) {\r\n  //       let cell = this.selectedTable.rows[i].insertCell(-1);\r\n  //       cell.innerHTML = '&nbsp;';\r\n  //       cell.style.border = '1px solid black';\r\n  //       cell.style.minWidth = `${minWidth}px`;\r\n  //       cell.style.wordWrap = 'break-word';\r\n  //       cell.style.wordBreak = 'break-all';\r\n  //       cell.style.whiteSpace = 'normal';\r\n  //     }\r\n\r\n  //     // Update existing cells' minWidth\r\n  //     for (let i = 0; i < this.selectedTable.rows.length; i++) {\r\n  //       for (let j = 0; j < this.selectedTable.rows[i].cells.length; j++) {\r\n  //         this.selectedTable.rows[i].cells[j].style.minWidth = `${minWidth}px`;\r\n  //       }\r\n  //     }\r\n  //   }\r\n  // }\r\n\r\n  // addColumn() {\r\n  // if (this.selectedTable) {\r\n  //   const columnCount = this.selectedTable.rows[0].cells.length + 1; // New column count\r\n  //   const tableWidth = this.selectedTable.offsetWidth;\r\n  //   const minWidth = tableWidth / columnCount;\r\n\r\n  //   for (let i = 0; i < this.selectedTable.rows.length; i++) {\r\n  //     let cell = this.selectedTable.rows[i].insertCell(-1);\r\n  //     cell.innerHTML = '&nbsp;';\r\n  //     cell.style.wordWrap = 'break-word';\r\n  //     cell.style.wordBreak = 'break-all';\r\n  //     cell.style.whiteSpace = 'normal';\r\n  //     cell.style.minWidth = `${minWidth}px`;\r\n  //     cell.style.borderBottom = `2px solid ${this.themeModeClrVerticalLineColorForTable()}`\r\n  //   }\r\n\r\n  //   // Update existing rows' bottom border\r\n  //   for (let i = 0; i < this.selectedTable.rows.length; i++) {\r\n  //     this.selectedTable.rows[i].style.borderBottom = this.themeModeClrVerticalLineForTable();\r\n  //   }\r\n  // }\r\n  // }\r\n\r\n  addColumn() {\r\n    if (this.selectedTable) {\r\n      const columnCount = this.selectedTable.rows[0].cells.length + 1; // New column count\r\n      const tableWidth = this.selectedTable.offsetWidth;\r\n      const minWidth = tableWidth / columnCount;\r\n\r\n      // Get the current header background color if any\r\n      const firstHeaderCell = this.selectedTable.rows[0]\r\n        .cells[0] as HTMLElement;\r\n      const headerBgColor = firstHeaderCell\r\n        ? firstHeaderCell.style.backgroundColor\r\n        : '';\r\n\r\n      for (let i = 0; i < this.selectedTable.rows.length; i++) {\r\n        let cell = this.selectedTable.rows[i].insertCell(-1);\r\n        cell.innerHTML = '&nbsp;';\r\n        cell.style.wordWrap = 'break-word';\r\n        cell.style.wordBreak = 'break-all';\r\n        cell.style.whiteSpace = 'normal';\r\n        cell.style.minWidth = `${minWidth}px`;\r\n        cell.style.borderBottom = '1px solid #d3d3d3';\r\n\r\n        // cell.style.borderBottom = `2px solid ${this.themeModeClrVerticalLineColorForTable()}`;\r\n\r\n        // If it's the first row, make it a header cell\r\n        if (i === 0) {\r\n          cell.classList.add('header-cell');\r\n          cell.style.fontWeight = 'bold';\r\n          cell.style.textAlign = 'start';\r\n          cell.style.pointerEvents = 'none';\r\n          cell.style.display = 'table-cell';\r\n          cell.style.position = 'static';\r\n          cell.style.borderTop = '2px solid black';\r\n          // cell.innerText = `Header ${columnCount}`;\r\n\r\n          // Apply the same background color as existing headers\r\n          if (headerBgColor) {\r\n            cell.style.backgroundColor = headerBgColor;\r\n          }\r\n        }\r\n      }\r\n\r\n      // Update existing rows' bottom border\r\n      // for (let i = 0; i < this.selectedTable.rows.length; i++) {\r\n      //   this.selectedTable.rows[i].style.borderBottom =\r\n      //     this.themeModeClrVerticalLineForTable();\r\n      // }\r\n      for (let i = 0; i < this.selectedTable.rows.length; i++) {\r\n        for (let j = 0; j < this.selectedTable.rows[i].cells.length; j++) {\r\n          this.selectedTable.rows[i].cells[j].style.borderBottom =\r\n            '1px solid #d3d3d3';\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  deleteColumn() {\r\n    if (this.selectedTable) {\r\n      if (window.getSelection) {\r\n        let selection = window.getSelection();\r\n        if (selection) {\r\n          let cell = selection.anchorNode?.parentElement?.closest(\r\n            'td, th'\r\n          ) as HTMLTableCellElement;\r\n          if (cell) {\r\n            let cellIndex = cell.cellIndex;\r\n            for (let i = 0; i < this.selectedTable.rows.length; i++) {\r\n              this.selectedTable.rows[i].deleteCell(cellIndex);\r\n            }\r\n          }\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  themeModeClrVerticalLineForTable() {\r\n    const clrMode = document.body.getAttribute('data-layout-color');\r\n    if (clrMode == 'dark') {\r\n      return '2px solid #414141 !important';\r\n    } else {\r\n      return '2px solid #5F5F5F !important';\r\n    }\r\n  }\r\n\r\n  themeModeClrVerticalLineColorForTable() {\r\n    const clrMode = document.body.getAttribute('data-layout-color');\r\n    if (clrMode == 'dark') {\r\n      return '#414141';\r\n    } else {\r\n      return '#5F5F5F';\r\n    }\r\n  }\r\n\r\n  adjustTableWidth(event: any) {\r\n    if (this.selectedTable) {\r\n      this.selectedTable.style.width = event.target.value + 'px';\r\n    }\r\n  }\r\n\r\n  adjustCellWidth(event: any) {\r\n    if (this.selectedTable) {\r\n      for (let i = 0; i < this.selectedTable.rows.length; i++) {\r\n        for (let j = 0; j < this.selectedTable.rows[i].cells.length; j++) {\r\n          this.selectedTable.rows[i].cells[j].style.width =\r\n            event.target.value + 'px';\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  adjustCellHeight(event: any) {\r\n    if (this.selectedTable) {\r\n      for (let i = 0; i < this.selectedTable.rows.length; i++) {\r\n        for (let j = 0; j < this.selectedTable.rows[i].cells.length; j++) {\r\n          this.selectedTable.rows[i].cells[j].style.height =\r\n            event.target.value + 'px';\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  private setCaretToEnd(element: HTMLElement) {\r\n    const range = document.createRange();\r\n    const sel = window.getSelection();\r\n    if (sel) {\r\n      range.selectNodeContents(element);\r\n      range.collapse(false);\r\n      sel.removeAllRanges();\r\n      sel.addRange(range);\r\n    }\r\n  }\r\n\r\n  // openColorPicker(inputId: string) {\r\n  //   const inputElement = document.getElementById(inputId);\r\n  //   if (inputElement) {\r\n  //     inputElement.click();\r\n  //   }\r\n  // }\r\n\r\n  // setTextColor(event: any) {\r\n  //   const editor = document.getElementById('editor');\r\n  //   if (editor) {\r\n  //     editor.focus();\r\n  //     const color = event.target.value;\r\n  //     this.selectedTextColor = color;\r\n  //     document.execCommand('foreColor', false, color);\r\n  //   }\r\n  // }\r\n\r\n  // setBackgroundColor(event: any) {\r\n  //   const editor = document.getElementById('editor');\r\n  //   if (editor) {\r\n  //     editor.focus();\r\n  //     const color = event.target.value;\r\n  //     this.backgroundColor = color;\r\n  //     document.execCommand('hiliteColor', false, color);\r\n  //   }\r\n  // }\r\n\r\n  private savedSelection: Range | null = null;\r\n\r\n  openColorPicker(inputId: string) {\r\n    const inputElement = document.getElementById(inputId) as HTMLInputElement;\r\n    if (inputElement) {\r\n      // Save the current selection\r\n      const selection = window.getSelection();\r\n      if (selection && selection.rangeCount > 0) {\r\n        this.savedSelection = selection.getRangeAt(0);\r\n      }\r\n      inputElement.click();\r\n    }\r\n  }\r\n\r\n  // setTextColor(event: any) {\r\n  //   if (this.savedSelection) {\r\n  //     const color = event.target.value;\r\n  //     this.selectedTextColor = color;\r\n\r\n  //     // Restore the saved selection\r\n  //     const selection = window.getSelection();\r\n  //     if (selection) {\r\n  //       selection.removeAllRanges();\r\n  //       selection.addRange(this.savedSelection);\r\n\r\n  //       // Apply the color using a span\r\n  //       const range = this.savedSelection;\r\n  //       const span = document.createElement('span');\r\n  //       span.style.color = color;\r\n  //       span.textContent = range.toString();\r\n\r\n  //       // Replace the selected text with the styled span\r\n  //       range.deleteContents();\r\n  //       range.insertNode(span);\r\n\r\n  //       // Clear the saved selection\r\n  //       this.savedSelection = null;\r\n  //     }\r\n  //   }\r\n  // }\r\n  //   setTextColor(event: any) {\r\n  //   if (this.savedSelection) {\r\n  //     const color = event.target.value;\r\n  //     this.selectedTextColor = color;\r\n\r\n  //     // Restore the saved selection\r\n  //     const selection = window.getSelection();\r\n  //     if (selection && selection.rangeCount > 0) {\r\n  //       const range = this.savedSelection;\r\n  //       selection.removeAllRanges();\r\n  //       selection.addRange(range);\r\n\r\n  //       // Get selected elements\r\n  //       const selectedContent = range.cloneContents();\r\n  //       const elements = Array.from(selectedContent.querySelectorAll(\"*\")) as HTMLElement[]; // ✅ Explicitly cast to HTMLElement[]\r\n\r\n  //       // Apply color to each element without modifying structure\r\n  //       elements.forEach((el) => {\r\n  //         el.style.color = color;\r\n  //       });\r\n\r\n  //       // Apply color to the top-level text nodes (without wrapping them)\r\n  //       Array.from(selectedContent.childNodes).forEach((node) => {\r\n  //         if (node.nodeType === Node.TEXT_NODE && node.textContent?.trim() !== \"\") {\r\n  //           const parent = range.commonAncestorContainer.parentElement;\r\n  //           if (parent) {\r\n  //             parent.style.color = color;\r\n  //           }\r\n  //         }\r\n  //       });\r\n\r\n  //       // Replace selected content\r\n  //       range.deleteContents();\r\n  //       range.insertNode(selectedContent);\r\n\r\n  //       // Clear saved selection\r\n  //       this.savedSelection = null;\r\n  //     }\r\n  //   }\r\n  // }\r\n\r\n  // setTextColor(event: any) {\r\n  //   console.log(\"Clicked setTextColor\");\r\n  //   if (!this.savedSelection) {\r\n  //     console.warn(\"No saved selection available!\");\r\n  //     return;\r\n  //   }\r\n\r\n  //   const color = event.target.value;\r\n  //   this.selectedTextColor = color;\r\n  //   const selection = window.getSelection();\r\n\r\n  //   if (!selection || selection.rangeCount === 0) {\r\n  //     console.error(\"No valid selection found!\");\r\n  //     return;\r\n  //   }\r\n\r\n  //   selection.removeAllRanges();\r\n  //   selection.addRange(this.savedSelection);\r\n  //   const range = this.savedSelection;\r\n\r\n  //   const getTableCell = (node: Node | null): HTMLElement | null => {\r\n  //     let currentNode = node;\r\n  //     if (currentNode && currentNode.nodeType === Node.TEXT_NODE) {\r\n  //       currentNode = currentNode.parentNode;\r\n  //     }\r\n\r\n  //     while (currentNode && currentNode instanceof HTMLElement) {\r\n  //       if (currentNode.tagName === \"TD\" || currentNode.tagName === \"TH\") {\r\n  //         return currentNode;\r\n  //       }\r\n  //       currentNode = currentNode.parentElement;\r\n  //     }\r\n  //     return null;\r\n  //   };\r\n\r\n  //   const tableCell =\r\n  //     getTableCell(range.commonAncestorContainer) ||\r\n  //     getTableCell(range.startContainer) ||\r\n  //     getTableCell(range.endContainer);\r\n\r\n  //   if (tableCell) {\r\n  //     console.log(`Processing ${tableCell.tagName} element`);\r\n  //     const selectedText = selection.toString();\r\n\r\n  //     if (selectedText) {\r\n  //       console.log(`Selected text in ${tableCell.tagName}:`, selectedText);\r\n  //       const textNodes: Text[] = [];\r\n  //       const walker = document.createTreeWalker(\r\n  //         tableCell,\r\n  //         NodeFilter.SHOW_TEXT,\r\n  //         null\r\n  //       );\r\n  //       let node: Text | null;\r\n\r\n  //       while ((node = walker.nextNode() as Text | null)) {\r\n  //         textNodes.push(node);\r\n  //       }\r\n\r\n  //       for (const textNode of textNodes) {\r\n  //         const text = textNode.textContent || \"\";\r\n  //         const index = text.indexOf(selectedText);\r\n\r\n  //         if (index !== -1) {\r\n  //           console.log(\r\n  //             `Found selected text in ${tableCell.tagName} text node`\r\n  //           );\r\n\r\n  //           const span = document.createElement(\"span\");\r\n  //           span.style.color = color;\r\n  //           span.textContent = selectedText;\r\n\r\n  //           const beforeText = text.slice(0, index);\r\n  //           const afterText = text.slice(index + selectedText.length);\r\n\r\n  //           const fragment = document.createDocumentFragment();\r\n  //           if (beforeText)\r\n  //             fragment.appendChild(document.createTextNode(beforeText));\r\n  //           fragment.appendChild(span);\r\n  //           if (afterText)\r\n  //             fragment.appendChild(document.createTextNode(afterText));\r\n\r\n  //           textNode.replaceWith(fragment);\r\n  //           break; // Apply only once per selection\r\n  //         }\r\n  //       }\r\n  //     }\r\n  //   } else {\r\n  //     console.log(\"No TH or TD element found in selection\");\r\n  //     return;\r\n  //   }\r\n\r\n  //   this.savedSelection = null;\r\n  // }\r\n\r\n  setTextColor(event: any) {\r\n    if (!this.savedSelection) {\r\n      console.warn('No saved selection available!');\r\n      return;\r\n    }\r\n\r\n    const color = event.target.value;\r\n\r\n    this.selectedTextColor = color;\r\n    const selection = window.getSelection();\r\n\r\n    if (!selection || selection.rangeCount === 0) {\r\n      console.error('No valid selection found!');\r\n      return;\r\n    }\r\n\r\n    selection.removeAllRanges();\r\n    selection.addRange(this.savedSelection);\r\n    const range = this.savedSelection.cloneRange();\r\n\r\n    const wrapTextNode = (textNode: Text, start: number, end: number) => {\r\n      const span = document.createElement('span');\r\n      span.style.color = color;\r\n\r\n      const selectedText = textNode.textContent!.slice(start, end);\r\n      span.textContent = selectedText;\r\n\r\n      const beforeText = textNode.textContent!.slice(0, start);\r\n      const afterText = textNode.textContent!.slice(end);\r\n\r\n      const fragment = document.createDocumentFragment();\r\n\r\n      if (beforeText) fragment.appendChild(document.createTextNode(beforeText));\r\n      fragment.appendChild(span);\r\n      if (afterText) fragment.appendChild(document.createTextNode(afterText));\r\n\r\n      textNode.replaceWith(fragment);\r\n    };\r\n\r\n    const processNode = (node: Node) => {\r\n      if (node.nodeType === Node.TEXT_NODE) {\r\n        wrapTextNode(node as Text, 0, (node.textContent || '').length);\r\n      } else if (node.nodeType === Node.ELEMENT_NODE) {\r\n        const element = node as HTMLElement;\r\n        if (['LI', 'P', 'DIV', 'TABLE', 'TD', 'TH'].includes(element.tagName)) {\r\n          element.style.color = color; // Apply directly for block and table elements\r\n        }\r\n      }\r\n    };\r\n\r\n    const startContainer = range.startContainer;\r\n    const endContainer = range.endContainer;\r\n\r\n    if (\r\n      startContainer === endContainer &&\r\n      startContainer.nodeType === Node.TEXT_NODE\r\n    ) {\r\n      wrapTextNode(startContainer as Text, range.startOffset, range.endOffset);\r\n    } else {\r\n      const treeWalker = document.createTreeWalker(\r\n        range.commonAncestorContainer,\r\n        NodeFilter.SHOW_TEXT,\r\n        {\r\n          acceptNode: (node) => {\r\n            return range.intersectsNode(node)\r\n              ? NodeFilter.FILTER_ACCEPT\r\n              : NodeFilter.FILTER_REJECT;\r\n          },\r\n        }\r\n      );\r\n\r\n      const textNodes: Text[] = [];\r\n      let node;\r\n      while ((node = treeWalker.nextNode())) {\r\n        textNodes.push(node as Text);\r\n      }\r\n\r\n      for (const textNode of textNodes) {\r\n        if (textNode === startContainer) {\r\n          wrapTextNode(\r\n            textNode,\r\n            range.startOffset,\r\n            textNode.textContent!.length\r\n          );\r\n        } else if (textNode === endContainer) {\r\n          wrapTextNode(textNode, 0, range.endOffset);\r\n        } else {\r\n          wrapTextNode(textNode, 0, textNode.textContent!.length);\r\n        }\r\n      }\r\n    }\r\n\r\n    this.savedSelection = null;\r\n  }\r\n\r\n  // Helper method to recursively apply color to all text nodes in a fragment\r\n  private applyColorToContents(node: Node, color: string): void {\r\n    if (node.nodeType === Node.TEXT_NODE && node.textContent?.trim()) {\r\n      const span = document.createElement('span');\r\n      span.style.color = color;\r\n      span.textContent = node.textContent;\r\n      if (node.parentNode) {\r\n        node.parentNode.replaceChild(span, node);\r\n      }\r\n      return;\r\n    }\r\n\r\n    if (node.nodeType === Node.ELEMENT_NODE) {\r\n      if (node instanceof HTMLLIElement) {\r\n        const childNodes = Array.from(node.childNodes);\r\n        childNodes.forEach((child) => {\r\n          if (child.nodeType === Node.TEXT_NODE && child.textContent?.trim()) {\r\n            const span = document.createElement('span');\r\n            span.style.color = color;\r\n            span.textContent = child.textContent;\r\n            child.replaceWith(span);\r\n          } else if (child.nodeType === Node.ELEMENT_NODE) {\r\n            this.applyColorToContents(child, color);\r\n          }\r\n        });\r\n      } else {\r\n        const childNodes = Array.from(node.childNodes);\r\n        childNodes.forEach((child) => this.applyColorToContents(child, color));\r\n      }\r\n    }\r\n\r\n    if (node.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\r\n      const childNodes = Array.from(node.childNodes);\r\n      childNodes.forEach((child) => this.applyColorToContents(child, color));\r\n    }\r\n  }\r\n\r\n  setBackgroundColor(event: any) {\r\n    if (this.savedSelection) {\r\n      const color = event.target.value;\r\n      this.backgroundColor = color;\r\n\r\n      // Restore the saved selection\r\n      const selection = window.getSelection();\r\n      if (selection) {\r\n        selection.removeAllRanges();\r\n        selection.addRange(this.savedSelection);\r\n\r\n        // Apply the background color using a span\r\n        const range = this.savedSelection;\r\n        const span = document.createElement('span');\r\n        span.style.backgroundColor = color;\r\n        span.textContent = range.toString();\r\n\r\n        // Replace the selected text with the styled span\r\n        range.deleteContents();\r\n        range.insertNode(span);\r\n\r\n        // Clear the saved selection\r\n        this.savedSelection = null;\r\n      }\r\n    }\r\n  }\r\n\r\n  // colorChanged(event: any) {\r\n  //   this.color = event.color.hex;\r\n  // }\r\n\r\n  public logEvent(event: any, trigger: any) {\r\n    const color = event;\r\n    this.setTextColor(color);\r\n    this.selectedTextColor = event;\r\n    document.execCommand('foreColor', false, event);\r\n    // this.logs.unshift([this.logs.length + 1, trigger, event]);\r\n  }\r\n\r\n  editImage() {\r\n    let data;\r\n    switch (this.editorFrom.name) {\r\n      case 'section-content':\r\n        data = {\r\n          editIMG: true,\r\n          from: 'htmlEditor',\r\n          index: this.selectedItemIndex,\r\n          id: this.editorFrom.id,\r\n        };\r\n        const compressedData: string = compress(\r\n          JSON.stringify(this.imageEditUrl)\r\n        );\r\n        sessionStorage.setItem('editImageFromTemp', compressedData);\r\n        const compressedData2 = compress(JSON.stringify(this.sanitizedContent));\r\n        sessionStorage.setItem('textEditor', compressedData2);\r\n        // alert('go to editor!')\r\n        this.navigateToIMGEditor(data);\r\n        this.imageEdit.emit();\r\n        break;\r\n      case 'create-document':\r\n        this.imageEdit.emit();\r\n        data = {\r\n          editIMG: true,\r\n          from: 'createDocument',\r\n          index: this.selectedItemIndex,\r\n          id: this.editorFrom.id,\r\n          section: this.editorFrom.section,\r\n          reportSectionId: this.editorFrom.reportSectionId,\r\n        };\r\n        // this.openDialog(data)\r\n        const compressedData3 = compress(JSON.stringify(this.imageEditUrl));\r\n        const compressedData4 = compress(this.editorText);\r\n\r\n        sessionStorage.setItem('editImageFromTemp2', compressedData3);\r\n        sessionStorage.setItem('textEditor2', compressedData4);\r\n        this.navigateToIMGEditor(data);\r\n        break;\r\n      default:\r\n        null;\r\n        // sessionStorage.removeItem('editImageFromTemp');\r\n        // sessionStorage.removeItem('editImageFromTemp2');\r\n        // sessionStorage.removeItem('templateEditor');\r\n        // sessionStorage.removeItem('textEditor');\r\n        break;\r\n    }\r\n    // if (this.editorFrom === 'section-content') {\r\n    //   const data = {editIMG: true, from: 'htmlEditor', index: this.selectedItemIndex}\r\n    //   this.navigateToIMGEditor(data)\r\n    //   sessionStorage.setItem('editImageFromTemp', JSON.stringify(this.imageEditUrl))\r\n    //   sessionStorage.setItem('textEditor', this.editorText)\r\n    // }\r\n  }\r\n\r\n  openDialog(item: any): void {\r\n    // let data: any;\r\n    //   data = item\r\n    // const dialogRef = this.dialog.open(ImageEditorModalComponent,{\r\n    //   minWidth: '100%', minHeight: '100vh', panelClass: 'theme-2B2936' ,disableClose: true, data: data\r\n    // });\r\n    // dialogRef.afterClosed().subscribe(result => {\r\n    //   console.log('result ===> img = ', result)\r\n    //   const imgUrl = sessionStorage.getItem('editImageFromTemp2');\r\n    //     if (imgUrl) {\r\n    //       this.replaceImageSrc(imgUrl,  result.index.index);\r\n    //       sessionStorage.removeItem('editImageFromTemp2');\r\n    //     }\r\n    // });\r\n  }\r\n\r\n  replaceImageSRC(newSrc: string, index: number) {\r\n    const parser = new DOMParser();\r\n    const doc = parser.parseFromString(this.editorText, 'text/html');\r\n    const imgTags = doc.getElementsByTagName('img');\r\n\r\n    if (imgTags && imgTags.length > 0) {\r\n      if (index >= 0 && index < imgTags.length) {\r\n        // Update the src attribute of the img at the specified index\r\n\r\n        imgTags[index].setAttribute('src', newSrc);\r\n        this.editorText = doc.body.innerHTML;\r\n      }\r\n    }\r\n  }\r\n\r\n  navigateToIMGEditor(data: any) {\r\n    this.router.navigate(['/admin/image-editor'], {\r\n      queryParams: { data: JSON.stringify(data) },\r\n    });\r\n  }\r\n\r\n  //  onTextSelect(event: MouseEvent): void {\r\n  //   if (this.toolbarMode === 'bubble') {\r\n  //     const selection = window.getSelection();\r\n  //     if (selection && selection.rangeCount > 0) {\r\n  //       const range = selection.getRangeAt(0);\r\n  //       if (!range.collapsed) {\r\n  //         const rect = range.getBoundingClientRect();\r\n  //         this.toolbarTop = rect.bottom + window.scrollY + 10;\r\n  //         this.toolbarLeft = rect.left + window.scrollX + (rect.width / 2) - 50;\r\n  //         this.showToolbar = true;\r\n  //       } else {\r\n  //         this.showToolbar = false;\r\n  //       }\r\n  //     }\r\n  //   }\r\n  // }\r\n\r\n  onTextSelect(event?: MouseEvent): void {\r\n    if (this.toolbarMode === 'bubble') {\r\n      const selection = window.getSelection();\r\n      if (selection && selection.rangeCount > 0) {\r\n        const range = selection.getRangeAt(0);\r\n        if (!range.collapsed) {\r\n          const rect = range.getBoundingClientRect();\r\n          const scrollY = document.documentElement.scrollTop;\r\n          const scrollX = document.documentElement.scrollLeft;\r\n          this.toolbarTop = rect.top + scrollY - 75;\r\n          this.toolbarLeft = rect.left + scrollX + rect.width / 2 - 325;\r\n          this.showToolbar = true;\r\n        } else {\r\n          this.showToolbar = false;\r\n        }\r\n      } else {\r\n        this.showToolbar = false;\r\n      }\r\n    }\r\n  }\r\n\r\n  // onPaste(event: ClipboardEvent) {\r\n  //     event.preventDefault();\r\n  //     const clipboardData = event.clipboardData;\r\n  //     if (clipboardData) {\r\n  //       const pastedText = clipboardData.getData('text/plain');\r\n  //       if (this.isTableData(pastedText)) {\r\n  //         const html = this.convertTextToTable(pastedText);\r\n  //         this.insertHtmlAtCaret(html);\r\n  //       } else {\r\n  //         this.insertHtmlAtCaret(pastedText);\r\n  //       }\r\n  //     }\r\n  //   }\r\n\r\n  // onPaste(event: ClipboardEvent) {\r\n  //   event.preventDefault();\r\n  //   const clipboardData = event.clipboardData;\r\n  //   if (clipboardData) {\r\n  //     // Handle image data\r\n  //     const items = clipboardData.items;\r\n  //     for (let i = 0; i < items.length; i++) {\r\n  //       if (items[i].type.startsWith('image/')) {\r\n  //         const file = items[i].getAsFile();\r\n  //         if (file) {\r\n  //           const reader = new FileReader();\r\n  //           reader.onload = (e: any) => {\r\n  //             const imgHtml = `<img src=\"${e.target.result}\" alt=\"Pasted Image\" style=\"max-width: 100%;\"/>`;\r\n  //             this.insertHtmlAtCaret(imgHtml);\r\n  //           };\r\n  //           reader.readAsDataURL(file);\r\n  //           return; // Exit if an image is handled\r\n  //         }\r\n  //       }\r\n  //     }\r\n\r\n  //     // Handle text or table data\r\n  //     const pastedText = clipboardData.getData('text/plain');\r\n  //     if (this.isTableData(pastedText)) {\r\n  //       const html = this.convertTextToTable(pastedText);\r\n  //       this.insertHtmlAtCaret(html);\r\n  //     } else {\r\n  //       this.insertHtmlAtCaret(pastedText);\r\n  //     }\r\n  //   }\r\n  // }\r\n\r\n  onPaste(event: ClipboardEvent) {\r\n    event.preventDefault();\r\n    const clipboardData = event.clipboardData;\r\n    if (clipboardData) {\r\n      let textData = clipboardData.getData('text/plain');\r\n      for (let i = 0; i < clipboardData.items.length; i++) {\r\n        const item = clipboardData.items[i];\r\n\r\n        if (item.type.startsWith('image/')) {\r\n          // Handle image paste\r\n          const file = item.getAsFile();\r\n          if (file) {\r\n            const reader = new FileReader();\r\n            reader.onload = (e: any) => {\r\n              const imgHtml = `<img src=\"${e.target.result}\" alt=\"Pasted Image\" style=\"max-width: 100%;\" />`;\r\n              this.insertHtmlAtCaret(imgHtml);\r\n            };\r\n            reader.readAsDataURL(file);\r\n            return;\r\n          }\r\n        } else if (item.type === 'text/html') {\r\n          // Handle HTML paste\r\n          // const htmlData = clipboardData.getData(\"text/html\");\r\n          if (this.isTableData(clipboardData.getData('text/html'))) {\r\n            const html = this.convertTextToTable(\r\n              clipboardData.getData('text/html')\r\n            );\r\n            this.insertHtmlAtCaret(html);\r\n          } else {\r\n            this.insertHtmlAtCaret(clipboardData.getData('text/html'));\r\n          }\r\n          // this.insertHtmlAtCaret(htmlData);\r\n          return;\r\n        } else if (item.type === 'text/plain') {\r\n          // Handle plain text paste\r\n          if (this.isTableData(clipboardData.getData('text/plain'))) {\r\n            const html = this.convertTextToTable(\r\n              clipboardData.getData('text/plain')\r\n            );\r\n            this.insertHtmlAtCaret(html);\r\n          } else {\r\n            const formattedHtml = textData\r\n              .split(/\\n\\s*\\n?/)\r\n              .map((line) => `<p>${line.trim()}</p>`)\r\n              .join('');\r\n            console.log('format', formattedHtml);\r\n\r\n            this.insertHtmlAtCaret(formattedHtml);\r\n\r\n            // this.insertHtmlAtCaret(clipboardData.getData('text/plain'));\r\n          }\r\n          // const plainText = clipboardData.getData(\"text/plain\");\r\n          // this.insertHtmlAtCaret(plainText);\r\n          return;\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  isExcelData(html: string): boolean {\r\n    return (\r\n      html.includes('xmlns:o=\"urn:schemas-microsoft-com:office:office\"') ||\r\n      html.includes('xmlns:x=\"urn:schemas-microsoft-com:office:excel\"')\r\n    );\r\n  }\r\n\r\n  convertExcelHtmlToTable(html: string): string {\r\n    const parser = new DOMParser();\r\n    const doc = parser.parseFromString(html, 'text/html');\r\n    const table = doc.querySelector('table');\r\n    return table ? table.outerHTML : ''; // Extract only the table part\r\n  }\r\n\r\n  isTableData(text: string): boolean {\r\n    const rows = text.split('\\n');\r\n    return rows.length > 1 && rows[0].split('\\t').length > 1;\r\n  }\r\n\r\n  // convertTextToTable(text: string): string {\r\n  //   const rows = text.split('\\n').filter(row => row.trim() !== '');\r\n  //   const tableRows = rows.map(row => {\r\n  //     const cells = row.split('\\t').map(cell => `<td class=\"px-1 py-1\" >${cell}</td>`).join('');\r\n  //     return `<tr class=\"table-border-top\" style=\"border-top: ${this.themeModeTableBorderTop()}; width: 100% !important\">${cells}</tr>`;\r\n  //   }).join('');\r\n  //   return `<table>${tableRows}</table>`;\r\n  // }\r\n\r\n  convertTextToTable(text: string): string {\r\n    const rows = text.split('\\n').filter((row) => row.trim() !== '');\r\n    const columnCount = rows[0]?.split('\\t').length || 1; // Get the number of columns from the first row\r\n    const columnWidth = 100 / columnCount; // Calculate column width\r\n\r\n    const tableRows = rows\r\n      .map((row, index) => {\r\n        const cells = row\r\n          .split('\\t')\r\n          .map(\r\n            (cell) => `\r\n        <td class=\"px-1 py-1 text-truncate\" \r\n            style=\"max-width: ${columnWidth}%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;\">\r\n          ${cell}\r\n        </td>`\r\n          )\r\n          .join('');\r\n\r\n        // Add a border-top for all rows except the first and border-bottom for the last row\r\n        const borderTop =\r\n          index === 0 ? '' : `border-top: ${this.themeModeTableBorderTop()};`;\r\n        const borderBottom =\r\n          index === rows.length - 1\r\n            ? `border-bottom: ${this.themeModeTableBorderTop()};`\r\n            : '';\r\n\r\n        return `\r\n        <tr \r\n          style=\"${borderTop} ${borderBottom} width: 100% !important;\">\r\n          ${cells}\r\n        </tr>`;\r\n      })\r\n      .join('');\r\n\r\n    return `\r\n      <table style=\"table-layout: fixed; width: 100%;\"> \r\n        ${tableRows}\r\n      </table>`;\r\n  }\r\n\r\n  // insertHtmlAtCaret(html: string) {\r\n  //   const range = window.getSelection()?.getRangeAt(0);\r\n  //   if (range) {\r\n  //     range.deleteContents();\r\n  //     const tempDiv = document.createElement('div');\r\n  //     tempDiv.innerHTML = html;\r\n  //     const frag = document.createDocumentFragment();\r\n  //     let node;\r\n  //     while ((node = tempDiv.firstChild)) {\r\n  //       frag.appendChild(node);\r\n  //     }\r\n  //     range.insertNode(frag);\r\n  //     range.collapse(false);\r\n  //   }\r\n  // }\r\n\r\n  insertHtmlAtCaret(html: string) {\r\n    const range = window.getSelection()?.getRangeAt(0);\r\n    if (range) {\r\n      range.deleteContents();\r\n      const tempDiv = document.createElement(\"div\");\r\n      tempDiv.innerHTML = html;\r\n      const frag = document.createDocumentFragment();\r\n      while (tempDiv.firstChild) {\r\n        frag.appendChild(tempDiv.firstChild); \r\n      }\r\n  \r\n      range.insertNode(frag);\r\n      // Move the cursor after the inserted content\r\n      range.collapse(false);\r\n      \r\n      const selection = window.getSelection();\r\n      if (selection) {\r\n        selection.removeAllRanges();\r\n        selection.addRange(range);\r\n      }\r\n    }\r\n  }\r\n\r\n  themeModeTableBorderTop() {\r\n    const clrMode = document.body.getAttribute('data-layout-color');\r\n    if (clrMode == 'dark') {\r\n      return '1px solid #D0D0D0; !important';\r\n    } else {\r\n      return '1px solid #414141 !important';\r\n    }\r\n  }\r\n\r\n  public openFullscreen() {\r\n    var elem: any = document.getElementById('textEditor');\r\n    this.isFullScreen = true;\r\n    if (elem.requestFullscreen) {\r\n      elem.requestFullscreen();\r\n    } else if (elem.mozRequestFullScreen) {\r\n      elem.mozRequestFullScreen();\r\n    } else if (elem.webkitRequestFullscreen) {\r\n      elem.webkitRequestFullscreen();\r\n    } else if (elem.msRequestFullscreen) {\r\n      elem.msRequestFullscreen();\r\n    }\r\n    this.style = {\r\n      'min-height': '90vh',\r\n      'max-height': '90vh',\r\n    };\r\n  }\r\n\r\n  public closeFullscreen() {\r\n    if (document.exitFullscreen) {\r\n      document.exitFullscreen();\r\n      this.isFullScreen = false;\r\n      this.style = {\r\n        'min-height': '400px',\r\n        'max-height': '400px',\r\n      };\r\n    }\r\n  }\r\n\r\n  clearTextEditor() {\r\n    this.editorTextClear.emit();\r\n  }\r\n\r\n  setupHistory() {\r\n    this.saveState();\r\n    const editor = document.getElementById('editor');\r\n\r\n    if (editor) {\r\n      editor.addEventListener('input', () => this.onInput());\r\n    }\r\n  }\r\n\r\n  onInput() {\r\n    this.saveState();\r\n  }\r\n\r\n  saveState() {\r\n    const editor = document.getElementById('editor');\r\n\r\n    if (editor) {\r\n      const editorContent = editor.innerHTML;\r\n      if (this.historyIndex === this.history.length - 1) {\r\n        this.history.push(editorContent);\r\n        this.redoStack = [];\r\n      } else {\r\n        this.history = this.history.slice(0, this.historyIndex + 1);\r\n        this.history.push(editorContent);\r\n        this.redoStack = [];\r\n      }\r\n      this.historyIndex++;\r\n    }\r\n  }\r\n  undo() {\r\n    if (this.historyIndex > 0) {\r\n      this.redoStack.push(this.history[this.historyIndex]);\r\n      this.historyIndex--;\r\n      const editor = document.getElementById('editor');\r\n\r\n      if (editor) {\r\n        this.sanitizedContent = this.history[this.historyIndex];\r\n      }\r\n    }\r\n  }\r\n\r\n  redo() {\r\n    if (this.redoStack.length > 0) {\r\n      const redoContent = this.redoStack.pop();\r\n      this.history.push(redoContent!);\r\n      this.historyIndex++;\r\n      const editor = document.getElementById('editor');\r\n\r\n      if (editor) {\r\n        this.sanitizedContent = redoContent!;\r\n      }\r\n    }\r\n  }\r\n\r\n  //   formatTextWithDates(text: string): string {\r\n  //   // Regular expression to detect YYYY-MM-DD formatted dates\r\n  //   const dateRegex = /\\b\\d{4}-\\d{2}-\\d{2}\\b/g;\r\n\r\n  //   // Replace found dates with a formatted version\r\n  //   return text.replace(dateRegex, (dateStr) => {\r\n  //     // Convert the detected date string into a Date object\r\n  //     const dateObj = new Date(dateStr);\r\n\r\n  //     // Format the date to 'Month Day, Year' (e.g., October 10, 2024)\r\n  //     return dateObj.toLocaleDateString('en-US', {\r\n  //       year: 'numeric',\r\n  //       month: 'long',\r\n  //       day: 'numeric',\r\n  //     });\r\n  //   });\r\n  // }\r\n\r\n  formatTextWithDates(text: string): string {\r\n    // Regular expression to detect YYYY-MM-DD formatted dates\r\n    const dateRegex = /\\b\\d{4}-\\d{2}-\\d{2}\\b/g;\r\n\r\n    // Replace found dates with a formatted version\r\n    return text.replace(dateRegex, (dateStr) => {\r\n      // Convert the detected date string into a Date object\r\n      const dateObj = new Date(dateStr);\r\n\r\n      // Extract day, month, and year\r\n      const day = dateObj.getDate().toString().padStart(2, '0'); // Ensure day is two digits\r\n      const month = dateObj.toLocaleString('en-US', { month: 'short' }); // Get abbreviated month name\r\n      const year = dateObj.getFullYear(); // Get full year\r\n\r\n      // Format the date as 'dd/mmm/yyyy'\r\n      return `${day}/${month}/${year}`;\r\n    });\r\n  }\r\n}","<div class=\"container els-text-editor px-0\" id=\"textEditor\" #fullscreen=\"ngxFullscreen\"\r\n                                        #textEditor\r\n                                            ngxFullscreen>\r\n    <div *ngIf=\"toolbarMode === 'fixed'\" class=\"btn-toolbar els-btn-toolbar p-2 py-2 mb-0\" role=\"toolbar\" [style.background]=\"themeModeBgClr()\"\r\n        [ngStyle]=\"{\r\n    'pointer-events': disableToolbar ? 'none' : 'auto',\r\n    'border-top-left-radius': IsOpen ? '0' : '20px',\r\n    'border-top-right-radius': IsOpen ? '0' : '20px'\r\n}\"\r\naria-label=\"Toolbar with button groups\"\r\nstyle=\"border-top-left-radius: 20px !important; border-top-right-radius: 20px !important;\"\r\n>\r\n        <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Header Options\">\r\n            <div ngbDropdown class=\"dropdown\">\r\n                <button\r\n                    class=\"btn btn-white els-form-select border els-toolbar-dropdown-button dropdown-toggle text-start\" [style.border-radius]=\"'5px'\"\r\n                    id=\"headerDropdown\" [style.border]=\"themeMode()\" [style.color]=\"themeModeClr()\" ngbDropdownToggle>\r\n                    <span>{{selectedFormatBlock | titlecase}}</span> <i class=\"mdi mdi-chevron-down \"></i>\r\n                </button>\r\n                <div ngbDropdownMenu aria-labelledby=\"headerDropdown\" class=\"els-text-format\"\r\n                    [style.border]=\"themeMode()\">\r\n                    <button class=\"dropdown-item pb-0\" type=\"button\" [style.color]=\"themeModeClr()\"\r\n                        (click)=\"format('formatBlock', '<h1>')\">\r\n                        <h1>Heading 1</h1>\r\n                    </button>\r\n                    <button class=\"dropdown-item pb-0\" type=\"button\" [style.color]=\"themeModeClr()\"\r\n                        (click)=\"format('formatBlock', '<h2>')\">\r\n                        <h2>Heading 2</h2>\r\n                    </button>\r\n                    <button class=\"dropdown-item pb-0\" type=\"button\" [style.color]=\"themeModeClr()\"\r\n                        (click)=\"format('formatBlock', '<h3>')\">\r\n                        <h3>Heading 3</h3>\r\n                    </button>\r\n                    <button class=\"dropdown-item pb-0\" type=\"button\" [style.color]=\"themeModeClr()\"\r\n                        (click)=\"format('formatBlock', '<h4>')\">\r\n                        <h4>Heading 4</h4>\r\n                    </button>\r\n                    <button class=\"dropdown-item pb-0\" type=\"button\" [style.color]=\"themeModeClr()\"\r\n                        (click)=\"format('formatBlock', '<h5>')\">\r\n                        <h5>Heading 5</h5>\r\n                    </button>\r\n                    <button class=\"dropdown-item pb-0\" type=\"button\" [style.color]=\"themeModeClr()\"\r\n                        (click)=\"format('formatBlock', '<h6>')\">\r\n                        <h6>Heading 6</h6>\r\n                    </button>\r\n                    <button class=\"dropdown-item pb-0\" type=\"button\" [style.color]=\"themeModeClr()\"\r\n                        (click)=\"format('formatBlock', '<p>')\">\r\n                        <p>Normal</p>\r\n                    </button>\r\n                </div>\r\n            </div>\r\n        </div>\r\n        <div class=\"btn-group els-button-group\" role=\"group\" aria-label=\"Font Options\">\r\n            <!-- <select class=\"els-form-select \" style=\" font-weight: 700 !important; color: #fff;border: 2px solid #7D6D6D !important;\" \r\n                [(ngModel)]=\"selectedFont\" (change)=\"changeFont($event)\">\r\n                <option class=\"els-form-option\" *ngFor=\"let font of fonts\" [value]=\"font\">{{ font }}</option>\r\n            </select> -->\r\n            <div ngbDropdown class=\"dropdown\">\r\n                <button\r\n                    class=\"btn btn-white els-form-select border els-toolbar-dropdown-button dropdown-toggle text-start\"\r\n                    id=\"headerDropdown\" style=\"width: 100px\" [style.border]=\"themeMode()\" [style.color]=\"themeModeClr()\"\r\n                    ngbDropdownToggle>\r\n                    <span style=\"width: 85px; font-weight: 700 !important;\" class=\"text-truncate\">{{selectedFont |\r\n                        titlecase}}</span>\r\n                    <i class=\"mdi mdi-chevron-down \"></i>\r\n                </button>\r\n                <div ngbDropdownMenu aria-labelledby=\"headerDropdown\" class=\"els-text-format\"\r\n                    [style.border]=\"themeMode()\">\r\n                    <button class=\"dropdown-item pb-0\" type=\"button\" *ngFor=\"let font of fonts\"\r\n                        (click)=\"changeFont(font)\" [style.color]=\"themeModeClr()\">\r\n                        <span>{{ font }}</span>\r\n                    </button>\r\n                </div>\r\n            </div>\r\n        </div>\r\n        <div class=\"py-0\"  style=\"height: fit-content;\" [style.color]=\"themeModeClr()\">\r\n            <div class=\"btn-group els-button-group me-2 mr-2 \" role=\"group\" aria-label=\"Text Formatting\">\r\n                <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isBoldActive\"\r\n                    (click)=\"format('bold')\">\r\n                    <i class=\"mdi mdi-format-bold\"></i>\r\n                </button>\r\n                <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isItalicActive\"\r\n                    (click)=\"format('italic')\">\r\n                    <i class=\"mdi mdi-format-italic\"></i>\r\n                </button>\r\n                <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isUnderlineActive\"\r\n                    (click)=\"format('underline')\">\r\n                    <i class=\"mdi mdi-format-underline\"></i>\r\n                </button>\r\n                <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isStrikethroughActive\"\r\n                    (click)=\"format('strikethrough')\">\r\n                    <i class=\"mdi mdi-format-strikethrough-variant\"></i>\r\n                </button>\r\n                <div class=\"btn-group\" role=\"group\" aria-label=\"Text Color\">\r\n                    <input type=\"color\" id=\"textColorPicker\"\r\n                        style=\"position: absolute; top: 100%; left: 0; z-index: 100; opacity: 0;\"\r\n                        (change)=\"setTextColor($event)\">\r\n                    <button type=\"button\" class=\"btn btn-white els-toolbar-button\" style=\"position: relative;\"\r\n                        (click)=\"openColorPicker('textColorPicker')\">\r\n                        <i class=\"mdi mdi-format-color-text icon-with-underline\" [style.color]=\"selectedTextColor\"></i>\r\n                    </button>\r\n                </div>\r\n                <div class=\"btn-group\" role=\"group\" aria-label=\"Background Color\" style=\"position: relative;\">\r\n                    <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [style.color]=\"backgroundColor\"\r\n                        (click)=\"openColorPicker('bgColorPicker')\">\r\n                        <i class=\"mdi mdi-alpha-a-box\"></i>\r\n                    </button>\r\n                    <input type=\"color\" id=\"bgColorPicker\"\r\n                        style=\"position: absolute; top: 100%; left: 0; z-index: 100; opacity: 0;\"\r\n                        (change)=\"setBackgroundColor($event)\">\r\n                </div>\r\n                <div class=\"vertical-line ms-2 border\" [style.border-left]=\"themeModeClrVerticalLine()\"></div>\r\n            </div>\r\n            <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n                <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('insertOrderedList')\"><i\r\n                        class=\"mdi mdi-format-list-numbered\"></i></button>\r\n                <button type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n                    (click)=\"format('insertUnorderedList')\"><i class=\"mdi mdi-format-list-bulleted\"></i></button>\r\n                <div ngbDropdown class=\"ql-align\">\r\n                    <button type=\"button\" class=\"btn btn-white els-toolbar-button  arrow-none text-secondary\"\r\n                        id=\"dropdownBasic1\" aria-expanded=\"false\" ngbDropdownToggle>\r\n                        <i class=\"mdi mdi-format-align-left \"></i>\r\n                    </button>\r\n                    <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\" style=\"width: 3px;\">\r\n                        <button type=\"button\" class=\"btn btn-white els-toolbar-button text-dark\"\r\n                            (click)=\"format('justifyLeft')\"><i class=\"mdi mdi-format-align-left\"></i></button>\r\n                        <button type=\"button\" class=\"btn btn-white els-toolbar-button text-dark\"\r\n                            (click)=\"format('justifyCenter')\"><i class=\"mdi mdi-format-align-center\"></i></button>\r\n                        <button type=\"button\" class=\"btn btn-white els-toolbar-button text-dark\"\r\n                            (click)=\"format('justifyRight')\"><i class=\"mdi mdi-format-align-right\"></i></button>\r\n                        <button type=\"button\" class=\"btn btn-white els-toolbar-button text-dark\"\r\n                            (click)=\"format('justifyFull')\"><i class=\"mdi mdi-format-align-justify\"></i></button>\r\n                    </div>\r\n                </div>\r\n                <div class=\"vertical-line ms-2 border\" [style.border-left]=\"themeModeClrVerticalLine()\"></div>\r\n            </div>\r\n            <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n                <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isSubscriptActive\"\r\n                    (click)=\"format('subscript')\">\r\n                    <i class=\"mdi mdi-format-subscript\"></i>\r\n                </button>\r\n                <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isSuperscriptActive\"\r\n                    (click)=\"format('superscript')\">\r\n                    <i class=\"mdi mdi-format-superscript\"></i>\r\n                </button>\r\n            </div>\r\n            <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n                <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"addLink()\"><i\r\n                        class=\"mdi mdi-link-variant\"></i></button>\r\n                <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"insertsImage()\"><i\r\n                        class=\"mdi mdi-image\"></i></button>\r\n                <input type=\"file\" id=\"imageInput\" style=\"display: none;\" (change)=\"handleImageUpload($event)\" accept=\"image/*\">\r\n            </div>\r\n            <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Table Options\">\r\n                <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"addTable()\"><i\r\n                        class=\"mdi mdi-table\"></i></button>\r\n                <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n                    (click)=\"addRow()\"><i class=\"mdi mdi-table-row-plus-after\"></i></button>\r\n                <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n                    (click)=\"deleteRow()\"><i class=\"mdi mdi-table-row-remove\"></i></button>\r\n                <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n                    (click)=\"addColumn()\"><i class=\"mdi mdi-table-column-plus-after\"></i></button>\r\n                <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n                    (click)=\"deleteColumn()\"><i class=\"mdi mdi-table-column-remove\"></i></button>\r\n                    <button \r\n          \r\n          type=\"button\" \r\n          class=\"btn btn-white els-toolbar-button\" \r\n          *ngIf=\"isTableSelected\" \r\n          [style.color]=\"tHeadBgColor\" \r\n          (click)=\"openColorPicker('tHeadbgColorPicker')\" \r\n        > \r\n          <i class=\"mdi mdi-table-edit\"></i> \r\n        </button> \r\n        <input \r\n          type=\"color\" \r\n          id=\"tHeadbgColorPicker\" \r\n          style=\" \r\n            position: absolute; \r\n            top: 100%; \r\n            left: 0; \r\n            z-index: 100; \r\n            opacity: 0; \r\n          \" \r\n          (change)=\"setTheadBgColor($event)\" \r\n        />\r\n            </div>\r\n            <!-- <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n                <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"undo()\">\r\n                    <i class=\"mdi mdi-undo\"></i>\r\n                </button>\r\n                <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"redo()\">\r\n                    <i class=\"mdi mdi-redo\"></i>\r\n                </button>\r\n            </div> -->\r\n            <div class=\"btn-group els-button-group\" role=\"group\" aria-label=\"Table Options\">\r\n                <!-- <button *ngIf=\"selectedImage\" class=\"btn btn-white els-toolbar-button-2\" (click)=\"editImage()\"\r\n                            style=\"position: absolute;\">Edit Image</button> -->\r\n                <button class=\"btn btn-white els-toolbar-button\" (click)=\"clearTextEditor()\"\r\n                    style=\" width: fit-content !important;\">\r\n                    <i class=\"mdi mdi-close-circle\"></i>\r\n                </button>\r\n            </div>\r\n            <div class=\"btn-group els-button-group\" role=\"group\" aria-label=\"Table Options\">\r\n                <button class=\"btn btn-white els-toolbar-button\" (click)=\"toggleFullscreen1()\">\r\n                    <ng-container *ngIf=\"IsOpen; else fullscreenIcon\">\r\n                        <i class=\"mdi mdi-fullscreen-exit\"></i> <!-- Collapse Icon -->\r\n                    </ng-container>\r\n                    <ng-template #fullscreenIcon>\r\n                        <i class=\"mdi mdi-fullscreen\"></i> <!-- Expand Icon -->\r\n                    </ng-template>\r\n                </button>\r\n            </div>\r\n        </div>\r\n    </div>\r\n    <div *ngIf=\"toolbarMode === 'bubble'\" class=\"bubble-toolbar border p-2\"\r\n        [ngStyle]=\"{'top.px': toolbarTop, 'left.px': toolbarLeft, 'display': showToolbar ? 'block' : 'none'}\">\r\n        <div class=\"btn-group els-button-group\" role=\"group\" aria-label=\"Font Options\">\r\n            <select class=\"els-form-select\" [(ngModel)]=\"selectedFont\" (change)=\"changeFont($event)\">\r\n                <option *ngFor=\"let font of fonts\" [value]=\"font\">{{ font }}</option>\r\n            </select>\r\n        </div>\r\n        <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n            <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isBoldActive\"\r\n                (click)=\"format('bold')\">\r\n                <i class=\"mdi mdi-format-bold\"></i>\r\n            </button>\r\n            <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isItalicActive\"\r\n                (click)=\"format('italic')\">\r\n                <i class=\"mdi mdi-format-italic\"></i>\r\n            </button>\r\n            <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isUnderlineActive\"\r\n                (click)=\"format('underline')\">\r\n                <i class=\"mdi mdi-format-underline\"></i>\r\n            </button>\r\n            <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isStrikethroughActive\"\r\n                (click)=\"format('strikethrough')\">\r\n                <i class=\"mdi mdi-format-strikethrough-variant\"></i>\r\n            </button>\r\n        </div>\r\n        <!-- <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n                <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('blockquote')\"><i\r\n                        class=\"mdi mdi-format-quote-close\"></i></button>\r\n                <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"insertCodeBlock()\"><i \r\n                        class=\"mdi mdi-code-tags\"></i></button>\r\n            </div> -->\r\n        <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n            <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('insertOrderedList')\"><i\r\n                    class=\"mdi mdi-format-list-numbered\"></i></button>\r\n            <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('insertUnorderedList')\"><i\r\n                    class=\"mdi mdi-format-list-bulleted\"></i></button>\r\n            <!-- <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Color Formatting\"> -->\r\n            <div class=\"btn-group\" role=\"group\" aria-label=\"Text Color\">\r\n                <!-- <div ngbDropdown class=\"ql-align\">\r\n                                <button type=\"button\" class=\"btn btn-outline-primary arrow-none text-secondary\" id=\"dropdownBasic1\"\r\n                                    aria-expanded=\"false\" ngbDropdownToggle>\r\n                                    <i class=\"mdi mdi-format-color-fill\"></i>\r\n                                </button>\r\n                                <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\" style=\"width: 300px;\">\r\n                                    <color-sketch color=\"#fff\" (onChangeComplete)=\"setTextColor($event)\"></color-sketch>\r\n                                </div>\r\n                            </div> -->\r\n                <!-- <div class=\"btn btn-white els-toolbar-button custom-color-trigger\" ngx-colors-trigger [(ngModel)]=\"color\"\r\n                                (ngModelChange)=\"logEvent($event, 'ngModelChange')\"\r\n                                (change)=\"logEvent($event, 'change')\"\r\n                                (input)=\"logEvent($event, 'input')\"\r\n                                >\r\n                                <i class=\"mdi mdi-format-color-text icon-with-underline\" [style.color]=\"color\"\r\n                                    [style]=\"{color: color}\"></i>\r\n                                <ngx-colors style=\"display: none;\" ></ngx-colors>\r\n                            </div> -->\r\n                <input type=\"color\" id=\"textColorPicker\"\r\n                    style=\"position: absolute; top: 100%; left: 0; z-index: 100; opacity: 0;\"\r\n                    (change)=\"setTextColor($event)\">\r\n                <button type=\"button\" class=\"btn btn-white els-toolbar-button\" style=\"position: relative;\"\r\n                    (click)=\"openColorPicker('textColorPicker')\">\r\n                    <i class=\"mdi mdi-format-color-text icon-with-underline\" [style.color]=\"selectedTextColor\"></i>\r\n                </button>\r\n            </div>\r\n\r\n            <!-- <div class=\"btn-group\" role=\"group\" aria-label=\"Background Color\">\r\n                            <input type=\"color\" id=\"bgColorPicker\" style=\"display: none;\" (change)=\"setBackgroundColor($event)\">\r\n                            <button type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n                                (click)=\"openColorPicker('bgColorPicker')\">\r\n                                <i class=\"mdi mdi-alpha-a-box\"></i>\r\n                            </button>\r\n                        </div> -->\r\n            <div class=\"btn-group\" role=\"group\" aria-label=\"Background Color\" style=\"position: relative;\">\r\n                <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [style.color]=\"backgroundColor\"\r\n                    (click)=\"openColorPicker('bgColorPicker')\">\r\n                    <i class=\"mdi mdi-alpha-a-box\"></i>\r\n                </button>\r\n                <!-- <input style=\"width: 0px !important;\" id=\"bgColorPicker\" [cpPresetColors]=\"['#fff', '#000', '#2889e9', '#e920e9', '#fff500', 'rgb(236,64,64)']\"\r\n                                [(colorPicker)]=\"color\" (change)=\"setBackgroundColor($event)\" /> -->\r\n                <input type=\"color\" id=\"bgColorPicker\"\r\n                    style=\"position: absolute; top: 100%; left: 0; z-index: 100; opacity: 0;\"\r\n                    (change)=\"setBackgroundColor($event)\">\r\n            </div>\r\n\r\n\r\n            <!-- </div> -->\r\n        </div>\r\n        <!-- <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Header Options\">\r\n                    <div class=\"dropdown\">\r\n                            <button class=\"btn btn-white els-toolbar-button dropdown-toggle\" type=\"button\" id=\"headerDropdown\"\r\n                                    data-toggle=\"dropdown\" aria-haspopup=\"true\" aria-expanded=\"false\">\r\n                                    <i class=\"mdi mdi-format-header-1\"></i>\r\n                            </button>\r\n                            <div class=\"dropdown-menu\" aria-labelledby=\"headerDropdown\">\r\n                                    <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h1>')\"><i\r\n                                                    class=\"mdi mdi-format-header-1\"></i> Heading 1</button>\r\n                                    <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h2>')\"><i\r\n                                                    class=\"mdi mdi-format-header-2\"></i> Heading 2</button>\r\n                                    <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h3>')\"><i\r\n                                                    class=\"mdi mdi-format-header-3\"></i> Heading 3</button>\r\n                                    <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h4>')\"><i\r\n                                                    class=\"mdi mdi-format-header-4\"></i> Heading 4</button>\r\n                                    <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h5>')\"><i\r\n                                                    class=\"mdi mdi-format-header-5\"></i> Heading 5</button>\r\n                                    <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h6>')\"><i\r\n                                                    class=\"mdi mdi-format-header-6\"></i> Heading 6</button>\r\n                            </div>\r\n                    </div>\r\n            </div> -->\r\n        <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Header Options\">\r\n            <div ngbDropdown class=\"dropdown\">\r\n                <button class=\"btn btn-white els-toolbar-dropdown-button dropdown-toggle\" id=\"headerDropdown\"\r\n                    ngbDropdownToggle>\r\n                    <span style=\"width: 85px;\">{{selectedFormatBlock | titlecase}}</span> <i\r\n                        class=\"mdi mdi-chevron-down text-dark\"></i>\r\n                </button>\r\n                <div ngbDropdownMenu aria-labelledby=\"headerDropdown\">\r\n                    <button class=\"dropdown-item pb-0\" type=\"button\" (click)=\"format('formatBlock', '<h1>')\">\r\n                        <h1>Heading 1</h1>\r\n                    </button>\r\n                    <button class=\"dropdown-item pb-0\" type=\"button\" (click)=\"format('formatBlock', '<h2>')\">\r\n                        <h2>Heading 2</h2>\r\n                    </button>\r\n                    <button class=\"dropdown-item pb-0\" type=\"button\" (click)=\"format('formatBlock', '<h3>')\">\r\n                        <h3>Heading 3</h3>\r\n                    </button>\r\n                    <button class=\"dropdown-item pb-0\" type=\"button\" (click)=\"format('formatBlock', '<h4>')\">\r\n                        <h4>Heading 4</h4>\r\n                    </button>\r\n                    <button class=\"dropdown-item pb-0\" type=\"button\" (click)=\"format('formatBlock', '<h5>')\">\r\n                        <h5>Heading 5</h5>\r\n                    </button>\r\n                    <button class=\"dropdown-item pb-0\" type=\"button\" (click)=\"format('formatBlock', '<h6>')\">\r\n                        <h6>Heading 6</h6>\r\n                    </button>\r\n                    <button class=\"dropdown-item pb-0\" type=\"button\" (click)=\"format('formatBlock', '<p>')\">\r\n                        <p>Normal</p>\r\n                    </button>\r\n                </div>\r\n            </div>\r\n        </div>\r\n        <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n            <!-- <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('superscript')\"><i\r\n                        class=\"mdi mdi-format-superscript\"></i></button>\r\n                <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('subscript')\"><i\r\n                        class=\"mdi mdi-format-subscript\"></i></button> -->\r\n            <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isSubscriptActive\"\r\n                (click)=\"format('subscript')\">\r\n                <i class=\"mdi mdi-format-subscript\"></i>\r\n            </button>\r\n            <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isSuperscriptActive\"\r\n                (click)=\"format('superscript')\">\r\n                <i class=\"mdi mdi-format-superscript\"></i>\r\n            </button>\r\n        </div>\r\n        <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n            <div ngbDropdown class=\"ql-align\">\r\n                <button type=\"button\" class=\"btn btn-white els-toolbar-button arrow-none text-secondary\"\r\n                    id=\"dropdownBasic1\" aria-expanded=\"false\" ngbDropdownToggle>\r\n                    <i class=\"mdi mdi-format-align-left \"></i>\r\n                </button>\r\n                <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\" style=\"width: 3px;\">\r\n                    <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('justifyLeft')\"><i\r\n                            class=\"mdi mdi-format-align-left\"></i></button>\r\n                    <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('justifyCenter')\"><i\r\n                            class=\"mdi mdi-format-align-center\"></i></button>\r\n                    <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('justifyRight')\"><i\r\n                            class=\"mdi mdi-format-align-right\"></i></button>\r\n                    <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('justifyFull')\"><i\r\n                            class=\"mdi mdi-format-align-justify\"></i></button>\r\n                </div>\r\n            </div>\r\n        </div>\r\n\r\n        <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n            <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('removeFormat')\"><i\r\n                    class=\"mdi mdi-format-clear\"></i></button>\r\n        </div>\r\n        <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n            <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"addLink()\"><i\r\n                    class=\"mdi mdi-link-variant\"></i></button>\r\n            <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"insertsImage()\"><i\r\n                    class=\"mdi mdi-image\"></i></button>\r\n            <input type=\"file\" id=\"imageInput\" style=\"display: none;\" (change)=\"handleImageUpload($event)\" accept=\"image/*\">\r\n        </div>\r\n        <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Table Options\">\r\n            <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"addTable()\"><i\r\n                    class=\"mdi mdi-table\"></i></button>\r\n            <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"addRow()\"><i\r\n                    class=\"mdi mdi-table-row-plus-after\"></i></button>\r\n            <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n                (click)=\"deleteRow()\"><i class=\"mdi mdi-table-row-remove\"></i></button>\r\n            <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n                (click)=\"addColumn()\"><i class=\"mdi mdi-table-column-plus-after\"></i></button>\r\n            <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n                (click)=\"deleteColumn()\"><i class=\"mdi mdi-table-column-remove\"></i></button>\r\n        </div>\r\n        <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Table Options\">\r\n            <button *ngIf=\"selectedImage\" class=\"btn btn-white els-toolbar-button-2\" (click)=\"editImage()\"\r\n                style=\"position: absolute;\">Edit Image</button>\r\n        </div>\r\n\r\n\r\n        <!-- <div class=\"btn btn-white els-toolbar-button custom-color-trigger\">\r\n        <i class=\"mdi mdi-format-color-text icon-with-underline\" [style.color]=\"color\"></i>\r\n        <ngx-colors [(ngModel)]=\"color\" (change)=\"colorChanged($event)\"></ngx-colors>\r\n    </div> -->\r\n        <!-- <div class=\"btn-group els-button-group\" ngbDropdown aria-label=\"Table Options\">\r\n                <button class=\"btn btn-white els-toolbar-button\" ngbDropdownToggle  (click)=\"addTable()\">\r\n                    <i class=\"mdi mdi-table\"></i>\r\n                </button>\r\n            \r\n                <div ngbDropdownMenu *ngIf=\"isTableSelected || tableAdded\">\r\n                    <button class=\"dropdown-item\" (click)=\"addRow()\">\r\n                        <i class=\"mdi mdi-table-row-plus-after\"></i> Add Row\r\n                    </button>\r\n                    <button class=\"dropdown-item\" (click)=\"deleteRow()\">\r\n                        <i class=\"mdi mdi-table-row-remove\"></i> Delete Row\r\n                    </button>\r\n                    <button class=\"dropdown-item\" (click)=\"addColumn()\">\r\n                        <i class=\"mdi mdi-table-column-plus-after\"></i> Add Column\r\n                    </button>\r\n                    <button class=\"dropdown-item\" (click)=\"deleteColumn()\">\r\n                        <i class=\"mdi mdi-table-column-remove\"></i> Delete Column\r\n                    </button>\r\n                    <div class=\"dropdown-divider\"></div>\r\n                    <div class=\"dropdown-item\">\r\n                        <label for=\"tableWidth\">Table Width</label>\r\n                        <input type=\"number\" id=\"tableWidth\" class=\"form-control\" (change)=\"adjustTableWidth($event)\"\r\n                            placeholder=\"Width\">\r\n                    </div>\r\n                    <div class=\"dropdown-item\">\r\n                        <label for=\"cellWidth\">Cell Width</label>\r\n                        <input type=\"number\" id=\"cellWidth\" class=\"form-control\" (change)=\"adjustCellWidth($event)\"\r\n                            placeholder=\"Width\">\r\n                    </div>\r\n                    <div class=\"dropdown-item\">\r\n                        <label for=\"cellHeight\">Cell Height</label>\r\n                        <input type=\"number\" id=\"cellHeight\" class=\"form-control\" (change)=\"adjustCellHeight($event)\"\r\n                            placeholder=\"Height\">\r\n                    </div>\r\n                </div>\r\n            </div> -->\r\n    </div>\r\n    <!-- <div contenteditable=\"true\" id=\"editor\" class=\"p-3 custom-scrollbar non-focus\" #editor\r\n        style=\"position: relative !important;border-bottom-left-radius: 20px !important; border-bottom-right-radius: 20px !important; border-bottom-left-radius: 20px !important;\" [style.background]=\"themeModeBgClr()\" [style.border-top]=\"themeModeBorderTop()\"\r\n        [ngStyle]=\"{'font-family': selectedFont, 'font-size': selectedFontSize + 'px'}\" [style]=\"style\"\r\n        [style.min-height]=\"IsOpen ? '85vh !important' :  '405px !important'\"\r\n        (input)=\"onModelChange($event)\" placeholder=\"Insert text here ...\" readonly (mouseup)=\"onTextSelect($event)\"\r\n        [innerHTML]=\"sanitizedContent\" (paste)=\"onPaste($event)\" (focus)=\"onFocus()\" (blur)=\"onBlur()\"\r\n        (click)=\"checkTableSelection($event)\">\r\n    </div> -->\r\n    <!-- <div contenteditable=\"true\" id=\"editor\" class=\"p-3 custom-scrollbar non-focus overflow-auto\" #editor\r\n         style=\"position: relative !important;\r\n               \" [style.background]=\"themeModeBgClr()\"\r\n        [style.border-top]=\"themeModeBorderTop()\"\r\n        \r\n        [ngStyle]=\"{'font-family': selectedFont, 'font-size': selectedFontSize + 'px',\r\n           'border-bottom-left-radius': isOpen ? '0' :'20px',\r\n           'border-bottom-right-radius': isOpen ? '0' :'20px'\r\n        }\"\r\n        [style.min-height]=\"IsOpen ? '93vh' : '405px'\" (input)=\"onModelChange($event)\" placeholder=\"Insert text here ...\"\r\n        readonly (mouseup)=\"onTextSelect($event)\" [innerHTML]=\"sanitizedContent\" (paste)=\"onPaste($event)\"\r\n        (focus)=\"onFocus()\" (blur)=\"onBlur()\" (click)=\"checkTableSelection($event)\">\r\n    </div> -->\r\n    <!-- <div [attr.contenteditable]=\"contentEditable\" id=\"editor\" class=\"p-3 custom-scrollbar non-focus overflow-auto\" #editor\r\n        style=\"position: relative !important; overflow: auto;\" [style.background]=\"themeModeBgClr()\"\r\n        [style.border-top]=\"themeModeBorderTop()\" [ngStyle]=\"{\r\n                'font-family': selectedFont, \r\n                'font-size': selectedFontSize + 'px',\r\n                'border-bottom-left-radius': IsOpen ? '0' :'20px',\r\n                'border-bottom-right-radius': IsOpen ? '0' :'20px',\r\n                'min-height': IsOpen ? '93vh' : '405px',\r\n                'max-height': IsOpen ? '93vh' : '405px',\r\n                'background-image': backgroundImage ? 'url(' + backgroundImage + ')' : 'none',\r\n    'background-size': 'cover',\r\n    'background-position': 'center'\r\n            }\" placeholder=\"Insert text here ...\" readonly (mouseup)=\"onTextSelect($event)\"\r\n        (input)=\"onModelChange($event)\" [innerHTML]=\"sanitizedContent\" (paste)=\"onPaste($event)\" (focus)=\"onFocus()\"\r\n        (blur)=\"onBlur()\" (click)=\"checkTableSelection($event)\" (keydown)=\"handleTabKey($event)\">\r\n    </div> -->\r\n\r\n    <div [attr.contenteditable]=\"contentEditable\" id=\"editor\" class=\"p-3 custom-scrollbar non-focus overflow-auto\" #editor\r\n    style=\"position: relative !important; overflow: auto;\" [style.background]=\"themeModeBgClr()\"\r\n    [style.border-top]=\"themeModeBorderTop()\" [ngStyle]=\"{\r\n            'font-family': selectedFont, \r\n            'font-size': selectedFontSize + 'px',\r\n            'border-bottom-left-radius': IsOpen ? '0' :'20px',\r\n            'border-bottom-right-radius': IsOpen ? '0' :'20px',\r\n            'min-height': IsOpen ? '93vh' : '405px',\r\n            'max-height': IsOpen ? '93vh' : '405px',\r\n            'background-image': backgroundImage ? 'url(' + backgroundImage + ')' : 'none',\r\n            'background-size': 'cover',\r\n            'background-position': 'center',\r\n            'background-attachment': 'local',\r\n            'background-clip': 'padding-box',\r\n            'background-repeat': 'no-repeat',\r\n            'height':'100%'\r\n        }\" placeholder=\"Insert text here ...\" readonly (mouseup)=\"onTextSelect($event)\"\r\n    (input)=\"onModelChange($event)\" [innerHTML]=\"sanitizedContent\" (paste)=\"onPaste($event)\" (focus)=\"onFocus()\"\r\n    (blur)=\"onBlur()\" (click)=\"checkTableSelection($event)\" (keydown)=\"handleTabKey($event)\">\r\n</div>\r\n\r\n    <table *ngIf=\"parsedTable\">\r\n        <thead>\r\n            <tr>\r\n                <th *ngFor=\"let header of parsedTable.headers\">{{ header }}</th>\r\n            </tr>\r\n        </thead>\r\n        <tbody>\r\n            <tr *ngFor=\"let row of parsedTable.rows\">\r\n                <td *ngFor=\"let cell of row\">{{ cell }}</td>\r\n            </tr>\r\n        </tbody>\r\n    </table>\r\n\r\n</div>","import { NgModule } from '@angular/core';\r\nimport { ElTextEditorComponent } from './el-text-editor.component';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap';\r\nimport { ColorSketchModule } from 'ngx-color/sketch';\r\nimport { ColorPickerModule } from 'ngx-color-picker';\r\nimport { NgxFullscreenModule } from '@ultimate/ngx-fullscreen';\r\n\r\n\r\n\r\n@NgModule({\r\n  declarations: [\r\n    ElTextEditorComponent\r\n  ],\r\n  imports: [\r\n    CommonModule,\r\n    FormsModule,\r\n    ReactiveFormsModule,\r\n    NgbDropdownModule,\r\n    ColorSketchModule,\r\n    ColorPickerModule,\r\n    NgxFullscreenModule,\r\n  ],\r\n  exports: [\r\n    ElTextEditorComponent\r\n  ]\r\n})\r\nexport class ElTextEditorModule { }\r\n","/*\r\n * Public API Surface of el-text-editor\r\n */\r\n\r\nexport * from './lib/el-text-editor.service';\r\nexport * from './lib/el-text-editor.component';\r\nexport * from './lib/el-text-editor.module';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}