@flogeez/angular-tiptap-editor 2.4.0 → 2.4.1
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 +9 -0
- 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 +133 -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 +226 -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 +121 -0
- package/esm2022/lib/components/bubble-menus/table/ate-table-bubble-menu.component.mjs +266 -0
- package/esm2022/lib/components/bubble-menus/text/ate-bubble-menu.component.mjs +294 -0
- package/esm2022/lib/components/color-picker/ate-color-picker.component.mjs +122 -0
- package/esm2022/lib/components/edit-toggle/ate-edit-toggle.component.mjs +42 -0
- package/esm2022/lib/components/editor/angular-tiptap-editor.component.mjs +953 -0
- package/esm2022/lib/components/slash-commands/ate-slash-commands.component.mjs +329 -0
- package/esm2022/lib/components/toolbar/ate-toolbar.component.mjs +531 -0
- package/esm2022/lib/components/ui/ate-button.component.mjs +90 -0
- package/esm2022/lib/components/ui/ate-separator.component.mjs +31 -0
- package/esm2022/lib/config/ate-editor.config.mjs +76 -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/extensions/ate-link-click-behavior.extension.mjs +32 -0
- package/esm2022/lib/extensions/ate-resizable-image.extension.mjs +270 -0
- package/esm2022/lib/extensions/ate-table.extension.mjs +29 -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 +49 -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-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 +193 -0
- package/esm2022/lib/services/ate-editor-commands.service.mjs +465 -0
- package/esm2022/lib/services/ate-i18n.service.mjs +410 -0
- package/esm2022/lib/services/ate-image.service.mjs +368 -0
- package/esm2022/lib/services/ate-link.service.mjs +97 -0
- package/esm2022/lib/utils/ate-color.utils.mjs +60 -0
- package/esm2022/public-api.mjs +93 -0
- package/fesm2022/flogeez-angular-tiptap-editor.mjs +313 -346
- package/fesm2022/flogeez-angular-tiptap-editor.mjs.map +1 -1
- package/index.d.ts +3 -1673
- 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 +52 -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 +12 -0
- package/lib/components/bubble-menus/table/ate-table-bubble-menu.component.d.ts +24 -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 +235 -0
- package/lib/components/slash-commands/ate-slash-commands.component.d.ts +43 -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 +7 -0
- package/lib/config/ate-editor.config.d.ts +7 -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/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 +100 -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-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 +72 -0
- package/lib/services/ate-i18n.service.d.ts +394 -0
- package/lib/services/ate-image.service.d.ts +71 -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 +112 -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,193 @@
|
|
|
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 = event.currentTarget || target?.closest("button") || target;
|
|
51
|
+
}
|
|
52
|
+
this.open(mode, trigger);
|
|
53
|
+
}
|
|
54
|
+
// ============================================
|
|
55
|
+
// Selection Capture (for reliable color application)
|
|
56
|
+
// ============================================
|
|
57
|
+
/**
|
|
58
|
+
* Capture current editor selection.
|
|
59
|
+
*/
|
|
60
|
+
captureSelection(editor) {
|
|
61
|
+
if (!editor) {
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
this.storedSelection = {
|
|
65
|
+
from: editor.state.selection.from,
|
|
66
|
+
to: editor.state.selection.to,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Get last captured selection.
|
|
71
|
+
*/
|
|
72
|
+
getStoredSelection() {
|
|
73
|
+
return this.storedSelection;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Clear captured selection.
|
|
77
|
+
*/
|
|
78
|
+
done() {
|
|
79
|
+
this.storedSelection = null;
|
|
80
|
+
this.menuTrigger.set(null);
|
|
81
|
+
}
|
|
82
|
+
// ============================================
|
|
83
|
+
// Color Application Commands
|
|
84
|
+
// ============================================
|
|
85
|
+
/**
|
|
86
|
+
* Apply text color to selection.
|
|
87
|
+
*/
|
|
88
|
+
applyColor(editor, color, addToHistory = true, focus = true) {
|
|
89
|
+
if (!editor) {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
const stored = this.storedSelection;
|
|
93
|
+
let chain = editor.chain();
|
|
94
|
+
if (focus) {
|
|
95
|
+
chain = chain.focus();
|
|
96
|
+
}
|
|
97
|
+
if (stored && (editor.state.selection.empty || !editor.isFocused)) {
|
|
98
|
+
chain = chain.setTextSelection(stored);
|
|
99
|
+
}
|
|
100
|
+
else if (editor.state.selection.empty && !stored) {
|
|
101
|
+
chain = chain.extendMarkRange("textStyle");
|
|
102
|
+
}
|
|
103
|
+
chain.setColor(color);
|
|
104
|
+
if (addToHistory === false) {
|
|
105
|
+
chain = chain.setMeta("addToHistory", false);
|
|
106
|
+
}
|
|
107
|
+
chain.run();
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Remove text color from selection.
|
|
111
|
+
*/
|
|
112
|
+
unsetColor(editor, focus = true) {
|
|
113
|
+
if (!editor) {
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
const stored = this.storedSelection;
|
|
117
|
+
let chain = editor.chain();
|
|
118
|
+
if (focus) {
|
|
119
|
+
chain = chain.focus();
|
|
120
|
+
}
|
|
121
|
+
if (stored) {
|
|
122
|
+
chain = chain.setTextSelection(stored);
|
|
123
|
+
}
|
|
124
|
+
else if (editor.state.selection.empty) {
|
|
125
|
+
chain = chain.extendMarkRange("textStyle");
|
|
126
|
+
}
|
|
127
|
+
chain.unsetColor();
|
|
128
|
+
chain.run();
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Apply highlight color to selection.
|
|
132
|
+
*/
|
|
133
|
+
applyHighlight(editor, color, addToHistory = true, focus = true) {
|
|
134
|
+
if (!editor) {
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
const stored = this.storedSelection;
|
|
138
|
+
let chain = editor.chain();
|
|
139
|
+
if (focus) {
|
|
140
|
+
chain = chain.focus();
|
|
141
|
+
}
|
|
142
|
+
if (stored && (editor.state.selection.empty || !editor.isFocused)) {
|
|
143
|
+
chain = chain.setTextSelection(stored);
|
|
144
|
+
}
|
|
145
|
+
else if (editor.state.selection.empty && !stored) {
|
|
146
|
+
chain = chain.extendMarkRange("highlight");
|
|
147
|
+
}
|
|
148
|
+
chain.setHighlight({ color });
|
|
149
|
+
if (addToHistory === false) {
|
|
150
|
+
chain = chain.setMeta("addToHistory", false);
|
|
151
|
+
}
|
|
152
|
+
chain.run();
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Remove highlight from selection.
|
|
156
|
+
*/
|
|
157
|
+
unsetHighlight(editor, focus = true) {
|
|
158
|
+
if (!editor) {
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
const stored = this.storedSelection;
|
|
162
|
+
let chain = editor.chain();
|
|
163
|
+
if (focus) {
|
|
164
|
+
chain = chain.focus();
|
|
165
|
+
}
|
|
166
|
+
if (stored) {
|
|
167
|
+
chain = chain.setTextSelection(stored);
|
|
168
|
+
}
|
|
169
|
+
else if (editor.state.selection.empty) {
|
|
170
|
+
chain = chain.extendMarkRange("highlight");
|
|
171
|
+
}
|
|
172
|
+
chain.unsetHighlight();
|
|
173
|
+
chain.run();
|
|
174
|
+
}
|
|
175
|
+
// ============================================
|
|
176
|
+
// Color Utilities (Delegated to color.utils.ts)
|
|
177
|
+
// ============================================
|
|
178
|
+
normalizeColor(color) {
|
|
179
|
+
return normalizeColor(color) || "#000000";
|
|
180
|
+
}
|
|
181
|
+
getLuminance(color) {
|
|
182
|
+
return getLuminance(color);
|
|
183
|
+
}
|
|
184
|
+
getContrastColor(color) {
|
|
185
|
+
return getContrastColor(color);
|
|
186
|
+
}
|
|
187
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteColorPickerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
188
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteColorPickerService }); }
|
|
189
|
+
}
|
|
190
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteColorPickerService, decorators: [{
|
|
191
|
+
type: Injectable
|
|
192
|
+
}] });
|
|
193
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRlLWNvbG9yLXBpY2tlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci10aXB0YXAtZWRpdG9yL3NyYy9saWIvc2VydmljZXMvYXRlLWNvbG9yLXBpY2tlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRW5ELE9BQU8sRUFBRSxjQUFjLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7O0FBVTFGLE1BQU0sT0FBTyxxQkFBcUI7SUFEbEM7UUFFVSxvQkFBZSxHQUFtQyxJQUFJLENBQUM7UUFFL0QsK0NBQStDO1FBQy9DLHdDQUF3QztRQUN4QywrQ0FBK0M7UUFFL0MsMkVBQTJFO1FBQ2xFLGFBQVEsR0FBRyxNQUFNLENBQTBCLElBQUksQ0FBQyxDQUFDO1FBRTFELHVFQUF1RTtRQUM5RCxnQkFBVyxHQUFHLE1BQU0sQ0FBcUIsSUFBSSxDQUFDLENBQUM7UUFFeEQsaUZBQWlGO1FBQ3hFLGtCQUFhLEdBQUcsTUFBTSxDQUFVLEtBQUssQ0FBQyxDQUFDO0tBeU1qRDtJQXZNQywrQ0FBK0M7SUFDL0MseUJBQXlCO0lBQ3pCLCtDQUErQztJQUUvQzs7T0FFRztJQUNILElBQUksQ0FBQyxJQUFzQixFQUFFLE9BQXFCO1FBQ2hELElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLO1FBQ0gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFD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QUFHLEVBQUUsQ0FBQztJQUNkLENBQUM7SUFFRCwrQ0FBK0M7SUFDL0MsZ0RBQWdEO0lBQ2hELCtDQUErQztJQUUvQyxjQUFjLENBQUMsS0FBZ0M7UUFDN0MsT0FBTyxjQUFjLENBQUMsS0FBSyxDQUFDLElBQUksU0FBUyxDQUFDO0lBQzVDLENBQUM7SUFFRCxZQUFZLENBQUMsS0FBYTtRQUN4QixPQUFPLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsS0FBYTtRQUM1QixPQUFPLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLENBQUM7K0dBdE5VLHFCQUFxQjttSEFBckIscUJBQXFCOzs0RkFBckIscUJBQXFCO2tCQURqQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgc2lnbmFsIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB0eXBlIHsgRWRpdG9yIH0gZnJvbSBcIkB0aXB0YXAvY29yZVwiO1xuaW1wb3J0IHsgbm9ybWFsaXplQ29sb3IsIGdldEx1bWluYW5jZSwgZ2V0Q29udHJhc3RDb2xvciB9IGZyb20gXCIuLi91dGlscy9hdGUtY29sb3IudXRpbHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBBdGVDb2xvclBpY2tlclNlbGVjdGlvbiB7XG4gIGZyb206IG51bWJlcjtcbiAgdG86IG51bWJlcjtcbn1cblxuZXhwb3J0IHR5cGUgQXRlQ29sb3JFZGl0TW9kZSA9IFwidGV4dFwiIHwgXCJoaWdobGlnaHRcIjtcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEF0ZUNvbG9yUGlja2VyU2VydmljZSB7XG4gIHByaXZhdGUgc3RvcmVkU2VsZWN0aW9uOiBBdGVDb2xvclBpY2tlclNlbGVjdGlvbiB8IG51bGwgPSBudWxsO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFN0YXRlIFNpZ25hbHMgKG93bmVkIGJ5IHRoaXMgc2VydmljZSlcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogQ3VycmVudCBlZGl0IG1vZGU6IG51bGwgd2hlbiBjbG9zZWQsICd0ZXh0JyBvciAnaGlnaGxpZ2h0JyB3aGVuIG9wZW4gKi9cbiAgcmVhZG9ubHkgZWRpdE1vZGUgPSBzaWduYWw8QXRlQ29sb3JFZGl0TW9kZSB8IG51bGw+KG51bGwpO1xuXG4gIC8qKiBSZWZlcmVuY2UgdG8gdGhlIGVsZW1lbnQgdGhhdCB0cmlnZ2VyZWQgdGhlIG1lbnUgKGZvciBhbmNob3JpbmcpICovXG4gIHJlYWRvbmx5IG1lbnVUcmlnZ2VyID0gc2lnbmFsPEhUTUxFbGVtZW50IHwgbnVsbD4obnVsbCk7XG5cbiAgLyoqIFdoZXRoZXIgdGhlIHVzZXIgaXMgY3VycmVudGx5IGludGVyYWN0aW5nIHdpdGggdGhlIHBpY2tlciBVSSAoZS5nLiB0eXBpbmcpICovXG4gIHJlYWRvbmx5IGlzSW50ZXJhY3RpbmcgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIE1lbnUgTGlmZWN5Y2xlIE1ldGhvZHNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogT3BlbiB0aGUgY29sb3IgcGlja2VyIG1lbnUgaW4gdGhlIHNwZWNpZmllZCBtb2RlLlxuICAgKi9cbiAgb3Blbihtb2RlOiBBdGVDb2xvckVkaXRNb2RlLCB0cmlnZ2VyPzogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICB0aGlzLm1lbnVUcmlnZ2VyLnNldCh0cmlnZ2VyIHx8IG51bGwpO1xuICAgIHRoaXMuZWRpdE1vZGUuc2V0KG1vZGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIHRoZSBjb2xvciBwaWNrZXIgbWVudS5cbiAgICovXG4gIGNsb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuZWRpdE1vZGUuc2V0KG51bGwpO1xuICAgIHRoaXMuaXNJbnRlcmFjdGluZy5zZXQoZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBpbnRlcmFjdGlvbiBzdGF0ZSAocHJldmVudHMgcHJlbWF0dXJlIGNsb3Npbmcgd2hlbiBibHVycmluZyBlZGl0b3IpXG4gICAqL1xuICBzZXRJbnRlcmFjdGluZyh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuaXNJbnRlcmFjdGluZy5zZXQodmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZSBjb2xvciBwaWNrZXIgZnJvbSBVSSAoZXh0cmFjdHMgdHJpZ2dlciBmcm9tIGV2ZW50KS5cbiAgICovXG4gIHRvZ2dsZShlZGl0b3I6IEVkaXRvciwgbW9kZTogQXRlQ29sb3JFZGl0TW9kZSwgZXZlbnQ/OiBFdmVudCk6IHZvaWQge1xuICAgIGlmICghZWRpdG9yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHRyaWdnZXI6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xuICAgIGlmIChldmVudCAmJiB0eXBlb2YgZXZlbnQgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgIHRyaWdnZXIgPSAoZXZlbnQuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudCkgfHwgdGFyZ2V0Py5jbG9zZXN0KFwiYnV0dG9uXCIpIHx8IHRhcmdldDtcbiAgICB9XG5cbiAgICB0aGlzLm9wZW4obW9kZSwgdHJpZ2dlcik7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBTZWxlY3Rpb24gQ2FwdHVyZSAoZm9yIHJlbGlhYmxlIGNvbG9yIGFwcGxpY2F0aW9uKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBDYXB0dXJlIGN1cnJlbnQgZWRpdG9yIHNlbGVjdGlvbi5cbiAgICovXG4gIGNhcHR1cmVTZWxlY3Rpb24oZWRpdG9yOiBFZGl0b3IpOiB2b2lkIHtcbiAgICBpZiAoIWVkaXRvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnN0b3JlZFNlbGVjdGlvbiA9IHtcbiAgICAgIGZyb206IGVkaXRvci5zdGF0ZS5zZWxlY3Rpb24uZnJvbSxcbiAgICAgIHRvOiBlZGl0b3Iuc3RhdGUuc2VsZWN0aW9uLnRvLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0IGxhc3QgY2FwdHVyZWQgc2VsZWN0aW9uLlxuICAgKi9cbiAgZ2V0U3RvcmVkU2VsZWN0aW9uKCk6IEF0ZUNvbG9yUGlja2VyU2VsZWN0aW9uIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmVkU2VsZWN0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGNhcHR1cmVkIHNlbGVjdGlvbi5cbiAgICovXG4gIGRvbmUoKTogdm9pZCB7XG4gICAgdGhpcy5zdG9yZWRTZWxlY3Rpb24gPSBudWxsO1xuICAgIHRoaXMubWVudVRyaWdnZXIuc2V0KG51bGwpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ29sb3IgQXBwbGljYXRpb24gQ29tbWFuZHNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQXBwbHkgdGV4dCBjb2xvciB0byBzZWxlY3Rpb24uXG4gICAqL1xuICBhcHBseUNvbG9yKGVkaXRvcjogRWRpdG9yLCBjb2xvcjogc3RyaW5nLCBhZGRUb0hpc3RvcnkgPSB0cnVlLCBmb2N1cyA9IHRydWUpOiB2b2lkIHtcbiAgICBpZiAoIWVkaXRvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHN0b3JlZCA9IHRoaXMuc3RvcmVkU2VsZWN0aW9uO1xuICAgIGxldCBjaGFpbiA9IGVkaXRvci5jaGFpbigpO1xuICAgIGlmIChmb2N1cykge1xuICAgICAgY2hhaW4gPSBjaGFpbi5mb2N1cygpO1xuICAgIH1cblxuICAgIGlmIChzdG9yZWQgJiYgKGVkaXRvci5zdGF0ZS5zZWxlY3Rpb24uZW1wdHkgfHwgIWVkaXRvci5pc0ZvY3VzZWQpKSB7XG4gICAgICBjaGFpbiA9IGNoYWluLnNldFRleHRTZWxlY3Rpb24oc3RvcmVkKTtcbiAgICB9IGVsc2UgaWYgKGVkaXRvci5zdGF0ZS5zZWxlY3Rpb24uZW1wdHkgJiYgIXN0b3JlZCkge1xuICAgICAgY2hhaW4gPSBjaGFpbi5leHRlbmRNYXJrUmFuZ2UoXCJ0ZXh0U3R5bGVcIik7XG4gICAgfVxuXG4gICAgY2hhaW4uc2V0Q29sb3IoY29sb3IpO1xuXG4gICAgaWYgKGFkZFRvSGlzdG9yeSA9PT0gZmFsc2UpIHtcbiAgICAgIGNoYWluID0gY2hhaW4uc2V0TWV0YShcImFkZFRvSGlzdG9yeVwiLCBmYWxzZSk7XG4gICAgfVxuICAgIGNoYWluLnJ1bigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSB0ZXh0IGNvbG9yIGZyb20gc2VsZWN0aW9uLlxuICAgKi9cbiAgdW5zZXRDb2xvcihlZGl0b3I6IEVkaXRvciwgZm9jdXMgPSB0cnVlKTogdm9pZCB7XG4gICAgaWYgKCFlZGl0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzdG9yZWQgPSB0aGlzLnN0b3JlZFNlbGVjdGlvbjtcbiAgICBsZXQgY2hhaW4gPSBlZGl0b3IuY2hhaW4oKTtcbiAgICBpZiAoZm9jdXMpIHtcbiAgICAgIGNoYWluID0gY2hhaW4uZm9jdXMoKTtcbiAgICB9XG5cbiAgICBpZiAoc3RvcmVkKSB7XG4gICAgICBjaGFpbiA9IGNoYWluLnNldFRleHRTZWxlY3Rpb24oc3RvcmVkKTtcbiAgICB9IGVsc2UgaWYgKGVkaXRvci5zdGF0ZS5zZWxlY3Rpb24uZW1wdHkpIHtcbiAgICAgIGNoYWluID0gY2hhaW4uZXh0ZW5kTWFya1JhbmdlKFwidGV4dFN0eWxlXCIpO1xuICAgIH1cblxuICAgIGNoYWluLnVuc2V0Q29sb3IoKTtcbiAgICBjaGFpbi5ydW4oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSBoaWdobGlnaHQgY29sb3IgdG8gc2VsZWN0aW9uLlxuICAgKi9cbiAgYXBwbHlIaWdobGlnaHQoZWRpdG9yOiBFZGl0b3IsIGNvbG9yOiBzdHJpbmcsIGFkZFRvSGlzdG9yeSA9IHRydWUsIGZvY3VzID0gdHJ1ZSk6IHZvaWQge1xuICAgIGlmICghZWRpdG9yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3RvcmVkID0gdGhpcy5zdG9yZWRTZWxlY3Rpb247XG4gICAgbGV0IGNoYWluID0gZWRpdG9yLmNoYWluKCk7XG4gICAgaWYgKGZvY3VzKSB7XG4gICAgICBjaGFpbiA9IGNoYWluLmZvY3VzKCk7XG4gICAgfVxuXG4gICAgaWYgKHN0b3JlZCAmJiAoZWRpdG9yLnN0YXRlLnNlbGVjdGlvbi5lbXB0eSB8fCAhZWRpdG9yLmlzRm9jdXNlZCkpIHtcbiAgICAgIGNoYWluID0gY2hhaW4uc2V0VGV4dFNlbGVjdGlvbihzdG9yZWQpO1xuICAgIH0gZWxzZSBpZiAoZWRpdG9yLnN0YXRlLnNlbGVjdGlvbi5lbXB0eSAmJiAhc3RvcmVkKSB7XG4gICAgICBjaGFpbiA9IGNoYWluLmV4dGVuZE1hcmtSYW5nZShcImhpZ2hsaWdodFwiKTtcbiAgICB9XG5cbiAgICBjaGFpbi5zZXRIaWdobGlnaHQoeyBjb2xvciB9KTtcblxuICAgIGlmIChhZGRUb0hpc3RvcnkgPT09IGZhbHNlKSB7XG4gICAgICBjaGFpbiA9IGNoYWluLnNldE1ldGEoXCJhZGRUb0hpc3RvcnlcIiwgZmFsc2UpO1xuICAgIH1cbiAgICBjaGFpbi5ydW4oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgaGlnaGxpZ2h0IGZyb20gc2VsZWN0aW9uLlxuICAgKi9cbiAgdW5zZXRIaWdobGlnaHQoZWRpdG9yOiBFZGl0b3IsIGZvY3VzID0gdHJ1ZSk6IHZvaWQge1xuICAgIGlmICghZWRpdG9yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3RvcmVkID0gdGhpcy5zdG9yZWRTZWxlY3Rpb247XG4gICAgbGV0IGNoYWluID0gZWRpdG9yLmNoYWluKCk7XG4gICAgaWYgKGZvY3VzKSB7XG4gICAgICBjaGFpbiA9IGNoYWluLmZvY3VzKCk7XG4gICAgfVxuXG4gICAgaWYgKHN0b3JlZCkge1xuICAgICAgY2hhaW4gPSBjaGFpbi5zZXRUZXh0U2VsZWN0aW9uKHN0b3JlZCk7XG4gICAgfSBlbHNlIGlmIChlZGl0b3Iuc3RhdGUuc2VsZWN0aW9uLmVtcHR5KSB7XG4gICAgICBjaGFpbiA9IGNoYWluLmV4dGVuZE1hcmtSYW5nZShcImhpZ2hsaWdodFwiKTtcbiAgICB9XG5cbiAgICBjaGFpbi51bnNldEhpZ2hsaWdodCgpO1xuICAgIGNoYWluLnJ1bigpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ29sb3IgVXRpbGl0aWVzIChEZWxlZ2F0ZWQgdG8gY29sb3IudXRpbHMudHMpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgbm9ybWFsaXplQ29sb3IoY29sb3I6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICAgIHJldHVybiBub3JtYWxpemVDb2xvcihjb2xvcikgfHwgXCIjMDAwMDAwXCI7XG4gIH1cblxuICBnZXRMdW1pbmFuY2UoY29sb3I6IHN0cmluZyk6IG51bWJlciB7XG4gICAgcmV0dXJuIGdldEx1bWluYW5jZShjb2xvcik7XG4gIH1cblxuICBnZXRDb250cmFzdENvbG9yKGNvbG9yOiBzdHJpbmcpOiBcImJsYWNrXCIgfCBcIndoaXRlXCIge1xuICAgIHJldHVybiBnZXRDb250cmFzdENvbG9yKGNvbG9yKTtcbiAgfVxufVxuIl19
|