ngx-fixed-footer 2.0.1 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -14,7 +14,7 @@
14
14
 
15
15
  > Angular directive that adds fixed footer without overlap
16
16
 
17
- > ✓ _Angular 17 compatible_
17
+ > ✓ _Angular 18 compatible_
18
18
 
19
19
  Here's the [demo](http://celtian.github.io/ngx-fixed-footer/) or [stackblitz live preview](https://stackblitz.com/edit/ngx-fixed-footer) or [codesandbox live preview](https://codesandbox.io/s/ngx-fixed-footer-m4f21)
20
20
 
@@ -22,7 +22,7 @@ Here's the [demo](http://celtian.github.io/ngx-fixed-footer/) or [stackblitz liv
22
22
  - No dependencies!
23
23
  - Directive way
24
24
 
25
- ## Install
25
+ ## 🛠️ Install
26
26
 
27
27
  1. Use yarn (or npm) to install the package
28
28
 
@@ -90,15 +90,7 @@ yarn add ngx-fixed-footer
90
90
  })
91
91
  ```
92
92
 
93
- ## Compatibility
94
-
95
- | Angular | ngx-fixed-footer | Install |
96
- | --------- | ---------------- | ----------------------------- |
97
- | >= 14 | 2.x | `yarn add ngx-fixed-footer` |
98
- | >= 12 | 1.x | `yarn add ngx-fixed-footer@1` |
99
- | >= 5 < 13 | 0.x | `yarn add ngx-fixed-footer@0` |
100
-
101
- ## Quick start
93
+ ## 🚀 Quick start
102
94
 
103
95
  ### Example code
104
96
 
@@ -114,7 +106,7 @@ yarn add ngx-fixed-footer
114
106
  <div ngxFixedFooter [containerSelector]="[role='main']" [cssAttribute]="'padding'">... some content here</div>
115
107
  ```
116
108
 
117
- ## Options
109
+ ## 🛠️ Options
118
110
 
119
111
  ### Root options
120
112
 
@@ -134,11 +126,20 @@ _Each directive can override global options._
134
126
  | **[containerSelector]** | string | value taken from root options | Css selector used for additional padding/margin |
135
127
  | **[cssAttribute]** | 'margin' or 'padding' | value taken from root options | Css attribute used on 'containerSelector' |
136
128
 
137
- ## Dependencies
129
+ ## 🔧 Compatibility
130
+
131
+ | Angular | ngx-fixed-footer | Install |
132
+ | --------- | ---------------- | ----------------------------- |
133
+ | >= 18 | 3.x | `yarn add ngx-fixed-footer` |
134
+ | >= 14 | 2.x | `yarn add ngx-fixed-footer@2` |
135
+ | >= 12 | 1.x | `yarn add ngx-fixed-footer@1` |
136
+ | >= 5 < 13 | 0.x | `yarn add ngx-fixed-footer@0` |
137
+
138
+ ## 📦 Dependencies
138
139
 
139
140
  _None_
140
141
 
141
- ## License
142
+ ## 🪪 License
142
143
 
