@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
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,15 @@ All notable changes to `@flogeez/angular-tiptap-editor` will be documented in th
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html), with the exception that the major version is specifically aligned with the major version of [Tiptap](https://tiptap.dev).
|
|
7
7
|
|
|
8
|
+
## [2.4.1] - 2026-05-19
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
|
|
12
|
+
- **Angular 18 Compatibility**: Reverted library APIs from Angular 19+ back to Angular 18 standards:
|
|
13
|
+
- Replaced `provideEnvironmentInitializer()` with `APP_INITIALIZER` in `provideAteEditor()` to prevent crashes on Angular 18 environments.
|
|
14
|
+
- Added `{ allowSignalWrites: true }` to all `effect()` blocks to fix signal write errors at runtime.
|
|
15
|
+
- Fixed TypeScript compiler and builder errors under TypeScript 5.4.
|
|
16
|
+
|
|
8
17
|
## [2.4.0] - 2026-01-29
|
|
9
18
|
|
|
10
19
|
### Added
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated bundle index. Do not edit.
|
|
3
|
+
*/
|
|
4
|
+
export * from './public-api';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxvZ2Vlei1hbmd1bGFyLXRpcHRhcC1lZGl0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLXRpcHRhcC1lZGl0b3Ivc3JjL2Zsb2dlZXotYW5ndWxhci10aXB0YXAtZWRpdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxjQUFjLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vcHVibGljLWFwaSc7XG4iXX0=
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { makeEnvironmentProviders, APP_INITIALIZER, Injector, } from "@angular/core";
|
|
2
|
+
import { setGlobalInjector } from "./node-view/ate-injector.registry";
|
|
3
|
+
import { ATE_GLOBAL_CONFIG } from "./config/ate-global-config.token";
|
|
4
|
+
/**
|
|
5
|
+
* Provides the necessary configuration and initialization for the Angular TipTap Editor.
|
|
6
|
+
* This should be called in your app.config.ts (for standalone) or main.ts.
|
|
7
|
+
*
|
|
8
|
+
* This provider is essential for 'Angular Nodes' to work correctly, as it captures the
|
|
9
|
+
* root Injector required to instantiate custom Angular components within the editor.
|
|
10
|
+
* @example
|
|
11
|
+
* ```ts
|
|
12
|
+
* bootstrapApplication(AppComponent, {
|
|
13
|
+
* providers: [
|
|
14
|
+
* provideAteEditor({
|
|
15
|
+
* theme: 'dark',
|
|
16
|
+
* mode: 'seamless'
|
|
17
|
+
* })
|
|
18
|
+
* ]
|
|
19
|
+
* });
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export function provideAteEditor(config) {
|
|
23
|
+
return makeEnvironmentProviders([
|
|
24
|
+
{
|
|
25
|
+
provide: ATE_GLOBAL_CONFIG,
|
|
26
|
+
useValue: config || {},
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
provide: APP_INITIALIZER,
|
|
30
|
+
useFactory: (injector) => () => {
|
|
31
|
+
setGlobalInjector(injector);
|
|
32
|
+
},
|
|
33
|
+
deps: [Injector],
|
|
34
|
+
multi: true,
|
|
35
|
+
},
|
|
36
|
+
]);
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRlLWVkaXRvci5wcm92aWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItdGlwdGFwLWVkaXRvci9zcmMvbGliL2F0ZS1lZGl0b3IucHJvdmlkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLHdCQUF3QixFQUN4QixlQUFlLEVBQ2YsUUFBUSxHQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRXRFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBR3JFOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxNQUF3QjtJQUN2RCxPQUFPLHdCQUF3QixDQUFDO1FBQzlCO1lBQ0UsT0FBTyxFQUFFLGlCQUFpQjtZQUMxQixRQUFRLEVBQUUsTUFBTSxJQUFJLEVBQUU7U0FDdkI7UUFDRDtZQUNFLE9BQU8sRUFBRSxlQUFlO1lBQ3hCLFVBQVUsRUFBRSxDQUFDLFFBQWtCLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRTtnQkFDdkMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDOUIsQ0FBQztZQUNELElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUNoQixLQUFLLEVBQUUsSUFBSTtTQUNaO0tBQ0YsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEVudmlyb25tZW50UHJvdmlkZXJzLFxuICBtYWtlRW52aXJvbm1lbnRQcm92aWRlcnMsXG4gIEFQUF9JTklUSUFMSVpFUixcbiAgSW5qZWN0b3IsXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBzZXRHbG9iYWxJbmplY3RvciB9IGZyb20gXCIuL25vZGUtdmlldy9hdGUtaW5qZWN0b3IucmVnaXN0cnlcIjtcblxuaW1wb3J0IHsgQVRFX0dMT0JBTF9DT05GSUcgfSBmcm9tIFwiLi9jb25maWcvYXRlLWdsb2JhbC1jb25maWcudG9rZW5cIjtcbmltcG9ydCB7IEF0ZUVkaXRvckNvbmZpZyB9IGZyb20gXCIuL21vZGVscy9hdGUtZWRpdG9yLWNvbmZpZy5tb2RlbFwiO1xuXG4vKipcbiAqIFByb3ZpZGVzIHRoZSBuZWNlc3NhcnkgY29uZmlndXJhdGlvbiBhbmQgaW5pdGlhbGl6YXRpb24gZm9yIHRoZSBBbmd1bGFyIFRpcFRhcCBFZGl0b3IuXG4gKiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgaW4geW91ciBhcHAuY29uZmlnLnRzIChmb3Igc3RhbmRhbG9uZSkgb3IgbWFpbi50cy5cbiAqXG4gKiBUaGlzIHByb3ZpZGVyIGlzIGVzc2VudGlhbCBmb3IgJ0FuZ3VsYXIgTm9kZXMnIHRvIHdvcmsgY29ycmVjdGx5LCBhcyBpdCBjYXB0dXJlcyB0aGVcbiAqIHJvb3QgSW5qZWN0b3IgcmVxdWlyZWQgdG8gaW5zdGFudGlhdGUgY3VzdG9tIEFuZ3VsYXIgY29tcG9uZW50cyB3aXRoaW4gdGhlIGVkaXRvci5cbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogYm9vdHN0cmFwQXBwbGljYXRpb24oQXBwQ29tcG9uZW50LCB7XG4gKiAgIHByb3ZpZGVyczogW1xuICogICAgIHByb3ZpZGVBdGVFZGl0b3Ioe1xuICogICAgICAgdGhlbWU6ICdkYXJrJyxcbiAqICAgICAgIG1vZGU6ICdzZWFtbGVzcydcbiAqICAgICB9KVxuICogICBdXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvdmlkZUF0ZUVkaXRvcihjb25maWc/OiBBdGVFZGl0b3JDb25maWcpOiBFbnZpcm9ubWVudFByb3ZpZGVycyB7XG4gIHJldHVybiBtYWtlRW52aXJvbm1lbnRQcm92aWRlcnMoW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IEFURV9HTE9CQUxfQ09ORklHLFxuICAgICAgdXNlVmFsdWU6IGNvbmZpZyB8fCB7fSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IEFQUF9JTklUSUFMSVpFUixcbiAgICAgIHVzZUZhY3Rvcnk6IChpbmplY3RvcjogSW5qZWN0b3IpID0+ICgpID0+IHtcbiAgICAgICAgc2V0R2xvYmFsSW5qZWN0b3IoaW5qZWN0b3IpO1xuICAgICAgfSxcbiAgICAgIGRlcHM6IFtJbmplY3Rvcl0sXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9LFxuICBdKTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import { Directive, input, viewChild, inject, effect, } from "@angular/core";
|
|
2
|
+
import tippy, { sticky } from "tippy.js";
|
|
3
|
+
import { AteEditorCommandsService } from "../../../services/ate-editor-commands.service";
|
|
4
|
+
import { AteI18nService } from "../../../services/ate-i18n.service";
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
/**
|
|
7
|
+
* Base abstract class for all Bubble Menus (Text, Image, Table, Cell).
|
|
8
|
+
* Handles common logic for Tippy.js initialization, positioning, and visibility.
|
|
9
|
+
*/
|
|
10
|
+
export class AteBaseBubbleMenu {
|
|
11
|
+
constructor() {
|
|
12
|
+
this.i18nService = inject(AteI18nService);
|
|
13
|
+
this.editorCommands = inject(AteEditorCommandsService);
|
|
14
|
+
// Core Inputs
|
|
15
|
+
this.editor = input.required();
|
|
16
|
+
// Required viewChild for the menu container
|
|
17
|
+
this.menuRef = viewChild.required("menuRef");
|
|
18
|
+
// Internal State
|
|
19
|
+
this.tippyInstance = null;
|
|
20
|
+
this.updateTimeout = null;
|
|
21
|
+
// Toolbar interaction state (from centralized service)
|
|
22
|
+
this.isToolbarInteracting = this.editorCommands.isToolbarInteracting;
|
|
23
|
+
// Reactive state alias for templates
|
|
24
|
+
this.state = this.editorCommands.editorState;
|
|
25
|
+
/**
|
|
26
|
+
* Core logic to decide whether to show or hide the menu.
|
|
27
|
+
*/
|
|
28
|
+
this.updateMenu = () => {
|
|
29
|
+
if (this.updateTimeout) {
|
|
30
|
+
clearTimeout(this.updateTimeout);
|
|
31
|
+
}
|
|
32
|
+
this.updateTimeout = window.setTimeout(() => {
|
|
33
|
+
const ed = this.editor();
|
|
34
|
+
if (!ed) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
// Hide when interacting with the main toolbar
|
|
38
|
+
if (this.isToolbarInteracting()) {
|
|
39
|
+
this.hideTippy();
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
if (this.shouldShow()) {
|
|
43
|
+
this.showTippy();
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
this.hideTippy();
|
|
47
|
+
}
|
|
48
|
+
}, 10);
|
|
49
|
+
};
|
|
50
|
+
// Effect to reactively update the menu when editor state
|
|
51
|
+
// or toolbar interaction changes.
|
|
52
|
+
effect(() => {
|
|
53
|
+
this.state();
|
|
54
|
+
this.isToolbarInteracting();
|
|
55
|
+
// Also react to link/color edit modes to hide when sub-menus activate
|
|
56
|
+
this.editorCommands.linkEditMode();
|
|
57
|
+
this.editorCommands.colorEditMode();
|
|
58
|
+
this.updateMenu();
|
|
59
|
+
}, { allowSignalWrites: true });
|
|
60
|
+
}
|
|
61
|
+
ngOnInit() {
|
|
62
|
+
this.initTippy();
|
|
63
|
+
}
|
|
64
|
+
ngOnDestroy() {
|
|
65
|
+
if (this.updateTimeout) {
|
|
66
|
+
clearTimeout(this.updateTimeout);
|
|
67
|
+
}
|
|
68
|
+
if (this.tippyInstance) {
|
|
69
|
+
this.tippyInstance.destroy();
|
|
70
|
+
this.tippyInstance = null;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Initializes the Tippy instance.
|
|
75
|
+
* Can be overridden for specific Tippy configurations.
|
|
76
|
+
*/
|
|
77
|
+
initTippy() {
|
|
78
|
+
if (!this.menuRef()?.nativeElement) {
|
|
79
|
+
// Re-try if the view child is not yet available
|
|
80
|
+
setTimeout(() => this.initTippy(), 50);
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
const ed = this.editor();
|
|
84
|
+
if (this.tippyInstance) {
|
|
85
|
+
this.tippyInstance.destroy();
|
|
86
|
+
}
|
|
87
|
+
this.tippyInstance = tippy(document.body, {
|
|
88
|
+
content: this.menuRef().nativeElement,
|
|
89
|
+
trigger: "manual",
|
|
90
|
+
placement: "top-start",
|
|
91
|
+
appendTo: () => (ed ? ed.options.element : document.body),
|
|
92
|
+
interactive: true,
|
|
93
|
+
hideOnClick: false,
|
|
94
|
+
arrow: false,
|
|
95
|
+
offset: [0, 8],
|
|
96
|
+
plugins: [sticky],
|
|
97
|
+
sticky: false,
|
|
98
|
+
getReferenceClientRect: () => this.getSelectionRect(),
|
|
99
|
+
popperOptions: {
|
|
100
|
+
modifiers: [
|
|
101
|
+
{
|
|
102
|
+
name: "preventOverflow",
|
|
103
|
+
options: {
|
|
104
|
+
boundary: this.editor().options.element,
|
|
105
|
+
padding: 8,
|
|
106
|
+
},
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
name: "flip",
|
|
110
|
+
options: {
|
|
111
|
+
fallbackPlacements: ["bottom-start", "top-end", "bottom-end"],
|
|
112
|
+
},
|
|
113
|
+
},
|
|
114
|
+
],
|
|
115
|
+
},
|
|
116
|
+
onShow: instance => this.onTippyShow(instance),
|
|
117
|
+
onHide: instance => this.onTippyHide(instance),
|
|
118
|
+
});
|
|
119
|
+
this.updateMenu();
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Helper to show the Tippy instance with updated positioning.
|
|
123
|
+
*/
|
|
124
|
+
showTippy() {
|
|
125
|
+
if (!this.tippyInstance) {
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
// Update position before showing
|
|
129
|
+
this.tippyInstance.setProps({
|
|
130
|
+
getReferenceClientRect: () => this.getSelectionRect(),
|
|
131
|
+
sticky: "reference",
|
|
132
|
+
});
|
|
133
|
+
this.tippyInstance.show();
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Helper to hide the Tippy instance.
|
|
137
|
+
*/
|
|
138
|
+
hideTippy() {
|
|
139
|
+
if (this.tippyInstance) {
|
|
140
|
+
this.tippyInstance.setProps({ sticky: false });
|
|
141
|
+
this.tippyInstance.hide();
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Common command handler for buttons in the menu.
|
|
146
|
+
*/
|
|
147
|
+
onCommand(command, event) {
|
|
148
|
+
if (event) {
|
|
149
|
+
event.preventDefault();
|
|
150
|
+
event.stopPropagation();
|
|
151
|
+
}
|
|
152
|
+
const ed = this.editor();
|
|
153
|
+
if (ed) {
|
|
154
|
+
this.executeCommand(ed, command);
|
|
155
|
+
this.updateMenu();
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Shared helper to get the bounding rect of the current selection.
|
|
160
|
+
* Uses a combination of native selection and ProseMirror coordinates.
|
|
161
|
+
*/
|
|
162
|
+
getRectForSelection(ed) {
|
|
163
|
+
if (!ed) {
|
|
164
|
+
return new DOMRect(0, 0, 0, 0);
|
|
165
|
+
}
|
|
166
|
+
const { from, to, empty } = ed.state.selection;
|
|
167
|
+
if (empty) {
|
|
168
|
+
return new DOMRect(-9999, -9999, 0, 0);
|
|
169
|
+
}
|
|
170
|
+
// 1. Try native selection for multi-line accuracy
|
|
171
|
+
const selection = window.getSelection();
|
|
172
|
+
if (selection && selection.rangeCount > 0) {
|
|
173
|
+
const range = selection.getRangeAt(0);
|
|
174
|
+
const rect = range.getBoundingClientRect();
|
|
175
|
+
// Ensure the rect is valid and belongs to the editor
|
|
176
|
+
if (rect.width > 0 && rect.height > 0) {
|
|
177
|
+
return rect;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
// 2. Fallback to Tiptap coordinates for precision (single line / edge cases)
|
|
181
|
+
const start = ed.view.coordsAtPos(from);
|
|
182
|
+
const end = ed.view.coordsAtPos(to);
|
|
183
|
+
const top = Math.min(start.top, end.top);
|
|
184
|
+
const bottom = Math.max(start.bottom, end.bottom);
|
|
185
|
+
const left = Math.min(start.left, end.left);
|
|
186
|
+
const right = Math.max(start.right, end.right);
|
|
187
|
+
return new DOMRect(left, top, right - left, bottom - top);
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Optional hook called when Tippy is about to be shown.
|
|
191
|
+
*/
|
|
192
|
+
onTippyShow(_instance) {
|
|
193
|
+
/* empty */
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Optional hook called when Tippy is about to be hidden.
|
|
197
|
+
*/
|
|
198
|
+
onTippyHide(_instance) {
|
|
199
|
+
/* empty */
|
|
200
|
+
}
|
|
201
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteBaseBubbleMenu, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
202
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "18.2.14", type: AteBaseBubbleMenu, inputs: { editor: { classPropertyName: "editor", publicName: "editor", isSignal: true, isRequired: true, transformFunction: null } }, viewQueries: [{ propertyName: "menuRef", first: true, predicate: ["menuRef"], descendants: true, isSignal: true }], ngImport: i0 }); }
|
|
203
|
+
}
|
|
204
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteBaseBubbleMenu, decorators: [{
|
|
205
|
+
type: Directive
|
|
206
|
+
}], ctorParameters: () => [] });
|
|
207
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRlLWJhc2UtYnViYmxlLW1lbnUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLXRpcHRhcC1lZGl0b3Ivc3JjL2xpYi9jb21wb25lbnRzL2J1YmJsZS1tZW51cy9iYXNlL2F0ZS1iYXNlLWJ1YmJsZS1tZW51LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLFNBQVMsRUFJVCxNQUFNLEVBQ04sTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sS0FBSyxFQUFFLEVBQTZCLE1BQU0sRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUVwRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUN6RixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7O0FBRXBFOzs7R0FHRztBQUVILE1BQU0sT0FBZ0IsaUJBQWlCO0lBb0JyQztRQW5CbUIsZ0JBQVcsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDckMsbUJBQWMsR0FBRyxNQUFNLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUVyRSxjQUFjO1FBQ2QsV0FBTSxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQVUsQ0FBQztRQUVsQyw0Q0FBNEM7UUFDNUMsWUFBTyxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQTZCLFNBQVMsQ0FBQyxDQUFDO1FBRXBFLGlCQUFpQjtRQUNQLGtCQUFhLEdBQXlCLElBQUksQ0FBQztRQUMzQyxrQkFBYSxHQUFrQixJQUFJLENBQUM7UUFFOUMsdURBQXVEO1FBQ3BDLHlCQUFvQixHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsb0JBQW9CLENBQUM7UUFFbkYscUNBQXFDO1FBQzVCLFVBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQztRQWtGakQ7O1dBRUc7UUFDSCxlQUFVLEdBQUcsR0FB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QUFDO0lBRUQ7O09BRUc7SUFDTyxXQUFXLENBQUMsU0FBd0I7UUFDNUMsV0FBVztJQUNiLENBQUM7K0dBNU9tQixpQkFBaUI7bUdBQWpCLGlCQUFpQjs7NEZBQWpCLGlCQUFpQjtrQkFEdEMsU0FBUyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIERpcmVjdGl2ZSxcbiAgaW5wdXQsXG4gIHZpZXdDaGlsZCxcbiAgRWxlbWVudFJlZixcbiAgT25Jbml0LFxuICBPbkRlc3Ryb3ksXG4gIGluamVjdCxcbiAgZWZmZWN0LFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHRpcHB5LCB7IEluc3RhbmNlIGFzIFRpcHB5SW5zdGFuY2UsIHN0aWNreSB9IGZyb20gXCJ0aXBweS5qc1wiO1xuaW1wb3J0IHsgRWRpdG9yIH0gZnJvbSBcIkB0aXB0YXAvY29yZVwiO1xuaW1wb3J0IHsgQXRlRWRpdG9yQ29tbWFuZHNTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uLy4uL3NlcnZpY2VzL2F0ZS1lZGl0b3ItY29tbWFuZHMuc2VydmljZVwiO1xuaW1wb3J0IHsgQXRlSTE4blNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vLi4vc2VydmljZXMvYXRlLWkxOG4uc2VydmljZVwiO1xuXG4vKipcbiAqIEJhc2UgYWJzdHJhY3QgY2xhc3MgZm9yIGFsbCBCdWJibGUgTWVudXMgKFRleHQsIEltYWdlLCBUYWJsZSwgQ2VsbCkuXG4gKiBIYW5kbGVzIGNvbW1vbiBsb2dpYyBmb3IgVGlwcHkuanMgaW5pdGlhbGl6YXRpb24sIHBvc2l0aW9uaW5nLCBhbmQgdmlzaWJpbGl0eS5cbiAqL1xuQERpcmVjdGl2ZSgpXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQXRlQmFzZUJ1YmJsZU1lbnUgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHByb3RlY3RlZCByZWFkb25seSBpMThuU2VydmljZSA9IGluamVjdChBdGVJMThuU2VydmljZSk7XG4gIHByb3RlY3RlZCByZWFkb25seSBlZGl0b3JDb21tYW5kcyA9IGluamVjdChBdGVFZGl0b3JDb21tYW5kc1NlcnZpY2UpO1xuXG4gIC8vIENvcmUgSW5wdXRzXG4gIGVkaXRvciA9IGlucHV0LnJlcXVpcmVkPEVkaXRvcj4oKTtcblxuICAvLyBSZXF1aXJlZCB2aWV3Q2hpbGQgZm9yIHRoZSBtZW51IGNvbnRhaW5lclxuICBtZW51UmVmID0gdmlld0NoaWxkLnJlcXVpcmVkPEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+PihcIm1lbnVSZWZcIik7XG5cbiAgLy8gSW50ZXJuYWwgU3RhdGVcbiAgcHJvdGVjdGVkIHRpcHB5SW5zdGFuY2U6IFRpcHB5SW5zdGFuY2UgfCBudWxsID0gbnVsbDtcbiAgcHJvdGVjdGVkIHVwZGF0ZVRpbWVvdXQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gIC8vIFRvb2xiYXIgaW50ZXJhY3Rpb24gc3RhdGUgKGZyb20gY2VudHJhbGl6ZWQgc2VydmljZSlcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzVG9vbGJhckludGVyYWN0aW5nID0gdGhpcy5lZGl0b3JDb21tYW5kcy5pc1Rvb2xiYXJJbnRlcmFjdGluZztcblxuICAvLyBSZWFjdGl2ZSBzdGF0ZSBhbGlhcyBmb3IgdGVtcGxhdGVzXG4gIHJlYWRvbmx5IHN0YXRlID0gdGhpcy5lZGl0b3JDb21tYW5kcy5lZGl0b3JTdGF0ZTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAvLyBFZmZlY3QgdG8gcmVhY3RpdmVseSB1cGRhdGUgdGhlIG1lbnUgd2hlbiBlZGl0b3Igc3RhdGVcbiAgICAvLyBvciB0b29sYmFyIGludGVyYWN0aW9uIGNoYW5nZXMuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIHRoaXMuc3RhdGUoKTtcbiAgICAgIHRoaXMuaXNUb29sYmFySW50ZXJhY3RpbmcoKTtcbiAgICAgIC8vIEFsc28gcmVhY3QgdG8gbGluay9jb2xvciBlZGl0IG1vZGVzIHRvIGhpZGUgd2hlbiBzdWItbWVudXMgYWN0aXZhdGVcbiAgICAgIHRoaXMuZWRpdG9yQ29tbWFuZHMubGlua0VkaXRNb2RlKCk7XG4gICAgICB0aGlzLmVkaXRvckNvbW1hbmRzLmNvbG9yRWRpdE1vZGUoKTtcblxuICAgICAgdGhpcy51cGRhdGVNZW51KCk7XG4gICAgfSwgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9KTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuaW5pdFRpcHB5KCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy51cGRhdGVUaW1lb3V0KSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy51cGRhdGVUaW1lb3V0KTtcbiAgICB9XG4gICAgaWYgKHRoaXMudGlwcHlJbnN0YW5jZSkge1xuICAgICAgdGhpcy50aXBweUluc3RhbmNlLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMudGlwcHlJbnN0YW5jZSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSBUaXBweSBpbnN0YW5jZS5cbiAgICogQ2FuIGJlIG92ZXJyaWRkZW4gZm9yIHNwZWNpZmljIFRpcHB5IGNvbmZpZ3VyYXRpb25zLlxuICAgKi9cbiAgcHJvdGVjdGVkIGluaXRUaXBweSgpIHtcbiAgICBpZiAoIXRoaXMubWVudVJlZigpPy5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAvLyBSZS10cnkgaWYgdGhlIHZpZXcgY2hpbGQgaXMgbm90IHlldCBhdmFpbGFibGVcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5pbml0VGlwcHkoKSwgNTApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVkID0gdGhpcy5lZGl0b3IoKTtcbiAgICBpZiAodGhpcy50aXBweUluc3RhbmNlKSB7XG4gICAgICB0aGlzLnRpcHB5SW5zdGFuY2UuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIHRoaXMudGlwcHlJbnN0YW5jZSA9IHRpcHB5KGRvY3VtZW50LmJvZHksIHtcbiAgICAgIGNvbnRlbnQ6IHRoaXMubWVudVJlZigpLm5hdGl2ZUVsZW1lbnQsXG4gICAgICB0cmlnZ2VyOiBcIm1hbnVhbFwiLFxuICAgICAgcGxhY2VtZW50OiBcInRvcC1zdGFydFwiLFxuICAgICAgYXBwZW5kVG86ICgpID0+IChlZCA/IChlZC5vcHRpb25zLmVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpIDogZG9jdW1lbnQuYm9keSksXG4gICAgICBpbnRlcmFjdGl2ZTogdHJ1ZSxcbiAgICAgIGhpZGVPbkNsaWNrOiBmYWxzZSxcbiAgICAgIGFycm93OiBmYWxzZSxcbiAgICAgIG9mZnNldDogWzAsIDhdLFxuICAgICAgcGx1Z2luczogW3N0aWNreV0sXG4gICAgICBzdGlja3k6IGZhbHNlLFxuICAgICAgZ2V0UmVmZXJlbmNlQ2xpZW50UmVjdDogKCkgPT4gdGhpcy5nZXRTZWxlY3Rpb25SZWN0KCksXG4gICAgICBwb3BwZXJPcHRpb25zOiB7XG4gICAgICAgIG1vZGlmaWVyczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IFwicHJldmVudE92ZXJmbG93XCIsXG4gICAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICAgIGJvdW5kYXJ5OiB0aGlzLmVkaXRvcigpLm9wdGlvbnMuZWxlbWVudCxcbiAgICAgICAgICAgICAgcGFkZGluZzogOCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBcImZsaXBcIixcbiAgICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgZmFsbGJhY2tQbGFjZW1lbnRzOiBbXCJib3R0b20tc3RhcnRcIiwgXCJ0b3AtZW5kXCIsIFwiYm90dG9tLWVuZFwiXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgICBvblNob3c6IGluc3RhbmNlID0+IHRoaXMub25UaXBweVNob3coaW5zdGFuY2UpLFxuICAgICAgb25IaWRlOiBpbnN0YW5jZSA9PiB0aGlzLm9uVGlwcHlIaWRlKGluc3RhbmNlKSxcbiAgICB9KTtcblxuICAgIHRoaXMudXBkYXRlTWVudSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvcmUgbG9naWMgdG8gZGVjaWRlIHdoZXRoZXIgdG8gc2hvdyBvciBoaWRlIHRoZSBtZW51LlxuICAgKi9cbiAgdXBkYXRlTWVudSA9ICgpID0+IHtcbiAgICBpZiAodGhpcy51cGRhdGVUaW1lb3V0KSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy51cGRhdGVUaW1lb3V0KTtcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZVRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCBlZCA9IHRoaXMuZWRpdG9yKCk7XG4gICAgICBpZiAoIWVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gSGlkZSB3aGVuIGludGVyYWN0aW5nIHdpdGggdGhlIG1haW4gdG9vbGJhclxuICAgICAgaWYgKHRoaXMuaXNUb29sYmFySW50ZXJhY3RpbmcoKSkge1xuICAgICAgICB0aGlzLmhpZGVUaXBweSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnNob3VsZFNob3coKSkge1xuICAgICAgICB0aGlzLnNob3dUaXBweSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5oaWRlVGlwcHkoKTtcbiAgICAgIH1cbiAgICB9LCAxMCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEhlbHBlciB0byBzaG93IHRoZSBUaXBweSBpbnN0YW5jZSB3aXRoIHVwZGF0ZWQgcG9zaXRpb25pbmcuXG4gICAqL1xuICBzaG93VGlwcHkoKSB7XG4gICAgaWYgKCF0aGlzLnRpcHB5SW5zdGFuY2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgcG9zaXRpb24gYmVmb3JlIHNob3dpbmdcbiAgICB0aGlzLnRpcHB5SW5zdGFuY2Uuc2V0UHJvcHMoe1xuICAgICAgZ2V0UmVmZXJlbmNlQ2xpZW50UmVjdDogKCkgPT4gdGhpcy5nZXRTZWxlY3Rpb25SZWN0KCksXG4gICAgICBzdGlja3k6IFwicmVmZXJlbmNlXCIsXG4gICAgfSk7XG4gICAgdGhpcy50aXBweUluc3RhbmNlLnNob3coKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgdG8gaGlkZSB0aGUgVGlwcHkgaW5zdGFuY2UuXG4gICAqL1xuICBoaWRlVGlwcHkoKSB7XG4gICAgaWYgKHRoaXMudGlwcHlJbnN0YW5jZSkge1xuICAgICAgdGhpcy50aXBweUluc3RhbmNlLnNldFByb3BzKHsgc3RpY2t5OiBmYWxzZSB9KTtcbiAgICAgIHRoaXMudGlwcHlJbnN0YW5jZS5oaWRlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbW1vbiBjb21tYW5kIGhhbmRsZXIgZm9yIGJ1dHRvbnMgaW4gdGhlIG1lbnUuXG4gICAqL1xuICBvbkNvbW1hbmQoY29tbWFuZDogc3RyaW5nLCBldmVudD86IEV2ZW50KSB7XG4gICAgaWYgKGV2ZW50KSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuICAgIGNvbnN0IGVkID0gdGhpcy5lZGl0b3IoKTtcbiAgICBpZiAoZWQpIHtcbiAgICAgIHRoaXMuZXhlY3V0ZUNvbW1hbmQoZWQsIGNvbW1hbmQpO1xuICAgICAgdGhpcy51cGRhdGVNZW51KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNoYXJlZCBoZWxwZXIgdG8gZ2V0IHRoZSBib3VuZGluZyByZWN0IG9mIHRoZSBjdXJyZW50IHNlbGVjdGlvbi5cbiAgICogVXNlcyBhIGNvbWJpbmF0aW9uIG9mIG5hdGl2ZSBzZWxlY3Rpb24gYW5kIFByb3NlTWlycm9yIGNvb3JkaW5hdGVzLlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldFJlY3RGb3JTZWxlY3Rpb24oZWQ6IEVkaXRvcik6IERPTVJlY3Qge1xuICAgIGlmICghZWQpIHtcbiAgICAgIHJldHVybiBuZXcgRE9NUmVjdCgwLCAwLCAwLCAwKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGZyb20sIHRvLCBlbXB0eSB9ID0gZWQuc3RhdGUuc2VsZWN0aW9uO1xuICAgIGlmIChlbXB0eSkge1xuICAgICAgcmV0dXJuIG5ldyBET01SZWN0KC05OTk5LCAtOTk5OSwgMCwgMCk7XG4gICAgfVxuXG4gICAgLy8gMS4gVHJ5IG5hdGl2ZSBzZWxlY3Rpb24gZm9yIG11bHRpLWxpbmUgYWNjdXJhY3lcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgaWYgKHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24ucmFuZ2VDb3VudCA+IDApIHtcbiAgICAgIGNvbnN0IHJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XG4gICAgICBjb25zdCByZWN0ID0gcmFuZ2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgIC8vIEVuc3VyZSB0aGUgcmVjdCBpcyB2YWxpZCBhbmQgYmVsb25ncyB0byB0aGUgZWRpdG9yXG4gICAgICBpZiAocmVjdC53aWR0aCA+IDAgJiYgcmVjdC5oZWlnaHQgPiAwKSB7XG4gICAgICAgIHJldHVybiByZWN0O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDIuIEZhbGxiYWNrIHRvIFRpcHRhcCBjb29yZGluYXRlcyBmb3IgcHJlY2lzaW9uIChzaW5nbGUgbGluZSAvIGVkZ2UgY2FzZXMpXG4gICAgY29uc3Qgc3RhcnQgPSBlZC52aWV3LmNvb3Jkc0F0UG9zKGZyb20pO1xuICAgIGNvbnN0IGVuZCA9IGVkLnZpZXcuY29vcmRzQXRQb3ModG8pO1xuXG4gICAgY29uc3QgdG9wID0gTWF0aC5taW4oc3RhcnQudG9wLCBlbmQudG9wKTtcbiAgICBjb25zdCBib3R0b20gPSBNYXRoLm1heChzdGFydC5ib3R0b20sIGVuZC5ib3R0b20pO1xuICAgIGNvbnN0IGxlZnQgPSBNYXRoLm1pbihzdGFydC5sZWZ0LCBlbmQubGVmdCk7XG4gICAgY29uc3QgcmlnaHQgPSBNYXRoLm1heChzdGFydC5yaWdodCwgZW5kLnJpZ2h0KTtcblxuICAgIHJldHVybiBuZXcgRE9NUmVjdChsZWZ0LCB0b3AsIHJpZ2h0IC0gbGVmdCwgYm90dG9tIC0gdG9wKTtcbiAgfVxuXG4gIC8vIC0tLSBBYnN0cmFjdCBtZXRob2RzIHRvIGJlIGltcGxlbWVudGVkIGJ5IHN1Yi1jb21wb25lbnRzIC0tLVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBSZWN0IHJlcHJlc2VudGluZyB0aGUgdGFyZ2V0IGZvciBwb3NpdGlvbmluZyB0aGUgbWVudS5cbiAgICovXG4gIGFic3RyYWN0IGdldFNlbGVjdGlvblJlY3QoKTogRE9NUmVjdDtcblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBtZW51IHNob3VsZCBiZSBkaXNwbGF5ZWQgYmFzZWQgb24gY3VycmVudCBzdGF0ZS5cbiAgICovXG4gIGFic3RyYWN0IHNob3VsZFNob3coKTogYm9vbGVhbjtcblxuICAvKipcbiAgICogRXhlY3V0ZXMgdGhlIGdpdmVuIGNvbW1hbmQgb24gdGhlIGVkaXRvci5cbiAgICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBleGVjdXRlQ29tbWFuZChlZGl0b3I6IEVkaXRvciwgY29tbWFuZDogc3RyaW5nLCAuLi5hcmdzOiB1bmtub3duW10pOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBob29rIGNhbGxlZCB3aGVuIFRpcHB5IGlzIGFib3V0IHRvIGJlIHNob3duLlxuICAgKi9cbiAgcHJvdGVjdGVkIG9uVGlwcHlTaG93KF9pbnN0YW5jZTogVGlwcHlJbnN0YW5jZSkge1xuICAgIC8qIGVtcHR5ICovXG4gIH1cblxuICAvKipcbiAgICogT3B0aW9uYWwgaG9vayBjYWxsZWQgd2hlbiBUaXBweSBpcyBhYm91dCB0byBiZSBoaWRkZW4uXG4gICAqL1xuICBwcm90ZWN0ZWQgb25UaXBweUhpZGUoX2luc3RhbmNlOiBUaXBweUluc3RhbmNlKSB7XG4gICAgLyogZW1wdHkgKi9cbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { Directive, input, viewChild, inject, effect, } from "@angular/core";
|
|
2
|
+
import tippy, { sticky } from "tippy.js";
|
|
3
|
+
import { AteEditorCommandsService } from "../../../services/ate-editor-commands.service";
|
|
4
|
+
import { AteI18nService } from "../../../services/ate-i18n.service";
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
/**
|
|
7
|
+
* Base abstract class for Sub-Bubble Menus (Link, Color).
|
|
8
|
+
* These menus are "sub-menus" of the main bubble menu or triggered/anchored by specific UI elements.
|
|
9
|
+
*/
|
|
10
|
+
export class AteBaseSubBubbleMenu {
|
|
11
|
+
constructor() {
|
|
12
|
+
this.i18nService = inject(AteI18nService);
|
|
13
|
+
this.editorCommands = inject(AteEditorCommandsService);
|
|
14
|
+
// Core Inputs
|
|
15
|
+
this.editor = input.required();
|
|
16
|
+
// Required viewChild for the menu container
|
|
17
|
+
this.menuRef = viewChild.required("menuRef");
|
|
18
|
+
// Internal State
|
|
19
|
+
this.tippyInstance = null;
|
|
20
|
+
this.updateTimeout = null;
|
|
21
|
+
// Reactive state alias for templates
|
|
22
|
+
this.state = this.editorCommands.editorState;
|
|
23
|
+
/**
|
|
24
|
+
* Core logic to decide whether to show or hide the menu.
|
|
25
|
+
*/
|
|
26
|
+
this.updateMenu = () => {
|
|
27
|
+
if (this.updateTimeout) {
|
|
28
|
+
clearTimeout(this.updateTimeout);
|
|
29
|
+
}
|
|
30
|
+
this.updateTimeout = setTimeout(() => {
|
|
31
|
+
if (this.shouldShow()) {
|
|
32
|
+
this.showTippy();
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
this.hideTippy();
|
|
36
|
+
}
|
|
37
|
+
}, 10);
|
|
38
|
+
};
|
|
39
|
+
// Reactive effect for menu updates (re-positioning)
|
|
40
|
+
effect(() => {
|
|
41
|
+
// Monitor editor state and specific sub-menu states
|
|
42
|
+
this.state();
|
|
43
|
+
this.onStateChange();
|
|
44
|
+
this.updateMenu();
|
|
45
|
+
}, { allowSignalWrites: true });
|
|
46
|
+
}
|
|
47
|
+
ngOnInit() {
|
|
48
|
+
this.initTippy();
|
|
49
|
+
}
|
|
50
|
+
ngOnDestroy() {
|
|
51
|
+
if (this.updateTimeout) {
|
|
52
|
+
clearTimeout(this.updateTimeout);
|
|
53
|
+
}
|
|
54
|
+
if (this.tippyInstance) {
|
|
55
|
+
this.tippyInstance.destroy();
|
|
56
|
+
this.tippyInstance = null;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Initializes the Tippy instance with sub-menu defaults.
|
|
61
|
+
*/
|
|
62
|
+
initTippy() {
|
|
63
|
+
if (!this.menuRef()?.nativeElement) {
|
|
64
|
+
setTimeout(() => this.initTippy(), 50);
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
const ed = this.editor();
|
|
68
|
+
if (this.tippyInstance) {
|
|
69
|
+
this.tippyInstance.destroy();
|
|
70
|
+
}
|
|
71
|
+
this.tippyInstance = tippy(document.body, {
|
|
72
|
+
content: this.menuRef().nativeElement,
|
|
73
|
+
trigger: "manual",
|
|
74
|
+
placement: "bottom-start",
|
|
75
|
+
appendTo: () => ed.options.element,
|
|
76
|
+
interactive: true,
|
|
77
|
+
arrow: false,
|
|
78
|
+
offset: [0, 8],
|
|
79
|
+
hideOnClick: true,
|
|
80
|
+
plugins: [sticky],
|
|
81
|
+
sticky: false,
|
|
82
|
+
getReferenceClientRect: () => this.getSelectionRect(),
|
|
83
|
+
popperOptions: {
|
|
84
|
+
modifiers: [
|
|
85
|
+
{
|
|
86
|
+
name: "preventOverflow",
|
|
87
|
+
options: { boundary: ed.options.element, padding: 8 },
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
name: "flip",
|
|
91
|
+
options: { fallbackPlacements: ["top-start", "bottom-end", "top-end"] },
|
|
92
|
+
},
|
|
93
|
+
],
|
|
94
|
+
},
|
|
95
|
+
onShow: instance => this.onTippyShow(instance),
|
|
96
|
+
onHide: instance => this.onTippyHide(instance),
|
|
97
|
+
});
|
|
98
|
+
this.updateMenu();
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Helper to show the Tippy instance with updated positioning.
|
|
102
|
+
*/
|
|
103
|
+
showTippy() {
|
|
104
|
+
if (this.tippyInstance) {
|
|
105
|
+
this.tippyInstance.setProps({ getReferenceClientRect: () => this.getSelectionRect() });
|
|
106
|
+
this.tippyInstance.show();
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Helper to hide the Tippy instance.
|
|
111
|
+
*/
|
|
112
|
+
hideTippy() {
|
|
113
|
+
this.tippyInstance?.hide();
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Optional hook called when Tippy is about to be shown.
|
|
117
|
+
*/
|
|
118
|
+
onTippyShow(_instance) {
|
|
119
|
+
/* empty */
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Optional hook called when Tippy is about to be hidden.
|
|
123
|
+
*/
|
|
124
|
+
onTippyHide(_instance) {
|
|
125
|
+
/* empty */
|
|
126
|
+
}
|
|
127
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteBaseSubBubbleMenu, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
128
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "18.2.14", type: AteBaseSubBubbleMenu, inputs: { editor: { classPropertyName: "editor", publicName: "editor", isSignal: true, isRequired: true, transformFunction: null } }, viewQueries: [{ propertyName: "menuRef", first: true, predicate: ["menuRef"], descendants: true, isSignal: true }], ngImport: i0 }); }
|
|
129
|
+
}
|
|
130
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AteBaseSubBubbleMenu, decorators: [{
|
|
131
|
+
type: Directive
|
|
132
|
+
}], ctorParameters: () => [] });
|
|
133
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRlLWJhc2Utc3ViLWJ1YmJsZS1tZW51LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci10aXB0YXAtZWRpdG9yL3NyYy9saWIvY29tcG9uZW50cy9idWJibGUtbWVudXMvYmFzZS9hdGUtYmFzZS1zdWItYnViYmxlLW1lbnUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsU0FBUyxFQUlULE1BQU0sRUFDTixNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxLQUFLLEVBQUUsRUFBNkIsTUFBTSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRXBFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQzs7QUFFcEU7OztHQUdHO0FBRUgsTUFBTSxPQUFnQixvQkFBb0I7SUFpQnhDO1FBaEJtQixnQkFBVyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNyQyxtQkFBYyxHQUFHLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1FBRXJFLGNBQWM7UUFDZCxXQUFNLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBVSxDQUFDO1FBRWxDLDRDQUE0QztRQUM1QyxZQUFPLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBNkIsU0FBUyxDQUFDLENBQUM7UUFFcEUsaUJBQWlCO1FBQ1Asa0JBQWEsR0FBeUIsSUFBSSxDQUFDO1FBQzNDLGtCQUFhLEdBQWtCLElBQUksQ0FBQztRQUU5QyxxQ0FBcUM7UUFDNUIsVUFBSyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDO1FBd0VqRDs7V0FFRztRQUNILGVBQVUsR0FBRyxHQUFHLEVBQUU7WUFDaEIsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ3ZCLFlBQVks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QztZQUM5QyxNQUFNLEVBQUUsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQztTQUMvQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQWtCRDs7T0FFRztJQUNPLFNBQVM7UUFDakIsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsRUFBRSxzQkFBc0IsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDdkYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM1QixDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ08sU0FBUztRQUNqQixJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFtQkQ7O09BRUc7SUFDTyxXQUFXLENBQUMsU0FBd0I7UUFDNUMsV0FBVztJQUNiLENBQUM7SUFFRDs7T0FFRztJQUNPLFdBQVcsQ0FBQyxTQUF3QjtRQUM1QyxXQUFXO0lBQ2IsQ0FBQzsrR0FySm1CLG9CQUFvQjttR0FBcEIsb0JBQW9COzs0RkFBcEIsb0JBQW9CO2tCQUR6QyxTQUFTIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRGlyZWN0aXZlLFxuICBpbnB1dCxcbiAgdmlld0NoaWxkLFxuICBFbGVtZW50UmVmLFxuICBPbkluaXQsXG4gIE9uRGVzdHJveSxcbiAgaW5qZWN0LFxuICBlZmZlY3QsXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgdGlwcHksIHsgSW5zdGFuY2UgYXMgVGlwcHlJbnN0YW5jZSwgc3RpY2t5IH0gZnJvbSBcInRpcHB5LmpzXCI7XG5pbXBvcnQgeyBFZGl0b3IgfSBmcm9tIFwiQHRpcHRhcC9jb3JlXCI7XG5pbXBvcnQgeyBBdGVFZGl0b3JDb21tYW5kc1NlcnZpY2UgfSBmcm9tIFwiLi4vLi4vLi4vc2VydmljZXMvYXRlLWVkaXRvci1jb21tYW5kcy5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBBdGVJMThuU2VydmljZSB9IGZyb20gXCIuLi8uLi8uLi9zZXJ2aWNlcy9hdGUtaTE4bi5zZXJ2aWNlXCI7XG5cbi8qKlxuICogQmFzZSBhYnN0cmFjdCBjbGFzcyBmb3IgU3ViLUJ1YmJsZSBNZW51cyAoTGluaywgQ29sb3IpLlxuICogVGhlc2UgbWVudXMgYXJlIFwic3ViLW1lbnVzXCIgb2YgdGhlIG1haW4gYnViYmxlIG1lbnUgb3IgdHJpZ2dlcmVkL2FuY2hvcmVkIGJ5IHNwZWNpZmljIFVJIGVsZW1lbnRzLlxuICovXG5ARGlyZWN0aXZlKClcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBdGVCYXNlU3ViQnViYmxlTWVudSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGkxOG5TZXJ2aWNlID0gaW5qZWN0KEF0ZUkxOG5TZXJ2aWNlKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGVkaXRvckNvbW1hbmRzID0gaW5qZWN0KEF0ZUVkaXRvckNvbW1hbmRzU2VydmljZSk7XG5cbiAgLy8gQ29yZSBJbnB1dHNcbiAgZWRpdG9yID0gaW5wdXQucmVxdWlyZWQ8RWRpdG9yPigpO1xuXG4gIC8vIFJlcXVpcmVkIHZpZXdDaGlsZCBmb3IgdGhlIG1lbnUgY29udGFpbmVyXG4gIG1lbnVSZWYgPSB2aWV3Q2hpbGQucmVxdWlyZWQ8RWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4+KFwibWVudVJlZlwiKTtcblxuICAvLyBJbnRlcm5hbCBTdGF0ZVxuICBwcm90ZWN0ZWQgdGlwcHlJbnN0YW5jZTogVGlwcHlJbnN0YW5jZSB8IG51bGwgPSBudWxsO1xuICBwcm90ZWN0ZWQgdXBkYXRlVGltZW91dDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgLy8gUmVhY3RpdmUgc3RhdGUgYWxpYXMgZm9yIHRlbXBsYXRlc1xuICByZWFkb25seSBzdGF0ZSA9IHRoaXMuZWRpdG9yQ29tbWFuZHMuZWRpdG9yU3RhdGU7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gUmVhY3RpdmUgZWZmZWN0IGZvciBtZW51IHVwZGF0ZXMgKHJlLXBvc2l0aW9uaW5nKVxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICAvLyBNb25pdG9yIGVkaXRvciBzdGF0ZSBhbmQgc3BlY2lmaWMgc3ViLW1lbnUgc3RhdGVzXG4gICAgICB0aGlzLnN0YXRlKCk7XG4gICAgICB0aGlzLm9uU3RhdGVDaGFuZ2UoKTtcblxuICAgICAgdGhpcy51cGRhdGVNZW51KCk7XG4gICAgfSwgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9KTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuaW5pdFRpcHB5KCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy51cGRhdGVUaW1lb3V0KSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy51cGRhdGVUaW1lb3V0KTtcbiAgICB9XG4gICAgaWYgKHRoaXMudGlwcHlJbnN0YW5jZSkge1xuICAgICAgdGhpcy50aXBweUluc3RhbmNlLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMudGlwcHlJbnN0YW5jZSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSBUaXBweSBpbnN0YW5jZSB3aXRoIHN1Yi1tZW51IGRlZmF1bHRzLlxuICAgKi9cbiAgcHJvdGVjdGVkIGluaXRUaXBweSgpIHtcbiAgICBpZiAoIXRoaXMubWVudVJlZigpPy5uYXRpdmVFbGVtZW50KSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuaW5pdFRpcHB5KCksIDUwKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBlZCA9IHRoaXMuZWRpdG9yKCk7XG4gICAgaWYgKHRoaXMudGlwcHlJbnN0YW5jZSkge1xuICAgICAgdGhpcy50aXBweUluc3RhbmNlLmRlc3Ryb3koKTtcbiAgICB9XG5cbiAgICB0aGlzLnRpcHB5SW5zdGFuY2UgPSB0aXBweShkb2N1bWVudC5ib2R5LCB7XG4gICAgICBjb250ZW50OiB0aGlzLm1lbnVSZWYoKS5uYXRpdmVFbGVtZW50LFxuICAgICAgdHJpZ2dlcjogXCJtYW51YWxcIixcbiAgICAgIHBsYWNlbWVudDogXCJib3R0b20tc3RhcnRcIixcbiAgICAgIGFwcGVuZFRvOiAoKSA9PiAoZWQub3B0aW9ucy5lbGVtZW50IGFzIEhUTUxFbGVtZW50KSxcbiAgICAgIGludGVyYWN0aXZlOiB0cnVlLFxuICAgICAgYXJyb3c6IGZhbHNlLFxuICAgICAgb2Zmc2V0OiBbMCwgOF0sXG4gICAgICBoaWRlT25DbGljazogdHJ1ZSxcbiAgICAgIHBsdWdpbnM6IFtzdGlja3ldLFxuICAgICAgc3RpY2t5OiBmYWxzZSxcbiAgICAgIGdldFJlZmVyZW5jZUNsaWVudFJlY3Q6ICgpID0+IHRoaXMuZ2V0U2VsZWN0aW9uUmVjdCgpLFxuICAgICAgcG9wcGVyT3B0aW9uczoge1xuICAgICAgICBtb2RpZmllcnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBcInByZXZlbnRPdmVyZmxvd1wiLFxuICAgICAgICAgICAgb3B0aW9uczogeyBib3VuZGFyeTogZWQub3B0aW9ucy5lbGVtZW50LCBwYWRkaW5nOiA4IH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBcImZsaXBcIixcbiAgICAgICAgICAgIG9wdGlvbnM6IHsgZmFsbGJhY2tQbGFjZW1lbnRzOiBbXCJ0b3Atc3RhcnRcIiwgXCJib3R0b20tZW5kXCIsIFwidG9wLWVuZFwiXSB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgICAgb25TaG93OiBpbnN0YW5jZSA9PiB0aGlzLm9uVGlwcHlTaG93KGluc3RhbmNlKSxcbiAgICAgIG9uSGlkZTogaW5zdGFuY2UgPT4gdGhpcy5vblRpcHB5SGlkZShpbnN0YW5jZSksXG4gICAgfSk7XG5cbiAgICB0aGlzLnVwZGF0ZU1lbnUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3JlIGxvZ2ljIHRvIGRlY2lkZSB3aGV0aGVyIHRvIHNob3cgb3IgaGlkZSB0aGUgbWVudS5cbiAgICovXG4gIHVwZGF0ZU1lbnUgPSAoKSA9PiB7XG4gICAgaWYgKHRoaXMudXBkYXRlVGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudXBkYXRlVGltZW91dCk7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuc2hvdWxkU2hvdygpKSB7XG4gICAgICAgIHRoaXMuc2hvd1RpcHB5KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmhpZGVUaXBweSgpO1xuICAgICAgfVxuICAgIH0sIDEwKTtcbiAgfTtcblxuICAvKipcbiAgICogSGVscGVyIHRvIHNob3cgdGhlIFRpcHB5IGluc3RhbmNlIHdpdGggdXBkYXRlZCBwb3NpdGlvbmluZy5cbiAgICovXG4gIHByb3RlY3RlZCBzaG93VGlwcHkoKSB7XG4gICAgaWYgKHRoaXMudGlwcHlJbnN0YW5jZSkge1xuICAgICAgdGhpcy50aXBweUluc3RhbmNlLnNldFByb3BzKHsgZ2V0UmVmZXJlbmNlQ2xpZW50UmVjdDogKCkgPT4gdGhpcy5nZXRTZWxlY3Rpb25SZWN0KCkgfSk7XG4gICAgICB0aGlzLnRpcHB5SW5zdGFuY2Uuc2hvdygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgdG8gaGlkZSB0aGUgVGlwcHkgaW5zdGFuY2UuXG4gICAqL1xuICBwcm90ZWN0ZWQgaGlkZVRpcHB5KCkge1xuICAgIHRoaXMudGlwcHlJbnN0YW5jZT8uaGlkZSgpO1xuICB9XG5cbiAgLy8gLS0tIEFic3RyYWN0IG1ldGhvZHMgJiBIb29rcyAtLS1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgUmVjdCByZXByZXNlbnRpbmcgdGhlIHRhcmdldCBmb3IgcG9zaXRpb25pbmcgdGhlIG1lbnUuXG4gICAqL1xuICBhYnN0cmFjdCBnZXRTZWxlY3Rpb25SZWN0KCk6IERPTVJlY3Q7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciB0aGUgbWVudSBzaG91bGQgYmUgZGlzcGxheWVkIGJhc2VkIG9uIGN1cnJlbnQgc3RhdGUuXG4gICAqL1xuICBhYnN0cmFjdCBzaG91bGRTaG93KCk6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEhvb2sgdG8gYWRkIHJlYWN0aXZlIGRlcGVuZGVuY2llcyB0byB0aGUgdXBkYXRlIGN5Y2xlLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IG9uU3RhdGVDaGFuZ2UoKTogdm9pZDtcblxuICAvKipcbiAgICogT3B0aW9uYWwgaG9vayBjYWxsZWQgd2hlbiBUaXBweSBpcyBhYm91dCB0byBiZSBzaG93bi5cbiAgICovXG4gIHByb3RlY3RlZCBvblRpcHB5U2hvdyhfaW5zdGFuY2U6IFRpcHB5SW5zdGFuY2UpIHtcbiAgICAvKiBlbXB0eSAqL1xuICB9XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIGhvb2sgY2FsbGVkIHdoZW4gVGlwcHkgaXMgYWJvdXQgdG8gYmUgaGlkZGVuLlxuICAgKi9cbiAgcHJvdGVjdGVkIG9uVGlwcHlIaWRlKF9pbnN0YW5jZTogVGlwcHlJbnN0YW5jZSkge1xuICAgIC8qIGVtcHR5ICovXG4gIH1cbn1cbiJdfQ==
|