@leanix/components 0.2.248 → 0.2.251
Sign up to get free protection for your applications and to get access to all the features.
- package/esm2020/index.mjs +4 -3
- package/esm2020/lib/core-ui/components/ellipsis/ellipsis.component.mjs +17 -3
- package/esm2020/lib/core-ui/core-ui.module.mjs +3 -3
- package/esm2020/lib/core-ui/linkify/linkify.pipe.mjs +144 -0
- package/esm2020/lib/core-ui/linkify/unlinkify.pipe.mjs +48 -0
- package/esm2020/lib/popover-ui/components/popover/popover.component.mjs +6 -3
- package/fesm2015/leanix-components.mjs +198 -168
- package/fesm2015/leanix-components.mjs.map +1 -1
- package/fesm2020/leanix-components.mjs +196 -166
- package/fesm2020/leanix-components.mjs.map +1 -1
- package/index.d.ts +2 -2
- package/lib/core-ui/components/ellipsis/ellipsis.component.d.ts +7 -1
- package/lib/core-ui/core-ui.module.d.ts +2 -2
- package/lib/core-ui/{pipes/linkify → linkify}/linkify.pipe.d.ts +11 -0
- package/lib/core-ui/{pipes/linkify → linkify}/unlinkify.pipe.d.ts +0 -0
- package/lib/popover-ui/components/popover/popover.component.d.ts +2 -1
- package/package.json +1 -1
- package/esm2020/lib/core-ui/pipes/linkify/linkify.pipe.mjs +0 -130
- package/esm2020/lib/core-ui/pipes/linkify/unlinkify.pipe.mjs +0 -48
@@ -58,6 +58,7 @@ export class PopoverComponent {
|
|
58
58
|
constructor() {
|
59
59
|
this.noMargin = false;
|
60
60
|
this.allowOverflow = false;
|
61
|
+
this.autoFocus = false;
|
61
62
|
/**
|
62
63
|
* If you have a popover, that should usually be displayed above or below its anchor,
|
63
64
|
* and this anchor is in a scrollable container, you should set this to true.
|
@@ -166,10 +167,10 @@ export class PopoverComponent {
|
|
166
167
|
}
|
167
168
|
}
|
168
169
|
PopoverComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: PopoverComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
169
|
-
PopoverComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.2", type: PopoverComponent, selector: "lx-popover", inputs: { trigger: "trigger", horizontalAlign: "horizontalAlign", verticalAlign: "verticalAlign", noMargin: "noMargin", allowOverflow: "allowOverflow", adaptMarginsForViewportAlignChange: "adaptMarginsForViewportAlignChange" }, outputs: { opened: "opened", closed: "closed" }, queries: [{ propertyName: "explicitContent", first: true, predicate: PopoverContentDirective, descendants: true, read: TemplateRef, static: true }], viewQueries: [{ propertyName: "satPopover", first: true, predicate: SatPopover, descendants: true, static: true }, { propertyName: "implicitContent", first: true, predicate: ["implicitContent"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<sat-popover\n [anchor]=\"trigger.anchor\"\n [horizontalAlign]=\"horizontalAlign\"\n [verticalAlign]=\"verticalAlign\"\n [restoreFocus]=\"false\"\n [lockAlignment]=\"true\"\n [autoFocus]=\"
|
170
|
+
PopoverComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.2", type: PopoverComponent, selector: "lx-popover", inputs: { trigger: "trigger", horizontalAlign: "horizontalAlign", verticalAlign: "verticalAlign", noMargin: "noMargin", allowOverflow: "allowOverflow", autoFocus: "autoFocus", adaptMarginsForViewportAlignChange: "adaptMarginsForViewportAlignChange" }, outputs: { opened: "opened", closed: "closed" }, queries: [{ propertyName: "explicitContent", first: true, predicate: PopoverContentDirective, descendants: true, read: TemplateRef, static: true }], viewQueries: [{ propertyName: "satPopover", first: true, predicate: SatPopover, descendants: true, static: true }, { propertyName: "implicitContent", first: true, predicate: ["implicitContent"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<sat-popover\n [anchor]=\"trigger.anchor\"\n [horizontalAlign]=\"horizontalAlign\"\n [verticalAlign]=\"verticalAlign\"\n [restoreFocus]=\"false\"\n [lockAlignment]=\"true\"\n [autoFocus]=\"autoFocus\"\n openTransition=\"0ms\"\n closeTransition=\"0ms\"\n (opened)=\"onOpen()\"\n (afterOpen)=\"onAfterOpen()\"\n (closed)=\"onClose()\"\n>\n <div\n class=\"popoverContainer\"\n [ngClass]=\"marginClasses\"\n [class.overflowHidden]=\"!allowOverflow\"\n (mouseenter)=\"trigger.showPopover(true)\"\n (mouseleave)=\"trigger.closePopover(true)\"\n (keydown.escape)=\"$event.stopPropagation(); trigger.closePopover(true)\"\n >\n <ng-container *ngIf=\"isOpen\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n </ng-container>\n </div>\n</sat-popover>\n<ng-template #implicitContent>\n <ng-content></ng-content>\n</ng-template>\n", styles: ["@keyframes subtleScaleUpKeyFrames{0%{transform:scale(.95);opacity:0}}.popoverContainer{position:relative;box-shadow:0 8px 12px 2px #00000026;max-width:600px;max-height:80vh;border-radius:3px;background-color:#fff;-webkit-hyphens:auto;hyphens:auto;animation:subtleScaleUpKeyFrames .2s ease}.popoverContainer.overflowHidden{overflow:hidden}.right{margin-left:18px}.left{margin-right:18px}.bottom{margin-top:18px}.top{margin-bottom:18px}\n"], components: [{ type: i1.SatPopover, selector: "sat-popover", inputs: ["anchor", "horizontalAlign", "xAlign", "verticalAlign", "yAlign", "forceAlignment", "lockAlignment", "autoFocus", "restoreFocus", "scrollStrategy", "hasBackdrop", "interactiveClose", "openTransition", "closeTransition", "openAnimationStartAtScale", "closeAnimationEndAtScale", "backdropClass", "panelClass"], outputs: ["opened", "closed", "afterOpen", "afterClose", "backdropClicked", "overlayKeydown"] }], directives: [{ type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }] });
|
170
171
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: PopoverComponent, decorators: [{
|
171
172
|
type: Component,
|
172
|
-
args: [{ selector: 'lx-popover', template: "<sat-popover\n [anchor]=\"trigger.anchor\"\n [horizontalAlign]=\"horizontalAlign\"\n [verticalAlign]=\"verticalAlign\"\n [restoreFocus]=\"false\"\n [lockAlignment]=\"true\"\n [autoFocus]=\"
|
173
|
+
args: [{ selector: 'lx-popover', template: "<sat-popover\n [anchor]=\"trigger.anchor\"\n [horizontalAlign]=\"horizontalAlign\"\n [verticalAlign]=\"verticalAlign\"\n [restoreFocus]=\"false\"\n [lockAlignment]=\"true\"\n [autoFocus]=\"autoFocus\"\n openTransition=\"0ms\"\n closeTransition=\"0ms\"\n (opened)=\"onOpen()\"\n (afterOpen)=\"onAfterOpen()\"\n (closed)=\"onClose()\"\n>\n <div\n class=\"popoverContainer\"\n [ngClass]=\"marginClasses\"\n [class.overflowHidden]=\"!allowOverflow\"\n (mouseenter)=\"trigger.showPopover(true)\"\n (mouseleave)=\"trigger.closePopover(true)\"\n (keydown.escape)=\"$event.stopPropagation(); trigger.closePopover(true)\"\n >\n <ng-container *ngIf=\"isOpen\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n </ng-container>\n </div>\n</sat-popover>\n<ng-template #implicitContent>\n <ng-content></ng-content>\n</ng-template>\n", styles: ["@keyframes subtleScaleUpKeyFrames{0%{transform:scale(.95);opacity:0}}.popoverContainer{position:relative;box-shadow:0 8px 12px 2px #00000026;max-width:600px;max-height:80vh;border-radius:3px;background-color:#fff;-webkit-hyphens:auto;hyphens:auto;animation:subtleScaleUpKeyFrames .2s ease}.popoverContainer.overflowHidden{overflow:hidden}.right{margin-left:18px}.left{margin-right:18px}.bottom{margin-top:18px}.top{margin-bottom:18px}\n"] }]
|
173
174
|
}], propDecorators: { trigger: [{
|
174
175
|
type: Input
|
175
176
|
}], horizontalAlign: [{
|
@@ -180,6 +181,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImpor
|
|
180
181
|
type: Input
|
181
182
|
}], allowOverflow: [{
|
182
183
|
type: Input
|
184
|
+
}], autoFocus: [{
|
185
|
+
type: Input
|
183
186
|
}], adaptMarginsForViewportAlignChange: [{
|
184
187
|
type: Input
|
185
188
|
}], opened: [{
|
@@ -196,4 +199,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImpor
|
|
196
199
|
type: ContentChild,
|
197
200
|
args: [PopoverContentDirective, { read: TemplateRef, static: true }]
|
198
201
|
}] } });
|
199
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wb3Zlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvc3JjL2xpYi9wb3BvdmVyLXVpL2NvbXBvbmVudHMvcG9wb3Zlci9wb3BvdmVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy9zcmMvbGliL3BvcG92ZXItdWkvY29tcG9uZW50cy9wb3BvdmVyL3BvcG92ZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBYSxNQUFNLEVBQWlCLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkksT0FBTyxFQUFFLFVBQVUsRUFBc0QsTUFBTSxzQkFBc0IsQ0FBQztBQUN0RyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQzs7OztBQUdyRjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWlERztBQU1ILE1BQU0sT0FBTyxnQkFBZ0I7SUFMN0I7UUFTVyxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBRS9COzs7Ozs7O1dBT0c7UUFDTSx1Q0FBa0MsR0FBRyxLQUFLLENBQUM7UUFFMUMsV0FBTSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFDbEMsV0FBTSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFnQnBDLFlBQU8sR0FBRyxLQUFLLENBQUM7S0FtR3pCO0lBMUdDLElBQUksT0FBTztRQUNULE9BQU8sSUFBSSxDQUFDLGVBQWUsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQ3RELENBQUM7SUFFRCxJQUFJLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxPQUFPLENB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SSxFQUFFO2dCQUU4QixlQUFlO3NCQUExRixZQUFZO3VCQUFDLHVCQUF1QixFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBDb250ZW50Q2hpbGQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTYXRQb3BvdmVyLCBTYXRQb3BvdmVySG9yaXpvbnRhbEFsaWduLCBTYXRQb3BvdmVyVmVydGljYWxBbGlnbiB9IGZyb20gJ0BuY3N0YXRlL3NhdC1wb3BvdmVyJztcbmltcG9ydCB7IFBvcG92ZXJDb250ZW50RGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9wb3BvdmVyLWNvbnRlbnQuZGlyZWN0aXZlJztcbmltcG9ydCB7IFBvcG92ZXJUcmlnZ2VyRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9wb3BvdmVyLWhvdmVyLmRpcmVjdGl2ZSc7XG5cbi8qKlxuICogSE9XIFRPIFVTRVxuICpcbiAqIFRoaXMgcG9wb3ZlciBlbmNhcHN1bGF0ZXMgdGhpcyBvcGVuIHNvdXJjZSBsaWJyYXJ5OiBodHRwczovL2dpdGh1Yi5jb20vbmNzdGF0ZS1zYXQvcG9wb3ZlcixcbiAqIG1ha2Ugc3VyZSB0byBhbHNvIGNoZWNrIG91dCB0aGUgZG9jcyBvdmVyIHRoZXJlLlxuICpcbiAqIEFzIG9mIHRvZGF5IHRoZXkgYXJlIHR3byB0cmlnZ2VyIHN0cmF0ZWdpZXMgdG8gZGlzcGxheSBhIHBvcG92ZXIuXG4gKiAxLiBTaG93IG9uIGhvdmVyaW5nIHRoZSBhbmNob3IgYW5kIHdoaWxlIGhvdmVyaW5nIHRoZSBwb3BvdmVyIGJvZHkuXG4gKiAyLiBTaG93IG9uIGNsaWNrIGFuZCB3aGlsZSBob3ZlcmluZyB0aGUgcG9wb3ZlciBib2R5LlxuICpcbiAqIEZvciB1c2UgY2FzZSAxLiB5b3Ugd291bGQgdXNlIHRoZSBseFBvcG92ZXJIb3ZlciBkaXJlY3RpdmUsIHdoaWNoIGV4cG9ydHMgYXMgaG92ZXJBbmNob3IuXG4gKlxuICogRXhhbXBsZTpcbiAqIDxkaXYgbHhQb3BvdmVySG92ZXJcbiAqICAgICAgaG92ZXJBbmNob3JcbiAqICAgICAgc2F0UG9wb3ZlckFuY2hvclxuICogICAgICAjYW5jaG9yPVwiaG92ZXJBbmNob3JcIj48L2Rpdj5cbiAqIDxseC1wb3BvdmVyIFt0cmlnZ2VyXT1cImFuY2hvclwiXG4gKiAgICAgICAgICAgICBob3Jpem9udGFsQWxpZ249XCJhZnRlclwiXG4gKiAgICAgICAgICAgICB2ZXJ0aWNhbEFsaWduPVwiY2VudGVyXCI+XG4gKiAgICA8cD5Qb3BvdmVyIGNvbnRlbnQ8L3A+XG4gKiA8L2x4LXBvcG92ZXI+XG4gKlxuICogRm9yIHVzZSBjYXNlIDIuIHlvdSB3b3VsZCB1c2UgdGhlIGx4UG9wb3ZlckNsaWNrIGRpcmVjdGl2ZSwgd2hpY2ggZXhwb3J0cyBhcyBjbGlja0FuY2hvci5cbiAqIE5vdGU6IFNpbmNlIHRoZSBvbmx5IGNvbXBvbmVudCB3aGVyZSB3ZSB1c2UgdGhlIGx4UG9wb3ZlckNsaWNrIGRpcmVjdGl2ZSAoUmVwb3J0Q29tcG9uZW50KVxuICogbmVlZHMgdG8gZmV0Y2ggc29tZSBkYXRhIGJlZm9yZSBvcGVuaW5nIGl0LCB3ZSBkbyBub3QgcmVnaXN0ZXIgYSBjbGljayBFdmVudExpc3RlbmVyIGluIHRoaXMgZGlyZWN0aXZlLFxuICogYnV0IHJlcXVpcmUgdGhlIGRldmVsb3BlciB0byBpbXBsZW1lbnQgdGhhdCBpbiB0aGUgY29tcG9uZW50LCB3aGVyZSB0aGUgcG9wb3ZlciBpcyB1c2VkLlxuICpcbiAqIEV4YW1wbGU6XG4gKiA8ZGl2IGx4UG9wb3ZlckNsaWNrXG4gKiAgICAgIGNsaWNrQW5jaG9yXG4gKiAgICAgIHNhdFBvcG92ZXJBbmNob3JcbiAqICAgICAgI2FuY2hvcj1cImNsaWNrQW5jaG9yXCJcbiAqICAgICAgKGNsaWNrKT1cInBvcG92ZXIub3BlbigpXCI+Q2xpY2sgTWUhPC9kaXY+XG4gKiA8bHgtcG9wb3ZlciBbdHJpZ2dlcl09XCJhbmNob3JcIlxuICogICAgICAgICAgICAgaG9yaXpvbnRhbEFsaWduPVwiYWZ0ZXJcIlxuICogICAgICAgICAgICAgdmVydGljYWxBbGlnbj1cImNlbnRlclwiXG4gKiAgICAgICAgICAgICAjcG9wb3Zlcj5cbiAqICAgIDxwPlBvcG92ZXIgY29udGVudDwvcD5cbiAqIDwvbHgtcG9wb3Zlcj5cbiAqXG4gKiBJZiB0aGlzIGNvbXBvbmVudCBpcyB1c2VkIHdpdGggYW5ndWxhckNvbXBpbGVyT3B0aW9ucyBzdHJpY3RUZW1wbGF0ZXM9dHJ1ZSxcbiAqIHNhdFBvcG92ZXJBbmNob3IgbXVzdCBiZSBzZXQgdG8gdGhlIHJlZmVyZW5jZSB0byB0aGUgU2F0UG9wb3ZlciBpbnNpZGUgbHgtcG9wb3Zlci5cbiAqXG4gKiBFeGFtcGxlOlxuICogIDxkaXYgW3NhdFBvcG92ZXJBbmNob3JdPVwicG9wb3Zlci5zYXRQb3BvdmVyXCI+PC9kaXY+XG4gKiA8bHgtcG9wb3ZlciAjcG9wb3Zlcj5cbiAqICAgIDxwPlBvcG92ZXIgY29udGVudDwvcD5cbiAqIDwvbHgtcG9wb3Zlcj5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbHgtcG9wb3ZlcicsXG4gIHRlbXBsYXRlVXJsOiAncG9wb3Zlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWydwb3BvdmVyLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgUG9wb3ZlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIHRyaWdnZXIhOiBQb3BvdmVyVHJpZ2dlckRpcmVjdGl2ZTtcbiAgQElucHV0KCkgaG9yaXpvbnRhbEFsaWduITogU2F0UG9wb3Zlckhvcml6b250YWxBbGlnbjtcbiAgQElucHV0KCkgdmVydGljYWxBbGlnbiE6IFNhdFBvcG92ZXJWZXJ0aWNhbEFsaWduO1xuICBASW5wdXQoKSBub01hcmdpbiA9IGZhbHNlO1xuICBASW5wdXQoKSBhbGxvd092ZXJmbG93ID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIElmIHlvdSBoYXZlIGEgcG9wb3ZlciwgdGhhdCBzaG91bGQgdXN1YWxseSBiZSBkaXNwbGF5ZWQgYWJvdmUgb3IgYmVsb3cgaXRzIGFuY2hvcixcbiAgICogYW5kIHRoaXMgYW5jaG9yIGlzIGluIGEgc2Nyb2xsYWJsZSBjb250YWluZXIsIHlvdSBzaG91bGQgc2V0IHRoaXMgdG8gdHJ1ZS5cbiAgICogU2F0UG9wb3ZlciB3aWxsIG9wZW4gdGhpcyBwb3BvdmVyIGluIHRoZSBkaXJlY3Rpb24gd2hlcmUgdGhlcmUgaXMgZW5vdWdoIHNwYWNlLFxuICAgKiBzbyBpdHMgcG9zaXRpb24gbWlnaHQgZGlmZmVyIGZyb20gdGhlIGhvcml6b250YWxBbGlnbiBhbmQgdmVydGljYWxBbGlnbiB2YWx1ZXMuXG4gICAqIEluIHRoaXMgY2FzZSB3ZSByZWx5IG9uIHRoZSBTYXRQb3BvdmVyOjpfY2xhc3NMaXN0IHByb3BlcnR5IHRvIGdldCB0aGUgY29tcHV0ZWRcbiAgICogcG9zaXRpb24gb2YgdGhlIHBvcG92ZXIgYWZ0ZXIgb3BlbmluZy5cbiAgICovXG4gIEBJbnB1dCgpIGFkYXB0TWFyZ2luc0ZvclZpZXdwb3J0QWxpZ25DaGFuZ2UgPSBmYWxzZTtcblxuICBAT3V0cHV0KCkgb3BlbmVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgY2xvc2VkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIEBWaWV3Q2hpbGQoU2F0UG9wb3ZlciwgeyBzdGF0aWM6IHRydWUgfSkgc2F0UG9wb3ZlciE6IFNhdFBvcG92ZXI7XG4gIEBWaWV3Q2hpbGQoJ2ltcGxpY2l0Q29udGVudCcsIHsgc3RhdGljOiB0cnVlIH0pIGltcGxpY2l0Q29udGVudCE6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgQENvbnRlbnRDaGlsZChQb3BvdmVyQ29udGVudERpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiwgc3RhdGljOiB0cnVlIH0pIGV4cGxpY2l0Q29udGVudD86IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgbWFyZ2luQ2xhc3NlcyE6IHN0cmluZztcblxuICBnZXQgY29udGVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5leHBsaWNpdENvbnRlbnQgfHwgdGhpcy5pbXBsaWNpdENvbnRlbnQ7XG4gIH1cblxuICBnZXQgaXNPcGVuKCkge1xuICAgIHJldHVybiB0aGlzLl9pc09wZW47XG4gIH1cbiAgcHJpdmF0ZSBfaXNPcGVuID0gZmFsc2U7XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChjaGFuZ2VzWydob3Jpem9udGFsQWxpZ24nXSAmJiBjaGFuZ2VzWyd2ZXJ0aWNhbEFsaWduJ10pIHtcbiAgICAgIHRoaXMubWFyZ2luQ2xhc3NlcyA9IHRoaXMuZ2V0RGVmYXVsdE1hcmdpbkNsYXNzZXModGhpcy5ob3Jpem9udGFsQWxpZ24sIHRoaXMudmVydGljYWxBbGlnbik7XG4gICAgfVxuICB9XG5cbiAgb3BlbigpIHtcbiAgICB0aGlzLnNhdFBvcG92ZXIub3BlbigpO1xuICB9XG5cbiAgY2xvc2UoKSB7XG4gICAgdGhpcy5zYXRQb3BvdmVyLmNsb3NlKCk7XG4gIH1cblxuICBvbk9wZW4oKSB7XG4gICAgdGhpcy5faXNPcGVuID0gdHJ1ZTtcbiAgICB0aGlzLm9wZW5lZC5lbWl0KCk7XG4gIH1cblxuICBvbkFmdGVyT3BlbigpIHtcbiAgICBpZiAodGhpcy5hZGFwdE1hcmdpbnNGb3JWaWV3cG9ydEFsaWduQ2hhbmdlKSB7XG4gICAgICB0aGlzLm1hcmdpbkNsYXNzZXMgPSB0aGlzLmdldE1hcmdpbkNsYXNzZXNGb3JDbGFzc0xpc3QodGhpcy5zYXRQb3BvdmVyLl9jbGFzc0xpc3QpO1xuICAgIH1cbiAgfVxuXG4gIG9uQ2xvc2UoKSB7XG4gICAgdGhpcy5faXNPcGVuID0gZmFsc2U7XG4gICAgdGhpcy5jbG9zZWQuZW1pdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdFBvcG92ZXI6Ol9jbGFzc0xpc3Qgd2lsbCBjb250YWluIGEgbWFwIG9mIGFsaWdubWVudCBDU1MgY2xhc3Nlcywgb25jZSB0aGUgcG9wb3ZlciB3YXMgb3BlbmVkLlxuICAgKiBUaGVzZSBhbGlnbm1lbnQgY2xhc3NlcyBjYW4gYmUgZGlmZmVyZW50IGZyb20gd2hhdCB5b3Ugd291bGQgZXhwZWN0IGZyb20gdGhlIGhvcml6b250YWwtIGFuZCB2ZXJ0aWNhbEFsaWduIGlucHV0cyxcbiAgICogYmVjYXVzZSB0aGVyZSBtaWdodCBub3QgYmUgZW5vdWdoIHNwYWNlIGFib3ZlIHRoZSBhbmNob3IgdG8gbWVldCB0aGUgdmVydGljYWxBbGlnbj0nYWJvdmUnIGNyaXRlcmlhLFxuICAgKiBzbyBpdCB3aWxsIGJlIGRpc3BsYXllZCBiZWxvdyB0aGUgYW5jaG9yIGluc3RlYWQuXG4gICAqL1xuICBwcml2YXRlIGdldE1hcmdpbkNsYXNzZXNGb3JDbGFzc0xpc3Qoc2F0UG9wb3ZlckNsYXNzTGlzdDogeyBbY2xhc3NOYW1lOiBzdHJpbmddOiBib29sZWFuIH0pOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLm5vTWFyZ2luKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgaWYgKHNhdFBvcG92ZXJDbGFzc0xpc3RbJ3NhdC1wb3BvdmVyLWFib3ZlJ10pIHtcbiAgICAgIHJldHVybiB0aGlzLm1hcmdpbkNsYXNzZXMuaW5jbHVkZXMoJ3RvcCcpID8gdGhpcy5tYXJnaW5DbGFzc2VzIDogJ3RvcCc7XG4gICAgfVxuXG4gICAgaWYgKHNhdFBvcG92ZXJDbGFzc0xpc3RbJ3NhdC1wb3BvdmVyLWJlbG93J10pIHtcbiAgICAgIHJldHVybiB0aGlzLm1hcmdpbkNsYXNzZXMuaW5jbHVkZXMoJ2JvdHRvbScpID8gdGhpcy5tYXJnaW5DbGFzc2VzIDogJ2JvdHRvbSc7XG4gICAgfVxuXG4gICAgaWYgKHNhdFBvcG92ZXJDbGFzc0xpc3RbJ3NhdC1wb3BvdmVyLWJlZm9yZSddKSB7XG4gICAgICByZXR1cm4gdGhpcy5tYXJnaW5DbGFzc2VzLmluY2x1ZGVzKCdsZWZ0JykgPyB0aGlzLm1hcmdpbkNsYXNzZXMgOiAnbGVmdCc7XG4gICAgfVxuXG4gICAgaWYgKHNhdFBvcG92ZXJDbGFzc0xpc3RbJ3NhdC1wb3BvdmVyLWFmdGVyJ10pIHtcbiAgICAgIHJldHVybiB0aGlzLm1hcmdpbkNsYXNzZXMuaW5jbHVkZXMoJ3JpZ2h0JykgPyB0aGlzLm1hcmdpbkNsYXNzZXMgOiAncmlnaHQnO1xuICAgIH1cblxuICAgIGlmIChzYXRQb3BvdmVyQ2xhc3NMaXN0WydzYXQtcG9wb3Zlci1jZW50ZXInXSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBwcml2YXRlIGdldERlZmF1bHRNYXJnaW5DbGFzc2VzKGhvcml6b250YWxBbGlnbjogU2F0UG9wb3Zlckhvcml6b250YWxBbGlnbiwgdmVydGljYWxBbGlnbjogU2F0UG9wb3ZlclZlcnRpY2FsQWxpZ24pOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLm5vTWFyZ2luKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgaWYgKGhvcml6b250YWxBbGlnbiA9PT0gJ2FmdGVyJykge1xuICAgICAgaWYgKHZlcnRpY2FsQWxpZ24gPT09ICdjZW50ZXInIHx8IHZlcnRpY2FsQWxpZ24gPT09ICdzdGFydCcgfHwgdmVydGljYWxBbGlnbiA9PT0gJ2VuZCcpIHtcbiAgICAgICAgcmV0dXJuICdyaWdodCc7XG4gICAgICB9IGVsc2UgaWYgKHZlcnRpY2FsQWxpZ24gPT09ICdhYm92ZScpIHtcbiAgICAgICAgcmV0dXJuICdyaWdodCB0b3AnO1xuICAgICAgfSBlbHNlIGlmICh2ZXJ0aWNhbEFsaWduID09PSAnYmVsb3cnKSB7XG4gICAgICAgIHJldHVybiAncmlnaHQgYm90dG9tJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaG9yaXpvbnRhbEFsaWduID09PSAnYmVmb3JlJykge1xuICAgICAgaWYgKHZlcnRpY2FsQWxpZ24gPT09ICdjZW50ZXInIHx8IHZlcnRpY2FsQWxpZ24gPT09ICdzdGFydCcgfHwgdmVydGljYWxBbGlnbiA9PT0gJ2VuZCcpIHtcbiAgICAgICAgcmV0dXJuICdsZWZ0JztcbiAgICAgIH0gZWxzZSBpZiAodmVydGljYWxBbGlnbiA9PT0gJ2Fib3ZlJykge1xuICAgICAgICByZXR1cm4gJ2xlZnQgdG9wJztcbiAgICAgIH0gZWxzZSBpZiAodmVydGljYWxBbGlnbiA9PT0gJ2JlbG93Jykge1xuICAgICAgICByZXR1cm4gJ2xlZnQgYm90dG9tJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaG9yaXpvbnRhbEFsaWduID09PSAnY2VudGVyJyB8fCBob3Jpem9udGFsQWxpZ24gPT09ICdzdGFydCcgfHwgaG9yaXpvbnRhbEFsaWduID09PSAnZW5kJykge1xuICAgICAgaWYgKHZlcnRpY2FsQWxpZ24gPT09ICdhYm92ZScpIHtcbiAgICAgICAgcmV0dXJuICd0b3AnO1xuICAgICAgfSBlbHNlIGlmICh2ZXJ0aWNhbEFsaWduID09PSAnYmVsb3cnKSB7XG4gICAgICAgIHJldHVybiAnYm90dG9tJztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICcnO1xuICB9XG59XG4iLCI8c2F0LXBvcG92ZXJcbiAgW2FuY2hvcl09XCJ0cmlnZ2VyLmFuY2hvclwiXG4gIFtob3Jpem9udGFsQWxpZ25dPVwiaG9yaXpvbnRhbEFsaWduXCJcbiAgW3ZlcnRpY2FsQWxpZ25dPVwidmVydGljYWxBbGlnblwiXG4gIFtyZXN0b3JlRm9jdXNdPVwiZmFsc2VcIlxuICBbbG9ja0FsaWdubWVudF09XCJ0cnVlXCJcbiAgW2F1dG9Gb2N1c109XCJmYWxzZVwiXG4gIG9wZW5UcmFuc2l0aW9uPVwiMG1zXCJcbiAgY2xvc2VUcmFuc2l0aW9uPVwiMG1zXCJcbiAgKG9wZW5lZCk9XCJvbk9wZW4oKVwiXG4gIChhZnRlck9wZW4pPVwib25BZnRlck9wZW4oKVwiXG4gIChjbG9zZWQpPVwib25DbG9zZSgpXCJcbj5cbiAgPGRpdlxuICAgIGNsYXNzPVwicG9wb3ZlckNvbnRhaW5lclwiXG4gICAgW25nQ2xhc3NdPVwibWFyZ2luQ2xhc3Nlc1wiXG4gICAgW2NsYXNzLm92ZXJmbG93SGlkZGVuXT1cIiFhbGxvd092ZXJmbG93XCJcbiAgICAobW91c2VlbnRlcik9XCJ0cmlnZ2VyLnNob3dQb3BvdmVyKHRydWUpXCJcbiAgICAobW91c2VsZWF2ZSk9XCJ0cmlnZ2VyLmNsb3NlUG9wb3Zlcih0cnVlKVwiXG4gID5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNPcGVuXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29udGVudFwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbjwvc2F0LXBvcG92ZXI+XG48bmctdGVtcGxhdGUgI2ltcGxpY2l0Q29udGVudD5cbiAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|
202
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wb3Zlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvc3JjL2xpYi9wb3BvdmVyLXVpL2NvbXBvbmVudHMvcG9wb3Zlci9wb3BvdmVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy9zcmMvbGliL3BvcG92ZXItdWkvY29tcG9uZW50cy9wb3BvdmVyL3BvcG92ZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBYSxNQUFNLEVBQWlCLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkksT0FBTyxFQUFFLFVBQVUsRUFBc0QsTUFBTSxzQkFBc0IsQ0FBQztBQUN0RyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQzs7OztBQUdyRjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWlERztBQU1ILE1BQU0sT0FBTyxnQkFBZ0I7SUFMN0I7UUFTVyxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFFM0I7Ozs7Ozs7V0FPRztRQUNNLHVDQUFrQyxHQUFHLEtBQUssQ0FBQztRQUUxQyxXQUFNLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUNsQyxXQUFNLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQWdCcEMsWUFBTyxHQUFHLEtBQUssQ0FBQztLQW1HekI7SUExR0MsSUFBSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDdEQsQ0FBQztJQUVELElBQUksTUFBTTtR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O3NCQUE5RCxTQUFTO3VCQUFDLGlCQUFpQixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFFOEIsZUFBZTtzQkFBMUYsWUFBWTt1QkFBQyx1QkFBdUIsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgQ29udGVudENoaWxkLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcywgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU2F0UG9wb3ZlciwgU2F0UG9wb3Zlckhvcml6b250YWxBbGlnbiwgU2F0UG9wb3ZlclZlcnRpY2FsQWxpZ24gfSBmcm9tICdAbmNzdGF0ZS9zYXQtcG9wb3Zlcic7XG5pbXBvcnQgeyBQb3BvdmVyQ29udGVudERpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvcG9wb3Zlci1jb250ZW50LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBQb3BvdmVyVHJpZ2dlckRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvcG9wb3Zlci1ob3Zlci5kaXJlY3RpdmUnO1xuXG4vKipcbiAqIEhPVyBUTyBVU0VcbiAqXG4gKiBUaGlzIHBvcG92ZXIgZW5jYXBzdWxhdGVzIHRoaXMgb3BlbiBzb3VyY2UgbGlicmFyeTogaHR0cHM6Ly9naXRodWIuY29tL25jc3RhdGUtc2F0L3BvcG92ZXIsXG4gKiBtYWtlIHN1cmUgdG8gYWxzbyBjaGVjayBvdXQgdGhlIGRvY3Mgb3ZlciB0aGVyZS5cbiAqXG4gKiBBcyBvZiB0b2RheSB0aGV5IGFyZSB0d28gdHJpZ2dlciBzdHJhdGVnaWVzIHRvIGRpc3BsYXkgYSBwb3BvdmVyLlxuICogMS4gU2hvdyBvbiBob3ZlcmluZyB0aGUgYW5jaG9yIGFuZCB3aGlsZSBob3ZlcmluZyB0aGUgcG9wb3ZlciBib2R5LlxuICogMi4gU2hvdyBvbiBjbGljayBhbmQgd2hpbGUgaG92ZXJpbmcgdGhlIHBvcG92ZXIgYm9keS5cbiAqXG4gKiBGb3IgdXNlIGNhc2UgMS4geW91IHdvdWxkIHVzZSB0aGUgbHhQb3BvdmVySG92ZXIgZGlyZWN0aXZlLCB3aGljaCBleHBvcnRzIGFzIGhvdmVyQW5jaG9yLlxuICpcbiAqIEV4YW1wbGU6XG4gKiA8ZGl2IGx4UG9wb3ZlckhvdmVyXG4gKiAgICAgIGhvdmVyQW5jaG9yXG4gKiAgICAgIHNhdFBvcG92ZXJBbmNob3JcbiAqICAgICAgI2FuY2hvcj1cImhvdmVyQW5jaG9yXCI+PC9kaXY+XG4gKiA8bHgtcG9wb3ZlciBbdHJpZ2dlcl09XCJhbmNob3JcIlxuICogICAgICAgICAgICAgaG9yaXpvbnRhbEFsaWduPVwiYWZ0ZXJcIlxuICogICAgICAgICAgICAgdmVydGljYWxBbGlnbj1cImNlbnRlclwiPlxuICogICAgPHA+UG9wb3ZlciBjb250ZW50PC9wPlxuICogPC9seC1wb3BvdmVyPlxuICpcbiAqIEZvciB1c2UgY2FzZSAyLiB5b3Ugd291bGQgdXNlIHRoZSBseFBvcG92ZXJDbGljayBkaXJlY3RpdmUsIHdoaWNoIGV4cG9ydHMgYXMgY2xpY2tBbmNob3IuXG4gKiBOb3RlOiBTaW5jZSB0aGUgb25seSBjb21wb25lbnQgd2hlcmUgd2UgdXNlIHRoZSBseFBvcG92ZXJDbGljayBkaXJlY3RpdmUgKFJlcG9ydENvbXBvbmVudClcbiAqIG5lZWRzIHRvIGZldGNoIHNvbWUgZGF0YSBiZWZvcmUgb3BlbmluZyBpdCwgd2UgZG8gbm90IHJlZ2lzdGVyIGEgY2xpY2sgRXZlbnRMaXN0ZW5lciBpbiB0aGlzIGRpcmVjdGl2ZSxcbiAqIGJ1dCByZXF1aXJlIHRoZSBkZXZlbG9wZXIgdG8gaW1wbGVtZW50IHRoYXQgaW4gdGhlIGNvbXBvbmVudCwgd2hlcmUgdGhlIHBvcG92ZXIgaXMgdXNlZC5cbiAqXG4gKiBFeGFtcGxlOlxuICogPGRpdiBseFBvcG92ZXJDbGlja1xuICogICAgICBjbGlja0FuY2hvclxuICogICAgICBzYXRQb3BvdmVyQW5jaG9yXG4gKiAgICAgICNhbmNob3I9XCJjbGlja0FuY2hvclwiXG4gKiAgICAgIChjbGljayk9XCJwb3BvdmVyLm9wZW4oKVwiPkNsaWNrIE1lITwvZGl2PlxuICogPGx4LXBvcG92ZXIgW3RyaWdnZXJdPVwiYW5jaG9yXCJcbiAqICAgICAgICAgICAgIGhvcml6b250YWxBbGlnbj1cImFmdGVyXCJcbiAqICAgICAgICAgICAgIHZlcnRpY2FsQWxpZ249XCJjZW50ZXJcIlxuICogICAgICAgICAgICAgI3BvcG92ZXI+XG4gKiAgICA8cD5Qb3BvdmVyIGNvbnRlbnQ8L3A+XG4gKiA8L2x4LXBvcG92ZXI+XG4gKlxuICogSWYgdGhpcyBjb21wb25lbnQgaXMgdXNlZCB3aXRoIGFuZ3VsYXJDb21waWxlck9wdGlvbnMgc3RyaWN0VGVtcGxhdGVzPXRydWUsXG4gKiBzYXRQb3BvdmVyQW5jaG9yIG11c3QgYmUgc2V0IHRvIHRoZSByZWZlcmVuY2UgdG8gdGhlIFNhdFBvcG92ZXIgaW5zaWRlIGx4LXBvcG92ZXIuXG4gKlxuICogRXhhbXBsZTpcbiAqICA8ZGl2IFtzYXRQb3BvdmVyQW5jaG9yXT1cInBvcG92ZXIuc2F0UG9wb3ZlclwiPjwvZGl2PlxuICogPGx4LXBvcG92ZXIgI3BvcG92ZXI+XG4gKiAgICA8cD5Qb3BvdmVyIGNvbnRlbnQ8L3A+XG4gKiA8L2x4LXBvcG92ZXI+XG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2x4LXBvcG92ZXInLFxuICB0ZW1wbGF0ZVVybDogJ3BvcG92ZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsncG9wb3Zlci5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIFBvcG92ZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICBASW5wdXQoKSB0cmlnZ2VyITogUG9wb3ZlclRyaWdnZXJEaXJlY3RpdmU7XG4gIEBJbnB1dCgpIGhvcml6b250YWxBbGlnbiE6IFNhdFBvcG92ZXJIb3Jpem9udGFsQWxpZ247XG4gIEBJbnB1dCgpIHZlcnRpY2FsQWxpZ24hOiBTYXRQb3BvdmVyVmVydGljYWxBbGlnbjtcbiAgQElucHV0KCkgbm9NYXJnaW4gPSBmYWxzZTtcbiAgQElucHV0KCkgYWxsb3dPdmVyZmxvdyA9IGZhbHNlO1xuICBASW5wdXQoKSBhdXRvRm9jdXMgPSBmYWxzZTtcblxuICAvKipcbiAgICogSWYgeW91IGhhdmUgYSBwb3BvdmVyLCB0aGF0IHNob3VsZCB1c3VhbGx5IGJlIGRpc3BsYXllZCBhYm92ZSBvciBiZWxvdyBpdHMgYW5jaG9yLFxuICAgKiBhbmQgdGhpcyBhbmNob3IgaXMgaW4gYSBzY3JvbGxhYmxlIGNvbnRhaW5lciwgeW91IHNob3VsZCBzZXQgdGhpcyB0byB0cnVlLlxuICAgKiBTYXRQb3BvdmVyIHdpbGwgb3BlbiB0aGlzIHBvcG92ZXIgaW4gdGhlIGRpcmVjdGlvbiB3aGVyZSB0aGVyZSBpcyBlbm91Z2ggc3BhY2UsXG4gICAqIHNvIGl0cyBwb3NpdGlvbiBtaWdodCBkaWZmZXIgZnJvbSB0aGUgaG9yaXpvbnRhbEFsaWduIGFuZCB2ZXJ0aWNhbEFsaWduIHZhbHVlcy5cbiAgICogSW4gdGhpcyBjYXNlIHdlIHJlbHkgb24gdGhlIFNhdFBvcG92ZXI6Ol9jbGFzc0xpc3QgcHJvcGVydHkgdG8gZ2V0IHRoZSBjb21wdXRlZFxuICAgKiBwb3NpdGlvbiBvZiB0aGUgcG9wb3ZlciBhZnRlciBvcGVuaW5nLlxuICAgKi9cbiAgQElucHV0KCkgYWRhcHRNYXJnaW5zRm9yVmlld3BvcnRBbGlnbkNoYW5nZSA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoKSBvcGVuZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBjbG9zZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgQFZpZXdDaGlsZChTYXRQb3BvdmVyLCB7IHN0YXRpYzogdHJ1ZSB9KSBzYXRQb3BvdmVyITogU2F0UG9wb3ZlcjtcbiAgQFZpZXdDaGlsZCgnaW1wbGljaXRDb250ZW50JywgeyBzdGF0aWM6IHRydWUgfSkgaW1wbGljaXRDb250ZW50ITogVGVtcGxhdGVSZWY8YW55PjtcblxuICBAQ29udGVudENoaWxkKFBvcG92ZXJDb250ZW50RGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IHRydWUgfSkgZXhwbGljaXRDb250ZW50PzogVGVtcGxhdGVSZWY8YW55PjtcblxuICBtYXJnaW5DbGFzc2VzITogc3RyaW5nO1xuXG4gIGdldCBjb250ZW50KCkge1xuICAgIHJldHVybiB0aGlzLmV4cGxpY2l0Q29udGVudCB8fCB0aGlzLmltcGxpY2l0Q29udGVudDtcbiAgfVxuXG4gIGdldCBpc09wZW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzT3BlbjtcbiAgfVxuICBwcml2YXRlIF9pc09wZW4gPSBmYWxzZTtcblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgaWYgKGNoYW5nZXNbJ2hvcml6b250YWxBbGlnbiddICYmIGNoYW5nZXNbJ3ZlcnRpY2FsQWxpZ24nXSkge1xuICAgICAgdGhpcy5tYXJnaW5DbGFzc2VzID0gdGhpcy5nZXREZWZhdWx0TWFyZ2luQ2xhc3Nlcyh0aGlzLmhvcml6b250YWxBbGlnbiwgdGhpcy52ZXJ0aWNhbEFsaWduKTtcbiAgICB9XG4gIH1cblxuICBvcGVuKCkge1xuICAgIHRoaXMuc2F0UG9wb3Zlci5vcGVuKCk7XG4gIH1cblxuICBjbG9zZSgpIHtcbiAgICB0aGlzLnNhdFBvcG92ZXIuY2xvc2UoKTtcbiAgfVxuXG4gIG9uT3BlbigpIHtcbiAgICB0aGlzLl9pc09wZW4gPSB0cnVlO1xuICAgIHRoaXMub3BlbmVkLmVtaXQoKTtcbiAgfVxuXG4gIG9uQWZ0ZXJPcGVuKCkge1xuICAgIGlmICh0aGlzLmFkYXB0TWFyZ2luc0ZvclZpZXdwb3J0QWxpZ25DaGFuZ2UpIHtcbiAgICAgIHRoaXMubWFyZ2luQ2xhc3NlcyA9IHRoaXMuZ2V0TWFyZ2luQ2xhc3Nlc0ZvckNsYXNzTGlzdCh0aGlzLnNhdFBvcG92ZXIuX2NsYXNzTGlzdCk7XG4gICAgfVxuICB9XG5cbiAgb25DbG9zZSgpIHtcbiAgICB0aGlzLl9pc09wZW4gPSBmYWxzZTtcbiAgICB0aGlzLmNsb3NlZC5lbWl0KCk7XG4gIH1cblxuICAvKipcbiAgICogU2F0UG9wb3Zlcjo6X2NsYXNzTGlzdCB3aWxsIGNvbnRhaW4gYSBtYXAgb2YgYWxpZ25tZW50IENTUyBjbGFzc2VzLCBvbmNlIHRoZSBwb3BvdmVyIHdhcyBvcGVuZWQuXG4gICAqIFRoZXNlIGFsaWdubWVudCBjbGFzc2VzIGNhbiBiZSBkaWZmZXJlbnQgZnJvbSB3aGF0IHlvdSB3b3VsZCBleHBlY3QgZnJvbSB0aGUgaG9yaXpvbnRhbC0gYW5kIHZlcnRpY2FsQWxpZ24gaW5wdXRzLFxuICAgKiBiZWNhdXNlIHRoZXJlIG1pZ2h0IG5vdCBiZSBlbm91Z2ggc3BhY2UgYWJvdmUgdGhlIGFuY2hvciB0byBtZWV0IHRoZSB2ZXJ0aWNhbEFsaWduPSdhYm92ZScgY3JpdGVyaWEsXG4gICAqIHNvIGl0IHdpbGwgYmUgZGlzcGxheWVkIGJlbG93IHRoZSBhbmNob3IgaW5zdGVhZC5cbiAgICovXG4gIHByaXZhdGUgZ2V0TWFyZ2luQ2xhc3Nlc0ZvckNsYXNzTGlzdChzYXRQb3BvdmVyQ2xhc3NMaXN0OiB7IFtjbGFzc05hbWU6IHN0cmluZ106IGJvb2xlYW4gfSk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMubm9NYXJnaW4pIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBpZiAoc2F0UG9wb3ZlckNsYXNzTGlzdFsnc2F0LXBvcG92ZXItYWJvdmUnXSkge1xuICAgICAgcmV0dXJuIHRoaXMubWFyZ2luQ2xhc3Nlcy5pbmNsdWRlcygndG9wJykgPyB0aGlzLm1hcmdpbkNsYXNzZXMgOiAndG9wJztcbiAgICB9XG5cbiAgICBpZiAoc2F0UG9wb3ZlckNsYXNzTGlzdFsnc2F0LXBvcG92ZXItYmVsb3cnXSkge1xuICAgICAgcmV0dXJuIHRoaXMubWFyZ2luQ2xhc3Nlcy5pbmNsdWRlcygnYm90dG9tJykgPyB0aGlzLm1hcmdpbkNsYXNzZXMgOiAnYm90dG9tJztcbiAgICB9XG5cbiAgICBpZiAoc2F0UG9wb3ZlckNsYXNzTGlzdFsnc2F0LXBvcG92ZXItYmVmb3JlJ10pIHtcbiAgICAgIHJldHVybiB0aGlzLm1hcmdpbkNsYXNzZXMuaW5jbHVkZXMoJ2xlZnQnKSA/IHRoaXMubWFyZ2luQ2xhc3NlcyA6ICdsZWZ0JztcbiAgICB9XG5cbiAgICBpZiAoc2F0UG9wb3ZlckNsYXNzTGlzdFsnc2F0LXBvcG92ZXItYWZ0ZXInXSkge1xuICAgICAgcmV0dXJuIHRoaXMubWFyZ2luQ2xhc3Nlcy5pbmNsdWRlcygncmlnaHQnKSA/IHRoaXMubWFyZ2luQ2xhc3NlcyA6ICdyaWdodCc7XG4gICAgfVxuXG4gICAgaWYgKHNhdFBvcG92ZXJDbGFzc0xpc3RbJ3NhdC1wb3BvdmVyLWNlbnRlciddKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGVmYXVsdE1hcmdpbkNsYXNzZXMoaG9yaXpvbnRhbEFsaWduOiBTYXRQb3BvdmVySG9yaXpvbnRhbEFsaWduLCB2ZXJ0aWNhbEFsaWduOiBTYXRQb3BvdmVyVmVydGljYWxBbGlnbik6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMubm9NYXJnaW4pIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBpZiAoaG9yaXpvbnRhbEFsaWduID09PSAnYWZ0ZXInKSB7XG4gICAgICBpZiAodmVydGljYWxBbGlnbiA9PT0gJ2NlbnRlcicgfHwgdmVydGljYWxBbGlnbiA9PT0gJ3N0YXJ0JyB8fCB2ZXJ0aWNhbEFsaWduID09PSAnZW5kJykge1xuICAgICAgICByZXR1cm4gJ3JpZ2h0JztcbiAgICAgIH0gZWxzZSBpZiAodmVydGljYWxBbGlnbiA9PT0gJ2Fib3ZlJykge1xuICAgICAgICByZXR1cm4gJ3JpZ2h0IHRvcCc7XG4gICAgICB9IGVsc2UgaWYgKHZlcnRpY2FsQWxpZ24gPT09ICdiZWxvdycpIHtcbiAgICAgICAgcmV0dXJuICdyaWdodCBib3R0b20nO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChob3Jpem9udGFsQWxpZ24gPT09ICdiZWZvcmUnKSB7XG4gICAgICBpZiAodmVydGljYWxBbGlnbiA9PT0gJ2NlbnRlcicgfHwgdmVydGljYWxBbGlnbiA9PT0gJ3N0YXJ0JyB8fCB2ZXJ0aWNhbEFsaWduID09PSAnZW5kJykge1xuICAgICAgICByZXR1cm4gJ2xlZnQnO1xuICAgICAgfSBlbHNlIGlmICh2ZXJ0aWNhbEFsaWduID09PSAnYWJvdmUnKSB7XG4gICAgICAgIHJldHVybiAnbGVmdCB0b3AnO1xuICAgICAgfSBlbHNlIGlmICh2ZXJ0aWNhbEFsaWduID09PSAnYmVsb3cnKSB7XG4gICAgICAgIHJldHVybiAnbGVmdCBib3R0b20nO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChob3Jpem9udGFsQWxpZ24gPT09ICdjZW50ZXInIHx8IGhvcml6b250YWxBbGlnbiA9PT0gJ3N0YXJ0JyB8fCBob3Jpem9udGFsQWxpZ24gPT09ICdlbmQnKSB7XG4gICAgICBpZiAodmVydGljYWxBbGlnbiA9PT0gJ2Fib3ZlJykge1xuICAgICAgICByZXR1cm4gJ3RvcCc7XG4gICAgICB9IGVsc2UgaWYgKHZlcnRpY2FsQWxpZ24gPT09ICdiZWxvdycpIHtcbiAgICAgICAgcmV0dXJuICdib3R0b20nO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cbn1cbiIsIjxzYXQtcG9wb3ZlclxuICBbYW5jaG9yXT1cInRyaWdnZXIuYW5jaG9yXCJcbiAgW2hvcml6b250YWxBbGlnbl09XCJob3Jpem9udGFsQWxpZ25cIlxuICBbdmVydGljYWxBbGlnbl09XCJ2ZXJ0aWNhbEFsaWduXCJcbiAgW3Jlc3RvcmVGb2N1c109XCJmYWxzZVwiXG4gIFtsb2NrQWxpZ25tZW50XT1cInRydWVcIlxuICBbYXV0b0ZvY3VzXT1cImF1dG9Gb2N1c1wiXG4gIG9wZW5UcmFuc2l0aW9uPVwiMG1zXCJcbiAgY2xvc2VUcmFuc2l0aW9uPVwiMG1zXCJcbiAgKG9wZW5lZCk9XCJvbk9wZW4oKVwiXG4gIChhZnRlck9wZW4pPVwib25BZnRlck9wZW4oKVwiXG4gIChjbG9zZWQpPVwib25DbG9zZSgpXCJcbj5cbiAgPGRpdlxuICAgIGNsYXNzPVwicG9wb3ZlckNvbnRhaW5lclwiXG4gICAgW25nQ2xhc3NdPVwibWFyZ2luQ2xhc3Nlc1wiXG4gICAgW2NsYXNzLm92ZXJmbG93SGlkZGVuXT1cIiFhbGxvd092ZXJmbG93XCJcbiAgICAobW91c2VlbnRlcik9XCJ0cmlnZ2VyLnNob3dQb3BvdmVyKHRydWUpXCJcbiAgICAobW91c2VsZWF2ZSk9XCJ0cmlnZ2VyLmNsb3NlUG9wb3Zlcih0cnVlKVwiXG4gICAgKGtleWRvd24uZXNjYXBlKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgdHJpZ2dlci5jbG9zZVBvcG92ZXIodHJ1ZSlcIlxuICA+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzT3BlblwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbnRlbnRcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG48L3NhdC1wb3BvdmVyPlxuPG5nLXRlbXBsYXRlICNpbXBsaWNpdENvbnRlbnQ+XG4gIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|
@@ -7,13 +7,13 @@ import { ComponentPortal, CdkPortal, PortalModule } from '@angular/cdk/portal';
|
|
7
7
|
import * as i1 from '@angular/cdk/overlay';
|
8
8
|
import { OverlayModule, CdkConnectedOverlay } from '@angular/cdk/overlay';
|
9
9
|
import { __decorate, __awaiter } from 'tslib';
|
10
|
+
import { escape, trimEnd, sortBy, get, isEqual, toLower, some, padCharsStart, toString, isNaN as isNaN$1, toNumber, includes, last, findIndex, filter as filter$1, isObject, find, uniqueId } from 'lodash/fp';
|
10
11
|
import * as i6 from 'rxjs';
|
11
12
|
import { BehaviorSubject, timer, Subject, combineLatest, merge, concat, fromEvent, Observable, ReplaySubject, of } from 'rxjs';
|
12
13
|
import { skipWhile, map, switchMap, startWith, pairwise, filter, take, debounceTime, skip, withLatestFrom, distinctUntilChanged, takeUntil, first, delay, mapTo, tap } from 'rxjs/operators';
|
13
14
|
import * as i1$1 from '@ngx-translate/core';
|
14
15
|
import { TranslatePipe, TranslateModule } from '@ngx-translate/core';
|
15
16
|
import * as i1$2 from '@angular/platform-browser';
|
16
|
-
import { trimEnd, sortBy, get, isEqual, toLower, some, padCharsStart, toString, isNaN as isNaN$1, toNumber, includes, last, findIndex, filter as filter$1, isObject, find, uniqueId } from 'lodash/fp';
|
17
17
|
import Color from 'color';
|
18
18
|
import { format, distanceInWords, startOfDay } from 'date-fns';
|
19
19
|
import _, { curry } from 'lodash';
|
@@ -606,10 +606,21 @@ class EllipsisComponent {
|
|
606
606
|
this.resizeObserverService = resizeObserverService;
|
607
607
|
this.translateService = translateService;
|
608
608
|
this.content = '';
|
609
|
+
/**
|
610
|
+
* Only set this to false if the content is not a user provided string
|
611
|
+
* or if you sanitize the provided content yourself.
|
612
|
+
*/
|
613
|
+
this.escapeHtmlInContent = true;
|
609
614
|
this.isShowingMore$ = new BehaviorSubject(false);
|
610
615
|
this.destroyed$ = new Subject();
|
611
616
|
}
|
612
617
|
ngOnInit() {
|
618
|
+
this.sanitizedContent$ = this.content$.pipe(map((content) => {
|
619
|
+
if (this.escapeHtmlInContent && typeof content === 'string') {
|
620
|
+
return escape(content);
|
621
|
+
}
|
622
|
+
return content;
|
623
|
+
}));
|
613
624
|
this.showMoreButtonLabel$ = this.isShowingMore$.pipe(switchMap((isShowingMore) => {
|
614
625
|
const translationKey = isShowingMore ? 'common.showLess' : 'common.showMore';
|
615
626
|
return this.translateService.get(translationKey);
|
@@ -678,7 +689,7 @@ class EllipsisComponent {
|
|
678
689
|
}
|
679
690
|
EllipsisComponent.DEFAULT_RESIZE_DEBOUNCE_MS = 500;
|
680
691
|
EllipsisComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: EllipsisComponent, deps: [{ token: LX_ELLIPSIS_DEBOUNCE_ON_RESIZE }, { token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: ResizeObserverService }, { token: i1$1.TranslateService }], target: i0.ɵɵFactoryTarget.Component });
|
681
|
-
EllipsisComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.2", type: EllipsisComponent, selector: "lx-ellipsis", inputs: { content: "content" }, viewQueries: [{ propertyName: "contentSpanEl", first: true, predicate: ["contentEl"], descendants: true }, { propertyName: "showMoreButtonEl", first: true, predicate: ["showMoreButton"], descendants: true, read: ElementRef }], ngImport: i0, template: "<span
|
692
|
+
EllipsisComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.2", type: EllipsisComponent, selector: "lx-ellipsis", inputs: { content: "content", escapeHtmlInContent: "escapeHtmlInContent" }, viewQueries: [{ propertyName: "contentSpanEl", first: true, predicate: ["contentEl"], descendants: true }, { propertyName: "showMoreButtonEl", first: true, predicate: ["showMoreButton"], descendants: true, read: ElementRef }], ngImport: i0, template: "<span\n #contentEl\n [class.showMore]=\"isShowingMore$ | async\"\n class=\"content truncate lx-margin-right\"\n [innerHtml]=\"sanitizedContent$ | async\"\n></span>\n<button *ngIf=\"showButton$ | async\" (click)=\"onShowMoreToggle()\" lx-button #showMoreButton size=\"auto\" mode=\"link\" color=\"primary\">\n {{ showMoreButtonLabel$ | async }}\n</button>\n", styles: [":host{display:block}.content{display:inline-block}.truncate:not(.showMore){width:calc(100% - 140px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.content.showMore+button{margin-top:4px;display:block}button{white-space:nowrap;vertical-align:top}\n"], components: [{ type: ButtonComponent, selector: "button[lx-button]", inputs: ["size", "color", "mode", "pressed", "selected", "square", "circle", "disabled", "showSpinner"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "async": i2.AsyncPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
682
693
|
__decorate([
|
683
694
|
Observe('contentSpanEl')
|
684
695
|
], EllipsisComponent.prototype, "contentSpanEl$", void 0);
|
@@ -690,7 +701,7 @@ __decorate([
|
|
690
701
|
], EllipsisComponent.prototype, "content$", void 0);
|
691
702
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: EllipsisComponent, decorators: [{
|
692
703
|
type: Component,
|
693
|
-
args: [{ selector: 'lx-ellipsis', changeDetection: ChangeDetectionStrategy.OnPush, template: "<span
|
704
|
+
args: [{ selector: 'lx-ellipsis', changeDetection: ChangeDetectionStrategy.OnPush, template: "<span\n #contentEl\n [class.showMore]=\"isShowingMore$ | async\"\n class=\"content truncate lx-margin-right\"\n [innerHtml]=\"sanitizedContent$ | async\"\n></span>\n<button *ngIf=\"showButton$ | async\" (click)=\"onShowMoreToggle()\" lx-button #showMoreButton size=\"auto\" mode=\"link\" color=\"primary\">\n {{ showMoreButtonLabel$ | async }}\n</button>\n", styles: [":host{display:block}.content{display:inline-block}.truncate:not(.showMore){width:calc(100% - 140px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.content.showMore+button{margin-top:4px;display:block}button{white-space:nowrap;vertical-align:top}\n"] }]
|
694
705
|
}], ctorParameters: function () {
|
695
706
|
return [{ type: undefined, decorators: [{
|
696
707
|
type: Inject,
|
@@ -698,6 +709,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImpor
|
|
698
709
|
}] }, { type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: ResizeObserverService }, { type: i1$1.TranslateService }];
|
699
710
|
}, propDecorators: { content: [{
|
700
711
|
type: Input
|
712
|
+
}], escapeHtmlInContent: [{
|
713
|
+
type: Input
|
701
714
|
}], contentSpanEl$: [], contentSpanEl: [{
|
702
715
|
type: ViewChild,
|
703
716
|
args: ['contentEl']
|
@@ -1040,174 +1053,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImpor
|
|
1040
1053
|
type: Input
|
1041
1054
|
}] } });
|
1042
1055
|
|
1043
|
-
class BrPipe {
|
1044
|
-
transform(input, options = {}) {
|
1045
|
-
if (input) {
|
1046
|
-
if (options.isTrimEnd) {
|
1047
|
-
input = trimEnd(input);
|
1048
|
-
}
|
1049
|
-
return input.replace(/[\n\r]/g, '<br/>');
|
1050
|
-
}
|
1051
|
-
return input;
|
1052
|
-
}
|
1053
|
-
}
|
1054
|
-
BrPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: BrPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
|
1055
|
-
BrPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: BrPipe, name: "lxBr" });
|
1056
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: BrPipe, decorators: [{
|
1057
|
-
type: Pipe,
|
1058
|
-
args: [{
|
1059
|
-
name: 'lxBr'
|
1060
|
-
}]
|
1061
|
-
}] });
|
1062
|
-
|
1063
|
-
/**
|
1064
|
-
* Compute the most eligible text color for a given background color (black or white), depending on the luminance of the
|
1065
|
-
* background color. In case the provided color is undefined or invalid, white (#FFFFFF) is returned.
|
1066
|
-
*
|
1067
|
-
* @param colorHex Color string in hexadecimal encoding.
|
1068
|
-
* @returns Equivalent contrast color in hexadecimal encoding.
|
1069
|
-
*/
|
1070
|
-
function getContrastColor(colorHex) {
|
1071
|
-
try {
|
1072
|
-
const color = Color(colorHex || '#000');
|
1073
|
-
// Check http://codepen.io/WebSeed/pen/pvgqEq
|
1074
|
-
const a = 1 - (0.299 * color.red() + 0.587 * color.green() + 0.114 * color.blue()) / 255;
|
1075
|
-
const d = a < 0.4 ? 0 : 255;
|
1076
|
-
return Color({ r: d, g: d, b: d }).hex();
|
1077
|
-
}
|
1078
|
-
catch (_a) {
|
1079
|
-
return '#FFFFFF';
|
1080
|
-
}
|
1081
|
-
}
|
1082
|
-
function shorthandHexHandle(hex) {
|
1083
|
-
const shorthandRegex = /^(#)([a-f\d])([a-f\d])([a-f\d])$/i;
|
1084
|
-
const shorthand = hex.match(shorthandRegex);
|
1085
|
-
if (shorthand) {
|
1086
|
-
const convertedHex = shorthand[1] + shorthand[2] + shorthand[2] + shorthand[3] + shorthand[3] + shorthand[4] + shorthand[4];
|
1087
|
-
return convertedHex;
|
1088
|
-
}
|
1089
|
-
else {
|
1090
|
-
return hex;
|
1091
|
-
}
|
1092
|
-
}
|
1093
|
-
function isValidHexColor(color) {
|
1094
|
-
return /^#[0-9A-F]{6}$/i.test(color);
|
1095
|
-
}
|
1096
|
-
|
1097
|
-
class ContrastColorPipe {
|
1098
|
-
transform(color) {
|
1099
|
-
if (color) {
|
1100
|
-
return isValidHexColor(shorthandHexHandle(color)) ? getContrastColor(color) : '';
|
1101
|
-
}
|
1102
|
-
return '';
|
1103
|
-
}
|
1104
|
-
}
|
1105
|
-
ContrastColorPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: ContrastColorPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
|
1106
|
-
ContrastColorPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: ContrastColorPipe, name: "lxContrastColor" });
|
1107
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: ContrastColorPipe, decorators: [{
|
1108
|
-
type: Pipe,
|
1109
|
-
args: [{
|
1110
|
-
name: 'lxContrastColor'
|
1111
|
-
}]
|
1112
|
-
}] });
|
1113
|
-
|
1114
|
-
const DATE_FORMATS = new InjectionToken('DATE_FORMATS', {
|
1115
|
-
providedIn: 'root',
|
1116
|
-
factory: () => ({
|
1117
|
-
getDateFormat: () => 'YYYY-MM-DD',
|
1118
|
-
getDateTimeFormat: () => 'YYYY-MM-DD HH:mm',
|
1119
|
-
getDateTimeFormatWithSeconds: () => 'YYYY-MM-DD HH:mm:ss'
|
1120
|
-
})
|
1121
|
-
});
|
1122
|
-
const DATE_FN_LOCALE = new InjectionToken('DATE_FN_LOCALE');
|
1123
|
-
const LOCALE_FN = new InjectionToken('LOCALE_FN');
|
1124
|
-
const GLOBAL_TRANSLATION_OPTIONS = new InjectionToken('GLOBAL_TRANSLATION_OPTIONS');
|
1125
|
-
|
1126
|
-
class CustomDatePipe {
|
1127
|
-
constructor(getDateFnLocale) {
|
1128
|
-
this.getDateFnLocale = getDateFnLocale;
|
1129
|
-
}
|
1130
|
-
transform(value, f) {
|
1131
|
-
const locale = this.getDateFnLocale ? this.getDateFnLocale() : null;
|
1132
|
-
return value ? format(value, f, { locale }) : '';
|
1133
|
-
}
|
1134
|
-
}
|
1135
|
-
CustomDatePipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: CustomDatePipe, deps: [{ token: DATE_FN_LOCALE, optional: true }], target: i0.ɵɵFactoryTarget.Pipe });
|
1136
|
-
CustomDatePipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: CustomDatePipe, name: "lxDate" });
|
1137
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: CustomDatePipe, decorators: [{
|
1138
|
-
type: Pipe,
|
1139
|
-
args: [{
|
1140
|
-
name: 'lxDate'
|
1141
|
-
}]
|
1142
|
-
}], ctorParameters: function () {
|
1143
|
-
return [{ type: Function, decorators: [{
|
1144
|
-
type: Optional
|
1145
|
-
}, {
|
1146
|
-
type: Inject,
|
1147
|
-
args: [DATE_FN_LOCALE]
|
1148
|
-
}] }];
|
1149
|
-
} });
|
1150
|
-
|
1151
|
-
class HighlightRangePipe {
|
1152
|
-
transform(text, offset = 0, length = 0) {
|
1153
|
-
if (!text || offset < 0 || length < 0 || offset >= (text === null || text === void 0 ? void 0 : text.length) || offset + length > (text === null || text === void 0 ? void 0 : text.length)) {
|
1154
|
-
return '';
|
1155
|
-
}
|
1156
|
-
const highlightedPart = text.slice(offset, offset + length);
|
1157
|
-
return text.slice(0, offset) + (highlightedPart.length !== 0 ? this.highlight(highlightedPart) : '') + text.slice(offset + length);
|
1158
|
-
}
|
1159
|
-
highlight(text) {
|
1160
|
-
return `<span class="termHighlight">${text}</span>`;
|
1161
|
-
}
|
1162
|
-
}
|
1163
|
-
HighlightRangePipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: HighlightRangePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
|
1164
|
-
HighlightRangePipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: HighlightRangePipe, name: "lxHighlightRange" });
|
1165
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: HighlightRangePipe, decorators: [{
|
1166
|
-
type: Pipe,
|
1167
|
-
args: [{ name: 'lxHighlightRange' }]
|
1168
|
-
}] });
|
1169
|
-
|
1170
|
-
/**
|
1171
|
-
* These characters are treated as seperators by
|
1172
|
-
* elasticsearch and split the input into search tokens
|
1173
|
-
* which are used to find matches.
|
1174
|
-
*/
|
1175
|
-
const STANDARD_TOKENIZER_SEPERATORS = /[^a-zA-Z\d\s]/g;
|
1176
|
-
class HighlightTermPipe {
|
1177
|
-
transform(text, search) {
|
1178
|
-
if (search && text) {
|
1179
|
-
let pattern = search
|
1180
|
-
.replace(STANDARD_TOKENIZER_SEPERATORS, ' ')
|
1181
|
-
// replace special chars for a backslash for RegExp
|
1182
|
-
.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&');
|
1183
|
-
pattern = pattern
|
1184
|
-
.split(' ')
|
1185
|
-
.filter((t) => {
|
1186
|
-
return t.length > 0;
|
1187
|
-
})
|
1188
|
-
.join('|');
|
1189
|
-
const regex = new RegExp(pattern, 'gi');
|
1190
|
-
text = _.escape(text);
|
1191
|
-
return text.replace(regex, (match) => `<span class="termHighlight">${match}</span>`); // add highlighting to matched regex pattern
|
1192
|
-
}
|
1193
|
-
else {
|
1194
|
-
return text;
|
1195
|
-
}
|
1196
|
-
}
|
1197
|
-
}
|
1198
|
-
HighlightTermPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: HighlightTermPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
|
1199
|
-
HighlightTermPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: HighlightTermPipe, name: "lxHighlightTerm" });
|
1200
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: HighlightTermPipe, decorators: [{
|
1201
|
-
type: Pipe,
|
1202
|
-
args: [{ name: 'lxHighlightTerm' }]
|
1203
|
-
}] });
|
1204
|
-
|
1205
1056
|
/**
|
1206
1057
|
* This pipe transforms...
|
1207
1058
|
* - "raw" http(s) links
|
1208
1059
|
* - markdown link syntax
|
1209
1060
|
* ... into clickable anchor elements.
|
1210
1061
|
*
|
1062
|
+
* The characters "<" and ">" are escaped with their HTML entities < and >.
|
1063
|
+
*
|
1211
1064
|
* You have an user interface where you don't want clickable links but also
|
1212
1065
|
* don't want users to see the "ugly" markdown link syntax?
|
1213
1066
|
* -> Use the 'lxUnlikify' pipe to replace markdown link syntax with just the link name
|
@@ -1215,7 +1068,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImpor
|
|
1215
1068
|
class LxLinkifyPipe {
|
1216
1069
|
transform(text) {
|
1217
1070
|
if (text && typeof text === 'string') {
|
1218
|
-
const
|
1071
|
+
const escapedText = this.escapeHtmlInUserProvidedString(text);
|
1072
|
+
const textWithRawLinks = this.wrapRawHttpLinksWithAnchorTags(escapedText);
|
1219
1073
|
const textWithRawAndNamedLinks = this.turnMarkdownStyleLinksIntoAnchorTags(textWithRawLinks);
|
1220
1074
|
return textWithRawAndNamedLinks;
|
1221
1075
|
}
|
@@ -1294,6 +1148,17 @@ class LxLinkifyPipe {
|
|
1294
1148
|
}
|
1295
1149
|
return matches;
|
1296
1150
|
}
|
1151
|
+
/**
|
1152
|
+
* We assume that lxLinkify is exclusively used on user provided strings.
|
1153
|
+
* This is why we want to escape any other HTML tags that are already present in the string.
|
1154
|
+
* The logic implemented here has been used with no issues for three years in our Fact Sheet comments. See https://github.com/gregjacobs/Autolinker.js/pull/313
|
1155
|
+
*
|
1156
|
+
* When using lxLinkify in conjunction with other pipes that add HTML, make sure to use lxLinkify first,
|
1157
|
+
* so that it doesn't escape the HTML of any previous pipes.
|
1158
|
+
*/
|
1159
|
+
escapeHtmlInUserProvidedString(input) {
|
1160
|
+
return input.replace(/<|>/gi, (match) => '&' + (match === '>' ? 'g' : 'l') + 't;');
|
1161
|
+
}
|
1297
1162
|
}
|
1298
1163
|
/**
|
1299
1164
|
* This is not the "one URL regex to rule them all", but a more realistic one which should work
|
@@ -1375,6 +1240,168 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImpor
|
|
1375
1240
|
args: [{ name: 'lxUnlinkify' }]
|
1376
1241
|
}] });
|
1377
1242
|
|
1243
|
+
class BrPipe {
|
1244
|
+
transform(input, options = {}) {
|
1245
|
+
if (input) {
|
1246
|
+
if (options.isTrimEnd) {
|
1247
|
+
input = trimEnd(input);
|
1248
|
+
}
|
1249
|
+
return input.replace(/[\n\r]/g, '<br/>');
|
1250
|
+
}
|
1251
|
+
return input;
|
1252
|
+
}
|
1253
|
+
}
|
1254
|
+
BrPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: BrPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
|
1255
|
+
BrPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: BrPipe, name: "lxBr" });
|
1256
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: BrPipe, decorators: [{
|
1257
|
+
type: Pipe,
|
1258
|
+
args: [{
|
1259
|
+
name: 'lxBr'
|
1260
|
+
}]
|
1261
|
+
}] });
|
1262
|
+
|
1263
|
+
/**
|
1264
|
+
* Compute the most eligible text color for a given background color (black or white), depending on the luminance of the
|
1265
|
+
* background color. In case the provided color is undefined or invalid, white (#FFFFFF) is returned.
|
1266
|
+
*
|
1267
|
+
* @param colorHex Color string in hexadecimal encoding.
|
1268
|
+
* @returns Equivalent contrast color in hexadecimal encoding.
|
1269
|
+
*/
|
1270
|
+
function getContrastColor(colorHex) {
|
1271
|
+
try {
|
1272
|
+
const color = Color(colorHex || '#000');
|
1273
|
+
// Check http://codepen.io/WebSeed/pen/pvgqEq
|
1274
|
+
const a = 1 - (0.299 * color.red() + 0.587 * color.green() + 0.114 * color.blue()) / 255;
|
1275
|
+
const d = a < 0.4 ? 0 : 255;
|
1276
|
+
return Color({ r: d, g: d, b: d }).hex();
|
1277
|
+
}
|
1278
|
+
catch (_a) {
|
1279
|
+
return '#FFFFFF';
|
1280
|
+
}
|
1281
|
+
}
|
1282
|
+
function shorthandHexHandle(hex) {
|
1283
|
+
const shorthandRegex = /^(#)([a-f\d])([a-f\d])([a-f\d])$/i;
|
1284
|
+
const shorthand = hex.match(shorthandRegex);
|
1285
|
+
if (shorthand) {
|
1286
|
+
const convertedHex = shorthand[1] + shorthand[2] + shorthand[2] + shorthand[3] + shorthand[3] + shorthand[4] + shorthand[4];
|
1287
|
+
return convertedHex;
|
1288
|
+
}
|
1289
|
+
else {
|
1290
|
+
return hex;
|
1291
|
+
}
|
1292
|
+
}
|
1293
|
+
function isValidHexColor(color) {
|
1294
|
+
return /^#[0-9A-F]{6}$/i.test(color);
|
1295
|
+
}
|
1296
|
+
|
1297
|
+
class ContrastColorPipe {
|
1298
|
+
transform(color) {
|
1299
|
+
if (color) {
|
1300
|
+
return isValidHexColor(shorthandHexHandle(color)) ? getContrastColor(color) : '';
|
1301
|
+
}
|
1302
|
+
return '';
|
1303
|
+
}
|
1304
|
+
}
|
1305
|
+
ContrastColorPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: ContrastColorPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
|
1306
|
+
ContrastColorPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: ContrastColorPipe, name: "lxContrastColor" });
|
1307
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: ContrastColorPipe, decorators: [{
|
1308
|
+
type: Pipe,
|
1309
|
+
args: [{
|
1310
|
+
name: 'lxContrastColor'
|
1311
|
+
}]
|
1312
|
+
}] });
|
1313
|
+
|
1314
|
+
const DATE_FORMATS = new InjectionToken('DATE_FORMATS', {
|
1315
|
+
providedIn: 'root',
|
1316
|
+
factory: () => ({
|
1317
|
+
getDateFormat: () => 'YYYY-MM-DD',
|
1318
|
+
getDateTimeFormat: () => 'YYYY-MM-DD HH:mm',
|
1319
|
+
getDateTimeFormatWithSeconds: () => 'YYYY-MM-DD HH:mm:ss'
|
1320
|
+
})
|
1321
|
+
});
|
1322
|
+
const DATE_FN_LOCALE = new InjectionToken('DATE_FN_LOCALE');
|
1323
|
+
const LOCALE_FN = new InjectionToken('LOCALE_FN');
|
1324
|
+
const GLOBAL_TRANSLATION_OPTIONS = new InjectionToken('GLOBAL_TRANSLATION_OPTIONS');
|
1325
|
+
|
1326
|
+
class CustomDatePipe {
|
1327
|
+
constructor(getDateFnLocale) {
|
1328
|
+
this.getDateFnLocale = getDateFnLocale;
|
1329
|
+
}
|
1330
|
+
transform(value, f) {
|
1331
|
+
const locale = this.getDateFnLocale ? this.getDateFnLocale() : null;
|
1332
|
+
return value ? format(value, f, { locale }) : '';
|
1333
|
+
}
|
1334
|
+
}
|
1335
|
+
CustomDatePipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: CustomDatePipe, deps: [{ token: DATE_FN_LOCALE, optional: true }], target: i0.ɵɵFactoryTarget.Pipe });
|
1336
|
+
CustomDatePipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: CustomDatePipe, name: "lxDate" });
|
1337
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: CustomDatePipe, decorators: [{
|
1338
|
+
type: Pipe,
|
1339
|
+
args: [{
|
1340
|
+
name: 'lxDate'
|
1341
|
+
}]
|
1342
|
+
}], ctorParameters: function () {
|
1343
|
+
return [{ type: Function, decorators: [{
|
1344
|
+
type: Optional
|
1345
|
+
}, {
|
1346
|
+
type: Inject,
|
1347
|
+
args: [DATE_FN_LOCALE]
|
1348
|
+
}] }];
|
1349
|
+
} });
|
1350
|
+
|
1351
|
+
class HighlightRangePipe {
|
1352
|
+
transform(text, offset = 0, length = 0) {
|
1353
|
+
if (!text || offset < 0 || length < 0 || offset >= (text === null || text === void 0 ? void 0 : text.length) || offset + length > (text === null || text === void 0 ? void 0 : text.length)) {
|
1354
|
+
return '';
|
1355
|
+
}
|
1356
|
+
const highlightedPart = text.slice(offset, offset + length);
|
1357
|
+
return text.slice(0, offset) + (highlightedPart.length !== 0 ? this.highlight(highlightedPart) : '') + text.slice(offset + length);
|
1358
|
+
}
|
1359
|
+
highlight(text) {
|
1360
|
+
return `<span class="termHighlight">${text}</span>`;
|
1361
|
+
}
|
1362
|
+
}
|
1363
|
+
HighlightRangePipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: HighlightRangePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
|
1364
|
+
HighlightRangePipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: HighlightRangePipe, name: "lxHighlightRange" });
|
1365
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: HighlightRangePipe, decorators: [{
|
1366
|
+
type: Pipe,
|
1367
|
+
args: [{ name: 'lxHighlightRange' }]
|
1368
|
+
}] });
|
1369
|
+
|
1370
|
+
/**
|
1371
|
+
* These characters are treated as seperators by
|
1372
|
+
* elasticsearch and split the input into search tokens
|
1373
|
+
* which are used to find matches.
|
1374
|
+
*/
|
1375
|
+
const STANDARD_TOKENIZER_SEPERATORS = /[^a-zA-Z\d\s]/g;
|
1376
|
+
class HighlightTermPipe {
|
1377
|
+
transform(text, search) {
|
1378
|
+
if (search && text) {
|
1379
|
+
let pattern = search
|
1380
|
+
.replace(STANDARD_TOKENIZER_SEPERATORS, ' ')
|
1381
|
+
// replace special chars for a backslash for RegExp
|
1382
|
+
.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&');
|
1383
|
+
pattern = pattern
|
1384
|
+
.split(' ')
|
1385
|
+
.filter((t) => {
|
1386
|
+
return t.length > 0;
|
1387
|
+
})
|
1388
|
+
.join('|');
|
1389
|
+
const regex = new RegExp(pattern, 'gi');
|
1390
|
+
text = _.escape(text);
|
1391
|
+
return text.replace(regex, (match) => `<span class="termHighlight">${match}</span>`); // add highlighting to matched regex pattern
|
1392
|
+
}
|
1393
|
+
else {
|
1394
|
+
return text;
|
1395
|
+
}
|
1396
|
+
}
|
1397
|
+
}
|
1398
|
+
HighlightTermPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: HighlightTermPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
|
1399
|
+
HighlightTermPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: HighlightTermPipe, name: "lxHighlightTerm" });
|
1400
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: HighlightTermPipe, decorators: [{
|
1401
|
+
type: Pipe,
|
1402
|
+
args: [{ name: 'lxHighlightTerm' }]
|
1403
|
+
}] });
|
1404
|
+
|
1378
1405
|
function isUuid(s) {
|
1379
1406
|
const uuidRegEx = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;
|
1380
1407
|
return uuidRegEx.test(s);
|
@@ -6143,6 +6170,7 @@ class PopoverComponent {
|
|
6143
6170
|
constructor() {
|
6144
6171
|
this.noMargin = false;
|
6145
6172
|
this.allowOverflow = false;
|
6173
|
+
this.autoFocus = false;
|
6146
6174
|
/**
|
6147
6175
|
* If you have a popover, that should usually be displayed above or below its anchor,
|
6148
6176
|
* and this anchor is in a scrollable container, you should set this to true.
|
@@ -6251,10 +6279,10 @@ class PopoverComponent {
|
|
6251
6279
|
}
|
6252
6280
|
}
|
6253
6281
|
PopoverComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: PopoverComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
6254
|
-
PopoverComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.2", type: PopoverComponent, selector: "lx-popover", inputs: { trigger: "trigger", horizontalAlign: "horizontalAlign", verticalAlign: "verticalAlign", noMargin: "noMargin", allowOverflow: "allowOverflow", adaptMarginsForViewportAlignChange: "adaptMarginsForViewportAlignChange" }, outputs: { opened: "opened", closed: "closed" }, queries: [{ propertyName: "explicitContent", first: true, predicate: PopoverContentDirective, descendants: true, read: TemplateRef, static: true }], viewQueries: [{ propertyName: "satPopover", first: true, predicate: SatPopover, descendants: true, static: true }, { propertyName: "implicitContent", first: true, predicate: ["implicitContent"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<sat-popover\n [anchor]=\"trigger.anchor\"\n [horizontalAlign]=\"horizontalAlign\"\n [verticalAlign]=\"verticalAlign\"\n [restoreFocus]=\"false\"\n [lockAlignment]=\"true\"\n [autoFocus]=\"
|
6282
|
+
PopoverComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.2", type: PopoverComponent, selector: "lx-popover", inputs: { trigger: "trigger", horizontalAlign: "horizontalAlign", verticalAlign: "verticalAlign", noMargin: "noMargin", allowOverflow: "allowOverflow", autoFocus: "autoFocus", adaptMarginsForViewportAlignChange: "adaptMarginsForViewportAlignChange" }, outputs: { opened: "opened", closed: "closed" }, queries: [{ propertyName: "explicitContent", first: true, predicate: PopoverContentDirective, descendants: true, read: TemplateRef, static: true }], viewQueries: [{ propertyName: "satPopover", first: true, predicate: SatPopover, descendants: true, static: true }, { propertyName: "implicitContent", first: true, predicate: ["implicitContent"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<sat-popover\n [anchor]=\"trigger.anchor\"\n [horizontalAlign]=\"horizontalAlign\"\n [verticalAlign]=\"verticalAlign\"\n [restoreFocus]=\"false\"\n [lockAlignment]=\"true\"\n [autoFocus]=\"autoFocus\"\n openTransition=\"0ms\"\n closeTransition=\"0ms\"\n (opened)=\"onOpen()\"\n (afterOpen)=\"onAfterOpen()\"\n (closed)=\"onClose()\"\n>\n <div\n class=\"popoverContainer\"\n [ngClass]=\"marginClasses\"\n [class.overflowHidden]=\"!allowOverflow\"\n (mouseenter)=\"trigger.showPopover(true)\"\n (mouseleave)=\"trigger.closePopover(true)\"\n (keydown.escape)=\"$event.stopPropagation(); trigger.closePopover(true)\"\n >\n <ng-container *ngIf=\"isOpen\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n </ng-container>\n </div>\n</sat-popover>\n<ng-template #implicitContent>\n <ng-content></ng-content>\n</ng-template>\n", styles: ["@keyframes subtleScaleUpKeyFrames{0%{transform:scale(.95);opacity:0}}.popoverContainer{position:relative;box-shadow:0 8px 12px 2px #00000026;max-width:600px;max-height:80vh;border-radius:3px;background-color:#fff;-webkit-hyphens:auto;hyphens:auto;animation:subtleScaleUpKeyFrames .2s ease}.popoverContainer.overflowHidden{overflow:hidden}.right{margin-left:18px}.left{margin-right:18px}.bottom{margin-top:18px}.top{margin-bottom:18px}\n"], components: [{ type: i1$6.SatPopover, selector: "sat-popover", inputs: ["anchor", "horizontalAlign", "xAlign", "verticalAlign", "yAlign", "forceAlignment", "lockAlignment", "autoFocus", "restoreFocus", "scrollStrategy", "hasBackdrop", "interactiveClose", "openTransition", "closeTransition", "openAnimationStartAtScale", "closeAnimationEndAtScale", "backdropClass", "panelClass"], outputs: ["opened", "closed", "afterOpen", "afterClose", "backdropClicked", "overlayKeydown"] }], directives: [{ type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }] });
|
6255
6283
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImport: i0, type: PopoverComponent, decorators: [{
|
6256
6284
|
type: Component,
|
6257
|
-
args: [{ selector: 'lx-popover', template: "<sat-popover\n [anchor]=\"trigger.anchor\"\n [horizontalAlign]=\"horizontalAlign\"\n [verticalAlign]=\"verticalAlign\"\n [restoreFocus]=\"false\"\n [lockAlignment]=\"true\"\n [autoFocus]=\"
|
6285
|
+
args: [{ selector: 'lx-popover', template: "<sat-popover\n [anchor]=\"trigger.anchor\"\n [horizontalAlign]=\"horizontalAlign\"\n [verticalAlign]=\"verticalAlign\"\n [restoreFocus]=\"false\"\n [lockAlignment]=\"true\"\n [autoFocus]=\"autoFocus\"\n openTransition=\"0ms\"\n closeTransition=\"0ms\"\n (opened)=\"onOpen()\"\n (afterOpen)=\"onAfterOpen()\"\n (closed)=\"onClose()\"\n>\n <div\n class=\"popoverContainer\"\n [ngClass]=\"marginClasses\"\n [class.overflowHidden]=\"!allowOverflow\"\n (mouseenter)=\"trigger.showPopover(true)\"\n (mouseleave)=\"trigger.closePopover(true)\"\n (keydown.escape)=\"$event.stopPropagation(); trigger.closePopover(true)\"\n >\n <ng-container *ngIf=\"isOpen\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n </ng-container>\n </div>\n</sat-popover>\n<ng-template #implicitContent>\n <ng-content></ng-content>\n</ng-template>\n", styles: ["@keyframes subtleScaleUpKeyFrames{0%{transform:scale(.95);opacity:0}}.popoverContainer{position:relative;box-shadow:0 8px 12px 2px #00000026;max-width:600px;max-height:80vh;border-radius:3px;background-color:#fff;-webkit-hyphens:auto;hyphens:auto;animation:subtleScaleUpKeyFrames .2s ease}.popoverContainer.overflowHidden{overflow:hidden}.right{margin-left:18px}.left{margin-right:18px}.bottom{margin-top:18px}.top{margin-bottom:18px}\n"] }]
|
6258
6286
|
}], propDecorators: { trigger: [{
|
6259
6287
|
type: Input
|
6260
6288
|
}], horizontalAlign: [{
|
@@ -6265,6 +6293,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.2", ngImpor
|
|
6265
6293
|
type: Input
|
6266
6294
|
}], allowOverflow: [{
|
6267
6295
|
type: Input
|
6296
|
+
}], autoFocus: [{
|
6297
|
+
type: Input
|
6268
6298
|
}], adaptMarginsForViewportAlignChange: [{
|
6269
6299
|
type: Input
|
6270
6300
|
}], opened: [{
|