143
144
  Copyright &copy; 2021 - 2024 [Dominik Hladik](https://github.com/Celtian)
144
145
 
@@ -1,17 +1,50 @@
1
1
  import { DOCUMENT } from '@angular/common';
2
- import { Directive, Inject, Input, inject } from '@angular/core';
2
+ import { Directive, ElementRef, Renderer2, computed, effect, inject, input, signal } from '@angular/core';
3
3
  import { DEFAULT_FIXED_FOOTER_OPTIONS } from './ngx-fixed-footer.constants';
4
4
  import { APP_FIXED_FOOTER_OPTIONS_TOKEN } from './ngx-fixed-footer.provider';
5
5
  import * as i0 from "@angular/core";
6
6
  export class NgxFixedFooterDirective {
7
- constructor(document, el, render) {
8
- this.document = document;
9
- this.el = el;
10
- this.render = render;
7
+ constructor() {
8
+ this.document = inject(DOCUMENT);
9
+ this.el = inject(ElementRef);
10
+ this.render = inject(Renderer2);
11
11
  this.options = inject(APP_FIXED_FOOTER_OPTIONS_TOKEN, { optional: true }) || DEFAULT_FIXED_FOOTER_OPTIONS;
12
- this.offsetHeight = undefined;
13
- this.containerSelector = this.options.containerSelector;
14
- this.cssAttribute = this.options.cssAttribute;
12
+ this.hasResizeObserver = typeof ResizeObserver !== 'undefined';
13
+ this.offsetHeight = signal(undefined);
14
+ this.resizeObserver = signal(undefined);
15
+ this.prevContainerSelector = signal(undefined);
16
+ this.containerSelector = input(this.options.containerSelector);
17
+ this.cssAttribute = input(this.options.cssAttribute);
18
+ this.container = computed(() => {
19
+ const selector = this.containerSelector() || this.options.containerSelector;
20
+ return this.document.body.querySelector(selector);
21
+ });
22
+ // swap selector
23
+ effect(() => {
24
+ if (!this.hasResizeObserver || !this.document)
25
+ return;
26
+ const cssAttribute = this.cssAttribute();
27
+ const containerSelector = this.containerSelector();
28
+ if (containerSelector) {
29
+ const prevContainerSelector = this.prevContainerSelector();
30
+ if (prevContainerSelector && prevContainerSelector !== containerSelector) {
31
+ this.removeStyle(this.document.body.querySelector(prevContainerSelector), cssAttribute);
32
+ }
33
+ this.setStyle(this.document.body.querySelector(containerSelector), cssAttribute, this.offsetHeight());
34
+ this.prevContainerSelector.set(containerSelector);
35
+ }
36
+ }, { allowSignalWrites: true });
37
+ // swap css attribute
38
+ effect(() => {
39
+ if (!this.hasResizeObserver || !this.document)
40
+ return;
41
+ const cssAttribute = this.cssAttribute();
42
+ if (cssAttribute) {
43
+ const container = this.container();
44
+ this.removeStyle(container, cssAttribute === 'padding' ? 'margin' : 'padding');
45
+ this.setStyle(container, cssAttribute, this.offsetHeight());
46
+ }
47
+ });
15
48
  }
16
49
  ngOnInit() {
17
50
  if (this.hasResizeObserver && this.document) {
@@ -19,41 +52,17 @@ export class NgxFixedFooterDirective {
19
52
  resizeObserver.observe(this.html);
20
53
  }
21
54
  }
22
- ngOnChanges(changes) {
23
- if (this.hasResizeObserver && this.document) {
24
- // swap selector
25
- if (changes?.containerSelector && !changes?.containerSelector?.firstChange) {
26
- const prev = changes?.containerSelector?.previousValue;
27
- const next = changes?.containerSelector?.currentValue;
28
- if (next !== prev) {
29
- this.removeStyle(this.document.body.querySelector(prev), this.cssAttribute);
30
- this.setStyle(this.document.body.querySelector(next), this.cssAttribute, this.offsetHeight);
31
- }
32
- }
33
- // swap css attribute
34
- if (changes?.cssAttribute && !changes?.cssAttribute?.firstChange) {
35
- const prev = changes?.cssAttribute?.previousValue;
36
- const next = changes?.cssAttribute?.currentValue;
37
- if (next !== prev) {
38
- this.removeStyle(this.container, prev);
39
- this.setStyle(this.container, next, this.offsetHeight);
40
- }
41
- }
42
- }
43
- }
44
55
  ngOnDestroy() {
45
- if (this.hasResizeObserver && this.document) {
46
- this.removeStyle(this.container, this.cssAttribute);
47
- if (this.resizeObserver) {
48
- this.resizeObserver.unobserve(this.html);
49
- }
56
+ if (this.resizeObserver() && this.document) {
57
+ this.removeStyle(this.container(), this.cssAttribute());
58
+ this.resizeObserver().unobserve(this.html);
50
59
  }
51
60
  }
52
61
  checkHeight() {
53
62
  const height = this.html.offsetHeight;
54
- if (this.offsetHeight !== height) {
55
- this.setStyle(this.container, this.cssAttribute, height);
56
- this.offsetHeight = height;
63
+ if (this.offsetHeight() !== height) {
64
+ this.setStyle(this.container(), this.cssAttribute(), height);
65
+ this.offsetHeight.set(height);
57
66
  }
58
67
  }
59
68
  removeStyle(container, cssAttribute) {
@@ -68,35 +77,17 @@ export class NgxFixedFooterDirective {
68
77
  }
69
78
  this.render.setStyle(container, `${cssAttribute}-bottom`, height === 0 ? '' : `${height}px`);
70
79
  }
71
- get container() {
72
- const selector = this.containerSelector || this.options.containerSelector;
73
- const container = this.document.body.querySelector(selector);
74
- if (!container) {
75
- console.warn(`Container '${selector}' was not found`);
76
- }
77
- return container;
78
- }
79
80
  get html() {
80
81
  return this.el.nativeElement;
81
82
  }
82
- get hasResizeObserver() {
83
- return typeof ResizeObserver !== 'undefined';
84
- }
85
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: NgxFixedFooterDirective, deps: [{ token: DOCUMENT }, { token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive }); }
86
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.1.3", type: NgxFixedFooterDirective, isStandalone: true, selector: "[ngxFixedFooter]", inputs: { containerSelector: "containerSelector", cssAttribute: "cssAttribute" }, usesOnChanges: true, ngImport: i0 }); }
83
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: NgxFixedFooterDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
84
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.8", type: NgxFixedFooterDirective, isStandalone: true, selector: "[ngxFixedFooter]", inputs: { containerSelector: { classPropertyName: "containerSelector", publicName: "containerSelector", isSignal: true, isRequired: false, transformFunction: null }, cssAttribute: { classPropertyName: "cssAttribute", publicName: "cssAttribute", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 }); }
87
85
  }
88
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: NgxFixedFooterDirective, decorators: [{
86
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: NgxFixedFooterDirective, decorators: [{
89
87
  type: Directive,
90
88
  args: [{
91
89
  selector: '[ngxFixedFooter]',
92
90
  standalone: true
93
91
  }]
94
- }], ctorParameters: () => [{ type: undefined, decorators: [{
95
- type: Inject,
96
- args: [DOCUMENT]
97
- }] }, { type: i0.ElementRef }, { type: i0.Renderer2 }], propDecorators: { containerSelector: [{
98
- type: Input
99
- }], cssAttribute: [{
100
- type: Input
101
- }] } });
102
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWZpeGVkLWZvb3Rlci5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZml4ZWQtZm9vdGVyL3NyYy9saWIvbmd4LWZpeGVkLWZvb3Rlci5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFDTCxTQUFTLEVBRVQsTUFBTSxFQUNOLEtBQUssRUFNTCxNQUFNLEVBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFNUUsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7O0FBTTdFLE1BQU0sT0FBTyx1QkFBdUI7SUFTbEMsWUFDNEIsUUFBYSxFQUMvQixFQUFjLEVBQ2QsTUFBaUI7UUFGQyxhQUFRLEdBQVIsUUFBUSxDQUFLO1FBQy9CLE9BQUUsR0FBRixFQUFFLENBQVk7UUFDZCxXQUFNLEdBQU4sTUFBTSxDQUFXO1FBWG5CLFlBQU8sR0FDYixNQUFNLENBQUMsOEJBQThCLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsSUFBSSw0QkFBNEIsQ0FBQztRQUNyRixpQkFBWSxHQUFXLFNBQVMsQ0FBQztRQUd6QixzQkFBaUIsR0FBVyxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDO1FBQzNELGlCQUFZLEdBQStCLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDO0lBTWxGLENBQUM7SUFFRyxRQUFRO1FBQ2IsSUFBSSxJQUFJLENBQUMsaUJBQWlCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzVDLE1BQU0sY0FBYyxHQUFHLElBQUksY0FBYyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1lBQ3BFLGNBQWMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BDLENBQUM7SUFDSCxDQUFDO0lBRU0sV0FBVyxDQUFDLE9BQXNCO1FBQ3ZDLElBQUksSUFBSSxDQUFDLGlCQUFpQixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUM1QyxnQkFBZ0I7WUFDaEIsSUFBSSxPQUFPLEVBQUUsaUJBQWlCLElBQUksQ0FBQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLENBQUM7Z0JBQzNFLE1BQU0sSUFBSSxHQUFHLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxhQUFhLENBQUM7Z0JBQ3ZELE1BQU0sSUFBSSxHQUFHLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxZQUFZLENBQUM7Z0JBQ3RELElBQUksSUFBSSxLQUFLLElBQUksRUFBRSxDQUFDO29CQUNsQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7b0JBQzVFLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUM5RixDQUFDO1lBQ0gsQ0FBQztZQUVELHFCQUFxQjtZQUNyQixJQUFJLE9BQU8sRUFBRSxZQUFZLElBQUksQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxDQUFDO2dCQUNqRSxNQUFNLElBQUksR0FBRyxPQUFPLEVBQUUsWUFBWSxFQUFFLGFBQWEsQ0FBQztnQkFDbEQsTUFBTSxJQUFJLEdBQUcsT0FBTyxFQUFFLFlBQVksRUFBRSxZQUFZLENBQUM7Z0JBQ2pELElBQUksSUFBSSxLQUFLLElBQUksRUFBRSxDQUFDO29CQUNsQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7b0JBQ3ZDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUN6RCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRU0sV0FBVztRQUNoQixJQUFJLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDNUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNwRCxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDeEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzNDLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVPLFdBQVc7UUFDakIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDdEMsSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ3pELElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDO1FBQzdCLENBQUM7SUFDSCxDQUFDO0lBRU8sV0FBVyxDQUFDLFNBQXNCLEVBQUUsWUFBd0M7UUFDbEYsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2YsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1FBQy9ELENBQUM7UUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsR0FBRyxZQUFZLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRU8sUUFBUSxDQUFDLFNBQXNCLEVBQUUsWUFBd0MsRUFBRSxNQUFjO1FBQy9GLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNmLE1BQU0sSUFBSSxLQUFLLENBQUMsd0NBQXdDLENBQUMsQ0FBQztRQUM1RCxDQUFDO1FBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLEdBQUcsWUFBWSxTQUFTLEVBQUUsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sSUFBSSxDQUFDLENBQUM7SUFDL0YsQ0FBQztJQUVELElBQVksU0FBUztRQUNuQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsaUJBQWlCLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQztRQUMxRSxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDN0QsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2YsT0FBTyxDQUFDLElBQUksQ0FBQyxjQUFjLFFBQVEsaUJBQWlCLENBQUMsQ0FBQztRQUN4RCxDQUFDO1FBQ0QsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVELElBQVksSUFBSTtRQUNkLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUM7SUFDL0IsQ0FBQztJQUVELElBQVksaUJBQWlCO1FBQzNCLE9BQU8sT0FBTyxjQUFjLEtBQUssV0FBVyxDQUFDO0lBQy9DLENBQUM7OEdBNUZVLHVCQUF1QixrQkFVeEIsUUFBUTtrR0FWUCx1QkFBdUI7OzJGQUF2Qix1QkFBdUI7a0JBSm5DLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGtCQUFrQjtvQkFDNUIsVUFBVSxFQUFFLElBQUk7aUJBQ2pCOzswQkFXSSxNQUFNOzJCQUFDLFFBQVE7MEZBSkYsaUJBQWlCO3NCQUFoQyxLQUFLO2dCQUNVLFlBQVk7c0JBQTNCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIFJlbmRlcmVyMixcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgaW5qZWN0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgREVGQVVMVF9GSVhFRF9GT09URVJfT1BUSU9OUyB9IGZyb20gJy4vbmd4LWZpeGVkLWZvb3Rlci5jb25zdGFudHMnO1xuaW1wb3J0IHsgTmd4Rml4ZWRGb290ZXJDc3NBdHRyaWJ1dGUsIE5neEZpeGVkRm9vdGVyT3B0aW9ucyB9IGZyb20gJy4vbmd4LWZpeGVkLWZvb3Rlci5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQVBQX0ZJWEVEX0ZPT1RFUl9PUFRJT05TX1RPS0VOIH0gZnJvbSAnLi9uZ3gtZml4ZWQtZm9vdGVyLnByb3ZpZGVyJztcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW25neEZpeGVkRm9vdGVyXScsXG4gIHN0YW5kYWxvbmU6IHRydWVcbn0pXG5leHBvcnQgY2xhc3MgTmd4Rml4ZWRGb290ZXJEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkRlc3Ryb3ksIE9uQ2hhbmdlcywgT25Jbml0IHtcbiAgcHJpdmF0ZSBvcHRpb25zOiBOZ3hGaXhlZEZvb3Rlck9wdGlvbnMgPVxuICAgIGluamVjdChBUFBfRklYRURfRk9PVEVSX09QVElPTlNfVE9LRU4sIHsgb3B0aW9uYWw6IHRydWUgfSkgfHwgREVGQVVMVF9GSVhFRF9GT09URVJfT1BUSU9OUztcbiAgcHJpdmF0ZSBvZmZzZXRIZWlnaHQ6IG51bWJlciA9IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSByZXNpemVPYnNlcnZlcjogUmVzaXplT2JzZXJ2ZXI7XG5cbiAgQElucHV0KCkgcHVibGljIGNvbnRhaW5lclNlbGVjdG9yOiBzdHJpbmcgPSB0aGlzLm9wdGlvbnMuY29udGFpbmVyU2VsZWN0b3I7XG4gIEBJbnB1dCgpIHB1YmxpYyBjc3NBdHRyaWJ1dGU6IE5neEZpeGVkRm9vdGVyQ3NzQXR0cmlidXRlID0gdGhpcy5vcHRpb25zLmNzc0F0dHJpYnV0ZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIGRvY3VtZW50OiBhbnksXG4gICAgcHJpdmF0ZSBlbDogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIHJlbmRlcjogUmVuZGVyZXIyXG4gICkge31cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaGFzUmVzaXplT2JzZXJ2ZXIgJiYgdGhpcy5kb2N1bWVudCkge1xuICAgICAgY29uc3QgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4gdGhpcy5jaGVja0hlaWdodCgpKTtcbiAgICAgIHJlc2l6ZU9ic2VydmVyLm9ic2VydmUodGhpcy5odG1sKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmICh0aGlzLmhhc1Jlc2l6ZU9ic2VydmVyICYmIHRoaXMuZG9jdW1lbnQpIHtcbiAgICAgIC8vIHN3YXAgc2VsZWN0b3JcbiAgICAgIGlmIChjaGFuZ2VzPy5jb250YWluZXJTZWxlY3RvciAmJiAhY2hhbmdlcz8uY29udGFpbmVyU2VsZWN0b3I/LmZpcnN0Q2hhbmdlKSB7XG4gICAgICAgIGNvbnN0IHByZXYgPSBjaGFuZ2VzPy5jb250YWluZXJTZWxlY3Rvcj8ucHJldmlvdXNWYWx1ZTtcbiAgICAgICAgY29uc3QgbmV4dCA9IGNoYW5nZXM/LmNvbnRhaW5lclNlbGVjdG9yPy5jdXJyZW50VmFsdWU7XG4gICAgICAgIGlmIChuZXh0ICE9PSBwcmV2KSB7XG4gICAgICAgICAgdGhpcy5yZW1vdmVTdHlsZSh0aGlzLmRvY3VtZW50LmJvZHkucXVlcnlTZWxlY3RvcihwcmV2KSwgdGhpcy5jc3NBdHRyaWJ1dGUpO1xuICAgICAgICAgIHRoaXMuc2V0U3R5bGUodGhpcy5kb2N1bWVudC5ib2R5LnF1ZXJ5U2VsZWN0b3IobmV4dCksIHRoaXMuY3NzQXR0cmlidXRlLCB0aGlzLm9mZnNldEhlaWdodCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gc3dhcCBjc3MgYXR0cmlidXRlXG4gICAgICBpZiAoY2hhbmdlcz8uY3NzQXR0cmlidXRlICYmICFjaGFuZ2VzPy5jc3NBdHRyaWJ1dGU/LmZpcnN0Q2hhbmdlKSB7XG4gICAgICAgIGNvbnN0IHByZXYgPSBjaGFuZ2VzPy5jc3NBdHRyaWJ1dGU/LnByZXZpb3VzVmFsdWU7XG4gICAgICAgIGNvbnN0IG5leHQgPSBjaGFuZ2VzPy5jc3NBdHRyaWJ1dGU/LmN1cnJlbnRWYWx1ZTtcbiAgICAgICAgaWYgKG5leHQgIT09IHByZXYpIHtcbiAgICAgICAgICB0aGlzLnJlbW92ZVN0eWxlKHRoaXMuY29udGFpbmVyLCBwcmV2KTtcbiAgICAgICAgICB0aGlzLnNldFN0eWxlKHRoaXMuY29udGFpbmVyLCBuZXh0LCB0aGlzLm9mZnNldEhlaWdodCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaGFzUmVzaXplT2JzZXJ2ZXIgJiYgdGhpcy5kb2N1bWVudCkge1xuICAgICAgdGhpcy5yZW1vdmVTdHlsZSh0aGlzLmNvbnRhaW5lciwgdGhpcy5jc3NBdHRyaWJ1dGUpO1xuICAgICAgaWYgKHRoaXMucmVzaXplT2JzZXJ2ZXIpIHtcbiAgICAgICAgdGhpcy5yZXNpemVPYnNlcnZlci51bm9ic2VydmUodGhpcy5odG1sKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNoZWNrSGVpZ2h0KCk6IHZvaWQge1xuICAgIGNvbnN0IGhlaWdodCA9IHRoaXMuaHRtbC5vZmZzZXRIZWlnaHQ7XG4gICAgaWYgKHRoaXMub2Zmc2V0SGVpZ2h0ICE9PSBoZWlnaHQpIHtcbiAgICAgIHRoaXMuc2V0U3R5bGUodGhpcy5jb250YWluZXIsIHRoaXMuY3NzQXR0cmlidXRlLCBoZWlnaHQpO1xuICAgICAgdGhpcy5vZmZzZXRIZWlnaHQgPSBoZWlnaHQ7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVTdHlsZShjb250YWluZXI6IEhUTUxFbGVtZW50LCBjc3NBdHRyaWJ1dGU6IE5neEZpeGVkRm9vdGVyQ3NzQXR0cmlidXRlKTogdm9pZCB7XG4gICAgaWYgKCFjb250YWluZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHJlbW92ZVN0eWxlIHRvIHVuZGVmaW5lZCBjb250YWluZXJgKTtcbiAgICB9XG4gICAgdGhpcy5yZW5kZXIuc2V0U3R5bGUoY29udGFpbmVyLCBgJHtjc3NBdHRyaWJ1dGV9LWJvdHRvbWAsICcnKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0U3R5bGUoY29udGFpbmVyOiBIVE1MRWxlbWVudCwgY3NzQXR0cmlidXRlOiBOZ3hGaXhlZEZvb3RlckNzc0F0dHJpYnV0ZSwgaGVpZ2h0OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIWNvbnRhaW5lcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3Qgc2V0U3R5bGUgdG8gdW5kZWZpbmVkIGNvbnRhaW5lcmApO1xuICAgIH1cbiAgICB0aGlzLnJlbmRlci5zZXRTdHlsZShjb250YWluZXIsIGAke2Nzc0F0dHJpYnV0ZX0tYm90dG9tYCwgaGVpZ2h0ID09PSAwID8gJycgOiBgJHtoZWlnaHR9cHhgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGNvbnRhaW5lcigpOiBIVE1MRWxlbWVudCB7XG4gICAgY29uc3Qgc2VsZWN0b3IgPSB0aGlzLmNvbnRhaW5lclNlbGVjdG9yIHx8IHRoaXMub3B0aW9ucy5jb250YWluZXJTZWxlY3RvcjtcbiAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmRvY3VtZW50LmJvZHkucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgaWYgKCFjb250YWluZXIpIHtcbiAgICAgIGNvbnNvbGUud2FybihgQ29udGFpbmVyICcke3NlbGVjdG9yfScgd2FzIG5vdCBmb3VuZGApO1xuICAgIH1cbiAgICByZXR1cm4gY29udGFpbmVyO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgaHRtbCgpOiBIVE1MRWxlbWVudCB7XG4gICAgcmV0dXJuIHRoaXMuZWwubmF0aXZlRWxlbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGhhc1Jlc2l6ZU9ic2VydmVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0eXBlb2YgUmVzaXplT2JzZXJ2ZXIgIT09ICd1bmRlZmluZWQnO1xuICB9XG59XG4iXX0=
92
+ }], ctorParameters: () => [] });
93
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWZpeGVkLWZvb3Rlci5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZml4ZWQtZm9vdGVyL3NyYy9saWIvbmd4LWZpeGVkLWZvb3Rlci5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFDTCxTQUFTLEVBQ1QsVUFBVSxFQUdWLFNBQVMsRUFDVCxRQUFRLEVBQ1IsTUFBTSxFQUNOLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRTVFLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLDZCQUE2QixDQUFDOztBQU03RSxNQUFNLE9BQU8sdUJBQXVCO0lBb0JsQztRQW5CaUIsYUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM1QixPQUFFLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3hCLFdBQU0sR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDcEMsWUFBTyxHQUNiLE1BQU0sQ0FBQyw4QkFBOEIsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxJQUFJLDRCQUE0QixDQUFDO1FBQzVFLHNCQUFpQixHQUFHLE9BQU8sY0FBYyxLQUFLLFdBQVcsQ0FBQztRQUVuRSxpQkFBWSxHQUFHLE1BQU0sQ0FBcUIsU0FBUyxDQUFDLENBQUM7UUFDckQsbUJBQWMsR0FBRyxNQUFNLENBQTZCLFNBQVMsQ0FBQyxDQUFDO1FBQy9ELDBCQUFxQixHQUFHLE1BQU0sQ0FBcUIsU0FBUyxDQUFDLENBQUM7UUFFL0Qsc0JBQWlCLEdBQUcsS0FBSyxDQUFTLElBQUksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FB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R0FBdkIsdUJBQXVCOzsyRkFBdkIsdUJBQXVCO2tCQUpuQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxrQkFBa0I7b0JBQzVCLFVBQVUsRUFBRSxJQUFJO2lCQUNqQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIFJlbmRlcmVyMixcbiAgY29tcHV0ZWQsXG4gIGVmZmVjdCxcbiAgaW5qZWN0LFxuICBpbnB1dCxcbiAgc2lnbmFsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgREVGQVVMVF9GSVhFRF9GT09URVJfT1BUSU9OUyB9IGZyb20gJy4vbmd4LWZpeGVkLWZvb3Rlci5jb25zdGFudHMnO1xuaW1wb3J0IHsgTmd4Rml4ZWRGb290ZXJDc3NBdHRyaWJ1dGUsIE5neEZpeGVkRm9vdGVyT3B0aW9ucyB9IGZyb20gJy4vbmd4LWZpeGVkLWZvb3Rlci5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQVBQX0ZJWEVEX0ZPT1RFUl9PUFRJT05TX1RPS0VOIH0gZnJvbSAnLi9uZ3gtZml4ZWQtZm9vdGVyLnByb3ZpZGVyJztcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW25neEZpeGVkRm9vdGVyXScsXG4gIHN0YW5kYWxvbmU6IHRydWVcbn0pXG5leHBvcnQgY2xhc3MgTmd4Rml4ZWRGb290ZXJEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkRlc3Ryb3ksIE9uSW5pdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZG9jdW1lbnQgPSBpbmplY3QoRE9DVU1FTlQpO1xuICBwcml2YXRlIHJlYWRvbmx5IGVsID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlbmRlciA9IGluamVjdChSZW5kZXJlcjIpO1xuICBwcml2YXRlIG9wdGlvbnM6IE5neEZpeGVkRm9vdGVyT3B0aW9ucyA9XG4gICAgaW5qZWN0KEFQUF9GSVhFRF9GT09URVJfT1BUSU9OU19UT0tFTiwgeyBvcHRpb25hbDogdHJ1ZSB9KSB8fCBERUZBVUxUX0ZJWEVEX0ZPT1RFUl9PUFRJT05TO1xuICBwcml2YXRlIHJlYWRvbmx5IGhhc1Jlc2l6ZU9ic2VydmVyID0gdHlwZW9mIFJlc2l6ZU9ic2VydmVyICE9PSAndW5kZWZpbmVkJztcblxuICBwcml2YXRlIG9mZnNldEhlaWdodCA9IHNpZ25hbDxudW1iZXIgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByaXZhdGUgcmVzaXplT2JzZXJ2ZXIgPSBzaWduYWw8UmVzaXplT2JzZXJ2ZXIgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByaXZhdGUgcHJldkNvbnRhaW5lclNlbGVjdG9yID0gc2lnbmFsPHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuICBwdWJsaWMgY29udGFpbmVyU2VsZWN0b3IgPSBpbnB1dDxzdHJpbmc+KHRoaXMub3B0aW9ucy5jb250YWluZXJTZWxlY3Rvcik7XG4gIHB1YmxpYyBjc3NBdHRyaWJ1dGUgPSBpbnB1dDxOZ3hGaXhlZEZvb3RlckNzc0F0dHJpYnV0ZT4odGhpcy5vcHRpb25zLmNzc0F0dHJpYnV0ZSk7XG5cbiAgcHJpdmF0ZSBjb250YWluZXIgPSBjb21wdXRlZDxIVE1MRWxlbWVudD4oKCkgPT4ge1xuICAgIGNvbnN0IHNlbGVjdG9yID0gdGhpcy5jb250YWluZXJTZWxlY3RvcigpIHx8IHRoaXMub3B0aW9ucy5jb250YWluZXJTZWxlY3RvcjtcbiAgICByZXR1cm4gdGhpcy5kb2N1bWVudC5ib2R5LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KHNlbGVjdG9yKTtcbiAgfSk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gc3dhcCBzZWxlY3RvclxuICAgIGVmZmVjdChcbiAgICAgICgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmhhc1Jlc2l6ZU9ic2VydmVyIHx8ICF0aGlzLmRvY3VtZW50KSByZXR1cm47XG4gICAgICAgIGNvbnN0IGNzc0F0dHJpYnV0ZSA9IHRoaXMuY3NzQXR0cmlidXRlKCk7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lclNlbGVjdG9yID0gdGhpcy5jb250YWluZXJTZWxlY3RvcigpO1xuICAgICAgICBpZiAoY29udGFpbmVyU2VsZWN0b3IpIHtcbiAgICAgICAgICBjb25zdCBwcmV2Q29udGFpbmVyU2VsZWN0b3IgPSB0aGlzLnByZXZDb250YWluZXJTZWxlY3RvcigpO1xuICAgICAgICAgIGlmIChwcmV2Q29udGFpbmVyU2VsZWN0b3IgJiYgcHJldkNvbnRhaW5lclNlbGVjdG9yICE9PSBjb250YWluZXJTZWxlY3Rvcikge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVTdHlsZSh0aGlzLmRvY3VtZW50LmJvZHkucXVlcnlTZWxlY3RvcihwcmV2Q29udGFpbmVyU2VsZWN0b3IpLCBjc3NBdHRyaWJ1dGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnNldFN0eWxlKHRoaXMuZG9jdW1lbnQuYm9keS5xdWVyeVNlbGVjdG9yKGNvbnRhaW5lclNlbGVjdG9yKSwgY3NzQXR0cmlidXRlLCB0aGlzLm9mZnNldEhlaWdodCgpKTtcbiAgICAgICAgICB0aGlzLnByZXZDb250YWluZXJTZWxlY3Rvci5zZXQoY29udGFpbmVyU2VsZWN0b3IpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9XG4gICAgKTtcblxuICAgIC8vIHN3YXAgY3NzIGF0dHJpYnV0ZVxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuaGFzUmVzaXplT2JzZXJ2ZXIgfHwgIXRoaXMuZG9jdW1lbnQpIHJldHVybjtcbiAgICAgIGNvbnN0IGNzc0F0dHJpYnV0ZSA9IHRoaXMuY3NzQXR0cmlidXRlKCk7XG4gICAgICBpZiAoY3NzQXR0cmlidXRlKSB7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyKCk7XG4gICAgICAgIHRoaXMucmVtb3ZlU3R5bGUoY29udGFpbmVyLCBjc3NBdHRyaWJ1dGUgPT09ICdwYWRkaW5nJyA/ICdtYXJnaW4nIDogJ3BhZGRpbmcnKTtcbiAgICAgICAgdGhpcy5zZXRTdHlsZShjb250YWluZXIsIGNzc0F0dHJpYnV0ZSwgdGhpcy5vZmZzZXRIZWlnaHQoKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaGFzUmVzaXplT2JzZXJ2ZXIgJiYgdGhpcy5kb2N1bWVudCkge1xuICAgICAgY29uc3QgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4gdGhpcy5jaGVja0hlaWdodCgpKTtcbiAgICAgIHJlc2l6ZU9ic2VydmVyLm9ic2VydmUodGhpcy5odG1sKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVzaXplT2JzZXJ2ZXIoKSAmJiB0aGlzLmRvY3VtZW50KSB7XG4gICAgICB0aGlzLnJlbW92ZVN0eWxlKHRoaXMuY29udGFpbmVyKCksIHRoaXMuY3NzQXR0cmlidXRlKCkpO1xuICAgICAgdGhpcy5yZXNpemVPYnNlcnZlcigpLnVub2JzZXJ2ZSh0aGlzLmh0bWwpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tIZWlnaHQoKTogdm9pZCB7XG4gICAgY29uc3QgaGVpZ2h0ID0gdGhpcy5odG1sLm9mZnNldEhlaWdodDtcbiAgICBpZiAodGhpcy5vZmZzZXRIZWlnaHQoKSAhPT0gaGVpZ2h0KSB7XG4gICAgICB0aGlzLnNldFN0eWxlKHRoaXMuY29udGFpbmVyKCksIHRoaXMuY3NzQXR0cmlidXRlKCksIGhlaWdodCk7XG4gICAgICB0aGlzLm9mZnNldEhlaWdodC5zZXQoaGVpZ2h0KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZVN0eWxlKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIGNzc0F0dHJpYnV0ZTogTmd4Rml4ZWRGb290ZXJDc3NBdHRyaWJ1dGUpOiB2b2lkIHtcbiAgICBpZiAoIWNvbnRhaW5lcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmVtb3ZlU3R5bGUgdG8gdW5kZWZpbmVkIGNvbnRhaW5lcmApO1xuICAgIH1cbiAgICB0aGlzLnJlbmRlci5zZXRTdHlsZShjb250YWluZXIsIGAke2Nzc0F0dHJpYnV0ZX0tYm90dG9tYCwgJycpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRTdHlsZShjb250YWluZXI6IEhUTUxFbGVtZW50LCBjc3NBdHRyaWJ1dGU6IE5neEZpeGVkRm9vdGVyQ3NzQXR0cmlidXRlLCBoZWlnaHQ6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghY29udGFpbmVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBzZXRTdHlsZSB0byB1bmRlZmluZWQgY29udGFpbmVyYCk7XG4gICAgfVxuICAgIHRoaXMucmVuZGVyLnNldFN0eWxlKGNvbnRhaW5lciwgYCR7Y3NzQXR0cmlidXRlfS1ib3R0b21gLCBoZWlnaHQgPT09IDAgPyAnJyA6IGAke2hlaWdodH1weGApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgaHRtbCgpOiBIVE1MRWxlbWVudCB7XG4gICAgcmV0dXJuIHRoaXMuZWwubmF0aXZlRWxlbWVudDtcbiAgfVxufVxuIl19
@@ -1,2 +1,2 @@
1
1
  export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWZpeGVkLWZvb3Rlci5pbnRlcmZhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZml4ZWQtZm9vdGVyL3NyYy9saWIvbmd4LWZpeGVkLWZvb3Rlci5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIE5neEZpeGVkRm9vdGVyQ3NzQXR0cmlidXRlID0gJ3BhZGRpbmcnIHwgJ21hcmdpbic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmd4Rml4ZWRGb290ZXJPcHRpb25zIHtcbiAgY3NzQXR0cmlidXRlPzogTmd4Rml4ZWRGb290ZXJDc3NBdHRyaWJ1dGU7XG4gIGNvbnRhaW5lclNlbGVjdG9yPzogc3RyaW5nO1xufVxuIl19
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWZpeGVkLWZvb3Rlci5pbnRlcmZhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZml4ZWQtZm9vdGVyL3NyYy9saWIvbmd4LWZpeGVkLWZvb3Rlci5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIE5neEZpeGVkRm9vdGVyQ3NzQXR0cmlidXRlID0gJ3BhZGRpbmcnIHwgJ21hcmdpbic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmd4Rml4ZWRGb290ZXJPcHRpb25zIHtcbiAgY3NzQXR0cmlidXRlOiBOZ3hGaXhlZEZvb3RlckNzc0F0dHJpYnV0ZTtcbiAgY29udGFpbmVyU2VsZWN0b3I6IHN0cmluZztcbn1cbiJdfQ==
@@ -10,4 +10,4 @@ export const provideFixedFooter = (options) => {
10
10
  }
