ngx-fixed-footer 2.0.0 → 3.0.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.
- package/README.md +16 -15
- package/esm2022/lib/ngx-fixed-footer.directive.mjs +52 -61
- package/esm2022/lib/ngx-fixed-footer.interface.mjs +1 -1
- package/esm2022/lib/ngx-fixed-footer.provider.mjs +1 -1
- package/fesm2022/ngx-fixed-footer.mjs +51 -60
- package/fesm2022/ngx-fixed-footer.mjs.map +1 -1
- package/lib/ngx-fixed-footer.directive.d.ts +12 -12
- package/lib/ngx-fixed-footer.interface.d.ts +2 -2
- package/lib/ngx-fixed-footer.provider.d.ts +1 -1
- package/package.json +4 -4
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
|
+
> ✓ _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
|
-
##
|
|
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,13 +126,22 @@ _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
|
-
##
|
|
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
|
-
Copyright © 2021 -
|
|
144
|
+
Copyright © 2021 - 2024 [Dominik Hladik](https://github.com/Celtian)
|
|
144
145
|
|
|
145
146
|
All contents are licensed under the [MIT license].
|
|
146
147
|
|
|
@@ -1,17 +1,50 @@
|
|
|
1
1
|
import { DOCUMENT } from '@angular/common';
|
|
2
|
-
import { Directive,
|
|
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(
|
|
8
|
-
this.document =
|
|
9
|
-
this.el =
|
|
10
|
-
this.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.
|
|
13
|
-
this.
|
|
14
|
-
this.
|
|
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.
|
|
46
|
-
this.removeStyle(this.container, this.cssAttribute);
|
|
47
|
-
|
|
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
|
|
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
|
-
|
|
83
|
-
|
|
84
|
-
}
|
|
85
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.8", 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.0.8", 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.0.1", ngImport: i0, type: NgxFixedFooterDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
84
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.0.1", 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: "
|
|
86
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: NgxFixedFooterDirective, decorators: [{
|
|
89
87
|
type: Directive,
|
|
90
88
|
args: [{
|
|
91
89
|
selector: '[ngxFixedFooter]',
|
|
92
90
|
standalone: true
|
|
93
91
|
}]
|
|
94
|
-
}], ctorParameters: () => [
|
|
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWZpeGVkLWZvb3Rlci5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZml4ZWQtZm9vdGVyL3NyYy9saWIvbmd4LWZpeGVkLWZvb3Rlci5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFDTCxTQUFTLEVBRVQsTUFBTSxFQUNOLEtBQUssRUFNTCxNQUFNLEVBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFNUUsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7O0FBTTdFLE1BQU0sT0FBTyx1QkFBdUI7SUFTbEMsWUFDNEIsUUFBYSxFQUMvQixFQUFjLEVBQ2QsTUFBaUI7UUFGQyxhQUFRLEdBQVIsUUFBUSxDQUFLO1FBQy9CLE9BQUUsR0FBRixFQUFFLENBQVk7UUFDZCxXQUFNLEdBQU4sTUFBTSxDQUFXO1FBWG5CLFlBQU8sR0FDYixNQUFNLENBQUMsOEJBQThCLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsSUFBSSw0QkFBNEIsQ0FBQztRQUNyRixpQkFBWSxHQUFXLFNBQVMsQ0FBQztRQUd6QixzQkFBaUIsR0FBVyxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDO1FBQzNELGlCQUFZLEdBQStCLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDO0lBTWxGLENBQUM7SUFFRyxRQUFRO1FBQ2IsSUFBSSxJQUFJLENBQUMsaUJBQWlCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUMzQyxNQUFNLGNBQWMsR0FBRyxJQUFJLGNBQWMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztZQUNwRSxjQUFjLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNuQztJQUNILENBQUM7SUFFTSxXQUFXLENBQUMsT0FBc0I7UUFDdkMsSUFBSSxJQUFJLENBQUMsaUJBQWlCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUMzQyxnQkFBZ0I7WUFDaEIsSUFBSSxPQUFPLEVBQUUsaUJBQWlCLElBQUksQ0FBQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsV0FBVyxFQUFFO2dCQUMxRSxNQUFNLElBQUksR0FBRyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsYUFBYSxDQUFDO2dCQUN2RCxNQUFNLElBQUksR0FBRyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsWUFBWSxDQUFDO2dCQUN0RCxJQUFJLElBQUksS0FBSyxJQUFJLEVBQUU7b0JBQ2pCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztvQkFDNUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7aUJBQzdGO2FBQ0Y7WUFFRCxxQkFBcUI7WUFDckIsSUFBSSxPQUFPLEVBQUUsWUFBWSxJQUFJLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUU7Z0JBQ2hFLE1BQU0sSUFBSSxHQUFHLE9BQU8sRUFBRSxZQUFZLEVBQUUsYUFBYSxDQUFDO2dCQUNsRCxNQUFNLElBQUksR0FBRyxPQUFPLEVBQUUsWUFBWSxFQUFFLFlBQVksQ0FBQztnQkFDakQsSUFBSSxJQUFJLEtBQUssSUFBSSxFQUFFO29CQUNqQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7b0JBQ3ZDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO2lCQUN4RDthQUNGO1NBQ0Y7SUFDSCxDQUFDO0lBRU0sV0FBVztRQUNoQixJQUFJLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQzNDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDcEQsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO2dCQUN2QixJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDMUM7U0FDRjtJQUNILENBQUM7SUFFTyxXQUFXO1FBQ2pCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQ3RDLElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyxNQUFNLEVBQUU7WUFDaEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDekQsSUFBSSxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUM7U0FDNUI7SUFDSCxDQUFDO0lBRU8sV0FBVyxDQUFDLFNBQXNCLEVBQUUsWUFBd0M7UUFDbEYsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNkLE1BQU0sSUFBSSxLQUFLLENBQUMsMkNBQTJDLENBQUMsQ0FBQztTQUM5RDtRQUNELElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxHQUFHLFlBQVksU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFTyxRQUFRLENBQUMsU0FBc0IsRUFBRSxZQUF3QyxFQUFFLE1BQWM7UUFDL0YsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNkLE1BQU0sSUFBSSxLQUFLLENBQUMsd0NBQXdDLENBQUMsQ0FBQztTQUMzRDtRQUNELElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxHQUFHLFlBQVksU0FBUyxFQUFFLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLElBQUksQ0FBQyxDQUFDO0lBQy9GLENBQUM7SUFFRCxJQUFZLFNBQVM7UUFDbkIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUM7UUFDMUUsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzdELElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDZCxPQUFPLENBQUMsSUFBSSxDQUFDLGNBQWMsUUFBUSxpQkFBaUIsQ0FBQyxDQUFDO1NBQ3ZEO1FBQ0QsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVELElBQVksSUFBSTtRQUNkLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUM7SUFDL0IsQ0FBQztJQUVELElBQVksaUJBQWlCO1FBQzNCLE9BQU8sT0FBTyxjQUFjLEtBQUssV0FBVyxDQUFDO0lBQy9DLENBQUM7OEdBNUZVLHVCQUF1QixrQkFVeEIsUUFBUTtrR0FWUCx1QkFBdUI7OzJGQUF2Qix1QkFBdUI7a0JBSm5DLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGtCQUFrQjtvQkFDNUIsVUFBVSxFQUFFLElBQUk7aUJBQ2pCOzswQkFXSSxNQUFNOzJCQUFDLFFBQVE7MEZBSkYsaUJBQWlCO3NCQUFoQyxLQUFLO2dCQUNVLFlBQVk7c0JBQTNCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIFJlbmRlcmVyMixcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgaW5qZWN0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgREVGQVVMVF9GSVhFRF9GT09URVJfT1BUSU9OUyB9IGZyb20gJy4vbmd4LWZpeGVkLWZvb3Rlci5jb25zdGFudHMnO1xuaW1wb3J0IHsgTmd4Rml4ZWRGb290ZXJDc3NBdHRyaWJ1dGUsIE5neEZpeGVkRm9vdGVyT3B0aW9ucyB9IGZyb20gJy4vbmd4LWZpeGVkLWZvb3Rlci5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQVBQX0ZJWEVEX0ZPT1RFUl9PUFRJT05TX1RPS0VOIH0gZnJvbSAnLi9uZ3gtZml4ZWQtZm9vdGVyLnByb3ZpZGVyJztcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW25neEZpeGVkRm9vdGVyXScsXG4gIHN0YW5kYWxvbmU6IHRydWVcbn0pXG5leHBvcnQgY2xhc3MgTmd4Rml4ZWRGb290ZXJEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkRlc3Ryb3ksIE9uQ2hhbmdlcywgT25Jbml0IHtcbiAgcHJpdmF0ZSBvcHRpb25zOiBOZ3hGaXhlZEZvb3Rlck9wdGlvbnMgPVxuICAgIGluamVjdChBUFBfRklYRURfRk9PVEVSX09QVElPTlNfVE9LRU4sIHsgb3B0aW9uYWw6IHRydWUgfSkgfHwgREVGQVVMVF9GSVhFRF9GT09URVJfT1BUSU9OUztcbiAgcHJpdmF0ZSBvZmZzZXRIZWlnaHQ6IG51bWJlciA9IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSByZXNpemVPYnNlcnZlcjogUmVzaXplT2JzZXJ2ZXI7XG5cbiAgQElucHV0KCkgcHVibGljIGNvbnRhaW5lclNlbGVjdG9yOiBzdHJpbmcgPSB0aGlzLm9wdGlvbnMuY29udGFpbmVyU2VsZWN0b3I7XG4gIEBJbnB1dCgpIHB1YmxpYyBjc3NBdHRyaWJ1dGU6IE5neEZpeGVkRm9vdGVyQ3NzQXR0cmlidXRlID0gdGhpcy5vcHRpb25zLmNzc0F0dHJpYnV0ZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIGRvY3VtZW50OiBhbnksXG4gICAgcHJpdmF0ZSBlbDogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIHJlbmRlcjogUmVuZGVyZXIyXG4gICkge31cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaGFzUmVzaXplT2JzZXJ2ZXIgJiYgdGhpcy5kb2N1bWVudCkge1xuICAgICAgY29uc3QgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4gdGhpcy5jaGVja0hlaWdodCgpKTtcbiAgICAgIHJlc2l6ZU9ic2VydmVyLm9ic2VydmUodGhpcy5odG1sKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmICh0aGlzLmhhc1Jlc2l6ZU9ic2VydmVyICYmIHRoaXMuZG9jdW1lbnQpIHtcbiAgICAgIC8vIHN3YXAgc2VsZWN0b3JcbiAgICAgIGlmIChjaGFuZ2VzPy5jb250YWluZXJTZWxlY3RvciAmJiAhY2hhbmdlcz8uY29udGFpbmVyU2VsZWN0b3I/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,
|
|
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,
|
|
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,
|
|
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(
|
|
25
|
-
this.document =
|
|
26
|
-
this.el =
|
|
27
|
-
this.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.
|
|
30
|
-
this.
|
|
31
|
-
this.
|
|
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.
|
|
63
|
-
this.removeStyle(this.container, this.cssAttribute);
|
|
64
|
-
|
|
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
|
|
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
|
-
|
|
100
|
-
|
|
101
|
-
}
|
|
102
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.8", 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.0.8", 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.0.1", ngImport: i0, type: NgxFixedFooterDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
101
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.0.1", 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: "
|
|
103
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: NgxFixedFooterDirective, decorators: [{
|
|
106
104
|
type: Directive,
|
|
107
105
|
args: [{
|
|
108
106
|
selector: '[ngxFixedFooter]',
|
|
109
107
|
standalone: true
|
|
110
108
|
}]
|
|
111
|
-
}], ctorParameters: () => [
|
|
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 {
|
|
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,
|
|
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
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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,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": "
|
|
3
|
+
"version": "3.0.0",
|
|
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": ">=
|
|
14
|
-
"@angular/core": ">=
|
|
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": ">=
|
|
35
|
+
"node": ">=18"
|
|
36
36
|
},
|
|
37
37
|
"module": "fesm2022/ngx-fixed-footer.mjs",
|
|
38
38
|
"typings": "index.d.ts",
|