@flogeez/angular-tiptap-editor 3.1.3 → 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.
- package/CHANGELOG.md +18 -0
- package/README.md +2 -2
- package/esm2022/flogeez-angular-tiptap-editor.mjs +5 -0
- package/esm2022/lib/ate-editor.provider.mjs +38 -0
- package/esm2022/lib/components/bubble-menus/base/ate-base-bubble-menu.mjs +207 -0
- package/esm2022/lib/components/bubble-menus/base/ate-base-sub-bubble-menu.mjs +137 -0
- package/esm2022/lib/components/bubble-menus/color/ate-color-bubble-menu.component.mjs +365 -0
- package/esm2022/lib/components/bubble-menus/image/ate-image-bubble-menu.component.mjs +309 -0
- package/esm2022/lib/components/bubble-menus/link/ate-link-bubble-menu.component.mjs +247 -0
- package/esm2022/lib/components/bubble-menus/table/ate-cell-bubble-menu.component.mjs +126 -0
- package/esm2022/lib/components/bubble-menus/table/ate-table-bubble-menu.component.mjs +271 -0
- package/esm2022/lib/components/bubble-menus/text/ate-bubble-menu.component.mjs +272 -0
- package/esm2022/lib/components/color-picker/ate-color-picker.component.mjs +123 -0
- package/esm2022/lib/components/edit-toggle/ate-edit-toggle.component.mjs +42 -0
- package/esm2022/lib/components/editor/angular-tiptap-editor.component.mjs +1031 -0
- package/esm2022/lib/components/editor/ate-block-controls.component.mjs +256 -0
- package/esm2022/lib/components/slash-commands/ate-slash-commands.component.mjs +328 -0
- package/esm2022/lib/components/toolbar/ate-toolbar.component.mjs +531 -0
- package/esm2022/lib/components/ui/ate-button.component.mjs +91 -0
- package/esm2022/lib/components/ui/ate-separator.component.mjs +11 -0
- package/esm2022/lib/config/ate-editor.config.mjs +133 -0
- package/esm2022/lib/config/ate-global-config.token.mjs +6 -0
- package/esm2022/lib/config/ate-slash-commands.config.mjs +130 -0
- package/esm2022/lib/directives/ate-noop-value-accessor.directive.mjs +40 -0
- package/esm2022/lib/directives/ate-tooltip.directive.mjs +138 -0
- package/esm2022/lib/extensions/ate-block-controls.extension.mjs +156 -0
- package/esm2022/lib/extensions/ate-link-click-behavior.extension.mjs +32 -0
- package/esm2022/lib/extensions/ate-resizable-image.extension.mjs +277 -0
- package/esm2022/lib/extensions/ate-table.extension.mjs +27 -0
- package/esm2022/lib/extensions/ate-tiptap-state.extension.mjs +85 -0
- package/esm2022/lib/extensions/ate-upload-progress.extension.mjs +195 -0
- package/esm2022/lib/extensions/calculators/ate-discovery.calculator.mjs +62 -0
- package/esm2022/lib/extensions/calculators/ate-image.calculator.mjs +8 -0
- package/esm2022/lib/extensions/calculators/ate-marks.calculator.mjs +75 -0
- package/esm2022/lib/extensions/calculators/ate-selection.calculator.mjs +35 -0
- package/esm2022/lib/extensions/calculators/ate-structure.calculator.mjs +34 -0
- package/esm2022/lib/extensions/calculators/ate-table.calculator.mjs +38 -0
- package/esm2022/lib/models/ate-bubble-menu.model.mjs +53 -0
- package/esm2022/lib/models/ate-editor-config.model.mjs +2 -0
- package/esm2022/lib/models/ate-editor-state.model.mjs +90 -0
- package/esm2022/lib/models/ate-image.model.mjs +2 -0
- package/esm2022/lib/models/ate-slash-command.model.mjs +2 -0
- package/esm2022/lib/models/ate-toolbar.model.mjs +35 -0
- package/esm2022/lib/node-view/ate-angular-node-view.mjs +97 -0
- package/esm2022/lib/node-view/ate-injector.registry.mjs +16 -0
- package/esm2022/lib/node-view/ate-node-view.factory.mjs +125 -0
- package/esm2022/lib/node-view/ate-node-view.models.mjs +2 -0
- package/esm2022/lib/node-view/ate-node-view.renderer.mjs +154 -0
- package/esm2022/lib/node-view/ate-register-angular-component.mjs +49 -0
- package/esm2022/lib/services/ate-color-picker.service.mjs +194 -0
- package/esm2022/lib/services/ate-editor-commands.service.mjs +474 -0
- package/esm2022/lib/services/ate-i18n.service.mjs +422 -0
- package/esm2022/lib/services/ate-image.service.mjs +459 -0
- package/esm2022/lib/services/ate-link.service.mjs +99 -0
- package/esm2022/lib/utils/ate-color.utils.mjs +60 -0
- package/esm2022/public-api.mjs +40 -0
- package/fesm2022/flogeez-angular-tiptap-editor.mjs +319 -352
- package/fesm2022/flogeez-angular-tiptap-editor.mjs.map +1 -1
- package/index.d.ts +3 -1734
- package/lib/ate-editor.provider.d.ts +21 -0
- package/lib/components/bubble-menus/base/ate-base-bubble-menu.d.ts +71 -0
- package/lib/components/bubble-menus/base/ate-base-sub-bubble-menu.d.ts +60 -0
- package/lib/components/bubble-menus/color/ate-color-bubble-menu.component.d.ts +77 -0
- package/lib/components/bubble-menus/image/ate-image-bubble-menu.component.d.ts +49 -0
- package/lib/components/bubble-menus/link/ate-link-bubble-menu.component.d.ts +55 -0
- package/lib/components/bubble-menus/table/ate-cell-bubble-menu.component.d.ts +16 -0
- package/lib/components/bubble-menus/table/ate-table-bubble-menu.component.d.ts +25 -0
- package/lib/components/bubble-menus/text/ate-bubble-menu.component.d.ts +53 -0
- package/lib/components/color-picker/ate-color-picker.component.d.ts +54 -0
- package/lib/components/edit-toggle/ate-edit-toggle.component.d.ts +13 -0
- package/lib/components/editor/angular-tiptap-editor.component.d.ts +242 -0
- package/lib/components/editor/ate-block-controls.component.d.ts +44 -0
- package/lib/components/slash-commands/ate-slash-commands.component.d.ts +34 -0
- package/lib/components/toolbar/ate-toolbar.component.d.ts +47 -0
- package/lib/components/ui/ate-button.component.d.ts +25 -0
- package/lib/components/ui/ate-separator.component.d.ts +5 -0
- package/lib/config/ate-editor.config.d.ts +19 -0
- package/lib/config/ate-global-config.token.d.ts +6 -0
- package/lib/config/ate-slash-commands.config.d.ts +41 -0
- package/lib/directives/ate-noop-value-accessor.directive.d.ts +13 -0
- package/lib/directives/ate-tooltip.directive.d.ts +30 -0
- package/lib/extensions/ate-block-controls.extension.d.ts +10 -0
- package/lib/extensions/ate-link-click-behavior.extension.d.ts +2 -0
- package/lib/extensions/ate-resizable-image.extension.d.ts +27 -0
- package/lib/extensions/ate-table.extension.d.ts +2 -0
- package/lib/extensions/ate-tiptap-state.extension.d.ts +7 -0
- package/lib/extensions/ate-upload-progress.extension.d.ts +7 -0
- package/lib/extensions/calculators/ate-discovery.calculator.d.ts +7 -0
- package/lib/extensions/calculators/ate-image.calculator.d.ts +2 -0
- package/lib/extensions/calculators/ate-marks.calculator.d.ts +2 -0
- package/lib/extensions/calculators/ate-selection.calculator.d.ts +2 -0
- package/lib/extensions/calculators/ate-structure.calculator.d.ts +2 -0
- package/lib/extensions/calculators/ate-table.calculator.d.ts +2 -0
- package/lib/models/ate-bubble-menu.model.d.ts +33 -0
- package/lib/models/ate-editor-config.model.d.ts +113 -0
- package/lib/models/ate-editor-state.model.d.ts +109 -0
- package/lib/models/ate-image.model.d.ts +104 -0
- package/lib/models/ate-slash-command.model.d.ts +17 -0
- package/lib/models/ate-toolbar.model.d.ts +18 -0
- package/lib/node-view/ate-angular-node-view.d.ts +115 -0
- package/lib/node-view/ate-injector.registry.d.ts +3 -0
- package/lib/node-view/ate-node-view.factory.d.ts +10 -0
- package/lib/node-view/ate-node-view.models.d.ts +138 -0
- package/lib/node-view/ate-node-view.renderer.d.ts +23 -0
- package/lib/node-view/ate-register-angular-component.d.ts +35 -0
- package/lib/services/ate-color-picker.service.d.ts +65 -0
- package/lib/services/ate-editor-commands.service.d.ts +75 -0
- package/lib/services/ate-i18n.service.d.ts +406 -0
- package/lib/services/ate-image.service.d.ts +82 -0
- package/lib/services/ate-link.service.d.ts +42 -0
- package/lib/utils/ate-color.utils.d.ts +12 -0
- package/package.json +3 -1
- 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
|