ng-primitives 0.8.0 → 0.10.0

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.
Files changed (68) hide show
  1. package/accordion/accordion-trigger/accordion-trigger.directive.d.ts +1 -2
  2. package/esm2022/accordion/accordion-trigger/accordion-trigger.directive.mjs +2 -5
  3. package/esm2022/interactions/focus-visible/focus-visible.directive.mjs +27 -20
  4. package/esm2022/popover/config/popover.config.mjs +39 -0
  5. package/esm2022/popover/index.mjs +13 -0
  6. package/esm2022/popover/ng-primitives-popover.mjs +5 -0
  7. package/esm2022/popover/popover/popover.directive.mjs +60 -0
  8. package/esm2022/popover/popover/popover.token.mjs +16 -0
  9. package/esm2022/popover/popover-trigger/popover-trigger.directive.mjs +222 -0
  10. package/esm2022/popover/popover-trigger/popover-trigger.token.mjs +23 -0
  11. package/esm2022/toast/config/toast.config.mjs +38 -0
  12. package/esm2022/toast/index.mjs +12 -0
  13. package/esm2022/toast/ng-primitives-toast.mjs +5 -0
  14. package/esm2022/toast/toast/toast-ref.mjs +96 -0
  15. package/esm2022/toast/toast/toast.directive.mjs +100 -0
  16. package/esm2022/toast/toast/toast.token.mjs +16 -0
  17. package/esm2022/utils/index.mjs +2 -2
  18. package/esm2022/utils/signals/async.mjs +18 -2
  19. package/fesm2022/ng-primitives-accordion.mjs +1 -4
  20. package/fesm2022/ng-primitives-accordion.mjs.map +1 -1
  21. package/fesm2022/ng-primitives-interactions.mjs +25 -19
  22. package/fesm2022/ng-primitives-interactions.mjs.map +1 -1
  23. package/fesm2022/ng-primitives-popover.mjs +366 -0
  24. package/fesm2022/ng-primitives-popover.mjs.map +1 -0
  25. package/fesm2022/ng-primitives-toast.mjs +260 -0
  26. package/fesm2022/ng-primitives-toast.mjs.map +1 -0
  27. package/fesm2022/ng-primitives-utils.mjs +18 -2
  28. package/fesm2022/ng-primitives-utils.mjs.map +1 -1
  29. package/generators.json +20 -0
  30. package/interactions/focus-visible/focus-visible.directive.d.ts +3 -2
  31. package/package.json +26 -14
  32. package/popover/README.md +3 -0
  33. package/popover/config/popover.config.d.ts +59 -0
  34. package/popover/index.d.ts +12 -0
  35. package/popover/popover/popover.directive.d.ts +31 -0
  36. package/popover/popover/popover.token.d.ts +14 -0
  37. package/popover/popover-trigger/popover-trigger.directive.d.ts +127 -0
  38. package/popover/popover-trigger/popover-trigger.token.d.ts +22 -0
  39. package/schematics/checkbox/compat.d.ts +2 -0
  40. package/schematics/checkbox/compat.js +13 -0
  41. package/schematics/checkbox/compat.js.map +1 -0
  42. package/schematics/checkbox/files/checkbox.component.__style__.template +1 -0
  43. package/schematics/checkbox/files/checkbox.component.html.template +1 -0
  44. package/schematics/checkbox/files/checkbox.component.ts.template +69 -0
  45. package/schematics/checkbox/generator.d.ts +11 -0
  46. package/schematics/checkbox/generator.js +48 -0
  47. package/schematics/checkbox/generator.js.map +1 -0
  48. package/schematics/checkbox/schema.d.ts +16 -0
  49. package/schematics/checkbox/schema.json +39 -0
  50. package/schematics/file-upload/compat.d.ts +2 -0
  51. package/schematics/file-upload/compat.js +13 -0
  52. package/schematics/file-upload/compat.js.map +1 -0
  53. package/schematics/file-upload/files/file-upload.component.__style__.template +1 -0
  54. package/schematics/file-upload/files/file-upload.component.html.template +1 -0
  55. package/schematics/file-upload/files/file-upload.component.ts.template +28 -0
  56. package/schematics/file-upload/generator.d.ts +11 -0
  57. package/schematics/file-upload/generator.js +37 -0
  58. package/schematics/file-upload/generator.js.map +1 -0
  59. package/schematics/file-upload/schema.d.ts +16 -0
  60. package/schematics/file-upload/schema.json +39 -0
  61. package/toast/README.md +3 -0
  62. package/toast/config/toast.config.d.ts +48 -0
  63. package/toast/index.d.ts +11 -0
  64. package/toast/toast/toast-ref.d.ts +56 -0
  65. package/toast/toast/toast.directive.d.ts +39 -0
  66. package/toast/toast/toast.token.d.ts +14 -0
  67. package/utils/index.d.ts +1 -1
  68. package/utils/signals/async.d.ts +10 -1
@@ -1,5 +1,4 @@
1
1
  import * as i0 from "@angular/core";
