@flogeez/angular-tiptap-editor 3.1.2 → 3.1.4

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 (113) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/README.md +2 -2
  3. package/esm2022/flogeez-angular-tiptap-editor.mjs +5 -0
  4. package/esm2022/lib/ate-editor.provider.mjs +38 -0
  5. package/esm2022/lib/components/bubble-menus/base/ate-base-bubble-menu.mjs +207 -0
  6. package/esm2022/lib/components/bubble-menus/base/ate-base-sub-bubble-menu.mjs +137 -0
  7. package/esm2022/lib/components/bubble-menus/color/ate-color-bubble-menu.component.mjs +365 -0
  8. package/esm2022/lib/components/bubble-menus/image/ate-image-bubble-menu.component.mjs +309 -0
  9. package/esm2022/lib/components/bubble-menus/link/ate-link-bubble-menu.component.mjs +247 -0
  10. package/esm2022/lib/components/bubble-menus/table/ate-cell-bubble-menu.component.mjs +126 -0
  11. package/esm2022/lib/components/bubble-menus/table/ate-table-bubble-menu.component.mjs +271 -0
  12. package/esm2022/lib/components/bubble-menus/text/ate-bubble-menu.component.mjs +272 -0
  13. package/esm2022/lib/components/color-picker/ate-color-picker.component.mjs +123 -0
  14. package/esm2022/lib/components/edit-toggle/ate-edit-toggle.component.mjs +42 -0
  15. package/esm2022/lib/components/editor/angular-tiptap-editor.component.mjs +1031 -0
  16. package/esm2022/lib/components/editor/ate-block-controls.component.mjs +256 -0
  17. package/esm2022/lib/components/slash-commands/ate-slash-commands.component.mjs +328 -0
  18. package/esm2022/lib/components/toolbar/ate-toolbar.component.mjs +531 -0
  19. package/esm2022/lib/components/ui/ate-button.component.mjs +91 -0
  20. package/esm2022/lib/components/ui/ate-separator.component.mjs +11 -0
  21. package/esm2022/lib/config/ate-editor.config.mjs +133 -0
  22. package/esm2022/lib/config/ate-global-config.token.mjs +6 -0
  23. package/esm2022/lib/config/ate-slash-commands.config.mjs +130 -0
  24. package/esm2022/lib/directives/ate-noop-value-accessor.directive.mjs +40 -0
  25. package/esm2022/lib/directives/ate-tooltip.directive.mjs +138 -0
  26. package/esm2022/lib/extensions/ate-block-controls.extension.mjs +156 -0
  27. package/esm2022/lib/extensions/ate-link-click-behavior.extension.mjs +32 -0
  28. package/esm2022/lib/extensions/ate-resizable-image.extension.mjs +277 -0
  29. package/esm2022/lib/extensions/ate-table.extension.mjs +27 -0
  30. package/esm2022/lib/extensions/ate-tiptap-state.extension.mjs +85 -0
  31. package/esm2022/lib/extensions/ate-upload-progress.extension.mjs +195 -0
  32. package/esm2022/lib/extensions/calculators/ate-discovery.calculator.mjs +62 -0
  33. package/esm2022/lib/extensions/calculators/ate-image.calculator.mjs +8 -0
  34. package/esm2022/lib/extensions/calculators/ate-marks.calculator.mjs +75 -0
  35. package/esm2022/lib/extensions/calculators/ate-selection.calculator.mjs +35 -0
  36. package/esm2022/lib/extensions/calculators/ate-structure.calculator.mjs +34 -0
  37. package/esm2022/lib/extensions/calculators/ate-table.calculator.mjs +38 -0
  38. package/esm2022/lib/models/ate-bubble-menu.model.mjs +53 -0
  39. package/esm2022/lib/models/ate-editor-config.model.mjs +2 -0
  40. package/esm2022/lib/models/ate-editor-state.model.mjs +90 -0
  41. package/esm2022/lib/models/ate-image.model.mjs +2 -0
  42. package/esm2022/lib/models/ate-slash-command.model.mjs +2 -0
  43. package/esm2022/lib/models/ate-toolbar.model.mjs +35 -0
  44. package/esm2022/lib/node-view/ate-angular-node-view.mjs +97 -0
  45. package/esm2022/lib/node-view/ate-injector.registry.mjs +16 -0
  46. package/esm2022/lib/node-view/ate-node-view.factory.mjs +125 -0
  47. package/esm2022/lib/node-view/ate-node-view.models.mjs +2 -0
  48. package/esm2022/lib/node-view/ate-node-view.renderer.mjs +154 -0
  49. package/esm2022/lib/node-view/ate-register-angular-component.mjs +49 -0
  50. package/esm2022/lib/services/ate-color-picker.service.mjs +194 -0
  51. package/esm2022/lib/services/ate-editor-commands.service.mjs +474 -0
  52. package/esm2022/lib/services/ate-i18n.service.mjs +422 -0
  53. package/esm2022/lib/services/ate-image.service.mjs +459 -0
  54. package/esm2022/lib/services/ate-link.service.mjs +99 -0
  55. package/esm2022/lib/utils/ate-color.utils.mjs +60 -0
  56. package/esm2022/public-api.mjs +40 -0
  57. package/fesm2022/flogeez-angular-tiptap-editor.mjs +321 -354
  58. package/fesm2022/flogeez-angular-tiptap-editor.mjs.map +1 -1
  59. package/index.d.ts +3 -1734
  60. package/lib/ate-editor.provider.d.ts +21 -0
  61. package/lib/components/bubble-menus/base/ate-base-bubble-menu.d.ts +71 -0
  62. package/lib/components/bubble-menus/base/ate-base-sub-bubble-menu.d.ts +60 -0
  63. package/lib/components/bubble-menus/color/ate-color-bubble-menu.component.d.ts +77 -0
  64. package/lib/components/bubble-menus/image/ate-image-bubble-menu.component.d.ts +49 -0
  65. package/lib/components/bubble-menus/link/ate-link-bubble-menu.component.d.ts +55 -0
  66. package/lib/components/bubble-menus/table/ate-cell-bubble-menu.component.d.ts +16 -0
  67. package/lib/components/bubble-menus/table/ate-table-bubble-menu.component.d.ts +25 -0
  68. package/lib/components/bubble-menus/text/ate-bubble-menu.component.d.ts +53 -0
  69. package/lib/components/color-picker/ate-color-picker.component.d.ts +54 -0
  70. package/lib/components/edit-toggle/ate-edit-toggle.component.d.ts +13 -0
  71. package/lib/components/editor/angular-tiptap-editor.component.d.ts +242 -0
  72. package/lib/components/editor/ate-block-controls.component.d.ts +44 -0
  73. package/lib/components/slash-commands/ate-slash-commands.component.d.ts +34 -0
  74. package/lib/components/toolbar/ate-toolbar.component.d.ts +47 -0
  75. package/lib/components/ui/ate-button.component.d.ts +25 -0
  76. package/lib/components/ui/ate-separator.component.d.ts +5 -0
  77. package/lib/config/ate-editor.config.d.ts +19 -0
  78. package/lib/config/ate-global-config.token.d.ts +6 -0
  79. package/lib/config/ate-slash-commands.config.d.ts +41 -0
  80. package/lib/directives/ate-noop-value-accessor.directive.d.ts +13 -0
  81. package/lib/directives/ate-tooltip.directive.d.ts +30 -0
  82. package/lib/extensions/ate-block-controls.extension.d.ts +10 -0
  83. package/lib/extensions/ate-link-click-behavior.extension.d.ts +2 -0
  84. package/lib/extensions/ate-resizable-image.extension.d.ts +27 -0
  85. package/lib/extensions/ate-table.extension.d.ts +2 -0
  86. package/lib/extensions/ate-tiptap-state.extension.d.ts +7 -0
  87. package/lib/extensions/ate-upload-progress.extension.d.ts +7 -0
  88. package/lib/extensions/calculators/ate-discovery.calculator.d.ts +7 -0
  89. package/lib/extensions/calculators/ate-image.calculator.d.ts +2 -0
  90. package/lib/extensions/calculators/ate-marks.calculator.d.ts +2 -0
  91. package/lib/extensions/calculators/ate-selection.calculator.d.ts +2 -0
  92. package/lib/extensions/calculators/ate-structure.calculator.d.ts +2 -0
  93. package/lib/extensions/calculators/ate-table.calculator.d.ts +2 -0
  94. package/lib/models/ate-bubble-menu.model.d.ts +33 -0
  95. package/lib/models/ate-editor-config.model.d.ts +113 -0
  96. package/lib/models/ate-editor-state.model.d.ts +109 -0
  97. package/lib/models/ate-image.model.d.ts +104 -0
  98. package/lib/models/ate-slash-command.model.d.ts +17 -0
  99. package/lib/models/ate-toolbar.model.d.ts +18 -0
  100. package/lib/node-view/ate-angular-node-view.d.ts +115 -0
  101. package/lib/node-view/ate-injector.registry.d.ts +3 -0
  102. package/lib/node-view/ate-node-view.factory.d.ts +10 -0
  103. package/lib/node-view/ate-node-view.models.d.ts +138 -0
  104. package/lib/node-view/ate-node-view.renderer.d.ts +23 -0
  105. package/lib/node-view/ate-register-angular-component.d.ts +35 -0
  106. package/lib/services/ate-color-picker.service.d.ts +65 -0
  107. package/lib/services/ate-editor-commands.service.d.ts +75 -0
  108. package/lib/services/ate-i18n.service.d.ts +406 -0
  109. package/lib/services/ate-image.service.d.ts +82 -0
  110. package/lib/services/ate-link.service.d.ts +42 -0
  111. package/lib/utils/ate-color.utils.d.ts +12 -0
  112. package/package.json +3 -1
  113. package/public-api.d.ts +31 -0