11
11
  };
12
12
  };
13
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWZpeGVkLWZvb3Rlci5wcm92aWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1maXhlZC1mb290ZXIvc3JjL2xpYi9uZ3gtZml4ZWQtZm9vdGVyLnByb3ZpZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQVksTUFBTSxlQUFlLENBQUM7QUFDekQsT0FBTyxFQUFFLDBCQUEwQixFQUFFLHFCQUFxQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFHakcsTUFBTSxDQUFDLE1BQU0sOEJBQThCLEdBQUcsSUFBSSxjQUFjLENBQXdCLDBCQUEwQixDQUFDLENBQUM7QUFFcEgsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxPQUE4QixFQUFZLEVBQUU7SUFDN0UsT0FBTztRQUNMLE9BQU8sRUFBRSw4QkFBOEI7UUFDdkMsUUFBUSxFQUFFO1lBQ1IsWUFBWSxFQUFFLE9BQU8sQ0FBQyxZQUFZLElBQUkscUJBQXFCO1lBQzNELGlCQUFpQixFQUFFLE9BQU8sQ0FBQyxpQkFBaUIsSUFBSSwwQkFBMEI7U0FDM0U7S0FDRixDQUFDO0FBQ0osQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4sIFByb3ZpZGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBERUZBVUxUX0NPTlRBSU5FUl9TRUxFQ1RPUiwgREVGQVVMVF9DU1NfQVRUUklCVVRFIH0gZnJvbSAnLi9uZ3gtZml4ZWQtZm9vdGVyLmNvbnN0YW50cyc7XG5pbXBvcnQgeyBOZ3hGaXhlZEZvb3Rlck9wdGlvbnMgfSBmcm9tICcuL25neC1maXhlZC1mb290ZXIuaW50ZXJmYWNlJztcblxuZXhwb3J0IGNvbnN0IEFQUF9GSVhFRF9GT09URVJfT1BUSU9OU19UT0tFTiA9IG5ldyBJbmplY3Rpb25Ub2tlbjxOZ3hGaXhlZEZvb3Rlck9wdGlvbnM+KCdbbmd4Rml4ZWRGb290ZXJdIE9wdGlvbnMnKTtcblxuZXhwb3J0IGNvbnN0IHByb3ZpZGVGaXhlZEZvb3RlciA9IChvcHRpb25zOiBOZ3hGaXhlZEZvb3Rlck9wdGlvbnMpOiBQcm92aWRlciA9PiB7XG4gIHJldHVybiB7XG4gICAgcHJvdmlkZTogQVBQX0ZJWEVEX0ZPT1RFUl9PUFRJT05TX1RPS0VOLFxuICAgIHVzZVZhbHVlOiB7XG4gICAgICBjc3NBdHRyaWJ1dGU6IG9wdGlvbnMuY3NzQXR0cmlidXRlIHx8IERFRkFVTFRfQ1NTX0FUVFJJQlVURSxcbiAgICAgIGNvbnRhaW5lclNlbGVjdG9yOiBvcHRpb25zLmNvbnRhaW5lclNlbGVjdG9yIHx8IERFRkFVTFRfQ09OVEFJTkVSX1NFTEVDVE9SXG4gICAgfVxuICB9O1xufTtcbiJdfQ==
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWZpeGVkLWZvb3Rlci5wcm92aWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1maXhlZC1mb290ZXIvc3JjL2xpYi9uZ3gtZml4ZWQtZm9vdGVyLnByb3ZpZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQVksTUFBTSxlQUFlLENBQUM7QUFDekQsT0FBTyxFQUFFLDBCQUEwQixFQUFFLHFCQUFxQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFHakcsTUFBTSxDQUFDLE1BQU0sOEJBQThCLEdBQUcsSUFBSSxjQUFjLENBQXdCLDBCQUEwQixDQUFDLENBQUM7QUFFcEgsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxPQUF1QyxFQUFZLEVBQUU7SUFDdEYsT0FBTztRQUNMLE9BQU8sRUFBRSw4QkFBOEI7UUFDdkMsUUFBUSxFQUFFO1lBQ1IsWUFBWSxFQUFFLE9BQU8sQ0FBQyxZQUFZLElBQUkscUJBQXFCO1lBQzNELGlCQUFpQixFQUFFLE9BQU8sQ0FBQyxpQkFBaUIsSUFBSSwwQkFBMEI7U0FDM0U7S0FDRixDQUFDO0FBQ0osQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4sIFByb3ZpZGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBERUZBVUxUX0NPTlRBSU5FUl9TRUxFQ1RPUiwgREVGQVVMVF9DU1NfQVRUUklCVVRFIH0gZnJvbSAnLi9uZ3gtZml4ZWQtZm9vdGVyLmNvbnN0YW50cyc7XG5pbXBvcnQgeyBOZ3hGaXhlZEZvb3Rlck9wdGlvbnMgfSBmcm9tICcuL25neC1maXhlZC1mb290ZXIuaW50ZXJmYWNlJztcblxuZXhwb3J0IGNvbnN0IEFQUF9GSVhFRF9GT09URVJfT1BUSU9OU19UT0tFTiA9IG5ldyBJbmplY3Rpb25Ub2tlbjxOZ3hGaXhlZEZvb3Rlck9wdGlvbnM+KCdbbmd4Rml4ZWRGb290ZXJdIE9wdGlvbnMnKTtcblxuZXhwb3J0IGNvbnN0IHByb3ZpZGVGaXhlZEZvb3RlciA9IChvcHRpb25zOiBQYXJ0aWFsPE5neEZpeGVkRm9vdGVyT3B0aW9ucz4pOiBQcm92aWRlciA9PiB7XG4gIHJldHVybiB7XG4gICAgcHJvdmlkZTogQVBQX0ZJWEVEX0ZPT1RFUl9PUFRJT05TX1RPS0VOLFxuICAgIHVzZVZhbHVlOiB7XG4gICAgICBjc3NBdHRyaWJ1dGU6IG9wdGlvbnMuY3NzQXR0cmlidXRlIHx8IERFRkFVTFRfQ1NTX0FUVFJJQlVURSxcbiAgICAgIGNvbnRhaW5lclNlbGVjdG9yOiBvcHRpb25zLmNvbnRhaW5lclNlbGVjdG9yIHx8IERFRkFVTFRfQ09OVEFJTkVSX1NFTEVDVE9SXG4gICAgfVxuICB9O1xufTtcbiJdfQ==
@@ -1,6 +1,6 @@
1
1
  import { DOCUMENT } from '@angular/common';
