asksuite-citrus 3.20.9 → 3.20.10

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.
@@ -1,15 +1,60 @@
1
1
  import { Toolbox } from "./toolbox";
2
+ import { Overlay, } from "@angular/cdk/overlay";
3
+ import { DomPortal } from "@angular/cdk/portal";
2
4
  const TOOLBOX_HEIGHT = 40;
3
5
  const MARGIN = 8;
4
6
  const MOUSE_EVENT = 'mouseup';
7
+ /** Pane's top-left lands exactly at the anchor moveOverlay() positions. */
8
+ const OVERLAY_POSITIONS = [
9
+ { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'top' },
10
+ ];
5
11
  class BubbleToolbox extends Toolbox {
6
- constructor(injector) {
12
+ /**
13
+ * `useOverlay` opts into rendering through a CDK Overlay (portaled to
14
+ * <body>) instead of a plain `position:absolute` child of the editor
15
+ * itself. Defaults to false — the plain-append behavior is unchanged
16
+ * for every existing consumer (e.g. the main chat-input's bubble
17
+ * toolbar, which today renders correctly with no clipping ancestor).
18
+ * Opt in only where the editor lives inside a `overflow:hidden/auto`
19
+ * ancestor (e.g. a scrollable list row), which clips a plain popup
20
+ * above its own viewport no matter the z-index — same reasoning as why
21
+ * the economy queue's emoji picker uses a CDK Overlay instead of a
22
+ * plain popup.
23
+ */
24
+ constructor(injector, useOverlay = false) {
7
25
  super(injector);
26
+ this.injector = injector;
27
+ this.useOverlay = useOverlay;
8
28
  }
9
29
  move(bounds) {
30
+ if (this.useOverlay) {
31
+ this.moveOverlay(bounds);
32
+ return;
33
+ }
10
34
  this.renderer2.setStyle(this.componentEl, 'top', `${bounds.top - (TOOLBOX_HEIGHT + MARGIN)}px`);
11
35
  this.renderer2.setStyle(this.componentEl, 'left', `${bounds.left}px`);
12
36
  }
37
+ /**
38
+ * Quill's bounds are relative to the editor's own container (`hostEl`)
39
+ * — the SAME coordinate space the plain local-append path already uses
40
+ * for `componentEl`'s `top`/`left` above, so the hidden anchor is moved
41
+ * exactly the same way. The overlay connects to this anchor (a real,
42
+ * live DOM node) rather than a bare viewport point: CDK's position
43
+ * strategy re-queries an anchor's `getBoundingClientRect()` fresh on
44
+ * every reposition, but a bare point origin is a one-time snapshot that
45
+ * never changes — `reposition()`'s scroll listener would still fire,
46
+ * but it'd just keep reapplying those same stale coordinates, leaving
47
+ * the toolbar stuck at its original screen position once a scrollable
48
+ * ancestor (e.g. the economy queue's list) actually scrolls, exactly
49
+ * where this overlay path is needed most.
50
+ */
51
+ moveOverlay(bounds) {
52
+ if (!this.overlayAnchorEl)
53
+ return;
54
+ this.renderer2.setStyle(this.overlayAnchorEl, 'top', `${bounds.top - (TOOLBOX_HEIGHT + MARGIN)}px`);
55
+ this.renderer2.setStyle(this.overlayAnchorEl, 'left', `${bounds.left}px`);
56
+ this.overlayRef?.updatePosition();
57
+ }
13
58
  listenOutsideClicks() {
14
59
  this.clickListener = (event) => {
15
60
  if (!this.componentEl?.contains(event.target)
@@ -35,15 +80,68 @@ class BubbleToolbox extends Toolbox {
35
80
  displayComponent() {
36
81
  super.displayComponent();
37
82
  this.listenOutsideClicks();
38
- this.renderer2.appendChild(this.hostEl?.nativeElement, this.componentEl);
83
+ if (this.useOverlay) {
84
+ // Makes hostEl the anchor's containing block regardless of whatever
85
+ // the consumer's own CSS happens to do — neither Quill's nor
86
+ // citrus's stylesheets put `position` on the editor container
87
+ // (`.ql-container`), so without this the anchor's top/left would
88
+ // resolve against whichever ancestor further up happens to be
89
+ // positioned instead, silently offsetting it.
90
+ this.renderer2.setStyle(this.hostEl.nativeElement, 'position', 'relative');
91
+ this.overlayAnchorEl = this.renderer2.createElement('span');
92
+ this.renderer2.setStyle(this.overlayAnchorEl, 'position', 'absolute');
93
+ this.renderer2.setStyle(this.overlayAnchorEl, 'width', '1px');
94
+ this.renderer2.setStyle(this.overlayAnchorEl, 'height', '1px');
95
+ this.renderer2.setStyle(this.overlayAnchorEl, 'visibility', 'hidden');
96
+ this.renderer2.setStyle(this.overlayAnchorEl, 'pointer-events', 'none');
97
+ // Appended before the overlay is created so CDK's ancestor-scroll
98
+ // detection (run at attach time) walks up from where the anchor
99
+ // actually lives in the DOM, not from a detached node.
100
+ this.renderer2.appendChild(this.hostEl.nativeElement, this.overlayAnchorEl);
101
+ const overlay = this.injector.get(Overlay);
102
+ this.overlayPositionStrategy = overlay.position()
103
+ .flexibleConnectedTo(this.overlayAnchorEl)
104
+ .withPositions(OVERLAY_POSITIONS);
105
+ this.overlayRef = overlay.create({
106
+ positionStrategy: this.overlayPositionStrategy,
107
+ scrollStrategy: overlay.scrollStrategies.reposition(),
108
+ });
109
+ // A plain appendChild into overlayElement skips the position
110
+ // strategy's own attach() lifecycle (it never gets a reference to
111
+ // the pane), which crashes the next reposition — DomPortal goes
112
+ // through OverlayRef's normal attach path instead, so everything
113
+ // (including the anchor-based restore on dispose) is wired up
114
+ // the same way a ComponentPortal's would be.
115
+ this.overlayRef.attach(new DomPortal(this.componentEl));
116
+ }
117
+ else {
118
+ this.renderer2.appendChild(this.hostEl?.nativeElement, this.componentEl);
119
+ }
39
120
  this.componentRef.setInput('type', 'bubble');
40
121
  }
122
+ // `isVisible()`'s base implementation checks whether componentEl is a
123
+ // DOM descendant of hostEl — never true once componentEl lives inside
124
+ // the overlay pane in <body> instead.
125
+ isVisible() {
126
+ return this.useOverlay ? !!this.overlayRef : super.isVisible();
127
+ }
41
128
  destroyComponent() {
42
129
  document.body.removeEventListener(MOUSE_EVENT, this.clickListener);
130
+ // Disposing first restores componentEl to where it lived before the
131
+ // DomPortal moved it (its own anchor-based teardown) — doing this
132
+ // AFTER destroying the Angular component would instead re-insert an
133
+ // already-destroyed, inert DOM node back into the page.
134
+ this.overlayRef?.dispose();
135
+ this.overlayRef = undefined;
136
+ this.overlayPositionStrategy = undefined;
137
+ if (this.overlayAnchorEl) {
138
+ this.renderer2.removeChild(this.hostEl.nativeElement, this.overlayAnchorEl);
139
+ this.overlayAnchorEl = undefined;
140
+ }
43
141
  super.destroyComponent();
44
142
  }
45
143
  }
46
144
  export const BubbleToolboxProxy = {
47
145
  BubbleToolbox
48
146
  };
49
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnViYmxlLXRvb2xib3guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hc2tzdWl0ZS1jaXRydXMvc3JjL2xpYi9jbGFzc2VzL2J1YmJsZS10b29sYm94LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFHcEMsTUFBTSxjQUFjLEdBQUcsRUFBRSxDQUFDO0FBQzFCLE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBQztBQUNqQixNQUFNLFdBQVcsR0FBRyxTQUFTLENBQUE7QUFFN0IsTUFBTSxhQUFjLFNBQVEsT0FBTztJQUcvQixZQUFZLFFBQWtCO1FBQzVCLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNsQixDQUFDO0lBRU8sSUFBSSxDQUFDLE1BQW9CO1FBQy9CLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUMsS0FBSyxFQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLGNBQWMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUYsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBQyxNQUFNLEVBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBRU8sbUJBQW1CO1FBQ3pCLElBQUksQ0FBQyxhQUFhLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUM3QixJQUNFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQWMsQ0FBQzttQkFDOUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUNwQixDQUFDO2dCQUNBLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQzFCLENBQUM7UUFDSCxDQUFDLENBQUE7UUFDRCxRQUFRLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVRLGNBQWMsQ0FBQyxLQUFpQjtRQUN2QyxLQUFLLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQzNCLE1BQU0sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQztRQUNqRCxJQUFJLFlBQVksSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUMzQixJQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRTtnQkFDbEIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNwQixDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLFFBQVE7Z0JBQzdCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzVCLENBQUM7SUFDSCxDQUFDO0lBRVEsZ0JBQWdCO1FBQ3ZCLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsYUFBYSxFQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN4RSxJQUFJLENBQUMsWUFBYSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUMsUUFBUSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVRLGdCQUFnQjtRQUN2QixRQUFRLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsYUFBYyxDQUFDLENBQUM7UUFDcEUsS0FBSyxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDM0IsQ0FBQztDQUNGO0FBR0gsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUc7SUFDaEMsYUFBYTtDQUNkLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RvciB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBCb3VuZHNTdGF0aWMgfSBmcm9tIFwicXVpbGxcIjtcbmltcG9ydCB7IFRvb2xib3ggfSBmcm9tIFwiLi90b29sYm94XCI7XG5pbXBvcnQgeyBUb29sc1N0YXRlIH0gZnJvbSBcIi4uL2ludGVyZmFjZXMvcmljaHRleHQtdG9vbGJveC5pbnRlcmZhY2VcIjtcblxuY29uc3QgVE9PTEJPWF9IRUlHSFQgPSA0MDtcbmNvbnN0IE1BUkdJTiA9IDg7XG5jb25zdCBNT1VTRV9FVkVOVCA9ICdtb3VzZXVwJ1xuXG5jbGFzcyBCdWJibGVUb29sYm94IGV4dGVuZHMgVG9vbGJveCB7XG4gICAgcHJpdmF0ZSBjbGlja0xpc3RlbmVyPzogKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB2b2lkO1xuICBcbiAgICBjb25zdHJ1Y3RvcihpbmplY3RvcjogSW5qZWN0b3IpIHtcbiAgICAgIHN1cGVyKGluamVjdG9yKTtcbiAgICB9XG4gIFxuICAgIHByaXZhdGUgbW92ZShib3VuZHM6IEJvdW5kc1N0YXRpYykge1xuICAgICAgdGhpcy5yZW5kZXJlcjIuc2V0U3R5bGUodGhpcy5jb21wb25lbnRFbCwndG9wJyxgJHtib3VuZHMudG9wIC0gKFRPT0xCT1hfSEVJR0hUICsgTUFSR0lOKX1weGApO1xuICAgICAgdGhpcy5yZW5kZXJlcjIuc2V0U3R5bGUodGhpcy5jb21wb25lbnRFbCwnbGVmdCcsYCR7Ym91bmRzLmxlZnR9cHhgKTtcbiAgICB9XG4gIFxuICAgIHByaXZhdGUgbGlzdGVuT3V0c2lkZUNsaWNrcygpe1xuICAgICAgdGhpcy5jbGlja0xpc3RlbmVyID0gKGV2ZW50KSA9PiB7XG4gICAgICAgIGlmKFxuICAgICAgICAgICF0aGlzLmNvbXBvbmVudEVsPy5jb250YWlucyhldmVudC50YXJnZXQgYXMgTm9kZSkgXG4gICAgICAgICAgJiYgdGhpcy5pc1Zpc2libGUoKVxuICAgICAgICApe1xuICAgICAgICAgIHRoaXMuZGVzdHJveUNvbXBvbmVudCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoTU9VU0VfRVZFTlQsIHRoaXMuY2xpY2tMaXN0ZW5lcik7XG4gICAgfVxuICAgIFxuICAgIG92ZXJyaWRlIG9uVG9vbHNDaGFuZ2VkKHN0YXRlOiBUb29sc1N0YXRlKTogdm9pZCB7XG4gICAgICBzdXBlci5vblRvb2xzQ2hhbmdlZChzdGF0ZSlcbiAgICAgIGNvbnN0IHsgaGFzU2VsZWN0aW9uLCBoYXNGb2N1cywgYm91bmRzIH0gPSBzdGF0ZTtcbiAgICAgIGlmIChoYXNTZWxlY3Rpb24gJiYgYm91bmRzKSB7XG4gICAgICAgIGlmKCF0aGlzLmlzVmlzaWJsZSgpKVxuICAgICAgICAgIHRoaXMuZGlzcGxheUNvbXBvbmVudCgpO1xuICAgICAgICB0aGlzLm1vdmUoYm91bmRzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmKHRoaXMuaXNWaXNpYmxlKCkgJiYgaGFzRm9jdXMpXG4gICAgICAgICAgdGhpcy5kZXN0cm95Q29tcG9uZW50KCk7XG4gICAgICB9XG4gICAgfVxuICBcbiAgICBvdmVycmlkZSBkaXNwbGF5Q29tcG9uZW50KCkge1xuICAgICAgc3VwZXIuZGlzcGxheUNvbXBvbmVudCgpO1xuICAgICAgdGhpcy5saXN0ZW5PdXRzaWRlQ2xpY2tzKCk7XG4gICAgICB0aGlzLnJlbmRlcmVyMi5hcHBlbmRDaGlsZCh0aGlzLmhvc3RFbD8ubmF0aXZlRWxlbWVudCx0aGlzLmNvbXBvbmVudEVsKTtcbiAgICAgIHRoaXMuY29tcG9uZW50UmVmIS5zZXRJbnB1dCgndHlwZScsJ2J1YmJsZScpO1xuICAgIH1cblxuICAgIG92ZXJyaWRlIGRlc3Ryb3lDb21wb25lbnQoKSB7XG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoTU9VU0VfRVZFTlQsIHRoaXMuY2xpY2tMaXN0ZW5lciEpO1xuICAgICAgc3VwZXIuZGVzdHJveUNvbXBvbmVudCgpO1xuICAgIH1cbiAgfVxuXG5cbmV4cG9ydCBjb25zdCBCdWJibGVUb29sYm94UHJveHkgPSB7XG4gIEJ1YmJsZVRvb2xib3hcbn0iXX0=
147
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnViYmxlLXRvb2xib3guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hc2tzdWl0ZS1jaXRydXMvc3JjL2xpYi9jbGFzc2VzL2J1YmJsZS10b29sYm94LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFcEMsT0FBTyxFQUdMLE9BQU8sR0FFUixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVoRCxNQUFNLGNBQWMsR0FBRyxFQUFFLENBQUM7QUFDMUIsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCLE1BQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQTtBQUU3QiwyRUFBMkU7QUFDM0UsTUFBTSxpQkFBaUIsR0FBd0I7SUFDN0MsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFO0NBQ3pFLENBQUM7QUFFRixNQUFNLGFBQWMsU0FBUSxPQUFPO0lBVS9COzs7Ozs7Ozs7OztPQVdHO0lBQ0gsWUFBb0IsUUFBa0IsRUFBVSxhQUFhLEtBQUs7UUFDaEUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBREUsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUFVLGVBQVUsR0FBVixVQUFVLENBQVE7SUFFbEUsQ0FBQztJQUVPLElBQUksQ0FBQyxNQUFvQjtRQUMvQixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3pCLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBQyxLQUFLLEVBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxH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QUFDLENBQUM7UUFDMUUsQ0FBQztRQUNELElBQUksQ0FBQyxZQUFhLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBQyxRQUFRLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQsc0VBQXNFO0lBQ3RFLHNFQUFzRTtJQUN0RSxzQ0FBc0M7SUFDbkIsU0FBUztRQUMxQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDakUsQ0FBQztJQUVRLGdCQUFnQjtRQUN2QixRQUFRLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsYUFBYyxDQUFDLENBQUM7UUFDcEUsb0VBQW9FO1FBQ3BFLGtFQUFrRTtRQUNsRSxvRUFBb0U7UUFDcEUsd0RBQXdEO1FBQ3hELElBQUksQ0FBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7UUFDNUIsSUFBSSxDQUFDLHVCQUF1QixHQUFHLFNBQVMsQ0FBQztRQUN6QyxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDNUUsSUFBSSxDQUFDLGVBQWUsR0FBRyxTQUFTLENBQUM7UUFDbkMsQ0FBQztRQUNELEtBQUssQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQzNCLENBQUM7Q0FDRjtBQUdILE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHO0lBQ2hDLGFBQWE7Q0FDZCxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0b3IgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgQm91bmRzU3RhdGljIH0gZnJvbSBcInF1aWxsXCI7XG5pbXBvcnQgeyBUb29sYm94IH0gZnJvbSBcIi4vdG9vbGJveFwiO1xuaW1wb3J0IHsgVG9vbHNTdGF0ZSB9IGZyb20gXCIuLi9pbnRlcmZhY2VzL3JpY2h0ZXh0LXRvb2xib3guaW50ZXJmYWNlXCI7XG5pbXBvcnQge1xuICBDb25uZWN0ZWRQb3NpdGlvbixcbiAgRmxleGlibGVDb25uZWN0ZWRQb3NpdGlvblN0cmF0ZWd5LFxuICBPdmVybGF5LFxuICBPdmVybGF5UmVmLFxufSBmcm9tIFwiQGFuZ3VsYXIvY2RrL292ZXJsYXlcIjtcbmltcG9ydCB7IERvbVBvcnRhbCB9IGZyb20gXCJAYW5ndWxhci9jZGsvcG9ydGFsXCI7XG5cbmNvbnN0IFRPT0xCT1hfSEVJR0hUID0gNDA7XG5jb25zdCBNQVJHSU4gPSA4O1xuY29uc3QgTU9VU0VfRVZFTlQgPSAnbW91c2V1cCdcblxuLyoqIFBhbmUncyB0b3AtbGVmdCBsYW5kcyBleGFjdGx5IGF0IHRoZSBhbmNob3IgbW92ZU92ZXJsYXkoKSBwb3NpdGlvbnMuICovXG5jb25zdCBPVkVSTEFZX1BPU0lUSU9OUzogQ29ubmVjdGVkUG9zaXRpb25bXSA9IFtcbiAgeyBvcmlnaW5YOiAnc3RhcnQnLCBvcmlnaW5ZOiAndG9wJywgb3ZlcmxheVg6ICdzdGFydCcsIG92ZXJsYXlZOiAndG9wJyB9LFxuXTtcblxuY2xhc3MgQnViYmxlVG9vbGJveCBleHRlbmRzIFRvb2xib3gge1xuICAgIHByaXZhdGUgY2xpY2tMaXN0ZW5lcj86IChldmVudDogTW91c2VFdmVudCkgPT4gdm9pZDtcbiAgICBwcml2YXRlIG92ZXJsYXlSZWY/OiBPdmVybGF5UmVmO1xuICAgIHByaXZhdGUgb3ZlcmxheVBvc2l0aW9uU3RyYXRlZ3k/OiBGbGV4aWJsZUNvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3k7XG4gICAgLyoqXG4gICAgICogUmVhbCwgaGlkZGVuIDF4MSBET00gbm9kZSB0aGUgb3ZlcmxheSBjb25uZWN0cyB0byDigJQgc2VlIG1vdmVPdmVybGF5KClcbiAgICAgKiBmb3Igd2h5IHRoaXMgcmVwbGFjZXMgYSBiYXJlIHZpZXdwb3J0IHBvaW50LlxuICAgICAqL1xuICAgIHByaXZhdGUgb3ZlcmxheUFuY2hvckVsPzogSFRNTEVsZW1lbnQ7XG5cbiAgICAvKipcbiAgICAgKiBgdXNlT3ZlcmxheWAgb3B0cyBpbnRvIHJlbmRlcmluZyB0aHJvdWdoIGEgQ0RLIE92ZXJsYXkgKHBvcnRhbGVkIHRvXG4gICAgICogPGJvZHk+KSBpbnN0ZWFkIG9mIGEgcGxhaW4gYHBvc2l0aW9uOmFic29sdXRlYCBjaGlsZCBvZiB0aGUgZWRpdG9yXG4gICAgICogaXRzZWxmLiBEZWZhdWx0cyB0byBmYWxzZSDigJQgdGhlIHBsYWluLWFwcGVuZCBiZWhhdmlvciBpcyB1bmNoYW5nZWRcbiAgICAgKiBmb3IgZXZlcnkgZXhpc3RpbmcgY29uc3VtZXIgKGUuZy4gdGhlIG1haW4gY2hhdC1pbnB1dCdzIGJ1YmJsZVxuICAgICAqIHRvb2xiYXIsIHdoaWNoIHRvZGF5IHJlbmRlcnMgY29ycmVjdGx5IHdpdGggbm8gY2xpcHBpbmcgYW5jZXN0b3IpLlxuICAgICAqIE9wdCBpbiBvbmx5IHdoZXJlIHRoZSBlZGl0b3IgbGl2ZXMgaW5zaWRlIGEgYG92ZXJmbG93OmhpZGRlbi9hdXRvYFxuICAgICAqIGFuY2VzdG9yIChlLmcuIGEgc2Nyb2xsYWJsZSBsaXN0IHJvdyksIHdoaWNoIGNsaXBzIGEgcGxhaW4gcG9wdXBcbiAgICAgKiBhYm92ZSBpdHMgb3duIHZpZXdwb3J0IG5vIG1hdHRlciB0aGUgei1pbmRleCDigJQgc2FtZSByZWFzb25pbmcgYXMgd2h5XG4gICAgICogdGhlIGVjb25vbXkgcXVldWUncyBlbW9qaSBwaWNrZXIgdXNlcyBhIENESyBPdmVybGF5IGluc3RlYWQgb2YgYVxuICAgICAqIHBsYWluIHBvcHVwLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yLCBwcml2YXRlIHVzZU92ZXJsYXkgPSBmYWxzZSkge1xuICAgICAgc3VwZXIoaW5qZWN0b3IpO1xuICAgIH1cblxuICAgIHByaXZhdGUgbW92ZShib3VuZHM6IEJvdW5kc1N0YXRpYykge1xuICAgICAgaWYgKHRoaXMudXNlT3ZlcmxheSkge1xuICAgICAgICB0aGlzLm1vdmVPdmVybGF5KGJvdW5kcyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMucmVuZGVyZXIyLnNldFN0eWxlKHRoaXMuY29tcG9uZW50RWwsJ3RvcCcsYCR7Ym91bmRzLnRvcCAtIChUT09MQk9YX0hFSUdIVCArIE1BUkdJTil9cHhgKTtcbiAgICAgIHRoaXMucmVuZGVyZXIyLnNldFN0eWxlKHRoaXMuY29tcG9uZW50RWwsJ2xlZnQnLGAke2JvdW5kcy5sZWZ0fXB4YCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUXVpbGwncyBib3VuZHMgYXJlIHJlbGF0aXZlIHRvIHRoZSBlZGl0b3IncyBvd24gY29udGFpbmVyIChgaG9zdEVsYClcbiAgICAgKiDigJQgdGhlIFNBTUUgY29vcmRpbmF0ZSBzcGFjZSB0aGUgcGxhaW4gbG9jYWwtYXBwZW5kIHBhdGggYWxyZWFkeSB1c2VzXG4gICAgICogZm9yIGBjb21wb25lbnRFbGAncyBgdG9wYC9gbGVmdGAgYWJvdmUsIHNvIHRoZSBoaWRkZW4gYW5jaG9yIGlzIG1vdmVkXG4gICAgICogZXhhY3RseSB0aGUgc2FtZSB3YXkuIFRoZSBvdmVybGF5IGNvbm5lY3RzIHRvIHRoaXMgYW5jaG9yIChhIHJlYWwsXG4gICAgICogbGl2ZSBET00gbm9kZSkgcmF0aGVyIHRoYW4gYSBiYXJlIHZpZXdwb3J0IHBvaW50OiBDREsncyBwb3NpdGlvblxuICAgICAqIHN0cmF0ZWd5IHJlLXF1ZXJpZXMgYW4gYW5jaG9yJ3MgYGdldEJvdW5kaW5nQ2xpZW50UmVjdCgpYCBmcmVzaCBvblxuICAgICAqIGV2ZXJ5IHJlcG9zaXRpb24sIGJ1dCBhIGJhcmUgcG9pbnQgb3JpZ2luIGlzIGEgb25lLXRpbWUgc25hcHNob3QgdGhhdFxuICAgICAqIG5ldmVyIGNoYW5nZXMg4oCUIGByZXBvc2l0aW9uKClgJ3Mgc2Nyb2xsIGxpc3RlbmVyIHdvdWxkIHN0aWxsIGZpcmUsXG4gICAgICogYnV0IGl0J2QganVzdCBrZWVwIHJlYXBwbHlpbmcgdGhvc2Ugc2FtZSBzdGFsZSBjb29yZGluYXRlcywgbGVhdmluZ1xuICAgICAqIHRoZSB0b29sYmFyIHN0dWNrIGF0IGl0cyBvcmlnaW5hbCBzY3JlZW4gcG9zaXRpb24gb25jZSBhIHNjcm9sbGFibGVcbiAgICAgKiBhbmNlc3RvciAoZS5nLiB0aGUgZWNvbm9teSBxdWV1ZSdzIGxpc3QpIGFjdHVhbGx5IHNjcm9sbHMsIGV4YWN0bHlcbiAgICAgKiB3aGVyZSB0aGlzIG92ZXJsYXkgcGF0aCBpcyBuZWVkZWQgbW9zdC5cbiAgICAgKi9cbiAgICBwcml2YXRlIG1vdmVPdmVybGF5KGJvdW5kczogQm91bmRzU3RhdGljKSB7XG4gICAgICBpZiAoIXRoaXMub3ZlcmxheUFuY2hvckVsKSByZXR1cm47XG4gICAgICB0aGlzLnJlbmRlcmVyMi5zZXRTdHlsZSh0aGlzLm92ZXJsYXlBbmNob3JFbCwgJ3RvcCcsIGAke2JvdW5kcy50b3AgLSAoVE9PTEJPWF9IRUlHSFQgKyBNQVJHSU4pfXB4YCk7XG4gICAgICB0aGlzLnJlbmRlcmVyMi5zZXRTdHlsZSh0aGlzLm92ZXJsYXlBbmNob3JFbCwgJ2xlZnQnLCBgJHtib3VuZHMubGVmdH1weGApO1xuICAgICAgdGhpcy5vdmVybGF5UmVmPy51cGRhdGVQb3NpdGlvbigpO1xuICAgIH1cblxuICAgIHByaXZhdGUgbGlzdGVuT3V0c2lkZUNsaWNrcygpe1xuICAgICAgdGhpcy5jbGlja0xpc3RlbmVyID0gKGV2ZW50KSA9PiB7XG4gICAgICAgIGlmKFxuICAgICAgICAgICF0aGlzLmNvbXBvbmVudEVsPy5jb250YWlucyhldmVudC50YXJnZXQgYXMgTm9kZSlcbiAgICAgICAgICAmJiB0aGlzLmlzVmlzaWJsZSgpXG4gICAgICAgICl7XG4gICAgICAgICAgdGhpcy5kZXN0cm95Q29tcG9uZW50KCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcihNT1VTRV9FVkVOVCwgdGhpcy5jbGlja0xpc3RlbmVyKTtcbiAgICB9XG5cbiAgICBvdmVycmlkZSBvblRvb2xzQ2hhbmdlZChzdGF0ZTogVG9vbHNTdGF0ZSk6IHZvaWQge1xuICAgICAgc3VwZXIub25Ub29sc0NoYW5nZWQoc3RhdGUpXG4gICAgICBjb25zdCB7IGhhc1NlbGVjdGlvbiwgaGFzRm9jdXMsIGJvdW5kcyB9ID0gc3RhdGU7XG4gICAgICBpZiAoaGFzU2VsZWN0aW9uICYmIGJvdW5kcykge1xuICAgICAgICBpZighdGhpcy5pc1Zpc2libGUoKSlcbiAgICAgICAgICB0aGlzLmRpc3BsYXlDb21wb25lbnQoKTtcbiAgICAgICAgdGhpcy5tb3ZlKGJvdW5kcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZih0aGlzLmlzVmlzaWJsZSgpICYmIGhhc0ZvY3VzKVxuICAgICAgICAgIHRoaXMuZGVzdHJveUNvbXBvbmVudCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIG92ZXJyaWRlIGRpc3BsYXlDb21wb25lbnQoKSB7XG4gICAgICBzdXBlci5kaXNwbGF5Q29tcG9uZW50KCk7XG4gICAgICB0aGlzLmxpc3Rlbk91dHNpZGVDbGlja3MoKTtcbiAgICAgIGlmICh0aGlzLnVzZU92ZXJsYXkpIHtcbiAgICAgICAgLy8gTWFrZXMgaG9zdEVsIHRoZSBhbmNob3IncyBjb250YWluaW5nIGJsb2NrIHJlZ2FyZGxlc3Mgb2Ygd2hhdGV2ZXJcbiAgICAgICAgLy8gdGhlIGNvbnN1bWVyJ3Mgb3duIENTUyBoYXBwZW5zIHRvIGRvIOKAlCBuZWl0aGVyIFF1aWxsJ3Mgbm9yXG4gICAgICAgIC8vIGNpdHJ1cydzIHN0eWxlc2hlZXRzIHB1dCBgcG9zaXRpb25gIG9uIHRoZSBlZGl0b3IgY29udGFpbmVyXG4gICAgICAgIC8vIChgLnFsLWNvbnRhaW5lcmApLCBzbyB3aXRob3V0IHRoaXMgdGhlIGFuY2hvcidzIHRvcC9sZWZ0IHdvdWxkXG4gICAgICAgIC8vIHJlc29sdmUgYWdhaW5zdCB3aGljaGV2ZXIgYW5jZXN0b3IgZnVydGhlciB1cCBoYXBwZW5zIHRvIGJlXG4gICAgICAgIC8vIHBvc2l0aW9uZWQgaW5zdGVhZCwgc2lsZW50bHkgb2Zmc2V0dGluZyBpdC5cbiAgICAgICAgdGhpcy5yZW5kZXJlcjIuc2V0U3R5bGUodGhpcy5ob3N0RWwubmF0aXZlRWxlbWVudCwgJ3Bvc2l0aW9uJywgJ3JlbGF0aXZlJyk7XG4gICAgICAgIHRoaXMub3ZlcmxheUFuY2hvckVsID0gdGhpcy5yZW5kZXJlcjIuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyMi5zZXRTdHlsZSh0aGlzLm92ZXJsYXlBbmNob3JFbCwgJ3Bvc2l0aW9uJywgJ2Fic29sdXRlJyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIyLnNldFN0eWxlKHRoaXMub3ZlcmxheUFuY2hvckVsLCAnd2lkdGgnLCAnMXB4Jyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIyLnNldFN0eWxlKHRoaXMub3ZlcmxheUFuY2hvckVsLCAnaGVpZ2h0JywgJzFweCcpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyMi5zZXRTdHlsZSh0aGlzLm92ZXJsYXlBbmNob3JFbCwgJ3Zpc2liaWxpdHknLCAnaGlkZGVuJyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIyLnNldFN0eWxlKHRoaXMub3ZlcmxheUFuY2hvckVsLCAncG9pbnRlci1ldmVudHMnLCAnbm9uZScpO1xuICAgICAgICAvLyBBcHBlbmRlZCBiZWZvcmUgdGhlIG92ZXJsYXkgaXMgY3JlYXRlZCBzbyBDREsncyBhbmNlc3Rvci1zY3JvbGxcbiAgICAgICAgLy8gZGV0ZWN0aW9uIChydW4gYXQgYXR0YWNoIHRpbWUpIHdhbGtzIHVwIGZyb20gd2hlcmUgdGhlIGFuY2hvclxuICAgICAgICAvLyBhY3R1YWxseSBsaXZlcyBpbiB0aGUgRE9NLCBub3QgZnJvbSBhIGRldGFjaGVkIG5vZGUuXG4gICAgICAgIHRoaXMucmVuZGVyZXIyLmFwcGVuZENoaWxkKHRoaXMuaG9zdEVsLm5hdGl2ZUVsZW1lbnQsIHRoaXMub3ZlcmxheUFuY2hvckVsKTtcblxuICAgICAgICBjb25zdCBvdmVybGF5ID0gdGhpcy5pbmplY3Rvci5nZXQoT3ZlcmxheSk7XG4gICAgICAgIHRoaXMub3ZlcmxheVBvc2l0aW9uU3RyYXRlZ3kgPSBvdmVybGF5LnBvc2l0aW9uKClcbiAgICAgICAgICAuZmxleGlibGVDb25uZWN0ZWRUbyh0aGlzLm92ZXJsYXlBbmNob3JFbCEpXG4gICAgICAgICAgLndpdGhQb3NpdGlvbnMoT1ZFUkxBWV9QT1NJVElPTlMpO1xuICAgICAgICB0aGlzLm92ZXJsYXlSZWYgPSBvdmVybGF5LmNyZWF0ZSh7XG4gICAgICAgICAgcG9zaXRpb25TdHJhdGVneTogdGhpcy5vdmVybGF5UG9zaXRpb25TdHJhdGVneSxcbiAgICAgICAgICBzY3JvbGxTdHJhdGVneTogb3ZlcmxheS5zY3JvbGxTdHJhdGVnaWVzLnJlcG9zaXRpb24oKSxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIEEgcGxhaW4gYXBwZW5kQ2hpbGQgaW50byBvdmVybGF5RWxlbWVudCBza2lwcyB0aGUgcG9zaXRpb25cbiAgICAgICAgLy8gc3RyYXRlZ3kncyBvd24gYXR0YWNoKCkgbGlmZWN5Y2xlIChpdCBuZXZlciBnZXRzIGEgcmVmZXJlbmNlIHRvXG4gICAgICAgIC8vIHRoZSBwYW5lKSwgd2hpY2ggY3Jhc2hlcyB0aGUgbmV4dCByZXBvc2l0aW9uIOKAlCBEb21Qb3J0YWwgZ29lc1xuICAgICAgICAvLyB0aHJvdWdoIE92ZXJsYXlSZWYncyBub3JtYWwgYXR0YWNoIHBhdGggaW5zdGVhZCwgc28gZXZlcnl0aGluZ1xuICAgICAgICAvLyAoaW5jbHVkaW5nIHRoZSBhbmNob3ItYmFzZWQgcmVzdG9yZSBvbiBkaXNwb3NlKSBpcyB3aXJlZCB1cFxuICAgICAgICAvLyB0aGUgc2FtZSB3YXkgYSBDb21wb25lbnRQb3J0YWwncyB3b3VsZCBiZS5cbiAgICAgICAgdGhpcy5vdmVybGF5UmVmLmF0dGFjaChuZXcgRG9tUG9ydGFsKHRoaXMuY29tcG9uZW50RWwhKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlbmRlcmVyMi5hcHBlbmRDaGlsZCh0aGlzLmhvc3RFbD8ubmF0aXZlRWxlbWVudCx0aGlzLmNvbXBvbmVudEVsKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY29tcG9uZW50UmVmIS5zZXRJbnB1dCgndHlwZScsJ2J1YmJsZScpO1xuICAgIH1cblxuICAgIC8vIGBpc1Zpc2libGUoKWAncyBiYXNlIGltcGxlbWVudGF0aW9uIGNoZWNrcyB3aGV0aGVyIGNvbXBvbmVudEVsIGlzIGFcbiAgICAvLyBET00gZGVzY2VuZGFudCBvZiBob3N0RWwg4oCUIG5ldmVyIHRydWUgb25jZSBjb21wb25lbnRFbCBsaXZlcyBpbnNpZGVcbiAgICAvLyB0aGUgb3ZlcmxheSBwYW5lIGluIDxib2R5PiBpbnN0ZWFkLlxuICAgIHByb3RlY3RlZCBvdmVycmlkZSBpc1Zpc2libGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy51c2VPdmVybGF5ID8gISF0aGlzLm92ZXJsYXlSZWYgOiBzdXBlci5pc1Zpc2libGUoKTtcbiAgICB9XG5cbiAgICBvdmVycmlkZSBkZXN0cm95Q29tcG9uZW50KCkge1xuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKE1PVVNFX0VWRU5ULCB0aGlzLmNsaWNrTGlzdGVuZXIhKTtcbiAgICAgIC8vIERpc3Bvc2luZyBmaXJzdCByZXN0b3JlcyBjb21wb25lbnRFbCB0byB3aGVyZSBpdCBsaXZlZCBiZWZvcmUgdGhlXG4gICAgICAvLyBEb21Qb3J0YWwgbW92ZWQgaXQgKGl0cyBvd24gYW5jaG9yLWJhc2VkIHRlYXJkb3duKSDigJQgZG9pbmcgdGhpc1xuICAgICAgLy8gQUZURVIgZGVzdHJveWluZyB0aGUgQW5ndWxhciBjb21wb25lbnQgd291bGQgaW5zdGVhZCByZS1pbnNlcnQgYW5cbiAgICAgIC8vIGFscmVhZHktZGVzdHJveWVkLCBpbmVydCBET00gbm9kZSBiYWNrIGludG8gdGhlIHBhZ2UuXG4gICAgICB0aGlzLm92ZXJsYXlSZWY/LmRpc3Bvc2UoKTtcbiAgICAgIHRoaXMub3ZlcmxheVJlZiA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMub3ZlcmxheVBvc2l0aW9uU3RyYXRlZ3kgPSB1bmRlZmluZWQ7XG4gICAgICBpZiAodGhpcy5vdmVybGF5QW5jaG9yRWwpIHtcbiAgICAgICAgdGhpcy5yZW5kZXJlcjIucmVtb3ZlQ2hpbGQodGhpcy5ob3N0RWwubmF0aXZlRWxlbWVudCwgdGhpcy5vdmVybGF5QW5jaG9yRWwpO1xuICAgICAgICB0aGlzLm92ZXJsYXlBbmNob3JFbCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHN1cGVyLmRlc3Ryb3lDb21wb25lbnQoKTtcbiAgICB9XG4gIH1cblxuXG5leHBvcnQgY29uc3QgQnViYmxlVG9vbGJveFByb3h5ID0ge1xuICBCdWJibGVUb29sYm94XG59Il19
@@ -18,6 +18,13 @@ export class RichtextToolboxDirective {
18
18
  this.rtEditorClass = '';
19
19
  this.rtBreakOnEnter = false;
20
20
  this.rtAllowImages = false;
21
+ /**
22
+ * `rtType="bubble"` only: portals the floating toolbar through a CDK
23
+ * Overlay instead of appending it as a plain `position:absolute` child of
24
+ * the editor. Needed when the editor lives inside a scrollable/clipping
25
+ * ancestor (e.g. a list row) — see BubbleToolbox for the full rationale.
26
+ */
27
+ this.rtBubbleOverlay = false;
21
28
  this.inputChange = new EventEmitter();
22
29
  this.inputEnter = new EventEmitter();
23
30
  this.inputEscape = new EventEmitter();
@@ -141,13 +148,13 @@ export class RichtextToolboxDirective {
141
148
  getToolbox(type) {
142
149
  switch (type) {
143
150
  case 'bubble':
144
- return new BubbleToolboxProxy.BubbleToolbox(this.injector);
151
+ return new BubbleToolboxProxy.BubbleToolbox(this.injector, this.rtBubbleOverlay);
145
152
  case 'topbar':
146
153
  return new TopbarToolboxProxy.TopbarToolbox(this.injector);
147
154
  }
148
155
  }
149
156
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.7", ngImport: i0, type: RichtextToolboxDirective, deps: [{ token: i0.Injector }], target: i0.ɵɵFactoryTarget.Directive }); }
150
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.7", type: RichtextToolboxDirective, selector: "[askRichtextToolbox]", inputs: { rtPlaceholder: "rtPlaceholder", rtTools: "rtTools", rtDisabledTools: "rtDisabledTools", rtType: "rtType", rtToolbarOnly: "rtToolbarOnly", rtMaxlength: "rtMaxlength", rtToolbarClass: "rtToolbarClass", rtEditorClass: "rtEditorClass", rtBreakOnEnter: "rtBreakOnEnter", rtAllowImages: "rtAllowImages", rtShortcutTemplate: "rtShortcutTemplate" }, outputs: { inputChange: "inputChange", inputEnter: "inputEnter", inputEscape: "inputEscape", inputFocus: "inputFocus", toolChange: "toolChange" }, providers: [
157
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.7", type: RichtextToolboxDirective, selector: "[askRichtextToolbox]", inputs: { rtPlaceholder: "rtPlaceholder", rtTools: "rtTools", rtDisabledTools: "rtDisabledTools", rtType: "rtType", rtToolbarOnly: "rtToolbarOnly", rtMaxlength: "rtMaxlength", rtToolbarClass: "rtToolbarClass", rtEditorClass: "rtEditorClass", rtBreakOnEnter: "rtBreakOnEnter", rtAllowImages: "rtAllowImages", rtBubbleOverlay: "rtBubbleOverlay", rtShortcutTemplate: "rtShortcutTemplate" }, outputs: { inputChange: "inputChange", inputEnter: "inputEnter", inputEscape: "inputEscape", inputFocus: "inputFocus", toolChange: "toolChange" }, providers: [
151
158
  {
152
159
  multi: true,
153
160
  provide: NG_VALUE_ACCESSOR,
@@ -187,6 +194,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.7", ngImpor
187
194
  type: Input
188
195
  }], rtAllowImages: [{
189
196
  type: Input
197
+ }], rtBubbleOverlay: [{
198
+ type: Input
190
199
  }], rtShortcutTemplate: [{
191
200
  type: Input
192
201
  }], inputChange: [{
@@ -200,4 +209,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.7", ngImpor
200
209
  }], toolChange: [{
201
210
  type: Output
202
211
  }] } });
203
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmljaHRleHQtdG9vbGJveC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hc2tzdWl0ZS1jaXRydXMvc3JjL2xpYi9kaXJlY3RpdmVzL3JpY2h0ZXh0LXRvb2xib3gvcmljaHRleHQtdG9vbGJveC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxZQUFZLEVBRVosS0FBSyxFQUVMLE1BQU0sRUFFTixVQUFVLEdBQ1gsTUFBTSxlQUFlLENBQUM7QUFNdkIsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQVUsTUFBTSxNQUFNLENBQUM7QUFDbEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBRXpFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDOztBQWlCbEUsTUFBTSxPQUFPLHdCQUF3QjtJQTJCbkMsWUFBb0IsUUFBa0I7UUFBbEIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQWxCN0Isa0JBQWEsR0FBRyxFQUFFLENBQUM7UUFDbkIsWUFBTyxHQUFhLEVBQUUsQ0FBQztRQUN2QixvQkFBZSxHQUFhLEVBQUUsQ0FBQztRQUMvQixXQUFNLEdBQWUsUUFBUSxDQUFDO1FBQzlCLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLGdCQUFXLEdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDekIsbUJBQWMsR0FBRyxFQUFFLENBQUM7UUFDcEIsa0JBQWEsR0FBRyxFQUFFLENBQUM7UUFDbkIsbUJBQWMsR0FBRyxLQUFLLENBQUM7UUFDdkIsa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFHckIsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFB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QVc7c0JBQXBCLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRGlyZWN0aXZlLFxuICBFdmVudEVtaXR0ZXIsXG4gIEluamVjdG9yLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIGZvcndhcmRSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgVG9vbEtleXMsXG4gIFRvb2xMYXlvdXQsXG4gIFRvb2xzU3RhdGUsXG59IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcmljaHRleHQtdG9vbGJveC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmlsdGVyIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBhcmVPYmplY3RzRXF1YWwgfSBmcm9tICcuLi8uLi9oZWxwZXJzL2FyZS1vYmplY3RzLWVxdWFsLmhlbHBlcic7XG5pbXBvcnQgeyBUb29sYm94IH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy90b29sYm94JztcbmltcG9ydCB7IEJ1YmJsZVRvb2xib3hQcm94eSB9IGZyb20gJy4uLy4uL2NsYXNzZXMvYnViYmxlLXRvb2xib3gnO1xuaW1wb3J0IHsgVG9wYmFyVG9vbGJveFByb3h5IH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy90b3BiYXItdG9vbGJveCc7XG5cbmV4cG9ydCB0eXBlIFNob3J0Y3V0VGVtcGxhdGUgPSB7XG4gIGtleTogc3RyaW5nO1xuICB0ZW1wbGF0ZTogc3RyaW5nO1xufVxuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbYXNrUmljaHRleHRUb29sYm94XScsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBSaWNodGV4dFRvb2xib3hEaXJlY3RpdmUpLFxuICAgIH0sXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIFJpY2h0ZXh0VG9vbGJveERpcmVjdGl2ZVxuICBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgQ29udHJvbFZhbHVlQWNjZXNzb3JcbntcbiAgcHJpdmF0ZSB0b29sYm94PzogVG9vbGJveDtcblxuICBwcml2YXRlIG9uQ2hhbmdlITogKHZhbHVlOiBzdHJpbmcpID0+IHZvaWQ7XG4gIHByaXZhdGUgb25Ub3VjaGVkITogKCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG5cbiAgQElucHV0KCkgcnRQbGFjZWhvbGRlciA9ICcnO1xuICBASW5wdXQoKSBydFRvb2xzOiBUb29sS2V5cyA9IFtdO1xuICBASW5wdXQoKSBydERpc2FibGVkVG9vbHM6IFRvb2xLZXlzID0gW107XG4gIEBJbnB1dCgpIHJ0VHlwZTogVG9vbExheW91dCA9ICd0b3BiYXInO1xuICBASW5wdXQoKSBydFRvb2xiYXJPbmx5ID0gZmFsc2U7XG4gIEBJbnB1dCgpIHJ0TWF4bGVuZ3RoOiBudW1iZXIgPSAtMTtcbiAgQElucHV0KCkgcnRUb29sYmFyQ2xhc3MgPSAnJztcbiAgQElucHV0KCkgcnRFZGl0b3JDbGFzcyA9ICcnO1xuICBASW5wdXQoKSBydEJyZWFrT25FbnRlciA9IGZhbHNlO1xuICBASW5wdXQoKSBydEFsbG93SW1hZ2VzID0gZmFsc2U7XG4gIEBJbnB1dCgpIHJ0U2hvcnRjdXRUZW1wbGF0ZT86ICBTaG9ydGN1dFRlbXBsYXRlO1xuXG4gIEBPdXRwdXQoKSBpbnB1dENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICBAT3V0cHV0KCkgaW5wdXRFbnRlciA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIGlucHV0RXNjYXBlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgaW5wdXRGb2N1cyA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHRvb2xDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFRvb2xzU3RhdGU+KCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IpIHt9XG5cbiAgbmdPbkNoYW5nZXMoc3A6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZiAoc3BbJ3J0VHlwZSddKSB7XG4gICAgICB0aGlzLnByZXBhcmVUb29sYmFyKCk7XG4gICAgfVxuXG4gICAgaWYgKHNwWydydFBsYWNlaG9sZGVyJ10pIHtcbiAgICAgIHRoaXMudG9vbGJveD8ucmljaHRleHRXcmFwcGVyLnNldFBsYWNlaG9sZGVyKHRoaXMucnRQbGFjZWhvbGRlcik7XG4gICAgfVxuICAgIGlmIChzcFsncnRUb29sYmFyT25seSddKSB7XG4gICAgICB0aGlzLnRvb2xib3g/LnRvZ2dsZUlucHV0RGlzcGxheSghdGhpcy5ydFRvb2xiYXJPbmx5KVxuICAgIH1cblxuICAgIGlmKHNwWydydE1heGxlbmd0aCddKXtcbiAgICAgIHRoaXMudG9vbGJveD8ucmljaHRleHRXcmFwcGVyLnNldE1heExlbmd0aCh0aGlzLnJ0TWF4bGVuZ3RoKTtcbiAgICB9XG5cbiAgICBpZihzcFsncnRBbGxvd0ltYWdlcyddKXtcbiAgICAgIHRoaXMudG9vbGJveD8ucmljaHRleHRXcmFwcGVyLnNldEFsbG93SW1hZ2VzKHRoaXMucnRBbGxvd0ltYWdlcyk7XG4gICAgfVxuXG4gICAgaWYgKHNwWydydERpc2FibGVkVG9vbHMnXSB8fCBzcFsncnRUb29scyddIHx8IHNwWydydFRvb2xiYXJDbGFzcyddKSB7XG4gICAgICB0aGlzLnRvb2xib3g/LnNldFRvb2xJbnB1dCh7XG4gICAgICAgIGF2YWlsYWJsZVRvb2xzOiB0aGlzLnJ0VG9vbHMsXG4gICAgICAgIGRpc2FibGVkVG9vbHM6IHRoaXMucnREaXNhYmxlZFRvb2xzLFxuICAgICAgICBjbGFzczogdGhpcy5ydFRvb2xiYXJDbGFzcyxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYoc3BbJ3J0RWRpdG9yQ2xhc3MnXSl7XG4gICAgICB0aGlzLnRvb2xib3g/LnJpY2h0ZXh0V3JhcHBlci5zZXRFZGl0b3JDbGFzcyh0aGlzLnJ0RWRpdG9yQ2xhc3MpO1xuICAgIH1cblxuICAgIGlmKHNwWydydEJyZWFrT25FbnRlciddKXtcbiAgICAgIHRoaXMudG9vbGJveD8ucmljaHRleHRXcmFwcGVyLnNldEJyZWFrT25FbnRlcih0aGlzLnJ0QnJlYWtPbkVudGVyKTtcbiAgICB9XG5cbiAgICBpZihzcFsncnRTaG9ydGN1dFRlbXBsYXRlJ10gJiYgdGhpcy5ydFNob3J0Y3V0VGVtcGxhdGUpe1xuICAgICAgdGhpcy50b29sYm94Py5yaWNodGV4dFdyYXBwZXIuc2V0U2hvcnRjdXRUZW1wbGF0ZShcbiAgICAgICAgdGhpcy5ydFNob3J0Y3V0VGVtcGxhdGUhLmtleSxcbiAgICAgICAgdGhpcy5ydFNob3J0Y3V0VGVtcGxhdGUhLnRlbXBsYXRlXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuZGVzdHJveUFsbCgpO1xuICB9XG5cbiAgZm9jdXMoKSB7XG4gICAgdGhpcy50b29sYm94Py5yaWNodGV4dFdyYXBwZXIuZm9jdXMoKTtcbiAgfVxuXG4gIGdldFRleHRMZW5ndGgoKXtcbiAgICByZXR1cm4gdGhpcy50b29sYm94Py5yaWNodGV4dFdyYXBwZXIuZ2V0VGV4dExlbmd0aCgpO1xuICB9XG5cbiAgLy9DVkFcblxuICB3cml0ZVZhbHVlKHRleHQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMudG9vbGJveD8ucmljaHRleHRXcmFwcGVyLnNldFRleHQodGV4dCk7XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmIChpc0Rpc2FibGVkKSB0aGlzLnRvb2xib3g/LnJpY2h0ZXh0V3JhcHBlci5kaXNhYmxlKCk7XG4gICAgZWxzZSB0aGlzLnRvb2xib3g/LnJpY2h0ZXh0V3JhcHBlci5lbmFibGUoKTtcbiAgfVxuXG4gIGdldEN1cnJlbnRDdXJzb3JQb3NpdGlvbigpe1xuICAgIHJldHVybiB0aGlzLnRvb2xib3g/LnJpY2h0ZXh0V3JhcHBlci5nZXRDdXJyZW50Q3Vyc29yUG9zaXRpb24oKTtcbiAgfVxuXG4gIHNldEN1cnNvclBvc2l0aW9uKHBvc2l0aW9uOiBudW1iZXIpe1xuICAgIHJldHVybiB0aGlzLnRvb2xib3g/LnJpY2h0ZXh0V3JhcHBlci5zZXRDdXJzb3JQb3NpdGlvbihwb3NpdGlvbik7XG4gIH1cblxuICBwdWJsaWMgZ2V0VGV4dFdpdGhvdXRIdG1sVGFncygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRvb2xib3g/LnJpY2h0ZXh0V3JhcHBlci5nZXRUZXh0V2l0aG91dEh0bWxUYWdzKCkgfHwgJyc7XG4gIH1cblxuICBwdWJsaWMgaW5zZXJ0VGV4dChpbmRleDogbnVtYmVyLCB0ZXh0OiBzdHJpbmcsIGVtaXRFdmVudCA9IHRydWUpe1xuICAgIHRoaXMudG9vbGJveD8ucmljaHRleHRXcmFwcGVyLmluc2VydFRleHQoaW5kZXgsIHRleHQsIGVtaXRFdmVudCk7XG4gIH1cblxuICBwcml2YXRlIHByZXBhcmVUb29sYmFyKCl7XG4gICAgaWYgKHRoaXMudG9vbGJveCkgdGhpcy5kZXN0cm95QWxsKCk7XG5cbiAgICB0aGlzLnRvb2xib3ggPSB0aGlzLmdlbmVyYXRlVG9vbGJveExheW91dCh0aGlzLnJ0VHlwZSk7XG4gICAgdGhpcy5wcmVwYXJlTGlzdGVuZXJzKHRoaXMudG9vbGJveCk7XG4gIH1cblxuICBwcml2YXRlIHByZXBhcmVMaXN0ZW5lcnModG9vbGJveDogVG9vbGJveCkge1xuICAgIGlmKHRoaXMuc3Vic2NyaXB0aW9uKSB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uLmFkZCh0b29sYm94LnJpY2h0ZXh0V3JhcHBlci5saXN0ZW5UZXh0Q2hhbmdlcyRcbiAgICAuc3Vic2NyaWJlKCh2KT0+e3RoaXMudXBkYXRlKHYpfSkpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uLmFkZCh0b29sYm94LnJpY2h0ZXh0V3JhcHBlci5saXN0ZW5PblRvdWNoZWQkLnN1YnNjcmliZSgodG91Y2hlZCk9PntcbiAgICAgIHRoaXMub25Ub3VjaGVkKClcbiAgICAgIHRoaXMuaW5wdXRGb2N1cy5lbWl0KHRvdWNoZWQpO1xuICAgIH0pKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi5hZGQodG9vbGJveC5yaWNodGV4dFdyYXBwZXIubGlzdGVuRW50ZXIkLnN1YnNjcmliZSgoKT0+e3RoaXMuaW5wdXRFbnRlci5lbWl0KCl9KSk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKHRvb2xib3gucmljaHRleHRXcmFwcGVyLmxpc3RlbkVzY2FwZSQuc3Vic2NyaWJlKCgpPT57dGhpcy5pbnB1dEVzY2FwZS5lbWl0KCl9KSk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKHRvb2xib3gucmljaHRleHRXcmFwcGVyLnN0YXRlJFxuICAgICAgLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKGEsIGIpID0+IGFyZU9iamVjdHNFcXVhbChhLCBiKSkpXG4gICAgICAuc3Vic2NyaWJlKChzdGF0ZSk9Pnt0aGlzLnRvb2xDaGFuZ2UuZW1pdChzdGF0ZSl9KSlcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlKHZhbHVlOiBzdHJpbmcpe1xuICAgIHRoaXMuaW5wdXRDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gICAgdGhpcy5vbkNoYW5nZSh2YWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIGRlc3Ryb3lBbGwoKSB7XG4gICAgdGhpcy50b29sYm94Py5kZXN0cm95QWxsKCk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwcml2YXRlIGdlbmVyYXRlVG9vbGJveExheW91dCh0eXBlOiBUb29sTGF5b3V0KSB7XG4gICAgY29uc3QgdG9vbGJveCA9IHRoaXMuZ2V0VG9vbGJveCh0eXBlKTtcbiAgICB0b29sYm94LnJpY2h0ZXh0V3JhcHBlci5zZXRQbGFjZWhvbGRlcih0aGlzLnJ0UGxhY2Vob2xkZXIpO1xuICAgIHRvb2xib3guc2V0VG9vbElucHV0KHtcbiAgICAgIGF2YWlsYWJsZVRvb2xzOiB0aGlzLnJ0VG9vbHMsXG4gICAgICBkaXNhYmxlZFRvb2xzOiB0aGlzLnJ0RGlzYWJsZWRUb29scyxcbiAgICAgIGNsYXNzOiB0aGlzLnJ0VG9vbGJhckNsYXNzLFxuICAgIH0pXG4gICAgdG9vbGJveC50b2dnbGVJbnB1dERpc3BsYXkoIXRoaXMucnRUb29sYmFyT25seSlcbiAgICB0b29sYm94LnJpY2h0ZXh0V3JhcHBlci5zZXRNYXhMZW5ndGgodGhpcy5ydE1heGxlbmd0aCk7XG4gICAgdG9vbGJveC5yaWNodGV4dFdyYXBwZXIuc2V0QWxsb3dJbWFnZXModGhpcy5ydEFsbG93SW1hZ2VzKTtcbiAgICB0b29sYm94LnJpY2h0ZXh0V3JhcHBlci5zZXRFZGl0b3JDbGFzcyh0aGlzLnJ0RWRpdG9yQ2xhc3MpO1xuICAgIHJldHVybiB0b29sYm94O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRUb29sYm94KHR5cGU6IFRvb2xMYXlvdXQpe1xuICAgIHN3aXRjaCh0eXBlKXtcbiAgICAgIGNhc2UgJ2J1YmJsZSc6XG4gICAgICAgIHJldHVybiBuZXcgQnViYmxlVG9vbGJveFByb3h5LkJ1YmJsZVRvb2xib3godGhpcy5pbmplY3Rvcik7XG4gICAgICBjYXNlICd0b3BiYXInOlxuICAgICAgICByZXR1cm4gbmV3IFRvcGJhclRvb2xib3hQcm94eS5Ub3BiYXJUb29sYm94KHRoaXMuaW5qZWN0b3IpO1xuICAgIH1cbiAgfVxufVxuIl19
212
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmljaHRleHQtdG9vbGJveC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hc2tzdWl0ZS1jaXRydXMvc3JjL2xpYi9kaXJlY3RpdmVzL3JpY2h0ZXh0LXRvb2xib3gvcmljaHRleHQtdG9vbGJveC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxZQUFZLEVBRVosS0FBSyxFQUVMLE1BQU0sRUFFTixVQUFVLEdBQ1gsTUFBTSxlQUFlLENBQUM7QUFNdkIsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQVUsTUFBTSxNQUFNLENBQUM7QUFDbEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBRXpFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDOztBQWlCbEUsTUFBTSxPQUFPLHdCQUF3QjtJQWtDbkMsWUFBb0IsUUFBa0I7UUFBbEIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQXpCN0Isa0JBQWEsR0FBRyxFQUFFLENBQUM7UUFDbkIsWUFBTyxHQUFhLEVBQUUsQ0FBQztRQUN2QixvQkFBZSxHQUFhLEVBQUUsQ0FBQztRQUMvQixXQUFNLEdBQWUsUUFBUSxDQUFDO1FBQzlCLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLGdCQUFXLEdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDekIsbUJBQWMsR0FBRyxFQUFFLENBQUM7UUFDcEIsa0JBQWEsR0FBRyxFQUFFLENBQUM7UUFDbkIsbUJBQWMsR0FBRyxLQUFLLENBQUM7UUFDdkIsa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFDL0I7Ozs7O1dBS0c7UUFDTSxvQkFBZSxHQUFH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S0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBRUksV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRGlyZWN0aXZlLFxuICBFdmVudEVtaXR0ZXIsXG4gIEluamVjdG9yLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIGZvcndhcmRSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgVG9vbEtleXMsXG4gIFRvb2xMYXlvdXQsXG4gIFRvb2xzU3RhdGUsXG59IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcmljaHRleHQtdG9vbGJveC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmlsdGVyIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBhcmVPYmplY3RzRXF1YWwgfSBmcm9tICcuLi8uLi9oZWxwZXJzL2FyZS1vYmplY3RzLWVxdWFsLmhlbHBlcic7XG5pbXBvcnQgeyBUb29sYm94IH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy90b29sYm94JztcbmltcG9ydCB7IEJ1YmJsZVRvb2xib3hQcm94eSB9IGZyb20gJy4uLy4uL2NsYXNzZXMvYnViYmxlLXRvb2xib3gnO1xuaW1wb3J0IHsgVG9wYmFyVG9vbGJveFByb3h5IH0gZnJvbSAnLi4vLi4vY2xhc3Nlcy90b3BiYXItdG9vbGJveCc7XG5cbmV4cG9ydCB0eXBlIFNob3J0Y3V0VGVtcGxhdGUgPSB7XG4gIGtleTogc3RyaW5nO1xuICB0ZW1wbGF0ZTogc3RyaW5nO1xufVxuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbYXNrUmljaHRleHRUb29sYm94XScsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBSaWNodGV4dFRvb2xib3hEaXJlY3RpdmUpLFxuICAgIH0sXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIFJpY2h0ZXh0VG9vbGJveERpcmVjdGl2ZVxuICBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgQ29udHJvbFZhbHVlQWNjZXNzb3JcbntcbiAgcHJpdmF0ZSB0b29sYm94PzogVG9vbGJveDtcblxuICBwcml2YXRlIG9uQ2hhbmdlITogKHZhbHVlOiBzdHJpbmcpID0+IHZvaWQ7XG4gIHByaXZhdGUgb25Ub3VjaGVkITogKCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG5cbiAgQElucHV0KCkgcnRQbGFjZWhvbGRlciA9ICcnO1xuICBASW5wdXQoKSBydFRvb2xzOiBUb29sS2V5cyA9IFtdO1xuICBASW5wdXQoKSBydERpc2FibGVkVG9vbHM6IFRvb2xLZXlzID0gW107XG4gIEBJbnB1dCgpIHJ0VHlwZTogVG9vbExheW91dCA9ICd0b3BiYXInO1xuICBASW5wdXQoKSBydFRvb2xiYXJPbmx5ID0gZmFsc2U7XG4gIEBJbnB1dCgpIHJ0TWF4bGVuZ3RoOiBudW1iZXIgPSAtMTtcbiAgQElucHV0KCkgcnRUb29sYmFyQ2xhc3MgPSAnJztcbiAgQElucHV0KCkgcnRFZGl0b3JDbGFzcyA9ICcnO1xuICBASW5wdXQoKSBydEJyZWFrT25FbnRlciA9IGZhbHNlO1xuICBASW5wdXQoKSBydEFsbG93SW1hZ2VzID0gZmFsc2U7XG4gIC8qKlxuICAgKiBgcnRUeXBlPVwiYnViYmxlXCJgIG9ubHk6IHBvcnRhbHMgdGhlIGZsb2F0aW5nIHRvb2xiYXIgdGhyb3VnaCBhIENES1xuICAgKiBPdmVybGF5IGluc3RlYWQgb2YgYXBwZW5kaW5nIGl0IGFzIGEgcGxhaW4gYHBvc2l0aW9uOmFic29sdXRlYCBjaGlsZCBvZlxuICAgKiB0aGUgZWRpdG9yLiBOZWVkZWQgd2hlbiB0aGUgZWRpdG9yIGxpdmVzIGluc2lkZSBhIHNjcm9sbGFibGUvY2xpcHBpbmdcbiAgICogYW5jZXN0b3IgKGUuZy4gYSBsaXN0IHJvdykg4oCUIHNlZSBCdWJibGVUb29sYm94IGZvciB0aGUgZnVsbCByYXRpb25hbGUuXG4gICAqL1xuICBASW5wdXQoKSBydEJ1YmJsZU92ZXJsYXkgPSBmYWxzZTtcbiAgQElucHV0KCkgcnRTaG9ydGN1dFRlbXBsYXRlPzogIFNob3J0Y3V0VGVtcGxhdGU7XG5cbiAgQE91dHB1dCgpIGlucHV0Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIEBPdXRwdXQoKSBpbnB1dEVudGVyID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgaW5wdXRFc2NhcGUgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBpbnB1dEZvY3VzID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgdG9vbENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8VG9vbHNTdGF0ZT4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGluamVjdG9yOiBJbmplY3Rvcikge31cblxuICBuZ09uQ2hhbmdlcyhzcDogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChzcFsncnRUeXBlJ10pIHtcbiAgICAgIHRoaXMucHJlcGFyZVRvb2xiYXIoKTtcbiAgICB9XG5cbiAgICBpZiAoc3BbJ3J0UGxhY2Vob2xkZXInXSkge1xuICAgICAgdGhpcy50b29sYm94Py5yaWNodGV4dFdyYXBwZXIuc2V0UGxhY2Vob2xkZXIodGhpcy5ydFBsYWNlaG9sZGVyKTtcbiAgICB9XG4gICAgaWYgKHNwWydydFRvb2xiYXJPbmx5J10pIHtcbiAgICAgIHRoaXMudG9vbGJveD8udG9nZ2xlSW5wdXREaXNwbGF5KCF0aGlzLnJ0VG9vbGJhck9ubHkpXG4gICAgfVxuXG4gICAgaWYoc3BbJ3J0TWF4bGVuZ3RoJ10pe1xuICAgICAgdGhpcy50b29sYm94Py5yaWNodGV4dFdyYXBwZXIuc2V0TWF4TGVuZ3RoKHRoaXMucnRNYXhsZW5ndGgpO1xuICAgIH1cblxuICAgIGlmKHNwWydydEFsbG93SW1hZ2VzJ10pe1xuICAgICAgdGhpcy50b29sYm94Py5yaWNodGV4dFdyYXBwZXIuc2V0QWxsb3dJbWFnZXModGhpcy5ydEFsbG93SW1hZ2VzKTtcbiAgICB9XG5cbiAgICBpZiAoc3BbJ3J0RGlzYWJsZWRUb29scyddIHx8IHNwWydydFRvb2xzJ10gfHwgc3BbJ3J0VG9vbGJhckNsYXNzJ10pIHtcbiAgICAgIHRoaXMudG9vbGJveD8uc2V0VG9vbElucHV0KHtcbiAgICAgICAgYXZhaWxhYmxlVG9vbHM6IHRoaXMucnRUb29scyxcbiAgICAgICAgZGlzYWJsZWRUb29sczogdGhpcy5ydERpc2FibGVkVG9vbHMsXG4gICAgICAgIGNsYXNzOiB0aGlzLnJ0VG9vbGJhckNsYXNzLFxuICAgICAgfSlcbiAgICB9XG5cbiAgICBpZihzcFsncnRFZGl0b3JDbGFzcyddKXtcbiAgICAgIHRoaXMudG9vbGJveD8ucmljaHRleHRXcmFwcGVyLnNldEVkaXRvckNsYXNzKHRoaXMucnRFZGl0b3JDbGFzcyk7XG4gICAgfVxuXG4gICAgaWYoc3BbJ3J0QnJlYWtPbkVudGVyJ10pe1xuICAgICAgdGhpcy50b29sYm94Py5yaWNodGV4dFdyYXBwZXIuc2V0QnJlYWtPbkVudGVyKHRoaXMucnRCcmVha09uRW50ZXIpO1xuICAgIH1cblxuICAgIGlmKHNwWydydFNob3J0Y3V0VGVtcGxhdGUnXSAmJiB0aGlzLnJ0U2hvcnRjdXRUZW1wbGF0ZSl7XG4gICAgICB0aGlzLnRvb2xib3g/LnJpY2h0ZXh0V3JhcHBlci5zZXRTaG9ydGN1dFRlbXBsYXRlKFxuICAgICAgICB0aGlzLnJ0U2hvcnRjdXRUZW1wbGF0ZSEua2V5LFxuICAgICAgICB0aGlzLnJ0U2hvcnRjdXRUZW1wbGF0ZSEudGVtcGxhdGVcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5kZXN0cm95QWxsKCk7XG4gIH1cblxuICBmb2N1cygpIHtcbiAgICB0aGlzLnRvb2xib3g/LnJpY2h0ZXh0V3JhcHBlci5mb2N1cygpO1xuICB9XG5cbiAgZ2V0VGV4dExlbmd0aCgpe1xuICAgIHJldHVybiB0aGlzLnRvb2xib3g/LnJpY2h0ZXh0V3JhcHBlci5nZXRUZXh0TGVuZ3RoKCk7XG4gIH1cblxuICAvL0NWQVxuXG4gIHdyaXRlVmFsdWUodGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy50b29sYm94Py5yaWNodGV4dFdyYXBwZXIuc2V0VGV4dCh0ZXh0KTtcbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKGlzRGlzYWJsZWQpIHRoaXMudG9vbGJveD8ucmljaHRleHRXcmFwcGVyLmRpc2FibGUoKTtcbiAgICBlbHNlIHRoaXMudG9vbGJveD8ucmljaHRleHRXcmFwcGVyLmVuYWJsZSgpO1xuICB9XG5cbiAgZ2V0Q3VycmVudEN1cnNvclBvc2l0aW9uKCl7XG4gICAgcmV0dXJuIHRoaXMudG9vbGJveD8ucmljaHRleHRXcmFwcGVyLmdldEN1cnJlbnRDdXJzb3JQb3NpdGlvbigpO1xuICB9XG5cbiAgc2V0Q3Vyc29yUG9zaXRpb24ocG9zaXRpb246IG51bWJlcil7XG4gICAgcmV0dXJuIHRoaXMudG9vbGJveD8ucmljaHRleHRXcmFwcGVyLnNldEN1cnNvclBvc2l0aW9uKHBvc2l0aW9uKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRUZXh0V2l0aG91dEh0bWxUYWdzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudG9vbGJveD8ucmljaHRleHRXcmFwcGVyLmdldFRleHRXaXRob3V0SHRtbFRhZ3MoKSB8fCAnJztcbiAgfVxuXG4gIHB1YmxpYyBpbnNlcnRUZXh0KGluZGV4OiBudW1iZXIsIHRleHQ6IHN0cmluZywgZW1pdEV2ZW50ID0gdHJ1ZSl7XG4gICAgdGhpcy50b29sYm94Py5yaWNodGV4dFdyYXBwZXIuaW5zZXJ0VGV4dChpbmRleCwgdGV4dCwgZW1pdEV2ZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgcHJlcGFyZVRvb2xiYXIoKXtcbiAgICBpZiAodGhpcy50b29sYm94KSB0aGlzLmRlc3Ryb3lBbGwoKTtcblxuICAgIHRoaXMudG9vbGJveCA9IHRoaXMuZ2VuZXJhdGVUb29sYm94TGF5b3V0KHRoaXMucnRUeXBlKTtcbiAgICB0aGlzLnByZXBhcmVMaXN0ZW5lcnModGhpcy50b29sYm94KTtcbiAgfVxuXG4gIHByaXZhdGUgcHJlcGFyZUxpc3RlbmVycyh0b29sYm94OiBUb29sYm94KSB7XG4gICAgaWYodGhpcy5zdWJzY3JpcHRpb24pIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKHRvb2xib3gucmljaHRleHRXcmFwcGVyLmxpc3RlblRleHRDaGFuZ2VzJFxuICAgIC5zdWJzY3JpYmUoKHYpPT57dGhpcy51cGRhdGUodil9KSk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKHRvb2xib3gucmljaHRleHRXcmFwcGVyLmxpc3Rlbk9uVG91Y2hlZCQuc3Vic2NyaWJlKCh0b3VjaGVkKT0+e1xuICAgICAgdGhpcy5vblRvdWNoZWQoKVxuICAgICAgdGhpcy5pbnB1dEZvY3VzLmVtaXQodG91Y2hlZCk7XG4gICAgfSkpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uLmFkZCh0b29sYm94LnJpY2h0ZXh0V3JhcHBlci5saXN0ZW5FbnRlciQuc3Vic2NyaWJlKCgpPT57dGhpcy5pbnB1dEVudGVyLmVtaXQoKX0pKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi5hZGQodG9vbGJveC5yaWNodGV4dFdyYXBwZXIubGlzdGVuRXNjYXBlJC5zdWJzY3JpYmUoKCk9Pnt0aGlzLmlucHV0RXNjYXBlLmVtaXQoKX0pKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi5hZGQodG9vbGJveC5yaWNodGV4dFdyYXBwZXIuc3RhdGUkXG4gICAgICAucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgoYSwgYikgPT4gYXJlT2JqZWN0c0VxdWFsKGEsIGIpKSlcbiAgICAgIC5zdWJzY3JpYmUoKHN0YXRlKT0+e3RoaXMudG9vbENoYW5nZS5lbWl0KHN0YXRlKX0pKVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGUodmFsdWU6IHN0cmluZyl7XG4gICAgdGhpcy5pbnB1dENoYW5nZS5lbWl0KHZhbHVlKTtcbiAgICB0aGlzLm9uQ2hhbmdlKHZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgZGVzdHJveUFsbCgpIHtcbiAgICB0aGlzLnRvb2xib3g/LmRlc3Ryb3lBbGwoKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2VuZXJhdGVUb29sYm94TGF5b3V0KHR5cGU6IFRvb2xMYXlvdXQpIHtcbiAgICBjb25zdCB0b29sYm94ID0gdGhpcy5nZXRUb29sYm94KHR5cGUpO1xuICAgIHRvb2xib3gucmljaHRleHRXcmFwcGVyLnNldFBsYWNlaG9sZGVyKHRoaXMucnRQbGFjZWhvbGRlcik7XG4gICAgdG9vbGJveC5zZXRUb29sSW5wdXQoe1xuICAgICAgYXZhaWxhYmxlVG9vbHM6IHRoaXMucnRUb29scyxcbiAgICAgIGRpc2FibGVkVG9vbHM6IHRoaXMucnREaXNhYmxlZFRvb2xzLFxuICAgICAgY2xhc3M6IHRoaXMucnRUb29sYmFyQ2xhc3MsXG4gICAgfSlcbiAgICB0b29sYm94LnRvZ2dsZUlucHV0RGlzcGxheSghdGhpcy5ydFRvb2xiYXJPbmx5KVxuICAgIHRvb2xib3gucmljaHRleHRXcmFwcGVyLnNldE1heExlbmd0aCh0aGlzLnJ0TWF4bGVuZ3RoKTtcbiAgICB0b29sYm94LnJpY2h0ZXh0V3JhcHBlci5zZXRBbGxvd0ltYWdlcyh0aGlzLnJ0QWxsb3dJbWFnZXMpO1xuICAgIHRvb2xib3gucmljaHRleHRXcmFwcGVyLnNldEVkaXRvckNsYXNzKHRoaXMucnRFZGl0b3JDbGFzcyk7XG4gICAgcmV0dXJuIHRvb2xib3g7XG4gIH1cblxuICBwcml2YXRlIGdldFRvb2xib3godHlwZTogVG9vbExheW91dCl7XG4gICAgc3dpdGNoKHR5cGUpe1xuICAgICAgY2FzZSAnYnViYmxlJzpcbiAgICAgICAgcmV0dXJuIG5ldyBCdWJibGVUb29sYm94UHJveHkuQnViYmxlVG9vbGJveCh0aGlzLmluamVjdG9yLCB0aGlzLnJ0QnViYmxlT3ZlcmxheSk7XG4gICAgICBjYXNlICd0b3BiYXInOlxuICAgICAgICByZXR1cm4gbmV3IFRvcGJhclRvb2xib3hQcm94eS5Ub3BiYXJUb29sYm94KHRoaXMuaW5qZWN0b3IpO1xuICAgIH1cbiAgfVxufVxuIl19
@@ -10,9 +10,9 @@ import * as i3 from 'ngx-mask';
10
10
  import { NgxMaskDirective, NgxMaskPipe, provideNgxMask } from 'ngx-mask';
11
11
  import { debounceTime, tap, map, fromEvent, filter, BehaviorSubject, Subject, delay, Subscription, distinctUntilChanged, of, shareReplay } from 'rxjs';
12
12
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
13
- import { TemplatePortal, ComponentPortal } from '@angular/cdk/portal';
13
+ import { TemplatePortal, ComponentPortal, DomPortal } from '@angular/cdk/portal';
14
14
  import * as i1$3 from '@angular/cdk/overlay';
15
- import { CdkOverlayOrigin, CdkConnectedOverlay, OverlayModule, OverlayConfig } from '@angular/cdk/overlay';
15
+ import { Overlay, CdkOverlayOrigin, CdkConnectedOverlay, OverlayModule, OverlayConfig } from '@angular/cdk/overlay';
16
16
  import * as i3$1 from '@ngx-translate/core';
17
17
  import { TranslateModule } from '@ngx-translate/core';
18
18
  import moment from 'moment';
@@ -4227,14 +4227,57 @@ class Toolbox {
4227
4227
  const TOOLBOX_HEIGHT = 40;
4228
4228
  const MARGIN = 8;
4229
4229
  const MOUSE_EVENT = 'mouseup';
4230
+ /** Pane's top-left lands exactly at the anchor moveOverlay() positions. */
4231
+ const OVERLAY_POSITIONS = [
4232
+ { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'top' },
4233
+ ];
4230
4234
  class BubbleToolbox extends Toolbox {
4231
- constructor(injector) {
4235
+ /**
4236
+ * `useOverlay` opts into rendering through a CDK Overlay (portaled to
4237
+ * <body>) instead of a plain `position:absolute` child of the editor
4238
+ * itself. Defaults to false — the plain-append behavior is unchanged
4239
+ * for every existing consumer (e.g. the main chat-input's bubble
4240
+ * toolbar, which today renders correctly with no clipping ancestor).
4241
+ * Opt in only where the editor lives inside a `overflow:hidden/auto`
4242
+ * ancestor (e.g. a scrollable list row), which clips a plain popup
4243
+ * above its own viewport no matter the z-index — same reasoning as why
4244
+ * the economy queue's emoji picker uses a CDK Overlay instead of a
4245
+ * plain popup.
4246
+ */
4247
+ constructor(injector, useOverlay = false) {
4232
4248
  super(injector);
4249
+ this.injector = injector;
4250
+ this.useOverlay = useOverlay;
4233
4251
  }
4234
4252
  move(bounds) {
4253
+ if (this.useOverlay) {
4254
+ this.moveOverlay(bounds);
4255
+ return;
4256
+ }
4235
4257
  this.renderer2.setStyle(this.componentEl, 'top', `${bounds.top - (TOOLBOX_HEIGHT + MARGIN)}px`);
4236
4258
  this.renderer2.setStyle(this.componentEl, 'left', `${bounds.left}px`);
4237
4259
  }
4260
+ /**
4261
+ * Quill's bounds are relative to the editor's own container (`hostEl`)
4262
+ * — the SAME coordinate space the plain local-append path already uses
4263
+ * for `componentEl`'s `top`/`left` above, so the hidden anchor is moved
4264
+ * exactly the same way. The overlay connects to this anchor (a real,
4265
+ * live DOM node) rather than a bare viewport point: CDK's position
4266
+ * strategy re-queries an anchor's `getBoundingClientRect()` fresh on
4267
+ * every reposition, but a bare point origin is a one-time snapshot that
4268
+ * never changes — `reposition()`'s scroll listener would still fire,
4269
+ * but it'd just keep reapplying those same stale coordinates, leaving
4270
+ * the toolbar stuck at its original screen position once a scrollable
4271
+ * ancestor (e.g. the economy queue's list) actually scrolls, exactly
4272
+ * where this overlay path is needed most.
4273
+ */
4274
+ moveOverlay(bounds) {
4275
+ if (!this.overlayAnchorEl)
4276
+ return;
4277
+ this.renderer2.setStyle(this.overlayAnchorEl, 'top', `${bounds.top - (TOOLBOX_HEIGHT + MARGIN)}px`);
4278
+ this.renderer2.setStyle(this.overlayAnchorEl, 'left', `${bounds.left}px`);
4279
+ this.overlayRef?.updatePosition();
4280
+ }
4238
4281
  listenOutsideClicks() {
4239
4282
  this.clickListener = (event) => {
4240
4283
  if (!this.componentEl?.contains(event.target)
@@ -4260,11 +4303,64 @@ class BubbleToolbox extends Toolbox {
4260
4303
  displayComponent() {
4261
4304
  super.displayComponent();
4262
4305
  this.listenOutsideClicks();
4263
- this.renderer2.appendChild(this.hostEl?.nativeElement, this.componentEl);
4306
+ if (this.useOverlay) {
4307
+ // Makes hostEl the anchor's containing block regardless of whatever
4308
+ // the consumer's own CSS happens to do — neither Quill's nor
4309
+ // citrus's stylesheets put `position` on the editor container
4310
+ // (`.ql-container`), so without this the anchor's top/left would
4311
+ // resolve against whichever ancestor further up happens to be
4312
+ // positioned instead, silently offsetting it.
4313
+ this.renderer2.setStyle(this.hostEl.nativeElement, 'position', 'relative');
4314
+ this.overlayAnchorEl = this.renderer2.createElement('span');
4315
+ this.renderer2.setStyle(this.overlayAnchorEl, 'position', 'absolute');
4316
+ this.renderer2.setStyle(this.overlayAnchorEl, 'width', '1px');
4317
+ this.renderer2.setStyle(this.overlayAnchorEl, 'height', '1px');
4318
+ this.renderer2.setStyle(this.overlayAnchorEl, 'visibility', 'hidden');
4319
+ this.renderer2.setStyle(this.overlayAnchorEl, 'pointer-events', 'none');
4320
+ // Appended before the overlay is created so CDK's ancestor-scroll
4321
+ // detection (run at attach time) walks up from where the anchor
4322
+ // actually lives in the DOM, not from a detached node.
4323
+ this.renderer2.appendChild(this.hostEl.nativeElement, this.overlayAnchorEl);
4324
+ const overlay = this.injector.get(Overlay);
4325
+ this.overlayPositionStrategy = overlay.position()
4326
+ .flexibleConnectedTo(this.overlayAnchorEl)
4327
+ .withPositions(OVERLAY_POSITIONS);
4328
+ this.overlayRef = overlay.create({
4329
+ positionStrategy: this.overlayPositionStrategy,
4330
+ scrollStrategy: overlay.scrollStrategies.reposition(),
4331
+ });
4332
+ // A plain appendChild into overlayElement skips the position
4333
+ // strategy's own attach() lifecycle (it never gets a reference to
4334
+ // the pane), which crashes the next reposition — DomPortal goes
4335
+ // through OverlayRef's normal attach path instead, so everything
4336
+ // (including the anchor-based restore on dispose) is wired up
4337
+ // the same way a ComponentPortal's would be.
4338
+ this.overlayRef.attach(new DomPortal(this.componentEl));
4339
+ }
4340
+ else {
4341
+ this.renderer2.appendChild(this.hostEl?.nativeElement, this.componentEl);
4342
+ }
4264
4343
  this.componentRef.setInput('type', 'bubble');
4265
4344
  }
4345
+ // `isVisible()`'s base implementation checks whether componentEl is a
4346
+ // DOM descendant of hostEl — never true once componentEl lives inside
4347
+ // the overlay pane in <body> instead.
4348
+ isVisible() {
4349
+ return this.useOverlay ? !!this.overlayRef : super.isVisible();
4350
+ }
4266
4351
  destroyComponent() {
4267
4352
  document.body.removeEventListener(MOUSE_EVENT, this.clickListener);
4353
+ // Disposing first restores componentEl to where it lived before the
4354
+ // DomPortal moved it (its own anchor-based teardown) — doing this
4355
+ // AFTER destroying the Angular component would instead re-insert an
4356
+ // already-destroyed, inert DOM node back into the page.
4357
+ this.overlayRef?.dispose();
4358
+ this.overlayRef = undefined;
4359
+ this.overlayPositionStrategy = undefined;
4360
+ if (this.overlayAnchorEl) {
4361
+ this.renderer2.removeChild(this.hostEl.nativeElement, this.overlayAnchorEl);
4362
+ this.overlayAnchorEl = undefined;
4363
+ }
4268
4364
  super.destroyComponent();
4269
4365
  }
4270
4366
  }
@@ -4321,6 +4417,13 @@ class RichtextToolboxDirective {
4321
4417
  this.rtEditorClass = '';
4322
4418
  this.rtBreakOnEnter = false;
4323
4419
  this.rtAllowImages = false;
4420
+ /**
4421
+ * `rtType="bubble"` only: portals the floating toolbar through a CDK
4422
+ * Overlay instead of appending it as a plain `position:absolute` child of
4423
+ * the editor. Needed when the editor lives inside a scrollable/clipping
4424
+ * ancestor (e.g. a list row) — see BubbleToolbox for the full rationale.
4425
+ */
4426
+ this.rtBubbleOverlay = false;
4324
4427
  this.inputChange = new EventEmitter();
4325
4428
  this.inputEnter = new EventEmitter();
4326
4429
  this.inputEscape = new EventEmitter();
@@ -4444,13 +4547,13 @@ class RichtextToolboxDirective {
4444
4547
  getToolbox(type) {
4445
4548
  switch (type) {
4446
4549
  case 'bubble':
4447
- return new BubbleToolboxProxy.BubbleToolbox(this.injector);
4550
+ return new BubbleToolboxProxy.BubbleToolbox(this.injector, this.rtBubbleOverlay);
4448
4551
  case 'topbar':
4449
4552
  return new TopbarToolboxProxy.TopbarToolbox(this.injector);
4450
4553
  }
4451
4554
  }
4452
4555
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.7", ngImport: i0, type: RichtextToolboxDirective, deps: [{ token: i0.Injector }], target: i0.ɵɵFactoryTarget.Directive }); }
4453
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.7", type: RichtextToolboxDirective, selector: "[askRichtextToolbox]", inputs: { rtPlaceholder: "rtPlaceholder", rtTools: "rtTools", rtDisabledTools: "rtDisabledTools", rtType: "rtType", rtToolbarOnly: "rtToolbarOnly", rtMaxlength: "rtMaxlength", rtToolbarClass: "rtToolbarClass", rtEditorClass: "rtEditorClass", rtBreakOnEnter: "rtBreakOnEnter", rtAllowImages: "rtAllowImages", rtShortcutTemplate: "rtShortcutTemplate" }, outputs: { inputChange: "inputChange", inputEnter: "inputEnter", inputEscape: "inputEscape", inputFocus: "inputFocus", toolChange: "toolChange" }, providers: [
4556
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.7", type: RichtextToolboxDirective, selector: "[askRichtextToolbox]", inputs: { rtPlaceholder: "rtPlaceholder", rtTools: "rtTools", rtDisabledTools: "rtDisabledTools", rtType: "rtType", rtToolbarOnly: "rtToolbarOnly", rtMaxlength: "rtMaxlength", rtToolbarClass: "rtToolbarClass", rtEditorClass: "rtEditorClass", rtBreakOnEnter: "rtBreakOnEnter", rtAllowImages: "rtAllowImages", rtBubbleOverlay: "rtBubbleOverlay", rtShortcutTemplate: "rtShortcutTemplate" }, outputs: { inputChange: "inputChange", inputEnter: "inputEnter", inputEscape: "inputEscape", inputFocus: "inputFocus", toolChange: "toolChange" }, providers: [
4454
4557
  {
4455
4558
  multi: true,
4456
4559
  provide: NG_VALUE_ACCESSOR,
@@ -4490,6 +4593,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.7", ngImpor
4490
4593
  type: Input
4491
4594
  }], rtAllowImages: [{
4492
4595
  type: Input
4596
+ }], rtBubbleOverlay: [{
4597
+ type: Input
4493
4598
  }], rtShortcutTemplate: [{
4494
4599
  type: Input
4495
4600
  }], inputChange: [{