@@ -0,0 +1,49 @@
1
+ import { createAngularComponentExtension } from "./ate-node-view.factory";
2
+ import { getGlobalInjector } from "./ate-injector.registry";
3
+ /**
4
+ * Registers ANY Angular component as a TipTap node extension.
5
+ *
6
+ * This function is the single public entry point for adding custom components.
7
+ * It supports two distinct modes:
8
+ *
9
+ * 1. **TipTap-Aware Mode** (the component extends `AteAngularNodeView`):
10
+ * Grants direct access to the TipTap API (`editor`, `node`, `updateAttributes`, etc.) within the component.
11
+ *
12
+ * 2. **Standard Mode** (library or legacy components):
13
+ * Allows using any existing Angular component. Its `@Input()` properties are automatically
14
+ * synchronized with TipTap node attributes.
15
+ *
16
+ * @param injectorOrOptions - The Angular Injector OR the configuration options
17
+ * @param maybeOptions - Configuration options (if the first param was an injector)
18
+ * @returns A TipTap Node extension ready to be used
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * // Modern way (requires provideAteEditor())
23
+ * registerAngularComponent({
24
+ * component: MyComponent,
25
+ * name: 'myComponent'
26
+ * });
27
+ *
28
+ * // Classic way
29
+ * registerAngularComponent(injector, {
30
+ * component: MyComponent
31
+ * });
32
+ * ```
33
+ */
34
+ export function registerAngularComponent(injectorOrOptions, maybeOptions) {
35
+ let injector;
36
+ let options;
37
+ // Duck-typing check: Injectors have a 'get' method
38
+ const isInjector = (obj) => obj !== null && typeof obj === "object" && typeof obj.get === "function";
39
+ if (isInjector(injectorOrOptions)) {
40
+ injector = injectorOrOptions;
41
+ options = maybeOptions;
42
+ }
43
+ else {
44
+ injector = getGlobalInjector();
45
+ options = injectorOrOptions;
46
+ }
47
+ return createAngularComponentExtension(injector, options);
48
+ }
49
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRlLXJlZ2lzdGVyLWFuZ3VsYXItY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci10aXB0YXAtZWRpdG9yL3NyYy9saWIvbm9kZS12aWV3L2F0ZS1yZWdpc3Rlci1hbmd1bGFyLWNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMxRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUU1RDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBOEJHO0FBQ0gsTUFBTSxVQUFVLHdCQUF3QixDQUN0QyxpQkFBZ0UsRUFDaEUsWUFBaUQ7SUFFakQsSUFBSSxRQUFrQixDQUFDO0lBQ3ZCLElBQUksT0FBMkMsQ0FBQztJQUVoRCxtREFBbUQ7SUFDbkQsTUFBTSxVQUFVLEdBQUcsQ0FBQyxHQUFZLEVBQW1CLEVBQUUsQ0FDbkQsR0FBRyxLQUFLLElBQUksSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLElBQUksT0FBUSxHQUFnQixDQUFDLEdBQUcsS0FBSyxVQUFVLENBQUM7SUFFekYsSUFBSSxVQUFVLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDO1FBQ2xDLFFBQVEsR0FBRyxpQkFBaUIsQ0FBQztRQUM3QixPQUFPLEdBQUcsWUFBYSxDQUFDO0lBQzFCLENBQUM7U0FBTSxDQUFDO1FBQ04sUUFBUSxHQUFHLGlCQUFpQixFQUFFLENBQUM7UUFDL0IsT0FBTyxHQUFHLGlCQUF1RCxDQUFDO0lBQ3BFLENBQUM7SUFFRCxPQUFPLCtCQUErQixDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUM1RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0b3IgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgTm9kZSB9IGZyb20gXCJAdGlwdGFwL2NvcmVcIjtcbmltcG9ydCB7IFJlZ2lzdGVyQW5ndWxhckNvbXBvbmVudE9wdGlvbnMgfSBmcm9tIFwiLi9hdGUtbm9kZS12aWV3Lm1vZGVsc1wiO1xuaW1wb3J0IHsgY3JlYXRlQW5ndWxhckNvbXBvbmVudEV4dGVuc2lvbiB9IGZyb20gXCIuL2F0ZS1ub2RlLXZpZXcuZmFjdG9yeVwiO1xuaW1wb3J0IHsgZ2V0R2xvYmFsSW5qZWN0b3IgfSBmcm9tIFwiLi9hdGUtaW5qZWN0b3IucmVnaXN0cnlcIjtcblxuLyoqXG4gKiBSZWdpc3RlcnMgQU5ZIEFuZ3VsYXIgY29tcG9uZW50IGFzIGEgVGlwVGFwIG5vZGUgZXh0ZW5zaW9uLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gaXMgdGhlIHNpbmdsZSBwdWJsaWMgZW50cnkgcG9pbnQgZm9yIGFkZGluZyBjdXN0b20gY29tcG9uZW50cy5cbiAqIEl0IHN1cHBvcnRzIHR3byBkaXN0aW5jdCBtb2RlczpcbiAqXG4gKiAxLiAqKlRpcFRhcC1Bd2FyZSBNb2RlKiogKHRoZSBjb21wb25lbnQgZXh0ZW5kcyBgQXRlQW5ndWxhck5vZGVWaWV3YCk6XG4gKiAgICBHcmFudHMgZGlyZWN0IGFjY2VzcyB0byB0aGUgVGlwVGFwIEFQSSAoYGVkaXRvcmAsIGBub2RlYCwgYHVwZGF0ZUF0dHJpYnV0ZXNgLCBldGMuKSB3aXRoaW4gdGhlIGNvbXBvbmVudC5cbiAqXG4gKiAyLiAqKlN0YW5kYXJkIE1vZGUqKiAobGlicmFyeSBvciBsZWdhY3kgY29tcG9uZW50cyk6XG4gKiAgICBBbGxvd3MgdXNpbmcgYW55IGV4aXN0aW5nIEFuZ3VsYXIgY29tcG9uZW50LiBJdHMgYEBJbnB1dCgpYCBwcm9wZXJ0aWVzIGFyZSBhdXRvbWF0aWNhbGx5XG4gKiAgICBzeW5jaHJvbml6ZWQgd2l0aCBUaXBUYXAgbm9kZSBhdHRyaWJ1dGVzLlxuICpcbiAqIEBwYXJhbSBpbmplY3Rvck9yT3B0aW9ucyAtIFRoZSBBbmd1bGFyIEluamVjdG9yIE9SIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnNcbiAqIEBwYXJhbSBtYXliZU9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgKGlmIHRoZSBmaXJzdCBwYXJhbSB3YXMgYW4gaW5qZWN0b3IpXG4gKiBAcmV0dXJucyBBIFRpcFRhcCBOb2RlIGV4dGVuc2lvbiByZWFkeSB0byBiZSB1c2VkXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIE1vZGVybiB3YXkgKHJlcXVpcmVzIHByb3ZpZGVBdGVFZGl0b3IoKSlcbiAqIHJlZ2lzdGVyQW5ndWxhckNvbXBvbmVudCh7XG4gKiAgIGNvbXBvbmVudDogTXlDb21wb25lbnQsXG4gKiAgIG5hbWU6ICdteUNvbXBvbmVudCdcbiAqIH0pO1xuICpcbiAqIC8vIENsYXNzaWMgd2F5XG4gKiByZWdpc3RlckFuZ3VsYXJDb21wb25lbnQoaW5qZWN0b3IsIHtcbiAqICAgY29tcG9uZW50OiBNeUNvbXBvbmVudFxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyQW5ndWxhckNvbXBvbmVudDxUID0gdW5rbm93bj4oXG4gIGluamVjdG9yT3JPcHRpb25zOiBJbmplY3RvciB8IFJlZ2lzdGVyQW5ndWxhckNvbXBvbmVudE9wdGlvbnM8VD4sXG4gIG1heWJlT3B0aW9ucz86IFJlZ2lzdGVyQW5ndWxhckNvbXBvbmVudE9wdGlvbnM8VD5cbik6IE5vZGUge1xuICBsZXQgaW5qZWN0b3I6IEluamVjdG9yO1xuICBsZXQgb3B0aW9uczogUmVnaXN0ZXJBbmd1bGFyQ29tcG9uZW50T3B0aW9uczxUPjtcblxuICAvLyBEdWNrLXR5cGluZyBjaGVjazogSW5qZWN0b3JzIGhhdmUgYSAnZ2V0JyBtZXRob2RcbiAgY29uc3QgaXNJbmplY3RvciA9IChvYmo6IHVua25vd24pOiBvYmogaXMgSW5qZWN0b3IgPT5cbiAgICBvYmogIT09IG51bGwgJiYgdHlwZW9mIG9iaiA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgKG9iaiBhcyBJbmplY3RvcikuZ2V0ID09PSBcImZ1bmN0aW9uXCI7XG5cbiAgaWYgKGlzSW5qZWN0b3IoaW5qZWN0b3JPck9wdGlvbnMpKSB7XG4gICAgaW5qZWN0b3IgPSBpbmplY3Rvck9yT3B0aW9ucztcbiAgICBvcHRpb25zID0gbWF5YmVPcHRpb25zITtcbiAgfSBlbHNlIHtcbiAgICBpbmplY3RvciA9IGdldEdsb2JhbEluamVjdG9yKCk7XG4gICAgb3B0aW9ucyA9IGluamVjdG9yT3JPcHRpb25zIGFzIFJlZ2lzdGVyQW5ndWxhckNvbXBvbmVudE9wdGlvbnM8VD47XG4gIH1cblxuICByZXR1cm4gY3JlYXRlQW5ndWxhckNvbXBvbmVudEV4dGVuc2lvbihpbmplY3Rvciwgb3B0aW9ucyk7XG59XG4iXX0=
@@ -0,0 +1,194 @@
1
+ import { Injectable, signal } from "@angular/core";
2
+ import { normalizeColor, getLuminance, getContrastColor } from "../utils/ate-color.utils";
3
+ import * as i0 from "@angular/core";
4
+ export class AteColorPickerService {
5
+ constructor() {
6
+ this.storedSelection = null;
7
+ // ============================================
8
+ // State Signals (owned by this service)
9
+ // ============================================
10
+ /** Current edit mode: null when closed, 'text' or 'highlight' when open */
11
+ this.editMode = signal(null);
12
+ /** Reference to the element that triggered the menu (for anchoring) */
13
+ this.menuTrigger = signal(null);
14
+ /** Whether the user is currently interacting with the picker UI (e.g. typing) */
15
+ this.isInteracting = signal(false);
16
+ }
17
+ // ============================================
18
+ // Menu Lifecycle Methods
19
+ // ============================================
20
+ /**
21
+ * Open the color picker menu in the specified mode.
22
+ */
23
+ open(mode, trigger) {
24
+ this.menuTrigger.set(trigger || null);
25
+ this.editMode.set(mode);
26
+ }
27
+ /**
28
+ * Close the color picker menu.
29
+ */
30
+ close() {
31
+ this.editMode.set(null);
32
+ this.isInteracting.set(false);
33
+ }
34
+ /**
35
+ * Set interaction state (prevents premature closing when blurring editor)
36
+ */
37
+ setInteracting(value) {
38
+ this.isInteracting.set(value);
39
+ }
40
+ /**
41
+ * Toggle color picker from UI (extracts trigger from event).
42
+ */
43
+ toggle(editor, mode, event) {
44
+ if (!editor) {
45
+ return;
46
+ }
47
+ let trigger;
48
+ if (event && typeof event !== "string") {
49
+ const target = event.target;
50
+ trigger =
51
+ event.currentTarget || target?.closest("button") || target;
52
+ }
53
+ this.open(mode, trigger);
54
+ }
55
+ // ============================================
56
+ // Selection Capture (for reliable color application)
57
+ // ============================================
58
+ /**
59
+ * Capture current editor selection.
60
+ */
61
+ captureSelection(editor) {
62
+ if (!editor) {
63
+ return;
64
+ }
65
+ this.storedSelection = {
66
+ from: editor.state.selection.from,
67
+ to: editor.state.selection.to,
68
+ };
69
+ }
70
+ /**
71
+ * Get last captured selection.
72
+ */
73
+ getStoredSelection() {
74
+ return this.storedSelection;
75
+ }
76
+ /**
77
+ * Clear captured selection.
78
+ */
79
+ done() {
80
+ this.storedSelection = null;
81
+ this.menuTrigger.set(null);
82
+ }
83
+ // ============================================
84
+ // Color Application Commands
85
+ // ============================================
86
+ /**
87
+ * Apply text color to selection.
88
+ */
89
+ applyColor(editor, color, addToHistory = true, focus = true) {
90
+ if (!editor) {
91
+ return;
92
+ }
93
+ const stored = this.storedSelection;
94
+ let chain = editor.chain();
95
+ if (focus) {
96
+ chain = chain.focus();
97
+ }
98
+ if (stored && (editor.state.selection.empty || !editor.isFocused)) {
99
+ chain = chain.setTextSelection(stored);
100
+ }
101
+ else if (editor.state.selection.empty && !stored) {
102
+ chain = chain.extendMarkRange("textStyle");
103
+ }
104
+ chain.setColor(color);
105
+ if (addToHistory === false) {
106
+ chain = chain.setMeta("addToHistory", false);
107
+ }
108
+ chain.run();
109
+ }
110
+ /**
111
+ * Remove text color from selection.
112
+ */
113
+ unsetColor(editor, focus = true) {
114
+ if (!editor) {
115
+ return;
116
+ }
117
+ const stored = this.storedSelection;
118
+ let chain = editor.chain();
119
+ if (focus) {
120
+ chain = chain.focus();
121
+ }
122
+ if (stored) {
123
+ chain = chain.setTextSelection(stored);
124
+ }
125
+ else if (editor.state.selection.empty) {
126
+ chain = chain.extendMarkRange("textStyle");
127
+ }
128
+ chain.unsetColor();
129
+ chain.run();
130
+ }
131
+ /**
132
+ * Apply highlight color to selection.
133
+ */
134
+ applyHighlight(editor, color, addToHistory = true, focus = true) {
135
+ if (!editor) {
136
+ return;
137
+ }
138
+ const stored = this.storedSelection;
139
+ let chain = editor.chain();
140
+ if (focus) {
141
+ chain = chain.focus();
142
+ }
143
+ if (stored && (editor.state.selection.empty || !editor.isFocused)) {
144
+ chain = chain.setTextSelection(stored);
145
+ }
146
+ else if (editor.state.selection.empty && !stored) {
147
+ chain = chain.extendMarkRange("highlight");
148
+ }
149
+ chain.setHighlight({ color });
150
+ if (addToHistory === false) {
151
+ chain = chain.setMeta("addToHistory", false);
152
+ }
153
+ chain.run();
154
+ }
155
+ /**
156
+ * Remove highlight from selection.
157
+ */
158
+ unsetHighlight(editor, focus = true) {
159
+ if (!editor) {
160
+ return;
161
+ }
162
+ const stored = this.storedSelection;
163
+ let chain = editor.chain();
164
+ if (focus) {
165
+ chain = chain.focus();
166
+ }
167
+ if (stored) {
168
+ chain = chain.setTextSelection(stored);
169
+ }
170
+ else if (editor.state.selection.empty) {
171
+ chain = chain.extendMarkRange("highlight");
172
+ }
173
+ chain.unsetHighlight();
174
+ chain.run();
175
+ }
176
+ // ============================================
177
+ // Color Utilities (Delegated to color.utils.ts)
178
+ // ============================================
179
+ normalizeColor(color) {
180
+ return normalizeColor(color) || "#000000";
181
+ }
182
+ getLuminance(color) {
183
+ return getLuminance(color);
184
+ }
185
+ getContrastColor(color) {
186
+ return getContrastColor(color);
187
+ }
188
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteColorPickerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
189
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteColorPickerService }); }
190
+ }
191
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteColorPickerService, decorators: [{
192
+ type: Injectable
193
+ }] });
194
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRlLWNvbG9yLXBpY2tlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci10aXB0YXAtZWRpdG9yL3NyYy9saWIvc2VydmljZXMvYXRlLWNvbG9yLXBpY2tlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRW5ELE9BQU8sRUFBRSxjQUFjLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7O0FBVTFGLE1BQU0sT0FBTyxxQkFBcUI7SUFEbEM7UUFFVSxvQkFBZSxHQUFtQyxJQUFJLENBQUM7UUFFL0QsK0NBQStDO1FBQy9DLHdDQUF3QztRQUN4QywrQ0FBK0M7UUFFL0MsMkVBQTJFO1FBQ2xFLGFBQVEsR0FBRyxNQUFNLENBQTBCLElBQUksQ0FBQyxDQUFDO1FBRTFELHVFQUF1RTtRQUM5RCxnQkFBVyxHQUFHLE1BQU0sQ0FBcUIsSUFBSSxDQUFDLENBQUM7UUFFeEQsaUZBQWlGO1FBQ3hFLGtCQUFhLEdBQUcsTUFBTSxDQUFVLEtBQUssQ0FBQyxDQUFDO0tBME1qRDtJQXhNQywrQ0FBK0M7SUFDL0MseUJBQXlCO0lBQ3pCLCtDQUErQztJQUUvQzs7T0FFRztJQUNILElBQUksQ0FBQyxJQUFzQixFQUFFLE9BQXFCO1FBQ2hELElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLO1FBQ0gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFD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LEdBQUcsRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQUVELCtDQUErQztJQUMvQyxnREFBZ0Q7SUFDaEQsK0NBQStDO0lBRS9DLGNBQWMsQ0FBQyxLQUFnQztRQUM3QyxPQUFPLGNBQWMsQ0FBQyxLQUFLLENBQUMsSUFBSSxTQUFTLENBQUM7SUFDNUMsQ0FBQztJQUVELFlBQVksQ0FBQyxLQUFhO1FBQ3hCLE9BQU8sWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxLQUFhO1FBQzVCLE9BQU8sZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDakMsQ0FBQzsrR0F2TlUscUJBQXFCO21IQUFyQixxQkFBcUI7OzRGQUFyQixxQkFBcUI7a0JBRGpDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBzaWduYWwgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBFZGl0b3IgfSBmcm9tIFwiQHRpcHRhcC9jb3JlXCI7XG5pbXBvcnQgeyBub3JtYWxpemVDb2xvciwgZ2V0THVtaW5hbmNlLCBnZXRDb250cmFzdENvbG9yIH0gZnJvbSBcIi4uL3V0aWxzL2F0ZS1jb2xvci51dGlsc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEF0ZUNvbG9yUGlja2VyU2VsZWN0aW9uIHtcbiAgZnJvbTogbnVtYmVyO1xuICB0bzogbnVtYmVyO1xufVxuXG5leHBvcnQgdHlwZSBBdGVDb2xvckVkaXRNb2RlID0gXCJ0ZXh0XCIgfCBcImhpZ2hsaWdodFwiO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQXRlQ29sb3JQaWNrZXJTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBzdG9yZWRTZWxlY3Rpb246IEF0ZUNvbG9yUGlja2VyU2VsZWN0aW9uIHwgbnVsbCA9IG51bGw7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gU3RhdGUgU2lnbmFscyAob3duZWQgYnkgdGhpcyBzZXJ2aWNlKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBDdXJyZW50IGVkaXQgbW9kZTogbnVsbCB3aGVuIGNsb3NlZCwgJ3RleHQnIG9yICdoaWdobGlnaHQnIHdoZW4gb3BlbiAqL1xuICByZWFkb25seSBlZGl0TW9kZSA9IHNpZ25hbDxBdGVDb2xvckVkaXRNb2RlIHwgbnVsbD4obnVsbCk7XG5cbiAgLyoqIFJlZmVyZW5jZSB0byB0aGUgZWxlbWVudCB0aGF0IHRyaWdnZXJlZCB0aGUgbWVudSAoZm9yIGFuY2hvcmluZykgKi9cbiAgcmVhZG9ubHkgbWVudVRyaWdnZXIgPSBzaWduYWw8SFRNTEVsZW1lbnQgfCBudWxsPihudWxsKTtcblxuICAvKiogV2hldGhlciB0aGUgdXNlciBpcyBjdXJyZW50bHkgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgcGlja2VyIFVJIChlLmcuIHR5cGluZykgKi9cbiAgcmVhZG9ubHkgaXNJbnRlcmFjdGluZyA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTWVudSBMaWZlY3ljbGUgTWV0aG9kc1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBPcGVuIHRoZSBjb2xvciBwaWNrZXIgbWVudSBpbiB0aGUgc3BlY2lmaWVkIG1vZGUuXG4gICAqL1xuICBvcGVuKG1vZGU6IEF0ZUNvbG9yRWRpdE1vZGUsIHRyaWdnZXI/OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIHRoaXMubWVudVRyaWdnZXIuc2V0KHRyaWdnZXIgfHwgbnVsbCk7XG4gICAgdGhpcy5lZGl0TW9kZS5zZXQobW9kZSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2UgdGhlIGNvbG9yIHBpY2tlciBtZW51LlxuICAgKi9cbiAgY2xvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0TW9kZS5zZXQobnVsbCk7XG4gICAgdGhpcy5pc0ludGVyYWN0aW5nLnNldChmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGludGVyYWN0aW9uIHN0YXRlIChwcmV2ZW50cyBwcmVtYXR1cmUgY2xvc2luZyB3aGVuIGJsdXJyaW5nIGVkaXRvcilcbiAgICovXG4gIHNldEludGVyYWN0aW5nKHZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5pc0ludGVyYWN0aW5nLnNldCh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogVG9nZ2xlIGNvbG9yIHBpY2tlciBmcm9tIFVJIChleHRyYWN0cyB0cmlnZ2VyIGZyb20gZXZlbnQpLlxuICAgKi9cbiAgdG9nZ2xlKGVkaXRvcjogRWRpdG9yLCBtb2RlOiBBdGVDb2xvckVkaXRNb2RlLCBldmVudD86IEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCFlZGl0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgdHJpZ2dlcjogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XG4gICAgaWYgKGV2ZW50ICYmIHR5cGVvZiBldmVudCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgdHJpZ2dlciA9XG4gICAgICAgIChldmVudC5jdXJyZW50VGFyZ2V0IGFzIEhUTUxFbGVtZW50KSB8fCAodGFyZ2V0IGFzIEVsZW1lbnQpPy5jbG9zZXN0KFwiYnV0dG9uXCIpIHx8IHRhcmdldDtcbiAgICB9XG5cbiAgICB0aGlzLm9wZW4obW9kZSwgdHJpZ2dlcik7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBTZWxlY3Rpb24gQ2FwdHVyZSAoZm9yIHJlbGlhYmxlIGNvbG9yIGFwcGxpY2F0aW9uKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBDYXB0dXJlIGN1cnJlbnQgZWRpdG9yIHNlbGVjdGlvbi5cbiAgICovXG4gIGNhcHR1cmVTZWxlY3Rpb24oZWRpdG9yOiBFZGl0b3IpOiB2b2lkIHtcbiAgICBpZiAoIWVkaXRvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnN0b3JlZFNlbGVjdGlvbiA9IHtcbiAgICAgIGZyb206IGVkaXRvci5zdGF0ZS5zZWxlY3Rpb24uZnJvbSxcbiAgICAgIHRvOiBlZGl0b3Iuc3RhdGUuc2VsZWN0aW9uLnRvLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0IGxhc3QgY2FwdHVyZWQgc2VsZWN0aW9uLlxuICAgKi9cbiAgZ2V0U3RvcmVkU2VsZWN0aW9uKCk6IEF0ZUNvbG9yUGlja2VyU2VsZWN0aW9uIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmVkU2VsZWN0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGNhcHR1cmVkIHNlbGVjdGlvbi5cbiAgICovXG4gIGRvbmUoKTogdm9pZCB7XG4gICAgdGhpcy5zdG9yZWRTZWxlY3Rpb24gPSBudWxsO1xuICAgIHRoaXMubWVudVRyaWdnZXIuc2V0KG51bGwpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ29sb3IgQXBwbGljYXRpb24gQ29tbWFuZHNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQXBwbHkgdGV4dCBjb2xvciB0byBzZWxlY3Rpb24uXG4gICAqL1xuICBhcHBseUNvbG9yKGVkaXRvcjogRWRpdG9yLCBjb2xvcjogc3RyaW5nLCBhZGRUb0hpc3RvcnkgPSB0cnVlLCBmb2N1cyA9IHRydWUpOiB2b2lkIHtcbiAgICBpZiAoIWVkaXRvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHN0b3JlZCA9IHRoaXMuc3RvcmVkU2VsZWN0aW9uO1xuICAgIGxldCBjaGFpbiA9IGVkaXRvci5jaGFpbigpO1xuICAgIGlmIChmb2N1cykge1xuICAgICAgY2hhaW4gPSBjaGFpbi5mb2N1cygpO1xuICAgIH1cblxuICAgIGlmIChzdG9yZWQgJiYgKGVkaXRvci5zdGF0ZS5zZWxlY3Rpb24uZW1wdHkgfHwgIWVkaXRvci5pc0ZvY3VzZWQpKSB7XG4gICAgICBjaGFpbiA9IGNoYWluLnNldFRleHRTZWxlY3Rpb24oc3RvcmVkKTtcbiAgICB9IGVsc2UgaWYgKGVkaXRvci5zdGF0ZS5zZWxlY3Rpb24uZW1wdHkgJiYgIXN0b3JlZCkge1xuICAgICAgY2hhaW4gPSBjaGFpbi5leHRlbmRNYXJrUmFuZ2UoXCJ0ZXh0U3R5bGVcIik7XG4gICAgfVxuXG4gICAgY2hhaW4uc2V0Q29sb3IoY29sb3IpO1xuXG4gICAgaWYgKGFkZFRvSGlzdG9yeSA9PT0gZmFsc2UpIHtcbiAgICAgIGNoYWluID0gY2hhaW4uc2V0TWV0YShcImFkZFRvSGlzdG9yeVwiLCBmYWxzZSk7XG4gICAgfVxuICAgIGNoYWluLnJ1bigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSB0ZXh0IGNvbG9yIGZyb20gc2VsZWN0aW9uLlxuICAgKi9cbiAgdW5zZXRDb2xvcihlZGl0b3I6IEVkaXRvciwgZm9jdXMgPSB0cnVlKTogdm9pZCB7XG4gICAgaWYgKCFlZGl0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzdG9yZWQgPSB0aGlzLnN0b3JlZFNlbGVjdGlvbjtcbiAgICBsZXQgY2hhaW4gPSBlZGl0b3IuY2hhaW4oKTtcbiAgICBpZiAoZm9jdXMpIHtcbiAgICAgIGNoYWluID0gY2hhaW4uZm9jdXMoKTtcbiAgICB9XG5cbiAgICBpZiAoc3RvcmVkKSB7XG4gICAgICBjaGFpbiA9IGNoYWluLnNldFRleHRTZWxlY3Rpb24oc3RvcmVkKTtcbiAgICB9IGVsc2UgaWYgKGVkaXRvci5zdGF0ZS5zZWxlY3Rpb24uZW1wdHkpIHtcbiAgICAgIGNoYWluID0gY2hhaW4uZXh0ZW5kTWFya1JhbmdlKFwidGV4dFN0eWxlXCIpO1xuICAgIH1cblxuICAgIGNoYWluLnVuc2V0Q29sb3IoKTtcbiAgICBjaGFpbi5ydW4oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSBoaWdobGlnaHQgY29sb3IgdG8gc2VsZWN0aW9uLlxuICAgKi9cbiAgYXBwbHlIaWdobGlnaHQoZWRpdG9yOiBFZGl0b3IsIGNvbG9yOiBzdHJpbmcsIGFkZFRvSGlzdG9yeSA9IHRydWUsIGZvY3VzID0gdHJ1ZSk6IHZvaWQge1xuICAgIGlmICghZWRpdG9yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3RvcmVkID0gdGhpcy5zdG9yZWRTZWxlY3Rpb247XG4gICAgbGV0IGNoYWluID0gZWRpdG9yLmNoYWluKCk7XG4gICAgaWYgKGZvY3VzKSB7XG4gICAgICBjaGFpbiA9IGNoYWluLmZvY3VzKCk7XG4gICAgfVxuXG4gICAgaWYgKHN0b3JlZCAmJiAoZWRpdG9yLnN0YXRlLnNlbGVjdGlvbi5lbXB0eSB8fCAhZWRpdG9yLmlzRm9jdXNlZCkpIHtcbiAgICAgIGNoYWluID0gY2hhaW4uc2V0VGV4dFNlbGVjdGlvbihzdG9yZWQpO1xuICAgIH0gZWxzZSBpZiAoZWRpdG9yLnN0YXRlLnNlbGVjdGlvbi5lbXB0eSAmJiAhc3RvcmVkKSB7XG4gICAgICBjaGFpbiA9IGNoYWluLmV4dGVuZE1hcmtSYW5nZShcImhpZ2hsaWdodFwiKTtcbiAgICB9XG5cbiAgICBjaGFpbi5zZXRIaWdobGlnaHQoeyBjb2xvciB9KTtcblxuICAgIGlmIChhZGRUb0hpc3RvcnkgPT09IGZhbHNlKSB7XG4gICAgICBjaGFpbiA9IGNoYWluLnNldE1ldGEoXCJhZGRUb0hpc3RvcnlcIiwgZmFsc2UpO1xuICAgIH1cbiAgICBjaGFpbi5ydW4oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgaGlnaGxpZ2h0IGZyb20gc2VsZWN0aW9uLlxuICAgKi9cbiAgdW5zZXRIaWdobGlnaHQoZWRpdG9yOiBFZGl0b3IsIGZvY3VzID0gdHJ1ZSk6IHZvaWQge1xuICAgIGlmICghZWRpdG9yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3RvcmVkID0gdGhpcy5zdG9yZWRTZWxlY3Rpb247XG4gICAgbGV0IGNoYWluID0gZWRpdG9yLmNoYWluKCk7XG4gICAgaWYgKGZvY3VzKSB7XG4gICAgICBjaGFpbiA9IGNoYWluLmZvY3VzKCk7XG4gICAgfVxuXG4gICAgaWYgKHN0b3JlZCkge1xuICAgICAgY2hhaW4gPSBjaGFpbi5zZXRUZXh0U2VsZWN0aW9uKHN0b3JlZCk7XG4gICAgfSBlbHNlIGlmIChlZGl0b3Iuc3RhdGUuc2VsZWN0aW9uLmVtcHR5KSB7XG4gICAgICBjaGFpbiA9IGNoYWluLmV4dGVuZE1hcmtSYW5nZShcImhpZ2hsaWdodFwiKTtcbiAgICB9XG5cbiAgICBjaGFpbi51bnNldEhpZ2hsaWdodCgpO1xuICAgIGNoYWluLnJ1bigpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ29sb3IgVXRpbGl0aWVzIChEZWxlZ2F0ZWQgdG8gY29sb3IudXRpbHMudHMpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgbm9ybWFsaXplQ29sb3IoY29sb3I6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICAgIHJldHVybiBub3JtYWxpemVDb2xvcihjb2xvcikgfHwgXCIjMDAwMDAwXCI7XG4gIH1cblxuICBnZXRMdW1pbmFuY2UoY29sb3I6IHN0cmluZyk6IG51bWJlciB7XG4gICAgcmV0dXJuIGdldEx1bWluYW5jZShjb2xvcik7XG4gIH1cblxuICBnZXRDb250cmFzdENvbG9yKGNvbG9yOiBzdHJpbmcpOiBcImJsYWNrXCIgfCBcIndoaXRlXCIge1xuICAgIHJldHVybiBnZXRDb250cmFzdENvbG9yKGNvbG9yKTtcbiAgfVxufVxuIl19