2
2
  import * as i0 from '@angular/core';
3
- import { InjectionToken, inject, Directive, Inject, Input } from '@angular/core';
3
+ import { InjectionToken, inject, ElementRef, Renderer2, signal, input, computed, effect, Directive } from '@angular/core';
4
4
 
5
5
  const DEFAULT_CSS_ATTRIBUTE = 'padding';
6
6
  const DEFAULT_CONTAINER_SELECTOR = '[role="main"]';
@@ -21,14 +21,47 @@ const provideFixedFooter = (options) => {
21
21
  };
22
22
 
23
23
  class NgxFixedFooterDirective {
24
- constructor(document, el, render) {
25
- this.document = document;
26
- this.el = el;
27
- this.render = render;
24
+ constructor() {
25
+ this.document = inject(DOCUMENT);
26
+ this.el = inject(ElementRef);
27
+ this.render = inject(Renderer2);
28
28
  this.options = inject(APP_FIXED_FOOTER_OPTIONS_TOKEN, { optional: true }) || DEFAULT_FIXED_FOOTER_OPTIONS;
29
- this.offsetHeight = undefined;
30
- this.containerSelector = this.options.containerSelector;
31
- this.cssAttribute = this.options.cssAttribute;
29
+ this.hasResizeObserver = typeof ResizeObserver !== 'undefined';
30
+ this.offsetHeight = signal(undefined);
31
+ this.resizeObserver = signal(undefined);
32
+ this.prevContainerSelector = signal(undefined);
33
+ this.containerSelector = input(this.options.containerSelector);
34
+ this.cssAttribute = input(this.options.cssAttribute);
35
+ this.container = computed(() => {
36
+ const selector = this.containerSelector() || this.options.containerSelector;
37
+ return this.document.body.querySelector(selector);
38
+ });
39
+ // swap selector
40
+ effect(() => {
41
+ if (!this.hasResizeObserver || !this.document)
42
+ return;
43
+ const cssAttribute = this.cssAttribute();
44
+ const containerSelector = this.containerSelector();
45
+ if (containerSelector) {
46
+ const prevContainerSelector = this.prevContainerSelector();
47
+ if (prevContainerSelector && prevContainerSelector !== containerSelector) {
48
+ this.removeStyle(this.document.body.querySelector(prevContainerSelector), cssAttribute);
49
+ }
50
+ this.setStyle(this.document.body.querySelector(containerSelector), cssAttribute, this.offsetHeight());
51
+ this.prevContainerSelector.set(containerSelector);
52
+ }
53
+ }, { allowSignalWrites: true });
54
+ // swap css attribute
55
+ effect(() => {
56
+ if (!this.hasResizeObserver || !this.document)
57
+ return;
58
+ const cssAttribute = this.cssAttribute();
59
+ if (cssAttribute) {
60
+ const container = this.container();
61
+ this.removeStyle(container, cssAttribute === 'padding' ? 'margin' : 'padding');
62
+ this.setStyle(container, cssAttribute, this.offsetHeight());
63
+ }
64
+ });
32
65
  }
33
66
  ngOnInit() {
34
67
  if (this.hasResizeObserver && this.document) {
@@ -36,41 +69,17 @@ class NgxFixedFooterDirective {
36
69
  resizeObserver.observe(this.html);
37
70
  }
38
71
  }
39
- ngOnChanges(changes) {
40
- if (this.hasResizeObserver && this.document) {
41
- // swap selector
42
- if (changes?.containerSelector && !changes?.containerSelector?.firstChange) {
43
- const prev = changes?.containerSelector?.previousValue;
44
- const next = changes?.containerSelector?.currentValue;
45
- if (next !== prev) {
46
- this.removeStyle(this.document.body.querySelector(prev), this.cssAttribute);
47
- this.setStyle(this.document.body.querySelector(next), this.cssAttribute, this.offsetHeight);
48
- }
49
- }
50
- // swap css attribute
51
- if (changes?.cssAttribute && !changes?.cssAttribute?.firstChange) {
52
- const prev = changes?.cssAttribute?.previousValue;
53
- const next = changes?.cssAttribute?.currentValue;
54
- if (next !== prev) {
55
- this.removeStyle(this.container, prev);
56
- this.setStyle(this.container, next, this.offsetHeight);
57
- }
58
- }
59
- }
60
- }
61
72
  ngOnDestroy() {
62
- if (this.hasResizeObserver && this.document) {
63
- this.removeStyle(this.container, this.cssAttribute);
64
- if (this.resizeObserver) {
65
- this.resizeObserver.unobserve(this.html);
66
- }
73
+ if (this.resizeObserver() && this.document) {
74
+ this.removeStyle(this.container(), this.cssAttribute());
75
+ this.resizeObserver().unobserve(this.html);
67
76
  }
68
77
  }
69
78
  checkHeight() {
70
79
  const height = this.html.offsetHeight;
71
- if (this.offsetHeight !== height) {
72
- this.setStyle(this.container, this.cssAttribute, height);
73
- this.offsetHeight = height;
80
+ if (this.offsetHeight() !== height) {
81
+ this.setStyle(this.container(), this.cssAttribute(), height);
82
+ this.offsetHeight.set(height);
74
83
  }
75
84
  }
76
85
  removeStyle(container, cssAttribute) {
@@ -85,37 +94,19 @@ class NgxFixedFooterDirective {
85
94
  }
86
95
  this.render.setStyle(container, `${cssAttribute}-bottom`, height === 0 ? '' : `${height}px`);
87
96
  }
88
- get container() {
89
- const selector = this.containerSelector || this.options.containerSelector;
90
- const container = this.document.body.querySelector(selector);
91
- if (!container) {
92
- console.warn(`Container '${selector}' was not found`);
93
- }
94
- return container;
95
- }
96
97
  get html() {
97
98
  return this.el.nativeElement;
98
99
  }
99
- get hasResizeObserver() {
100
- return typeof ResizeObserver !== 'undefined';
101
- }
102
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: NgxFixedFooterDirective, deps: [{ token: DOCUMENT }, { token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive }); }
103
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.1.3", type: NgxFixedFooterDirective, isStandalone: true, selector: "[ngxFixedFooter]", inputs: { containerSelector: "containerSelector", cssAttribute: "cssAttribute" }, usesOnChanges: true, ngImport: i0 }); }
100
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: NgxFixedFooterDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
101
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.8", type: NgxFixedFooterDirective, isStandalone: true, selector: "[ngxFixedFooter]", inputs: { containerSelector: { classPropertyName: "containerSelector", publicName: "containerSelector", isSignal: true, isRequired: false, transformFunction: null }, cssAttribute: { classPropertyName: "cssAttribute", publicName: "cssAttribute", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 }); }
104
102
  }
105
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: NgxFixedFooterDirective, decorators: [{
103
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: NgxFixedFooterDirective, decorators: [{
106
104
  type: Directive,
107
105
  args: [{
108
106
  selector: '[ngxFixedFooter]',
109
107
  standalone: true
110
108
  }]
111
- }], ctorParameters: () => [{ type: undefined, decorators: [{
112
- type: Inject,
113
- args: [DOCUMENT]
114
- }] }, { type: i0.ElementRef }, { type: i0.Renderer2 }], propDecorators: { containerSelector: [{
115
- type: Input
116
- }], cssAttribute: [{
117
- type: Input
118
- }] } });
109
+ }], ctorParameters: () => [] });
119
110
 
