@severfam/simple-slider-angular 0.1.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 +138 -0
- package/fesm2022/severfam-simple-slider-angular.mjs +364 -0
- package/fesm2022/severfam-simple-slider-angular.mjs.map +1 -0
- package/fesm2022/simple-slider-angular.mjs +364 -0
- package/fesm2022/simple-slider-angular.mjs.map +1 -0
- package/package.json +48 -0
- package/types/severfam-simple-slider-angular.d.ts +70 -0
- package/types/simple-slider-angular.d.ts +70 -0
package/README.md
ADDED
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
# Simple Slider Angular
|
|
2
|
+
|
|
3
|
+
A lightweight, configurable photo slider/gallery component for Angular with touch support, arrow navigation, and full customization via signal-based inputs.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @severfam/simple-slider-angular
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Requirements
|
|
12
|
+
|
|
13
|
+
- Angular 21+
|
|
14
|
+
- `@angular/common`
|
|
15
|
+
- `@angular/core`
|
|
16
|
+
- `@angular/platform-browser`
|
|
17
|
+
|
|
18
|
+
## Usage
|
|
19
|
+
|
|
20
|
+
### Import
|
|
21
|
+
|
|
22
|
+
```typescript
|
|
23
|
+
import { SimpleSliderComponent, ISliderPhoto } from '@severfam/simple-slider-angular';
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### Component
|
|
27
|
+
|
|
28
|
+
```typescript
|
|
29
|
+
@Component({
|
|
30
|
+
selector: 'app-root',
|
|
31
|
+
imports: [SimpleSliderComponent],
|
|
32
|
+
template: `
|
|
33
|
+
<lib-simple-slider
|
|
34
|
+
[propertyPhotos]="photos"
|
|
35
|
+
[selectedElementIndex]="selectedIndex"
|
|
36
|
+
[cardWidth]="100"
|
|
37
|
+
[cardHeight]="150"
|
|
38
|
+
(changeModel)="onSelect($event)"
|
|
39
|
+
></lib-simple-slider>
|
|
40
|
+
`,
|
|
41
|
+
})
|
|
42
|
+
export class App {
|
|
43
|
+
protected photos: ISliderPhoto[] = [
|
|
44
|
+
{ url: 'https://example.com/photo1.jpg', name: 'Photo 1', alt: 'Description' },
|
|
45
|
+
{ url: 'https://example.com/photo2.jpg', name: 'Photo 2', alt: 'Description' },
|
|
46
|
+
];
|
|
47
|
+
|
|
48
|
+
protected selectedIndex = 0;
|
|
49
|
+
|
|
50
|
+
onSelect(index: number): void {
|
|
51
|
+
this.selectedIndex = index;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## API Reference
|
|
57
|
+
|
|
58
|
+
### Interface: `ISliderPhoto`
|
|
59
|
+
|
|
60
|
+
```typescript
|
|
61
|
+
interface ISliderPhoto {
|
|
62
|
+
url: string | SafeResourceUrl;
|
|
63
|
+
name: string;
|
|
64
|
+
alt: string;
|
|
65
|
+
disabled?: boolean;
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
| Property | Type | Required | Description |
|
|
70
|
+
|----------|------|----------|-------------|
|
|
71
|
+
| `url` | `string \| SafeResourceUrl` | Yes | URL of the photo |
|
|
72
|
+
| `name` | `string` | Yes | Display name of the photo |
|
|
73
|
+
| `alt` | `string` | Yes | Alt text for accessibility |
|
|
74
|
+
| `disabled` | `boolean` | No | If true, the photo cannot be selected |
|
|
75
|
+
|
|
76
|
+
### Inputs
|
|
77
|
+
|
|
78
|
+
#### Data
|
|
79
|
+
|
|
80
|
+
| Input | Type | Default | Description |
|
|
81
|
+
|-------|------|---------|-------------|
|
|
82
|
+
| `propertyPhotos` | `ISliderPhoto[]` | `[]` | Array of photos to display |
|
|
83
|
+
| `selectedElementIndex` | `number` | `0` | Index of the currently selected photo |
|
|
84
|
+
|
|
85
|
+
#### Card Dimensions
|
|
86
|
+
|
|
87
|
+
| Input | Type | Default | Description |
|
|
88
|
+
|-------|------|---------|-------------|
|
|
89
|
+
| `cardWidth` | `number` | `60` | Width of each photo card in pixels |
|
|
90
|
+
| `cardHeight` | `number` | `90` | Height of each photo card in pixels |
|
|
91
|
+
| `cardMargin` | `number` | `10` | Horizontal margin between cards in pixels |
|
|
92
|
+
| `cardPadding` | `number` | `2` | Padding inside each card in pixels |
|
|
93
|
+
| `borderWidth` | `number` | `1` | Border width of each card in pixels |
|
|
94
|
+
|
|
95
|
+
#### Colors
|
|
96
|
+
|
|
97
|
+
| Input | Type | Default | Description |
|
|
98
|
+
|-------|------|---------|-------------|
|
|
99
|
+
| `activeBorderColor` | `string` | `'#1976d2'` | Border color for the selected photo |
|
|
100
|
+
| `defaultBorderColor` | `string` | `'#fff'` | Border color for non-selected photos |
|
|
101
|
+
| `arrowColor` | `string` | `'#333'` | Color of the arrow icons |
|
|
102
|
+
| `inactiveIconColor` | `string` | `'#9e9e9e'` | Color of arrow icons when disabled |
|
|
103
|
+
| `arrowBackgroundColor` | `string` | `'transparent'` | Background color of arrow buttons |
|
|
104
|
+
| `arrowBorderColor` | `string` | `'transparent'` | Border color of arrow buttons |
|
|
105
|
+
| `arrowBorderWidth` | `number` | `0` | Border width of arrow buttons in pixels |
|
|
106
|
+
|
|
107
|
+
#### Behavior
|
|
108
|
+
|
|
109
|
+
| Input | Type | Default | Description |
|
|
110
|
+
|-------|------|---------|-------------|
|
|
111
|
+
| `longClickDelay` | `number` | `200` | Delay in ms before long press triggers continuous scrolling |
|
|
112
|
+
| `touchDelta` | `number` | `20` | Minimum horizontal movement in px to trigger a swipe |
|
|
113
|
+
| `arrowWidth` | `number` | `36` | Width of arrow buttons in pixels |
|
|
114
|
+
|
|
115
|
+
### Outputs
|
|
116
|
+
|
|
117
|
+
| Output | Type | Description |
|
|
118
|
+
|--------|------|-------------|
|
|
119
|
+
| `changeModel` | `number` | Emits the index of the photo when clicked |
|
|
120
|
+
|
|
121
|
+
### Public Methods
|
|
122
|
+
|
|
123
|
+
| Method | Description |
|
|
124
|
+
|--------|-------------|
|
|
125
|
+
| `stepPrevSlider()` | Navigate to the previous photo |
|
|
126
|
+
| `stepNextSlider()` | Navigate to the next photo |
|
|
127
|
+
| `computedPositionSlider()` | Recalculate slider position based on `selectedElementIndex` |
|
|
128
|
+
|
|
129
|
+
## Features
|
|
130
|
+
|
|
131
|
+
- Signal-based inputs (Angular 21+)
|
|
132
|
+
- Touch swipe support
|
|
133
|
+
- Mouse wheel navigation
|
|
134
|
+
- Long press on arrows for continuous scrolling
|
|
135
|
+
- Auto-hiding arrows when all photos are visible
|
|
136
|
+
- Responsive to window resize
|
|
137
|
+
- Configurable dimensions, colors, and behavior
|
|
138
|
+
- Lightweight with no external dependencies
|
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { InjectionToken, PLATFORM_ID, input, output, ChangeDetectionStrategy, Component, inject, ChangeDetectorRef, DestroyRef, afterNextRender, effect, ElementRef, ViewChild } from '@angular/core';
|
|
3
|
+
import { isPlatformBrowser, NgOptimizedImage } from '@angular/common';
|
|
4
|
+
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
5
|
+
import { fromEvent, startWith, switchMap, of, distinctUntilChanged, debounceTime, delay, takeUntil, interval } from 'rxjs';
|
|
6
|
+
|
|
7
|
+
const WINDOW = new InjectionToken('window');
|
|
8
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
9
|
+
const windowProvider = {
|
|
10
|
+
provide: WINDOW,
|
|
11
|
+
useFactory: (platformId) => {
|
|
12
|
+
if (isPlatformBrowser(platformId)) {
|
|
13
|
+
return window;
|
|
14
|
+
}
|
|
15
|
+
return {};
|
|
16
|
+
},
|
|
17
|
+
deps: [PLATFORM_ID],
|
|
18
|
+
};
|
|
19
|
+
const WINDOW_PROVIDERS = [windowProvider];
|
|
20
|
+
|
|
21
|
+
var ESliderAction;
|
|
22
|
+
(function (ESliderAction) {
|
|
23
|
+
ESliderAction["COMPUTE_POSITION"] = "computePosition";
|
|
24
|
+
ESliderAction["STEP_NEXT"] = "stepNext";
|
|
25
|
+
ESliderAction["STEP_PREV"] = "stepPrev";
|
|
26
|
+
ESliderAction["TOUCH_MOVE"] = "touchMove";
|
|
27
|
+
})(ESliderAction || (ESliderAction = {}));
|
|
28
|
+
var EArrowAction;
|
|
29
|
+
(function (EArrowAction) {
|
|
30
|
+
EArrowAction["STEP_NEXT"] = "stepNext";
|
|
31
|
+
EArrowAction["STEP_PREV"] = "stepPrev";
|
|
32
|
+
})(EArrowAction || (EArrowAction = {}));
|
|
33
|
+
|
|
34
|
+
class SimpleSliderPhotoComponent {
|
|
35
|
+
photoLink = input(...(ngDevMode ? [undefined, { debugName: "photoLink" }] : /* istanbul ignore next */ []));
|
|
36
|
+
photoAlt = input('', ...(ngDevMode ? [{ debugName: "photoAlt" }] : /* istanbul ignore next */ []));
|
|
37
|
+
isActive = input(false, ...(ngDevMode ? [{ debugName: "isActive" }] : /* istanbul ignore next */ []));
|
|
38
|
+
isDisabled = input(false, ...(ngDevMode ? [{ debugName: "isDisabled" }] : /* istanbul ignore next */ []));
|
|
39
|
+
cardWidth = input(0, ...(ngDevMode ? [{ debugName: "cardWidth" }] : /* istanbul ignore next */ []));
|
|
40
|
+
cardHeight = input(0, ...(ngDevMode ? [{ debugName: "cardHeight" }] : /* istanbul ignore next */ []));
|
|
41
|
+
borderWidth = input(0, ...(ngDevMode ? [{ debugName: "borderWidth" }] : /* istanbul ignore next */ []));
|
|
42
|
+
cardPadding = input(0, ...(ngDevMode ? [{ debugName: "cardPadding" }] : /* istanbul ignore next */ []));
|
|
43
|
+
activeBorderColor = input('#1976d2', ...(ngDevMode ? [{ debugName: "activeBorderColor" }] : /* istanbul ignore next */ []));
|
|
44
|
+
defaultBorderColor = input('#fff', ...(ngDevMode ? [{ debugName: "defaultBorderColor" }] : /* istanbul ignore next */ []));
|
|
45
|
+
changeModel = output();
|
|
46
|
+
get borderColor() {
|
|
47
|
+
return this.isActive() ? this.activeBorderColor() : this.defaultBorderColor();
|
|
48
|
+
}
|
|
49
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.23", ngImport: i0, type: SimpleSliderPhotoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
50
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.23", type: SimpleSliderPhotoComponent, isStandalone: true, selector: "simple-slider-photo", inputs: { photoLink: { classPropertyName: "photoLink", publicName: "photoLink", isSignal: true, isRequired: false, transformFunction: null }, photoAlt: { classPropertyName: "photoAlt", publicName: "photoAlt", isSignal: true, isRequired: false, transformFunction: null }, isActive: { classPropertyName: "isActive", publicName: "isActive", isSignal: true, isRequired: false, transformFunction: null }, isDisabled: { classPropertyName: "isDisabled", publicName: "isDisabled", isSignal: true, isRequired: false, transformFunction: null }, cardWidth: { classPropertyName: "cardWidth", publicName: "cardWidth", isSignal: true, isRequired: false, transformFunction: null }, cardHeight: { classPropertyName: "cardHeight", publicName: "cardHeight", isSignal: true, isRequired: false, transformFunction: null }, borderWidth: { classPropertyName: "borderWidth", publicName: "borderWidth", isSignal: true, isRequired: false, transformFunction: null }, cardPadding: { classPropertyName: "cardPadding", publicName: "cardPadding", isSignal: true, isRequired: false, transformFunction: null }, activeBorderColor: { classPropertyName: "activeBorderColor", publicName: "activeBorderColor", isSignal: true, isRequired: false, transformFunction: null }, defaultBorderColor: { classPropertyName: "defaultBorderColor", publicName: "defaultBorderColor", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { changeModel: "changeModel" }, ngImport: i0, template: "<div\r\n class=\"simple-slider-photo\"\r\n [class.simple-slider-photo--disabled]=\"isDisabled()\"\r\n [style.border-width.px]=\"borderWidth()\"\r\n [style.padding.px]=\"cardPadding()\"\r\n [style.border-color]=\"borderColor\"\r\n (click)=\"changeModel.emit()\"\r\n>\r\n @if (photoLink()) {\r\n <img\r\n class=\"simple-slider-photo__image\"\r\n [alt]=\"photoAlt()\"\r\n [ngSrc]=\"photoLink()!\"\r\n [width]=\"cardWidth() - 2*cardPadding() - 2*borderWidth()\"\r\n [height]=\"cardHeight() - 2*cardPadding() - 2*borderWidth()\"\r\n />\r\n }\r\n</div>\r\n", styles: [".simple-slider-photo{border-radius:4px;cursor:pointer;border-style:solid}.simple-slider-photo--disabled{opacity:15%}.simple-slider-photo__image{border-radius:4px;object-fit:cover}\n"], dependencies: [{ kind: "directive", type: NgOptimizedImage, selector: "img[ngSrc]", inputs: ["ngSrc", "ngSrcset", "sizes", "width", "height", "decoding", "loading", "priority", "loaderParams", "disableOptimizedSrcset", "fill", "placeholder", "placeholderConfig", "src", "srcset"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
51
|
+
}
|
|
52
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.23", ngImport: i0, type: SimpleSliderPhotoComponent, decorators: [{
|
|
53
|
+
type: Component,
|
|
54
|
+
args: [{ selector: 'simple-slider-photo', imports: [NgOptimizedImage], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\r\n class=\"simple-slider-photo\"\r\n [class.simple-slider-photo--disabled]=\"isDisabled()\"\r\n [style.border-width.px]=\"borderWidth()\"\r\n [style.padding.px]=\"cardPadding()\"\r\n [style.border-color]=\"borderColor\"\r\n (click)=\"changeModel.emit()\"\r\n>\r\n @if (photoLink()) {\r\n <img\r\n class=\"simple-slider-photo__image\"\r\n [alt]=\"photoAlt()\"\r\n [ngSrc]=\"photoLink()!\"\r\n [width]=\"cardWidth() - 2*cardPadding() - 2*borderWidth()\"\r\n [height]=\"cardHeight() - 2*cardPadding() - 2*borderWidth()\"\r\n />\r\n }\r\n</div>\r\n", styles: [".simple-slider-photo{border-radius:4px;cursor:pointer;border-style:solid}.simple-slider-photo--disabled{opacity:15%}.simple-slider-photo__image{border-radius:4px;object-fit:cover}\n"] }]
|
|
55
|
+
}], propDecorators: { photoLink: [{ type: i0.Input, args: [{ isSignal: true, alias: "photoLink", required: false }] }], photoAlt: [{ type: i0.Input, args: [{ isSignal: true, alias: "photoAlt", required: false }] }], isActive: [{ type: i0.Input, args: [{ isSignal: true, alias: "isActive", required: false }] }], isDisabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "isDisabled", required: false }] }], cardWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "cardWidth", required: false }] }], cardHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "cardHeight", required: false }] }], borderWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "borderWidth", required: false }] }], cardPadding: [{ type: i0.Input, args: [{ isSignal: true, alias: "cardPadding", required: false }] }], activeBorderColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeBorderColor", required: false }] }], defaultBorderColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "defaultBorderColor", required: false }] }], changeModel: [{ type: i0.Output, args: ["changeModel"] }] } });
|
|
56
|
+
|
|
57
|
+
class SimpleSliderComponent {
|
|
58
|
+
window = inject(WINDOW);
|
|
59
|
+
cdr = inject(ChangeDetectorRef);
|
|
60
|
+
destroyRef = inject(DestroyRef);
|
|
61
|
+
propertyPhotos = input([], ...(ngDevMode ? [{ debugName: "propertyPhotos" }] : /* istanbul ignore next */ []));
|
|
62
|
+
selectedElementIndex = input(0, ...(ngDevMode ? [{ debugName: "selectedElementIndex" }] : /* istanbul ignore next */ []));
|
|
63
|
+
cardWidth = input(60, ...(ngDevMode ? [{ debugName: "cardWidth" }] : /* istanbul ignore next */ []));
|
|
64
|
+
cardHeight = input(90, ...(ngDevMode ? [{ debugName: "cardHeight" }] : /* istanbul ignore next */ []));
|
|
65
|
+
cardMargin = input(10, ...(ngDevMode ? [{ debugName: "cardMargin" }] : /* istanbul ignore next */ []));
|
|
66
|
+
borderWidth = input(1, ...(ngDevMode ? [{ debugName: "borderWidth" }] : /* istanbul ignore next */ []));
|
|
67
|
+
cardPadding = input(2, ...(ngDevMode ? [{ debugName: "cardPadding" }] : /* istanbul ignore next */ []));
|
|
68
|
+
activeBorderColor = input('#1976d2', ...(ngDevMode ? [{ debugName: "activeBorderColor" }] : /* istanbul ignore next */ []));
|
|
69
|
+
defaultBorderColor = input('#fff', ...(ngDevMode ? [{ debugName: "defaultBorderColor" }] : /* istanbul ignore next */ []));
|
|
70
|
+
inactiveIconColor = input('#9e9e9e', ...(ngDevMode ? [{ debugName: "inactiveIconColor" }] : /* istanbul ignore next */ []));
|
|
71
|
+
longClickDelay = input(200, ...(ngDevMode ? [{ debugName: "longClickDelay" }] : /* istanbul ignore next */ []));
|
|
72
|
+
arrowBackgroundColor = input('transparent', ...(ngDevMode ? [{ debugName: "arrowBackgroundColor" }] : /* istanbul ignore next */ []));
|
|
73
|
+
arrowBorderColor = input('transparent', ...(ngDevMode ? [{ debugName: "arrowBorderColor" }] : /* istanbul ignore next */ []));
|
|
74
|
+
arrowBorderWidth = input(0, ...(ngDevMode ? [{ debugName: "arrowBorderWidth" }] : /* istanbul ignore next */ []));
|
|
75
|
+
arrowColor = input('#333', ...(ngDevMode ? [{ debugName: "arrowColor" }] : /* istanbul ignore next */ []));
|
|
76
|
+
touchDelta = input(20, ...(ngDevMode ? [{ debugName: "touchDelta" }] : /* istanbul ignore next */ []));
|
|
77
|
+
arrowWidth = input(36, ...(ngDevMode ? [{ debugName: "arrowWidth" }] : /* istanbul ignore next */ []));
|
|
78
|
+
changeModel = output();
|
|
79
|
+
sliderContainer;
|
|
80
|
+
galleryTrack;
|
|
81
|
+
arrowPrevButton;
|
|
82
|
+
arrowNextButton;
|
|
83
|
+
prevArrowLongPress = false;
|
|
84
|
+
nextArrowLongPress = false;
|
|
85
|
+
_sliderContainer;
|
|
86
|
+
_galleryTrack;
|
|
87
|
+
isNextArrowDisabled = false;
|
|
88
|
+
isPrevArrowDisabled = false;
|
|
89
|
+
photoCount = 0;
|
|
90
|
+
galleryWidth = 0;
|
|
91
|
+
arrowsHidden = false;
|
|
92
|
+
touchStartX = 0;
|
|
93
|
+
touchCurrentX = 0;
|
|
94
|
+
constructor() {
|
|
95
|
+
afterNextRender(() => {
|
|
96
|
+
if (this.sliderContainer) {
|
|
97
|
+
this.initSliderContainer();
|
|
98
|
+
}
|
|
99
|
+
if (this.arrowPrevButton) {
|
|
100
|
+
this.initArrowPrevButtonActions();
|
|
101
|
+
}
|
|
102
|
+
if (this.arrowNextButton) {
|
|
103
|
+
this.initArrowNextButtonActions();
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
syncCardSliderCount = effect(() => {
|
|
108
|
+
const photos = this.propertyPhotos();
|
|
109
|
+
if (photos?.length) {
|
|
110
|
+
this.photoCount = photos.length;
|
|
111
|
+
}
|
|
112
|
+
}, { ...(ngDevMode ? { debugName: "syncCardSliderCount" } : /* istanbul ignore next */ {}), allowSignalWrites: true });
|
|
113
|
+
ngAfterViewInit() {
|
|
114
|
+
if (this.galleryTrack) {
|
|
115
|
+
this.initGalleryTrack();
|
|
116
|
+
this.initWheelAction(this.galleryTrack);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
stepPrevSlider() {
|
|
120
|
+
this.actionSlider(ESliderAction.STEP_PREV);
|
|
121
|
+
}
|
|
122
|
+
stepNextSlider() {
|
|
123
|
+
this.actionSlider(ESliderAction.STEP_NEXT);
|
|
124
|
+
}
|
|
125
|
+
computedPositionSlider() {
|
|
126
|
+
this.actionSlider(ESliderAction.COMPUTE_POSITION);
|
|
127
|
+
}
|
|
128
|
+
actionSlider(action, touchDelta = 0) {
|
|
129
|
+
const countVisibleSlider = Math.floor(this.galleryWidth / (this.cardWidth() + this.cardMargin()));
|
|
130
|
+
let currentMarginLeft = parseInt((this._galleryTrack?.style.marginLeft).replace('px', ''), 10);
|
|
131
|
+
currentMarginLeft = isNaN(currentMarginLeft) ? 0 : currentMarginLeft;
|
|
132
|
+
let computedPositionSlider = 0;
|
|
133
|
+
const maxDelta = -(this.cardWidth() + this.cardMargin()) * this.photoCount + this.galleryWidth;
|
|
134
|
+
let positionSlider = 0;
|
|
135
|
+
switch (action) {
|
|
136
|
+
case ESliderAction.STEP_NEXT: {
|
|
137
|
+
computedPositionSlider = currentMarginLeft - (this.cardWidth() + this.cardMargin());
|
|
138
|
+
positionSlider = Math.max(computedPositionSlider, maxDelta);
|
|
139
|
+
if (positionSlider < maxDelta) {
|
|
140
|
+
positionSlider = maxDelta;
|
|
141
|
+
}
|
|
142
|
+
if (countVisibleSlider >= this.photoCount) {
|
|
143
|
+
positionSlider = 0;
|
|
144
|
+
}
|
|
145
|
+
break;
|
|
146
|
+
}
|
|
147
|
+
case ESliderAction.STEP_PREV: {
|
|
148
|
+
computedPositionSlider = currentMarginLeft + (this.cardWidth() + this.cardMargin());
|
|
149
|
+
positionSlider = Math.min(computedPositionSlider, 0);
|
|
150
|
+
if (positionSlider > 0) {
|
|
151
|
+
positionSlider = 0;
|
|
152
|
+
}
|
|
153
|
+
break;
|
|
154
|
+
}
|
|
155
|
+
case ESliderAction.COMPUTE_POSITION: {
|
|
156
|
+
computedPositionSlider = -(this.cardWidth() + this.cardMargin()) * this.selectedElementIndex();
|
|
157
|
+
positionSlider = Math.max(computedPositionSlider, maxDelta);
|
|
158
|
+
if (positionSlider > 0) {
|
|
159
|
+
positionSlider = 0;
|
|
160
|
+
}
|
|
161
|
+
break;
|
|
162
|
+
}
|
|
163
|
+
case ESliderAction.TOUCH_MOVE: {
|
|
164
|
+
positionSlider = currentMarginLeft + touchDelta;
|
|
165
|
+
if (positionSlider > 0) {
|
|
166
|
+
positionSlider = 0;
|
|
167
|
+
}
|
|
168
|
+
if (positionSlider < maxDelta) {
|
|
169
|
+
positionSlider = maxDelta;
|
|
170
|
+
}
|
|
171
|
+
if (countVisibleSlider >= this.photoCount) {
|
|
172
|
+
positionSlider = 0;
|
|
173
|
+
}
|
|
174
|
+
break;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
if (this._galleryTrack) {
|
|
178
|
+
this._galleryTrack.style.marginLeft = positionSlider + 'px';
|
|
179
|
+
}
|
|
180
|
+
this.isPrevArrowDisabled = positionSlider === 0;
|
|
181
|
+
this.isNextArrowDisabled = maxDelta === positionSlider;
|
|
182
|
+
this.cdr.detectChanges();
|
|
183
|
+
}
|
|
184
|
+
touchStartGallery(evt) {
|
|
185
|
+
const countTouch = evt.touches.length;
|
|
186
|
+
if (countTouch > 1) {
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
this.touchStartX = evt.touches[0].clientX;
|
|
190
|
+
this.touchCurrentX = this.touchStartX;
|
|
191
|
+
}
|
|
192
|
+
touchMoveGallery(evt) {
|
|
193
|
+
if (!this.arrowsHidden) {
|
|
194
|
+
evt.preventDefault();
|
|
195
|
+
}
|
|
196
|
+
const countTouch = evt.touches.length;
|
|
197
|
+
if (countTouch > 1) {
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
const curr = evt.touches[0].clientX;
|
|
201
|
+
const touchDelta = curr - this.touchCurrentX;
|
|
202
|
+
if (Math.abs(touchDelta) > this.touchDelta()) {
|
|
203
|
+
this.actionSlider(ESliderAction.TOUCH_MOVE, touchDelta);
|
|
204
|
+
this.touchCurrentX = curr;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
initGalleryTrack() {
|
|
208
|
+
this._galleryTrack = this.galleryTrack?.nativeElement;
|
|
209
|
+
this.galleryWidth = +(this._galleryTrack?.parentElement?.offsetWidth || 0);
|
|
210
|
+
this.photoCount = this._galleryTrack?.children.length || 0;
|
|
211
|
+
}
|
|
212
|
+
initWheelAction(elementRef) {
|
|
213
|
+
fromEvent(elementRef.nativeElement, 'wheel')
|
|
214
|
+
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
215
|
+
.subscribe((e) => {
|
|
216
|
+
if (!this.arrowsHidden) {
|
|
217
|
+
e.preventDefault();
|
|
218
|
+
}
|
|
219
|
+
const delta = e.deltaY;
|
|
220
|
+
if (delta > 0) {
|
|
221
|
+
this.stepNextSlider();
|
|
222
|
+
}
|
|
223
|
+
else if (delta < 0) {
|
|
224
|
+
this.stepPrevSlider();
|
|
225
|
+
}
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
initSliderContainer() {
|
|
229
|
+
if (!this.window) {
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
this._sliderContainer = this.sliderContainer?.nativeElement;
|
|
233
|
+
const resize$ = fromEvent(this.window, 'resize').pipe(startWith([
|
|
234
|
+
this._sliderContainer?.offsetWidth,
|
|
235
|
+
+(this._galleryTrack?.parentElement?.offsetWidth || 0),
|
|
236
|
+
]), switchMap(() => of([
|
|
237
|
+
+(this._sliderContainer?.offsetWidth || 0),
|
|
238
|
+
+(this._galleryTrack?.parentElement?.offsetWidth || 0),
|
|
239
|
+
])));
|
|
240
|
+
resize$
|
|
241
|
+
.pipe(distinctUntilChanged(), debounceTime(100), takeUntilDestroyed(this.destroyRef))
|
|
242
|
+
.subscribe(([currentWidthPropertyPhotoSlider, galleryUloffsetWidth]) => {
|
|
243
|
+
this.galleryWidth = galleryUloffsetWidth;
|
|
244
|
+
const count = (currentWidthPropertyPhotoSlider - 2 * this.arrowWidth()) /
|
|
245
|
+
(this.cardWidth() + this.cardMargin());
|
|
246
|
+
const countCeil = Math.ceil(count);
|
|
247
|
+
this.arrowsHidden = countCeil > this.photoCount;
|
|
248
|
+
this.computedPositionSlider();
|
|
249
|
+
this.cdr.detectChanges();
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
initArrowPrevButtonActions() {
|
|
253
|
+
if (this.arrowPrevButton) {
|
|
254
|
+
this.initLongTouch(this.arrowPrevButton, EArrowAction.STEP_PREV);
|
|
255
|
+
this.initLongClick(this.arrowPrevButton, EArrowAction.STEP_PREV);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
initArrowNextButtonActions() {
|
|
259
|
+
if (this.arrowNextButton) {
|
|
260
|
+
this.initLongTouch(this.arrowNextButton, EArrowAction.STEP_NEXT);
|
|
261
|
+
this.initLongClick(this.arrowNextButton, EArrowAction.STEP_NEXT);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
initLongTouch(elementRef, typeArrowAction) {
|
|
265
|
+
const touchstart$ = fromEvent(elementRef.nativeElement, 'touchstart');
|
|
266
|
+
const touchend$ = fromEvent(elementRef.nativeElement, 'touchend');
|
|
267
|
+
const longTouch$ = touchstart$.pipe(switchMap((v) => {
|
|
268
|
+
return of(v).pipe(delay(this.longClickDelay()), takeUntil(touchend$));
|
|
269
|
+
}));
|
|
270
|
+
longTouch$
|
|
271
|
+
.pipe(switchMap(() => {
|
|
272
|
+
return interval(1000).pipe(takeUntil(touchend$));
|
|
273
|
+
}), takeUntilDestroyed(this.destroyRef))
|
|
274
|
+
.subscribe(() => {
|
|
275
|
+
switch (typeArrowAction) {
|
|
276
|
+
case EArrowAction.STEP_PREV: {
|
|
277
|
+
this.prevArrowLongPress = true;
|
|
278
|
+
this.stepPrevSlider();
|
|
279
|
+
break;
|
|
280
|
+
}
|
|
281
|
+
case EArrowAction.STEP_NEXT: {
|
|
282
|
+
this.nextArrowLongPress = true;
|
|
283
|
+
this.stepNextSlider();
|
|
284
|
+
break;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
initLongClick(elementRef, typeArrowAction) {
|
|
290
|
+
const mouseUp$ = fromEvent(elementRef.nativeElement, 'mouseup');
|
|
291
|
+
const mouseDown$ = fromEvent(elementRef.nativeElement, 'mousedown');
|
|
292
|
+
const click$ = fromEvent(elementRef.nativeElement, 'click');
|
|
293
|
+
const longClick$ = mouseDown$.pipe(switchMap((v) => {
|
|
294
|
+
return of(v).pipe(delay(this.longClickDelay()), takeUntil(mouseUp$));
|
|
295
|
+
}));
|
|
296
|
+
click$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {
|
|
297
|
+
switch (typeArrowAction) {
|
|
298
|
+
case EArrowAction.STEP_PREV: {
|
|
299
|
+
if (this.prevArrowLongPress) {
|
|
300
|
+
this.prevArrowLongPress = false;
|
|
301
|
+
return;
|
|
302
|
+
}
|
|
303
|
+
this.stepPrevSlider();
|
|
304
|
+
break;
|
|
305
|
+
}
|
|
306
|
+
case EArrowAction.STEP_NEXT: {
|
|
307
|
+
if (this.nextArrowLongPress) {
|
|
308
|
+
this.nextArrowLongPress = false;
|
|
309
|
+
return;
|
|
310
|
+
}
|
|
311
|
+
this.stepNextSlider();
|
|
312
|
+
break;
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
});
|
|
316
|
+
longClick$
|
|
317
|
+
.pipe(switchMap(() => {
|
|
318
|
+
return interval(1000).pipe(takeUntil(mouseUp$));
|
|
319
|
+
}), takeUntilDestroyed(this.destroyRef))
|
|
320
|
+
.subscribe(() => {
|
|
321
|
+
switch (typeArrowAction) {
|
|
322
|
+
case EArrowAction.STEP_PREV: {
|
|
323
|
+
this.prevArrowLongPress = true;
|
|
324
|
+
this.stepPrevSlider();
|
|
325
|
+
break;
|
|
326
|
+
}
|
|
327
|
+
case EArrowAction.STEP_NEXT: {
|
|
328
|
+
this.nextArrowLongPress = true;
|
|
329
|
+
this.stepNextSlider();
|
|
330
|
+
break;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.23", ngImport: i0, type: SimpleSliderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
336
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.23", type: SimpleSliderComponent, isStandalone: true, selector: "lib-simple-slider", inputs: { propertyPhotos: { classPropertyName: "propertyPhotos", publicName: "propertyPhotos", isSignal: true, isRequired: false, transformFunction: null }, selectedElementIndex: { classPropertyName: "selectedElementIndex", publicName: "selectedElementIndex", isSignal: true, isRequired: false, transformFunction: null }, cardWidth: { classPropertyName: "cardWidth", publicName: "cardWidth", isSignal: true, isRequired: false, transformFunction: null }, cardHeight: { classPropertyName: "cardHeight", publicName: "cardHeight", isSignal: true, isRequired: false, transformFunction: null }, cardMargin: { classPropertyName: "cardMargin", publicName: "cardMargin", isSignal: true, isRequired: false, transformFunction: null }, borderWidth: { classPropertyName: "borderWidth", publicName: "borderWidth", isSignal: true, isRequired: false, transformFunction: null }, cardPadding: { classPropertyName: "cardPadding", publicName: "cardPadding", isSignal: true, isRequired: false, transformFunction: null }, activeBorderColor: { classPropertyName: "activeBorderColor", publicName: "activeBorderColor", isSignal: true, isRequired: false, transformFunction: null }, defaultBorderColor: { classPropertyName: "defaultBorderColor", publicName: "defaultBorderColor", isSignal: true, isRequired: false, transformFunction: null }, inactiveIconColor: { classPropertyName: "inactiveIconColor", publicName: "inactiveIconColor", isSignal: true, isRequired: false, transformFunction: null }, longClickDelay: { classPropertyName: "longClickDelay", publicName: "longClickDelay", isSignal: true, isRequired: false, transformFunction: null }, arrowBackgroundColor: { classPropertyName: "arrowBackgroundColor", publicName: "arrowBackgroundColor", isSignal: true, isRequired: false, transformFunction: null }, arrowBorderColor: { classPropertyName: "arrowBorderColor", publicName: "arrowBorderColor", isSignal: true, isRequired: false, transformFunction: null }, arrowBorderWidth: { classPropertyName: "arrowBorderWidth", publicName: "arrowBorderWidth", isSignal: true, isRequired: false, transformFunction: null }, arrowColor: { classPropertyName: "arrowColor", publicName: "arrowColor", isSignal: true, isRequired: false, transformFunction: null }, touchDelta: { classPropertyName: "touchDelta", publicName: "touchDelta", isSignal: true, isRequired: false, transformFunction: null }, arrowWidth: { classPropertyName: "arrowWidth", publicName: "arrowWidth", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { changeModel: "changeModel" }, providers: [WINDOW_PROVIDERS], viewQueries: [{ propertyName: "sliderContainer", first: true, predicate: ["sliderContainer"], descendants: true, read: ElementRef }, { propertyName: "galleryTrack", first: true, predicate: ["galleryTrack"], descendants: true, read: ElementRef }, { propertyName: "arrowPrevButton", first: true, predicate: ["arrowPrevButton"], descendants: true, read: ElementRef }, { propertyName: "arrowNextButton", first: true, predicate: ["arrowNextButton"], descendants: true, read: ElementRef }], ngImport: i0, template: "<div class=\"simple-slider\" #sliderContainer>\r\n <div class=\"simple-slider__arrow simple-slider__arrow--prev\" [class.simple-slider__arrow--hidden]=\"arrowsHidden\">\r\n <button\r\n class=\"simple-slider__button\"\r\n type=\"button\"\r\n #arrowPrevButton\r\n [style.background-color]=\"arrowBackgroundColor()\"\r\n [style.border-color]=\"arrowBorderColor()\"\r\n [style.border-width.px]=\"arrowBorderWidth()\"\r\n style=\"border-style: solid\"\r\n >\r\n <svg class=\"simple-slider__icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" [style.color]=\"isPrevArrowDisabled ? inactiveIconColor() : arrowColor()\">\r\n <path fill=\"currentColor\" d=\"M20.547 21.453l-6.107-6.12 6.107-6.12-1.88-1.88-8 8 8 8z\"></path>\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n <div class=\"simple-slider__gallery\">\r\n <ul class=\"simple-slider__track\" #galleryTrack (touchstart)=\"touchStartGallery($event)\" (touchmove)=\"touchMoveGallery($event)\">\r\n @for (photo of propertyPhotos(); let i = $index; track photo.url) {\r\n <li class=\"simple-slider__item\" [style.margin-right.px]=\"cardMargin()\">\r\n <simple-slider-photo\r\n [photoLink]=\"photo.url\"\r\n [photoAlt]=\"photo.alt\"\r\n [isDisabled]=\"photo.disabled || false\"\r\n [isActive]=\"i === selectedElementIndex()\"\r\n [cardWidth]=\"cardWidth()\"\r\n [cardHeight]=\"cardHeight()\"\r\n [borderWidth]=\"borderWidth()\"\r\n [cardPadding]=\"cardPadding()\"\r\n [activeBorderColor]=\"activeBorderColor()\"\r\n [defaultBorderColor]=\"defaultBorderColor()\"\r\n (changeModel)=\"changeModel.emit(i)\"\r\n ></simple-slider-photo>\r\n </li>\r\n }\r\n </ul>\r\n </div>\r\n\r\n <div class=\"simple-slider__arrow simple-slider__arrow--next\" [class.simple-slider__arrow--hidden]=\"arrowsHidden\">\r\n <button\r\n class=\"simple-slider__button\"\r\n type=\"button\"\r\n #arrowNextButton\r\n [style.background-color]=\"arrowBackgroundColor()\"\r\n [style.border-color]=\"arrowBorderColor()\"\r\n [style.border-width.px]=\"arrowBorderWidth()\"\r\n style=\"border-style: solid\"\r\n >\r\n <svg class=\"simple-slider__icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" [style.color]=\"isNextArrowDisabled ? inactiveIconColor() : arrowColor()\">\r\n <path fill=\"currentColor\" d=\"M11.453 21.787l6.107-6.12-6.107-6.12 1.88-1.88 8 8-8 8z\"></path>\r\n </svg>\r\n </button>\r\n </div>\r\n</div>\r\n", styles: [".simple-slider{display:flex;line-height:normal;-webkit-user-select:none;user-select:none}.simple-slider__arrow{touch-action:manipulation;min-width:36px}.simple-slider__arrow--hidden{display:none}.simple-slider__button{height:100%;width:100%;cursor:pointer;padding:0;display:flex;align-items:center;justify-content:center}.simple-slider__icon{width:24px;height:24px}.simple-slider__gallery{overflow:hidden;flex-grow:1}.simple-slider__track{display:flex;margin:0;padding:0;list-style:none;transition:margin-left .25s;font-size:0}.simple-slider__item{display:inline-block}\n"], dependencies: [{ kind: "component", type: SimpleSliderPhotoComponent, selector: "simple-slider-photo", inputs: ["photoLink", "photoAlt", "isActive", "isDisabled", "cardWidth", "cardHeight", "borderWidth", "cardPadding", "activeBorderColor", "defaultBorderColor"], outputs: ["changeModel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
337
|
+
}
|
|
338
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.23", ngImport: i0, type: SimpleSliderComponent, decorators: [{
|
|
339
|
+
type: Component,
|
|
340
|
+
args: [{ selector: 'lib-simple-slider', imports: [SimpleSliderPhotoComponent], providers: [WINDOW_PROVIDERS], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"simple-slider\" #sliderContainer>\r\n <div class=\"simple-slider__arrow simple-slider__arrow--prev\" [class.simple-slider__arrow--hidden]=\"arrowsHidden\">\r\n <button\r\n class=\"simple-slider__button\"\r\n type=\"button\"\r\n #arrowPrevButton\r\n [style.background-color]=\"arrowBackgroundColor()\"\r\n [style.border-color]=\"arrowBorderColor()\"\r\n [style.border-width.px]=\"arrowBorderWidth()\"\r\n style=\"border-style: solid\"\r\n >\r\n <svg class=\"simple-slider__icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" [style.color]=\"isPrevArrowDisabled ? inactiveIconColor() : arrowColor()\">\r\n <path fill=\"currentColor\" d=\"M20.547 21.453l-6.107-6.12 6.107-6.12-1.88-1.88-8 8 8 8z\"></path>\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n <div class=\"simple-slider__gallery\">\r\n <ul class=\"simple-slider__track\" #galleryTrack (touchstart)=\"touchStartGallery($event)\" (touchmove)=\"touchMoveGallery($event)\">\r\n @for (photo of propertyPhotos(); let i = $index; track photo.url) {\r\n <li class=\"simple-slider__item\" [style.margin-right.px]=\"cardMargin()\">\r\n <simple-slider-photo\r\n [photoLink]=\"photo.url\"\r\n [photoAlt]=\"photo.alt\"\r\n [isDisabled]=\"photo.disabled || false\"\r\n [isActive]=\"i === selectedElementIndex()\"\r\n [cardWidth]=\"cardWidth()\"\r\n [cardHeight]=\"cardHeight()\"\r\n [borderWidth]=\"borderWidth()\"\r\n [cardPadding]=\"cardPadding()\"\r\n [activeBorderColor]=\"activeBorderColor()\"\r\n [defaultBorderColor]=\"defaultBorderColor()\"\r\n (changeModel)=\"changeModel.emit(i)\"\r\n ></simple-slider-photo>\r\n </li>\r\n }\r\n </ul>\r\n </div>\r\n\r\n <div class=\"simple-slider__arrow simple-slider__arrow--next\" [class.simple-slider__arrow--hidden]=\"arrowsHidden\">\r\n <button\r\n class=\"simple-slider__button\"\r\n type=\"button\"\r\n #arrowNextButton\r\n [style.background-color]=\"arrowBackgroundColor()\"\r\n [style.border-color]=\"arrowBorderColor()\"\r\n [style.border-width.px]=\"arrowBorderWidth()\"\r\n style=\"border-style: solid\"\r\n >\r\n <svg class=\"simple-slider__icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" [style.color]=\"isNextArrowDisabled ? inactiveIconColor() : arrowColor()\">\r\n <path fill=\"currentColor\" d=\"M11.453 21.787l6.107-6.12-6.107-6.12 1.88-1.88 8 8-8 8z\"></path>\r\n </svg>\r\n </button>\r\n </div>\r\n</div>\r\n", styles: [".simple-slider{display:flex;line-height:normal;-webkit-user-select:none;user-select:none}.simple-slider__arrow{touch-action:manipulation;min-width:36px}.simple-slider__arrow--hidden{display:none}.simple-slider__button{height:100%;width:100%;cursor:pointer;padding:0;display:flex;align-items:center;justify-content:center}.simple-slider__icon{width:24px;height:24px}.simple-slider__gallery{overflow:hidden;flex-grow:1}.simple-slider__track{display:flex;margin:0;padding:0;list-style:none;transition:margin-left .25s;font-size:0}.simple-slider__item{display:inline-block}\n"] }]
|
|
341
|
+
}], ctorParameters: () => [], propDecorators: { propertyPhotos: [{ type: i0.Input, args: [{ isSignal: true, alias: "propertyPhotos", required: false }] }], selectedElementIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedElementIndex", required: false }] }], cardWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "cardWidth", required: false }] }], cardHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "cardHeight", required: false }] }], cardMargin: [{ type: i0.Input, args: [{ isSignal: true, alias: "cardMargin", required: false }] }], borderWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "borderWidth", required: false }] }], cardPadding: [{ type: i0.Input, args: [{ isSignal: true, alias: "cardPadding", required: false }] }], activeBorderColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeBorderColor", required: false }] }], defaultBorderColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "defaultBorderColor", required: false }] }], inactiveIconColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "inactiveIconColor", required: false }] }], longClickDelay: [{ type: i0.Input, args: [{ isSignal: true, alias: "longClickDelay", required: false }] }], arrowBackgroundColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "arrowBackgroundColor", required: false }] }], arrowBorderColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "arrowBorderColor", required: false }] }], arrowBorderWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "arrowBorderWidth", required: false }] }], arrowColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "arrowColor", required: false }] }], touchDelta: [{ type: i0.Input, args: [{ isSignal: true, alias: "touchDelta", required: false }] }], arrowWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "arrowWidth", required: false }] }], changeModel: [{ type: i0.Output, args: ["changeModel"] }], sliderContainer: [{
|
|
342
|
+
type: ViewChild,
|
|
343
|
+
args: ['sliderContainer', { static: false, read: ElementRef }]
|
|
344
|
+
}], galleryTrack: [{
|
|
345
|
+
type: ViewChild,
|
|
346
|
+
args: ['galleryTrack', { static: false, read: ElementRef }]
|
|
347
|
+
}], arrowPrevButton: [{
|
|
348
|
+
type: ViewChild,
|
|
349
|
+
args: ['arrowPrevButton', { static: false, read: ElementRef }]
|
|
350
|
+
}], arrowNextButton: [{
|
|
351
|
+
type: ViewChild,
|
|
352
|
+
args: ['arrowNextButton', { static: false, read: ElementRef }]
|
|
353
|
+
}] } });
|
|
354
|
+
|
|
355
|
+
/*
|
|
356
|
+
* Public API Surface of simple-slider
|
|
357
|
+
*/
|
|
358
|
+
|
|
359
|
+
/**
|
|
360
|
+
* Generated bundle index. Do not edit.
|
|
361
|
+
*/
|
|
362
|
+
|
|
363
|
+
export { SimpleSliderComponent };
|
|
364
|
+
//# sourceMappingURL=severfam-simple-slider-angular.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"severfam-simple-slider-angular.mjs","sources":["../../../projects/simple-slider/src/lib/providers/window.providers.ts","../../../projects/simple-slider/src/lib/enums/slider.enums.ts","../../../projects/simple-slider/src/lib/components/simple-slider-photo/simple-slider-photo.component.ts","../../../projects/simple-slider/src/lib/components/simple-slider-photo/simple-slider-photo.component.html","../../../projects/simple-slider/src/lib/simple-slider.component.ts","../../../projects/simple-slider/src/lib/simple-slider.component.html","../../../projects/simple-slider/src/public-api.ts","../../../projects/simple-slider/src/severfam-simple-slider-angular.ts"],"sourcesContent":["import { FactoryProvider, InjectionToken, PLATFORM_ID } from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\n\r\n\r\nexport const WINDOW = new InjectionToken<Window>('window');\r\n\r\n\r\n/* eslint-disable @typescript-eslint/no-explicit-any */\r\nconst windowProvider: FactoryProvider = {\r\n provide: WINDOW,\r\n useFactory: (platformId: any) => {\r\n if (isPlatformBrowser(platformId)) {\r\n return window;\r\n }\r\n return {};\r\n },\r\n deps: [PLATFORM_ID],\r\n};\r\n\r\nexport const WINDOW_PROVIDERS = [windowProvider];\r\n","export enum ESliderAction {\n COMPUTE_POSITION = 'computePosition',\n STEP_NEXT = 'stepNext',\n STEP_PREV = 'stepPrev',\n TOUCH_MOVE = 'touchMove',\n}\n\nexport enum EArrowAction {\n STEP_NEXT = 'stepNext',\n STEP_PREV = 'stepPrev',\n}\n","import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\r\nimport { NgOptimizedImage } from '@angular/common';\r\nimport { SafeResourceUrl } from '@angular/platform-browser';\r\n\r\n@Component({\r\n selector: 'simple-slider-photo',\r\n templateUrl: './simple-slider-photo.component.html',\r\n styleUrls: ['./simple-slider-photo.component.scss'],\r\n imports: [NgOptimizedImage],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class SimpleSliderPhotoComponent {\r\n photoLink = input<string | SafeResourceUrl>();\r\n photoAlt = input('');\r\n isActive = input(false);\r\n isDisabled = input(false);\r\n cardWidth = input(0);\r\n cardHeight = input(0);\r\n borderWidth = input(0);\r\n cardPadding = input(0);\r\n activeBorderColor = input('#1976d2');\r\n defaultBorderColor = input('#fff');\r\n\r\n changeModel = output<void>();\r\n\r\n get borderColor(): string {\r\n return this.isActive() ? this.activeBorderColor() : this.defaultBorderColor();\r\n }\r\n}\r\n","<div\r\n class=\"simple-slider-photo\"\r\n [class.simple-slider-photo--disabled]=\"isDisabled()\"\r\n [style.border-width.px]=\"borderWidth()\"\r\n [style.padding.px]=\"cardPadding()\"\r\n [style.border-color]=\"borderColor\"\r\n (click)=\"changeModel.emit()\"\r\n>\r\n @if (photoLink()) {\r\n <img\r\n class=\"simple-slider-photo__image\"\r\n [alt]=\"photoAlt()\"\r\n [ngSrc]=\"photoLink()!\"\r\n [width]=\"cardWidth() - 2*cardPadding() - 2*borderWidth()\"\r\n [height]=\"cardHeight() - 2*cardPadding() - 2*borderWidth()\"\r\n />\r\n }\r\n</div>\r\n","import {\r\n afterNextRender,\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n DestroyRef,\r\n effect,\r\n ElementRef,\r\n inject,\r\n input,\r\n output,\r\n ViewChild,\r\n} from '@angular/core';\r\nimport { WINDOW, WINDOW_PROVIDERS } from './providers/window.providers';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport {\r\n debounceTime,\r\n fromEvent,\r\n startWith,\r\n switchMap,\r\n distinctUntilChanged,\r\n of,\r\n delay,\r\n takeUntil,\r\n interval,\r\n} from 'rxjs';\r\nimport { EArrowAction, ESliderAction } from './enums/slider.enums';\r\nimport { ISliderPhoto } from './interfaces/slider.interface';\r\nimport { SimpleSliderPhotoComponent } from './components/simple-slider-photo/simple-slider-photo.component';\r\n\r\n@Component({\r\n selector: 'lib-simple-slider',\r\n templateUrl: './simple-slider.component.html',\r\n styleUrls: ['./simple-slider.component.scss'],\r\n imports: [SimpleSliderPhotoComponent],\r\n providers: [WINDOW_PROVIDERS],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class SimpleSliderComponent implements AfterViewInit {\r\n private readonly window = inject(WINDOW);\r\n\r\n private readonly cdr = inject(ChangeDetectorRef);\r\n\r\n private readonly destroyRef = inject(DestroyRef);\r\n\r\n propertyPhotos = input<ISliderPhoto[]>([]);\r\n selectedElementIndex = input(0);\r\n cardWidth = input(60);\r\n cardHeight = input(90);\r\n cardMargin = input(10);\r\n borderWidth = input(1);\r\n cardPadding = input(2);\r\n activeBorderColor = input('#1976d2');\r\n defaultBorderColor = input('#fff');\r\n inactiveIconColor = input('#9e9e9e');\r\n longClickDelay = input(200);\r\n arrowBackgroundColor = input('transparent');\r\n arrowBorderColor = input('transparent');\r\n arrowBorderWidth = input(0);\r\n arrowColor = input('#333');\r\n touchDelta = input(20);\r\n arrowWidth = input(36);\r\n\r\n changeModel = output<number>();\r\n\r\n @ViewChild('sliderContainer', { static: false, read: ElementRef })\r\n sliderContainer?: ElementRef;\r\n @ViewChild('galleryTrack', { static: false, read: ElementRef })\r\n galleryTrack?: ElementRef;\r\n @ViewChild('arrowPrevButton', { static: false, read: ElementRef })\r\n arrowPrevButton?: ElementRef;\r\n @ViewChild('arrowNextButton', { static: false, read: ElementRef })\r\n arrowNextButton?: ElementRef;\r\n\r\n prevArrowLongPress = false;\r\n nextArrowLongPress = false;\r\n\r\n private _sliderContainer?: HTMLDivElement;\r\n private _galleryTrack?: HTMLDivElement;\r\n\r\n isNextArrowDisabled = false;\r\n isPrevArrowDisabled = false;\r\n\r\n photoCount = 0;\r\n galleryWidth = 0;\r\n arrowsHidden = false;\r\n\r\n touchStartX = 0;\r\n touchCurrentX = 0;\r\n\r\n constructor() {\r\n afterNextRender(() => {\r\n if (this.sliderContainer) {\r\n this.initSliderContainer();\r\n }\r\n\r\n if (this.arrowPrevButton) {\r\n this.initArrowPrevButtonActions();\r\n }\r\n\r\n if (this.arrowNextButton) {\r\n this.initArrowNextButtonActions();\r\n }\r\n });\r\n }\r\n\r\n private syncCardSliderCount = effect(() => {\r\n const photos = this.propertyPhotos();\r\n if (photos?.length) {\r\n this.photoCount = photos.length;\r\n }\r\n }, { allowSignalWrites: true });\r\n\r\n ngAfterViewInit() {\r\n if (this.galleryTrack) {\r\n this.initGalleryTrack();\r\n this.initWheelAction(this.galleryTrack);\r\n }\r\n }\r\n\r\n public stepPrevSlider(): void {\r\n this.actionSlider(ESliderAction.STEP_PREV);\r\n }\r\n\r\n public stepNextSlider(): void {\r\n this.actionSlider(ESliderAction.STEP_NEXT);\r\n }\r\n\r\n public computedPositionSlider(): void {\r\n this.actionSlider(ESliderAction.COMPUTE_POSITION);\r\n }\r\n\r\n private actionSlider(action: ESliderAction, touchDelta = 0): void {\r\n const countVisibleSlider = Math.floor(this.galleryWidth / (this.cardWidth() + this.cardMargin()));\r\n\r\n let currentMarginLeft = parseInt(\r\n (this._galleryTrack?.style.marginLeft as string).replace('px', ''),\r\n 10,\r\n );\r\n currentMarginLeft = isNaN(currentMarginLeft) ? 0 : currentMarginLeft;\r\n\r\n let computedPositionSlider = 0;\r\n const maxDelta = -(this.cardWidth() + this.cardMargin()) * this.photoCount + this.galleryWidth;\r\n let positionSlider = 0;\r\n\r\n switch (action) {\r\n case ESliderAction.STEP_NEXT: {\r\n computedPositionSlider = currentMarginLeft - (this.cardWidth() + this.cardMargin());\r\n positionSlider = Math.max(computedPositionSlider, maxDelta);\r\n\r\n if (positionSlider < maxDelta) {\r\n positionSlider = maxDelta;\r\n }\r\n\r\n if (countVisibleSlider >= this.photoCount) {\r\n positionSlider = 0;\r\n }\r\n\r\n break;\r\n }\r\n\r\n case ESliderAction.STEP_PREV: {\r\n computedPositionSlider = currentMarginLeft + (this.cardWidth() + this.cardMargin());\r\n positionSlider = Math.min(computedPositionSlider, 0);\r\n\r\n if (positionSlider > 0) {\r\n positionSlider = 0;\r\n }\r\n\r\n break;\r\n }\r\n\r\n case ESliderAction.COMPUTE_POSITION: {\r\n computedPositionSlider = -(this.cardWidth() + this.cardMargin()) * this.selectedElementIndex();\r\n positionSlider = Math.max(computedPositionSlider, maxDelta);\r\n\r\n if (positionSlider > 0) {\r\n positionSlider = 0;\r\n }\r\n\r\n break;\r\n }\r\n\r\n case ESliderAction.TOUCH_MOVE: {\r\n positionSlider = currentMarginLeft + touchDelta;\r\n\r\n if (positionSlider > 0) {\r\n positionSlider = 0;\r\n }\r\n\r\n if (positionSlider < maxDelta) {\r\n positionSlider = maxDelta;\r\n }\r\n\r\n if (countVisibleSlider >= this.photoCount) {\r\n positionSlider = 0;\r\n }\r\n\r\n break;\r\n }\r\n }\r\n\r\n if (this._galleryTrack) {\r\n this._galleryTrack.style.marginLeft = positionSlider + 'px';\r\n }\r\n\r\n this.isPrevArrowDisabled = positionSlider === 0;\r\n this.isNextArrowDisabled = maxDelta === positionSlider;\r\n\r\n this.cdr.detectChanges();\r\n }\r\n\r\n public touchStartGallery(evt: TouchEvent) {\r\n const countTouch = evt.touches.length;\r\n\r\n if (countTouch > 1) {\r\n return;\r\n }\r\n\r\n this.touchStartX = evt.touches[0].clientX;\r\n this.touchCurrentX = this.touchStartX;\r\n }\r\n\r\n public touchMoveGallery(evt: TouchEvent) {\r\n if (!this.arrowsHidden) {\r\n evt.preventDefault();\r\n }\r\n\r\n const countTouch = evt.touches.length;\r\n\r\n if (countTouch > 1) {\r\n return;\r\n }\r\n const curr = evt.touches[0].clientX;\r\n const touchDelta = curr - this.touchCurrentX;\r\n\r\n if (Math.abs(touchDelta) > this.touchDelta()) {\r\n this.actionSlider(ESliderAction.TOUCH_MOVE, touchDelta);\r\n this.touchCurrentX = curr;\r\n }\r\n }\r\n\r\n private initGalleryTrack() {\r\n this._galleryTrack = this.galleryTrack?.nativeElement;\r\n this.galleryWidth = +(this._galleryTrack?.parentElement?.offsetWidth || 0);\r\n this.photoCount = this._galleryTrack?.children.length || 0;\r\n }\r\n\r\n private initWheelAction(elementRef: ElementRef) {\r\n fromEvent<WheelEvent>(elementRef.nativeElement, 'wheel')\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(\r\n (e: WheelEvent) => {\r\n if (!this.arrowsHidden) {\r\n e.preventDefault();\r\n }\r\n const delta = e.deltaY;\r\n if (delta > 0) {\r\n this.stepNextSlider();\r\n } else if (delta < 0) {\r\n this.stepPrevSlider();\r\n }\r\n },\r\n );\r\n }\r\n\r\n private initSliderContainer() {\r\n if (!this.window) {\r\n return;\r\n }\r\n\r\n this._sliderContainer = this.sliderContainer?.nativeElement;\r\n\r\n const resize$ = fromEvent(this.window, 'resize').pipe(\r\n startWith([\r\n this._sliderContainer?.offsetWidth,\r\n +(this._galleryTrack?.parentElement?.offsetWidth || 0),\r\n ]),\r\n switchMap(() =>\r\n of([\r\n +(this._sliderContainer?.offsetWidth || 0),\r\n +(this._galleryTrack?.parentElement?.offsetWidth || 0),\r\n ]),\r\n ),\r\n );\r\n\r\n resize$\r\n .pipe(distinctUntilChanged(), debounceTime(100), takeUntilDestroyed(this.destroyRef))\r\n .subscribe(([currentWidthPropertyPhotoSlider, galleryUloffsetWidth]) => {\r\n this.galleryWidth = galleryUloffsetWidth;\r\n const count =\r\n (currentWidthPropertyPhotoSlider - 2 * this.arrowWidth()) /\r\n (this.cardWidth() + this.cardMargin());\r\n const countCeil = Math.ceil(count);\r\n\r\n this.arrowsHidden = countCeil > this.photoCount;\r\n this.computedPositionSlider();\r\n\r\n this.cdr.detectChanges();\r\n });\r\n }\r\n\r\n private initArrowPrevButtonActions() {\r\n if (this.arrowPrevButton) {\r\n this.initLongTouch(this.arrowPrevButton, EArrowAction.STEP_PREV);\r\n this.initLongClick(this.arrowPrevButton, EArrowAction.STEP_PREV);\r\n }\r\n }\r\n\r\n private initArrowNextButtonActions() {\r\n if (this.arrowNextButton) {\r\n this.initLongTouch(this.arrowNextButton, EArrowAction.STEP_NEXT);\r\n this.initLongClick(this.arrowNextButton, EArrowAction.STEP_NEXT);\r\n }\r\n }\r\n\r\n private initLongTouch(elementRef: ElementRef, typeArrowAction: EArrowAction) {\r\n const touchstart$ = fromEvent(elementRef.nativeElement, 'touchstart');\r\n const touchend$ = fromEvent(elementRef.nativeElement, 'touchend');\r\n\r\n const longTouch$ = touchstart$.pipe(\r\n switchMap((v) => {\r\n return of(v).pipe(delay(this.longClickDelay()), takeUntil(touchend$));\r\n }),\r\n );\r\n\r\n longTouch$\r\n .pipe(\r\n switchMap(() => {\r\n return interval(1000).pipe(takeUntil(touchend$));\r\n }),\r\n takeUntilDestroyed(this.destroyRef),\r\n )\r\n .subscribe(() => {\r\n switch (typeArrowAction) {\r\n case EArrowAction.STEP_PREV: {\r\n this.prevArrowLongPress = true;\r\n this.stepPrevSlider();\r\n break;\r\n }\r\n case EArrowAction.STEP_NEXT: {\r\n this.nextArrowLongPress = true;\r\n this.stepNextSlider();\r\n break;\r\n }\r\n }\r\n });\r\n }\r\n\r\n private initLongClick(elementRef: ElementRef, typeArrowAction: EArrowAction) {\r\n const mouseUp$ = fromEvent(elementRef.nativeElement, 'mouseup');\r\n const mouseDown$ = fromEvent(elementRef.nativeElement, 'mousedown');\r\n const click$ = fromEvent(elementRef.nativeElement, 'click');\r\n\r\n const longClick$ = mouseDown$.pipe(\r\n switchMap((v) => {\r\n return of(v).pipe(delay(this.longClickDelay()), takeUntil(mouseUp$));\r\n }),\r\n );\r\n\r\n click$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {\r\n switch (typeArrowAction) {\r\n case EArrowAction.STEP_PREV: {\r\n if (this.prevArrowLongPress) {\r\n this.prevArrowLongPress = false;\r\n return;\r\n }\r\n this.stepPrevSlider();\r\n break;\r\n }\r\n case EArrowAction.STEP_NEXT: {\r\n if (this.nextArrowLongPress) {\r\n this.nextArrowLongPress = false;\r\n return;\r\n }\r\n this.stepNextSlider();\r\n break;\r\n }\r\n }\r\n });\r\n\r\n longClick$\r\n .pipe(\r\n switchMap(() => {\r\n return interval(1000).pipe(takeUntil(mouseUp$));\r\n }),\r\n takeUntilDestroyed(this.destroyRef),\r\n )\r\n .subscribe(() => {\r\n switch (typeArrowAction) {\r\n case EArrowAction.STEP_PREV: {\r\n this.prevArrowLongPress = true;\r\n this.stepPrevSlider();\r\n break;\r\n }\r\n case EArrowAction.STEP_NEXT: {\r\n this.nextArrowLongPress = true;\r\n this.stepNextSlider();\r\n break;\r\n }\r\n }\r\n });\r\n }\r\n}\r\n","<div class=\"simple-slider\" #sliderContainer>\r\n <div class=\"simple-slider__arrow simple-slider__arrow--prev\" [class.simple-slider__arrow--hidden]=\"arrowsHidden\">\r\n <button\r\n class=\"simple-slider__button\"\r\n type=\"button\"\r\n #arrowPrevButton\r\n [style.background-color]=\"arrowBackgroundColor()\"\r\n [style.border-color]=\"arrowBorderColor()\"\r\n [style.border-width.px]=\"arrowBorderWidth()\"\r\n style=\"border-style: solid\"\r\n >\r\n <svg class=\"simple-slider__icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" [style.color]=\"isPrevArrowDisabled ? inactiveIconColor() : arrowColor()\">\r\n <path fill=\"currentColor\" d=\"M20.547 21.453l-6.107-6.12 6.107-6.12-1.88-1.88-8 8 8 8z\"></path>\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n <div class=\"simple-slider__gallery\">\r\n <ul class=\"simple-slider__track\" #galleryTrack (touchstart)=\"touchStartGallery($event)\" (touchmove)=\"touchMoveGallery($event)\">\r\n @for (photo of propertyPhotos(); let i = $index; track photo.url) {\r\n <li class=\"simple-slider__item\" [style.margin-right.px]=\"cardMargin()\">\r\n <simple-slider-photo\r\n [photoLink]=\"photo.url\"\r\n [photoAlt]=\"photo.alt\"\r\n [isDisabled]=\"photo.disabled || false\"\r\n [isActive]=\"i === selectedElementIndex()\"\r\n [cardWidth]=\"cardWidth()\"\r\n [cardHeight]=\"cardHeight()\"\r\n [borderWidth]=\"borderWidth()\"\r\n [cardPadding]=\"cardPadding()\"\r\n [activeBorderColor]=\"activeBorderColor()\"\r\n [defaultBorderColor]=\"defaultBorderColor()\"\r\n (changeModel)=\"changeModel.emit(i)\"\r\n ></simple-slider-photo>\r\n </li>\r\n }\r\n </ul>\r\n </div>\r\n\r\n <div class=\"simple-slider__arrow simple-slider__arrow--next\" [class.simple-slider__arrow--hidden]=\"arrowsHidden\">\r\n <button\r\n class=\"simple-slider__button\"\r\n type=\"button\"\r\n #arrowNextButton\r\n [style.background-color]=\"arrowBackgroundColor()\"\r\n [style.border-color]=\"arrowBorderColor()\"\r\n [style.border-width.px]=\"arrowBorderWidth()\"\r\n style=\"border-style: solid\"\r\n >\r\n <svg class=\"simple-slider__icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" [style.color]=\"isNextArrowDisabled ? inactiveIconColor() : arrowColor()\">\r\n <path fill=\"currentColor\" d=\"M11.453 21.787l6.107-6.12-6.107-6.12 1.88-1.88 8 8-8 8z\"></path>\r\n </svg>\r\n </button>\r\n </div>\r\n</div>\r\n","/*\n * Public API Surface of simple-slider\n */\n\nexport * from './lib/simple-slider.component';\nexport * from './lib/interfaces/slider.interface';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;AAIO,MAAM,MAAM,GAAG,IAAI,cAAc,CAAS,QAAQ,CAAC;AAG1D;AACA,MAAM,cAAc,GAAoB;AACtC,IAAA,OAAO,EAAE,MAAM;AACf,IAAA,UAAU,EAAE,CAAC,UAAe,KAAI;AAC9B,QAAA,IAAI,iBAAiB,CAAC,UAAU,CAAC,EAAE;AACjC,YAAA,OAAO,MAAM;QACf;AACA,QAAA,OAAO,EAAE;IACX,CAAC;IACD,IAAI,EAAE,CAAC,WAAW,CAAC;CACpB;AAEM,MAAM,gBAAgB,GAAG,CAAC,cAAc,CAAC;;ACnBhD,IAAY,aAKX;AALD,CAAA,UAAY,aAAa,EAAA;AACvB,IAAA,aAAA,CAAA,kBAAA,CAAA,GAAA,iBAAoC;AACpC,IAAA,aAAA,CAAA,WAAA,CAAA,GAAA,UAAsB;AACtB,IAAA,aAAA,CAAA,WAAA,CAAA,GAAA,UAAsB;AACtB,IAAA,aAAA,CAAA,YAAA,CAAA,GAAA,WAAwB;AAC1B,CAAC,EALW,aAAa,KAAb,aAAa,GAAA,EAAA,CAAA,CAAA;AAOzB,IAAY,YAGX;AAHD,CAAA,UAAY,YAAY,EAAA;AACtB,IAAA,YAAA,CAAA,WAAA,CAAA,GAAA,UAAsB;AACtB,IAAA,YAAA,CAAA,WAAA,CAAA,GAAA,UAAsB;AACxB,CAAC,EAHW,YAAY,KAAZ,YAAY,GAAA,EAAA,CAAA,CAAA;;MCIX,0BAA0B,CAAA;IACrC,SAAS,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAA4B;AAC7C,IAAA,QAAQ,GAAG,KAAK,CAAC,EAAE,+EAAC;AACpB,IAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,+EAAC;AACvB,IAAA,UAAU,GAAG,KAAK,CAAC,KAAK,iFAAC;AACzB,IAAA,SAAS,GAAG,KAAK,CAAC,CAAC,gFAAC;AACpB,IAAA,UAAU,GAAG,KAAK,CAAC,CAAC,iFAAC;AACrB,IAAA,WAAW,GAAG,KAAK,CAAC,CAAC,kFAAC;AACtB,IAAA,WAAW,GAAG,KAAK,CAAC,CAAC,kFAAC;AACtB,IAAA,iBAAiB,GAAG,KAAK,CAAC,SAAS,wFAAC;AACpC,IAAA,kBAAkB,GAAG,KAAK,CAAC,MAAM,yFAAC;IAElC,WAAW,GAAG,MAAM,EAAQ;AAE5B,IAAA,IAAI,WAAW,GAAA;AACb,QAAA,OAAO,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,iBAAiB,EAAE,GAAG,IAAI,CAAC,kBAAkB,EAAE;IAC/E;wGAhBW,0BAA0B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAA1B,0BAA0B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECXvC,+kBAkBA,EAAA,MAAA,EAAA,CAAA,uLAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDVY,gBAAgB,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,SAAA,EAAA,UAAA,EAAA,cAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,aAAA,EAAA,mBAAA,EAAA,KAAA,EAAA,QAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAGf,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBAPtC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,qBAAqB,WAGtB,CAAC,gBAAgB,CAAC,EAAA,eAAA,EACV,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,+kBAAA,EAAA,MAAA,EAAA,CAAA,uLAAA,CAAA,EAAA;;;ME8BpC,qBAAqB,CAAA;AACf,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AAEvB,IAAA,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAE/B,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAEhD,IAAA,cAAc,GAAG,KAAK,CAAiB,EAAE,qFAAC;AAC1C,IAAA,oBAAoB,GAAG,KAAK,CAAC,CAAC,2FAAC;AAC/B,IAAA,SAAS,GAAG,KAAK,CAAC,EAAE,gFAAC;AACrB,IAAA,UAAU,GAAG,KAAK,CAAC,EAAE,iFAAC;AACtB,IAAA,UAAU,GAAG,KAAK,CAAC,EAAE,iFAAC;AACtB,IAAA,WAAW,GAAG,KAAK,CAAC,CAAC,kFAAC;AACtB,IAAA,WAAW,GAAG,KAAK,CAAC,CAAC,kFAAC;AACtB,IAAA,iBAAiB,GAAG,KAAK,CAAC,SAAS,wFAAC;AACpC,IAAA,kBAAkB,GAAG,KAAK,CAAC,MAAM,yFAAC;AAClC,IAAA,iBAAiB,GAAG,KAAK,CAAC,SAAS,wFAAC;AACpC,IAAA,cAAc,GAAG,KAAK,CAAC,GAAG,qFAAC;AAC3B,IAAA,oBAAoB,GAAG,KAAK,CAAC,aAAa,2FAAC;AAC3C,IAAA,gBAAgB,GAAG,KAAK,CAAC,aAAa,uFAAC;AACvC,IAAA,gBAAgB,GAAG,KAAK,CAAC,CAAC,uFAAC;AAC3B,IAAA,UAAU,GAAG,KAAK,CAAC,MAAM,iFAAC;AAC1B,IAAA,UAAU,GAAG,KAAK,CAAC,EAAE,iFAAC;AACtB,IAAA,UAAU,GAAG,KAAK,CAAC,EAAE,iFAAC;IAEtB,WAAW,GAAG,MAAM,EAAU;AAG9B,IAAA,eAAe;AAEf,IAAA,YAAY;AAEZ,IAAA,eAAe;AAEf,IAAA,eAAe;IAEf,kBAAkB,GAAG,KAAK;IAC1B,kBAAkB,GAAG,KAAK;AAElB,IAAA,gBAAgB;AAChB,IAAA,aAAa;IAErB,mBAAmB,GAAG,KAAK;IAC3B,mBAAmB,GAAG,KAAK;IAE3B,UAAU,GAAG,CAAC;IACd,YAAY,GAAG,CAAC;IAChB,YAAY,GAAG,KAAK;IAEpB,WAAW,GAAG,CAAC;IACf,aAAa,GAAG,CAAC;AAEjB,IAAA,WAAA,GAAA;QACE,eAAe,CAAC,MAAK;AACnB,YAAA,IAAI,IAAI,CAAC,eAAe,EAAE;gBACxB,IAAI,CAAC,mBAAmB,EAAE;YAC5B;AAEA,YAAA,IAAI,IAAI,CAAC,eAAe,EAAE;gBACxB,IAAI,CAAC,0BAA0B,EAAE;YACnC;AAEA,YAAA,IAAI,IAAI,CAAC,eAAe,EAAE;gBACxB,IAAI,CAAC,0BAA0B,EAAE;YACnC;AACF,QAAA,CAAC,CAAC;IACJ;AAEQ,IAAA,mBAAmB,GAAG,MAAM,CAAC,MAAK;AACxC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE;AACpC,QAAA,IAAI,MAAM,EAAE,MAAM,EAAE;AAClB,YAAA,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,MAAM;QACjC;AACF,IAAA,CAAC,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,qBAAA,EAAA,8BAAA,EAAA,CAAA,EAAI,iBAAiB,EAAE,IAAI,GAAG;IAE/B,eAAe,GAAA;AACb,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE;YACrB,IAAI,CAAC,gBAAgB,EAAE;AACvB,YAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC;QACzC;IACF;IAEO,cAAc,GAAA;AACnB,QAAA,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,SAAS,CAAC;IAC5C;IAEO,cAAc,GAAA;AACnB,QAAA,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,SAAS,CAAC;IAC5C;IAEO,sBAAsB,GAAA;AAC3B,QAAA,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,gBAAgB,CAAC;IACnD;AAEQ,IAAA,YAAY,CAAC,MAAqB,EAAE,UAAU,GAAG,CAAC,EAAA;QACxD,MAAM,kBAAkB,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;QAEjG,IAAI,iBAAiB,GAAG,QAAQ,CAC9B,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,UAAqB,EAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,EAClE,EAAE,CACH;AACD,QAAA,iBAAiB,GAAG,KAAK,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,iBAAiB;QAEpE,IAAI,sBAAsB,GAAG,CAAC;QAC9B,MAAM,QAAQ,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,YAAY;QAC9F,IAAI,cAAc,GAAG,CAAC;QAEtB,QAAQ,MAAM;AACZ,YAAA,KAAK,aAAa,CAAC,SAAS,EAAE;AAC5B,gBAAA,sBAAsB,GAAG,iBAAiB,IAAI,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;gBACnF,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,sBAAsB,EAAE,QAAQ,CAAC;AAE3D,gBAAA,IAAI,cAAc,GAAG,QAAQ,EAAE;oBAC7B,cAAc,GAAG,QAAQ;gBAC3B;AAEA,gBAAA,IAAI,kBAAkB,IAAI,IAAI,CAAC,UAAU,EAAE;oBACzC,cAAc,GAAG,CAAC;gBACpB;gBAEA;YACF;AAEA,YAAA,KAAK,aAAa,CAAC,SAAS,EAAE;AAC5B,gBAAA,sBAAsB,GAAG,iBAAiB,IAAI,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;gBACnF,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,sBAAsB,EAAE,CAAC,CAAC;AAEpD,gBAAA,IAAI,cAAc,GAAG,CAAC,EAAE;oBACtB,cAAc,GAAG,CAAC;gBACpB;gBAEA;YACF;AAEA,YAAA,KAAK,aAAa,CAAC,gBAAgB,EAAE;AACnC,gBAAA,sBAAsB,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,GAAG,IAAI,CAAC,oBAAoB,EAAE;gBAC9F,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,sBAAsB,EAAE,QAAQ,CAAC;AAE3D,gBAAA,IAAI,cAAc,GAAG,CAAC,EAAE;oBACtB,cAAc,GAAG,CAAC;gBACpB;gBAEA;YACF;AAEA,YAAA,KAAK,aAAa,CAAC,UAAU,EAAE;AAC7B,gBAAA,cAAc,GAAG,iBAAiB,GAAG,UAAU;AAE/C,gBAAA,IAAI,cAAc,GAAG,CAAC,EAAE;oBACtB,cAAc,GAAG,CAAC;gBACpB;AAEA,gBAAA,IAAI,cAAc,GAAG,QAAQ,EAAE;oBAC7B,cAAc,GAAG,QAAQ;gBAC3B;AAEA,gBAAA,IAAI,kBAAkB,IAAI,IAAI,CAAC,UAAU,EAAE;oBACzC,cAAc,GAAG,CAAC;gBACpB;gBAEA;YACF;;AAGF,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;YACtB,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,UAAU,GAAG,cAAc,GAAG,IAAI;QAC7D;AAEA,QAAA,IAAI,CAAC,mBAAmB,GAAG,cAAc,KAAK,CAAC;AAC/C,QAAA,IAAI,CAAC,mBAAmB,GAAG,QAAQ,KAAK,cAAc;AAEtD,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;AAEO,IAAA,iBAAiB,CAAC,GAAe,EAAA;AACtC,QAAA,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM;AAErC,QAAA,IAAI,UAAU,GAAG,CAAC,EAAE;YAClB;QACF;QAEA,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO;AACzC,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,WAAW;IACvC;AAEO,IAAA,gBAAgB,CAAC,GAAe,EAAA;AACrC,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YACtB,GAAG,CAAC,cAAc,EAAE;QACtB;AAEA,QAAA,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM;AAErC,QAAA,IAAI,UAAU,GAAG,CAAC,EAAE;YAClB;QACF;QACA,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO;AACnC,QAAA,MAAM,UAAU,GAAG,IAAI,GAAG,IAAI,CAAC,aAAa;AAE5C,QAAA,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,EAAE;YAC5C,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,UAAU,EAAE,UAAU,CAAC;AACvD,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI;QAC3B;IACF;IAEQ,gBAAgB,GAAA;QACtB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,YAAY,EAAE,aAAa;AACrD,QAAA,IAAI,CAAC,YAAY,GAAG,EAAE,IAAI,CAAC,aAAa,EAAE,aAAa,EAAE,WAAW,IAAI,CAAC,CAAC;AAC1E,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC,MAAM,IAAI,CAAC;IAC5D;AAEQ,IAAA,eAAe,CAAC,UAAsB,EAAA;AAC5C,QAAA,SAAS,CAAa,UAAU,CAAC,aAAa,EAAE,OAAO;AACpD,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,aAAA,SAAS,CACV,CAAC,CAAa,KAAI;AAChB,YAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;gBACtB,CAAC,CAAC,cAAc,EAAE;YACpB;AACA,YAAA,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM;AACtB,YAAA,IAAI,KAAK,GAAG,CAAC,EAAE;gBACb,IAAI,CAAC,cAAc,EAAE;YACvB;AAAO,iBAAA,IAAI,KAAK,GAAG,CAAC,EAAE;gBACpB,IAAI,CAAC,cAAc,EAAE;YACvB;AACF,QAAA,CAAC,CACF;IACH;IAEQ,mBAAmB,GAAA;AACzB,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChB;QACF;QAEA,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,eAAe,EAAE,aAAa;AAE3D,QAAA,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,IAAI,CACnD,SAAS,CAAC;YACR,IAAI,CAAC,gBAAgB,EAAE,WAAW;YAClC,EAAE,IAAI,CAAC,aAAa,EAAE,aAAa,EAAE,WAAW,IAAI,CAAC,CAAC;AACvD,SAAA,CAAC,EACF,SAAS,CAAC,MACR,EAAE,CAAC;YACD,EAAE,IAAI,CAAC,gBAAgB,EAAE,WAAW,IAAI,CAAC,CAAC;YAC1C,EAAE,IAAI,CAAC,aAAa,EAAE,aAAa,EAAE,WAAW,IAAI,CAAC,CAAC;SACvD,CAAC,CACH,CACF;QAED;AACG,aAAA,IAAI,CAAC,oBAAoB,EAAE,EAAE,YAAY,CAAC,GAAG,CAAC,EAAE,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;aACnF,SAAS,CAAC,CAAC,CAAC,+BAA+B,EAAE,oBAAoB,CAAC,KAAI;AACrE,YAAA,IAAI,CAAC,YAAY,GAAG,oBAAoB;YACxC,MAAM,KAAK,GACT,CAAC,+BAA+B,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE;iBACvD,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YACxC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;YAElC,IAAI,CAAC,YAAY,GAAG,SAAS,GAAG,IAAI,CAAC,UAAU;YAC/C,IAAI,CAAC,sBAAsB,EAAE;AAE7B,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;AAC1B,QAAA,CAAC,CAAC;IACN;IAEQ,0BAA0B,GAAA;AAChC,QAAA,IAAI,IAAI,CAAC,eAAe,EAAE;YACxB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,eAAe,EAAE,YAAY,CAAC,SAAS,CAAC;YAChE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,eAAe,EAAE,YAAY,CAAC,SAAS,CAAC;QAClE;IACF;IAEQ,0BAA0B,GAAA;AAChC,QAAA,IAAI,IAAI,CAAC,eAAe,EAAE;YACxB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,eAAe,EAAE,YAAY,CAAC,SAAS,CAAC;YAChE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,eAAe,EAAE,YAAY,CAAC,SAAS,CAAC;QAClE;IACF;IAEQ,aAAa,CAAC,UAAsB,EAAE,eAA6B,EAAA;QACzE,MAAM,WAAW,GAAG,SAAS,CAAC,UAAU,CAAC,aAAa,EAAE,YAAY,CAAC;QACrE,MAAM,SAAS,GAAG,SAAS,CAAC,UAAU,CAAC,aAAa,EAAE,UAAU,CAAC;QAEjE,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,CACjC,SAAS,CAAC,CAAC,CAAC,KAAI;YACd,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;QACvE,CAAC,CAAC,CACH;QAED;AACG,aAAA,IAAI,CACH,SAAS,CAAC,MAAK;AACb,YAAA,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAClD,CAAC,CAAC,EACF,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;aAEpC,SAAS,CAAC,MAAK;YACd,QAAQ,eAAe;AACrB,gBAAA,KAAK,YAAY,CAAC,SAAS,EAAE;AAC3B,oBAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI;oBAC9B,IAAI,CAAC,cAAc,EAAE;oBACrB;gBACF;AACA,gBAAA,KAAK,YAAY,CAAC,SAAS,EAAE;AAC3B,oBAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI;oBAC9B,IAAI,CAAC,cAAc,EAAE;oBACrB;gBACF;;AAEJ,QAAA,CAAC,CAAC;IACN;IAEQ,aAAa,CAAC,UAAsB,EAAE,eAA6B,EAAA;QACzE,MAAM,QAAQ,GAAG,SAAS,CAAC,UAAU,CAAC,aAAa,EAAE,SAAS,CAAC;QAC/D,MAAM,UAAU,GAAG,SAAS,CAAC,UAAU,CAAC,aAAa,EAAE,WAAW,CAAC;QACnE,MAAM,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,aAAa,EAAE,OAAO,CAAC;QAE3D,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,CAChC,SAAS,CAAC,CAAC,CAAC,KAAI;YACd,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;QACtE,CAAC,CAAC,CACH;AAED,QAAA,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,MAAK;YAC9D,QAAQ,eAAe;AACrB,gBAAA,KAAK,YAAY,CAAC,SAAS,EAAE;AAC3B,oBAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE;AAC3B,wBAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK;wBAC/B;oBACF;oBACA,IAAI,CAAC,cAAc,EAAE;oBACrB;gBACF;AACA,gBAAA,KAAK,YAAY,CAAC,SAAS,EAAE;AAC3B,oBAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE;AAC3B,wBAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK;wBAC/B;oBACF;oBACA,IAAI,CAAC,cAAc,EAAE;oBACrB;gBACF;;AAEJ,QAAA,CAAC,CAAC;QAEF;AACG,aAAA,IAAI,CACH,SAAS,CAAC,MAAK;AACb,YAAA,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACjD,CAAC,CAAC,EACF,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;aAEpC,SAAS,CAAC,MAAK;YACd,QAAQ,eAAe;AACrB,gBAAA,KAAK,YAAY,CAAC,SAAS,EAAE;AAC3B,oBAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI;oBAC9B,IAAI,CAAC,cAAc,EAAE;oBACrB;gBACF;AACA,gBAAA,KAAK,YAAY,CAAC,SAAS,EAAE;AAC3B,oBAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI;oBAC9B,IAAI,CAAC,cAAc,EAAE;oBACrB;gBACF;;AAEJ,QAAA,CAAC,CAAC;IACN;wGA5WW,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAArB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,oBAAA,EAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,UAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,oBAAA,EAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,UAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,SAAA,EAHrB,CAAC,gBAAgB,CAAC,yHA8BwB,UAAU,EAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,cAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,IAAA,EAEb,UAAU,EAAA,EAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,IAAA,EAEP,UAAU,EAAA,EAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,IAAA,EAEV,UAAU,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECxEjE,upFAuDA,qnBDpBY,0BAA0B,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,UAAA,EAAA,UAAA,EAAA,YAAA,EAAA,WAAA,EAAA,YAAA,EAAA,aAAA,EAAA,aAAA,EAAA,mBAAA,EAAA,oBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAIzB,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBARjC,SAAS;+BACE,mBAAmB,EAAA,OAAA,EAGpB,CAAC,0BAA0B,CAAC,EAAA,SAAA,EAC1B,CAAC,gBAAgB,CAAC,EAAA,eAAA,EACZ,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,upFAAA,EAAA,MAAA,EAAA,CAAA,6jBAAA,CAAA,EAAA;;sBA6B9C,SAAS;uBAAC,iBAAiB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE;;sBAEhE,SAAS;uBAAC,cAAc,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE;;sBAE7D,SAAS;uBAAC,iBAAiB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE;;sBAEhE,SAAS;uBAAC,iBAAiB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE;;;AExEnE;;AAEG;;ACFH;;AAEG;;"}
|