2
- import * as i1 from "ng-primitives/interactions";
3
2
  export declare class NgpAccordionTrigger {
4
3
  /**
5
4
  * Access the parent accordion.
@@ -18,5 +17,5 @@ export declare class NgpAccordionTrigger {
18
17
  */
19
18
  toggle(): void;
20
19
  static ɵfac: i0.ɵɵFactoryDeclaration<NgpAccordionTrigger, never>;
21
- static ɵdir: i0.ɵɵDirectiveDeclaration<NgpAccordionTrigger, "[ngpAccordionTrigger]", ["ngpAccordionTrigger"], { "id": { "alias": "id"; "required": false; "isSignal": true; }; }, {}, never, never, true, [{ directive: typeof i1.NgpHover; inputs: {}; outputs: {}; }, { directive: typeof i1.NgpPress; inputs: {}; outputs: {}; }, { directive: typeof i1.NgpFocusVisible; inputs: {}; outputs: {}; }]>;
20
+ static ɵdir: i0.ɵɵDirectiveDeclaration<NgpAccordionTrigger, "[ngpAccordionTrigger]", ["ngpAccordionTrigger"], { "id": { "alias": "id"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
22
21
  }
@@ -6,13 +6,11 @@
6
6
  * LICENSE file in the root directory of this source tree.
7
7
  */
8
8
  import { Directive, HostListener, input } from '@angular/core';
9
- import { NgpFocusVisible, NgpHover, NgpPress } from 'ng-primitives/interactions';
10
9
  import { uniqueId } from 'ng-primitives/utils';
11
10
  import { injectAccordionItem } from '../accordion-item/accordion-item.token';
12
11
  import { injectAccordion } from '../accordion/accordion.token';
13
12
  import { NgpAccordionTriggerToken } from './accordion-trigger.token';
14
13
  import * as i0 from "@angular/core";
15
- import * as i1 from "ng-primitives/interactions";
16
14
  export class NgpAccordionTrigger {
17
15
  constructor() {
18
16
  /**
@@ -38,7 +36,7 @@ export class NgpAccordionTrigger {
38
36
  this.accordion.toggle(this.item.value());
39
37
  }
40
38
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: NgpAccordionTrigger, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
41
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.1.1", type: NgpAccordionTrigger, isStandalone: true, selector: "[ngpAccordionTrigger]", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "click": "toggle()" }, properties: { "id": "id()", "attr.data-orientation": "accordion.orientation()", "attr.data-open": "item.open()", "attr.data-disabled": "item.disabled() || accordion.disabled()", "attr.aria-controls": "item.contentId()", "attr.aria-expanded": "item.open()" } }, providers: [{ provide: NgpAccordionTriggerToken, useExisting: NgpAccordionTrigger }], exportAs: ["ngpAccordionTrigger"], hostDirectives: [{ directive: i1.NgpHover }, { directive: i1.NgpPress }, { directive: i1.NgpFocusVisible }], ngImport: i0 }); }
39
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.1.1", type: NgpAccordionTrigger, isStandalone: true, selector: "[ngpAccordionTrigger]", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "click": "toggle()" }, properties: { "id": "id()", "attr.data-orientation": "accordion.orientation()", "attr.data-open": "item.open()", "attr.data-disabled": "item.disabled() || accordion.disabled()", "attr.aria-controls": "item.contentId()", "attr.aria-expanded": "item.open()" } }, providers: [{ provide: NgpAccordionTriggerToken, useExisting: NgpAccordionTrigger }], exportAs: ["ngpAccordionTrigger"], ngImport: i0 }); }
42
40
  }
43
41
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: NgpAccordionTrigger, decorators: [{
44
42
  type: Directive,
@@ -47,7 +45,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.1", ngImpor
47
45
  selector: '[ngpAccordionTrigger]',
48
46
  exportAs: 'ngpAccordionTrigger',
49
47
  providers: [{ provide: NgpAccordionTriggerToken, useExisting: NgpAccordionTrigger }],
50
- hostDirectives: [NgpHover, NgpPress, NgpFocusVisible],
51
48
  host: {
52
49
  '[id]': 'id()',
53
50
  '[attr.data-orientation]': 'accordion.orientation()',
@@ -61,4 +58,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.1", ngImpor
61
58
  type: HostListener,
62
59
  args: ['click']
63
60
  }] } });
64
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjb3JkaW9uLXRyaWdnZXIuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvbmctcHJpbWl0aXZlcy9hY2NvcmRpb24vc3JjL2FjY29yZGlvbi10cmlnZ2VyL2FjY29yZGlvbi10cmlnZ2VyLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFDSCxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDakYsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQzs7O0FBaUJyRSxNQUFNLE9BQU8sbUJBQW1CO0lBZmhDO1FBZ0JFOztXQUVHO1FBQ2dCLGNBQVMsR0FBRyxlQUFlLEVBQUUsQ0FBQztRQUVqRDs7V0FFRztRQUNnQixTQUFJLEdBQUcsbUJBQW1CLEVBQUUsQ0FBQztRQUVoRDs7V0FFRztRQUNNLE9BQUUsR0FBRyxLQUFLLENBQVMsUUFBUSxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQztLQWFoRTtJQVhDOztPQUVHO0lBRUgsTUFBTTtRQUNKLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUM7WUFDdEQsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDM0MsQ0FBQzs4R0ExQlUsbUJBQW1CO2tHQUFuQixtQkFBbUIsZ2ZBWG5CLENBQUMsRUFBRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLENBQUM7OzJGQVd6RSxtQkFBbUI7a0JBZi9CLFNBQVM7bUJBQUM7b0JBQ1QsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFFBQVEsRUFBRSx1QkFBdUI7b0JBQ2pDLFFBQVEsRUFBRSxxQkFBcUI7b0JBQy9CLFNBQVMsRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLFdBQVcscUJBQXFCLEVBQUUsQ0FBQztvQkFDcEYsY0FBYyxFQUFFLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxlQUFlLENBQUM7b0JBQ3JELElBQUksRUFBRTt3QkFDSixNQUFNLEVBQUUsTUFBTTt3QkFDZCx5QkFBeUIsRUFBRSx5QkFBeUI7d0JBQ3BELGtCQUFrQixFQUFFLGFBQWE7d0JBQ2pDLHNCQUFzQixFQUFFLHlDQUF5Qzt3QkFDakUsc0JBQXNCLEVBQUUsa0JBQWtCO3dCQUMxQyxzQkFBc0IsRUFBRSxhQUFhO3FCQUN0QztpQkFDRjs4QkFxQkMsTUFBTTtzQkFETCxZQUFZO3VCQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCDCqSAyMDI0IEFuZ3VsYXIgUHJpbWl0aXZlcy5cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9uZy1wcmltaXRpdmVzL25nLXByaW1pdGl2ZXNcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgMi4wIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cbmltcG9ydCB7IERpcmVjdGl2ZSwgSG9zdExpc3RlbmVyLCBpbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmdwRm9jdXNWaXNpYmxlLCBOZ3BIb3ZlciwgTmdwUHJlc3MgfSBmcm9tICduZy1wcmltaXRpdmVzL2ludGVyYWN0aW9ucyc7XG5pbXBvcnQgeyB1bmlxdWVJZCB9IGZyb20gJ25nLXByaW1pdGl2ZXMvdXRpbHMnO1xuaW1wb3J0IHsgaW5qZWN0QWNjb3JkaW9uSXRlbSB9IGZyb20gJy4uL2FjY29yZGlvbi1pdGVtL2FjY29yZGlvbi1pdGVtLnRva2VuJztcbmltcG9ydCB7IGluamVjdEFjY29yZGlvbiB9IGZyb20gJy4uL2FjY29yZGlvbi9hY2NvcmRpb24udG9rZW4nO1xuaW1wb3J0IHsgTmdwQWNjb3JkaW9uVHJpZ2dlclRva2VuIH0gZnJvbSAnLi9hY2NvcmRpb24tdHJpZ2dlci50b2tlbic7XG5cbkBEaXJlY3RpdmUoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICBzZWxlY3RvcjogJ1tuZ3BBY2NvcmRpb25UcmlnZ2VyXScsXG4gIGV4cG9ydEFzOiAnbmdwQWNjb3JkaW9uVHJpZ2dlcicsXG4gIHByb3ZpZGVyczogW3sgcHJvdmlkZTogTmdwQWNjb3JkaW9uVHJpZ2dlclRva2VuLCB1c2VFeGlzdGluZzogTmdwQWNjb3JkaW9uVHJpZ2dlciB9XSxcbiAgaG9zdERpcmVjdGl2ZXM6IFtOZ3BIb3ZlciwgTmdwUHJlc3MsIE5ncEZvY3VzVmlzaWJsZV0sXG4gIGhvc3Q6IHtcbiAgICAnW2lkXSc6ICdpZCgpJyxcbiAgICAnW2F0dHIuZGF0YS1vcmllbnRhdGlvbl0nOiAnYWNjb3JkaW9uLm9yaWVudGF0aW9uKCknLFxuICAgICdbYXR0ci5kYXRhLW9wZW5dJzogJ2l0ZW0ub3BlbigpJyxcbiAgICAnW2F0dHIuZGF0YS1kaXNhYmxlZF0nOiAnaXRlbS5kaXNhYmxlZCgpIHx8IGFjY29yZGlvbi5kaXNhYmxlZCgpJyxcbiAgICAnW2F0dHIuYXJpYS1jb250cm9sc10nOiAnaXRlbS5jb250ZW50SWQoKScsXG4gICAgJ1thdHRyLmFyaWEtZXhwYW5kZWRdJzogJ2l0ZW0ub3BlbigpJyxcbiAgfSxcbn0pXG5leHBvcnQgY2xhc3MgTmdwQWNjb3JkaW9uVHJpZ2dlciB7XG4gIC8qKlxuICAgKiBBY2Nlc3MgdGhlIHBhcmVudCBhY2NvcmRpb24uXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYWNjb3JkaW9uID0gaW5qZWN0QWNjb3JkaW9uKCk7XG5cbiAgLyoqXG4gICAqIFRoZSBpdGVtIGluc3RhbmNlLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGl0ZW0gPSBpbmplY3RBY2NvcmRpb25JdGVtKCk7XG5cbiAgLyoqXG4gICAqIFRoZSBpZCBvZiB0aGUgdHJpZ2dlci5cbiAgICovXG4gIHJlYWRvbmx5IGlkID0gaW5wdXQ8c3RyaW5nPih1bmlxdWVJZCgnbmdwLWFjY29yZGlvbi10cmlnZ2VyJykpO1xuXG4gIC8qKlxuICAgKiBUb2dnbGUgdGhlIGFjY29yZGlvbiBpdGVtLlxuICAgKi9cbiAgQEhvc3RMaXN0ZW5lcignY2xpY2snKVxuICB0b2dnbGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXRlbS5kaXNhYmxlZCgpIHx8IHRoaXMuYWNjb3JkaW9uLmRpc2FibGVkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmFjY29yZGlvbi50b2dnbGUodGhpcy5pdGVtLnZhbHVlKCkpO1xuICB9XG59XG4iXX0=
61
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjb3JkaW9uLXRyaWdnZXIuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvbmctcHJpbWl0aXZlcy9hY2NvcmRpb24vc3JjL2FjY29yZGlvbi10cmlnZ2VyL2FjY29yZGlvbi10cmlnZ2VyLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFDSCxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0QsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQzs7QUFnQnJFLE1BQU0sT0FBTyxtQkFBbUI7SUFkaEM7UUFlRTs7V0FFRztRQUNnQixjQUFTLEdBQUcsZUFBZSxFQUFFLENBQUM7UUFFakQ7O1dBRUc7UUFDZ0IsU0FBSSxHQUFHLG1CQUFtQixFQUFFLENBQUM7UUFFaEQ7O1dBRUc7UUFDTSxPQUFFLEdBQUcsS0FBSyxDQUFTLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUM7S0FhaEU7SUFYQzs7T0FFRztJQUVILE1BQU07UUFDSixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDO1lBQ3RELE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQzNDLENBQUM7OEdBMUJVLG1CQUFtQjtrR0FBbkIsbUJBQW1CLGdmQVZuQixDQUFDLEVBQUUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBRSxDQUFDOzsyRkFVekUsbUJBQW1CO2tCQWQvQixTQUFTO21CQUFDO29CQUNULFVBQVUsRUFBRSxJQUFJO29CQUNoQixRQUFRLEVBQUUsdUJBQXVCO29CQUNqQyxRQUFRLEVBQUUscUJBQXFCO29CQUMvQixTQUFTLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxXQUFXLHFCQUFxQixFQUFFLENBQUM7b0JBQ3BGLElBQUksRUFBRTt3QkFDSixNQUFNLEVBQUUsTUFBTTt3QkFDZCx5QkFBeUIsRUFBRSx5QkFBeUI7d0JBQ3BELGtCQUFrQixFQUFFLGFBQWE7d0JBQ2pDLHNCQUFzQixFQUFFLHlDQUF5Qzt3QkFDakUsc0JBQXNCLEVBQUUsa0JBQWtCO3dCQUMxQyxzQkFBc0IsRUFBRSxhQUFhO3FCQUN0QztpQkFDRjs4QkFxQkMsTUFBTTtzQkFETCxZQUFZO3VCQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCDCqSAyMDI0IEFuZ3VsYXIgUHJpbWl0aXZlcy5cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9uZy1wcmltaXRpdmVzL25nLXByaW1pdGl2ZXNcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgMi4wIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cbmltcG9ydCB7IERpcmVjdGl2ZSwgSG9zdExpc3RlbmVyLCBpbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdW5pcXVlSWQgfSBmcm9tICduZy1wcmltaXRpdmVzL3V0aWxzJztcbmltcG9ydCB7IGluamVjdEFjY29yZGlvbkl0ZW0gfSBmcm9tICcuLi9hY2NvcmRpb24taXRlbS9hY2NvcmRpb24taXRlbS50b2tlbic7XG5pbXBvcnQgeyBpbmplY3RBY2NvcmRpb24gfSBmcm9tICcuLi9hY2NvcmRpb24vYWNjb3JkaW9uLnRva2VuJztcbmltcG9ydCB7IE5ncEFjY29yZGlvblRyaWdnZXJUb2tlbiB9IGZyb20gJy4vYWNjb3JkaW9uLXRyaWdnZXIudG9rZW4nO1xuXG5ARGlyZWN0aXZlKHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgc2VsZWN0b3I6ICdbbmdwQWNjb3JkaW9uVHJpZ2dlcl0nLFxuICBleHBvcnRBczogJ25ncEFjY29yZGlvblRyaWdnZXInLFxuICBwcm92aWRlcnM6IFt7IHByb3ZpZGU6IE5ncEFjY29yZGlvblRyaWdnZXJUb2tlbiwgdXNlRXhpc3Rpbmc6IE5ncEFjY29yZGlvblRyaWdnZXIgfV0sXG4gIGhvc3Q6IHtcbiAgICAnW2lkXSc6ICdpZCgpJyxcbiAgICAnW2F0dHIuZGF0YS1vcmllbnRhdGlvbl0nOiAnYWNjb3JkaW9uLm9yaWVudGF0aW9uKCknLFxuICAgICdbYXR0ci5kYXRhLW9wZW5dJzogJ2l0ZW0ub3BlbigpJyxcbiAgICAnW2F0dHIuZGF0YS1kaXNhYmxlZF0nOiAnaXRlbS5kaXNhYmxlZCgpIHx8IGFjY29yZGlvbi5kaXNhYmxlZCgpJyxcbiAgICAnW2F0dHIuYXJpYS1jb250cm9sc10nOiAnaXRlbS5jb250ZW50SWQoKScsXG4gICAgJ1thdHRyLmFyaWEtZXhwYW5kZWRdJzogJ2l0ZW0ub3BlbigpJyxcbiAgfSxcbn0pXG5leHBvcnQgY2xhc3MgTmdwQWNjb3JkaW9uVHJpZ2dlciB7XG4gIC8qKlxuICAgKiBBY2Nlc3MgdGhlIHBhcmVudCBhY2NvcmRpb24uXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYWNjb3JkaW9uID0gaW5qZWN0QWNjb3JkaW9uKCk7XG5cbiAgLyoqXG4gICAqIFRoZSBpdGVtIGluc3RhbmNlLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGl0ZW0gPSBpbmplY3RBY2NvcmRpb25JdGVtKCk7XG5cbiAgLyoqXG4gICAqIFRoZSBpZCBvZiB0aGUgdHJpZ2dlci5cbiAgICovXG4gIHJlYWRvbmx5IGlkID0gaW5wdXQ8c3RyaW5nPih1bmlxdWVJZCgnbmdwLWFjY29yZGlvbi10cmlnZ2VyJykpO1xuXG4gIC8qKlxuICAgKiBUb2dnbGUgdGhlIGFjY29yZGlvbiBpdGVtLlxuICAgKi9cbiAgQEhvc3RMaXN0ZW5lcignY2xpY2snKVxuICB0b2dnbGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXRlbS5kaXNhYmxlZCgpIHx8IHRoaXMuYWNjb3JkaW9uLmRpc2FibGVkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmFjY29yZGlvbi50b2dnbGUodGhpcy5pdGVtLnZhbHVlKCkpO1xuICB9XG59XG4iXX0=
@@ -6,9 +6,10 @@
6
6
  * LICENSE file in the root directory of this source tree.
7
7
  */
8
8
  import { FocusMonitor } from '@angular/cdk/a11y';
9
- import { Directive, ElementRef, HostListener, booleanAttribute, inject, input, output, signal, } from '@angular/core';
9
+ import { Directive, ElementRef, booleanAttribute, inject, input, output, signal, } from '@angular/core';
10
10
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
11
11
  import { injectDisabled } from 'ng-primitives/internal';
12
+ import { onBooleanChange } from 'ng-primitives/utils';
12
13
  import { NgpFocusVisibleToken } from './focus-visible.token';
13
14
  import * as i0 from "@angular/core";
14
15
  export class NgpFocusVisible {
@@ -42,10 +43,15 @@ export class NgpFocusVisible {
42
43
  * Whether the element is currently focused.
43
44
  */
44
45
  this.isFocused = signal(false);
46
+ // handle focus state
45
47
  this.focusMonitor
46
48
  .monitor(this.elementRef.nativeElement)
47
49
  .pipe(takeUntilDestroyed())
48
- .subscribe(origin => this.onFocus(origin));
50
+ .subscribe(origin =>
51
+ // null indicates the element was blurred
52
+ origin === null ? this.onBlur() : this.onFocus(origin));
53
+ // if the component becomes disabled and it is focused, hide the focus
54
+ onBooleanChange(this.isDisabled, () => this.focus(false));
49
55
  }
50
56
  onFocus(origin) {
51
57
  if (this.isDisabled() || this.isFocused()) {
@@ -53,26 +59,30 @@ export class NgpFocusVisible {
53
59
  }
54
60
  // for some elements the focus visible state should always appear on focus
55
61
  if (this.alwaysShowFocus()) {
56
- this.isFocused.set(true);
57
- this.focusChange.emit(true);
62
+ this.focus(true);
58
63
  return;
59
64
  }
60
- // if the focus origin is keyboard, then the focus is visible
61
- if (origin === 'keyboard') {
62
- this.isFocused.set(true);
63
- this.focusChange.emit(true);
65
+ // if the focus origin is keyboard or program(focused programmatically), then the focus is visible
66
+ if (origin === 'keyboard' || origin === 'program') {
67
+ this.focus(true);
64
68
  return;
65
69
  }
66
70
  }
67
- /**
68
- * Listen for blur events.
69
- */
70
71
  onBlur() {
71
72
  if (this.isDisabled() || !this.isFocused()) {
72
73
  return;
73
74
  }
74
- this.isFocused.set(false);
75
- this.focusChange.emit(false);
75
+ this.focus(false);
76
+ }
77
+ /**
78
+ * Trigger the focus signal along with the focusChange event.
79
+ */
80
+ focus(value) {
81
+ if (this.isFocused() === value) {
82
+ return;
83
+ }
84
+ this.isFocused.set(value);
85
+ this.focusChange.emit(value);
76
86
  }
77
87
  alwaysShowFocus() {
78
88
  const nonTextInputTypes = [
@@ -103,7 +113,7 @@ export class NgpFocusVisible {
103
113
  return false;
104
114
  }
105
115
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: NgpFocusVisible, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
106
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.1.1", type: NgpFocusVisible, isStandalone: true, selector: "[ngpFocusVisible]", inputs: { disabled: { classPropertyName: "disabled", publicName: "ngpFocusVisibleDisabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { focusChange: "ngpFocusVisible" }, host: { listeners: { "blur": "onBlur()" }, properties: { "attr.data-focus-visible": "isFocused() && !isDisabled()" } }, providers: [{ provide: NgpFocusVisibleToken, useExisting: NgpFocusVisible }], exportAs: ["ngpFocusVisible"], ngImport: i0 }); }
116
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.1.1", type: NgpFocusVisible, isStandalone: true, selector: "[ngpFocusVisible]", inputs: { disabled: { classPropertyName: "disabled", publicName: "ngpFocusVisibleDisabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { focusChange: "ngpFocusVisible" }, host: { properties: { "attr.data-focus-visible": "isFocused()" } }, providers: [{ provide: NgpFocusVisibleToken, useExisting: NgpFocusVisible }], exportAs: ["ngpFocusVisible"], ngImport: i0 }); }
107
117
  }
108
118
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: NgpFocusVisible, decorators: [{
109
119
  type: Directive,
@@ -113,11 +123,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.1", ngImpor
113
123
  exportAs: 'ngpFocusVisible',
114
124
  providers: [{ provide: NgpFocusVisibleToken, useExisting: NgpFocusVisible }],
115
125
  host: {
116
- '[attr.data-focus-visible]': 'isFocused() && !isDisabled()',
126
+ '[attr.data-focus-visible]': 'isFocused()',
117
127
  },
118
128
  }]
119
- }], ctorParameters: () => [], propDecorators: { onBlur: [{
120
- type: HostListener,
121
- args: ['blur']
122
- }] } });
123
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9jdXMtdmlzaWJsZS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9uZy1wcmltaXRpdmVzL2ludGVyYWN0aW9ucy9zcmMvZm9jdXMtdmlzaWJsZS9mb2N1cy12aXNpYmxlLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFDSCxPQUFPLEVBQUUsWUFBWSxFQUFlLE1BQU0sbUJBQW1CLENBQUM7QUFFOUQsT0FBTyxFQUNMLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLGdCQUFnQixFQUNoQixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sRUFDTixNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDOztBQVc3RCxNQUFNLE9BQU8sZUFBZTtJQW9DMUI7UUFuQ0E7O1dBRUc7UUFDYyxlQUFVLEdBQUcsTUFBTSxDQUEwQixVQUFVLENBQUMsQ0FBQztRQUUxRTs7V0FFRztRQUNjLGlCQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRXJEOztXQUVHO1FBQ00sYUFBUSxHQUFHLEtBQUssQ0FBd0IsS0FBSyxFQUFFO1lBQ3RELEtBQUssRUFBRSx5QkFBeUI7WUFDaEMsU0FBUyxFQUFFLGdCQUFnQjtTQUM1QixDQUFDLENBQUM7UUFFSDs7V0FFRztRQUNjLGVBQVUsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRTVEOztXQUVHO1FBQ00sZ0JBQVcsR0FBRyxNQUFNLENBQVU7WUFDckMsS0FBSyxFQUFFLGlCQUFpQjtTQUN6QixDQUFDLENBQUM7UUFFSDs7V0FFRztR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RUFBRSw4QkFBOEI7cUJBQzVEO2lCQUNGO3dEQW9FVyxNQUFNO3NCQURmLFlBQVk7dUJBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IMKpIDIwMjQgQW5ndWxhciBQcmltaXRpdmVzLlxuICogaHR0cHM6Ly9naXRodWIuY29tL25nLXByaW1pdGl2ZXMvbmctcHJpbWl0aXZlc1xuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSAyLjAgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuaW1wb3J0IHsgRm9jdXNNb25pdG9yLCBGb2N1c09yaWdpbiB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9hMTF5JztcbmltcG9ydCB7IEJvb2xlYW5JbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XG5pbXBvcnQge1xuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RMaXN0ZW5lcixcbiAgYm9vbGVhbkF0dHJpYnV0ZSxcbiAgaW5qZWN0LFxuICBpbnB1dCxcbiAgb3V0cHV0LFxuICBzaWduYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgaW5qZWN0RGlzYWJsZWQgfSBmcm9tICduZy1wcmltaXRpdmVzL2ludGVybmFsJztcbmltcG9ydCB7IE5ncEZvY3VzVmlzaWJsZVRva2VuIH0gZnJvbSAnLi9mb2N1cy12aXNpYmxlLnRva2VuJztcblxuQERpcmVjdGl2ZSh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHNlbGVjdG9yOiAnW25ncEZvY3VzVmlzaWJsZV0nLFxuICBleHBvcnRBczogJ25ncEZvY3VzVmlzaWJsZScsXG4gIHByb3ZpZGVyczogW3sgcHJvdmlkZTogTmdwRm9jdXNWaXNpYmxlVG9rZW4sIHVzZUV4aXN0aW5nOiBOZ3BGb2N1c1Zpc2libGUgfV0sXG4gIGhvc3Q6IHtcbiAgICAnW2F0dHIuZGF0YS1mb2N1cy12aXNpYmxlXSc6ICdpc0ZvY3VzZWQoKSAmJiAhaXNEaXNhYmxlZCgpJyxcbiAgfSxcbn0pXG5leHBvcnQgY2xhc3MgTmdwRm9jdXNWaXNpYmxlIHtcbiAgLyoqXG4gICAqIEFjY2VzcyB0aGUgZWxlbWVudCB0aGF0IHRoZSBkaXJlY3RpdmUgaXMgYXBwbGllZCB0by5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZWxlbWVudFJlZiA9IGluamVjdDxFbGVtZW50UmVmPEhUTUxFbGVtZW50Pj4oRWxlbWVudFJlZik7XG5cbiAgLyoqXG4gICAqIEFjY2VzcyB0aGUgZm9jdXMgbW9uaXRvci5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZm9jdXNNb25pdG9yID0gaW5qZWN0KEZvY3VzTW9uaXRvcik7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgZm9jdXMgZXZlbnRzIGFyZSBsaXN0ZW5lZCB0by5cbiAgICovXG4gIHJlYWRvbmx5IGRpc2FibGVkID0gaW5wdXQ8Ym9vbGVhbiwgQm9vbGVhbklucHV0PihmYWxzZSwge1xuICAgIGFsaWFzOiAnbmdwRm9jdXNWaXNpYmxlRGlzYWJsZWQnLFxuICAgIHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSxcbiAgfSk7XG5cbiAgLyoqXG4gICAqIEFjY2VzcyB0aGUgZGlzYWJsZWQgc3RhdGUgZnJvbSBhbnkgcGFyZW50LlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBpc0Rpc2FibGVkID0gaW5qZWN0RGlzYWJsZWQodGhpcy5kaXNhYmxlZCk7XG5cbiAgLyoqXG4gICAqIEVtaXQgd2hlbiB0aGUgZWxlbWVudCBpcyB2aXN1YWxseSBmb2N1c2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgZm9jdXNDaGFuZ2UgPSBvdXRwdXQ8Ym9vbGVhbj4oe1xuICAgIGFsaWFzOiAnbmdwRm9jdXNWaXNpYmxlJyxcbiAgfSk7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgY3VycmVudGx5IGZvY3VzZWQuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNGb2N1c2VkID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmZvY3VzTW9uaXRvclxuICAgICAgLm1vbml0b3IodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQoKSlcbiAgICAgIC5zdWJzY3JpYmUob3JpZ2luID0+IHRoaXMub25Gb2N1cyhvcmlnaW4pKTtcbiAgfVxuXG4gIHByaXZhdGUgb25Gb2N1cyhvcmlnaW46IEZvY3VzT3JpZ2luKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNEaXNhYmxlZCgpIHx8IHRoaXMuaXNGb2N1c2VkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBmb3Igc29tZSBlbGVtZW50cyB0aGUgZm9jdXMgdmlzaWJsZSBzdGF0ZSBzaG91bGQgYWx3YXlzIGFwcGVhciBvbiBmb2N1c1xuICAgIGlmICh0aGlzLmFsd2F5c1Nob3dGb2N1cygpKSB7XG4gICAgICB0aGlzLmlzRm9jdXNlZC5zZXQodHJ1ZSk7XG4gICAgICB0aGlzLmZvY3VzQ2hhbmdlLmVtaXQodHJ1ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gaWYgdGhlIGZvY3VzIG9yaWdpbiBpcyBrZXlib2FyZCwgdGhlbiB0aGUgZm9jdXMgaXMgdmlzaWJsZVxuICAgIGlmIChvcmlnaW4gPT09ICdrZXlib2FyZCcpIHtcbiAgICAgIHRoaXMuaXNGb2N1c2VkLnNldCh0cnVlKTtcbiAgICAgIHRoaXMuZm9jdXNDaGFuZ2UuZW1pdCh0cnVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGlzdGVuIGZvciBibHVyIGV2ZW50cy5cbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ2JsdXInKVxuICBwcm90ZWN0ZWQgb25CbHVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRGlzYWJsZWQoKSB8fCAhdGhpcy5pc0ZvY3VzZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaXNGb2N1c2VkLnNldChmYWxzZSk7XG4gICAgdGhpcy5mb2N1c0NoYW5nZS5lbWl0KGZhbHNlKTtcbiAgfVxuXG4gIHByaXZhdGUgYWx3YXlzU2hvd0ZvY3VzKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG5vblRleHRJbnB1dFR5cGVzID0gW1xuICAgICAgJ2NoZWNrYm94JyxcbiAgICAgICdyYWRpbycsXG4gICAgICAncmFuZ2UnLFxuICAgICAgJ2NvbG9yJyxcbiAgICAgICdmaWxlJyxcbiAgICAgICdpbWFnZScsXG4gICAgICAnYnV0dG9uJyxcbiAgICAgICdzdWJtaXQnLFxuICAgICAgJ3Jlc2V0JyxcbiAgICBdO1xuXG4gICAgLy8gaWYgdGhpcyBpcyBhbiBpbnB1dCBlbGVtZW50IGFuZCBpdCBpcyBhIHRleHQgaW5wdXRcbiAgICBpZiAoXG4gICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgJiZcbiAgICAgICFub25UZXh0SW5wdXRUeXBlcy5pbmNsdWRlcyh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC50eXBlKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gaWYgdGhpcyBpcyBhIHRleHRhcmVhXG4gICAgaWYgKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50IGluc3RhbmNlb2YgSFRNTFRleHRBcmVhRWxlbWVudCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gaWYgdGhpcyBpcyBhbiBlbGVtZW50IHdpdGggY29udGVudGVkaXRhYmxlXG4gICAgaWYgKFxuICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuaXNDb250ZW50RWRpdGFibGUgfHxcbiAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50Lmhhc0F0dHJpYnV0ZSgnY29udGVudGVkaXRhYmxlJylcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIl19
129
+ }], ctorParameters: () => [] });
130
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9jdXMtdmlzaWJsZS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9uZy1wcmltaXRpdmVzL2ludGVyYWN0aW9ucy9zcmMvZm9jdXMtdmlzaWJsZS9mb2N1cy12aXNpYmxlLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFDSCxPQUFPLEVBQUUsWUFBWSxFQUFlLE1BQU0sbUJBQW1CLENBQUM7QUFFOUQsT0FBTyxFQUNMLFNBQVMsRUFDVCxVQUFVLEVBQ1YsZ0JBQWdCLEVBQ2hCLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUNOLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDOztBQVc3RCxNQUFNLE9BQU8sZUFBZTtJQW9DMUI7UUFuQ0E7O1dBRUc7UUFDYyxlQUFVLEdBQUcsTUFBTSxDQUEwQixVQUFVLENBQUMsQ0FBQztRQUUxRTs7V0FFRztRQUNjLGlCQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRXJEOztXQUVHO1FBQ00sYUFBUSxHQUFHLEtBQUssQ0FBd0IsS0FBSyxFQUFFO1lBQ3RELEtBQUssRUFBRSx5QkFBeUI7WUFDaEMsU0FBUyxFQUFFLGdCQUFnQjtTQUM1QixDQUFDLENBQUM7UUFFSDs7V0FFRztRQUNjLGVBQVUsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRTVEOztXQUVHO1FBQ00sZ0JBQVcsR0FBRyxNQUFNLENBQVU7WUFDckMsS0FBSyxFQUFFLGlCQUFpQjtTQUN6QixDQUFDLENBQUM7UUFFSDs7V0FFRztRQUNnQixjQUFTLEdBQUcsTUFBTSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBR3BELHFCQUFxQjtRQUNyQixJQUFJLENBQUMsWUFBWTthQUNkLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQzthQUN0QyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQzthQUMxQixTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUU7UUFDbEIseUNBQXlDO1FBQ3pDLE1BQU0sS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FDdkQsQ0FBQztRQUVKLHNFQUFzRTtRQUN0RSxlQUFlLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVPLE9BQU8sQ0FBQyxNQUFtQjtRQUNqQyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQztZQUMxQyxPQUFPO1FBQ1QsQ0FBQztRQUVELDBFQUEwRTtRQUMxRSxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDO1lBQzNCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDakIsT0FBTztRQUNULENBQUM7UUFFRCxrR0FBa0c7UUFDbEcsSUFBSSxNQUFNLEtBQUssVUFBVSxJQUFJLE1BQU0sS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNsRCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pCLE9BQU87UUFDVCxDQUFDO0lBQ0gsQ0FBQztJQUVPLE1BQU07UUFDWixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDO1lBQzNDLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwQixDQUFDO0lBRUQ7O09BRUc7SUFDSyxLQUFLLENBQUMsS0FBYztRQUMxQixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUMvQixPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFTyxlQUFlO1FBQ3JCLE1BQU0saUJBQWlCLEdBQUc7WUFDeEIsVUFBVTtZQUNWLE9BQU87WUFDUCxPQUFPO1lBQ1AsT0FBTztZQUNQLE1BQU07WUFDTixPQUFPO1lBQ1AsUUFBUTtZQUNSLFFBQVE7WUFDUixPQUFPO1NBQ1IsQ0FBQztRQUVGLHFEQUFxRDtRQUNyRCxJQUNFLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxZQUFZLGdCQUFnQjtZQUN6RCxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsRUFDL0QsQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELHdCQUF3QjtRQUN4QixJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxZQUFZLG1CQUFtQixFQUFFLENBQUM7WUFDakUsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsNkNBQTZDO1FBQzdDLElBQ0UsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsaUJBQWlCO1lBQy9DLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxFQUM3RCxDQUFDO1lBQ0QsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDOzhHQTNIVSxlQUFlO2tHQUFmLGVBQWUsNlVBTGYsQ0FBQyxFQUFFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFLENBQUM7OzJGQUtqRSxlQUFlO2tCQVQzQixTQUFTO21CQUFDO29CQUNULFVBQVUsRUFBRSxJQUFJO29CQUNoQixRQUFRLEVBQUUsbUJBQW1CO29CQUM3QixRQUFRLEVBQUUsaUJBQWlCO29CQUMzQixTQUFTLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxXQUFXLGlCQUFpQixFQUFFLENBQUM7b0JBQzVFLElBQUksRUFBRTt3QkFDSiwyQkFBMkIsRUFBRSxhQUFhO3FCQUMzQztpQkFDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IMKpIDIwMjQgQW5ndWxhciBQcmltaXRpdmVzLlxuICogaHR0cHM6Ly9naXRodWIuY29tL25nLXByaW1pdGl2ZXMvbmctcHJpbWl0aXZlc1xuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSAyLjAgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuaW1wb3J0IHsgRm9jdXNNb25pdG9yLCBGb2N1c09yaWdpbiB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9hMTF5JztcbmltcG9ydCB7IEJvb2xlYW5JbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XG5pbXBvcnQge1xuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIGJvb2xlYW5BdHRyaWJ1dGUsXG4gIGluamVjdCxcbiAgaW5wdXQsXG4gIG91dHB1dCxcbiAgc2lnbmFsLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IGluamVjdERpc2FibGVkIH0gZnJvbSAnbmctcHJpbWl0aXZlcy9pbnRlcm5hbCc7XG5pbXBvcnQgeyBvbkJvb2xlYW5DaGFuZ2UgfSBmcm9tICduZy1wcmltaXRpdmVzL3V0aWxzJztcbmltcG9ydCB7IE5ncEZvY3VzVmlzaWJsZVRva2VuIH0gZnJvbSAnLi9mb2N1cy12aXNpYmxlLnRva2VuJztcblxuQERpcmVjdGl2ZSh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHNlbGVjdG9yOiAnW25ncEZvY3VzVmlzaWJsZV0nLFxuICBleHBvcnRBczogJ25ncEZvY3VzVmlzaWJsZScsXG4gIHByb3ZpZGVyczogW3sgcHJvdmlkZTogTmdwRm9jdXNWaXNpYmxlVG9rZW4sIHVzZUV4aXN0aW5nOiBOZ3BGb2N1c1Zpc2libGUgfV0sXG4gIGhvc3Q6IHtcbiAgICAnW2F0dHIuZGF0YS1mb2N1cy12aXNpYmxlXSc6ICdpc0ZvY3VzZWQoKScsXG4gIH0sXG59KVxuZXhwb3J0IGNsYXNzIE5ncEZvY3VzVmlzaWJsZSB7XG4gIC8qKlxuICAgKiBBY2Nlc3MgdGhlIGVsZW1lbnQgdGhhdCB0aGUgZGlyZWN0aXZlIGlzIGFwcGxpZWQgdG8uXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnRSZWYgPSBpbmplY3Q8RWxlbWVudFJlZjxIVE1MRWxlbWVudD4+KEVsZW1lbnRSZWYpO1xuXG4gIC8qKlxuICAgKiBBY2Nlc3MgdGhlIGZvY3VzIG1vbml0b3IuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGZvY3VzTW9uaXRvciA9IGluamVjdChGb2N1c01vbml0b3IpO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGZvY3VzIGV2ZW50cyBhcmUgbGlzdGVuZWQgdG8uXG4gICAqL1xuICByZWFkb25seSBkaXNhYmxlZCA9IGlucHV0PGJvb2xlYW4sIEJvb2xlYW5JbnB1dD4oZmFsc2UsIHtcbiAgICBhbGlhczogJ25ncEZvY3VzVmlzaWJsZURpc2FibGVkJyxcbiAgICB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUsXG4gIH0pO1xuXG4gIC8qKlxuICAgKiBBY2Nlc3MgdGhlIGRpc2FibGVkIHN0YXRlIGZyb20gYW55IHBhcmVudC5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgaXNEaXNhYmxlZCA9IGluamVjdERpc2FibGVkKHRoaXMuZGlzYWJsZWQpO1xuXG4gIC8qKlxuICAgKiBFbWl0IHdoZW4gdGhlIGVsZW1lbnQgaXMgdmlzdWFsbHkgZm9jdXNlZC5cbiAgICovXG4gIHJlYWRvbmx5IGZvY3VzQ2hhbmdlID0gb3V0cHV0PGJvb2xlYW4+KHtcbiAgICBhbGlhczogJ25ncEZvY3VzVmlzaWJsZScsXG4gIH0pO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBlbGVtZW50IGlzIGN1cnJlbnRseSBmb2N1c2VkLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzRm9jdXNlZCA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gaGFuZGxlIGZvY3VzIHN0YXRlXG4gICAgdGhpcy5mb2N1c01vbml0b3JcbiAgICAgIC5tb25pdG9yKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKCkpXG4gICAgICAuc3Vic2NyaWJlKG9yaWdpbiA9PlxuICAgICAgICAvLyBudWxsIGluZGljYXRlcyB0aGUgZWxlbWVudCB3YXMgYmx1cnJlZFxuICAgICAgICBvcmlnaW4gPT09IG51bGwgPyB0aGlzLm9uQmx1cigpIDogdGhpcy5vbkZvY3VzKG9yaWdpbiksXG4gICAgICApO1xuXG4gICAgLy8gaWYgdGhlIGNvbXBvbmVudCBiZWNvbWVzIGRpc2FibGVkIGFuZCBpdCBpcyBmb2N1c2VkLCBoaWRlIHRoZSBmb2N1c1xuICAgIG9uQm9vbGVhbkNoYW5nZSh0aGlzLmlzRGlzYWJsZWQsICgpID0+IHRoaXMuZm9jdXMoZmFsc2UpKTtcbiAgfVxuXG4gIHByaXZhdGUgb25Gb2N1cyhvcmlnaW46IEZvY3VzT3JpZ2luKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNEaXNhYmxlZCgpIHx8IHRoaXMuaXNGb2N1c2VkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBmb3Igc29tZSBlbGVtZW50cyB0aGUgZm9jdXMgdmlzaWJsZSBzdGF0ZSBzaG91bGQgYWx3YXlzIGFwcGVhciBvbiBmb2N1c1xuICAgIGlmICh0aGlzLmFsd2F5c1Nob3dGb2N1cygpKSB7XG4gICAgICB0aGlzLmZvY3VzKHRydWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGlmIHRoZSBmb2N1cyBvcmlnaW4gaXMga2V5Ym9hcmQgb3IgcHJvZ3JhbShmb2N1c2VkIHByb2dyYW1tYXRpY2FsbHkpLCB0aGVuIHRoZSBmb2N1cyBpcyB2aXNpYmxlXG4gICAgaWYgKG9yaWdpbiA9PT0gJ2tleWJvYXJkJyB8fCBvcmlnaW4gPT09ICdwcm9ncmFtJykge1xuICAgICAgdGhpcy5mb2N1cyh0cnVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9uQmx1cigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0Rpc2FibGVkKCkgfHwgIXRoaXMuaXNGb2N1c2VkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmZvY3VzKGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmlnZ2VyIHRoZSBmb2N1cyBzaWduYWwgYWxvbmcgd2l0aCB0aGUgZm9jdXNDaGFuZ2UgZXZlbnQuXG4gICAqL1xuICBwcml2YXRlIGZvY3VzKHZhbHVlOiBib29sZWFuKSB7XG4gICAgaWYgKHRoaXMuaXNGb2N1c2VkKCkgPT09IHZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5pc0ZvY3VzZWQuc2V0KHZhbHVlKTtcbiAgICB0aGlzLmZvY3VzQ2hhbmdlLmVtaXQodmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBhbHdheXNTaG93Rm9jdXMoKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgbm9uVGV4dElucHV0VHlwZXMgPSBbXG4gICAgICAnY2hlY2tib3gnLFxuICAgICAgJ3JhZGlvJyxcbiAgICAgICdyYW5nZScsXG4gICAgICAnY29sb3InLFxuICAgICAgJ2ZpbGUnLFxuICAgICAgJ2ltYWdlJyxcbiAgICAgICdidXR0b24nLFxuICAgICAgJ3N1Ym1pdCcsXG4gICAgICAncmVzZXQnLFxuICAgIF07XG5cbiAgICAvLyBpZiB0aGlzIGlzIGFuIGlucHV0IGVsZW1lbnQgYW5kIGl0IGlzIGEgdGV4dCBpbnB1dFxuICAgIGlmIChcbiAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCAmJlxuICAgICAgIW5vblRleHRJbnB1dFR5cGVzLmluY2x1ZGVzKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnR5cGUpXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBpZiB0aGlzIGlzIGEgdGV4dGFyZWFcbiAgICBpZiAodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MVGV4dEFyZWFFbGVtZW50KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBpZiB0aGlzIGlzIGFuIGVsZW1lbnQgd2l0aCBjb250ZW50ZWRpdGFibGVcbiAgICBpZiAoXG4gICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5pc0NvbnRlbnRFZGl0YWJsZSB8fFxuICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuaGFzQXR0cmlidXRlKCdjb250ZW50ZWRpdGFibGUnKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Copyright © 2024 Angular Primitives.
3
+ * https://github.com/ng-primitives/ng-primitives
4
+ *
5
+ * This source code is licensed under the Apache 2.0 license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */
8
+ import { InjectionToken, inject } from '@angular/core';
9
+ export const defaultPopoverConfig = {
10
+ offset: 4,
11
+ placement: 'bottom',
12
+ showDelay: 0,
13
+ hideDelay: 0,
14
+ flip: true,
15
+ container: null,
16
+ closeOnOutsideClick: true,
17
+ };
18
+ export const NgpPopoverConfigToken = new InjectionToken('NgpPopoverConfigToken');
19
+ /**
20
+ * Provide the default Popover configuration
21
+ * @param config The Popover configuration
22
+ * @returns The provider
23
+ */
24
+ export function providePopoverConfig(config) {
25
+ return [
26
+ {
27
+ provide: NgpPopoverConfigToken,
28
+ useValue: { ...defaultPopoverConfig, ...config },
29
+ },
30
+ ];
31
+ }
32
+ /**
33
+ * Inject the Popover configuration
34
+ * @returns The global Popover configuration
35
+ */
36
+ export function injectPopoverConfig() {
37
+ return inject(NgpPopoverConfigToken, { optional: true }) ?? defaultPopoverConfig;
38
+ }
39
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wb3Zlci5jb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9uZy1wcmltaXRpdmVzL3BvcG92ZXIvc3JjL2NvbmZpZy9wb3BvdmVyLmNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFDSCxPQUFPLEVBQUUsY0FBYyxFQUFZLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQStDakUsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQXFCO0lBQ3BELE1BQU0sRUFBRSxDQUFDO0lBQ1QsU0FBUyxFQUFFLFFBQVE7SUFDbkIsU0FBUyxFQUFFLENBQUM7SUFDWixTQUFTLEVBQUUsQ0FBQztJQUNaLElBQUksRUFBRSxJQUFJO0lBQ1YsU0FBUyxFQUFFLElBQUk7SUFDZixtQkFBbUIsRUFBRSxJQUFJO0NBQzFCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLGNBQWMsQ0FBbUIsdUJBQXVCLENBQUMsQ0FBQztBQUVuRzs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUFDLE1BQWlDO0lBQ3BFLE9BQU87UUFDTDtZQUNFLE9BQU8sRUFBRSxxQkFBcUI7WUFDOUIsUUFBUSxFQUFFLEVBQUUsR0FBRyxvQkFBb0IsRUFBRSxHQUFHLE1BQU0sRUFBRTtTQUNqRDtLQUNGLENBQUM7QUFDSixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQjtJQUNqQyxPQUFPLE1BQU0sQ0FBQyxxQkFBcUIsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxJQUFJLG9CQUFvQixDQUFDO0FBQ25GLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCDCqSAyMDI0IEFuZ3VsYXIgUHJpbWl0aXZlcy5cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9uZy1wcmltaXRpdmVzL25nLXByaW1pdGl2ZXNcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgMi4wIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cbmltcG9ydCB7IEluamVjdGlvblRva2VuLCBQcm92aWRlciwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0eXBlIFBsYWNlbWVudCB9IGZyb20gJ0BmbG9hdGluZy11aS9kb20nO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5ncFBvcG92ZXJDb25maWcge1xuICAvKipcbiAgICogRGVmaW5lIHRoZSBvZmZzZXQgb2YgdGhlIHBvcG92ZXIgcmVsYXRpdmUgdG8gdGhlIHRyaWdnZXIuXG4gICAqIEBkZWZhdWx0IDRcbiAgICovXG4gIG9mZnNldDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBEZWZpbmUgdGhlIHBsYWNlbWVudCBvZiB0aGUgcG9wb3ZlciByZWxhdGl2ZSB0byB0aGUgdHJpZ2dlci5cbiAgICogQGRlZmF1bHQgJ2JvdHRvbSdcbiAgICovXG4gIHBsYWNlbWVudDogUGxhY2VtZW50O1xuXG4gIC8qKlxuICAgKiBEZWZpbmUgdGhlIGRlbGF5IGJlZm9yZSB0aGUgcG9wb3ZlciBpcyBzaG93bi5cbiAgICogQGRlZmF1bHQgMFxuICAgKi9cbiAgc2hvd0RlbGF5OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIERlZmluZSB0aGUgZGVsYXkgYmVmb3JlIHRoZSBwb3BvdmVyIGlzIGhpZGRlbi5cbiAgICogQGRlZmF1bHQgMFxuICAgKi9cbiAgaGlkZURlbGF5OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIERlZmluZSB3aGV0aGVyIHRoZSBwb3BvdmVyIHNob3VsZCBmbGlwIHdoZW4gdGhlcmUgaXMgbm90IGVub3VnaCBzcGFjZSBmb3IgdGhlIHBvcG92ZXIuXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIGZsaXA6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIERlZmluZSB0aGUgY29udGFpbmVyIGluIHRvIHdoaWNoIHRoZSBwb3BvdmVyIHNob3VsZCBiZSBhdHRhY2hlZC5cbiAgICogQGRlZmF1bHQgZG9jdW1lbnQuYm9keVxuICAgKi9cbiAgY29udGFpbmVyOiBIVE1MRWxlbWVudCB8IG51bGw7XG5cbiAgLyoqXG4gICAqIERlZmluZSB3aGV0aGVyIHRoZSBwb3BvdmVyIHNob3VsZCBjbG9zZSB3aGVuIGNsaWNraW5nIG91dHNpZGUgb2YgaXQuXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIGNsb3NlT25PdXRzaWRlQ2xpY2s6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0UG9wb3ZlckNvbmZpZzogTmdwUG9wb3ZlckNvbmZpZyA9IHtcbiAgb2Zmc2V0OiA0LFxuICBwbGFjZW1lbnQ6ICdib3R0b20nLFxuICBzaG93RGVsYXk6IDAsXG4gIGhpZGVEZWxheTogMCxcbiAgZmxpcDogdHJ1ZSxcbiAgY29udGFpbmVyOiBudWxsLFxuICBjbG9zZU9uT3V0c2lkZUNsaWNrOiB0cnVlLFxufTtcblxuZXhwb3J0IGNvbnN0IE5ncFBvcG92ZXJDb25maWdUb2tlbiA9IG5ldyBJbmplY3Rpb25Ub2tlbjxOZ3BQb3BvdmVyQ29uZmlnPignTmdwUG9wb3ZlckNvbmZpZ1Rva2VuJyk7XG5cbi8qKlxuICogUHJvdmlkZSB0aGUgZGVmYXVsdCBQb3BvdmVyIGNvbmZpZ3VyYXRpb25cbiAqIEBwYXJhbSBjb25maWcgVGhlIFBvcG92ZXIgY29uZmlndXJhdGlvblxuICogQHJldHVybnMgVGhlIHByb3ZpZGVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm92aWRlUG9wb3ZlckNvbmZpZyhjb25maWc6IFBhcnRpYWw8TmdwUG9wb3ZlckNvbmZpZz4pOiBQcm92aWRlcltdIHtcbiAgcmV0dXJuIFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOZ3BQb3BvdmVyQ29uZmlnVG9rZW4sXG4gICAgICB1c2VWYWx1ZTogeyAuLi5kZWZhdWx0UG9wb3ZlckNvbmZpZywgLi4uY29uZmlnIH0sXG4gICAgfSxcbiAgXTtcbn1cblxuLyoqXG4gKiBJbmplY3QgdGhlIFBvcG92ZXIgY29uZmlndXJhdGlvblxuICogQHJldHVybnMgVGhlIGdsb2JhbCBQb3BvdmVyIGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluamVjdFBvcG92ZXJDb25maWcoKTogTmdwUG9wb3ZlckNvbmZpZyB7XG4gIHJldHVybiBpbmplY3QoTmdwUG9wb3ZlckNvbmZpZ1Rva2VuLCB7IG9wdGlvbmFsOiB0cnVlIH0pID8/IGRlZmF1bHRQb3BvdmVyQ29uZmlnO1xufVxuIl19
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Copyright © 2024 Angular Primitives.
3
+ * https://github.com/ng-primitives/ng-primitives
4
+ *
5
+ * This source code is licensed under the Apache 2.0 license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */
8
+ export { providePopoverConfig } from './config/popover.config';
9
+ export { NgpPopoverTrigger } from './popover-trigger/popover-trigger.directive';
10
+ export { NgpPopoverTriggerToken } from './popover-trigger/popover-trigger.token';
11
+ export { NgpPopover } from './popover/popover.directive';
12
+ export { NgpPopoverToken } from './popover/popover.token';
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9uZy1wcmltaXRpdmVzL3BvcG92ZXIvc3JjL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILE9BQU8sRUFBb0Isb0JBQW9CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNqRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUNoRixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUNqRixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHlCQUF5QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgwqkgMjAyNCBBbmd1bGFyIFByaW1pdGl2ZXMuXG4gKiBodHRwczovL2dpdGh1Yi5jb20vbmctcHJpbWl0aXZlcy9uZy1wcmltaXRpdmVzXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIDIuMCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbmV4cG9ydCB7IE5ncFBvcG92ZXJDb25maWcsIHByb3ZpZGVQb3BvdmVyQ29uZmlnIH0gZnJvbSAnLi9jb25maWcvcG9wb3Zlci5jb25maWcnO1xuZXhwb3J0IHsgTmdwUG9wb3ZlclRyaWdnZXIgfSBmcm9tICcuL3BvcG92ZXItdHJpZ2dlci9wb3BvdmVyLXRyaWdnZXIuZGlyZWN0aXZlJztcbmV4cG9ydCB7IE5ncFBvcG92ZXJUcmlnZ2VyVG9rZW4gfSBmcm9tICcuL3BvcG92ZXItdHJpZ2dlci9wb3BvdmVyLXRyaWdnZXIudG9rZW4nO1xuZXhwb3J0IHsgTmdwUG9wb3ZlciB9IGZyb20gJy4vcG9wb3Zlci9wb3BvdmVyLmRpcmVjdGl2ZSc7XG5leHBvcnQgeyBOZ3BQb3BvdmVyVG9rZW4gfSBmcm9tICcuL3BvcG92ZXIvcG9wb3Zlci50b2tlbic7XG4iXX0=
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './index';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctcHJpbWl0aXZlcy1wb3BvdmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvbmctcHJpbWl0aXZlcy9wb3BvdmVyL3NyYy9uZy1wcmltaXRpdmVzLXBvcG92ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLFNBQVMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9pbmRleCc7XG4iXX0=
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Copyright © 2024 Angular Primitives.
3
+ * https://github.com/ng-primitives/ng-primitives
4
+ *
5
+ * This source code is licensed under the Apache 2.0 license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */
8
+ import { Directive, ElementRef, computed, inject, isDevMode } from '@angular/core';
9
+ import { NgpFocusTrap } from 'ng-primitives/focus-trap';
10
+ import { injectPopoverTrigger } from '../popover-trigger/popover-trigger.token';
11
+ import { NgpPopoverToken } from './popover.token';
12
+ import * as i0 from "@angular/core";
13
+ import * as i1 from "ng-primitives/focus-trap";
14
+ export class NgpPopover {
15
+ constructor() {
16
+ /**
17
+ * Access the popover element.
18
+ */
19
+ this.popover = inject((ElementRef));
20
+ /**
21
+ * Access the trigger instance.
22
+ */
23
+ this.trigger = injectPopoverTrigger();
24
+ /**
25
+ * Compute the x position of the popover.
26
+ */
27
+ this.x = computed(() => this.trigger.position().x);
28
+ /**
29
+ * Compute the y position of the popover.
30
+ */
31
+ this.y = computed(() => this.trigger.position().y);
32
+ }
33
+ ngOnInit() {
34
+ // if the element does not have a fixed position then throw a warning in dev mode
35
+ if (isDevMode()) {
36
+ const { position } = getComputedStyle(this.popover.nativeElement);
37
+ if (position !== 'absolute') {
38
+ console.warn(`The popover element must have an absolute position. The current position is ${position}.`);
39
+ }
40
+ }
41
+ }
42
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: NgpPopover, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
43
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.1.1", type: NgpPopover, isStandalone: true, selector: "[ngpPopover]", host: { attributes: { "role": "menu" }, properties: { "style.left.px": "x()", "style.top.px": "y()" } }, providers: [{ provide: NgpPopoverToken, useExisting: NgpPopover }], exportAs: ["ngpPopover"], hostDirectives: [{ directive: i1.NgpFocusTrap }], ngImport: i0 }); }
44
+ }
45
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: NgpPopover, decorators: [{
46
+ type: Directive,
47
+ args: [{
48
+ standalone: true,
49
+ selector: '[ngpPopover]',
50
+ exportAs: 'ngpPopover',
51
+ hostDirectives: [NgpFocusTrap],
52
+ providers: [{ provide: NgpPopoverToken, useExisting: NgpPopover }],
53
+ host: {
54
+ role: 'menu',
55
+ '[style.left.px]': 'x()',
56
+ '[style.top.px]': 'y()',
57
+ },
58
+ }]
59
+ }] });
60
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wb3Zlci5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9uZy1wcmltaXRpdmVzL3BvcG92ZXIvc3JjL3BvcG92ZXIvcG9wb3Zlci5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBQ0gsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQVUsUUFBUSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0YsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7O0FBY2xELE1BQU0sT0FBTyxVQUFVO0lBWnZCO1FBYUU7O1dBRUc7UUFDYyxZQUFPLEdBQUcsTUFBTSxDQUFDLENBQUEsVUFBdUIsQ0FBQSxDQUFDLENBQUM7UUFFM0Q7O1dBRUc7UUFDYyxZQUFPLEdBQUcsb0JBQW9CLEVBQUUsQ0FBQztRQUVsRDs7V0FFRztRQUNnQixNQUFDLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFakU7O1dBRUc7UUFDZ0IsTUFBQyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBY2xFO0lBWkMsUUFBUTtRQUNOLGlGQUFpRjtRQUNqRixJQUFJLFNBQVMsRUFBRSxFQUFFLENBQUM7WUFDaEIsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7WUFFbEUsSUFBSSxRQUFRLEtBQUssVUFBVSxFQUFFLENBQUM7Z0JBQzVCLE9BQU8sQ0FBQyxJQUFJLENBQ1YsK0VBQStFLFFBQVEsR0FBRyxDQUMzRixDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDOzhHQWhDVSxVQUFVO2tHQUFWLFVBQVUsb0tBUFYsQ0FBQyxFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxDQUFDOzsyRkFPdkQsVUFBVTtrQkFadEIsU0FBUzttQkFBQztvQkFDVCxVQUFVLEVBQUUsSUFBSTtvQkFDaEIsUUFBUSxFQUFFLGNBQWM7b0JBQ3hCLFFBQVEsRUFBRSxZQUFZO29CQUN0QixjQUFjLEVBQUUsQ0FBQyxZQUFZLENBQUM7b0JBQzlCLFNBQVMsRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxXQUFXLFlBQVksRUFBRSxDQUFDO29CQUNsRSxJQUFJLEVBQUU7d0JBQ0osSUFBSSxFQUFFLE1BQU07d0JBQ1osaUJBQWlCLEVBQUUsS0FBSzt3QkFDeEIsZ0JBQWdCLEVBQUUsS0FBSztxQkFDeEI7aUJBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCDCqSAyMDI0IEFuZ3VsYXIgUHJpbWl0aXZlcy5cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9uZy1wcmltaXRpdmVzL25nLXByaW1pdGl2ZXNcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgMi4wIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cbmltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgT25Jbml0LCBjb21wdXRlZCwgaW5qZWN0LCBpc0Rldk1vZGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5ncEZvY3VzVHJhcCB9IGZyb20gJ25nLXByaW1pdGl2ZXMvZm9jdXMtdHJhcCc7XG5pbXBvcnQgeyBpbmplY3RQb3BvdmVyVHJpZ2dlciB9IGZyb20gJy4uL3BvcG92ZXItdHJpZ2dlci9wb3BvdmVyLXRyaWdnZXIudG9rZW4nO1xuaW1wb3J0IHsgTmdwUG9wb3ZlclRva2VuIH0gZnJvbSAnLi9wb3BvdmVyLnRva2VuJztcblxuQERpcmVjdGl2ZSh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHNlbGVjdG9yOiAnW25ncFBvcG92ZXJdJyxcbiAgZXhwb3J0QXM6ICduZ3BQb3BvdmVyJyxcbiAgaG9zdERpcmVjdGl2ZXM6IFtOZ3BGb2N1c1RyYXBdLFxuICBwcm92aWRlcnM6IFt7IHByb3ZpZGU6IE5ncFBvcG92ZXJUb2tlbiwgdXNlRXhpc3Rpbmc6IE5ncFBvcG92ZXIgfV0sXG4gIGhvc3Q6IHtcbiAgICByb2xlOiAnbWVudScsXG4gICAgJ1tzdHlsZS5sZWZ0LnB4XSc6ICd4KCknLFxuICAgICdbc3R5bGUudG9wLnB4XSc6ICd5KCknLFxuICB9LFxufSlcbmV4cG9ydCBjbGFzcyBOZ3BQb3BvdmVyIGltcGxlbWVudHMgT25Jbml0IHtcbiAgLyoqXG4gICAqIEFjY2VzcyB0aGUgcG9wb3ZlciBlbGVtZW50LlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBwb3BvdmVyID0gaW5qZWN0KEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+KTtcblxuICAvKipcbiAgICogQWNjZXNzIHRoZSB0cmlnZ2VyIGluc3RhbmNlLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSB0cmlnZ2VyID0gaW5qZWN0UG9wb3ZlclRyaWdnZXIoKTtcblxuICAvKipcbiAgICogQ29tcHV0ZSB0aGUgeCBwb3NpdGlvbiBvZiB0aGUgcG9wb3Zlci5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSB4ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy50cmlnZ2VyLnBvc2l0aW9uKCkueCk7XG5cbiAgLyoqXG4gICAqIENvbXB1dGUgdGhlIHkgcG9zaXRpb24gb2YgdGhlIHBvcG92ZXIuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgeSA9IGNvbXB1dGVkKCgpID0+IHRoaXMudHJpZ2dlci5wb3NpdGlvbigpLnkpO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIC8vIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGhhdmUgYSBmaXhlZCBwb3NpdGlvbiB0aGVuIHRocm93IGEgd2FybmluZyBpbiBkZXYgbW9kZVxuICAgIGlmIChpc0Rldk1vZGUoKSkge1xuICAgICAgY29uc3QgeyBwb3NpdGlvbiB9ID0gZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLnBvcG92ZXIubmF0aXZlRWxlbWVudCk7XG5cbiAgICAgIGlmIChwb3NpdGlvbiAhPT0gJ2Fic29sdXRlJykge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYFRoZSBwb3BvdmVyIGVsZW1lbnQgbXVzdCBoYXZlIGFuIGFic29sdXRlIHBvc2l0aW9uLiBUaGUgY3VycmVudCBwb3NpdGlvbiBpcyAke3Bvc2l0aW9ufS5gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Copyright © 2024 Angular Primitives.
3
+ * https://github.com/ng-primitives/ng-primitives
4
+ *
5
+ * This source code is licensed under the Apache 2.0 license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */
8
+ import { InjectionToken, inject } from '@angular/core';
9
+ export const NgpPopoverToken = new InjectionToken('NgpPopoverToken');
10
+ /**
11
+ * Inject the Popover directive instance
12
+ */
13
+ export function injectPopover() {
14
+ return inject(NgpPopoverToken);
15
+ }
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wb3Zlci50b2tlbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL25nLXByaW1pdGl2ZXMvcG9wb3Zlci9zcmMvcG9wb3Zlci9wb3BvdmVyLnRva2VuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUNILE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBR3ZELE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxJQUFJLGNBQWMsQ0FBYSxpQkFBaUIsQ0FBQyxDQUFDO0FBRWpGOztHQUVHO0FBQ0gsTUFBTSxVQUFVLGFBQWE7SUFDM0IsT0FBTyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7QUFDakMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IMKpIDIwMjQgQW5ndWxhciBQcmltaXRpdmVzLlxuICogaHR0cHM6Ly9naXRodWIuY29tL25nLXByaW1pdGl2ZXMvbmctcHJpbWl0aXZlc1xuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSAyLjAgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4sIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHR5cGUgeyBOZ3BQb3BvdmVyIH0gZnJvbSAnLi9wb3BvdmVyLmRpcmVjdGl2ZSc7XG5cbmV4cG9ydCBjb25zdCBOZ3BQb3BvdmVyVG9rZW4gPSBuZXcgSW5qZWN0aW9uVG9rZW48TmdwUG9wb3Zlcj4oJ05ncFBvcG92ZXJUb2tlbicpO1xuXG4vKipcbiAqIEluamVjdCB0aGUgUG9wb3ZlciBkaXJlY3RpdmUgaW5zdGFuY2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluamVjdFBvcG92ZXIoKTogTmdwUG9wb3ZlciB7XG4gIHJldHVybiBpbmplY3QoTmdwUG9wb3ZlclRva2VuKTtcbn1cbiJdfQ==
@@ -0,0 +1,222 @@
1
+ import { DomPortalOutlet, TemplatePortal } from '@angular/cdk/portal';
2
+ import { DOCUMENT } from '@angular/common';
3
+ import { Directive, ElementRef, Injector, ViewContainerRef, booleanAttribute, computed, inject, input, model, numberAttribute, signal, } from '@angular/core';
4
+ import { autoUpdate, computePosition, flip, offset, shift, } from '@floating-ui/dom';
5
+ import { injectDisposables, onBooleanChange } from 'ng-primitives/utils';
6
+ import { injectPopoverConfig } from '../config/popover.config';
7
+ import { NgpPopoverTriggerToken, providePopoverTrigger } from './popover-trigger.token';
8
+ import * as i0 from "@angular/core";
9
+ export class NgpPopoverTrigger {
10
+ constructor() {
11
+ /**
12
+ * Access the trigger element
13
+ */
14
+ this.trigger = inject((ElementRef));
15
+ /**
16
+ * Access the view container ref.
17
+ */
18
+ this.viewContainerRef = inject(ViewContainerRef);
19
+ /**
20
+ * Access the document.
21
+ */
22
+ this.document = inject(DOCUMENT);
23
+ /**
24
+ * Access the injector.
25
+ */
26
+ this.injector = inject(Injector);
27
+ /**
28
+ * Access the global popover configuration.
29
+ */
30
+ this.config = injectPopoverConfig();
31
+ /**
32
+ * Access the disposable utilities
33
+ */
34
+ this.disposables = injectDisposables();
35
+ /**
36
+ * Access the popover template ref.
37
+ */
38
+ this.popover = input.required({
39
+ alias: 'ngpPopoverTrigger',
40
+ });
41
+ /**
42
+ * The open state of the popover.
43
+ * @default false
44
+ */
45
+ this.open = model(false, {
46
+ alias: 'ngpPopoverTriggerOpen',
47
+ });
48
+ /**
49
+ * Define if the trigger should be disabled.
50
+ * @default false
51
+ */
52
+ this.disabled = input(false, {
53
+ alias: 'ngpPopoverTriggerDisabled',
54
+ transform: booleanAttribute,
55
+ });
56
+ /**
57
+ * Define the placement of the popover relative to the trigger.
58
+ * @default 'top'
59
+ */
60
+ this.placement = input(this.config.placement, {
61
+ alias: 'ngpPopoverTriggerPlacement',
62
+ });
63
+ /**
64
+ * Define the offset of the popover relative to the trigger.
65
+ * @default 0
66
+ */
67
+ this.offset = input(this.config.offset, {
68
+ alias: 'ngpPopoverTriggerOffset',
69
+ transform: numberAttribute,
70
+ });
71
+ /**
72
+ * Define the delay before the popover is displayed.
73
+ * @default 0
74
+ */
75
+ this.showDelay = input(this.config.showDelay, {
76
+ alias: 'ngpPopoverTriggerShowDelay',
77
+ transform: numberAttribute,
78
+ });
79
+ /**
80
+ * Define the delay before the popover is hidden.
81
+ * @default 0
82
+ */
83
+ this.hideDelay = input(this.config.hideDelay, {
84
+ alias: 'ngpPopoverTriggerHideDelay',
85
+ transform: numberAttribute,
86
+ });
87
+ /**
88
+ * Define whether the popover should flip when there is not enough space for the popover.
89
+ * @default true
90
+ */
91
+ this.flip = input(this.config.flip, {
92
+ alias: 'ngpPopoverTriggerFlip',
93
+ transform: booleanAttribute,
94
+ });
95
+ /**
96
+ * Define the container in which the popover should be attached.
97
+ * @default document.body
98
+ */
99
+ this.container = input(this.config.container, {
100
+ alias: 'ngpPopoverTriggerContainer',
101
+ });
102
+ /**
103
+ * Define whether the popover should close when clicking outside of it.
104
+ * @default true
105
+ */
106
+ this.closeOnOutsideClick = input(this.config.closeOnOutsideClick, {
107
+ alias: 'ngpPopoverTriggerCloseOnOutsideClick',
108
+ transform: booleanAttribute,
109
+ });
110
+ /**
111
+ * Store the popover view ref.
112
+ */
113
+ this.viewRef = null;
114
+ /**
115
+ * Derive the popover middleware from the provided configuration.
116
+ */
117
+ this.middleware = computed(() => {
118
+ const middleware = [offset(this.offset()), shift()];
119
+ if (this.flip()) {
120
+ middleware.push(flip());
121
+ }
122
+ return middleware;
123
+ });
124
+ /**
125
+ * Store the computed position of the popover.
126
+ * @internal
127
+ */
128
+ this.position = signal({
129
+ x: 0,
130
+ y: 0,
131
+ });
132
+ /**
133
+ * Store the state of the popover.
134
+ * @internal
135
+ */
136
+ this.state = signal('closed');
137
+ // any time the open state changes then show or hide the popover
138
+ onBooleanChange(this.open, this.show.bind(this), this.hide.bind(this));
139
+ }
140
+ ngOnDestroy() {
141
+ this.destroyPopover();
142
+ }
143
+ toggleOpenState() {
144
+ this.open.update(open => !open);
145
+ }
146
+ show() {
147
+ // if the trigger is disabled or the popover is already open then do not show the popover
148
+ if (this.disabled() || this.state() === 'open' || this.state() === 'opening') {
149
+ return;
150
+ }
151
+ this.state.set('opening');
152
+ this.disposables.setTimeout(() => this.createPopover(), this.showDelay());
153
+ // Add document click listener to detect outside clicks
154
+ if (this.closeOnOutsideClick()) {
155
+ this.documentClickListener = this.onDocumentClick.bind(this);
156
+ this.document.addEventListener('click', this.documentClickListener, true);
157
+ }
158
+ }
159
+ hide() {
160
+ // if the trigger is disabled or the popover is already closed then do not hide the popover
161
+ if (this.disabled() || this.state() === 'closed' || this.state() === 'closing') {
162
+ return;
163
+ }
164
+ this.state.set('closing');
165
+ this.disposables.setTimeout(() => this.destroyPopover(), this.hideDelay());
166
+ // Remove the document click listener when the popover is hidden
167
+ if (this.documentClickListener) {
168
+ this.document.removeEventListener('click', this.documentClickListener, true);
169
+ }
170
+ }
171
+ onDocumentClick(event) {
172
+ const target = event.target;
173
+ // Check if the click is outside the trigger or the popover
174
+ const isOutside = !this.trigger.nativeElement.contains(target) &&
175
+ !(this.viewRef?.rootNodes[0]).contains(target);
176
+ if (isOutside) {
177
+ // Close the popover
178
+ this.open.set(false);
179
+ }
180
+ }
181
+ createPopover() {
182
+ const portal = new TemplatePortal(this.popover(), this.viewContainerRef, undefined, this.injector);
183
+ const domOutlet = new DomPortalOutlet(this.container() ?? this.document.body, undefined, undefined, Injector.create({
184
+ parent: this.injector,
185
+ providers: [providePopoverTrigger(this)],
186
+ }));
187
+ this.viewRef = domOutlet.attach(portal);
188
+ this.viewRef.detectChanges();
189
+ const outletElement = this.viewRef.rootNodes[0];
190
+ this.dispose = autoUpdate(this.trigger.nativeElement, outletElement, async () => {
191
+ const position = await computePosition(this.trigger.nativeElement, outletElement, {
192
+ placement: this.placement(),
193
+ middleware: this.middleware(),
194
+ });
195
+ this.position.set({ x: position.x, y: position.y });
196
+ });
197
+ this.state.set('open');
198
+ }
199
+ destroyPopover() {
200
+ this.viewRef?.destroy();
201
+ this.viewRef = null;
202
+ this.dispose?.();
203
+ this.state.set('closed');
204
+ }
205
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: NgpPopoverTrigger, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
206
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.1.1", type: NgpPopoverTrigger, isStandalone: true, selector: "[ngpPopoverTrigger]", inputs: { popover: { classPropertyName: "popover", publicName: "ngpPopoverTrigger", isSignal: true, isRequired: true, transformFunction: null }, open: { classPropertyName: "open", publicName: "ngpPopoverTriggerOpen", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "ngpPopoverTriggerDisabled", isSignal: true, isRequired: false, transformFunction: null }, placement: { classPropertyName: "placement", publicName: "ngpPopoverTriggerPlacement", isSignal: true, isRequired: false, transformFunction: null }, offset: { classPropertyName: "offset", publicName: "ngpPopoverTriggerOffset", isSignal: true, isRequired: false, transformFunction: null }, showDelay: { classPropertyName: "showDelay", publicName: "ngpPopoverTriggerShowDelay", isSignal: true, isRequired: false, transformFunction: null }, hideDelay: { classPropertyName: "hideDelay", publicName: "ngpPopoverTriggerHideDelay", isSignal: true, isRequired: false, transformFunction: null }, flip: { classPropertyName: "flip", publicName: "ngpPopoverTriggerFlip", isSignal: true, isRequired: false, transformFunction: null }, container: { classPropertyName: "container", publicName: "ngpPopoverTriggerContainer", isSignal: true, isRequired: false, transformFunction: null }, closeOnOutsideClick: { classPropertyName: "closeOnOutsideClick", publicName: "ngpPopoverTriggerCloseOnOutsideClick", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { open: "ngpPopoverTriggerOpenChange" }, host: { listeners: { "click": "toggleOpenState()" }, properties: { "attr.data-state": "state()", "attr.data-disabled": "disabled()" } }, providers: [{ provide: NgpPopoverTriggerToken, useExisting: NgpPopoverTrigger }], exportAs: ["ngpPopoverTrigger"], ngImport: i0 }); }
207
+ }
208
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.1", ngImport: i0, type: NgpPopoverTrigger, decorators: [{
209
+ type: Directive,
210
+ args: [{
211
+ standalone: true,
212
+ selector: '[ngpPopoverTrigger]',
213
+ exportAs: 'ngpPopoverTrigger',
214
+ providers: [{ provide: NgpPopoverTriggerToken, useExisting: NgpPopoverTrigger }],
215
+ host: {
216
+ '[attr.data-state]': 'state()',
217
+ '[attr.data-disabled]': 'disabled()',
218
+ '(click)': 'toggleOpenState()',
219
+ },
220
+ }]
221
+ }], ctorParameters: () => [] });
222
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wb3Zlci10cmlnZ2VyLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL25nLXByaW1pdGl2ZXMvcG9wb3Zlci9zcmMvcG9wb3Zlci10cmlnZ2VyL3BvcG92ZXItdHJpZ2dlci5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBUUEsT0FBTyxFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUNMLFNBQVMsRUFDVCxVQUFVLEVBRVYsUUFBUSxFQUdSLGdCQUFnQixFQUNoQixnQkFBZ0IsRUFDaEIsUUFBUSxFQUNSLE1BQU0sRUFDTixLQUFLLEVBQ0wsS0FBSyxFQUNMLGVBQWUsRUFDZixNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUdMLFVBQVUsRUFDVixlQUFlLEVBQ2YsSUFBSSxFQUNKLE1BQU0sRUFDTixLQUFLLEdBQ04sTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDekUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDL0QsT0FBTyxFQUFFLHNCQUFzQixFQUFFLHFCQUFxQixFQUFFLE1BQU0seUJBQXlCLENBQUM7O0FBYXhGLE1BQU0sT0FBTyxpQkFBaUI7SUFnSzVCO1FBL0pBOztXQUVHO1FBQ2MsWUFBTyxHQUFHLE1BQU0sQ0FBQyxDQUFBLFVBQXVCLENBQUEsQ0FBQyxDQUFDO1FBRTNEOztXQUVHO1FBQ2MscUJBQWdCLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFFN0Q7O1dBRUc7UUFDYyxhQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRTdDOztXQUVHO1FB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QixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMzQixDQUFDOzhHQWxRVSxpQkFBaUI7a0dBQWpCLGlCQUFpQixpc0RBUGpCLENBQUMsRUFBRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixFQUFFLENBQUM7OzJGQU9yRSxpQkFBaUI7a0JBWDdCLFNBQVM7bUJBQUM7b0JBQ1QsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFFBQVEsRUFBRSxxQkFBcUI7b0JBQy9CLFFBQVEsRUFBRSxtQkFBbUI7b0JBQzdCLFNBQVMsRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLFdBQVcsbUJBQW1CLEVBQUUsQ0FBQztvQkFDaEYsSUFBSSxFQUFFO3dCQUNKLG1CQUFtQixFQUFFLFNBQVM7d0JBQzlCLHNCQUFzQixFQUFFLFlBQVk7d0JBQ3BDLFNBQVMsRUFBRSxtQkFBbUI7cUJBQy9CO2lCQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgwqkgMjAyNCBBbmd1bGFyIFByaW1pdGl2ZXMuXG4gKiBodHRwczovL2dpdGh1Yi5jb20vbmctcHJpbWl0aXZlcy9uZy1wcmltaXRpdmVzXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIDIuMCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5pbXBvcnQgeyBCb29sZWFuSW5wdXQsIE51bWJlcklucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcbmltcG9ydCB7IERvbVBvcnRhbE91dGxldCwgVGVtcGxhdGVQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgRW1iZWRkZWRWaWV3UmVmLFxuICBJbmplY3RvcixcbiAgT25EZXN0cm95LFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NvbnRhaW5lclJlZixcbiAgYm9vbGVhbkF0dHJpYnV0ZSxcbiAgY29tcHV0ZWQsXG4gIGluamVjdCxcbiAgaW5wdXQsXG4gIG1vZGVsLFxuICBudW1iZXJBdHRyaWJ1dGUsXG4gIHNpZ25hbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBNaWRkbGV3YXJlLFxuICBQbGFjZW1lbnQsXG4gIGF1dG9VcGRhdGUsXG4gIGNvbXB1dGVQb3NpdGlvbixcbiAgZmxpcCxcbiAgb2Zmc2V0LFxuICBzaGlmdCxcbn0gZnJvbSAnQGZsb2F0aW5nLXVpL2RvbSc7XG5pbXBvcnQgeyBpbmplY3REaXNwb3NhYmxlcywgb25Cb29sZWFuQ2hhbmdlIH0gZnJvbSAnbmctcHJpbWl0aXZlcy91dGlscyc7XG5pbXBvcnQgeyBpbmplY3RQb3BvdmVyQ29uZmlnIH0gZnJvbSAnLi4vY29uZmlnL3BvcG92ZXIuY29uZmlnJztcbmltcG9ydCB7IE5ncFBvcG92ZXJUcmlnZ2VyVG9rZW4sIHByb3ZpZGVQb3BvdmVyVHJpZ2dlciB9IGZyb20gJy4vcG9wb3Zlci10cmlnZ2VyLnRva2VuJztcblxuQERpcmVjdGl2ZSh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHNlbGVjdG9yOiAnW25ncFBvcG92ZXJUcmlnZ2VyXScsXG4gIGV4cG9ydEFzOiAnbmdwUG9wb3ZlclRyaWdnZXInLFxuICBwcm92aWRlcnM6IFt7IHByb3ZpZGU6IE5ncFBvcG92ZXJUcmlnZ2VyVG9rZW4sIHVzZUV4aXN0aW5nOiBOZ3BQb3BvdmVyVHJpZ2dlciB9XSxcbiAgaG9zdDoge1xuICAgICdbYXR0ci5kYXRhLXN0YXRlXSc6ICdzdGF0ZSgpJyxcbiAgICAnW2F0dHIuZGF0YS1kaXNhYmxlZF0nOiAnZGlzYWJsZWQoKScsXG4gICAgJyhjbGljayknOiAndG9nZ2xlT3BlblN0YXRlKCknLFxuICB9LFxufSlcbmV4cG9ydCBjbGFzcyBOZ3BQb3BvdmVyVHJpZ2dlciBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIC8qKlxuICAgKiBBY2Nlc3MgdGhlIHRyaWdnZXIgZWxlbWVudFxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSB0cmlnZ2VyID0gaW5qZWN0KEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+KTtcblxuICAvKipcbiAgICogQWNjZXNzIHRoZSB2aWV3IGNvbnRhaW5lciByZWYuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHZpZXdDb250YWluZXJSZWYgPSBpbmplY3QoVmlld0NvbnRhaW5lclJlZik7XG5cbiAgLyoqXG4gICAqIEFjY2VzcyB0aGUgZG9jdW1lbnQuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGRvY3VtZW50ID0gaW5qZWN0KERPQ1VNRU5UKTtcblxuICAvKipcbiAgICogQWNjZXNzIHRoZSBpbmplY3Rvci5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgaW5qZWN0b3IgPSBpbmplY3QoSW5qZWN0b3IpO1xuXG4gIC8qKlxuICAgKiBBY2Nlc3MgdGhlIGdsb2JhbCBwb3BvdmVyIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZyA9IGluamVjdFBvcG92ZXJDb25maWcoKTtcblxuICAvKipcbiAgICogQWNjZXNzIHRoZSBkaXNwb3NhYmxlIHV0aWxpdGllc1xuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBkaXNwb3NhYmxlcyA9IGluamVjdERpc3Bvc2FibGVzKCk7XG5cbiAgLyoqXG4gICAqIEFjY2VzcyB0aGUgcG9wb3ZlciB0ZW1wbGF0ZSByZWYuXG4gICAqL1xuICByZWFkb25seSBwb3BvdmVyID0gaW5wdXQucmVxdWlyZWQ8VGVtcGxhdGVSZWY8dm9pZD4+KHtcbiAgICBhbGlhczogJ25ncFBvcG92ZXJUcmlnZ2VyJyxcbiAgfSk7XG5cbiAgLyoqXG4gICAqIFRoZSBvcGVuIHN0YXRlIG9mIHRoZSBwb3BvdmVyLlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgb3BlbiA9IG1vZGVsPGJvb2xlYW4+KGZhbHNlLCB7XG4gICAgYWxpYXM6ICduZ3BQb3BvdmVyVHJpZ2dlck9wZW4nLFxuICB9KTtcblxuICAvKipcbiAgICogRGVmaW5lIGlmIHRoZSB0cmlnZ2VyIHNob3VsZCBiZSBkaXNhYmxlZC5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGRpc2FibGVkID0gaW5wdXQ8Ym9vbGVhbiwgQm9vbGVhbklucHV0PihmYWxzZSwge1xuICAgIGFsaWFzOiAnbmdwUG9wb3ZlclRyaWdnZXJEaXNhYmxlZCcsXG4gICAgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlLFxuICB9KTtcblxuICAvKipcbiAgICogRGVmaW5lIHRoZSBwbGFjZW1lbnQgb2YgdGhlIHBvcG92ZXIgcmVsYXRpdmUgdG8gdGhlIHRyaWdnZXIuXG4gICAqIEBkZWZhdWx0ICd0b3AnXG4gICAqL1xuICByZWFkb25seSBwbGFjZW1lbnQgPSBpbnB1dDxQbGFjZW1lbnQ+KHRoaXMuY29uZmlnLnBsYWNlbWVudCwge1xuICAgIGFsaWFzOiAnbmdwUG9wb3ZlclRyaWdnZXJQbGFjZW1lbnQnLFxuICB9KTtcblxuICAvKipcbiAgICogRGVmaW5lIHRoZSBvZmZzZXQgb2YgdGhlIHBvcG92ZXIgcmVsYXRpdmUgdG8gdGhlIHRyaWdnZXIuXG4gICAqIEBkZWZhdWx0IDBcbiAgICovXG4gIHJlYWRvbmx5IG9mZnNldCA9IGlucHV0PG51bWJlciwgTnVtYmVySW5wdXQ+KHRoaXMuY29uZmlnLm9mZnNldCwge1xuICAgIGFsaWFzOiAnbmdwUG9wb3ZlclRyaWdnZXJPZmZzZXQnLFxuICAgIHRyYW5zZm9ybTogbnVtYmVyQXR0cmlidXRlLFxuICB9KTtcblxuICAvKipcbiAgICogRGVmaW5lIHRoZSBkZWxheSBiZWZvcmUgdGhlIHBvcG92ZXIgaXMgZGlzcGxheWVkLlxuICAgKiBAZGVmYXVsdCAwXG4gICAqL1xuICByZWFkb25seSBzaG93RGVsYXkgPSBpbnB1dDxudW1iZXIsIE51bWJlcklucHV0Pih0aGlzLmNvbmZpZy5zaG93RGVsYXksIHtcbiAgICBhbGlhczogJ25ncFBvcG92ZXJUcmlnZ2VyU2hvd0RlbGF5JyxcbiAgICB0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZSxcbiAgfSk7XG5cbiAgLyoqXG4gICAqIERlZmluZSB0aGUgZGVsYXkgYmVmb3JlIHRoZSBwb3BvdmVyIGlzIGhpZGRlbi5cbiAgICogQGRlZmF1bHQgMFxuICAgKi9cbiAgcmVhZG9ubHkgaGlkZURlbGF5ID0gaW5wdXQ8bnVtYmVyLCBOdW1iZXJJbnB1dD4odGhpcy5jb25maWcuaGlkZURlbGF5LCB7XG4gICAgYWxpYXM6ICduZ3BQb3BvdmVyVHJpZ2dlckhpZGVEZWxheScsXG4gICAgdHJhbnNmb3JtOiBudW1iZXJBdHRyaWJ1dGUsXG4gIH0pO1xuXG4gIC8qKlxuICAgKiBEZWZpbmUgd2hldGhlciB0aGUgcG9wb3ZlciBzaG91bGQgZmxpcCB3aGVuIHRoZXJlIGlzIG5vdCBlbm91Z2ggc3BhY2UgZm9yIHRoZSBwb3BvdmVyLlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBmbGlwID0gaW5wdXQ8Ym9vbGVhbiwgQm9vbGVhbklucHV0Pih0aGlzLmNvbmZpZy5mbGlwLCB7XG4gICAgYWxpYXM6ICduZ3BQb3BvdmVyVHJpZ2dlckZsaXAnLFxuICAgIHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSxcbiAgfSk7XG5cbiAgLyoqXG4gICAqIERlZmluZSB0aGUgY29udGFpbmVyIGluIHdoaWNoIHRoZSBwb3BvdmVyIHNob3VsZCBiZSBhdHRhY2hlZC5cbiAgICogQGRlZmF1bHQgZG9jdW1lbnQuYm9keVxuICAgKi9cbiAgcmVhZG9ubHkgY29udGFpbmVyID0gaW5wdXQ8SFRNTEVsZW1lbnQgfCBudWxsPih0aGlzLmNvbmZpZy5jb250YWluZXIsIHtcbiAgICBhbGlhczogJ25ncFBvcG92ZXJUcmlnZ2VyQ29udGFpbmVyJyxcbiAgfSk7XG5cbiAgLyoqXG4gICAqIERlZmluZSB3aGV0aGVyIHRoZSBwb3BvdmVyIHNob3VsZCBjbG9zZSB3aGVuIGNsaWNraW5nIG91dHNpZGUgb2YgaXQuXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGNsb3NlT25PdXRzaWRlQ2xpY2sgPSBpbnB1dDxib29sZWFuLCBCb29sZWFuSW5wdXQ+KHRoaXMuY29uZmlnLmNsb3NlT25PdXRzaWRlQ2xpY2ssIHtcbiAgICBhbGlhczogJ25ncFBvcG92ZXJUcmlnZ2VyQ2xvc2VPbk91dHNpZGVDbGljaycsXG4gICAgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlLFxuICB9KTtcblxuICAvKipcbiAgICogU3RvcmUgdGhlIHBvcG92ZXIgdmlldyByZWYuXG4gICAqL1xuICBwcml2YXRlIHZpZXdSZWY6IEVtYmVkZGVkVmlld1JlZjx2b2lkPiB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBEZXJpdmUgdGhlIHBvcG92ZXIgbWlkZGxld2FyZSBmcm9tIHRoZSBwcm92aWRlZCBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBtaWRkbGV3YXJlID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IG1pZGRsZXdhcmU6IE1pZGRsZXdhcmVbXSA9IFtvZmZzZXQodGhpcy5vZmZzZXQoKSksIHNoaWZ0KCldO1xuXG4gICAgaWYgKHRoaXMuZmxpcCgpKSB7XG4gICAgICBtaWRkbGV3YXJlLnB1c2goZmxpcCgpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWlkZGxld2FyZTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqIFN0b3JlIHRoZSBjb21wdXRlZCBwb3NpdGlvbiBvZiB0aGUgcG9wb3Zlci5cbiAgICogQGludGVybmFsXG4gICAqL1xuICByZWFkb25seSBwb3NpdGlvbiA9IHNpZ25hbDx7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0+KHtcbiAgICB4OiAwLFxuICAgIHk6IDAsXG4gIH0pO1xuXG4gIC8qKlxuICAgKiBTdG9yZSB0aGUgc3RhdGUgb2YgdGhlIHBvcG92ZXIuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcmVhZG9ubHkgc3RhdGUgPSBzaWduYWw8UG9wb3ZlclN0YXRlPignY2xvc2VkJyk7XG5cbiAgLyoqXG4gICAqIFRoZSBkaXNwb3NlIGZ1bmN0aW9uIHRvIHN0b3AgY29tcHV0aW5nIHRoZSBwb3NpdGlvbiBvZiB0aGUgcG9wb3Zlci5cbiAgICovXG4gIHByaXZhdGUgZGlzcG9zZT86ICgpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEEgZG9jdW1lbnQtd2lkZSBjbGljayBsaXN0ZW5lciB0aGF0IGNoZWNrcyBpZiB0aGUgY2xpY2tcbiAgICogb2NjdXJyZWQgb3V0c2lkZSBvZiB0aGUgcG9wb3ZlciBhbmQgdHJpZ2dlciBlbGVtZW50cy5cbiAgICovXG4gIHByaXZhdGUgZG9jdW1lbnRDbGlja0xpc3RlbmVyPzogKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB2b2lkO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIGFueSB0aW1lIHRoZSBvcGVuIHN0YXRlIGNoYW5nZXMgdGhlbiBzaG93IG9yIGhpZGUgdGhlIHBvcG92ZXJcbiAgICBvbkJvb2xlYW5DaGFuZ2UodGhpcy5vcGVuLCB0aGlzLnNob3cuYmluZCh0aGlzKSwgdGhpcy5oaWRlLmJpbmQodGhpcykpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95UG9wb3ZlcigpO1xuICB9XG5cbiAgdG9nZ2xlT3BlblN0YXRlKCk6IHZvaWQge1xuICAgIHRoaXMub3Blbi51cGRhdGUob3BlbiA9PiAhb3Blbik7XG4gIH1cblxuICBwcml2YXRlIHNob3coKTogdm9pZCB7XG4gICAgLy8gaWYgdGhlIHRyaWdnZXIgaXMgZGlzYWJsZWQgb3IgdGhlIHBvcG92ZXIgaXMgYWxyZWFkeSBvcGVuIHRoZW4gZG8gbm90IHNob3cgdGhlIHBvcG92ZXJcbiAgICBpZiAodGhpcy5kaXNhYmxlZCgpIHx8IHRoaXMuc3RhdGUoKSA9PT0gJ29wZW4nIHx8IHRoaXMuc3RhdGUoKSA9PT0gJ29wZW5pbmcnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zdGF0ZS5zZXQoJ29wZW5pbmcnKTtcbiAgICB0aGlzLmRpc3Bvc2FibGVzLnNldFRpbWVvdXQoKCkgPT4gdGhpcy5jcmVhdGVQb3BvdmVyKCksIHRoaXMuc2hvd0RlbGF5KCkpO1xuXG4gICAgLy8gQWRkIGRvY3VtZW50IGNsaWNrIGxpc3RlbmVyIHRvIGRldGVjdCBvdXRzaWRlIGNsaWNrc1xuICAgIGlmICh0aGlzLmNsb3NlT25PdXRzaWRlQ2xpY2soKSkge1xuICAgICAgdGhpcy5kb2N1bWVudENsaWNrTGlzdGVuZXIgPSB0aGlzLm9uRG9jdW1lbnRDbGljay5iaW5kKHRoaXMpO1xuICAgICAgdGhpcy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuZG9jdW1lbnRDbGlja0xpc3RlbmVyLCB0cnVlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhpZGUoKTogdm9pZCB7XG4gICAgLy8gaWYgdGhlIHRyaWdnZXIgaXMgZGlzYWJsZWQgb3IgdGhlIHBvcG92ZXIgaXMgYWxyZWFkeSBjbG9zZWQgdGhlbiBkbyBub3QgaGlkZSB0aGUgcG9wb3ZlclxuICAgIGlmICh0aGlzLmRpc2FibGVkKCkgfHwgdGhpcy5zdGF0ZSgpID09PSAnY2xvc2VkJyB8fCB0aGlzLnN0YXRlKCkgPT09ICdjbG9zaW5nJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc3RhdGUuc2V0KCdjbG9zaW5nJyk7XG4gICAgdGhpcy5kaXNwb3NhYmxlcy5zZXRUaW1lb3V0KCgpID0+IHRoaXMuZGVzdHJveVBvcG92ZXIoKSwgdGhpcy5oaWRlRGVsYXkoKSk7XG5cbiAgICAvLyBSZW1vdmUgdGhlIGRvY3VtZW50IGNsaWNrIGxpc3RlbmVyIHdoZW4gdGhlIHBvcG92ZXIgaXMgaGlkZGVuXG4gICAgaWYgKHRoaXMuZG9jdW1lbnRDbGlja0xpc3RlbmVyKSB7XG4gICAgICB0aGlzLmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5kb2N1bWVudENsaWNrTGlzdGVuZXIsIHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb25Eb2N1bWVudENsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGNsaWNrIGlzIG91dHNpZGUgdGhlIHRyaWdnZXIgb3IgdGhlIHBvcG92ZXJcbiAgICBjb25zdCBpc091dHNpZGUgPVxuICAgICAgIXRoaXMudHJpZ2dlci5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKHRhcmdldCkgJiZcbiAgICAgICEodGhpcy52aWV3UmVmPy5yb290Tm9kZXNbMF0gYXMgSFRNTEVsZW1lbnQpLmNvbnRhaW5zKHRhcmdldCk7XG5cbiAgICBpZiAoaXNPdXRzaWRlKSB7XG4gICAgICAvLyBDbG9zZSB0aGUgcG9wb3ZlclxuICAgICAgdGhpcy5vcGVuLnNldChmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVQb3BvdmVyKCk6IHZvaWQge1xuICAgIGNvbnN0IHBvcnRhbCA9IG5ldyBUZW1wbGF0ZVBvcnRhbChcbiAgICAgIHRoaXMucG9wb3ZlcigpLFxuICAgICAgdGhpcy52aWV3Q29udGFpbmVyUmVmLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdGhpcy5pbmplY3RvcixcbiAgICApO1xuXG4gICAgY29uc3QgZG9tT3V0bGV0ID0gbmV3IERvbVBvcnRhbE91dGxldChcbiAgICAgIHRoaXMuY29udGFpbmVyKCkgPz8gdGhpcy5kb2N1bWVudC5ib2R5LFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgSW5qZWN0b3IuY3JlYXRlKHtcbiAgICAgICAgcGFyZW50OiB0aGlzLmluamVjdG9yLFxuICAgICAgICBwcm92aWRlcnM6IFtwcm92aWRlUG9wb3ZlclRyaWdnZXIodGhpcyldLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIHRoaXMudmlld1JlZiA9IGRvbU91dGxldC5hdHRhY2gocG9ydGFsKTtcbiAgICB0aGlzLnZpZXdSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgY29uc3Qgb3V0bGV0RWxlbWVudCA9IHRoaXMudmlld1JlZi5yb290Tm9kZXNbMF07XG5cbiAgICB0aGlzLmRpc3Bvc2UgPSBhdXRvVXBkYXRlKHRoaXMudHJpZ2dlci5uYXRpdmVFbGVtZW50LCBvdXRsZXRFbGVtZW50LCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBwb3NpdGlvbiA9IGF3YWl0IGNvbXB1dGVQb3NpdGlvbih0aGlzLnRyaWdnZXIubmF0aXZlRWxlbWVudCwgb3V0bGV0RWxlbWVudCwge1xuICAgICAgICBwbGFjZW1lbnQ6IHRoaXMucGxhY2VtZW50KCksXG4gICAgICAgIG1pZGRsZXdhcmU6IHRoaXMubWlkZGxld2FyZSgpLFxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMucG9zaXRpb24uc2V0KHsgeDogcG9zaXRpb24ueCwgeTogcG9zaXRpb24ueSB9KTtcbiAgICB9KTtcblxuICAgIHRoaXMuc3RhdGUuc2V0KCdvcGVuJyk7XG4gIH1cblxuICBwcml2YXRlIGRlc3Ryb3lQb3BvdmVyKCk6IHZvaWQge1xuICAgIHRoaXMudmlld1JlZj8uZGVzdHJveSgpO1xuICAgIHRoaXMudmlld1JlZiA9IG51bGw7XG4gICAgdGhpcy5kaXNwb3NlPy4oKTtcbiAgICB0aGlzLnN0YXRlLnNldCgnY2xvc2VkJyk7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgUG9wb3ZlclN0YXRlID0gJ2Nsb3NlZCcgfCAnb3BlbmluZycgfCAnb3BlbicgfCAnY2xvc2luZyc7XG4iXX0=