120
111
  /*
121
112
  * Public API Surface of ngx-fixed-footer
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-fixed-footer.mjs","sources":["../../../projects/ngx-fixed-footer/src/lib/ngx-fixed-footer.constants.ts","../../../projects/ngx-fixed-footer/src/lib/ngx-fixed-footer.provider.ts","../../../projects/ngx-fixed-footer/src/lib/ngx-fixed-footer.directive.ts","../../../projects/ngx-fixed-footer/src/public-api.ts","../../../projects/ngx-fixed-footer/src/ngx-fixed-footer.ts"],"sourcesContent":["import { NgxFixedFooterOptions } from './ngx-fixed-footer.interface';\n\nexport const DEFAULT_CSS_ATTRIBUTE = 'padding';\nexport const DEFAULT_CONTAINER_SELECTOR = '[role=\"main\"]';\nexport const DEFAULT_FIXED_FOOTER_OPTIONS: NgxFixedFooterOptions = {\n containerSelector: DEFAULT_CONTAINER_SELECTOR,\n cssAttribute: DEFAULT_CSS_ATTRIBUTE\n};\n","import { InjectionToken, Provider } from '@angular/core';\nimport { DEFAULT_CONTAINER_SELECTOR, DEFAULT_CSS_ATTRIBUTE } from './ngx-fixed-footer.constants';\nimport { NgxFixedFooterOptions } from './ngx-fixed-footer.interface';\n\nexport const APP_FIXED_FOOTER_OPTIONS_TOKEN = new InjectionToken<NgxFixedFooterOptions>('[ngxFixedFooter] Options');\n\nexport const provideFixedFooter = (options: NgxFixedFooterOptions): Provider => {\n return {\n provide: APP_FIXED_FOOTER_OPTIONS_TOKEN,\n useValue: {\n cssAttribute: options.cssAttribute || DEFAULT_CSS_ATTRIBUTE,\n containerSelector: options.containerSelector || DEFAULT_CONTAINER_SELECTOR\n }\n };\n};\n","import { DOCUMENT } from '@angular/common';\nimport {\n Directive,\n ElementRef,\n Inject,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n Renderer2,\n SimpleChanges,\n inject\n} from '@angular/core';\nimport { DEFAULT_FIXED_FOOTER_OPTIONS } from './ngx-fixed-footer.constants';\nimport { NgxFixedFooterCssAttribute, NgxFixedFooterOptions } from './ngx-fixed-footer.interface';\nimport { APP_FIXED_FOOTER_OPTIONS_TOKEN } from './ngx-fixed-footer.provider';\n\n@Directive({\n selector: '[ngxFixedFooter]',\n standalone: true\n})\nexport class NgxFixedFooterDirective implements OnDestroy, OnChanges, OnInit {\n private options: NgxFixedFooterOptions =\n inject(APP_FIXED_FOOTER_OPTIONS_TOKEN, { optional: true }) || DEFAULT_FIXED_FOOTER_OPTIONS;\n private offsetHeight: number = undefined;\n private resizeObserver: ResizeObserver;\n\n @Input() public containerSelector: string = this.options.containerSelector;\n @Input() public cssAttribute: NgxFixedFooterCssAttribute = this.options.cssAttribute;\n\n constructor(\n @Inject(DOCUMENT) private document: any,\n private el: ElementRef,\n private render: Renderer2\n ) {}\n\n public ngOnInit(): void {\n if (this.hasResizeObserver && this.document) {\n const resizeObserver = new ResizeObserver(() => this.checkHeight());\n resizeObserver.observe(this.html);\n }\n }\n\n public ngOnChanges(changes: SimpleChanges): void {\n if (this.hasResizeObserver && this.document) {\n // swap selector\n if (changes?.containerSelector && !changes?.containerSelector?.firstChange) {\n const prev = changes?.containerSelector?.previousValue;\n const next = changes?.containerSelector?.currentValue;\n if (next !== prev) {\n this.removeStyle(this.document.body.querySelector(prev), this.cssAttribute);\n this.setStyle(this.document.body.querySelector(next), this.cssAttribute, this.offsetHeight);\n }\n }\n\n // swap css attribute\n if (changes?.cssAttribute && !changes?.cssAttribute?.firstChange) {\n const prev = changes?.cssAttribute?.previousValue;\n const next = changes?.cssAttribute?.currentValue;\n if (next !== prev) {\n this.removeStyle(this.container, prev);\n this.setStyle(this.container, next, this.offsetHeight);\n }\n }\n }\n }\n\n public ngOnDestroy(): void {\n if (this.hasResizeObserver && this.document) {\n this.removeStyle(this.container, this.cssAttribute);\n if (this.resizeObserver) {\n this.resizeObserver.unobserve(this.html);\n }\n }\n }\n\n private checkHeight(): void {\n const height = this.html.offsetHeight;\n if (this.offsetHeight !== height) {\n this.setStyle(this.container, this.cssAttribute, height);\n this.offsetHeight = height;\n }\n }\n\n private removeStyle(container: HTMLElement, cssAttribute: NgxFixedFooterCssAttribute): void {\n if (!container) {\n throw new Error(`Cannot removeStyle to undefined container`);\n }\n this.render.setStyle(container, `${cssAttribute}-bottom`, '');\n }\n\n private setStyle(container: HTMLElement, cssAttribute: NgxFixedFooterCssAttribute, height: number): void {\n if (!container) {\n throw new Error(`Cannot setStyle to undefined container`);\n }\n this.render.setStyle(container, `${cssAttribute}-bottom`, height === 0 ? '' : `${height}px`);\n }\n\n private get container(): HTMLElement {\n const selector = this.containerSelector || this.options.containerSelector;\n const container = this.document.body.querySelector(selector);\n if (!container) {\n console.warn(`Container '${selector}' was not found`);\n }\n return container;\n }\n\n private get html(): HTMLElement {\n return this.el.nativeElement;\n }\n\n private get hasResizeObserver(): boolean {\n return typeof ResizeObserver !== 'undefined';\n }\n}\n","/*\n * Public API Surface of ngx-fixed-footer\n */\n\nexport * from './lib/ngx-fixed-footer.constants';\nexport * from './lib/ngx-fixed-footer.directive';\nexport * from './lib/ngx-fixed-footer.interface';\nexport * from './lib/ngx-fixed-footer.provider';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ngx-fixed-footer.mjs","sources":["../../../projects/ngx-fixed-footer/src/lib/ngx-fixed-footer.constants.ts","../../../projects/ngx-fixed-footer/src/lib/ngx-fixed-footer.provider.ts","../../../projects/ngx-fixed-footer/src/lib/ngx-fixed-footer.directive.ts","../../../projects/ngx-fixed-footer/src/public-api.ts","../../../projects/ngx-fixed-footer/src/ngx-fixed-footer.ts"],"sourcesContent":["import { NgxFixedFooterOptions } from './ngx-fixed-footer.interface';\n\nexport const DEFAULT_CSS_ATTRIBUTE = 'padding';\nexport const DEFAULT_CONTAINER_SELECTOR = '[role=\"main\"]';\nexport const DEFAULT_FIXED_FOOTER_OPTIONS: NgxFixedFooterOptions = {\n containerSelector: DEFAULT_CONTAINER_SELECTOR,\n cssAttribute: DEFAULT_CSS_ATTRIBUTE\n};\n","import { InjectionToken, Provider } from '@angular/core';\nimport { DEFAULT_CONTAINER_SELECTOR, DEFAULT_CSS_ATTRIBUTE } from './ngx-fixed-footer.constants';\nimport { NgxFixedFooterOptions } from './ngx-fixed-footer.interface';\n\nexport const APP_FIXED_FOOTER_OPTIONS_TOKEN = new InjectionToken<NgxFixedFooterOptions>('[ngxFixedFooter] Options');\n\nexport const provideFixedFooter = (options: Partial<NgxFixedFooterOptions>): Provider => {\n return {\n provide: APP_FIXED_FOOTER_OPTIONS_TOKEN,\n useValue: {\n cssAttribute: options.cssAttribute || DEFAULT_CSS_ATTRIBUTE,\n containerSelector: options.containerSelector || DEFAULT_CONTAINER_SELECTOR\n }\n };\n};\n","import { DOCUMENT } from '@angular/common';\nimport {\n Directive,\n ElementRef,\n OnDestroy,\n OnInit,\n Renderer2,\n computed,\n effect,\n inject,\n input,\n signal\n} from '@angular/core';\nimport { DEFAULT_FIXED_FOOTER_OPTIONS } from './ngx-fixed-footer.constants';\nimport { NgxFixedFooterCssAttribute, NgxFixedFooterOptions } from './ngx-fixed-footer.interface';\nimport { APP_FIXED_FOOTER_OPTIONS_TOKEN } from './ngx-fixed-footer.provider';\n\n@Directive({\n selector: '[ngxFixedFooter]',\n standalone: true\n})\nexport class NgxFixedFooterDirective implements OnDestroy, OnInit {\n private readonly document = inject(DOCUMENT);\n private readonly el = inject(ElementRef);\n private readonly render = inject(Renderer2);\n private options: NgxFixedFooterOptions =\n inject(APP_FIXED_FOOTER_OPTIONS_TOKEN, { optional: true }) || DEFAULT_FIXED_FOOTER_OPTIONS;\n private readonly hasResizeObserver = typeof ResizeObserver !== 'undefined';\n\n private offsetHeight = signal<number | undefined>(undefined);\n private resizeObserver = signal<ResizeObserver | undefined>(undefined);\n private prevContainerSelector = signal<string | undefined>(undefined);\n\n public containerSelector = input<string>(this.options.containerSelector);\n public cssAttribute = input<NgxFixedFooterCssAttribute>(this.options.cssAttribute);\n\n private container = computed<HTMLElement>(() => {\n const selector = this.containerSelector() || this.options.containerSelector;\n return this.document.body.querySelector<HTMLElement>(selector);\n });\n\n constructor() {\n // swap selector\n effect(\n () => {\n if (!this.hasResizeObserver || !this.document) return;\n const cssAttribute = this.cssAttribute();\n const containerSelector = this.containerSelector();\n if (containerSelector) {\n const prevContainerSelector = this.prevContainerSelector();\n if (prevContainerSelector && prevContainerSelector !== containerSelector) {\n this.removeStyle(this.document.body.querySelector(prevContainerSelector), cssAttribute);\n }\n this.setStyle(this.document.body.querySelector(containerSelector), cssAttribute, this.offsetHeight());\n this.prevContainerSelector.set(containerSelector);\n }\n },\n { allowSignalWrites: true }\n );\n\n // swap css attribute\n effect(() => {\n if (!this.hasResizeObserver || !this.document) return;\n const cssAttribute = this.cssAttribute();\n if (cssAttribute) {\n const container = this.container();\n this.removeStyle(container, cssAttribute === 'padding' ? 'margin' : 'padding');\n this.setStyle(container, cssAttribute, this.offsetHeight());\n }\n });\n }\n\n public ngOnInit(): void {\n if (this.hasResizeObserver && this.document) {\n const resizeObserver = new ResizeObserver(() => this.checkHeight());\n resizeObserver.observe(this.html);\n }\n }\n\n public ngOnDestroy(): void {\n if (this.resizeObserver() && this.document) {\n this.removeStyle(this.container(), this.cssAttribute());\n this.resizeObserver().unobserve(this.html);\n }\n }\n\n private checkHeight(): void {\n const height = this.html.offsetHeight;\n if (this.offsetHeight() !== height) {\n this.setStyle(this.container(), this.cssAttribute(), height);\n this.offsetHeight.set(height);\n }\n }\n\n private removeStyle(container: HTMLElement, cssAttribute: NgxFixedFooterCssAttribute): void {\n if (!container) {\n throw new Error(`Cannot removeStyle to undefined container`);\n }\n this.render.setStyle(container, `${cssAttribute}-bottom`, '');\n }\n\n private setStyle(container: HTMLElement, cssAttribute: NgxFixedFooterCssAttribute, height: number): void {\n if (!container) {\n throw new Error(`Cannot setStyle to undefined container`);\n }\n this.render.setStyle(container, `${cssAttribute}-bottom`, height === 0 ? '' : `${height}px`);\n }\n\n private get html(): HTMLElement {\n return this.el.nativeElement;\n }\n}\n","/*\n * Public API Surface of ngx-fixed-footer\n */\n\nexport * from './lib/ngx-fixed-footer.constants';\nexport * from './lib/ngx-fixed-footer.directive';\nexport * from './lib/ngx-fixed-footer.interface';\nexport * from './lib/ngx-fixed-footer.provider';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -1,25 +1,25 @@
1
- import { ElementRef, OnChanges, OnDestroy, OnInit, Renderer2, SimpleChanges } from '@angular/core';
1
+ import { OnDestroy, OnInit } from '@angular/core';
2
2
  import { NgxFixedFooterCssAttribute } from './ngx-fixed-footer.interface';
3
3
  import * as i0 from "@angular/core";
4
- export declare class NgxFixedFooterDirective implements OnDestroy, OnChanges, OnInit {
5
- private document;
6
- private el;
7
- private render;
4
+ export declare class NgxFixedFooterDirective implements OnDestroy, OnInit {
5
+ private readonly document;
6
+ private readonly el;
7
+ private readonly render;
8
8
  private options;
9
+ private readonly hasResizeObserver;
9
10
  private offsetHeight;
10
11
  private resizeObserver;
11
- containerSelector: string;
12
- cssAttribute: NgxFixedFooterCssAttribute;
13
- constructor(document: any, el: ElementRef, render: Renderer2);
12
+ private prevContainerSelector;
13
+ containerSelector: import("@angular/core").InputSignal<string>;
14
+ cssAttribute: import("@angular/core").InputSignal<NgxFixedFooterCssAttribute>;
15
+ private container;
16
+ constructor();
14
17
  ngOnInit(): void;
15
- ngOnChanges(changes: SimpleChanges): void;
16
18
  ngOnDestroy(): void;
17
19
  private checkHeight;
18
20
  private removeStyle;
19
21
  private setStyle;
20
- private get container();
21
22
  private get html();
22
- private get hasResizeObserver();
23
23
  static ɵfac: i0.ɵɵFactoryDeclaration<NgxFixedFooterDirective, never>;
24
- static ɵdir: i0.ɵɵDirectiveDeclaration<NgxFixedFooterDirective, "[ngxFixedFooter]", never, { "containerSelector": { "alias": "containerSelector"; "required": false; }; "cssAttribute": { "alias": "cssAttribute"; "required": false; }; }, {}, never, never, true, never>;
24
+ static ɵdir: i0.ɵɵDirectiveDeclaration<NgxFixedFooterDirective, "[ngxFixedFooter]", never, { "containerSelector": { "alias": "containerSelector"; "required": false; "isSignal": true; }; "cssAttribute": { "alias": "cssAttribute"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
25
25
  }
@@ -1,5 +1,5 @@
1
1
  export type NgxFixedFooterCssAttribute = 'padding' | 'margin';
2
2
  export interface NgxFixedFooterOptions {
3
- cssAttribute?: NgxFixedFooterCssAttribute;
4
- containerSelector?: string;
3
+ cssAttribute: NgxFixedFooterCssAttribute;
4
+ containerSelector: string;
5
5
  }
@@ -1,4 +1,4 @@
1
1
  import { InjectionToken, Provider } from '@angular/core';
2
2
  import { NgxFixedFooterOptions } from './ngx-fixed-footer.interface';
3
3
  export declare const APP_FIXED_FOOTER_OPTIONS_TOKEN: InjectionToken<NgxFixedFooterOptions>;
4
- export declare const provideFixedFooter: (options: NgxFixedFooterOptions) => Provider;
4
+ export declare const provideFixedFooter: (options: Partial<NgxFixedFooterOptions>) => Provider;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ngx-fixed-footer",
3
- "version": "2.0.1",
3
+ "version": "3.0.1",
4
4
  "author": {
5
5
  "name": "Dominik Hladík",
6
6
  "email": "dominik.hladik@seznam.cz",
@@ -10,8 +10,8 @@
10
10
  "license": "MIT",
11
11
  "description": "Angular directive that adds fixed footer without overlap",
12
12
  "peerDependencies": {
13
- "@angular/common": ">=12",
14
- "@angular/core": ">=12"
13
+ "@angular/common": ">=18",
14
+ "@angular/core": ">=18"
15
15
  },
16
16
  "publishConfig": {
17
17
  "registry": "https://registry.npmjs.org"
@@ -32,7 +32,7 @@
32
32
  "overlap"
33
33
  ],
34
34
  "engines": {
35
- "node": ">=12"
35
+ "node": ">=18"
36
36
  },
37
37
  "module": "fesm2022/ngx-fixed-footer.mjs",
38
38
  "typings": "index.d.ts",