@eui/components 18.0.0-next.63 → 18.0.0-next.64

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (143) hide show
  1. package/docs/components/CollapsedBreadcrumbComponent.html +1 -1
  2. package/docs/components/EuiAppSidebarHeaderUserProfileComponent.html +1 -1
  3. package/docs/components/EuiAppTopMessageComponent.html +1 -1
  4. package/docs/components/EuiBreadcrumbItemComponent.html +1 -1
  5. package/docs/components/EuiCardFooterMenuContentComponent.html +1 -1
  6. package/docs/components/EuiCardHeaderComponent.html +1 -1
  7. package/docs/components/EuiChipListComponent.html +1 -1
  8. package/docs/components/EuiDialogContainerComponent.html +1 -1
  9. package/docs/components/EuiDiscussionThreadItemComponent.html +1 -1
  10. package/docs/components/EuiDropdownItemComponent.html +1 -1
  11. package/docs/components/EuiEditorComponent.html +1 -1
  12. package/docs/components/EuiFilePreviewComponent.html +1 -1
  13. package/docs/components/EuiGrowlComponent.html +1 -1
  14. package/docs/components/EuiIconButtonExpanderComponent.html +1 -1
  15. package/docs/components/EuiListItemComponent.html +1 -1
  16. package/docs/components/EuiMenuComponent.html +1 -1
  17. package/docs/components/EuiMenuItemComponent.html +1 -1
  18. package/docs/components/EuiNotificationItemComponent.html +1 -1
  19. package/docs/components/EuiNotificationItemV2Component.html +1 -1
  20. package/docs/components/EuiNotificationsComponent.html +1 -1
  21. package/docs/components/EuiNotificationsV2Component.html +1 -1
  22. package/docs/components/EuiOverlayHeaderTitleComponent.html +1 -1
  23. package/docs/components/EuiPageColumnComponent.html +1 -1
  24. package/docs/components/EuiPageHeaderComponent.html +1 -1
  25. package/docs/components/EuiPaginatorComponent.html +1 -1
  26. package/docs/components/EuiPopoverComponent.html +1 -1
  27. package/docs/components/EuiSearchComponent.html +1 -1
  28. package/docs/components/EuiTableFilterComponent.html +1 -1
  29. package/docs/components/EuiTableSortableColComponent.html +1 -1
  30. package/docs/components/EuiTableV2FilterComponent.html +1 -1
  31. package/docs/components/EuiTableV2SortableColComponent.html +1 -1
  32. package/docs/components/EuiTabsComponent.html +1 -1
  33. package/docs/components/EuiTimebarComponent.html +1 -1
  34. package/docs/components/EuiTimepickerComponent.html +1 -1
  35. package/docs/components/EuiToolbarMenuComponent.html +1 -1
  36. package/docs/components/EuiToolbarNavbarComponent.html +1 -1
  37. package/docs/components/EuiTreeComponent.html +3 -3
  38. package/docs/components/EuiTreeListToolbarComponent.html +1 -1
  39. package/docs/components/EuiUserProfileCardComponent.html +1 -1
  40. package/docs/components/EuiUserProfileComponent.html +1 -1
  41. package/docs/components/EuiWizardComponent.html +1 -1
  42. package/docs/dependencies.html +1 -1
  43. package/docs/js/menu-wc.js +3 -3
  44. package/docs/js/menu-wc_es5.js +1 -1
  45. package/docs/js/search/search_index.js +2 -2
  46. package/esm2022/eui-card/components/eui-card-footer/eui-card-footer-menu-content.component.mjs +3 -3
  47. package/esm2022/eui-card/components/eui-card-header/eui-card-header.component.mjs +3 -3
  48. package/esm2022/eui-card/eui-card.component.mjs +2 -2
  49. package/esm2022/eui-chip-list/eui-chip-list.component.mjs +3 -3
  50. package/esm2022/eui-dialog/container/eui-dialog-container.component.mjs +3 -3
  51. package/esm2022/eui-dialog/eui-dialog.component.mjs +2 -2
  52. package/esm2022/eui-discussion-thread/eui-discussion-thread-item.component.mjs +3 -3
  53. package/esm2022/eui-dropdown/dropdown-item/eui-dropdown-item.component.mjs +3 -3
  54. package/esm2022/eui-file-upload/file-preview/file-preview.component.mjs +3 -3
  55. package/esm2022/eui-growl/eui-growl.component.mjs +3 -3
  56. package/esm2022/eui-icon/eui-icon-button-expander/eui-icon-button-expander.component.mjs +3 -3
  57. package/esm2022/eui-icon/eui-icon-svg.component.mjs +2 -2
  58. package/esm2022/eui-list/eui-list-item/eui-list-item.component.mjs +3 -3
  59. package/esm2022/eui-list/eui-list.component.mjs +2 -2
  60. package/esm2022/eui-menu/eui-menu-item.component.mjs +3 -3
  61. package/esm2022/eui-menu/eui-menu.component.mjs +3 -3
  62. package/esm2022/eui-overlay/components/eui-overlay-header/eui-overlay-header-title/eui-overlay-header-title.component.mjs +3 -3
  63. package/esm2022/eui-page/components/eui-page-column/eui-page-column.component.mjs +3 -3
  64. package/esm2022/eui-page/components/eui-page-header/eui-page-header.component.mjs +3 -3
  65. package/esm2022/eui-paginator/eui-paginator.component.mjs +3 -3
  66. package/esm2022/eui-popover/eui-popover.component.mjs +3 -3
  67. package/esm2022/eui-table/filter/eui-table-filter.component.mjs +3 -3
  68. package/esm2022/eui-table/sortable-col/eui-table-sortable-col.component.mjs +3 -3
  69. package/esm2022/eui-table-v2/filter/eui-table-v2-filter.component.mjs +3 -3
  70. package/esm2022/eui-table-v2/sortable-col/eui-table-v2-sortable-col.component.mjs +3 -3
  71. package/esm2022/eui-tabs/eui-tabs.component.mjs +3 -3
  72. package/esm2022/eui-timebar/eui-timebar.component.mjs +3 -3
  73. package/esm2022/eui-timepicker/eui-timepicker.component.mjs +3 -3
  74. package/esm2022/eui-tree/eui-tree.component.mjs +5 -5
  75. package/esm2022/eui-tree-list/toolbar/toolbar.component.mjs +3 -3
  76. package/esm2022/eui-user-profile/user-profile-card/user-profile-card.component.mjs +3 -3
  77. package/esm2022/eui-user-profile/user-profile.component.mjs +3 -3
  78. package/esm2022/eui-wizard/eui-wizard.component.mjs +3 -3
  79. package/esm2022/externals/eui-editor/eui-editor.component.mjs +3 -3
  80. package/esm2022/layout/eui-app/eui-app-sidebar/sidebar-header-user-profile/sidebar-header-user-profile.component.mjs +3 -3
  81. package/esm2022/layout/eui-app/eui-app-top-message/top-message.component.mjs +3 -3
  82. package/esm2022/layout/eui-breadcrumb/collapsed-breadcrumb/collapsed-breadcrumb.component.mjs +3 -3
  83. package/esm2022/layout/eui-breadcrumb/item/breadcrumb-item.component.mjs +3 -3
  84. package/esm2022/layout/eui-notifications/eui-notification-item.component.mjs +3 -3
  85. package/esm2022/layout/eui-notifications/eui-notifications.component.mjs +3 -3
  86. package/esm2022/layout/eui-notifications-v2/eui-notification-item.component.mjs +3 -3
  87. package/esm2022/layout/eui-notifications-v2/eui-notifications.component.mjs +3 -3
  88. package/esm2022/layout/eui-search/search.component.mjs +3 -3
  89. package/esm2022/layout/eui-toolbar/toolbar-menu/toolbar-menu.component.mjs +3 -3
  90. package/esm2022/layout/eui-toolbar/toolbar-navbar/toolbar-navbar.component.mjs +3 -3
  91. package/eui-list/eui-list-item/eui-list-item.component.d.ts +1 -1
  92. package/eui-tree/eui-tree.component.d.ts.map +1 -1
  93. package/fesm2022/eui-components-eui-card.mjs +6 -6
  94. package/fesm2022/eui-components-eui-card.mjs.map +2 -2
  95. package/fesm2022/eui-components-eui-chip-list.mjs +4 -4
  96. package/fesm2022/eui-components-eui-chip-list.mjs.map +1 -1
  97. package/fesm2022/eui-components-eui-dialog.mjs +18 -18
  98. package/fesm2022/eui-components-eui-dialog.mjs.map +2 -2
  99. package/fesm2022/eui-components-eui-discussion-thread.mjs +8 -8
  100. package/fesm2022/eui-components-eui-discussion-thread.mjs.map +1 -1
  101. package/fesm2022/eui-components-eui-dropdown.mjs +2 -2
  102. package/fesm2022/eui-components-eui-dropdown.mjs.map +2 -2
  103. package/fesm2022/eui-components-eui-file-upload.mjs +2 -2
  104. package/fesm2022/eui-components-eui-file-upload.mjs.map +2 -2
  105. package/fesm2022/eui-components-eui-growl.mjs +2 -2
  106. package/fesm2022/eui-components-eui-growl.mjs.map +1 -1
  107. package/fesm2022/eui-components-eui-icon.mjs +10 -10
  108. package/fesm2022/eui-components-eui-icon.mjs.map +2 -2
  109. package/fesm2022/eui-components-eui-list.mjs +4 -4
  110. package/fesm2022/eui-components-eui-list.mjs.map +2 -2
  111. package/fesm2022/eui-components-eui-menu.mjs +18 -18
  112. package/fesm2022/eui-components-eui-menu.mjs.map +2 -2
  113. package/fesm2022/eui-components-eui-overlay.mjs +2 -2
  114. package/fesm2022/eui-components-eui-overlay.mjs.map +2 -2
  115. package/fesm2022/eui-components-eui-page.mjs +4 -4
  116. package/fesm2022/eui-components-eui-page.mjs.map +2 -2
  117. package/fesm2022/eui-components-eui-paginator.mjs +8 -8
  118. package/fesm2022/eui-components-eui-paginator.mjs.map +1 -1
  119. package/fesm2022/eui-components-eui-popover.mjs +2 -2
  120. package/fesm2022/eui-components-eui-popover.mjs.map +2 -2
  121. package/fesm2022/eui-components-eui-table-v2.mjs +8 -8
  122. package/fesm2022/eui-components-eui-table-v2.mjs.map +1 -1
  123. package/fesm2022/eui-components-eui-table.mjs +14 -14
  124. package/fesm2022/eui-components-eui-table.mjs.map +1 -1
  125. package/fesm2022/eui-components-eui-tabs.mjs +2 -2
  126. package/fesm2022/eui-components-eui-tabs.mjs.map +2 -2
  127. package/fesm2022/eui-components-eui-timebar.mjs +6 -6
  128. package/fesm2022/eui-components-eui-timebar.mjs.map +1 -1
  129. package/fesm2022/eui-components-eui-timepicker.mjs +12 -12
  130. package/fesm2022/eui-components-eui-timepicker.mjs.map +1 -1
  131. package/fesm2022/eui-components-eui-tree-list.mjs +6 -6
  132. package/fesm2022/eui-components-eui-tree-list.mjs.map +1 -1
  133. package/fesm2022/eui-components-eui-tree.mjs +6 -6
  134. package/fesm2022/eui-components-eui-tree.mjs.map +1 -1
  135. package/fesm2022/eui-components-eui-user-profile.mjs +4 -4
  136. package/fesm2022/eui-components-eui-user-profile.mjs.map +2 -2
  137. package/fesm2022/eui-components-eui-wizard.mjs +2 -2
  138. package/fesm2022/eui-components-eui-wizard.mjs.map +2 -2
  139. package/fesm2022/eui-components-externals-eui-editor.mjs +8 -8
  140. package/fesm2022/eui-components-externals-eui-editor.mjs.map +1 -1
  141. package/fesm2022/eui-components-layout.mjs +36 -36
  142. package/fesm2022/eui-components-layout.mjs.map +2 -2
  143. package/package.json +21 -21
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../externals/eui-editor/eui-components-externals-eui-editor.ts", "../../externals/eui-editor/index.ts", "../../externals/eui-editor/image-url-dialog/image-url-dialog.component.ts", "../../externals/eui-editor/image-url-dialog/image-url-dialog.component.html", "../../externals/eui-editor/json-view/eui-editor-json-view.component.ts", "../../externals/eui-editor/html-view/eui-editor-html-view.component.ts", "../../externals/eui-editor/html-view/eui-editor-html-view.component.html", "../../externals/eui-editor/counters/eui-editor-counters.component.ts", "../../externals/eui-editor/counters/eui-editor-counters.component.html", "../../externals/eui-editor/eui-editor.component.ts", "../../externals/eui-editor/eui-editor.component.html", "../../externals/eui-editor/directives/eui-editor-maxlength.directive.ts", "../../externals/eui-editor/validators/eui-editor.validators.ts", "../../externals/eui-editor/eui-editor.module.ts"],
4
- "sourcesContent": ["/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n", "export * from './eui-editor.component';\nexport * from '@eui/components/externals/quill';\nexport * from './directives/eui-editor-maxlength.directive';\nexport * from './validators/eui-editor.validators';\nexport * from './counters/eui-editor-counters.component';\nexport * from './eui-editor.module';\n", "import { Component, OnInit, OnDestroy, Inject } from '@angular/core';\nimport { takeUntil } from 'rxjs/operators';\nimport { AbstractControl, Validators, FormGroup, FormControl } from '@angular/forms';\nimport { Subject } from 'rxjs';\n\nimport { DIALOG_COMPONENT_CONFIG } from '@eui/components/eui-dialog';\n\nconst urlValidator = (control: AbstractControl): { isUrlValid: false } | null => {\n const isHttp = control.value.substr(0, 7) === 'http://';\n const isHttps = control.value.substr(0, 8) === 'https://';\n\n return !isHttp && !isHttps ? { isUrlValid: false } : null;\n};\n\nexport interface EuiEditorImageDialogConfig {\n onFormValueChange: (form: FormGroup) => void;\n}\n\n@Component({\n templateUrl: 'image-url-dialog.component.html',\n})\nexport class EuiEditorImageDialogComponent implements OnInit, OnDestroy {\n public form: FormGroup;\n\n private destroy$: Subject<boolean> = new Subject<boolean>();\n\n constructor(@Inject(DIALOG_COMPONENT_CONFIG) private config: EuiEditorImageDialogConfig) {}\n\n ngOnInit(): void {\n this.form = new FormGroup({\n url: new FormControl<string>('', [Validators.required, urlValidator]),\n });\n\n this.form.valueChanges.pipe(takeUntil(this.destroy$)).subscribe(() => {\n this.config.onFormValueChange(this.form);\n });\n }\n\n ngOnDestroy(): void {\n this.destroy$.next(true);\n this.destroy$.unsubscribe();\n }\n}\n", "<form [formGroup]=\"form\">\n <input euiInputText formControlName=\"url\" />\n</form>\n", "import {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n Inject,\n Input,\n OnChanges,\n SimpleChanges,\n ViewEncapsulation,\n} from '@angular/core';\n\nconst QuillType: any = window['Quill'];\n\n@Component({\n // eslint-disable-next-line\n selector: 'eui-editor-json-view',\n template: '',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EuiEditorJsonViewComponent implements AfterViewInit, OnChanges {\n @Input() theme = 'snow';\n @Input() content: string;\n\n private quillEditor: typeof QuillType;\n private editorElem: HTMLElement;\n\n constructor(@Inject(ElementRef) private elementRef: ElementRef) {}\n\n valueSetter = (quillEditor: typeof QuillType, value: string): void => {\n let content: any = value;\n try {\n content = JSON.parse(value);\n } catch (e) {\n console.warn('JSON parse error!');\n }\n quillEditor?.setContents(content);\n };\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes && changes.content && changes.content?.currentValue) {\n this.valueSetter(this.quillEditor, changes.content.currentValue);\n }\n }\n\n ngAfterViewInit(): void {\n this.elementRef.nativeElement.insertAdjacentHTML('afterbegin', '<div quill-view-element></div>');\n\n this.editorElem = this.elementRef.nativeElement.querySelector('[quill-view-element]');\n\n const Quill: any = window['Quill'];\n\n this.quillEditor = new Quill(this.editorElem, {\n debug: false,\n formats: null,\n modules: { toolbar: false },\n readOnly: true,\n strict: true,\n theme: 'snow',\n });\n\n if (this.content) {\n this.valueSetter(this.quillEditor, this.content);\n }\n }\n}\n", "import { Component, Input, OnChanges, SimpleChanges, ViewEncapsulation, ChangeDetectionStrategy } from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\n\n@Component({\n // eslint-disable-next-line\n selector: 'eui-editor-html-view',\n templateUrl: './eui-editor-html-view.component.html',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EuiEditorHtmlViewComponent implements OnChanges {\n @Input() content = '';\n @Input() theme = 'snow';\n\n public innerHTML: SafeHtml = '';\n public themeClass = 'ql-snow';\n\n constructor(private sanitizer: DomSanitizer) {}\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes && changes.content && changes.content?.currentValue) {\n this.innerHTML = this.sanitizer.bypassSecurityTrustHtml(changes.content.currentValue);\n } else {\n this.innerHTML = '';\n }\n }\n}\n", "<div #editor class=\"ql-container\" [ngClass]=\"themeClass\">\n <div class=\"ql-editor\" [innerHTML]=\"innerHTML\"></div>\n</div>\n", "import { coerceBooleanProperty, BooleanInput } from '@angular/cdk/coercion';\nimport { ChangeDetectionStrategy, Component, Input, ViewEncapsulation } from '@angular/core';\n\n@Component({\n // eslint-disable-next-line\n selector: 'eui-editor-counters',\n templateUrl: './eui-editor-counters.component.html',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EuiEditorCountersComponent {\n @Input() charactersCounter: number;\n @Input() charactersLabel = 'characters';\n @Input() wordsCounter: number;\n @Input() wordsLabel = 'words';\n @Input()\n get isMaxLengthValid(): boolean {\n return this._isMaxLengthValid;\n }\n set isMaxLengthValid(value: BooleanInput) {\n this._isMaxLengthValid = coerceBooleanProperty(value);\n }\n private _isMaxLengthValid = true;\n @Input()\n get hasCharactersCounter(): boolean {\n return this._hasCharactersCounter;\n }\n set hasCharactersCounter(value: BooleanInput) {\n this._hasCharactersCounter = coerceBooleanProperty(value);\n }\n private _hasCharactersCounter = true;\n @Input()\n get hasWordsCounter(): boolean {\n return this._hasWordsCounter;\n }\n set hasWordsCounter(value: BooleanInput) {\n this._hasWordsCounter = coerceBooleanProperty(value);\n }\n private _hasWordsCounter = true;\n}\n", "<button class=\"editor-counters\">\n <div *ngIf=\"hasCharactersCounter\" class=\"eui-u-flex eui-u-flex-column\" [class.eui-u-mr-2xs]=\"hasWordsCounter\">\n <span class=\"chars-counter\" [class.chars-counter--error]=\"!isMaxLengthValid\">{{ charactersCounter }}</span>\n <span class=\"chars-label\">{{ charactersLabel }}</span>\n </div>\n <div *ngIf=\"hasWordsCounter\" class=\"eui-u-flex eui-u-flex-column eui-u-mv-2xs\">\n <span class=\"words-counter\">{{ wordsCounter }}</span>\n <span class=\"words-label\">{{ wordsLabel }}</span>\n </div>\n</button>\n", "import {\n Component,\n EventEmitter,\n Input,\n Output,\n OnInit,\n ViewEncapsulation,\n ChangeDetectionStrategy,\n HostBinding,\n OnDestroy,\n Directive,\n ContentChild,\n forwardRef,\n ElementRef,\n HostListener,\n Pipe,\n ChangeDetectorRef,\n} from '@angular/core';\nimport { ControlValueAccessor, FormControl, FormGroup, NgControl } from '@angular/forms';\nimport { ContentChange, QuillModules } from '@eui/components/externals/quill';\n\nimport { coerceBooleanProperty, BooleanInput } from '@angular/cdk/coercion';\n// eslint-disable-next-line @typescript-eslint/naming-convention,no-underscore-dangle,id-denylist,id-match\nconst QuillType: any = window['Quill'];\nimport { startWith, takeUntil } from 'rxjs/operators';\nimport { Subject } from 'rxjs';\nimport Delta from 'quill-delta';\n\nimport { EuiDialogConfig, EuiDialogService } from '@eui/components/eui-dialog';\n\nimport { LoaderService, BetterTableModule, Blur, EditorChangeSelection, Focus, SelectionChange, ToolbarItemConfig } from '@eui/components/externals/quill';\nimport { EuiEditorImageDialogComponent } from './image-url-dialog/image-url-dialog.component';\n// eslint-disable-next-line prefer-const\nlet QuillBetterTable = window['quillBetterTable'];\n\n@Component({\n // eslint-disable-next-line\n selector: 'eui-editor',\n templateUrl: './eui-editor.component.html',\n styleUrls: ['./styles/_index.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n // TODO: Check to change the providing way. Provide with injector reference\n EuiDialogService,\n ],\n})\nexport class EuiEditorComponent implements ControlValueAccessor, OnInit, OnDestroy {\n @HostBinding('class')\n get class(): string {\n return [\n 'eui-editor',\n this.isReadOnly ? 'eui-editor--readonly' : '',\n this.isReadOnly && this.value ? '': 'eui-editor--empty',\n !this.isReadOnly ? 'eui-editor-wrapper' : '',\n ].join(' ').trim();\n }\n @Input() e2eAttr = 'eui-editor';\n @Input() id: string;\n @Input() placeholder = '';\n @Input() format: 'html' | 'json' = 'html';\n @Input() theme: 'snow' | 'bubble' = 'snow';\n @Input() debug: 'warn' | 'log' | 'error' | false = false;\n @Input() customToolbarPosition: 'top' | 'bottom' = 'top';\n @HostBinding('attr.tabindex')\n @Input() tabindex = '0';\n @Input() modules: QuillModules;\n @Input() formats?: string[] | null;\n // NEW EUI INPUTS\n @Input() customToolbarConfig: ToolbarItemConfig[];\n @HostBinding('style.height')\n @Input() height: string;\n // NEW OUTPUTS => eUI13+ only\n @Output() editorCreate = new EventEmitter<typeof QuillType>();\n @Output() editorChange = new EventEmitter<EditorChangeSelection | ContentChange>();\n @Output() contentChange = new EventEmitter<ContentChange>();\n @Output() selectionChange = new EventEmitter<SelectionChange>();\n @Output() focus = new EventEmitter<Focus>();\n @Output() blur = new EventEmitter<Blur>();\n @Output() charactersCountChange = new EventEmitter<number>();\n @Output() wordsCountChange = new EventEmitter<number>();\n\n @HostBinding('class.eui-editor') true: boolean;\n\n @HostBinding('attr.readonly')\n get readonly(): string {\n return this.isReadOnly ? 'readonly' : null;\n }\n\n public value: string | any = '';\n public charactersCount = 0;\n public wordsCount = 0;\n public bytesCount = 0;\n public isFocused = false;\n public generatedId: string;\n public formControl: FormControl = new FormControl();\n public jsonToHtmlContent: string;\n public toolbarConfig: { [id: string]: { label: string; options: any[]; dialogMessage: string } };\n protected readyToRender: boolean = false;\n\n // eslint-disable-next-line max-len\n @ContentChild(forwardRef(() => EuiEditorCustomToolbarTagDirective), { static: false })\n euiEditorCustomToolbar: EuiEditorCustomToolbarTagDirective;\n\n @Input()\n get isReadOnly(): boolean {\n return this._isReadOnly;\n }\n set isReadOnly(value: BooleanInput) {\n this._isReadOnly = coerceBooleanProperty(value);\n }\n private _isReadOnly = false;\n @Input()\n get showCounters(): boolean {\n return this._showCounters;\n }\n set showCounters(value: BooleanInput) {\n this._showCounters = coerceBooleanProperty(value);\n }\n private _showCounters = true;\n @Input()\n get isEnabledOnFocus(): boolean {\n return this._isEnabledOnFocus;\n }\n set isEnabledOnFocus(value) {\n this._isEnabledOnFocus = coerceBooleanProperty(value);\n }\n private _isEnabledOnFocus = false;\n @Input()\n get isMinimalToolbar(): boolean {\n return this._isMinimalToolbar;\n }\n set isMinimalToolbar(value: BooleanInput) {\n this._isMinimalToolbar = coerceBooleanProperty(value);\n }\n private _isMinimalToolbar = false;\n\n @HostBinding('attr.aria-invalid')\n get isInvalid(): boolean {\n return this._isInvalid;\n }\n set isInvalid(value: BooleanInput) {\n this._isInvalid = coerceBooleanProperty(value);\n }\n private _isInvalid = false;\n\n private quill: typeof QuillType;\n private minimalToolbarConfig: ToolbarItemConfig[] = [\n { name: 'headings' },\n { name: 'bold' },\n { name: 'italic' },\n { name: 'underline' },\n { name: 'fontColor' },\n { name: 'textAlign' },\n { name: 'link' },\n { name: 'image' },\n { name: 'imageUrl' },\n { name: 'clean' },\n { name: 'delete' },\n { name: 'undo' },\n { name: 'redo' },\n { name: 'counters' },\n ];\n private defaultToolbarConfig: ToolbarItemConfig[] = [\n { name: 'headings', label: 'Style - Apply an HTML tag or CSS class to the selected text', options: [1, 2, 3, 4, 5, 6] },\n { name: 'font', label: 'Font - Change the font face' },\n { name: 'bold', label: 'Bold (Ctrl + B) - Make the selected text bold' },\n { name: 'italic', label: 'Italic (Ctrl + I) - Italicize the selected text' },\n { name: 'underline', label: 'Underline (Ctrl + U) - Underline the selected text' },\n { name: 'strike', label: 'Strikethrough - Draw a line to the middle of the selected text' },\n { name: 'fontColor', label: 'Font Color - Change the text color' },\n { name: 'fontBackground', label: 'Font Background - Change the text background color' },\n { name: 'subscript', label: 'Subscript - Create ssmall letters below the text baseline' },\n { name: 'superscript', label: 'Superscript - Create small letters above the line of the text' },\n { name: 'textAlign', label: 'Text Align - Align the text to the selected position: left (default), center, right or justify' },\n { name: 'orderedList', label: 'Numbering - Start an ordered list' },\n { name: 'bulletList', label: 'Bullets - Start a bulleted list' },\n { name: 'indentLess', label: 'Decrease Indent - Decrease the indent level of the paragraph' },\n { name: 'indentMore', label: 'Increase Indent - Increase the indent level of the paragraph' },\n { name: 'blockquote', label: 'Blockquote - Create a quoted block of the selected text' },\n { name: 'codeBlock', label: 'Insert Code Block - Insert a code block at the cursor row position' },\n { name: 'link', label: 'Insert Hyperlink (Ctrl + K) - Create a link to a Web page, a picture, an e-mail address or a program' },\n { name: 'image', label: 'Insert Picture - Insert a picture from a file' },\n { name: 'imageUrl', label: 'Insert Picture from URL - Insert a picture from a remote URL', dialogMessage: 'Enter image link URL' },\n { name: 'video', label: 'Insert Video - Insert a video from a file' },\n { name: 'table', label: 'Insert Table - Insert a 3x3 rows/cols table' },\n { name: 'clean', label: 'Remove Styles - Remove the styles of the selected text' },\n { name: 'delete', label: \"Delete content - Permanently deletes editor's contents\" },\n { name: 'undo', label: 'Undo (Ctrl + Z) - Cancels the previous action' },\n { name: 'redo', label: 'Redo (Ctrl + Y) - Do the next history action again' },\n {\n name: 'counters',\n label: 'Counters - Characters and words counters (stripped Html)',\n options: [\n { name: 'characters', label: 'Characters' },\n { name: 'words', label: 'Words' },\n ],\n },\n ];\n private destroy$ = new Subject<boolean>();\n\n constructor(private euiDialogService: EuiDialogService,\n private cdr: ChangeDetectorRef,\n private ngControl: NgControl,\n private loader: LoaderService) {\n this.ngControl.valueAccessor = this;\n }\n\n ngOnInit(): void {\n this.loader.load().subscribe({\n complete: () => {\n this.readyToRender = true;\n this.ngControl.statusChanges.pipe(startWith(this.ngControl.control.status), takeUntil(this.destroy$)).subscribe((status) => {\n this.isInvalid = status !== 'VALID';\n });\n\n this.generatedId = this.id ? this.id : 'eui-editor-' + (Math.floor(Math.random() * 1000000) + 1).toString();\n\n this.toolbarConfig = {};\n if (!this.customToolbarConfig && !this.isMinimalToolbar) {\n this.defaultToolbarConfig.forEach((t) => {\n this.toolbarConfig = {\n ...this.toolbarConfig,\n [t.name]: { label: t.label, options: t.options, dialogMessage: t.dialogMessage },\n };\n });\n }\n\n if (this.customToolbarConfig && !this.isMinimalToolbar) {\n this.customToolbarConfig.forEach((t) => {\n const label = !t.label ? this.defaultToolbarConfig.find((c) => c.name === t.name).label : t.label;\n let options = !t.options ? this.defaultToolbarConfig.find((c) => c.name === t.name).options : t.options;\n const d = !t.dialogMessage ? this.defaultToolbarConfig.find((c) => c.name === t.name).dialogMessage : t.dialogMessage;\n\n if (t.name === 'counters') {\n if (!t.options) {\n options = this.defaultToolbarConfig.find((c) => c.name === t.name).options;\n } else {\n options = t.options.map((option) => {\n const optionLabel = option.label\n ? option.label\n : this.defaultToolbarConfig\n .find((dtc) => dtc.name === 'counters')\n .options.find((o) => o.name === option.name).label;\n return { name: option.name, label: optionLabel };\n });\n }\n }\n\n this.toolbarConfig = {\n ...this.toolbarConfig,\n [t.name]: { label, options, dialogMessage: d },\n };\n });\n }\n\n if (this.isMinimalToolbar) {\n this.minimalToolbarConfig.forEach((t) => {\n const label = !t.label ? this.defaultToolbarConfig.find((c) => c.name === t.name).label : t.label;\n const options = !t.options ? this.defaultToolbarConfig.find((c) => c.name === t.name).options : t.options;\n const d = !t.dialogMessage ? this.defaultToolbarConfig.find((c) => c.name === t.name).dialogMessage : t.dialogMessage;\n\n this.toolbarConfig = {\n ...this.toolbarConfig,\n [t.name]: { label, options, dialogMessage: d },\n };\n });\n }\n this.cdr.markForCheck();\n }\n });\n }\n\n ngOnDestroy(): void {\n this.destroy$.next(true);\n this.destroy$.unsubscribe();\n }\n\n @HostListener('click')\n @HostListener('focusin')\n public enableEditorOnFocus(): void {\n if (this.isEnabledOnFocus && this.isReadOnly) {\n this.isReadOnly = false;\n }\n }\n\n public imageUrlHandler(): void {\n let imageUrlDialogForm: FormGroup = null;\n this.euiDialogService.openDialog(\n new EuiDialogConfig({\n title: this.toolbarConfig.imageUrl.dialogMessage,\n isHandleCloseOnAccept: true,\n bodyComponent: {\n component: EuiEditorImageDialogComponent,\n config: {\n onFormValueChange: (form: FormGroup): void => {\n imageUrlDialogForm = form;\n },\n },\n },\n accept: (): void => {\n if (imageUrlDialogForm && imageUrlDialogForm.valid) {\n this.euiDialogService.closeDialog();\n\n const range = this.quill.getSelection() || { index: 0, length: 0 };\n this.quill.insertEmbed(range.index, 'image', imageUrlDialogForm.get('url').value, 'user');\n }\n },\n })\n );\n }\n\n public editorUndo(): void {\n this.quill['history'].undo();\n }\n\n public editorRedo(): void {\n this.quill['history'].redo();\n }\n\n public editorDeleteContent(): void {\n const config = new EuiDialogConfig({\n title: 'Delete content',\n content: \"<p>Are you sure you want to delete editor's content?</p>\",\n hasCloseButton: false,\n accept: (): void => {\n this.quill.setContents(null);\n },\n });\n\n this.euiDialogService.openDialog(config);\n }\n\n public insertTable(): void {\n this.tableModule.insertTable(3, 3);\n }\n\n get hasImageFeature(): boolean {\n return this.euiEditorCustomToolbar\n ? this.euiEditorCustomToolbar?.elementRef.nativeElement.querySelector('.ql-image')\n : this.toolbarConfig.image;\n }\n\n public _onEditorCreated(quill: typeof QuillType): void {\n this.quill = quill;\n\n if (this.isEnabledOnFocus) {\n this.quill.focus();\n }\n\n if (this.format === 'html') {\n const delta = this.quill.clipboard.convert({ html: this.value as string });\n this.formControl.patchValue(delta);\n this.quill.setContents(delta);\n }\n\n if (this.format === 'json') {\n this.formControl.patchValue(this.value);\n this.quill.setContents(JSON.parse(this.value));\n }\n\n if (!this.hasImageFeature) {\n quill.clipboard.addMatcher('IMG', (element: Element, delta: Delta) => new Delta().insert(''));\n quill.clipboard.addMatcher('PICTURE', (element: Element, delta: Delta) => new Delta().insert(''));\n }\n\n this.editorCreate.emit(quill);\n }\n\n public _onEditorChanged(event: EditorChangeSelection | ContentChange | Event): void {\n console.warn('onEditorChanged() event is DEPRECATED please use contentChange() event instead.');\n this.editorChange.emit(event as EditorChangeSelection);\n }\n\n public _onContentChanged(event: ContentChange): void {\n if (this.format === 'html') {\n this.value = event.html;\n this.calculateCounters(this.value as string);\n this.onChange(this.htmlEntitiesDecode(this.value as string));\n }\n if (this.format === 'json') {\n if (event.text !== '\\n') {\n this.value = event.content;\n this.calculateCounters(event.text);\n this.jsonToHtmlContent = this.htmlEntitiesDecode(JSON.stringify(this.value));\n this.onChange(this.jsonToHtmlContent);\n } else {\n this.value = null;\n this.calculateCounters('');\n this.jsonToHtmlContent = '';\n this.onChange(null);\n }\n }\n this.contentChange.emit(event); // New emitter\n this._onEditorChanged(event); // Sync with editor change event since it's duplicated event\n }\n\n public _onSelectionChanged(event: SelectionChange): void {\n this.selectionChange.emit(event);\n }\n\n public _onFocus(event: Focus): void {\n this.isFocused = true;\n this.focus.emit(event);\n }\n\n public _onBlur(event: Blur): void {\n this.isFocused = false;\n this.onTouch();\n this.blur.emit(event);\n }\n\n public registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n\n public registerOnTouched(fn: any): void {\n this.onTouch = fn;\n }\n\n public writeValue(value: string): void {\n this.value = value || null;\n this.jsonToHtmlContent = this.value;\n\n setTimeout(() => {\n if (this.quill) {\n if (this.format === 'html') {\n const delta = this.quill.clipboard.convert({ html: this.value as string });\n this.formControl.patchValue(delta);\n this.quill.setContents(delta);\n }\n\n if (this.format === 'json') {\n this.formControl.patchValue(this.value);\n // this.quill.setContents(JSON.parse(this.value));\n }\n\n this.calculateCounters(this.value);\n }\n });\n }\n\n private get tableModule(): BetterTableModule {\n return this.quill.getModule('better-table');\n }\n\n private onChange: any = () => {};\n\n private onTouch: any = () => {};\n\n private htmlEntitiesDecode(content: string): string {\n let c = content;\n if (c) {\n c = c.replace('&amp;', '&');\n c = c.replace('&nbsp;', ' ');\n }\n\n return c;\n }\n\n get hasCharactersCounter(): boolean {\n return this.toolbarConfig.counters.options.find((o) => o.name === 'characters');\n }\n\n get charactersCounterLabel(): string {\n return this.toolbarConfig.counters.options.find((o) => o.name === 'characters')?.label;\n }\n\n get hasWordsCounter(): boolean {\n return this.toolbarConfig.counters.options.find((o) => o.name === 'words');\n }\n\n get wordsCounterLabel(): string {\n return this.toolbarConfig.counters.options.find((o) => o.name === 'words')?.label;\n }\n\n private calculateCounters(content: string): void {\n let text: string;\n const regex = /\\s+/;\n if (this.format === 'html') {\n if (content && content.length > 0 && this.quill) {\n text = this.stripHtml(content);\n this.charactersCount = text.length;\n text = this.cleanHtml(content);\n this.wordsCount = !text ? 0 : text.trim().split(regex).filter(t => t !== '').length;\n } else {\n this.charactersCount = 0;\n this.wordsCount = 0;\n this.bytesCount = 0;\n }\n }\n\n if (this.format === 'json') {\n if (content && this.quill) {\n text = this.stripHtml(this.quill.root.innerHTML);\n this.charactersCount = text.length;\n\n text = this.cleanHtml(this.quill.root.innerHTML);\n this.wordsCount = !text ? 0 : text.trim().split(regex).filter(t => t !== '').length;\n } else {\n this.charactersCount = 0;\n this.wordsCount = 0;\n this.bytesCount = 0;\n }\n }\n\n this.charactersCountChange.emit(this.charactersCount);\n\n this.wordsCountChange.emit(this.wordsCount);\n }\n\n private stripHtml(content: string): string {\n const regex = /(<([^>]+)>)/gm;\n const contentToReplace = content.replace(regex, '');\n return contentToReplace.replace(/[\\u200B-\\u200D\\uFEFF]/g, '');\n }\n\n private cleanHtml(content: string): string {\n const contentToReplace = content.replace(/<[^>]*>/g, '');\n return contentToReplace.replace(/[\\u200B-\\u200D\\uFEFF]/g, '');\n }\n}\n\n/* eslint-disable */\n@Directive({ selector: 'euiEditorCustomToolbar' })\nexport class EuiEditorCustomToolbarTagDirective {\n @HostBinding('class') elementClass = 'eui-editor-custom-toolbar';\n\n constructor(public elementRef: ElementRef) {}\n}\n/* eslint-enable */\n\n/**\n * Pipe to remove classes from the editor\n */\n@Pipe({ name: 'classFilter' })\nexport class ClassFilterPipe {\n transform(value: string): string {\n return value\n .replace(/eui-editor-wrapper/g, '')\n .replace(/eui-editor--readonly/g, '')\n .replace(/eui-editor--empty/g, '');\n }\n}\n", "<ng-container *ngIf=\"readyToRender\">\n@if (!isReadOnly) {\n <quill-editor\n [id]=\"generatedId\"\n class=\"{{ class | classFilter }}\"\n [class.eui-editor--focused]=\"isFocused\"\n [format]=\"format\"\n [formats]=\"formats\"\n [sanitize]=\"true\"\n [modules]=\"modules\"\n [theme]=\"theme\"\n [placeholder]=\"placeholder\"\n [customToolbarPosition]=\"customToolbarPosition\"\n [formControl]=\"formControl\"\n [debug]=\"debug\"\n [tabindex]=\"tabindex\"\n [preserveWhitespace]=\"true\"\n [hasImageFeature]=\"hasImageFeature\"\n (onEditorCreated)=\"_onEditorCreated($event)\"\n (onEditorChanged)=\"_onEditorChanged($event)\"\n (onContentChanged)=\"_onContentChanged($event)\"\n (onSelectionChanged)=\"_onSelectionChanged($event)\"\n (onFocus)=\"_onFocus($event)\"\n (onBlur)=\"_onBlur($event)\">\n <div *ngIf=\"!euiEditorCustomToolbar\" quill-editor-toolbar>\n <div\n *ngIf=\"toolbarConfig.headings\"\n class=\"ql-formats\"\n role=\"application\"\n aria-label=\"Select headings style\"\n euiTooltip=\"{{ toolbarConfig.headings.label }}\">\n <select class=\"ql-header\" [attr.aria-label]=\"toolbarConfig.headings.label\">\n <option value=\"{{ value }}\" *ngFor=\"let value of toolbarConfig.headings.options\">Heading {{ value }}</option>\n <option selected>Normal</option>\n </select>\n </div>\n <div\n *ngIf=\"toolbarConfig.font\"\n class=\"ql-formats\"\n role=\"application\"\n aria-label=\"Select font style\"\n euiTooltip=\"{{ toolbarConfig.font.label }}\">\n <select class=\"ql-font\" [attr.aria-label]=\"toolbarConfig.font.label\">\n <option selected>Sans Serif</option>\n <option value=\"serif\">Serif</option>\n <option value=\"monospace\">Monospace</option>\n </select>\n </div>\n <div *ngIf=\"toolbarConfig.bold || toolbarConfig.italic || toolbarConfig.underline || toolbarConfig.strike\" class=\"ql-formats\">\n <button\n *ngIf=\"toolbarConfig.bold\"\n class=\"ql-bold\"\n type=\"button\"\n [attr.aria-label]=\"toolbarConfig.bold.label\"\n euiTooltip=\"{{ toolbarConfig.bold.label }}\">\n </button>\n <button\n *ngIf=\"toolbarConfig.italic\"\n class=\"ql-italic\"\n type=\"button\"\n [attr.aria-label]=\"toolbarConfig.italic.label\"\n euiTooltip=\"{{ toolbarConfig.italic.label }}\">\n </button>\n <button\n *ngIf=\"toolbarConfig.underline\"\n class=\"ql-underline\"\n type=\"button\"\n [attr.aria-label]=\"toolbarConfig.underline.label\"\n euiTooltip=\"{{ toolbarConfig.underline.label }}\">\n </button>\n <button\n *ngIf=\"toolbarConfig.strike\"\n class=\"ql-strike\"\n type=\"button\"\n [attr.aria-label]=\"toolbarConfig.strike.label\"\n euiTooltip=\"{{ toolbarConfig.strike.label }}\">\n </button>\n </div>\n <div *ngIf=\"toolbarConfig.fontColor || toolbarConfig.fontBackground\" class=\"ql-formats\">\n <span *ngIf=\"toolbarConfig.fontColor\" euiTooltip=\"{{ toolbarConfig.fontColor.label }}\">\n <select class=\"ql-color\" [attr.aria-label]=\"toolbarConfig.fontColor.label\"></select>\n </span>\n <span *ngIf=\"toolbarConfig.fontBackground\" euiTooltip=\"{{ toolbarConfig.fontBackground.label }}\">\n <select class=\"ql-background\" [attr.aria-label]=\"toolbarConfig.fontBackground.label\"></select>\n </span>\n </div>\n <div *ngIf=\"toolbarConfig.subscript || toolbarConfig.superscript\" class=\"ql-formats\">\n <button\n *ngIf=\"toolbarConfig.subscript\"\n class=\"ql-script\"\n value=\"sub\"\n type=\"button\"\n [attr.aria-label]=\"toolbarConfig.subscript.label\"\n euiTooltip=\"{{ toolbarConfig.subscript.label }}\">\n </button>\n <button\n *ngIf=\"toolbarConfig.superscript\"\n class=\"ql-script\"\n value=\"super\"\n type=\"button\"\n [attr.aria-label]=\"toolbarConfig.superscript.label\"\n euiTooltip=\"{{ toolbarConfig.superscript.label }}\">\n </button>\n </div>\n <div *ngIf=\"toolbarConfig.textAlign\" class=\"ql-formats\">\n <span euiTooltip=\"{{ toolbarConfig.textAlign.label }}\">\n <select class=\"ql-align\" [attr.aria-label]=\"toolbarConfig.textAlign.label\">\n <option selected></option>\n <option value=\"center\"></option>\n <option value=\"right\"></option>\n <option value=\"justify\"></option>\n </select>\n </span>\n </div>\n <div\n *ngIf=\"toolbarConfig.orderedList || toolbarConfig.bulletList || toolbarConfig.indentLess || toolbarConfig.indentMore\"\n class=\"ql-formats\">\n <button\n *ngIf=\"toolbarConfig.orderedList\"\n class=\"ql-list\"\n value=\"ordered\"\n type=\"button\"\n [attr.aria-label]=\"toolbarConfig.orderedList.label\"\n euiTooltip=\"{{ toolbarConfig.orderedList.label }}\">\n </button>\n <button\n *ngIf=\"toolbarConfig.bulletList\"\n class=\"ql-list\"\n value=\"bullet\"\n type=\"button\"\n [attr.aria-label]=\"toolbarConfig.bulletList.label\"\n euiTooltip=\"{{ toolbarConfig.bulletList.label }}\">\n </button>\n <button\n type=\"button\"\n *ngIf=\"toolbarConfig.indentLess\"\n class=\"ql-indent\"\n value=\"-1\"\n [attr.aria-label]=\"toolbarConfig.indentLess.label\"\n euiTooltip=\"{{ toolbarConfig.indentLess.label }}\">\n </button>\n <button\n type=\"button\"\n *ngIf=\"toolbarConfig.indentMore\"\n class=\"ql-indent\"\n value=\"+1\"\n [attr.aria-label]=\"toolbarConfig.indentMore.label\"\n euiTooltip=\"{{ toolbarConfig.indentMore.label }}\">\n </button>\n </div>\n <div\n *ngIf=\"\n toolbarConfig.blockquote ||\n toolbarConfig.codeBlock ||\n toolbarConfig.link ||\n toolbarConfig.image ||\n toolbarConfig.imageUrl ||\n toolbarConfig.video ||\n toolbarConfig.table\n \"\n class=\"ql-formats\">\n <button\n *ngIf=\"toolbarConfig.blockquote\"\n class=\"ql-blockquote\"\n type=\"button\"\n [attr.aria-label]=\"toolbarConfig.blockquote.label\"\n euiTooltip=\"{{ toolbarConfig.blockquote.label }}\">\n </button>\n <button\n *ngIf=\"toolbarConfig.codeBlock\"\n class=\"ql-code-block\"\n type=\"button\"\n [attr.aria-label]=\"toolbarConfig.codeBlock.label\"\n euiTooltip=\"{{ toolbarConfig.codeBlock.label }}\">\n </button>\n <button\n *ngIf=\"toolbarConfig.link\"\n class=\"ql-link\"\n type=\"button\"\n [attr.aria-label]=\"toolbarConfig.link.label\"\n euiTooltip=\"{{ toolbarConfig.link.label }}\">\n </button>\n <button\n *ngIf=\"toolbarConfig.image\"\n class=\"ql-image\"\n type=\"button\"\n [attr.aria-label]=\"toolbarConfig.image.label\"\n euiTooltip=\"{{ toolbarConfig.image.label }}\">\n </button>\n <button\n type=\"button\"\n *ngIf=\"toolbarConfig.imageUrl\"\n [attr.aria-label]=\"toolbarConfig.imageUrl.label\"\n euiTooltip=\"{{ toolbarConfig.imageUrl.label }}\"\n (click)=\"imageUrlHandler()\">\n <eui-icon-svg icon=\"eui-image-add\"></eui-icon-svg>\n </button>\n <button\n *ngIf=\"toolbarConfig.video\"\n class=\"ql-video\"\n type=\"button\"\n [attr.aria-label]=\"toolbarConfig.video.label\"\n euiTooltip=\"{{ toolbarConfig.video.label }}\">\n </button>\n <button\n type=\"button\"\n *ngIf=\"toolbarConfig.table\"\n [attr.aria-label]=\"toolbarConfig.table.label\"\n euiTooltip=\"{{ toolbarConfig.table.label }}\"\n (click)=\"insertTable()\">\n <eui-icon-svg icon=\"eui-ecl-spreadsheet\"></eui-icon-svg>\n </button>\n </div>\n <div *ngIf=\"toolbarConfig.clean || toolbarConfig.delete\" class=\"ql-formats\">\n <button\n *ngIf=\"toolbarConfig.clean\"\n class=\"ql-clean\"\n type=\"button\"\n [attr.aria-label]=\"toolbarConfig.clean.label\"\n euiTooltip=\"{{ toolbarConfig.clean.label }}\">\n </button>\n <button\n type=\"button\"\n *ngIf=\"toolbarConfig.delete\"\n [attr.aria-label]=\"toolbarConfig.delete.label\"\n euiTooltip=\"{{ toolbarConfig.delete.label }}\"\n (click)=\"editorDeleteContent()\">\n <eui-icon-svg icon=\"eui-delete-forever\"></eui-icon-svg>\n </button>\n </div>\n <div *ngIf=\"toolbarConfig.undo || toolbarConfig.redo\" class=\"ql-formats\">\n <button\n type=\"button\"\n *ngIf=\"toolbarConfig.undo\"\n [attr.aria-label]=\"toolbarConfig.undo.label\"\n euiTooltip=\"{{ toolbarConfig.undo.label }}\"\n (click)=\"editorUndo()\">\n <eui-icon-svg icon=\"eui-undo\"></eui-icon-svg>\n </button>\n <button\n type=\"button\"\n *ngIf=\"toolbarConfig.redo\"\n [attr.aria-label]=\"toolbarConfig.redo.label\"\n euiTooltip=\"{{ toolbarConfig.redo.label }}\"\n (click)=\"editorRedo()\">\n <eui-icon-svg icon=\"eui-redo\"></eui-icon-svg>\n </button>\n </div>\n <div *ngIf=\"toolbarConfig.counters\" class=\"ql-formats\">\n <eui-editor-counters\n [hasCharactersCounter]=\"hasCharactersCounter\"\n [charactersCounter]=\"charactersCount\"\n [charactersLabel]=\"charactersCounterLabel\"\n [hasWordsCounter]=\"hasWordsCounter\"\n [wordsCounter]=\"wordsCount\"\n [wordsLabel]=\"wordsCounterLabel\"\n [attr.aria-label]=\"toolbarConfig.counters.label\"\n role=\"button\"\n euiTooltip=\"{{ toolbarConfig.counters.label }}\">\n </eui-editor-counters>\n </div>\n </div>\n <div *ngIf=\"euiEditorCustomToolbar\" quill-editor-toolbar>\n <ng-content select=\"euiEditorCustomToolbar\"></ng-content>\n </div>\n </quill-editor>\n<!-- READONLY MODE -->\n} @else {\n <eui-editor-html-view *ngIf=\"format === 'html'\" [content]=\"value\" [theme]=\"theme\"></eui-editor-html-view>\n <eui-editor-json-view *ngIf=\"format === 'json'\" [content]=\"jsonToHtmlContent\" [theme]=\"theme\"></eui-editor-json-view>\n}\n</ng-container>\n", "import { Directive, ElementRef, Input, AfterContentInit, OnDestroy, Self, OnChanges, SimpleChanges, Renderer2 } from '@angular/core';\nimport { NgControl } from '@angular/forms';\nimport { Subscription } from 'rxjs';\nimport { coerceBooleanProperty, coerceNumberProperty, BooleanInput, NumberInput } from '@angular/cdk/coercion';\n\n@Directive({\n /* eslint-disable-next-line */\n selector: '[formControlName][euiEditorMaxlength]',\n})\nexport class EuiEditorMaxlengthDirective implements AfterContentInit, OnDestroy, OnChanges {\n @Input() format: 'html' | 'json' = 'html';\n @Input()\n get euiEditorMaxlength(): number {\n return this._euiEditorMaxlength;\n }\n set euiEditorMaxlength(value: NumberInput) {\n this._euiEditorMaxlength = coerceNumberProperty(value);\n }\n private _euiEditorMaxlength: number;\n @Input()\n get isShowMaxlength(): boolean {\n return this._isShowMaxlength;\n }\n set isShowMaxlength(value: BooleanInput) {\n this._isShowMaxlength = coerceBooleanProperty(value);\n }\n private _isShowMaxlength = true;\n\n private valueChangesSubscription: Subscription;\n private maxLengthSpan: HTMLSpanElement;\n private wrapper: HTMLDivElement;\n\n constructor(private el: ElementRef, private renderer: Renderer2, @Self() private control: NgControl) {}\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['isShowMaxlength'] && this.maxLengthSpan) {\n if (this.isShowMaxlength) {\n this.createMaxLengthBox();\n this.refreshValue();\n } else {\n this.destroyMaxLengthBox();\n }\n }\n }\n\n ngAfterContentInit(): void {\n if (this.euiEditorMaxlength) {\n this.createMaxLengthBox();\n this.refreshValue();\n }\n\n if (this.control?.valueChanges) {\n this.valueChangesSubscription = this.control.valueChanges.subscribe(() => {\n this.refreshValue();\n });\n }\n }\n\n ngOnDestroy(): void {\n this.destroyMaxLengthBox();\n\n if (this.valueChangesSubscription) {\n this.valueChangesSubscription.unsubscribe();\n }\n }\n\n private refreshValue(): void {\n let valueLength = 0;\n let remainingLength = 0;\n\n if (this.format === 'html') {\n const regex = /(<([^>]+)>)/gi;\n const tagsStrippedContent = this.control.value ? this.control.value.replace(regex, '') : '';\n valueLength = tagsStrippedContent.length;\n remainingLength = this.euiEditorMaxlength - valueLength;\n } else {\n const content =\n this.control.value && this.control.value !== ''\n ? JSON.parse(this.control.value)\n .ops.filter((c: { attributes: string; insert: string }) => typeof c.insert === 'string')\n .map((c: { attributes: string; insert: string }) => c.insert.replace(/\\n/g, ''))\n : [''];\n\n const jsonStrippedContent = content.join('');\n valueLength = jsonStrippedContent.length;\n remainingLength = this.euiEditorMaxlength - valueLength;\n }\n\n if (remainingLength < 0 && this.maxLengthSpan) {\n this.maxLengthSpan.classList.add('error');\n this.maxLengthSpan.innerHTML = '0';\n } else {\n if (remainingLength >= 0 && this.maxLengthSpan) {\n this.maxLengthSpan.innerHTML = (this.euiEditorMaxlength - valueLength).toString();\n this.maxLengthSpan.classList.remove('error');\n }\n }\n }\n\n private createMaxLengthBox(): void {\n this.maxLengthSpan = this.renderer.createElement('span');\n this.renderer.addClass(this.maxLengthSpan, 'input-maxlength');\n this.renderer.setAttribute(this.maxLengthSpan, 'innerHTML', this.euiEditorMaxlength.toString());\n\n const nativeElement: HTMLElement = this.el.nativeElement;\n if (nativeElement != null) {\n this.renderer.setStyle(nativeElement, 'width', '100%');\n const parent: Node = nativeElement.parentNode;\n if (parent != null && this.isShowMaxlength) {\n this.wrapper = this.renderer.createElement('div');\n this.renderer.addClass(this.wrapper, 'input-maxlength-wrapper');\n parent.replaceChild(this.wrapper, nativeElement);\n this.renderer.appendChild(this.wrapper, nativeElement);\n this.renderer.appendChild(this.wrapper, this.maxLengthSpan);\n }\n }\n }\n\n private destroyMaxLengthBox(): void {\n if (this.maxLengthSpan) {\n this.renderer.removeChild(this.maxLengthSpan.parentElement, this.maxLengthSpan);\n }\n\n if (this.wrapper) {\n const parent: Node = this.wrapper.parentNode;\n const nativeElement: HTMLElement = this.el.nativeElement;\n parent.replaceChild(nativeElement, this.wrapper);\n this.renderer.removeChild(this.wrapper.parentElement, this.wrapper);\n }\n }\n}\n", "import { AbstractControl, ValidatorFn } from '@angular/forms';\n\nconst isJson = (value: string): boolean => {\n try {\n JSON.parse(value);\n } catch (e) {\n return false;\n }\n return true;\n};\n\nconst byteLength = (value: string): number => {\n // returns the byte length of an utf8 string\n let s = value.length;\n for (let i = value.length - 1; i >= 0; i--) {\n const code = value.charCodeAt(i);\n if (code > 0x7f && code <= 0x7ff) {\n s++;\n } else if (code > 0x7ff && code <= 0xffff) {\n s += 2;\n }\n if (code >= 0xdc00 && code <= 0xdfff) {\n i--;\n }\n }\n return s;\n};\n\n/**\n * @description\n * Validator that requires the length of the editor's content, out of HTML tags or JSON structure, to be greater than or equal\n * to the provided minimum length.\n *\n * @usageNotes\n * Validate that the editor has a minimum of 5 characters:\n *\n * ```typescript\n * const editor = new FormControl('ng', euiEditorMinLength(5));\n * console.log(editor.errors); // { minlength: { minLength: 5, actual: 2 } }\n * ```\n *\n * @returns A validator function that returns an error map with the\n * `minlength` if the validation check fails, otherwise `null`.\n */\nexport const euiEditorMinLength =\n (minLength: number): ValidatorFn =>\n (control: AbstractControl): { minLength: { minLength: number; actual: number } } | null => {\n if (control.value) {\n let actual = 0;\n if (isJson(control.value)) {\n const content = JSON.parse(control.value)\n .ops.filter((c: { attributes: string; insert: string }) => typeof c.insert === 'string')\n .map((c: { attributes: string; insert: string }) => c.insert.replace(/\\n/g, ''));\n\n const jsonStrippedContent = content.join('');\n actual = jsonStrippedContent.length;\n } else {\n const regex = /(<([^>]+)>)/gi;\n const tagsStrippedContent = control.value.replace(regex, '');\n actual = tagsStrippedContent.length;\n }\n\n return actual < minLength ? { minLength: { minLength, actual } } : null;\n }\n };\n\n/**\n * @description\n * Validator that requires the length of the editor's content, out of HTML tags or JSON structure, to be less than or equal\n * to the provided maximum length.\n *\n * @usageNotes\n * Validate that the editor has a maximum of 10 characters:\n *\n * ```typescript\n * const editor = new FormControl('ng angular reactive', euiEditorMaxLength(10));\n * console.log(editor.errors); // { maxLength: { maxLength: 10, actual: 19 } }\n * ```\n *\n * @returns A validator function that returns an error map with the\n * `maxlength` if the validation check fails, otherwise `null`.\n */\nexport const euiEditorMaxLength =\n (maxLength: number): ValidatorFn =>\n (control: AbstractControl): { maxLength: { maxLength: number; actual: number } } | null => {\n if (control.value) {\n let actual = 0;\n if (isJson(control.value)) {\n const content = JSON.parse(control.value)\n .ops.filter((c: { attributes: string; insert: string }) => typeof c.insert === 'string')\n .map((c: { attributes: string; insert: string }) => c.insert.replace(/\\n/g, ''));\n\n const jsonStrippedContent = content.join('');\n actual = jsonStrippedContent.length;\n } else {\n const regex = /(<([^>]+)>)/gi;\n const tagsStrippedContent = control.value.replace(regex, '');\n actual = tagsStrippedContent.length;\n }\n\n return actual > maxLength ? { maxLength: { maxLength, actual } } : null;\n }\n };\n\n/**\n * @description\n * Validator that requires the number of words in the editor, out of HTML tags or JSON structure, to be greater than or equal\n * to the provided minimum number.\n *\n * @usageNotes\n * Validate that the editor has a minimum of 5 words:\n *\n * ```typescript\n * const editor = new FormControl('ng angular', euiEditorMinWords(5));\n * console.log(editor.errors); // { minWords: { minWords: 5, actual: 2 } }\n * ```\n *\n * @returns A validator function that returns an error map with the\n * `minWords` if the validation check fails, otherwise `null`.\n */\nexport const euiEditorMinWords =\n (minWords: number): ValidatorFn =>\n (control: AbstractControl): { minWords: { minWords: number; actual: number } } | null => {\n if (control.value) {\n let actual = 0;\n if (isJson(control.value)) {\n const content = JSON.parse(control.value)\n .ops.filter((c: { attributes: string; insert: string }) => typeof c.insert === 'string')\n .map((c: { attributes: string; insert: string }) => c.insert.replace(/\\n/g, ' '));\n\n const jsonStrippedContent = content.join('');\n actual = jsonStrippedContent.trim().split(/\\s+/).length;\n } else {\n const tagsStrippedContent = control.value.replace(/<[^>]*>/g, '');\n actual = tagsStrippedContent.replace(/[\\u200B-\\u200D\\uFEFF]/g, '').trim().split(/\\s+/).filter(t => t !== '').length;\n }\n\n return actual < minWords ? { minWords: { minWords, actual } } : null;\n }\n };\n\n/**\n * @description\n * Validator that requires the number of words in the editor, out of HTML tags or JSON structure, to be less than or equal\n * to the provided maximum number.\n *\n * @usageNotes\n * Validate that the editor has a maximum of 10 words:\n *\n * ```typescript\n * const editor = new FormControl('ng angular reactive forms editor wysiwyg eui ec europa npm node', euiEditorMaxWords(10));\n * console.log(editor.errors); // { maxWords: { maxWords: 10, actual: 11 } }\n * ```\n *\n * @returns A validator function that returns an error map with the\n * `maxWords` if the validation check fails, otherwise `null`.\n */\nexport const euiEditorMaxWords =\n (maxWords: number): ValidatorFn =>\n (control: AbstractControl): { maxWords: { maxWords: number; actual: number } } | null => {\n if (control.value) {\n let actual = 0;\n if (isJson(control.value)) {\n const content = JSON.parse(control.value)\n .ops.filter((c: { attributes: string; insert: string }) => typeof c.insert === 'string')\n .map((c: { attributes: string; insert: string }) => c.insert.replace(/\\n/g, ' '));\n\n const jsonStrippedContent = content.join('');\n actual = jsonStrippedContent.trim().split(/\\s+/).length;\n } else {\n const tagsStrippedContent = control.value.replace(/<[^>]*>/g, '');\n actual = tagsStrippedContent.replace(/[\\u200B-\\u200D\\uFEFF]/g, '').trim().split(/\\s+/).filter(t => t !== '').length;\n }\n\n return actual > maxWords ? { maxWords: { maxWords, actual } } : null;\n }\n };\n\n/**\n * @description\n * Validator that requires the number of bytes in the editor, with HTML tags or JSON structure, to be greater than or equal\n * to the provided minimum number.\n *\n * @usageNotes\n * Validate that the editor has a minimum of 20 bytes:\n *\n * ```typescript\n * const editor = new FormControl('<p>europa.eu</p>', euiEditorMinBytes(20));\n * console.log(editor.errors); // { minBytes: { minBytes: 20, actual: 16 } }\n * ```\n *\n * @returns A validator function that returns an error map with the\n * `minBytes` if the validation check fails, otherwise `null`.\n */\nexport const euiEditorMinBytes =\n (minBytes: number): ValidatorFn =>\n (control: AbstractControl): { minBytes: { minBytes: number; actual: number } } | null => {\n if (control.value) {\n let actual = 0;\n const m = encodeURIComponent(control.value).match(/%[89ABab]/g);\n actual = control.value.length + (m ? m.length : 0);\n\n return actual < minBytes ? { minBytes: { minBytes, actual } } : null;\n }\n };\n\n/**\n * @description\n * Validator that requires the number of bytes in the editor, with HTML tags or JSON structure, to be less than or equal\n * to the provided minimum number.\n *\n * @usageNotes\n * Validate that the editor has a maximum of 20 bytes:\n *\n * ```typescript\n * const editor = new FormControl('<p>europa.eu site</p>', euiEditorMinBytes(20));\n * console.log(editor.errors); // { maxBytes: { maxBytes: 20, actual: 21 } }\n * ```\n *\n * @returns A validator function that returns an error map with the\n * `maxBytes` if the validation check fails, otherwise `null`.\n */\nexport const euiEditorMaxBytes =\n (maxBytes: number): ValidatorFn =>\n (control: AbstractControl): { maxBytes: { maxBytes: number; actual: number } } | null => {\n if (control.value) {\n let actual = 0;\n if (isJson(control.value)) {\n actual = byteLength(control.value);\n } else {\n const m = encodeURIComponent(control.value).match(/%[89ABab]/g);\n actual = control.value.length + (m ? m.length : 0);\n }\n\n return actual > maxBytes ? { maxBytes: { maxBytes, actual } } : null;\n }\n };\n", "import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { EuiDialogModule } from '@eui/components/eui-dialog';\nimport { EuiTooltipDirectiveModule } from '@eui/components/directives';\nimport { EuiIconModule } from '@eui/components/eui-icon';\nimport { QuillConfig, QuillModule } from '@eui/components/externals/quill';\nimport { EuiInputTextModule } from '@eui/components/eui-input-text';\n\nimport { EuiEditorCountersComponent } from './counters/eui-editor-counters.component';\nimport { EuiEditorHtmlViewComponent } from './html-view/eui-editor-html-view.component';\nimport { EuiEditorJsonViewComponent } from './json-view/eui-editor-json-view.component';\nimport { ClassFilterPipe, EuiEditorComponent, EuiEditorCustomToolbarTagDirective } from \"./eui-editor.component\";\nimport { EuiEditorImageDialogComponent } from './image-url-dialog/image-url-dialog.component';\nimport { EuiEditorMaxlengthDirective } from './directives/eui-editor-maxlength.directive';\n\n// In case of dynamic loading this will not be available at this stage.\n// Thus the config for BetterTable keyboardBindings needs to be set at a later\n// stage. Same as the registration.\nconst QuillBetterTable = window['quillBetterTable'];\n\nconst quillConfig: QuillConfig = {\n modules: {\n table: false,\n 'better-table': {\n operationMenu: {\n items: {\n unmergeCells: {\n text: 'Another unmerge cells name',\n },\n },\n color: {\n colors: [\n '#000000',\n '#e60000',\n '#ff9900',\n '#ffff00',\n '#008a00',\n '#0066cc',\n '#9933ff',\n '#ffffff',\n '#facccc',\n '#ffebcc',\n '#ffffcc',\n '#cce8cc',\n '#cce0f5',\n '#ebd6ff',\n '#bbbbbb',\n '#f06666',\n '#ffc266',\n '#ffff66',\n '#66b966',\n '#66a3e0',\n '#c285ff',\n '#888888',\n '#a10000',\n '#b26b00',\n '#b2b200',\n '#006100',\n '#0047b2',\n '#6b24b2',\n '#444444',\n '#5c0000',\n '#663d00',\n '#666600',\n '#003700',\n '#002966',\n '#3d1466',\n ],\n text: 'Background Colors',\n },\n },\n },\n },\n};\n\nif(QuillBetterTable) {\n quillConfig.modules.keyboard = {\n bindings: QuillBetterTable?.keyboardBindings,\n };\n}\n\n@NgModule({\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n EuiTooltipDirectiveModule,\n QuillModule.forRoot(quillConfig),\n EuiDialogModule,\n EuiIconModule,\n EuiInputTextModule,\n ],\n declarations: [\n EuiEditorComponent,\n EuiEditorJsonViewComponent,\n EuiEditorHtmlViewComponent,\n EuiEditorCountersComponent,\n EuiEditorImageDialogComponent,\n EuiEditorMaxlengthDirective,\n EuiEditorCustomToolbarTagDirective,\n ClassFilterPipe,\n ],\n exports: [EuiEditorComponent, EuiEditorMaxlengthDirective, EuiEditorCustomToolbarTagDirective, EuiEditorCountersComponent],\n})\nexport class EuiEditorModule {}\n"],
4
+ "sourcesContent": ["/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n", "export * from './eui-editor.component';\nexport * from '@eui/components/externals/quill';\nexport * from './directives/eui-editor-maxlength.directive';\nexport * from './validators/eui-editor.validators';\nexport * from './counters/eui-editor-counters.component';\nexport * from './eui-editor.module';\n", "import { Component, OnInit, OnDestroy, Inject } from '@angular/core';\nimport { takeUntil } from 'rxjs/operators';\nimport { AbstractControl, Validators, FormGroup, FormControl } from '@angular/forms';\nimport { Subject } from 'rxjs';\n\nimport { DIALOG_COMPONENT_CONFIG } from '@eui/components/eui-dialog';\n\nconst urlValidator = (control: AbstractControl): { isUrlValid: false } | null => {\n const isHttp = control.value.substr(0, 7) === 'http://';\n const isHttps = control.value.substr(0, 8) === 'https://';\n\n return !isHttp && !isHttps ? { isUrlValid: false } : null;\n};\n\nexport interface EuiEditorImageDialogConfig {\n onFormValueChange: (form: FormGroup) => void;\n}\n\n@Component({\n templateUrl: 'image-url-dialog.component.html',\n})\nexport class EuiEditorImageDialogComponent implements OnInit, OnDestroy {\n public form: FormGroup;\n\n private destroy$: Subject<boolean> = new Subject<boolean>();\n\n constructor(@Inject(DIALOG_COMPONENT_CONFIG) private config: EuiEditorImageDialogConfig) {}\n\n ngOnInit(): void {\n this.form = new FormGroup({\n url: new FormControl<string>('', [Validators.required, urlValidator]),\n });\n\n this.form.valueChanges.pipe(takeUntil(this.destroy$)).subscribe(() => {\n this.config.onFormValueChange(this.form);\n });\n }\n\n ngOnDestroy(): void {\n this.destroy$.next(true);\n this.destroy$.unsubscribe();\n }\n}\n", "<form [formGroup]=\"form\">\n <input euiInputText formControlName=\"url\" />\n</form>\n", "import {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n Inject,\n Input,\n OnChanges,\n SimpleChanges,\n ViewEncapsulation,\n} from '@angular/core';\n\nconst QuillType: any = window['Quill'];\n\n@Component({\n // eslint-disable-next-line\n selector: 'eui-editor-json-view',\n template: '',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EuiEditorJsonViewComponent implements AfterViewInit, OnChanges {\n @Input() theme = 'snow';\n @Input() content: string;\n\n private quillEditor: typeof QuillType;\n private editorElem: HTMLElement;\n\n constructor(@Inject(ElementRef) private elementRef: ElementRef) {}\n\n valueSetter = (quillEditor: typeof QuillType, value: string): void => {\n let content: any = value;\n try {\n content = JSON.parse(value);\n } catch (e) {\n console.warn('JSON parse error!');\n }\n quillEditor?.setContents(content);\n };\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes && changes.content && changes.content?.currentValue) {\n this.valueSetter(this.quillEditor, changes.content.currentValue);\n }\n }\n\n ngAfterViewInit(): void {\n this.elementRef.nativeElement.insertAdjacentHTML('afterbegin', '<div quill-view-element></div>');\n\n this.editorElem = this.elementRef.nativeElement.querySelector('[quill-view-element]');\n\n const Quill: any = window['Quill'];\n\n this.quillEditor = new Quill(this.editorElem, {\n debug: false,\n formats: null,\n modules: { toolbar: false },\n readOnly: true,\n strict: true,\n theme: 'snow',\n });\n\n if (this.content) {\n this.valueSetter(this.quillEditor, this.content);\n }\n }\n}\n", "import { Component, Input, OnChanges, SimpleChanges, ViewEncapsulation, ChangeDetectionStrategy } from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\n\n@Component({\n // eslint-disable-next-line\n selector: 'eui-editor-html-view',\n templateUrl: './eui-editor-html-view.component.html',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EuiEditorHtmlViewComponent implements OnChanges {\n @Input() content = '';\n @Input() theme = 'snow';\n\n public innerHTML: SafeHtml = '';\n public themeClass = 'ql-snow';\n\n constructor(private sanitizer: DomSanitizer) {}\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes && changes.content && changes.content?.currentValue) {\n this.innerHTML = this.sanitizer.bypassSecurityTrustHtml(changes.content.currentValue);\n } else {\n this.innerHTML = '';\n }\n }\n}\n", "<div #editor class=\"ql-container\" [ngClass]=\"themeClass\">\n <div class=\"ql-editor\" [innerHTML]=\"innerHTML\"></div>\n</div>\n", "import { coerceBooleanProperty, BooleanInput } from '@angular/cdk/coercion';\nimport { ChangeDetectionStrategy, Component, Input, ViewEncapsulation } from '@angular/core';\n\n@Component({\n // eslint-disable-next-line\n selector: 'eui-editor-counters',\n templateUrl: './eui-editor-counters.component.html',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EuiEditorCountersComponent {\n @Input() charactersCounter: number;\n @Input() charactersLabel = 'characters';\n @Input() wordsCounter: number;\n @Input() wordsLabel = 'words';\n @Input()\n get isMaxLengthValid(): boolean {\n return this._isMaxLengthValid;\n }\n set isMaxLengthValid(value: BooleanInput) {\n this._isMaxLengthValid = coerceBooleanProperty(value);\n }\n private _isMaxLengthValid = true;\n @Input()\n get hasCharactersCounter(): boolean {\n return this._hasCharactersCounter;\n }\n set hasCharactersCounter(value: BooleanInput) {\n this._hasCharactersCounter = coerceBooleanProperty(value);\n }\n private _hasCharactersCounter = true;\n @Input()\n get hasWordsCounter(): boolean {\n return this._hasWordsCounter;\n }\n set hasWordsCounter(value: BooleanInput) {\n this._hasWordsCounter = coerceBooleanProperty(value);\n }\n private _hasWordsCounter = true;\n}\n", "<button class=\"editor-counters\">\n <div *ngIf=\"hasCharactersCounter\" class=\"eui-u-flex eui-u-flex-column\" [class.eui-u-mr-2xs]=\"hasWordsCounter\">\n <span class=\"chars-counter\" [class.chars-counter--error]=\"!isMaxLengthValid\">{{ charactersCounter }}</span>\n <span class=\"chars-label\">{{ charactersLabel }}</span>\n </div>\n <div *ngIf=\"hasWordsCounter\" class=\"eui-u-flex eui-u-flex-column eui-u-mv-2xs\">\n <span class=\"words-counter\">{{ wordsCounter }}</span>\n <span class=\"words-label\">{{ wordsLabel }}</span>\n </div>\n</button>\n", "import {\n Component,\n EventEmitter,\n Input,\n Output,\n OnInit,\n ViewEncapsulation,\n ChangeDetectionStrategy,\n HostBinding,\n OnDestroy,\n Directive,\n ContentChild,\n forwardRef,\n ElementRef,\n HostListener,\n Pipe,\n ChangeDetectorRef,\n} from '@angular/core';\nimport { ControlValueAccessor, FormControl, FormGroup, NgControl } from '@angular/forms';\nimport { ContentChange, QuillModules } from '@eui/components/externals/quill';\n\nimport { coerceBooleanProperty, BooleanInput } from '@angular/cdk/coercion';\n// eslint-disable-next-line @typescript-eslint/naming-convention,no-underscore-dangle,id-denylist,id-match\nconst QuillType: any = window['Quill'];\nimport { startWith, takeUntil } from 'rxjs/operators';\nimport { Subject } from 'rxjs';\nimport Delta from 'quill-delta';\n\nimport { EuiDialogConfig, EuiDialogService } from '@eui/components/eui-dialog';\n\nimport { LoaderService, BetterTableModule, Blur, EditorChangeSelection, Focus, SelectionChange, ToolbarItemConfig } from '@eui/components/externals/quill';\nimport { EuiEditorImageDialogComponent } from './image-url-dialog/image-url-dialog.component';\n// eslint-disable-next-line prefer-const\nlet QuillBetterTable = window['quillBetterTable'];\n\n@Component({\n // eslint-disable-next-line\n selector: 'eui-editor',\n templateUrl: './eui-editor.component.html',\n styleUrls: ['./styles/_index.scss'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n // TODO: Check to change the providing way. Provide with injector reference\n EuiDialogService,\n ],\n})\nexport class EuiEditorComponent implements ControlValueAccessor, OnInit, OnDestroy {\n @HostBinding('class')\n get class(): string {\n return [\n 'eui-editor',\n this.isReadOnly ? 'eui-editor--readonly' : '',\n this.isReadOnly && this.value ? '': 'eui-editor--empty',\n !this.isReadOnly ? 'eui-editor-wrapper' : '',\n ].join(' ').trim();\n }\n @Input() e2eAttr = 'eui-editor';\n @Input() id: string;\n @Input() placeholder = '';\n @Input() format: 'html' | 'json' = 'html';\n @Input() theme: 'snow' | 'bubble' = 'snow';\n @Input() debug: 'warn' | 'log' | 'error' | false = false;\n @Input() customToolbarPosition: 'top' | 'bottom' = 'top';\n @HostBinding('attr.tabindex')\n @Input() tabindex = '0';\n @Input() modules: QuillModules;\n @Input() formats?: string[] | null;\n // NEW EUI INPUTS\n @Input() customToolbarConfig: ToolbarItemConfig[];\n @HostBinding('style.height')\n @Input() height: string;\n // NEW OUTPUTS => eUI13+ only\n @Output() editorCreate = new EventEmitter<typeof QuillType>();\n @Output() editorChange = new EventEmitter<EditorChangeSelection | ContentChange>();\n @Output() contentChange = new EventEmitter<ContentChange>();\n @Output() selectionChange = new EventEmitter<SelectionChange>();\n @Output() focus = new EventEmitter<Focus>();\n @Output() blur = new EventEmitter<Blur>();\n @Output() charactersCountChange = new EventEmitter<number>();\n @Output() wordsCountChange = new EventEmitter<number>();\n\n @HostBinding('class.eui-editor') true: boolean;\n\n @HostBinding('attr.readonly')\n get readonly(): string {\n return this.isReadOnly ? 'readonly' : null;\n }\n\n public value: string | any = '';\n public charactersCount = 0;\n public wordsCount = 0;\n public bytesCount = 0;\n public isFocused = false;\n public generatedId: string;\n public formControl: FormControl = new FormControl();\n public jsonToHtmlContent: string;\n public toolbarConfig: { [id: string]: { label: string; options: any[]; dialogMessage: string } };\n protected readyToRender: boolean = false;\n\n // eslint-disable-next-line max-len\n @ContentChild(forwardRef(() => EuiEditorCustomToolbarTagDirective), { static: false })\n euiEditorCustomToolbar: EuiEditorCustomToolbarTagDirective;\n\n @Input()\n get isReadOnly(): boolean {\n return this._isReadOnly;\n }\n set isReadOnly(value: BooleanInput) {\n this._isReadOnly = coerceBooleanProperty(value);\n }\n private _isReadOnly = false;\n @Input()\n get showCounters(): boolean {\n return this._showCounters;\n }\n set showCounters(value: BooleanInput) {\n this._showCounters = coerceBooleanProperty(value);\n }\n private _showCounters = true;\n @Input()\n get isEnabledOnFocus(): boolean {\n return this._isEnabledOnFocus;\n }\n set isEnabledOnFocus(value) {\n this._isEnabledOnFocus = coerceBooleanProperty(value);\n }\n private _isEnabledOnFocus = false;\n @Input()\n get isMinimalToolbar(): boolean {\n return this._isMinimalToolbar;\n }\n set isMinimalToolbar(value: BooleanInput) {\n this._isMinimalToolbar = coerceBooleanProperty(value);\n }\n private _isMinimalToolbar = false;\n\n @HostBinding('attr.aria-invalid')\n get isInvalid(): boolean {\n return this._isInvalid;\n }\n set isInvalid(value: BooleanInput) {\n this._isInvalid = coerceBooleanProperty(value);\n }\n private _isInvalid = false;\n\n private quill: typeof QuillType;\n private minimalToolbarConfig: ToolbarItemConfig[] = [\n { name: 'headings' },\n { name: 'bold' },\n { name: 'italic' },\n { name: 'underline' },\n { name: 'fontColor' },\n { name: 'textAlign' },\n { name: 'link' },\n { name: 'image' },\n { name: 'imageUrl' },\n { name: 'clean' },\n { name: 'delete' },\n { name: 'undo' },\n { name: 'redo' },\n { name: 'counters' },\n ];\n private defaultToolbarConfig: ToolbarItemConfig[] = [\n { name: 'headings', label: 'Style - Apply an HTML tag or CSS class to the selected text', options: [1, 2, 3, 4, 5, 6] },\n { name: 'font', label: 'Font - Change the font face' },\n { name: 'bold', label: 'Bold (Ctrl + B) - Make the selected text bold' },\n { name: 'italic', label: 'Italic (Ctrl + I) - Italicize the selected text' },\n { name: 'underline', label: 'Underline (Ctrl + U) - Underline the selected text' },\n { name: 'strike', label: 'Strikethrough - Draw a line to the middle of the selected text' },\n { name: 'fontColor', label: 'Font Color - Change the text color' },\n { name: 'fontBackground', label: 'Font Background - Change the text background color' },\n { name: 'subscript', label: 'Subscript - Create ssmall letters below the text baseline' },\n { name: 'superscript', label: 'Superscript - Create small letters above the line of the text' },\n { name: 'textAlign', label: 'Text Align - Align the text to the selected position: left (default), center, right or justify' },\n { name: 'orderedList', label: 'Numbering - Start an ordered list' },\n { name: 'bulletList', label: 'Bullets - Start a bulleted list' },\n { name: 'indentLess', label: 'Decrease Indent - Decrease the indent level of the paragraph' },\n { name: 'indentMore', label: 'Increase Indent - Increase the indent level of the paragraph' },\n { name: 'blockquote', label: 'Blockquote - Create a quoted block of the selected text' },\n { name: 'codeBlock', label: 'Insert Code Block - Insert a code block at the cursor row position' },\n { name: 'link', label: 'Insert Hyperlink (Ctrl + K) - Create a link to a Web page, a picture, an e-mail address or a program' },\n { name: 'image', label: 'Insert Picture - Insert a picture from a file' },\n { name: 'imageUrl', label: 'Insert Picture from URL - Insert a picture from a remote URL', dialogMessage: 'Enter image link URL' },\n { name: 'video', label: 'Insert Video - Insert a video from a file' },\n { name: 'table', label: 'Insert Table - Insert a 3x3 rows/cols table' },\n { name: 'clean', label: 'Remove Styles - Remove the styles of the selected text' },\n { name: 'delete', label: \"Delete content - Permanently deletes editor's contents\" },\n { name: 'undo', label: 'Undo (Ctrl + Z) - Cancels the previous action' },\n { name: 'redo', label: 'Redo (Ctrl + Y) - Do the next history action again' },\n {\n name: 'counters',\n label: 'Counters - Characters and words counters (stripped Html)',\n options: [\n { name: 'characters', label: 'Characters' },\n { name: 'words', label: 'Words' },\n ],\n },\n ];\n private destroy$ = new Subject<boolean>();\n\n constructor(private euiDialogService: EuiDialogService,\n private cdr: ChangeDetectorRef,\n private ngControl: NgControl,\n private loader: LoaderService) {\n this.ngControl.valueAccessor = this;\n }\n\n ngOnInit(): void {\n this.loader.load().subscribe({\n complete: () => {\n this.readyToRender = true;\n this.ngControl.statusChanges.pipe(startWith(this.ngControl.control.status), takeUntil(this.destroy$)).subscribe((status) => {\n this.isInvalid = status !== 'VALID';\n });\n\n this.generatedId = this.id ? this.id : 'eui-editor-' + (Math.floor(Math.random() * 1000000) + 1).toString();\n\n this.toolbarConfig = {};\n if (!this.customToolbarConfig && !this.isMinimalToolbar) {\n this.defaultToolbarConfig.forEach((t) => {\n this.toolbarConfig = {\n ...this.toolbarConfig,\n [t.name]: { label: t.label, options: t.options, dialogMessage: t.dialogMessage },\n };\n });\n }\n\n if (this.customToolbarConfig && !this.isMinimalToolbar) {\n this.customToolbarConfig.forEach((t) => {\n const label = !t.label ? this.defaultToolbarConfig.find((c) => c.name === t.name).label : t.label;\n let options = !t.options ? this.defaultToolbarConfig.find((c) => c.name === t.name).options : t.options;\n const d = !t.dialogMessage ? this.defaultToolbarConfig.find((c) => c.name === t.name).dialogMessage : t.dialogMessage;\n\n if (t.name === 'counters') {\n if (!t.options) {\n options = this.defaultToolbarConfig.find((c) => c.name === t.name).options;\n } else {\n options = t.options.map((option) => {\n const optionLabel = option.label\n ? option.label\n : this.defaultToolbarConfig\n .find((dtc) => dtc.name === 'counters')\n .options.find((o) => o.name === option.name).label;\n return { name: option.name, label: optionLabel };\n });\n }\n }\n\n this.toolbarConfig = {\n ...this.toolbarConfig,\n [t.name]: { label, options, dialogMessage: d },\n };\n });\n }\n\n if (this.isMinimalToolbar) {\n this.minimalToolbarConfig.forEach((t) => {\n const label = !t.label ? this.defaultToolbarConfig.find((c) => c.name === t.name).label : t.label;\n const options = !t.options ? this.defaultToolbarConfig.find((c) => c.name === t.name).options : t.options;\n const d = !t.dialogMessage ? this.defaultToolbarConfig.find((c) => c.name === t.name).dialogMessage : t.dialogMessage;\n\n this.toolbarConfig = {\n ...this.toolbarConfig,\n [t.name]: { label, options, dialogMessage: d },\n };\n });\n }\n this.cdr.markForCheck();\n }\n });\n }\n\n ngOnDestroy(): void {\n this.destroy$.next(true);\n this.destroy$.unsubscribe();\n }\n\n @HostListener('click')\n @HostListener('focusin')\n public enableEditorOnFocus(): void {\n if (this.isEnabledOnFocus && this.isReadOnly) {\n this.isReadOnly = false;\n }\n }\n\n public imageUrlHandler(): void {\n let imageUrlDialogForm: FormGroup = null;\n this.euiDialogService.openDialog(\n new EuiDialogConfig({\n title: this.toolbarConfig.imageUrl.dialogMessage,\n isHandleCloseOnAccept: true,\n bodyComponent: {\n component: EuiEditorImageDialogComponent,\n config: {\n onFormValueChange: (form: FormGroup): void => {\n imageUrlDialogForm = form;\n },\n },\n },\n accept: (): void => {\n if (imageUrlDialogForm && imageUrlDialogForm.valid) {\n this.euiDialogService.closeDialog();\n\n const range = this.quill.getSelection() || { index: 0, length: 0 };\n this.quill.insertEmbed(range.index, 'image', imageUrlDialogForm.get('url').value, 'user');\n }\n },\n })\n );\n }\n\n public editorUndo(): void {\n this.quill['history'].undo();\n }\n\n public editorRedo(): void {\n this.quill['history'].redo();\n }\n\n public editorDeleteContent(): void {\n const config = new EuiDialogConfig({\n title: 'Delete content',\n content: \"<p>Are you sure you want to delete editor's content?</p>\",\n hasCloseButton: false,\n accept: (): void => {\n this.quill.setContents(null);\n },\n });\n\n this.euiDialogService.openDialog(config);\n }\n\n public insertTable(): void {\n this.tableModule.insertTable(3, 3);\n }\n\n get hasImageFeature(): boolean {\n return this.euiEditorCustomToolbar\n ? this.euiEditorCustomToolbar?.elementRef.nativeElement.querySelector('.ql-image')\n : this.toolbarConfig.image;\n }\n\n public _onEditorCreated(quill: typeof QuillType): void {\n this.quill = quill;\n\n if (this.isEnabledOnFocus) {\n this.quill.focus();\n }\n\n if (this.format === 'html') {\n const delta = this.quill.clipboard.convert({ html: this.value as string });\n this.formControl.patchValue(delta);\n this.quill.setContents(delta);\n }\n\n if (this.format === 'json') {\n this.formControl.patchValue(this.value);\n this.quill.setContents(JSON.parse(this.value));\n }\n\n if (!this.hasImageFeature) {\n quill.clipboard.addMatcher('IMG', (element: Element, delta: Delta) => new Delta().insert(''));\n quill.clipboard.addMatcher('PICTURE', (element: Element, delta: Delta) => new Delta().insert(''));\n }\n\n this.editorCreate.emit(quill);\n }\n\n public _onEditorChanged(event: EditorChangeSelection | ContentChange | Event): void {\n console.warn('onEditorChanged() event is DEPRECATED please use contentChange() event instead.');\n this.editorChange.emit(event as EditorChangeSelection);\n }\n\n public _onContentChanged(event: ContentChange): void {\n if (this.format === 'html') {\n this.value = event.html;\n this.calculateCounters(this.value as string);\n this.onChange(this.htmlEntitiesDecode(this.value as string));\n }\n if (this.format === 'json') {\n if (event.text !== '\\n') {\n this.value = event.content;\n this.calculateCounters(event.text);\n this.jsonToHtmlContent = this.htmlEntitiesDecode(JSON.stringify(this.value));\n this.onChange(this.jsonToHtmlContent);\n } else {\n this.value = null;\n this.calculateCounters('');\n this.jsonToHtmlContent = '';\n this.onChange(null);\n }\n }\n this.contentChange.emit(event); // New emitter\n this._onEditorChanged(event); // Sync with editor change event since it's duplicated event\n }\n\n public _onSelectionChanged(event: SelectionChange): void {\n this.selectionChange.emit(event);\n }\n\n public _onFocus(event: Focus): void {\n this.isFocused = true;\n this.focus.emit(event);\n }\n\n public _onBlur(event: Blur): void {\n this.isFocused = false;\n this.onTouch();\n this.blur.emit(event);\n }\n\n public registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n\n public registerOnTouched(fn: any): void {\n this.onTouch = fn;\n }\n\n public writeValue(value: string): void {\n this.value = value || null;\n this.jsonToHtmlContent = this.value;\n\n setTimeout(() => {\n if (this.quill) {\n if (this.format === 'html') {\n const delta = this.quill.clipboard.convert({ html: this.value as string });\n this.formControl.patchValue(delta);\n this.quill.setContents(delta);\n }\n\n if (this.format === 'json') {\n this.formControl.patchValue(this.value);\n // this.quill.setContents(JSON.parse(this.value));\n }\n\n this.calculateCounters(this.value);\n }\n });\n }\n\n private get tableModule(): BetterTableModule {\n return this.quill.getModule('better-table');\n }\n\n private onChange: any = () => {};\n\n private onTouch: any = () => {};\n\n private htmlEntitiesDecode(content: string): string {\n let c = content;\n if (c) {\n c = c.replace('&amp;', '&');\n c = c.replace('&nbsp;', ' ');\n }\n\n return c;\n }\n\n get hasCharactersCounter(): boolean {\n return this.toolbarConfig.counters.options.find((o) => o.name === 'characters');\n }\n\n get charactersCounterLabel(): string {\n return this.toolbarConfig.counters.options.find((o) => o.name === 'characters')?.label;\n }\n\n get hasWordsCounter(): boolean {\n return this.toolbarConfig.counters.options.find((o) => o.name === 'words');\n }\n\n get wordsCounterLabel(): string {\n return this.toolbarConfig.counters.options.find((o) => o.name === 'words')?.label;\n }\n\n private calculateCounters(content: string): void {\n let text: string;\n const regex = /\\s+/;\n if (this.format === 'html') {\n if (content && content.length > 0 && this.quill) {\n text = this.stripHtml(content);\n this.charactersCount = text.length;\n text = this.cleanHtml(content);\n this.wordsCount = !text ? 0 : text.trim().split(regex).filter(t => t !== '').length;\n } else {\n this.charactersCount = 0;\n this.wordsCount = 0;\n this.bytesCount = 0;\n }\n }\n\n if (this.format === 'json') {\n if (content && this.quill) {\n text = this.stripHtml(this.quill.root.innerHTML);\n this.charactersCount = text.length;\n\n text = this.cleanHtml(this.quill.root.innerHTML);\n this.wordsCount = !text ? 0 : text.trim().split(regex).filter(t => t !== '').length;\n } else {\n this.charactersCount = 0;\n this.wordsCount = 0;\n this.bytesCount = 0;\n }\n }\n\n this.charactersCountChange.emit(this.charactersCount);\n\n this.wordsCountChange.emit(this.wordsCount);\n }\n\n private stripHtml(content: string): string {\n const regex = /(<([^>]+)>)/gm;\n const contentToReplace = content.replace(regex, '');\n return contentToReplace.replace(/[\\u200B-\\u200D\\uFEFF]/g, '');\n }\n\n private cleanHtml(content: string): string {\n const contentToReplace = content.replace(/<[^>]*>/g, '');\n return contentToReplace.replace(/[\\u200B-\\u200D\\uFEFF]/g, '');\n }\n}\n\n/* eslint-disable */\n@Directive({ selector: 'euiEditorCustomToolbar' })\nexport class EuiEditorCustomToolbarTagDirective {\n @HostBinding('class') elementClass = 'eui-editor-custom-toolbar';\n\n constructor(public elementRef: ElementRef) {}\n}\n/* eslint-enable */\n\n/**\n * Pipe to remove classes from the editor\n */\n@Pipe({ name: 'classFilter' })\nexport class ClassFilterPipe {\n transform(value: string): string {\n return value\n .replace(/eui-editor-wrapper/g, '')\n .replace(/eui-editor--readonly/g, '')\n .replace(/eui-editor--empty/g, '');\n }\n}\n", "<ng-container *ngIf=\"readyToRender\">\n@if (!isReadOnly) {\n <quill-editor\n [id]=\"generatedId\"\n class=\"{{ class | classFilter }}\"\n [class.eui-editor--focused]=\"isFocused\"\n [format]=\"format\"\n [formats]=\"formats\"\n [sanitize]=\"true\"\n [modules]=\"modules\"\n [theme]=\"theme\"\n [placeholder]=\"placeholder\"\n [customToolbarPosition]=\"customToolbarPosition\"\n [formControl]=\"formControl\"\n [debug]=\"debug\"\n [tabindex]=\"tabindex\"\n [preserveWhitespace]=\"true\"\n [hasImageFeature]=\"hasImageFeature\"\n (onEditorCreated)=\"_onEditorCreated($event)\"\n (onEditorChanged)=\"_onEditorChanged($event)\"\n (onContentChanged)=\"_onContentChanged($event)\"\n (onSelectionChanged)=\"_onSelectionChanged($event)\"\n (onFocus)=\"_onFocus($event)\"\n (onBlur)=\"_onBlur($event)\">\n <div *ngIf=\"!euiEditorCustomToolbar\" quill-editor-toolbar>\n <div\n *ngIf=\"toolbarConfig.headings\"\n class=\"ql-formats\"\n role=\"application\"\n aria-label=\"Select headings style\"\n euiTooltip=\"{{ toolbarConfig.headings.label }}\">\n <select class=\"ql-header\" [attr.aria-label]=\"toolbarConfig.headings.label\">\n <option value=\"{{ value }}\" *ngFor=\"let value of toolbarConfig.headings.options\">Heading {{ value }}</option>\n <option selected>Normal</option>\n </select>\n </div>\n <div\n *ngIf=\"toolbarConfig.font\"\n class=\"ql-formats\"\n role=\"application\"\n aria-label=\"Select font style\"\n euiTooltip=\"{{ toolbarConfig.font.label }}\">\n <select class=\"ql-font\" [attr.aria-label]=\"toolbarConfig.font.label\">\n <option selected>Sans Serif</option>\n <option value=\"serif\">Serif</option>\n <option value=\"monospace\">Monospace</option>\n </select>\n </div>\n <div *ngIf=\"toolbarConfig.bold || toolbarConfig.italic || toolbarConfig.underline || toolbarConfig.strike\" class=\"ql-formats\">\n <button\n *ngIf=\"toolbarConfig.bold\"\n class=\"ql-bold\"\n type=\"button\"\n [attr.aria-label]=\"toolbarConfig.bold.label\"\n euiTooltip=\"{{ toolbarConfig.bold.label }}\">\n </button>\n <button\n *ngIf=\"toolbarConfig.italic\"\n class=\"ql-italic\"\n type=\"button\"\n [attr.aria-label]=\"toolbarConfig.italic.label\"\n euiTooltip=\"{{ toolbarConfig.italic.label }}\">\n </button>\n <button\n *ngIf=\"toolbarConfig.underline\"\n class=\"ql-underline\"\n type=\"button\"\n [attr.aria-label]=\"toolbarConfig.underline.label\"\n euiTooltip=\"{{ toolbarConfig.underline.label }}\">\n </button>\n <button\n *ngIf=\"toolbarConfig.strike\"\n class=\"ql-strike\"\n type=\"button\"\n [attr.aria-label]=\"toolbarConfig.strike.label\"\n euiTooltip=\"{{ toolbarConfig.strike.label }}\">\n </button>\n </div>\n <div *ngIf=\"toolbarConfig.fontColor || toolbarConfig.fontBackground\" class=\"ql-formats\">\n <span *ngIf=\"toolbarConfig.fontColor\" euiTooltip=\"{{ toolbarConfig.fontColor.label }}\">\n <select class=\"ql-color\" [attr.aria-label]=\"toolbarConfig.fontColor.label\"></select>\n </span>\n <span *ngIf=\"toolbarConfig.fontBackground\" euiTooltip=\"{{ toolbarConfig.fontBackground.label }}\">\n <select class=\"ql-background\" [attr.aria-label]=\"toolbarConfig.fontBackground.label\"></select>\n </span>\n </div>\n <div *ngIf=\"toolbarConfig.subscript || toolbarConfig.superscript\" class=\"ql-formats\">\n <button\n *ngIf=\"toolbarConfig.subscript\"\n class=\"ql-script\"\n value=\"sub\"\n type=\"button\"\n [attr.aria-label]=\"toolbarConfig.subscript.label\"\n euiTooltip=\"{{ toolbarConfig.subscript.label }}\">\n </button>\n <button\n *ngIf=\"toolbarConfig.superscript\"\n class=\"ql-script\"\n value=\"super\"\n type=\"button\"\n [attr.aria-label]=\"toolbarConfig.superscript.label\"\n euiTooltip=\"{{ toolbarConfig.superscript.label }}\">\n </button>\n </div>\n <div *ngIf=\"toolbarConfig.textAlign\" class=\"ql-formats\">\n <span euiTooltip=\"{{ toolbarConfig.textAlign.label }}\">\n <select class=\"ql-align\" [attr.aria-label]=\"toolbarConfig.textAlign.label\">\n <option selected></option>\n <option value=\"center\"></option>\n <option value=\"right\"></option>\n <option value=\"justify\"></option>\n </select>\n </span>\n </div>\n <div\n *ngIf=\"toolbarConfig.orderedList || toolbarConfig.bulletList || toolbarConfig.indentLess || toolbarConfig.indentMore\"\n class=\"ql-formats\">\n <button\n *ngIf=\"toolbarConfig.orderedList\"\n class=\"ql-list\"\n value=\"ordered\"\n type=\"button\"\n [attr.aria-label]=\"toolbarConfig.orderedList.label\"\n euiTooltip=\"{{ toolbarConfig.orderedList.label }}\">\n </button>\n <button\n *ngIf=\"toolbarConfig.bulletList\"\n class=\"ql-list\"\n value=\"bullet\"\n type=\"button\"\n [attr.aria-label]=\"toolbarConfig.bulletList.label\"\n euiTooltip=\"{{ toolbarConfig.bulletList.label }}\">\n </button>\n <button\n type=\"button\"\n *ngIf=\"toolbarConfig.indentLess\"\n class=\"ql-indent\"\n value=\"-1\"\n [attr.aria-label]=\"toolbarConfig.indentLess.label\"\n euiTooltip=\"{{ toolbarConfig.indentLess.label }}\">\n </button>\n <button\n type=\"button\"\n *ngIf=\"toolbarConfig.indentMore\"\n class=\"ql-indent\"\n value=\"+1\"\n [attr.aria-label]=\"toolbarConfig.indentMore.label\"\n euiTooltip=\"{{ toolbarConfig.indentMore.label }}\">\n </button>\n </div>\n <div\n *ngIf=\"\n toolbarConfig.blockquote ||\n toolbarConfig.codeBlock ||\n toolbarConfig.link ||\n toolbarConfig.image ||\n toolbarConfig.imageUrl ||\n toolbarConfig.video ||\n toolbarConfig.table\n \"\n class=\"ql-formats\">\n <button\n *ngIf=\"toolbarConfig.blockquote\"\n class=\"ql-blockquote\"\n type=\"button\"\n [attr.aria-label]=\"toolbarConfig.blockquote.label\"\n euiTooltip=\"{{ toolbarConfig.blockquote.label }}\">\n </button>\n <button\n *ngIf=\"toolbarConfig.codeBlock\"\n class=\"ql-code-block\"\n type=\"button\"\n [attr.aria-label]=\"toolbarConfig.codeBlock.label\"\n euiTooltip=\"{{ toolbarConfig.codeBlock.label }}\">\n </button>\n <button\n *ngIf=\"toolbarConfig.link\"\n class=\"ql-link\"\n type=\"button\"\n [attr.aria-label]=\"toolbarConfig.link.label\"\n euiTooltip=\"{{ toolbarConfig.link.label }}\">\n </button>\n <button\n *ngIf=\"toolbarConfig.image\"\n class=\"ql-image\"\n type=\"button\"\n [attr.aria-label]=\"toolbarConfig.image.label\"\n euiTooltip=\"{{ toolbarConfig.image.label }}\">\n </button>\n <button\n type=\"button\"\n *ngIf=\"toolbarConfig.imageUrl\"\n [attr.aria-label]=\"toolbarConfig.imageUrl.label\"\n euiTooltip=\"{{ toolbarConfig.imageUrl.label }}\"\n (click)=\"imageUrlHandler()\">\n <eui-icon-svg icon=\"eui-ecl-image\"></eui-icon-svg>\n </button>\n <button\n *ngIf=\"toolbarConfig.video\"\n class=\"ql-video\"\n type=\"button\"\n [attr.aria-label]=\"toolbarConfig.video.label\"\n euiTooltip=\"{{ toolbarConfig.video.label }}\">\n </button>\n <button\n type=\"button\"\n *ngIf=\"toolbarConfig.table\"\n [attr.aria-label]=\"toolbarConfig.table.label\"\n euiTooltip=\"{{ toolbarConfig.table.label }}\"\n (click)=\"insertTable()\">\n <eui-icon-svg icon=\"eui-ecl-spreadsheet\"></eui-icon-svg>\n </button>\n </div>\n <div *ngIf=\"toolbarConfig.clean || toolbarConfig.delete\" class=\"ql-formats\">\n <button\n *ngIf=\"toolbarConfig.clean\"\n class=\"ql-clean\"\n type=\"button\"\n [attr.aria-label]=\"toolbarConfig.clean.label\"\n euiTooltip=\"{{ toolbarConfig.clean.label }}\">\n </button>\n <button\n type=\"button\"\n *ngIf=\"toolbarConfig.delete\"\n [attr.aria-label]=\"toolbarConfig.delete.label\"\n euiTooltip=\"{{ toolbarConfig.delete.label }}\"\n (click)=\"editorDeleteContent()\">\n <eui-icon-svg icon=\"eui-ecl-trash\"></eui-icon-svg>\n </button>\n </div>\n <div *ngIf=\"toolbarConfig.undo || toolbarConfig.redo\" class=\"ql-formats\">\n <button\n type=\"button\"\n *ngIf=\"toolbarConfig.undo\"\n [attr.aria-label]=\"toolbarConfig.undo.label\"\n euiTooltip=\"{{ toolbarConfig.undo.label }}\"\n (click)=\"editorUndo()\">\n <eui-icon-svg icon=\"arrow-undo:sharp\"></eui-icon-svg>\n </button>\n <button\n type=\"button\"\n *ngIf=\"toolbarConfig.redo\"\n [attr.aria-label]=\"toolbarConfig.redo.label\"\n euiTooltip=\"{{ toolbarConfig.redo.label }}\"\n (click)=\"editorRedo()\">\n <eui-icon-svg icon=\"arrow-redo:sharp\"></eui-icon-svg>\n </button>\n </div>\n <div *ngIf=\"toolbarConfig.counters\" class=\"ql-formats\">\n <eui-editor-counters\n [hasCharactersCounter]=\"hasCharactersCounter\"\n [charactersCounter]=\"charactersCount\"\n [charactersLabel]=\"charactersCounterLabel\"\n [hasWordsCounter]=\"hasWordsCounter\"\n [wordsCounter]=\"wordsCount\"\n [wordsLabel]=\"wordsCounterLabel\"\n [attr.aria-label]=\"toolbarConfig.counters.label\"\n role=\"button\"\n euiTooltip=\"{{ toolbarConfig.counters.label }}\">\n </eui-editor-counters>\n </div>\n </div>\n <div *ngIf=\"euiEditorCustomToolbar\" quill-editor-toolbar>\n <ng-content select=\"euiEditorCustomToolbar\"></ng-content>\n </div>\n </quill-editor>\n<!-- READONLY MODE -->\n} @else {\n <eui-editor-html-view *ngIf=\"format === 'html'\" [content]=\"value\" [theme]=\"theme\"></eui-editor-html-view>\n <eui-editor-json-view *ngIf=\"format === 'json'\" [content]=\"jsonToHtmlContent\" [theme]=\"theme\"></eui-editor-json-view>\n}\n</ng-container>\n", "import { Directive, ElementRef, Input, AfterContentInit, OnDestroy, Self, OnChanges, SimpleChanges, Renderer2 } from '@angular/core';\nimport { NgControl } from '@angular/forms';\nimport { Subscription } from 'rxjs';\nimport { coerceBooleanProperty, coerceNumberProperty, BooleanInput, NumberInput } from '@angular/cdk/coercion';\n\n@Directive({\n /* eslint-disable-next-line */\n selector: '[formControlName][euiEditorMaxlength]',\n})\nexport class EuiEditorMaxlengthDirective implements AfterContentInit, OnDestroy, OnChanges {\n @Input() format: 'html' | 'json' = 'html';\n @Input()\n get euiEditorMaxlength(): number {\n return this._euiEditorMaxlength;\n }\n set euiEditorMaxlength(value: NumberInput) {\n this._euiEditorMaxlength = coerceNumberProperty(value);\n }\n private _euiEditorMaxlength: number;\n @Input()\n get isShowMaxlength(): boolean {\n return this._isShowMaxlength;\n }\n set isShowMaxlength(value: BooleanInput) {\n this._isShowMaxlength = coerceBooleanProperty(value);\n }\n private _isShowMaxlength = true;\n\n private valueChangesSubscription: Subscription;\n private maxLengthSpan: HTMLSpanElement;\n private wrapper: HTMLDivElement;\n\n constructor(private el: ElementRef, private renderer: Renderer2, @Self() private control: NgControl) {}\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['isShowMaxlength'] && this.maxLengthSpan) {\n if (this.isShowMaxlength) {\n this.createMaxLengthBox();\n this.refreshValue();\n } else {\n this.destroyMaxLengthBox();\n }\n }\n }\n\n ngAfterContentInit(): void {\n if (this.euiEditorMaxlength) {\n this.createMaxLengthBox();\n this.refreshValue();\n }\n\n if (this.control?.valueChanges) {\n this.valueChangesSubscription = this.control.valueChanges.subscribe(() => {\n this.refreshValue();\n });\n }\n }\n\n ngOnDestroy(): void {\n this.destroyMaxLengthBox();\n\n if (this.valueChangesSubscription) {\n this.valueChangesSubscription.unsubscribe();\n }\n }\n\n private refreshValue(): void {\n let valueLength = 0;\n let remainingLength = 0;\n\n if (this.format === 'html') {\n const regex = /(<([^>]+)>)/gi;\n const tagsStrippedContent = this.control.value ? this.control.value.replace(regex, '') : '';\n valueLength = tagsStrippedContent.length;\n remainingLength = this.euiEditorMaxlength - valueLength;\n } else {\n const content =\n this.control.value && this.control.value !== ''\n ? JSON.parse(this.control.value)\n .ops.filter((c: { attributes: string; insert: string }) => typeof c.insert === 'string')\n .map((c: { attributes: string; insert: string }) => c.insert.replace(/\\n/g, ''))\n : [''];\n\n const jsonStrippedContent = content.join('');\n valueLength = jsonStrippedContent.length;\n remainingLength = this.euiEditorMaxlength - valueLength;\n }\n\n if (remainingLength < 0 && this.maxLengthSpan) {\n this.maxLengthSpan.classList.add('error');\n this.maxLengthSpan.innerHTML = '0';\n } else {\n if (remainingLength >= 0 && this.maxLengthSpan) {\n this.maxLengthSpan.innerHTML = (this.euiEditorMaxlength - valueLength).toString();\n this.maxLengthSpan.classList.remove('error');\n }\n }\n }\n\n private createMaxLengthBox(): void {\n this.maxLengthSpan = this.renderer.createElement('span');\n this.renderer.addClass(this.maxLengthSpan, 'input-maxlength');\n this.renderer.setAttribute(this.maxLengthSpan, 'innerHTML', this.euiEditorMaxlength.toString());\n\n const nativeElement: HTMLElement = this.el.nativeElement;\n if (nativeElement != null) {\n this.renderer.setStyle(nativeElement, 'width', '100%');\n const parent: Node = nativeElement.parentNode;\n if (parent != null && this.isShowMaxlength) {\n this.wrapper = this.renderer.createElement('div');\n this.renderer.addClass(this.wrapper, 'input-maxlength-wrapper');\n parent.replaceChild(this.wrapper, nativeElement);\n this.renderer.appendChild(this.wrapper, nativeElement);\n this.renderer.appendChild(this.wrapper, this.maxLengthSpan);\n }\n }\n }\n\n private destroyMaxLengthBox(): void {\n if (this.maxLengthSpan) {\n this.renderer.removeChild(this.maxLengthSpan.parentElement, this.maxLengthSpan);\n }\n\n if (this.wrapper) {\n const parent: Node = this.wrapper.parentNode;\n const nativeElement: HTMLElement = this.el.nativeElement;\n parent.replaceChild(nativeElement, this.wrapper);\n this.renderer.removeChild(this.wrapper.parentElement, this.wrapper);\n }\n }\n}\n", "import { AbstractControl, ValidatorFn } from '@angular/forms';\n\nconst isJson = (value: string): boolean => {\n try {\n JSON.parse(value);\n } catch (e) {\n return false;\n }\n return true;\n};\n\nconst byteLength = (value: string): number => {\n // returns the byte length of an utf8 string\n let s = value.length;\n for (let i = value.length - 1; i >= 0; i--) {\n const code = value.charCodeAt(i);\n if (code > 0x7f && code <= 0x7ff) {\n s++;\n } else if (code > 0x7ff && code <= 0xffff) {\n s += 2;\n }\n if (code >= 0xdc00 && code <= 0xdfff) {\n i--;\n }\n }\n return s;\n};\n\n/**\n * @description\n * Validator that requires the length of the editor's content, out of HTML tags or JSON structure, to be greater than or equal\n * to the provided minimum length.\n *\n * @usageNotes\n * Validate that the editor has a minimum of 5 characters:\n *\n * ```typescript\n * const editor = new FormControl('ng', euiEditorMinLength(5));\n * console.log(editor.errors); // { minlength: { minLength: 5, actual: 2 } }\n * ```\n *\n * @returns A validator function that returns an error map with the\n * `minlength` if the validation check fails, otherwise `null`.\n */\nexport const euiEditorMinLength =\n (minLength: number): ValidatorFn =>\n (control: AbstractControl): { minLength: { minLength: number; actual: number } } | null => {\n if (control.value) {\n let actual = 0;\n if (isJson(control.value)) {\n const content = JSON.parse(control.value)\n .ops.filter((c: { attributes: string; insert: string }) => typeof c.insert === 'string')\n .map((c: { attributes: string; insert: string }) => c.insert.replace(/\\n/g, ''));\n\n const jsonStrippedContent = content.join('');\n actual = jsonStrippedContent.length;\n } else {\n const regex = /(<([^>]+)>)/gi;\n const tagsStrippedContent = control.value.replace(regex, '');\n actual = tagsStrippedContent.length;\n }\n\n return actual < minLength ? { minLength: { minLength, actual } } : null;\n }\n };\n\n/**\n * @description\n * Validator that requires the length of the editor's content, out of HTML tags or JSON structure, to be less than or equal\n * to the provided maximum length.\n *\n * @usageNotes\n * Validate that the editor has a maximum of 10 characters:\n *\n * ```typescript\n * const editor = new FormControl('ng angular reactive', euiEditorMaxLength(10));\n * console.log(editor.errors); // { maxLength: { maxLength: 10, actual: 19 } }\n * ```\n *\n * @returns A validator function that returns an error map with the\n * `maxlength` if the validation check fails, otherwise `null`.\n */\nexport const euiEditorMaxLength =\n (maxLength: number): ValidatorFn =>\n (control: AbstractControl): { maxLength: { maxLength: number; actual: number } } | null => {\n if (control.value) {\n let actual = 0;\n if (isJson(control.value)) {\n const content = JSON.parse(control.value)\n .ops.filter((c: { attributes: string; insert: string }) => typeof c.insert === 'string')\n .map((c: { attributes: string; insert: string }) => c.insert.replace(/\\n/g, ''));\n\n const jsonStrippedContent = content.join('');\n actual = jsonStrippedContent.length;\n } else {\n const regex = /(<([^>]+)>)/gi;\n const tagsStrippedContent = control.value.replace(regex, '');\n actual = tagsStrippedContent.length;\n }\n\n return actual > maxLength ? { maxLength: { maxLength, actual } } : null;\n }\n };\n\n/**\n * @description\n * Validator that requires the number of words in the editor, out of HTML tags or JSON structure, to be greater than or equal\n * to the provided minimum number.\n *\n * @usageNotes\n * Validate that the editor has a minimum of 5 words:\n *\n * ```typescript\n * const editor = new FormControl('ng angular', euiEditorMinWords(5));\n * console.log(editor.errors); // { minWords: { minWords: 5, actual: 2 } }\n * ```\n *\n * @returns A validator function that returns an error map with the\n * `minWords` if the validation check fails, otherwise `null`.\n */\nexport const euiEditorMinWords =\n (minWords: number): ValidatorFn =>\n (control: AbstractControl): { minWords: { minWords: number; actual: number } } | null => {\n if (control.value) {\n let actual = 0;\n if (isJson(control.value)) {\n const content = JSON.parse(control.value)\n .ops.filter((c: { attributes: string; insert: string }) => typeof c.insert === 'string')\n .map((c: { attributes: string; insert: string }) => c.insert.replace(/\\n/g, ' '));\n\n const jsonStrippedContent = content.join('');\n actual = jsonStrippedContent.trim().split(/\\s+/).length;\n } else {\n const tagsStrippedContent = control.value.replace(/<[^>]*>/g, '');\n actual = tagsStrippedContent.replace(/[\\u200B-\\u200D\\uFEFF]/g, '').trim().split(/\\s+/).filter(t => t !== '').length;\n }\n\n return actual < minWords ? { minWords: { minWords, actual } } : null;\n }\n };\n\n/**\n * @description\n * Validator that requires the number of words in the editor, out of HTML tags or JSON structure, to be less than or equal\n * to the provided maximum number.\n *\n * @usageNotes\n * Validate that the editor has a maximum of 10 words:\n *\n * ```typescript\n * const editor = new FormControl('ng angular reactive forms editor wysiwyg eui ec europa npm node', euiEditorMaxWords(10));\n * console.log(editor.errors); // { maxWords: { maxWords: 10, actual: 11 } }\n * ```\n *\n * @returns A validator function that returns an error map with the\n * `maxWords` if the validation check fails, otherwise `null`.\n */\nexport const euiEditorMaxWords =\n (maxWords: number): ValidatorFn =>\n (control: AbstractControl): { maxWords: { maxWords: number; actual: number } } | null => {\n if (control.value) {\n let actual = 0;\n if (isJson(control.value)) {\n const content = JSON.parse(control.value)\n .ops.filter((c: { attributes: string; insert: string }) => typeof c.insert === 'string')\n .map((c: { attributes: string; insert: string }) => c.insert.replace(/\\n/g, ' '));\n\n const jsonStrippedContent = content.join('');\n actual = jsonStrippedContent.trim().split(/\\s+/).length;\n } else {\n const tagsStrippedContent = control.value.replace(/<[^>]*>/g, '');\n actual = tagsStrippedContent.replace(/[\\u200B-\\u200D\\uFEFF]/g, '').trim().split(/\\s+/).filter(t => t !== '').length;\n }\n\n return actual > maxWords ? { maxWords: { maxWords, actual } } : null;\n }\n };\n\n/**\n * @description\n * Validator that requires the number of bytes in the editor, with HTML tags or JSON structure, to be greater than or equal\n * to the provided minimum number.\n *\n * @usageNotes\n * Validate that the editor has a minimum of 20 bytes:\n *\n * ```typescript\n * const editor = new FormControl('<p>europa.eu</p>', euiEditorMinBytes(20));\n * console.log(editor.errors); // { minBytes: { minBytes: 20, actual: 16 } }\n * ```\n *\n * @returns A validator function that returns an error map with the\n * `minBytes` if the validation check fails, otherwise `null`.\n */\nexport const euiEditorMinBytes =\n (minBytes: number): ValidatorFn =>\n (control: AbstractControl): { minBytes: { minBytes: number; actual: number } } | null => {\n if (control.value) {\n let actual = 0;\n const m = encodeURIComponent(control.value).match(/%[89ABab]/g);\n actual = control.value.length + (m ? m.length : 0);\n\n return actual < minBytes ? { minBytes: { minBytes, actual } } : null;\n }\n };\n\n/**\n * @description\n * Validator that requires the number of bytes in the editor, with HTML tags or JSON structure, to be less than or equal\n * to the provided minimum number.\n *\n * @usageNotes\n * Validate that the editor has a maximum of 20 bytes:\n *\n * ```typescript\n * const editor = new FormControl('<p>europa.eu site</p>', euiEditorMinBytes(20));\n * console.log(editor.errors); // { maxBytes: { maxBytes: 20, actual: 21 } }\n * ```\n *\n * @returns A validator function that returns an error map with the\n * `maxBytes` if the validation check fails, otherwise `null`.\n */\nexport const euiEditorMaxBytes =\n (maxBytes: number): ValidatorFn =>\n (control: AbstractControl): { maxBytes: { maxBytes: number; actual: number } } | null => {\n if (control.value) {\n let actual = 0;\n if (isJson(control.value)) {\n actual = byteLength(control.value);\n } else {\n const m = encodeURIComponent(control.value).match(/%[89ABab]/g);\n actual = control.value.length + (m ? m.length : 0);\n }\n\n return actual > maxBytes ? { maxBytes: { maxBytes, actual } } : null;\n }\n };\n", "import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { EuiDialogModule } from '@eui/components/eui-dialog';\nimport { EuiTooltipDirectiveModule } from '@eui/components/directives';\nimport { EuiIconModule } from '@eui/components/eui-icon';\nimport { QuillConfig, QuillModule } from '@eui/components/externals/quill';\nimport { EuiInputTextModule } from '@eui/components/eui-input-text';\n\nimport { EuiEditorCountersComponent } from './counters/eui-editor-counters.component';\nimport { EuiEditorHtmlViewComponent } from './html-view/eui-editor-html-view.component';\nimport { EuiEditorJsonViewComponent } from './json-view/eui-editor-json-view.component';\nimport { ClassFilterPipe, EuiEditorComponent, EuiEditorCustomToolbarTagDirective } from \"./eui-editor.component\";\nimport { EuiEditorImageDialogComponent } from './image-url-dialog/image-url-dialog.component';\nimport { EuiEditorMaxlengthDirective } from './directives/eui-editor-maxlength.directive';\n\n// In case of dynamic loading this will not be available at this stage.\n// Thus the config for BetterTable keyboardBindings needs to be set at a later\n// stage. Same as the registration.\nconst QuillBetterTable = window['quillBetterTable'];\n\nconst quillConfig: QuillConfig = {\n modules: {\n table: false,\n 'better-table': {\n operationMenu: {\n items: {\n unmergeCells: {\n text: 'Another unmerge cells name',\n },\n },\n color: {\n colors: [\n '#000000',\n '#e60000',\n '#ff9900',\n '#ffff00',\n '#008a00',\n '#0066cc',\n '#9933ff',\n '#ffffff',\n '#facccc',\n '#ffebcc',\n '#ffffcc',\n '#cce8cc',\n '#cce0f5',\n '#ebd6ff',\n '#bbbbbb',\n '#f06666',\n '#ffc266',\n '#ffff66',\n '#66b966',\n '#66a3e0',\n '#c285ff',\n '#888888',\n '#a10000',\n '#b26b00',\n '#b2b200',\n '#006100',\n '#0047b2',\n '#6b24b2',\n '#444444',\n '#5c0000',\n '#663d00',\n '#666600',\n '#003700',\n '#002966',\n '#3d1466',\n ],\n text: 'Background Colors',\n },\n },\n },\n },\n};\n\nif(QuillBetterTable) {\n quillConfig.modules.keyboard = {\n bindings: QuillBetterTable?.keyboardBindings,\n };\n}\n\n@NgModule({\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n EuiTooltipDirectiveModule,\n QuillModule.forRoot(quillConfig),\n EuiDialogModule,\n EuiIconModule,\n EuiInputTextModule,\n ],\n declarations: [\n EuiEditorComponent,\n EuiEditorJsonViewComponent,\n EuiEditorHtmlViewComponent,\n EuiEditorCountersComponent,\n EuiEditorImageDialogComponent,\n EuiEditorMaxlengthDirective,\n EuiEditorCustomToolbarTagDirective,\n ClassFilterPipe,\n ],\n exports: [EuiEditorComponent, EuiEditorMaxlengthDirective, EuiEditorCustomToolbarTagDirective, EuiEditorCountersComponent],\n})\nexport class EuiEditorModule {}\n"],
5
5
  "mappings": "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",
6
6
  "names": ["Component", "Inject", "i0", "Component", "Input", "ViewEncapsulation", "ChangeDetectionStrategy", "i0", "ChangeDetectionStrategy", "Component", "Input", "ViewEncapsulation", "i0", "Component", "Input", "ViewEncapsulation", "ChangeDetectionStrategy", "FormControl", "coerceBooleanProperty", "takeUntil", "Subject", "QuillType", "i0", "Directive", "Input", "coerceBooleanProperty", "i0", "QuillBetterTable"]
7
7
  }