@apexara/ng-components 1.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 +1867 -0
- package/fesm2022/apexara-ng-components-button.mjs +66 -0
- package/fesm2022/apexara-ng-components-button.mjs.map +1 -0
- package/fesm2022/apexara-ng-components-carousel.mjs +161 -0
- package/fesm2022/apexara-ng-components-carousel.mjs.map +1 -0
- package/fesm2022/apexara-ng-components-checkbox.mjs +64 -0
- package/fesm2022/apexara-ng-components-checkbox.mjs.map +1 -0
- package/fesm2022/apexara-ng-components-chip.mjs +26 -0
- package/fesm2022/apexara-ng-components-chip.mjs.map +1 -0
- package/fesm2022/apexara-ng-components-datepicker.mjs +2175 -0
- package/fesm2022/apexara-ng-components-datepicker.mjs.map +1 -0
- package/fesm2022/apexara-ng-components-dialog.mjs +65 -0
- package/fesm2022/apexara-ng-components-dialog.mjs.map +1 -0
- package/fesm2022/apexara-ng-components-drawer.mjs +69 -0
- package/fesm2022/apexara-ng-components-drawer.mjs.map +1 -0
- package/fesm2022/apexara-ng-components-expander.mjs +41 -0
- package/fesm2022/apexara-ng-components-expander.mjs.map +1 -0
- package/fesm2022/apexara-ng-components-image.mjs +201 -0
- package/fesm2022/apexara-ng-components-image.mjs.map +1 -0
- package/fesm2022/apexara-ng-components-input.mjs +129 -0
- package/fesm2022/apexara-ng-components-input.mjs.map +1 -0
- package/fesm2022/apexara-ng-components-listbox.mjs +308 -0
- package/fesm2022/apexara-ng-components-listbox.mjs.map +1 -0
- package/fesm2022/apexara-ng-components-radiobutton.mjs +40 -0
- package/fesm2022/apexara-ng-components-radiobutton.mjs.map +1 -0
- package/fesm2022/apexara-ng-components-select.mjs +620 -0
- package/fesm2022/apexara-ng-components-select.mjs.map +1 -0
- package/fesm2022/apexara-ng-components-services.mjs +290 -0
- package/fesm2022/apexara-ng-components-services.mjs.map +1 -0
- package/fesm2022/apexara-ng-components-snackbar.mjs +279 -0
- package/fesm2022/apexara-ng-components-snackbar.mjs.map +1 -0
- package/fesm2022/apexara-ng-components-table.mjs +686 -0
- package/fesm2022/apexara-ng-components-table.mjs.map +1 -0
- package/fesm2022/apexara-ng-components-textarea.mjs +82 -0
- package/fesm2022/apexara-ng-components-textarea.mjs.map +1 -0
- package/fesm2022/apexara-ng-components-tooltip.mjs +319 -0
- package/fesm2022/apexara-ng-components-tooltip.mjs.map +1 -0
- package/fesm2022/apexara-ng-components.mjs +8 -0
- package/fesm2022/apexara-ng-components.mjs.map +1 -0
- package/package.json +146 -0
- package/types/apexara-ng-components-button.d.ts +27 -0
- package/types/apexara-ng-components-carousel.d.ts +31 -0
- package/types/apexara-ng-components-checkbox.d.ts +29 -0
- package/types/apexara-ng-components-chip.d.ts +11 -0
- package/types/apexara-ng-components-datepicker.d.ts +172 -0
- package/types/apexara-ng-components-dialog.d.ts +24 -0
- package/types/apexara-ng-components-drawer.d.ts +22 -0
- package/types/apexara-ng-components-expander.d.ts +10 -0
- package/types/apexara-ng-components-image.d.ts +46 -0
- package/types/apexara-ng-components-input.d.ts +51 -0
- package/types/apexara-ng-components-listbox.d.ts +70 -0
- package/types/apexara-ng-components-radiobutton.d.ts +30 -0
- package/types/apexara-ng-components-select.d.ts +111 -0
- package/types/apexara-ng-components-services.d.ts +96 -0
- package/types/apexara-ng-components-snackbar.d.ts +73 -0
- package/types/apexara-ng-components-table.d.ts +157 -0
- package/types/apexara-ng-components-textarea.d.ts +34 -0
- package/types/apexara-ng-components-tooltip.d.ts +54 -0
- package/types/apexara-ng-components.d.ts +3 -0
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
import { trigger, state, style, transition, animate } from '@angular/animations';
|
|
2
|
+
import { NgClass } from '@angular/common';
|
|
3
|
+
import * as i0 from '@angular/core';
|
|
4
|
+
import { EventEmitter, Output, Input, ViewChild, Component, createComponent, Injectable } from '@angular/core';
|
|
5
|
+
import { IpiImageComponent } from '@apexara/ng-components/image';
|
|
6
|
+
import * as i1 from '@apexara/ng-components/services';
|
|
7
|
+
|
|
8
|
+
var VerticalPosition;
|
|
9
|
+
(function (VerticalPosition) {
|
|
10
|
+
VerticalPosition[VerticalPosition["Bottom"] = 0] = "Bottom";
|
|
11
|
+
VerticalPosition[VerticalPosition["Top"] = 1] = "Top";
|
|
12
|
+
})(VerticalPosition || (VerticalPosition = {}));
|
|
13
|
+
var HorizontalPosition;
|
|
14
|
+
(function (HorizontalPosition) {
|
|
15
|
+
HorizontalPosition[HorizontalPosition["Left"] = 0] = "Left";
|
|
16
|
+
HorizontalPosition[HorizontalPosition["Center"] = 1] = "Center";
|
|
17
|
+
HorizontalPosition[HorizontalPosition["Right"] = 2] = "Right";
|
|
18
|
+
})(HorizontalPosition || (HorizontalPosition = {}));
|
|
19
|
+
class IpiSnackbarComponent {
|
|
20
|
+
constructor() {
|
|
21
|
+
this.closing = false;
|
|
22
|
+
this.closed = new EventEmitter();
|
|
23
|
+
}
|
|
24
|
+
ngAfterViewInit() {
|
|
25
|
+
if (!this.container) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
this.container.nativeElement.style.height = this.container.nativeElement.scrollHeight + 'px';
|
|
29
|
+
}
|
|
30
|
+
getAnimationParams() {
|
|
31
|
+
return { duration: this.options?.animationDuration ? this.options.animationDuration / 3 : 1 };
|
|
32
|
+
}
|
|
33
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: IpiSnackbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
34
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.2", type: IpiSnackbarComponent, isStandalone: true, selector: "ipi-snackbar", inputs: { message: "message", options: "options", positionOptions: "positionOptions", closing: "closing" }, outputs: { closed: "closed" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true }], ngImport: i0, template: "<div\n #container\n class=\"custom-snackbar\"\n [class.error]=\"options.error\"\n [style.ipi-snackbar-animation-duration]=\"options.animationDuration + 's'\"\n [@snackbarState]=\"{ value: closing ? 'closing' : 'open', params: getAnimationParams() }\">\n\n <div class=\"placeholder-wrapper\">\n @if (options.icon) {\n <ipi-img [src]=\"'assets/img/' + options.icon\" [ariaLabel]=\"'Snackbar prefix icon'\"></ipi-img>\n }\n\n <div class=\"placeholder\">{{ options.title ?? (options.error ? 'Error' : 'Success') }}</div>\n\n <div class=\"x-icon\" (click)=\"closed.emit()\"></div>\n </div>\n\n <div class=\"message-wrapper\" [ngClass]=\"{ 'no-padding' : !options.icon }\">\n <div class=\"message\">{{ message }}</div>\n </div>\n\n @if (options.shouldClose) {\n <div class=\"progress\" [style.animation-duration]=\"(options.duration + 2 * options.animationDuration) + 's'\"></div>\n }\n</div>\n", styles: [":host{--ipi-snackbar-animation-duration: 10s;--ipi-snackbar-background-color: #14BD6C;--ipi-snackbar-placeholder-text-color: #FFFFFF;--ipi-snackbar-message-text-color: #FFFFFF;--ipi-snackbar-error-background-color: #F96138;--ipi-snackbar-progress-color: #FFFFFF;--ipi-snackbar-x-icon-color: #FFFFFF;pointer-events:all;touch-action:manipulation}.placeholder-wrapper{height:24px;display:flex;align-items:center;align-self:stretch;gap:4px}.custom-snackbar{width:360px;height:fit-content;display:flex;position:relative;flex-direction:column;justify-content:center;align-items:flex-start;border-radius:4px;overflow:hidden;box-sizing:border-box;opacity:0;background:var(--ipi-snackbar-background-color);padding:12px 16px 16px;margin-bottom:6px}ipi-img{width:20px;height:20px}.placeholder{flex:1 0 0;color:var(--ipi-snackbar-placeholder-text-color);font-size:18px;font-style:normal;font-weight:600;line-height:22px}.message-wrapper{display:flex;align-items:flex-start;align-self:stretch;gap:10px;padding-left:24px}.message-wrapper.no-padding{padding:0}.message{flex:1 0 0;color:var(--ipi-snackbar-message-text-color);font-size:16px;font-style:normal;font-weight:400;line-height:20px}.error{background-color:var(--ipi-snackbar-error-background-color)}.vertical-1{top:.5em}.vertical-0{bottom:.5em}.horizontal-0{animation:LeftPopUp var(--ipi-snackbar-animation-duration) ease-in-out forwards}.horizontal-1{animation:CenterPopUp var(--ipi-snackbar-animation-duration) ease-in-out forwards}.horizontal-2{animation:RightPopUp var(--ipi-snackbar-animation-duration) ease-in-out forwards}.progress{max-width:392px;height:4px;position:absolute;bottom:0;opacity:.5;background:var(--ipi-snackbar-progress-color);transform:translate(-16px);animation:shrinkProgress var(--ipi-snackbar-animation-duration) ease-in-out}.x-icon{width:20px;cursor:pointer;transition:transform .3s ease;opacity:.7;padding-top:8px}.x-icon:after{font-size:36px;color:var(--ipi-snackbar-x-icon-color);content:\"\\d7\"}.x-icon:hover{animation:rotate .3s linear}@media(max-width:460px){.custom-snackbar{width:300px}}@keyframes rotate{0%{transform:rotate(0)}25%{transform:rotate(-10deg)}75%{transform:rotate(10deg)}to{transform:rotate(0)}}@keyframes shrinkProgress{0%{width:100%}to{width:0%}}@keyframes LeftPopUp{0%{left:-2em;opacity:0}to{left:.5em;opacity:1}}@keyframes CenterPopUp{0%{opacity:0}to{opacity:1}}@keyframes RightPopUp{0%{right:-2em;opacity:0}to{right:.5em;opacity:1}}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: IpiImageComponent, selector: "ipi-img", inputs: ["src", "ariaLabel"] }], animations: [
|
|
35
|
+
trigger('snackbarState', [
|
|
36
|
+
state('open', style({
|
|
37
|
+
opacity: 1,
|
|
38
|
+
transform: 'translateX(0)',
|
|
39
|
+
maxHeight: '*'
|
|
40
|
+
})),
|
|
41
|
+
state('closing', style({
|
|
42
|
+
opacity: 0,
|
|
43
|
+
transform: 'translateX(50px)',
|
|
44
|
+
height: '0px',
|
|
45
|
+
margin: 0,
|
|
46
|
+
padding: 0,
|
|
47
|
+
})),
|
|
48
|
+
transition('open => closing', [
|
|
49
|
+
animate('{{duration}}s ease-in', style({ opacity: 0, transform: 'translateX(50px)' })),
|
|
50
|
+
animate('{{duration}}s ease-in', style({ height: '0px', margin: 0, padding: 0 })),
|
|
51
|
+
]),
|
|
52
|
+
]),
|
|
53
|
+
] }); }
|
|
54
|
+
}
|
|
55
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: IpiSnackbarComponent, decorators: [{
|
|
56
|
+
type: Component,
|
|
57
|
+
args: [{ selector: 'ipi-snackbar', imports: [
|
|
58
|
+
NgClass,
|
|
59
|
+
IpiImageComponent,
|
|
60
|
+
], animations: [
|
|
61
|
+
trigger('snackbarState', [
|
|
62
|
+
state('open', style({
|
|
63
|
+
opacity: 1,
|
|
64
|
+
transform: 'translateX(0)',
|
|
65
|
+
maxHeight: '*'
|
|
66
|
+
})),
|
|
67
|
+
state('closing', style({
|
|
68
|
+
opacity: 0,
|
|
69
|
+
transform: 'translateX(50px)',
|
|
70
|
+
height: '0px',
|
|
71
|
+
margin: 0,
|
|
72
|
+
padding: 0,
|
|
73
|
+
})),
|
|
74
|
+
transition('open => closing', [
|
|
75
|
+
animate('{{duration}}s ease-in', style({ opacity: 0, transform: 'translateX(50px)' })),
|
|
76
|
+
animate('{{duration}}s ease-in', style({ height: '0px', margin: 0, padding: 0 })),
|
|
77
|
+
]),
|
|
78
|
+
]),
|
|
79
|
+
], template: "<div\n #container\n class=\"custom-snackbar\"\n [class.error]=\"options.error\"\n [style.ipi-snackbar-animation-duration]=\"options.animationDuration + 's'\"\n [@snackbarState]=\"{ value: closing ? 'closing' : 'open', params: getAnimationParams() }\">\n\n <div class=\"placeholder-wrapper\">\n @if (options.icon) {\n <ipi-img [src]=\"'assets/img/' + options.icon\" [ariaLabel]=\"'Snackbar prefix icon'\"></ipi-img>\n }\n\n <div class=\"placeholder\">{{ options.title ?? (options.error ? 'Error' : 'Success') }}</div>\n\n <div class=\"x-icon\" (click)=\"closed.emit()\"></div>\n </div>\n\n <div class=\"message-wrapper\" [ngClass]=\"{ 'no-padding' : !options.icon }\">\n <div class=\"message\">{{ message }}</div>\n </div>\n\n @if (options.shouldClose) {\n <div class=\"progress\" [style.animation-duration]=\"(options.duration + 2 * options.animationDuration) + 's'\"></div>\n }\n</div>\n", styles: [":host{--ipi-snackbar-animation-duration: 10s;--ipi-snackbar-background-color: #14BD6C;--ipi-snackbar-placeholder-text-color: #FFFFFF;--ipi-snackbar-message-text-color: #FFFFFF;--ipi-snackbar-error-background-color: #F96138;--ipi-snackbar-progress-color: #FFFFFF;--ipi-snackbar-x-icon-color: #FFFFFF;pointer-events:all;touch-action:manipulation}.placeholder-wrapper{height:24px;display:flex;align-items:center;align-self:stretch;gap:4px}.custom-snackbar{width:360px;height:fit-content;display:flex;position:relative;flex-direction:column;justify-content:center;align-items:flex-start;border-radius:4px;overflow:hidden;box-sizing:border-box;opacity:0;background:var(--ipi-snackbar-background-color);padding:12px 16px 16px;margin-bottom:6px}ipi-img{width:20px;height:20px}.placeholder{flex:1 0 0;color:var(--ipi-snackbar-placeholder-text-color);font-size:18px;font-style:normal;font-weight:600;line-height:22px}.message-wrapper{display:flex;align-items:flex-start;align-self:stretch;gap:10px;padding-left:24px}.message-wrapper.no-padding{padding:0}.message{flex:1 0 0;color:var(--ipi-snackbar-message-text-color);font-size:16px;font-style:normal;font-weight:400;line-height:20px}.error{background-color:var(--ipi-snackbar-error-background-color)}.vertical-1{top:.5em}.vertical-0{bottom:.5em}.horizontal-0{animation:LeftPopUp var(--ipi-snackbar-animation-duration) ease-in-out forwards}.horizontal-1{animation:CenterPopUp var(--ipi-snackbar-animation-duration) ease-in-out forwards}.horizontal-2{animation:RightPopUp var(--ipi-snackbar-animation-duration) ease-in-out forwards}.progress{max-width:392px;height:4px;position:absolute;bottom:0;opacity:.5;background:var(--ipi-snackbar-progress-color);transform:translate(-16px);animation:shrinkProgress var(--ipi-snackbar-animation-duration) ease-in-out}.x-icon{width:20px;cursor:pointer;transition:transform .3s ease;opacity:.7;padding-top:8px}.x-icon:after{font-size:36px;color:var(--ipi-snackbar-x-icon-color);content:\"\\d7\"}.x-icon:hover{animation:rotate .3s linear}@media(max-width:460px){.custom-snackbar{width:300px}}@keyframes rotate{0%{transform:rotate(0)}25%{transform:rotate(-10deg)}75%{transform:rotate(10deg)}to{transform:rotate(0)}}@keyframes shrinkProgress{0%{width:100%}to{width:0%}}@keyframes LeftPopUp{0%{left:-2em;opacity:0}to{left:.5em;opacity:1}}@keyframes CenterPopUp{0%{opacity:0}to{opacity:1}}@keyframes RightPopUp{0%{right:-2em;opacity:0}to{right:.5em;opacity:1}}\n"] }]
|
|
80
|
+
}], propDecorators: { container: [{
|
|
81
|
+
type: ViewChild,
|
|
82
|
+
args: ['container']
|
|
83
|
+
}], message: [{
|
|
84
|
+
type: Input
|
|
85
|
+
}], options: [{
|
|
86
|
+
type: Input
|
|
87
|
+
}], positionOptions: [{
|
|
88
|
+
type: Input
|
|
89
|
+
}], closing: [{
|
|
90
|
+
type: Input
|
|
91
|
+
}], closed: [{
|
|
92
|
+
type: Output
|
|
93
|
+
}] } });
|
|
94
|
+
|
|
95
|
+
class IpiSnackbarService {
|
|
96
|
+
constructor(appRef, overlayService) {
|
|
97
|
+
this.appRef = appRef;
|
|
98
|
+
this.overlayService = overlayService;
|
|
99
|
+
this.maxSnackbars = 5;
|
|
100
|
+
this.snackbarContainerMap = {};
|
|
101
|
+
this.defaultSnackbarOptions = {
|
|
102
|
+
error: false,
|
|
103
|
+
shouldClose: true,
|
|
104
|
+
duration: 5,
|
|
105
|
+
animationDuration: 1,
|
|
106
|
+
position: {
|
|
107
|
+
verticalPosition: VerticalPosition.Bottom,
|
|
108
|
+
horizontalPosition: HorizontalPosition.Center,
|
|
109
|
+
},
|
|
110
|
+
backgroundColor: '#14BD6C',
|
|
111
|
+
errorBackgroundColor: '#F96138',
|
|
112
|
+
progressColor: '#FFFFFF',
|
|
113
|
+
placeholderTextColor: '#FFFFFF',
|
|
114
|
+
messageTextColor: '#FFFFFF',
|
|
115
|
+
xIconColor: '#FFFFFF',
|
|
116
|
+
};
|
|
117
|
+
this.snackbarsArray = [];
|
|
118
|
+
}
|
|
119
|
+
open(message, options, component, data) {
|
|
120
|
+
const snackbarOptions = {
|
|
121
|
+
...this.defaultSnackbarOptions,
|
|
122
|
+
...options,
|
|
123
|
+
};
|
|
124
|
+
const snackbarContainerRef = this.createSnackbarContainer(snackbarOptions.position);
|
|
125
|
+
const snackbarRef = this.createComponent(component ? component : IpiSnackbarComponent, snackbarOptions, snackbarContainerRef, component ? data : undefined);
|
|
126
|
+
if (!snackbarRef) {
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
if (message && !component) {
|
|
130
|
+
snackbarRef.instance.message = message;
|
|
131
|
+
}
|
|
132
|
+
this.closeIfMaxSnackbar();
|
|
133
|
+
this.snackbarsArray.push({
|
|
134
|
+
containerId: this.generateSnackbarContainerId(snackbarOptions.position),
|
|
135
|
+
ref: snackbarRef,
|
|
136
|
+
options: snackbarOptions,
|
|
137
|
+
});
|
|
138
|
+
this.subscribeToClosingEvents(snackbarRef);
|
|
139
|
+
}
|
|
140
|
+
setMaxSnackbars(length) {
|
|
141
|
+
this.maxSnackbars = length;
|
|
142
|
+
}
|
|
143
|
+
updateDefaultOptions(options) {
|
|
144
|
+
this.defaultSnackbarOptions = { ...this.defaultSnackbarOptions, ...options };
|
|
145
|
+
}
|
|
146
|
+
createSnackbarContainer(position) {
|
|
147
|
+
const id = this.generateSnackbarContainerId(position);
|
|
148
|
+
if (this.snackbarContainerMap[id]) {
|
|
149
|
+
return this.snackbarContainerMap[id];
|
|
150
|
+
}
|
|
151
|
+
this.snackbarContainerMap[id] = document.createElement('div');
|
|
152
|
+
this.applySnackbarContainerStyles(this.snackbarContainerMap[id], position);
|
|
153
|
+
this.overlayService.appendToOverlay(this.snackbarContainerMap[id], false);
|
|
154
|
+
return this.snackbarContainerMap[id];
|
|
155
|
+
}
|
|
156
|
+
createComponent(component, options, container, data) {
|
|
157
|
+
const componentRef = createComponent(component, { environmentInjector: this.appRef.injector });
|
|
158
|
+
if (!componentRef.instance) {
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
componentRef.instance.data = data;
|
|
162
|
+
componentRef.instance.options = options;
|
|
163
|
+
this.appRef.attachView(componentRef.hostView);
|
|
164
|
+
const snackbarElement = componentRef.hostView.rootNodes[0];
|
|
165
|
+
this.applySnackbarStyles(snackbarElement, options);
|
|
166
|
+
container.appendChild(snackbarElement);
|
|
167
|
+
if (options.shouldClose) {
|
|
168
|
+
setTimeout(() => {
|
|
169
|
+
const closeIndex = this.findSnackbarElementIndexFromRef(componentRef);
|
|
170
|
+
if (closeIndex === undefined) {
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
this.close(closeIndex);
|
|
174
|
+
}, (2 * options.animationDuration + options.duration) * 1000);
|
|
175
|
+
}
|
|
176
|
+
return componentRef;
|
|
177
|
+
}
|
|
178
|
+
applySnackbarStyles(snackbarElement, options) {
|
|
179
|
+
const styles = {
|
|
180
|
+
'--ipi-snackbar-background-color': options.backgroundColor,
|
|
181
|
+
'--ipi-snackbar-placeholder-text-color': options.placeholderTextColor,
|
|
182
|
+
'--ipi-snackbar-message-text-color': options.messageTextColor,
|
|
183
|
+
'--ipi-snackbar-progress-color': options.progressColor,
|
|
184
|
+
'--ipi-snackbar-x-icon-color': options.xIconColor,
|
|
185
|
+
'--ipi-snackbar-animation-duration': options.animationDuration ? `${options.animationDuration}s` : undefined
|
|
186
|
+
};
|
|
187
|
+
for (const [cssVar, value] of Object.entries(styles)) {
|
|
188
|
+
if (value) {
|
|
189
|
+
snackbarElement.style.setProperty(cssVar, value);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
const position = options.position ? options.position : this.defaultSnackbarOptions.position;
|
|
193
|
+
snackbarElement.querySelector('div:first-child').classList.add(`horizontal-${position.horizontalPosition}`, `vertical-${position.verticalPosition}`);
|
|
194
|
+
}
|
|
195
|
+
closeIfMaxSnackbar() {
|
|
196
|
+
if (this.snackbarsArray.length === this.maxSnackbars) {
|
|
197
|
+
this.close(0);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
subscribeToClosingEvents(snackbarRef) {
|
|
201
|
+
snackbarRef.instance.closed.subscribe(() => {
|
|
202
|
+
const closeIndex = this.findSnackbarElementIndexFromRef(snackbarRef);
|
|
203
|
+
this.close(closeIndex);
|
|
204
|
+
});
|
|
205
|
+
snackbarRef.onDestroy(() => {
|
|
206
|
+
snackbarRef.instance.closed.unsubscribe();
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
applySnackbarContainerStyles(container, position) {
|
|
210
|
+
Object.assign(container.style, {
|
|
211
|
+
position: 'fixed',
|
|
212
|
+
zIndex: '1000',
|
|
213
|
+
display: 'flex',
|
|
214
|
+
flexDirection: 'column',
|
|
215
|
+
alignItems: 'flex-end',
|
|
216
|
+
});
|
|
217
|
+
Object.assign(container.style, {
|
|
218
|
+
left: '50%',
|
|
219
|
+
bottom: '0',
|
|
220
|
+
transform: 'translateX(-50%)',
|
|
221
|
+
});
|
|
222
|
+
switch (position.horizontalPosition) {
|
|
223
|
+
case HorizontalPosition.Left:
|
|
224
|
+
Object.assign(container.style, {
|
|
225
|
+
left: '0',
|
|
226
|
+
right: '',
|
|
227
|
+
transform: 'translateX(0)',
|
|
228
|
+
});
|
|
229
|
+
break;
|
|
230
|
+
case HorizontalPosition.Right:
|
|
231
|
+
Object.assign(container.style, {
|
|
232
|
+
right: '0',
|
|
233
|
+
left: '',
|
|
234
|
+
transform: 'translateX(0)',
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
if (position.verticalPosition === VerticalPosition.Top) {
|
|
238
|
+
container.style.top = '0';
|
|
239
|
+
container.style.bottom = '';
|
|
240
|
+
}
|
|
241
|
+
else {
|
|
242
|
+
container.style.flexDirection = 'column-reverse';
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
close(index) {
|
|
246
|
+
const snackbar = this.snackbarsArray[index];
|
|
247
|
+
if (!snackbar || !snackbar.ref || !snackbar.ref.instance) {
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
if ('closing' in snackbar.ref.instance) {
|
|
251
|
+
snackbar.ref.instance.closing = true;
|
|
252
|
+
}
|
|
253
|
+
this.snackbarsArray.splice(index, 1);
|
|
254
|
+
setTimeout(() => {
|
|
255
|
+
snackbar.ref.destroy();
|
|
256
|
+
}, snackbar.options.animationDuration * 1000);
|
|
257
|
+
}
|
|
258
|
+
generateSnackbarContainerId(position) {
|
|
259
|
+
return `${position.horizontalPosition}_${position.verticalPosition}`;
|
|
260
|
+
}
|
|
261
|
+
findSnackbarElementIndexFromRef(ref) {
|
|
262
|
+
return this.snackbarsArray.findIndex(snackbar => snackbar.ref === ref);
|
|
263
|
+
}
|
|
264
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: IpiSnackbarService, deps: [{ token: i0.ApplicationRef }, { token: i1.OverlayService }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
265
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: IpiSnackbarService, providedIn: 'root' }); }
|
|
266
|
+
}
|
|
267
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: IpiSnackbarService, decorators: [{
|
|
268
|
+
type: Injectable,
|
|
269
|
+
args: [{
|
|
270
|
+
providedIn: 'root',
|
|
271
|
+
}]
|
|
272
|
+
}], ctorParameters: () => [{ type: i0.ApplicationRef }, { type: i1.OverlayService }] });
|
|
273
|
+
|
|
274
|
+
/**
|
|
275
|
+
* Generated bundle index. Do not edit.
|
|
276
|
+
*/
|
|
277
|
+
|
|
278
|
+
export { HorizontalPosition, IpiSnackbarComponent, IpiSnackbarService, VerticalPosition };
|
|
279
|
+
//# sourceMappingURL=apexara-ng-components-snackbar.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apexara-ng-components-snackbar.mjs","sources":["../../../../projects/apexara/ng-components/snackbar/src/snackbar.component.ts","../../../../projects/apexara/ng-components/snackbar/src/snackbar.component.html","../../../../projects/apexara/ng-components/snackbar/src/snackbar.service.ts","../../../../projects/apexara/ng-components/snackbar/apexara-ng-components-snackbar.ts"],"sourcesContent":["import { trigger, state, style, transition, animate } from '@angular/animations';\nimport { NgClass } from '@angular/common';\nimport { Component, Input, Output, EventEmitter, ViewChild, ElementRef } from '@angular/core';\n\nimport { IpiImageComponent } from '@apexara/ng-components/image';\n\nexport enum VerticalPosition {\n Bottom,\n Top,\n}\n\nexport enum HorizontalPosition {\n Left,\n Center,\n Right,\n}\n\nexport interface IpiSnackbarOptions {\n title?: string;\n icon?: string;\n error: boolean;\n shouldClose: boolean;\n duration: number;\n animationDuration: number;\n position: SnackbarPosition;\n backgroundColor: string;\n errorBackgroundColor: string;\n progressColor: string;\n placeholderTextColor: string;\n messageTextColor: string;\n xIconColor: string;\n}\n\nexport interface SnackbarPosition {\n horizontalPosition?: HorizontalPosition;\n verticalPosition?: VerticalPosition;\n}\n\n@Component({\n selector: 'ipi-snackbar',\n templateUrl: './snackbar.component.html',\n styleUrls: ['./snackbar.component.css'],\n imports: [\n NgClass,\n IpiImageComponent,\n ],\n animations: [\n trigger('snackbarState', [\n state('open', style({\n opacity: 1,\n transform: 'translateX(0)',\n maxHeight: '*'\n })),\n state('closing', style({\n opacity: 0,\n transform: 'translateX(50px)',\n height: '0px',\n margin: 0,\n padding: 0,\n })),\n transition('open => closing', [\n animate('{{duration}}s ease-in', style({ opacity: 0, transform: 'translateX(50px)' })),\n animate('{{duration}}s ease-in', style({ height: '0px', margin: 0, padding: 0 })),\n ]),\n ]),\n ],\n})\n\nexport class IpiSnackbarComponent {\n\n @ViewChild('container') container!: ElementRef<HTMLDivElement>;\n\n @Input() message!: String;\n @Input() options!: IpiSnackbarOptions;\n\n @Input() positionOptions!: SnackbarPosition;\n\n @Input() closing: boolean = false;\n\n @Output() closed = new EventEmitter<void>();\n\n public ngAfterViewInit(): void {\n if (!this.container) {\n return;\n }\n\n this.container.nativeElement.style.height = this.container.nativeElement.scrollHeight + 'px';\n }\n\n public getAnimationParams() {\n return { duration: this.options?.animationDuration ? this.options.animationDuration / 3 : 1 };\n }\n\n}\n","<div\n #container\n class=\"custom-snackbar\"\n [class.error]=\"options.error\"\n [style.ipi-snackbar-animation-duration]=\"options.animationDuration + 's'\"\n [@snackbarState]=\"{ value: closing ? 'closing' : 'open', params: getAnimationParams() }\">\n\n <div class=\"placeholder-wrapper\">\n @if (options.icon) {\n <ipi-img [src]=\"'assets/img/' + options.icon\" [ariaLabel]=\"'Snackbar prefix icon'\"></ipi-img>\n }\n\n <div class=\"placeholder\">{{ options.title ?? (options.error ? 'Error' : 'Success') }}</div>\n\n <div class=\"x-icon\" (click)=\"closed.emit()\"></div>\n </div>\n\n <div class=\"message-wrapper\" [ngClass]=\"{ 'no-padding' : !options.icon }\">\n <div class=\"message\">{{ message }}</div>\n </div>\n\n @if (options.shouldClose) {\n <div class=\"progress\" [style.animation-duration]=\"(options.duration + 2 * options.animationDuration) + 's'\"></div>\n }\n</div>\n","import { Injectable, ComponentRef, ApplicationRef, EmbeddedViewRef, createComponent } from '@angular/core';\n\nimport { OverlayService } from '@apexara/ng-components/services';\n\nimport { IpiSnackbarComponent, IpiSnackbarOptions, SnackbarPosition, VerticalPosition, HorizontalPosition } from './snackbar.component';\n\ntype SnackbarComponentRef = ComponentRef<IpiSnackbarComponent | unknown>;\n\ninterface SnackbarElement {\n containerId: string;\n ref: SnackbarComponentRef;\n options: IpiSnackbarOptions;\n}\n\n@Injectable({\n providedIn: 'root',\n})\n\nexport class IpiSnackbarService {\n\n constructor(\n private appRef: ApplicationRef,\n private overlayService: OverlayService) { }\n\n private maxSnackbars = 5;\n\n private snackbarContainerMap: Record<string, HTMLElement> = { };\n\n private defaultSnackbarOptions: IpiSnackbarOptions = {\n error: false,\n shouldClose: true,\n duration: 5,\n animationDuration: 1,\n position: {\n verticalPosition: VerticalPosition.Bottom,\n horizontalPosition: HorizontalPosition.Center,\n },\n backgroundColor: '#14BD6C',\n errorBackgroundColor: '#F96138',\n progressColor: '#FFFFFF',\n placeholderTextColor: '#FFFFFF',\n messageTextColor: '#FFFFFF',\n xIconColor: '#FFFFFF',\n };\n\n private snackbarsArray: SnackbarElement[] = [ ];\n\n public open(message?: string, options?: Partial<IpiSnackbarOptions>, component?: unknown, data?: Record<string, unknown>): void {\n const snackbarOptions: IpiSnackbarOptions = {\n ...this.defaultSnackbarOptions,\n ...options,\n };\n\n const snackbarContainerRef = this.createSnackbarContainer(snackbarOptions.position);\n\n const snackbarRef = this.createComponent(\n component ? component : IpiSnackbarComponent,\n snackbarOptions,\n snackbarContainerRef,\n component ? data : undefined,\n );\n\n if (!snackbarRef) {\n return;\n }\n\n if (message && !component) {\n snackbarRef.instance.message = message;\n }\n\n this.closeIfMaxSnackbar();\n\n this.snackbarsArray.push({\n containerId: this.generateSnackbarContainerId(snackbarOptions.position),\n ref: snackbarRef,\n options: snackbarOptions,\n });\n\n this.subscribeToClosingEvents(snackbarRef);\n }\n\n public setMaxSnackbars(length: number): void {\n this.maxSnackbars = length;\n }\n\n public updateDefaultOptions(options: Partial<IpiSnackbarOptions>): void {\n this.defaultSnackbarOptions = { ...this.defaultSnackbarOptions, ...options };\n }\n\n private createSnackbarContainer(position: SnackbarPosition): HTMLElement {\n const id = this.generateSnackbarContainerId(position);\n\n if (this.snackbarContainerMap[id]) {\n return this.snackbarContainerMap[id];\n }\n\n this.snackbarContainerMap[id] = document.createElement('div');\n\n this.applySnackbarContainerStyles(this.snackbarContainerMap[id], position);\n\n this.overlayService.appendToOverlay(this.snackbarContainerMap[id], false);\n\n return this.snackbarContainerMap[id];\n }\n\n private createComponent(component: any, options: IpiSnackbarOptions, container: HTMLElement, data?: Record<string, unknown>): ComponentRef<any> | void {\n const componentRef = createComponent(component, { environmentInjector: this.appRef.injector });\n\n if (!componentRef.instance) {\n return;\n }\n\n (componentRef.instance as any).data = data;\n (componentRef.instance as any).options = options;\n\n this.appRef.attachView(componentRef.hostView);\n\n const snackbarElement = (componentRef.hostView as EmbeddedViewRef<any>).rootNodes[0] as HTMLElement;\n\n this.applySnackbarStyles(snackbarElement, options);\n\n container.appendChild(snackbarElement);\n\n if (options.shouldClose) {\n setTimeout(() => {\n const closeIndex = this.findSnackbarElementIndexFromRef(componentRef);\n\n if (closeIndex === undefined) {\n return;\n }\n\n this.close(closeIndex);\n }, (2 * options.animationDuration + options.duration) * 1000);\n }\n\n return componentRef;\n }\n\n private applySnackbarStyles(snackbarElement: HTMLElement, options: IpiSnackbarOptions): void {\n const styles = {\n '--ipi-snackbar-background-color': options.backgroundColor,\n '--ipi-snackbar-placeholder-text-color': options.placeholderTextColor,\n '--ipi-snackbar-message-text-color': options.messageTextColor,\n '--ipi-snackbar-progress-color': options.progressColor,\n '--ipi-snackbar-x-icon-color': options.xIconColor,\n '--ipi-snackbar-animation-duration': options.animationDuration ? `${options.animationDuration}s` : undefined\n };\n \n for (const [cssVar, value] of Object.entries(styles)) {\n if (value) {\n snackbarElement.style.setProperty(cssVar, value);\n }\n }\n\n const position = options.position ? options.position : this.defaultSnackbarOptions.position!;\n\n snackbarElement.querySelector('div:first-child')!.classList.add(`horizontal-${position.horizontalPosition}`, `vertical-${position.verticalPosition}`);\n }\n\n private closeIfMaxSnackbar(): void {\n if (this.snackbarsArray.length === this.maxSnackbars) {\n this.close(0);\n }\n }\n\n private subscribeToClosingEvents(snackbarRef: SnackbarComponentRef): void {\n (snackbarRef.instance as any).closed.subscribe(() => {\n const closeIndex = this.findSnackbarElementIndexFromRef(snackbarRef);\n\n this.close(closeIndex);\n });\n\n snackbarRef.onDestroy(() => {\n (snackbarRef.instance as any).closed.unsubscribe();\n });\n }\n\n private applySnackbarContainerStyles(container: HTMLElement, position: SnackbarPosition): void {\n Object.assign(container.style, {\n position: 'fixed',\n zIndex: '1000',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-end',\n });\n\n Object.assign(container.style, {\n left: '50%',\n bottom: '0',\n transform: 'translateX(-50%)',\n });\n\n switch (position.horizontalPosition) {\n case HorizontalPosition.Left:\n Object.assign(container.style, {\n left: '0',\n right: '',\n transform: 'translateX(0)',\n });\n\n break;\n\n case HorizontalPosition.Right:\n Object.assign(container.style, {\n right: '0',\n left: '',\n transform: 'translateX(0)',\n });\n }\n\n if (position.verticalPosition === VerticalPosition.Top) {\n container.style.top = '0';\n container.style.bottom = '';\n } else {\n container.style.flexDirection = 'column-reverse';\n }\n }\n\n private close(index: number): void {\n const snackbar = this.snackbarsArray[index];\n\n if (!snackbar || !snackbar.ref || !snackbar.ref.instance) {\n return;\n }\n\n if ('closing' in (snackbar.ref.instance as object)) {\n (snackbar.ref.instance as any).closing = true;\n }\n\n this.snackbarsArray.splice(index, 1);\n\n setTimeout(() => {\n snackbar.ref.destroy();\n }, snackbar.options.animationDuration * 1000);\n }\n\n private generateSnackbarContainerId(position: SnackbarPosition): string {\n return `${position.horizontalPosition}_${position.verticalPosition}`;\n }\n\n private findSnackbarElementIndexFromRef(ref: SnackbarComponentRef): number {\n return this.snackbarsArray.findIndex(snackbar => snackbar.ref === ref);\n }\n\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;IAMY;AAAZ,CAAA,UAAY,gBAAgB,EAAA;AAC1B,IAAA,gBAAA,CAAA,gBAAA,CAAA,QAAA,CAAA,GAAA,CAAA,CAAA,GAAA,QAAM;AACN,IAAA,gBAAA,CAAA,gBAAA,CAAA,KAAA,CAAA,GAAA,CAAA,CAAA,GAAA,KAAG;AACL,CAAC,EAHW,gBAAgB,KAAhB,gBAAgB,GAAA,EAAA,CAAA,CAAA;IAKhB;AAAZ,CAAA,UAAY,kBAAkB,EAAA;AAC5B,IAAA,kBAAA,CAAA,kBAAA,CAAA,MAAA,CAAA,GAAA,CAAA,CAAA,GAAA,MAAI;AACJ,IAAA,kBAAA,CAAA,kBAAA,CAAA,QAAA,CAAA,GAAA,CAAA,CAAA,GAAA,QAAM;AACN,IAAA,kBAAA,CAAA,kBAAA,CAAA,OAAA,CAAA,GAAA,CAAA,CAAA,GAAA,OAAK;AACP,CAAC,EAJW,kBAAkB,KAAlB,kBAAkB,GAAA,EAAA,CAAA,CAAA;MAyDjB,oBAAoB,CAAA;AA9BjC,IAAA,WAAA,GAAA;QAuCW,IAAA,CAAA,OAAO,GAAY,KAAK;AAEvB,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,YAAY,EAAQ;AAc5C,IAAA;IAZQ,eAAe,GAAA;AACpB,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACnB;QACF;AAEA,QAAA,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,YAAY,GAAG,IAAI;IAC9F;IAEO,kBAAkB,GAAA;QACvB,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI,CAAC,OAAO,CAAC,iBAAiB,GAAG,CAAC,GAAG,CAAC,EAAE;IAC/F;8GAvBW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAApB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,oBAAoB,2TCpEjC,g9BAyBA,EAAA,MAAA,EAAA,CAAA,q4EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDkBI,OAAO,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACP,iBAAiB,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,KAAA,EAAA,WAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAEP;YACV,OAAO,CAAC,eAAe,EAAE;AACvB,gBAAA,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC;AAClB,oBAAA,OAAO,EAAE,CAAC;AACV,oBAAA,SAAS,EAAE,eAAe;AAC1B,oBAAA,SAAS,EAAE;AACZ,iBAAA,CAAC,CAAC;AACH,gBAAA,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC;AACrB,oBAAA,OAAO,EAAE,CAAC;AACV,oBAAA,SAAS,EAAE,kBAAkB;AAC7B,oBAAA,MAAM,EAAE,KAAK;AACb,oBAAA,MAAM,EAAE,CAAC;AACT,oBAAA,OAAO,EAAE,CAAC;AACX,iBAAA,CAAC,CAAC;gBACH,UAAU,CAAC,iBAAiB,EAAE;AAC5B,oBAAA,OAAO,CAAC,uBAAuB,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAAC,CAAC;AACtF,oBAAA,OAAO,CAAC,uBAAuB,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;iBAClF,CAAC;aACH,CAAC;AACH,SAAA,EAAA,CAAA,CAAA;;2FAGU,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBA9BhC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,cAAc,EAAA,OAAA,EAGf;wBACP,OAAO;wBACP,iBAAiB;qBAClB,EAAA,UAAA,EACW;wBACV,OAAO,CAAC,eAAe,EAAE;AACvB,4BAAA,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC;AAClB,gCAAA,OAAO,EAAE,CAAC;AACV,gCAAA,SAAS,EAAE,eAAe;AAC1B,gCAAA,SAAS,EAAE;AACZ,6BAAA,CAAC,CAAC;AACH,4BAAA,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC;AACrB,gCAAA,OAAO,EAAE,CAAC;AACV,gCAAA,SAAS,EAAE,kBAAkB;AAC7B,gCAAA,MAAM,EAAE,KAAK;AACb,gCAAA,MAAM,EAAE,CAAC;AACT,gCAAA,OAAO,EAAE,CAAC;AACX,6BAAA,CAAC,CAAC;4BACH,UAAU,CAAC,iBAAiB,EAAE;AAC5B,gCAAA,OAAO,CAAC,uBAAuB,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAAC,CAAC;AACtF,gCAAA,OAAO,CAAC,uBAAuB,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;6BAClF,CAAC;yBACH,CAAC;AACH,qBAAA,EAAA,QAAA,EAAA,g9BAAA,EAAA,MAAA,EAAA,CAAA,q4EAAA,CAAA,EAAA;;sBAKA,SAAS;uBAAC,WAAW;;sBAErB;;sBACA;;sBAEA;;sBAEA;;sBAEA;;;ME7DU,kBAAkB,CAAA;IAE7B,WAAA,CACU,MAAsB,EACtB,cAA8B,EAAA;QAD9B,IAAA,CAAA,MAAM,GAAN,MAAM;QACN,IAAA,CAAA,cAAc,GAAd,cAAc;QAEhB,IAAA,CAAA,YAAY,GAAG,CAAC;QAEhB,IAAA,CAAA,oBAAoB,GAAgC,EAAG;AAEvD,QAAA,IAAA,CAAA,sBAAsB,GAAuB;AACnD,YAAA,KAAK,EAAE,KAAK;AACZ,YAAA,WAAW,EAAE,IAAI;AACjB,YAAA,QAAQ,EAAE,CAAC;AACX,YAAA,iBAAiB,EAAE,CAAC;AACpB,YAAA,QAAQ,EAAE;gBACR,gBAAgB,EAAE,gBAAgB,CAAC,MAAM;gBACzC,kBAAkB,EAAE,kBAAkB,CAAC,MAAM;AAC9C,aAAA;AACD,YAAA,eAAe,EAAE,SAAS;AAC1B,YAAA,oBAAoB,EAAE,SAAS;AAC/B,YAAA,aAAa,EAAE,SAAS;AACxB,YAAA,oBAAoB,EAAE,SAAS;AAC/B,YAAA,gBAAgB,EAAE,SAAS;AAC3B,YAAA,UAAU,EAAE,SAAS;SACtB;QAEO,IAAA,CAAA,cAAc,GAAsB,EAAG;IAvBH;AAyBrC,IAAA,IAAI,CAAC,OAAgB,EAAE,OAAqC,EAAE,SAAmB,EAAE,IAA8B,EAAA;AACtH,QAAA,MAAM,eAAe,GAAuB;YAC1C,GAAG,IAAI,CAAC,sBAAsB;AAC9B,YAAA,GAAG,OAAO;SACX;QAED,MAAM,oBAAoB,GAAG,IAAI,CAAC,uBAAuB,CAAC,eAAe,CAAC,QAAQ,CAAC;AAEnF,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,CACtC,SAAS,GAAG,SAAS,GAAG,oBAAoB,EAC5C,eAAe,EACf,oBAAoB,EACpB,SAAS,GAAG,IAAI,GAAG,SAAS,CAC7B;QAED,IAAI,CAAC,WAAW,EAAE;YAChB;QACF;AAEA,QAAA,IAAI,OAAO,IAAI,CAAC,SAAS,EAAE;AACzB,YAAA,WAAW,CAAC,QAAQ,CAAC,OAAO,GAAG,OAAO;QACxC;QAEA,IAAI,CAAC,kBAAkB,EAAE;AAEzB,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;YACvB,WAAW,EAAE,IAAI,CAAC,2BAA2B,CAAC,eAAe,CAAC,QAAQ,CAAC;AACvE,YAAA,GAAG,EAAE,WAAW;AAChB,YAAA,OAAO,EAAE,eAAe;AACzB,SAAA,CAAC;AAEF,QAAA,IAAI,CAAC,wBAAwB,CAAC,WAAW,CAAC;IAC5C;AAEO,IAAA,eAAe,CAAC,MAAc,EAAA;AACnC,QAAA,IAAI,CAAC,YAAY,GAAG,MAAM;IAC5B;AAEO,IAAA,oBAAoB,CAAC,OAAoC,EAAA;AAC9D,QAAA,IAAI,CAAC,sBAAsB,GAAG,EAAE,GAAG,IAAI,CAAC,sBAAsB,EAAE,GAAG,OAAO,EAAE;IAC9E;AAEQ,IAAA,uBAAuB,CAAC,QAA0B,EAAA;QACxD,MAAM,EAAE,GAAG,IAAI,CAAC,2BAA2B,CAAC,QAAQ,CAAC;AAErD,QAAA,IAAI,IAAI,CAAC,oBAAoB,CAAC,EAAE,CAAC,EAAE;AACjC,YAAA,OAAO,IAAI,CAAC,oBAAoB,CAAC,EAAE,CAAC;QACtC;AAEA,QAAA,IAAI,CAAC,oBAAoB,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;AAE7D,QAAA,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,oBAAoB,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC;AAE1E,QAAA,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,IAAI,CAAC,oBAAoB,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC;AAEzE,QAAA,OAAO,IAAI,CAAC,oBAAoB,CAAC,EAAE,CAAC;IACtC;AAEQ,IAAA,eAAe,CAAC,SAAc,EAAE,OAA2B,EAAE,SAAsB,EAAE,IAA8B,EAAA;AACzH,QAAA,MAAM,YAAY,GAAG,eAAe,CAAC,SAAS,EAAE,EAAE,mBAAmB,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;AAE9F,QAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE;YAC1B;QACF;AAEC,QAAA,YAAY,CAAC,QAAgB,CAAC,IAAI,GAAG,IAAI;AACzC,QAAA,YAAY,CAAC,QAAgB,CAAC,OAAO,GAAG,OAAO;QAEhD,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,QAAQ,CAAC;QAE7C,MAAM,eAAe,GAAI,YAAY,CAAC,QAAiC,CAAC,SAAS,CAAC,CAAC,CAAgB;AAEnG,QAAA,IAAI,CAAC,mBAAmB,CAAC,eAAe,EAAE,OAAO,CAAC;AAElD,QAAA,SAAS,CAAC,WAAW,CAAC,eAAe,CAAC;AAEtC,QAAA,IAAI,OAAO,CAAC,WAAW,EAAE;YACvB,UAAU,CAAC,MAAK;gBACd,MAAM,UAAU,GAAG,IAAI,CAAC,+BAA+B,CAAC,YAAY,CAAC;AAErE,gBAAA,IAAI,UAAU,KAAK,SAAS,EAAE;oBAC5B;gBACF;AAEA,gBAAA,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;AACxB,YAAA,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,iBAAiB,GAAG,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC;QAC/D;AAEA,QAAA,OAAO,YAAY;IACrB;IAEQ,mBAAmB,CAAC,eAA4B,EAAE,OAA2B,EAAA;AACnF,QAAA,MAAM,MAAM,GAAG;YACb,iCAAiC,EAAE,OAAO,CAAC,eAAe;YAC1D,uCAAuC,EAAE,OAAO,CAAC,oBAAoB;YACrE,mCAAmC,EAAE,OAAO,CAAC,gBAAgB;YAC7D,+BAA+B,EAAE,OAAO,CAAC,aAAa;YACtD,6BAA6B,EAAE,OAAO,CAAC,UAAU;AACjD,YAAA,mCAAmC,EAAE,OAAO,CAAC,iBAAiB,GAAG,CAAA,EAAG,OAAO,CAAC,iBAAiB,CAAA,CAAA,CAAG,GAAG;SACpG;AAED,QAAA,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;YACpD,IAAI,KAAK,EAAE;gBACT,eAAe,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC;YAClD;QACF;AAEA,QAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,sBAAsB,CAAC,QAAS;QAE5F,eAAe,CAAC,aAAa,CAAC,iBAAiB,CAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA,WAAA,EAAc,QAAQ,CAAC,kBAAkB,EAAE,EAAE,CAAA,SAAA,EAAY,QAAQ,CAAC,gBAAgB,CAAA,CAAE,CAAC;IACvJ;IAEQ,kBAAkB,GAAA;QACxB,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,KAAK,IAAI,CAAC,YAAY,EAAE;AACpD,YAAA,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QACf;IACF;AAEQ,IAAA,wBAAwB,CAAC,WAAiC,EAAA;QAC/D,WAAW,CAAC,QAAgB,CAAC,MAAM,CAAC,SAAS,CAAC,MAAK;YAClD,MAAM,UAAU,GAAG,IAAI,CAAC,+BAA+B,CAAC,WAAW,CAAC;AAEpE,YAAA,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;AACxB,QAAA,CAAC,CAAC;AAEF,QAAA,WAAW,CAAC,SAAS,CAAC,MAAK;AACxB,YAAA,WAAW,CAAC,QAAgB,CAAC,MAAM,CAAC,WAAW,EAAE;AACpD,QAAA,CAAC,CAAC;IACJ;IAEQ,4BAA4B,CAAC,SAAsB,EAAE,QAA0B,EAAA;AACrF,QAAA,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE;AAC7B,YAAA,QAAQ,EAAE,OAAO;AACjB,YAAA,MAAM,EAAE,MAAM;AACd,YAAA,OAAO,EAAE,MAAM;AACf,YAAA,aAAa,EAAE,QAAQ;AACvB,YAAA,UAAU,EAAE,UAAU;AACvB,SAAA,CAAC;AAEF,QAAA,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE;AAC7B,YAAA,IAAI,EAAE,KAAK;AACX,YAAA,MAAM,EAAE,GAAG;AACX,YAAA,SAAS,EAAE,kBAAkB;AAC9B,SAAA,CAAC;AAEF,QAAA,QAAQ,QAAQ,CAAC,kBAAkB;YACjC,KAAK,kBAAkB,CAAC,IAAI;AAC1B,gBAAA,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE;AAC7B,oBAAA,IAAI,EAAE,GAAG;AACT,oBAAA,KAAK,EAAE,EAAE;AACT,oBAAA,SAAS,EAAE,eAAe;AAC3B,iBAAA,CAAC;gBAEF;YAEF,KAAK,kBAAkB,CAAC,KAAK;AAC3B,gBAAA,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE;AAC7B,oBAAA,KAAK,EAAE,GAAG;AACV,oBAAA,IAAI,EAAE,EAAE;AACR,oBAAA,SAAS,EAAE,eAAe;AAC3B,iBAAA,CAAC;;QAGN,IAAI,QAAQ,CAAC,gBAAgB,KAAK,gBAAgB,CAAC,GAAG,EAAE;AACtD,YAAA,SAAS,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG;AACzB,YAAA,SAAS,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE;QAC7B;aAAO;AACL,YAAA,SAAS,CAAC,KAAK,CAAC,aAAa,GAAG,gBAAgB;QAClD;IACF;AAEQ,IAAA,KAAK,CAAC,KAAa,EAAA;QACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;AAE3C,QAAA,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE;YACxD;QACF;QAEA,IAAI,SAAS,IAAK,QAAQ,CAAC,GAAG,CAAC,QAAmB,EAAE;YACjD,QAAQ,CAAC,GAAG,CAAC,QAAgB,CAAC,OAAO,GAAG,IAAI;QAC/C;QAEA,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAEpC,UAAU,CAAC,MAAK;AACd,YAAA,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE;QACxB,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAC/C;AAEQ,IAAA,2BAA2B,CAAC,QAA0B,EAAA;QAC5D,OAAO,CAAA,EAAG,QAAQ,CAAC,kBAAkB,IAAI,QAAQ,CAAC,gBAAgB,CAAA,CAAE;IACtE;AAEQ,IAAA,+BAA+B,CAAC,GAAyB,EAAA;AAC/D,QAAA,OAAO,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,QAAQ,IAAI,QAAQ,CAAC,GAAG,KAAK,GAAG,CAAC;IACxE;8GAhOW,kBAAkB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,cAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,cAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAlB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,kBAAkB,cAHjB,MAAM,EAAA,CAAA,CAAA;;2FAGP,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAJ9B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;AChBD;;AAEG;;;;"}
|