ngx-edge-slider 1.0.1 → 2.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 +24 -104
- package/esm2022/lib/component/simple-slider.component.mjs +192 -0
- package/esm2022/lib/engine/slider-engine.service.mjs +286 -0
- package/esm2022/lib/models/slider-config.model.mjs +12 -0
- package/esm2022/lib/models/slider-state.model.mjs +17 -0
- package/esm2022/lib/ngx-edge-slider.module.mjs +16 -0
- package/esm2022/lib/plugins/autoplay.plugin.mjs +47 -0
- package/esm2022/lib/plugins/draggable/draggable.plugin.mjs +47 -0
- package/esm2022/lib/plugins/navigation/navigation.plugin.mjs +85 -0
- package/esm2022/lib/plugins/pagination/pagination.plugin.mjs +50 -0
- package/esm2022/lib/plugins/slider-plugin.mjs +2 -0
- package/esm2022/lib/plugins/thumbs/thumbs-scroll.plugin.mjs +38 -0
- package/esm2022/lib/safe-url.pipe.mjs +19 -0
- package/esm2022/lib/store/slider-store.service.mjs +34 -0
- package/esm2022/ngx-edge-slider.mjs +5 -0
- package/esm2022/public-api.mjs +9 -0
- package/fesm2022/ngx-edge-slider.mjs +814 -0
- package/fesm2022/ngx-edge-slider.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/component/simple-slider.component.d.ts +50 -0
- package/lib/engine/slider-engine.service.d.ts +52 -0
- package/lib/models/slider-config.model.d.ts +35 -0
- package/lib/models/slider-state.model.d.ts +22 -0
- package/lib/ngx-edge-slider.module.d.ts +7 -0
- package/lib/plugins/autoplay.plugin.d.ts +18 -0
- package/lib/plugins/draggable/draggable.plugin.d.ts +17 -0
- package/lib/plugins/navigation/navigation.plugin.d.ts +21 -0
- package/lib/plugins/pagination/pagination.plugin.d.ts +22 -0
- package/lib/plugins/slider-plugin.d.ts +11 -0
- package/lib/plugins/thumbs/thumbs-scroll.plugin.d.ts +15 -0
- package/lib/safe-url.pipe.d.ts +10 -0
- package/lib/store/slider-store.service.d.ts +11 -0
- package/ngx-edge-slider-2.0.0.tgz +0 -0
- package/package.json +19 -18
- package/public-api.d.ts +5 -0
- package/ngx-edge-slider-workspace/.editorconfig +0 -16
- package/ngx-edge-slider-workspace/.vscode/extensions.json +0 -4
- package/ngx-edge-slider-workspace/.vscode/launch.json +0 -20
- package/ngx-edge-slider-workspace/.vscode/tasks.json +0 -42
- package/ngx-edge-slider-workspace/README.md +0 -104
- package/ngx-edge-slider-workspace/angular.json +0 -140
- package/ngx-edge-slider-workspace/package-lock.json +0 -13339
- package/ngx-edge-slider-workspace/package.json +0 -39
- package/ngx-edge-slider-workspace/projects/ngx-edge-slider/README.md +0 -24
- package/ngx-edge-slider-workspace/projects/ngx-edge-slider/ng-package.json +0 -7
- package/ngx-edge-slider-workspace/projects/ngx-edge-slider/package.json +0 -12
- package/ngx-edge-slider-workspace/projects/ngx-edge-slider/src/lib/assets/icons/arrow-black.svg +0 -3
- package/ngx-edge-slider-workspace/projects/ngx-edge-slider/src/lib/assets/icons/arrow-gray.svg +0 -3
- package/ngx-edge-slider-workspace/projects/ngx-edge-slider/src/lib/ngx-edge-slider.component.html +0 -78
- package/ngx-edge-slider-workspace/projects/ngx-edge-slider/src/lib/ngx-edge-slider.component.scss +0 -344
- package/ngx-edge-slider-workspace/projects/ngx-edge-slider/src/lib/ngx-edge-slider.component.ts +0 -610
- package/ngx-edge-slider-workspace/projects/ngx-edge-slider/src/lib/ngx-edge-slider.interface.ts +0 -34
- package/ngx-edge-slider-workspace/projects/ngx-edge-slider/src/lib/ngx-edge-slider.module.ts +0 -18
- package/ngx-edge-slider-workspace/projects/ngx-edge-slider/src/lib/ngx-edge-slider.service.ts +0 -9
- package/ngx-edge-slider-workspace/projects/ngx-edge-slider/src/public-api.ts +0 -7
- package/ngx-edge-slider-workspace/projects/ngx-edge-slider/tsconfig.lib.json +0 -14
- package/ngx-edge-slider-workspace/projects/ngx-edge-slider/tsconfig.lib.prod.json +0 -10
- package/ngx-edge-slider-workspace/projects/ngx-edge-slider/tsconfig.spec.json +0 -14
- package/ngx-edge-slider-workspace/projects/test-app/src/app/app.component.html +0 -11
- package/ngx-edge-slider-workspace/projects/test-app/src/app/app.component.scss +0 -0
- package/ngx-edge-slider-workspace/projects/test-app/src/app/app.component.spec.ts +0 -27
- package/ngx-edge-slider-workspace/projects/test-app/src/app/app.component.ts +0 -57
- package/ngx-edge-slider-workspace/projects/test-app/src/app/app.module.ts +0 -18
- package/ngx-edge-slider-workspace/projects/test-app/src/assets/.gitkeep +0 -0
- package/ngx-edge-slider-workspace/projects/test-app/src/assets/slide2_desktop_1950x.webp +0 -0
- package/ngx-edge-slider-workspace/projects/test-app/src/favicon.ico +0 -0
- package/ngx-edge-slider-workspace/projects/test-app/src/index.html +0 -13
- package/ngx-edge-slider-workspace/projects/test-app/src/main.ts +0 -7
- package/ngx-edge-slider-workspace/projects/test-app/src/styles.scss +0 -1
- package/ngx-edge-slider-workspace/projects/test-app/tsconfig.app.json +0 -14
- package/ngx-edge-slider-workspace/projects/test-app/tsconfig.spec.json +0 -14
- package/ngx-edge-slider-workspace/tsconfig.json +0 -39
package/README.md
CHANGED
|
@@ -1,104 +1,24 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
loop: Number of times the slides will loop. Set to 0 for infinite looping.
|
|
26
|
-
vertical: If set to true, the slider will display slides vertically.
|
|
27
|
-
navEnabled: Enable navigation arrows.
|
|
28
|
-
navPosition: Position of the navigation arrows.
|
|
29
|
-
navHoverable: If true, navigation arrows will be visible only on hover.
|
|
30
|
-
paginationEnabled: Enable pagination dots.
|
|
31
|
-
paginationPosition: Position of the pagination dots.
|
|
32
|
-
breakpoints: Define slide configuration based on breakpoints for responsive behavior (mobile, tablet, desktop).
|
|
33
|
-
Responsive Support:
|
|
34
|
-
Configure the slider's behavior for different screen sizes using breakpoints. The library allows customization for:
|
|
35
|
-
|
|
36
|
-
Mobile (mobile): Custom slide configuration for mobile devices.
|
|
37
|
-
Tablet (tablet): Tailored configuration for tablet-sized screens.
|
|
38
|
-
Desktop (desktop): Adjustments for desktop layouts.
|
|
39
|
-
Usage Example:
|
|
40
|
-
To use the Edge Slider in your Angular 17+ application, follow the steps below:
|
|
41
|
-
|
|
42
|
-
Import the Module: First, import the EdgeSliderModule into your AppModule or the module where you want to use the slider.
|
|
43
|
-
typescript
|
|
44
|
-
Copy code
|
|
45
|
-
import { EdgeSliderModule } from '@your-username/edge-slider';
|
|
46
|
-
|
|
47
|
-
@NgModule({
|
|
48
|
-
imports: [EdgeSliderModule],
|
|
49
|
-
// other configurations...
|
|
50
|
-
})
|
|
51
|
-
export class AppModule { }
|
|
52
|
-
Component HTML: You can use the lib-ngx-edge-slider component in your template. Here's how to initialize it in your Angular component.
|
|
53
|
-
|
|
54
|
-
<!-- Initialize EdgeSlider component in your template -->
|
|
55
|
-
<lib-ngx-edge-slider *ngIf="sliderConfig.slides?.length"
|
|
56
|
-
[config]="sliderConfig"
|
|
57
|
-
id="EdgeSlider"
|
|
58
|
-
[slideTemplate]="EdgeSliderTemplate"
|
|
59
|
-
(onSlideChange)="onSlideChange($event)">
|
|
60
|
-
</lib-ngx-edge-slider>
|
|
61
|
-
|
|
62
|
-
<!-- Define the template for the slides -->
|
|
63
|
-
<ng-template #EdgeSliderTemplate let-slide="slide" let-index="currentSlide">
|
|
64
|
-
<!-- Template rendering logic here -->
|
|
65
|
-
<!-- 'slide' is our entity, and its properties can be accessed, like slide.id, slide.image -->
|
|
66
|
-
<img [src]="slide.image" alt="Slide image">
|
|
67
|
-
</ng-template>
|
|
68
|
-
|
|
69
|
-
Component TypeScript: In your component's .ts file, define the sliderConfig with the desired slide settings, and create an onSlideChange handler for capturing slide change events.
|
|
70
|
-
typescript
|
|
71
|
-
|
|
72
|
-
import { Component } from '@angular/core';
|
|
73
|
-
import { SlideConfig } from '@your-username/edge-slider'; // Import your library
|
|
74
|
-
|
|
75
|
-
@Component({
|
|
76
|
-
selector: 'app-your-component',
|
|
77
|
-
templateUrl: './your-component.component.html',
|
|
78
|
-
styleUrls: ['./your-component.component.css'],
|
|
79
|
-
})
|
|
80
|
-
export class YourComponent {
|
|
81
|
-
// Define the slider configuration
|
|
82
|
-
sliderConfig: SlideConfig = new SlideConfig({
|
|
83
|
-
slides: [
|
|
84
|
-
{ id: 1, image: 'path_to_image_1.jpg' },
|
|
85
|
-
{ id: 2, image: 'path_to_image_2.jpg' },
|
|
86
|
-
{ id: 3, image: 'path_to_image_3.jpg' },
|
|
87
|
-
],
|
|
88
|
-
autoPlay: true,
|
|
89
|
-
delay: 3000, // Set autoplay delay
|
|
90
|
-
loop: 0, // Infinite loop
|
|
91
|
-
slidesToSlide: 1,
|
|
92
|
-
slidesPerView: 1,
|
|
93
|
-
navEnabled: true, // Enable navigation
|
|
94
|
-
paginationEnabled: true, // Enable pagination dots
|
|
95
|
-
});
|
|
96
|
-
|
|
97
|
-
// Handle slide change event
|
|
98
|
-
onSlideChange(event: any): void {
|
|
99
|
-
console.log('Slide changed to: ', event);
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
Summary
|
|
104
|
-
This package provides an easy-to-integrate, flexible Angular component for building interactive and responsive sliders. With options for autoplay, navigation, pagination, and breakpoints, it adapts to various use cases, making it a powerful tool for displaying image galleries, content carousels, and more.
|
|
1
|
+
# NgxEdgeSlider
|
|
2
|
+
|
|
3
|
+
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 18.2.0.
|
|
4
|
+
|
|
5
|
+
## Code scaffolding
|
|
6
|
+
|
|
7
|
+
Run `ng generate component component-name --project ngx-edge-slider` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project ngx-edge-slider`.
|
|
8
|
+
> Note: Don't forget to add `--project ngx-edge-slider` or else it will be added to the default project in your `angular.json` file.
|
|
9
|
+
|
|
10
|
+
## Build
|
|
11
|
+
|
|
12
|
+
Run `ng build ngx-edge-slider` to build the project. The build artifacts will be stored in the `dist/` directory.
|
|
13
|
+
|
|
14
|
+
## Publishing
|
|
15
|
+
|
|
16
|
+
After building your library with `ng build ngx-edge-slider`, go to the dist folder `cd dist/ngx-edge-slider` and run `npm publish`.
|
|
17
|
+
|
|
18
|
+
## Running unit tests
|
|
19
|
+
|
|
20
|
+
Run `ng test ngx-edge-slider` to execute the unit tests via [Karma](https://karma-runner.github.io).
|
|
21
|
+
|
|
22
|
+
## Further help
|
|
23
|
+
|
|
24
|
+
To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.dev/tools/cli) page.
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
import { Component, ChangeDetectionStrategy, Input, EventEmitter, Output, ViewChild, } from "@angular/core";
|
|
2
|
+
import { Subject, takeUntil } from "rxjs";
|
|
3
|
+
import { SliderEngine } from "../engine/slider-engine.service";
|
|
4
|
+
import { SliderStore } from "../store/slider-store.service";
|
|
5
|
+
import { SliderAutoplayPlugin } from "../plugins/autoplay.plugin";
|
|
6
|
+
import { SliderDraggablePlugin } from "../plugins/draggable/draggable.plugin";
|
|
7
|
+
import { SliderNavigationPlugin } from "../plugins/navigation/navigation.plugin";
|
|
8
|
+
import { SliderPaginationPlugin } from "../plugins/pagination/pagination.plugin";
|
|
9
|
+
import { SliderThumbsScrollPlugin } from "../plugins/thumbs/thumbs-scroll.plugin";
|
|
10
|
+
import { CommonModule } from "@angular/common";
|
|
11
|
+
import * as i0 from "@angular/core";
|
|
12
|
+
import * as i1 from "../engine/slider-engine.service";
|
|
13
|
+
import * as i2 from "../store/slider-store.service";
|
|
14
|
+
import * as i3 from "../plugins/draggable/draggable.plugin";
|
|
15
|
+
import * as i4 from "../plugins/pagination/pagination.plugin";
|
|
16
|
+
import * as i5 from "../plugins/navigation/navigation.plugin";
|
|
17
|
+
import * as i6 from "../plugins/autoplay.plugin";
|
|
18
|
+
import * as i7 from "../plugins/thumbs/thumbs-scroll.plugin";
|
|
19
|
+
import * as i8 from "@angular/common";
|
|
20
|
+
export class SimpleSliderComponent {
|
|
21
|
+
engine;
|
|
22
|
+
store;
|
|
23
|
+
draggable;
|
|
24
|
+
pagination;
|
|
25
|
+
navigation;
|
|
26
|
+
autoplay;
|
|
27
|
+
thumbs;
|
|
28
|
+
config;
|
|
29
|
+
slideTemplate;
|
|
30
|
+
navigationTemplate;
|
|
31
|
+
paginationTemplate;
|
|
32
|
+
slideChange = new EventEmitter();
|
|
33
|
+
isDraggingPointer = false;
|
|
34
|
+
dragStartX = 0;
|
|
35
|
+
dragStartY = 0;
|
|
36
|
+
lastIndex = -1;
|
|
37
|
+
lastSlidesRef = null;
|
|
38
|
+
destroy$ = new Subject();
|
|
39
|
+
state$;
|
|
40
|
+
sliderHost;
|
|
41
|
+
constructor(engine, store, draggable, pagination, navigation, autoplay, thumbs) {
|
|
42
|
+
this.engine = engine;
|
|
43
|
+
this.store = store;
|
|
44
|
+
this.draggable = draggable;
|
|
45
|
+
this.pagination = pagination;
|
|
46
|
+
this.navigation = navigation;
|
|
47
|
+
this.autoplay = autoplay;
|
|
48
|
+
this.thumbs = thumbs;
|
|
49
|
+
}
|
|
50
|
+
ngOnInit() {
|
|
51
|
+
this.state$ = this.store.view$;
|
|
52
|
+
this.state$.pipe(takeUntil(this.destroy$)).subscribe((state) => {
|
|
53
|
+
if (state.currentSlide !== this.lastIndex) {
|
|
54
|
+
this.lastIndex = state.currentSlide;
|
|
55
|
+
this.slideChange.emit(state.currentSlide);
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
this.lastSlidesRef = this.config?.slides ?? null;
|
|
59
|
+
this.engine.init({ ...this.config, plugins: this.config.plugins });
|
|
60
|
+
}
|
|
61
|
+
ngAfterViewInit() {
|
|
62
|
+
if (this.sliderHost?.nativeElement) {
|
|
63
|
+
this.engine.attachContainer(this.sliderHost.nativeElement);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
ngOnChanges(changes) {
|
|
67
|
+
if (!changes["config"] || !this.config)
|
|
68
|
+
return;
|
|
69
|
+
const newSlidesRef = this.config.slides ?? null;
|
|
70
|
+
if (newSlidesRef !== this.lastSlidesRef) {
|
|
71
|
+
this.lastSlidesRef = newSlidesRef;
|
|
72
|
+
this.engine.destroy();
|
|
73
|
+
this.resolvePlugins(this.config);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
ngOnDestroy() {
|
|
77
|
+
this.destroySlider();
|
|
78
|
+
}
|
|
79
|
+
goTo(index) {
|
|
80
|
+
this.engine.selectSlide(index); // add this line
|
|
81
|
+
//this.slideChange.emit(index);
|
|
82
|
+
}
|
|
83
|
+
destroySlider() {
|
|
84
|
+
this.destroy$.next();
|
|
85
|
+
this.destroy$.complete();
|
|
86
|
+
this.engine.destroy();
|
|
87
|
+
} // destroys plugins and clears store
|
|
88
|
+
onNext() {
|
|
89
|
+
this.engine.next();
|
|
90
|
+
}
|
|
91
|
+
onPrevious() {
|
|
92
|
+
this.engine.previous();
|
|
93
|
+
}
|
|
94
|
+
selectSlide(index) {
|
|
95
|
+
this.engine.selectSlide(index);
|
|
96
|
+
}
|
|
97
|
+
// Handle Pointers
|
|
98
|
+
onPointerDown(event) {
|
|
99
|
+
this.dragStartX = event.clientX;
|
|
100
|
+
this.dragStartY = event.clientY;
|
|
101
|
+
this.isDraggingPointer = false;
|
|
102
|
+
// Do not capture yet; wait until movement exceeds threshold
|
|
103
|
+
this.engine.handleDragStart(event);
|
|
104
|
+
}
|
|
105
|
+
onPointerMove(event) {
|
|
106
|
+
const dx = Math.abs(event.clientX - this.dragStartX);
|
|
107
|
+
const dy = Math.abs(event.clientY - this.dragStartY);
|
|
108
|
+
if (!this.isDraggingPointer && (dx > 5 || dy > 5)) {
|
|
109
|
+
this.isDraggingPointer = true;
|
|
110
|
+
// Now start capturing pointer so dragging works outside the slider bounds
|
|
111
|
+
event.currentTarget.setPointerCapture(event.pointerId);
|
|
112
|
+
}
|
|
113
|
+
if (this.isDraggingPointer) {
|
|
114
|
+
this.engine.handleDragMove(event);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
onPointerUp(event) {
|
|
118
|
+
if (!event)
|
|
119
|
+
return;
|
|
120
|
+
if (!this.isDraggingPointer) {
|
|
121
|
+
const target = event.target;
|
|
122
|
+
// Only select the slide if click is not on an interactive child
|
|
123
|
+
const slideEl = target.closest(".slide");
|
|
124
|
+
if (slideEl && !target.closest("button, video, a")) {
|
|
125
|
+
const indexAttr = slideEl.getAttribute("data-index");
|
|
126
|
+
const index = indexAttr ? parseInt(indexAttr, 10) : null;
|
|
127
|
+
if (index !== null)
|
|
128
|
+
this.engine.selectSlide(index);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
this.engine.handleDragEnd();
|
|
132
|
+
this.isDraggingPointer = false;
|
|
133
|
+
// Release pointer capture if it was captured
|
|
134
|
+
try {
|
|
135
|
+
event.currentTarget.releasePointerCapture(event.pointerId);
|
|
136
|
+
}
|
|
137
|
+
catch { }
|
|
138
|
+
}
|
|
139
|
+
resolvePlugins(config) {
|
|
140
|
+
const runtimePlugins = [];
|
|
141
|
+
const cfg = config.plugins;
|
|
142
|
+
if (cfg?.draggable)
|
|
143
|
+
runtimePlugins.push(this.draggable);
|
|
144
|
+
if (cfg?.pagination)
|
|
145
|
+
runtimePlugins.push(this.pagination);
|
|
146
|
+
if (cfg?.navigation)
|
|
147
|
+
runtimePlugins.push(this.navigation);
|
|
148
|
+
if (cfg?.autoplay) {
|
|
149
|
+
this.autoplay.setConfig(cfg.autoplay);
|
|
150
|
+
runtimePlugins.push(this.autoplay);
|
|
151
|
+
}
|
|
152
|
+
if (cfg?.thumbs)
|
|
153
|
+
runtimePlugins.push(this.thumbs);
|
|
154
|
+
this.engine.init({ ...config, plugins: undefined }, runtimePlugins);
|
|
155
|
+
}
|
|
156
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SimpleSliderComponent, deps: [{ token: i1.SliderEngine }, { token: i2.SliderStore }, { token: i3.SliderDraggablePlugin }, { token: i4.SliderPaginationPlugin }, { token: i5.SliderNavigationPlugin }, { token: i6.SliderAutoplayPlugin }, { token: i7.SliderThumbsScrollPlugin }], target: i0.ɵɵFactoryTarget.Component });
|
|
157
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: SimpleSliderComponent, isStandalone: true, selector: "app-simple-slider", inputs: { config: "config", slideTemplate: "slideTemplate", navigationTemplate: "navigationTemplate", paginationTemplate: "paginationTemplate" }, outputs: { slideChange: "slideChange" }, providers: [
|
|
158
|
+
SliderEngine,
|
|
159
|
+
SliderStore,
|
|
160
|
+
SliderDraggablePlugin,
|
|
161
|
+
SliderPaginationPlugin,
|
|
162
|
+
SliderNavigationPlugin,
|
|
163
|
+
SliderAutoplayPlugin,
|
|
164
|
+
SliderThumbsScrollPlugin,
|
|
165
|
+
], viewQueries: [{ propertyName: "sliderHost", first: true, predicate: ["sliderHost"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"state$ | async as state\">\r\n <div\r\n class=\"slider\"\r\n #sliderHost\r\n [class.slider-vertical]=\"state.vertical\"\r\n [class.slider-draggable]=\"state.isDragging\"\r\n [class.slider--main]=\"!config.isThumbs\"\r\n [class.slider--thumbs]=\"config.isThumbs\"\r\n *ngIf=\"state.visibleSlides?.length > 0 && state.isVisible\"\r\n (pointerdown)=\"onPointerDown($event)\"\r\n (pointermove)=\"onPointerMove($event)\"\r\n (pointerup)=\"onPointerUp($event)\"\r\n (pointercancel)=\"onPointerUp($event)\">\r\n <div\r\n class=\"slider__wrapper\"\r\n [ngStyle]=\"{\r\n transform: state.translate,\r\n transition: state.transition,\r\n display: 'flex',\r\n 'flex-direction': state.vertical ? 'column' : 'row',\r\n 'justify-content': state.visibleSlides?.length < state.slidesPerView ? 'center' : 'flex-start',\r\n gap: (state.slidesPerView > 1 ? state.gap || 0 : 0) + 'px',\r\n }\">\r\n <div\r\n *ngFor=\"let slide of state.visibleSlides; let i = index\"\r\n class=\"slide\"\r\n [attr.data-index]=\"i\"\r\n [class.slide--current]=\"state.selectedSlide === i\"\r\n [style.flex]=\"\r\n !config.isThumbs\r\n ? '0 0 calc(' +\r\n 100 / state.slidesPerView +\r\n '% - ' +\r\n ((state.gap || 0) * (state.slidesPerView - 1)) / state.slidesPerView +\r\n 'px)'\r\n : '0 0 ' + thumbSize + 'px'\r\n \"\r\n [style.width]=\"config.isThumbs ? thumbSize + 'px' : null\"\r\n [style.height]=\"config.isThumbs ? thumbSize + 'px' : null\"\r\n (click)=\"engine.selectSlide(i)\">\r\n <ng-container\r\n *ngTemplateOutlet=\"slideTemplate ? slideTemplate : defaultSlideTemplate; context: { slide: slide, index: i }\"></ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-container>\r\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i8.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i8.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "pipe", type: i8.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
166
|
+
}
|
|
167
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SimpleSliderComponent, decorators: [{
|
|
168
|
+
type: Component,
|
|
169
|
+
args: [{ selector: "app-simple-slider", changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule], providers: [
|
|
170
|
+
SliderEngine,
|
|
171
|
+
SliderStore,
|
|
172
|
+
SliderDraggablePlugin,
|
|
173
|
+
SliderPaginationPlugin,
|
|
174
|
+
SliderNavigationPlugin,
|
|
175
|
+
SliderAutoplayPlugin,
|
|
176
|
+
SliderThumbsScrollPlugin,
|
|
177
|
+
], template: "<ng-container *ngIf=\"state$ | async as state\">\r\n <div\r\n class=\"slider\"\r\n #sliderHost\r\n [class.slider-vertical]=\"state.vertical\"\r\n [class.slider-draggable]=\"state.isDragging\"\r\n [class.slider--main]=\"!config.isThumbs\"\r\n [class.slider--thumbs]=\"config.isThumbs\"\r\n *ngIf=\"state.visibleSlides?.length > 0 && state.isVisible\"\r\n (pointerdown)=\"onPointerDown($event)\"\r\n (pointermove)=\"onPointerMove($event)\"\r\n (pointerup)=\"onPointerUp($event)\"\r\n (pointercancel)=\"onPointerUp($event)\">\r\n <div\r\n class=\"slider__wrapper\"\r\n [ngStyle]=\"{\r\n transform: state.translate,\r\n transition: state.transition,\r\n display: 'flex',\r\n 'flex-direction': state.vertical ? 'column' : 'row',\r\n 'justify-content': state.visibleSlides?.length < state.slidesPerView ? 'center' : 'flex-start',\r\n gap: (state.slidesPerView > 1 ? state.gap || 0 : 0) + 'px',\r\n }\">\r\n <div\r\n *ngFor=\"let slide of state.visibleSlides; let i = index\"\r\n class=\"slide\"\r\n [attr.data-index]=\"i\"\r\n [class.slide--current]=\"state.selectedSlide === i\"\r\n [style.flex]=\"\r\n !config.isThumbs\r\n ? '0 0 calc(' +\r\n 100 / state.slidesPerView +\r\n '% - ' +\r\n ((state.gap || 0) * (state.slidesPerView - 1)) / state.slidesPerView +\r\n 'px)'\r\n : '0 0 ' + thumbSize + 'px'\r\n \"\r\n [style.width]=\"config.isThumbs ? thumbSize + 'px' : null\"\r\n [style.height]=\"config.isThumbs ? thumbSize + 'px' : null\"\r\n (click)=\"engine.selectSlide(i)\">\r\n <ng-container\r\n *ngTemplateOutlet=\"slideTemplate ? slideTemplate : defaultSlideTemplate; context: { slide: slide, index: i }\"></ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-container>\r\n" }]
|
|
178
|
+
}], ctorParameters: () => [{ type: i1.SliderEngine }, { type: i2.SliderStore }, { type: i3.SliderDraggablePlugin }, { type: i4.SliderPaginationPlugin }, { type: i5.SliderNavigationPlugin }, { type: i6.SliderAutoplayPlugin }, { type: i7.SliderThumbsScrollPlugin }], propDecorators: { config: [{
|
|
179
|
+
type: Input
|
|
180
|
+
}], slideTemplate: [{
|
|
181
|
+
type: Input
|
|
182
|
+
}], navigationTemplate: [{
|
|
183
|
+
type: Input
|
|
184
|
+
}], paginationTemplate: [{
|
|
185
|
+
type: Input
|
|
186
|
+
}], slideChange: [{
|
|
187
|
+
type: Output
|
|
188
|
+
}], sliderHost: [{
|
|
189
|
+
type: ViewChild,
|
|
190
|
+
args: ["sliderHost", { static: false }]
|
|
191
|
+
}] } });
|
|
192
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltcGxlLXNsaWRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZWRnZS1zbGlkZXIvc3JjL2xpYi9jb21wb25lbnQvc2ltcGxlLXNsaWRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZWRnZS1zbGlkZXIvc3JjL2xpYi9jb21wb25lbnQvc2ltcGxlLXNsaWRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULHVCQUF1QixFQUd2QixLQUFLLEVBQ0wsWUFBWSxFQUNaLE1BQU0sRUFJTixTQUFTLEdBR1YsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFjLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFdEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQy9ELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUNqRixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUNqRixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUVsRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7Ozs7Ozs7Ozs7QUFrQi9DLE1BQU0sT0FBTyxxQkFBcUI7SUFrQnRCO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBdkJELE1BQU0sQ0FBZTtJQUNyQixhQUFhLENBQW9CO0lBQ2pDLGtCQUFrQixDQUFvQjtJQUN0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SUFBSSxXQUNQLENBQUMsWUFBWSxDQUFDLGFBQ1o7d0JBQ1QsWUFBWTt3QkFDWixXQUFXO3dCQUNYLHFCQUFxQjt3QkFDckIsc0JBQXNCO3dCQUN0QixzQkFBc0I7d0JBQ3RCLG9CQUFvQjt3QkFDcEIsd0JBQXdCO3FCQUN6QjttU0FHUSxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUNJLFdBQVc7c0JBQXBCLE1BQU07Z0JBVXFDLFVBQVU7c0JBQXJELFNBQVM7dUJBQUMsWUFBWSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gIE9uSW5pdCxcclxuICBUZW1wbGF0ZVJlZixcclxuICBJbnB1dCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgT3V0cHV0LFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIE9uRGVzdHJveSxcclxuICBWaWV3Q2hpbGQsXHJcbiAgRWxlbWVudFJlZixcclxuICBBZnRlclZpZXdJbml0LFxyXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IFNsaWRlclZpZXdTdGF0ZSB9IGZyb20gXCIuLi9tb2RlbHMvc2xpZGVyLXN0YXRlLm1vZGVsXCI7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IFNsaWRlckNvbmZpZyB9IGZyb20gXCIuLi9tb2RlbHMvc2xpZGVyLWNvbmZpZy5tb2RlbFwiO1xyXG5pbXBvcnQgeyBTbGlkZXJFbmdpbmUgfSBmcm9tIFwiLi4vZW5naW5lL3NsaWRlci1lbmdpbmUuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBTbGlkZXJTdG9yZSB9IGZyb20gXCIuLi9zdG9yZS9zbGlkZXItc3RvcmUuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBTbGlkZXJBdXRvcGxheVBsdWdpbiB9IGZyb20gXCIuLi9wbHVnaW5zL2F1dG9wbGF5LnBsdWdpblwiO1xyXG5pbXBvcnQgeyBTbGlkZXJEcmFnZ2FibGVQbHVnaW4gfSBmcm9tIFwiLi4vcGx1Z2lucy9kcmFnZ2FibGUvZHJhZ2dhYmxlLnBsdWdpblwiO1xyXG5pbXBvcnQgeyBTbGlkZXJOYXZpZ2F0aW9uUGx1Z2luIH0gZnJvbSBcIi4uL3BsdWdpbnMvbmF2aWdhdGlvbi9uYXZpZ2F0aW9uLnBsdWdpblwiO1xyXG5pbXBvcnQgeyBTbGlkZXJQYWdpbmF0aW9uUGx1Z2luIH0gZnJvbSBcIi4uL3BsdWdpbnMvcGFnaW5hdGlvbi9wYWdpbmF0aW9uLnBsdWdpblwiO1xyXG5pbXBvcnQgeyBTbGlkZXJUaHVtYnNTY3JvbGxQbHVnaW4gfSBmcm9tIFwiLi4vcGx1Z2lucy90aHVtYnMvdGh1bWJzLXNjcm9sbC5wbHVnaW5cIjtcclxuaW1wb3J0IHsgU2xpZGVyUGx1Z2luIH0gZnJvbSBcIi4uL3BsdWdpbnMvc2xpZGVyLXBsdWdpblwiO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJhcHAtc2ltcGxlLXNsaWRlclwiLFxyXG4gIHRlbXBsYXRlVXJsOiBcIi4vc2ltcGxlLXNsaWRlci5jb21wb25lbnQuaHRtbFwiLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXHJcbiAgcHJvdmlkZXJzOiBbXHJcbiAgICBTbGlkZXJFbmdpbmUsXHJcbiAgICBTbGlkZXJTdG9yZSxcclxuICAgIFNsaWRlckRyYWdnYWJsZVBsdWdpbixcclxuICAgIFNsaWRlclBhZ2luYXRpb25QbHVnaW4sXHJcbiAgICBTbGlkZXJOYXZpZ2F0aW9uUGx1Z2luLFxyXG4gICAgU2xpZGVyQXV0b3BsYXlQbHVnaW4sXHJcbiAgICBTbGlkZXJUaHVtYnNTY3JvbGxQbHVnaW4sXHJcbiAgXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFNpbXBsZVNsaWRlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xyXG4gIEBJbnB1dCgpIGNvbmZpZzogU2xpZGVyQ29uZmlnO1xyXG4gIEBJbnB1dCgpIHNsaWRlVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBJbnB1dCgpIG5hdmlnYXRpb25UZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQElucHV0KCkgcGFnaW5hdGlvblRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcclxuICBAT3V0cHV0KCkgc2xpZGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcclxuXHJcbiAgcHJpdmF0ZSBpc0RyYWdnaW5nUG9pbnRlciA9IGZhbHNlO1xyXG4gIHByaXZhdGUgZHJhZ1N0YXJ0WCA9IDA7XHJcbiAgcHJpdmF0ZSBkcmFnU3RhcnRZID0gMDtcclxuICBwcml2YXRlIGxhc3RJbmRleCA9IC0xO1xyXG4gIHByaXZhdGUgbGFzdFNsaWRlc1JlZjogYW55W10gfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgc3RhdGUkOiBPYnNlcnZhYmxlPFNsaWRlclZpZXdTdGF0ZT47XHJcbiAgQFZpZXdDaGlsZChcInNsaWRlckhvc3RcIiwgeyBzdGF0aWM6IGZhbHNlIH0pIHNsaWRlckhvc3Q/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGVuZ2luZTogU2xpZGVyRW5naW5lLFxyXG4gICAgcHJpdmF0ZSBzdG9yZTogU2xpZGVyU3RvcmUsXHJcbiAgICBwcml2YXRlIGRyYWdnYWJsZTogU2xpZGVyRHJhZ2dhYmxlUGx1Z2luLFxyXG4gICAgcHJpdmF0ZSBwYWdpbmF0aW9uOiBTbGlkZXJQYWdpbmF0aW9uUGx1Z2luLFxyXG4gICAgcHJpdmF0ZSBuYXZpZ2F0aW9uOiBTbGlkZXJOYXZpZ2F0aW9uUGx1Z2luLFxyXG4gICAgcHJpdmF0ZSBhdXRvcGxheTogU2xpZGVyQXV0b3BsYXlQbHVnaW4sXHJcbiAgICBwcml2YXRlIHRodW1iczogU2xpZGVyVGh1bWJzU2Nyb2xsUGx1Z2luLFxyXG4gICkge31cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLnN0YXRlJCA9IHRoaXMuc3RvcmUudmlldyQ7XHJcblxyXG4gICAgdGhpcy5zdGF0ZSQucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoc3RhdGUpID0+IHtcclxuICAgICAgaWYgKHN0YXRlLmN1cnJlbnRTbGlkZSAhPT0gdGhpcy5sYXN0SW5kZXgpIHtcclxuICAgICAgICB0aGlzLmxhc3RJbmRleCA9IHN0YXRlLmN1cnJlbnRTbGlkZTtcclxuICAgICAgICB0aGlzLnNsaWRlQ2hhbmdlLmVtaXQoc3RhdGUuY3VycmVudFNsaWRlKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmxhc3RTbGlkZXNSZWYgPSB0aGlzLmNvbmZpZz8uc2xpZGVzID8/IG51bGw7XHJcbiAgICB0aGlzLmVuZ2luZS5pbml0KHsgLi4udGhpcy5jb25maWcsIHBsdWdpbnM6IHRoaXMuY29uZmlnLnBsdWdpbnMgfSk7XHJcbiAgfVxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIGlmICh0aGlzLnNsaWRlckhvc3Q/Lm5hdGl2ZUVsZW1lbnQpIHtcclxuICAgICAgdGhpcy5lbmdpbmUuYXR0YWNoQ29udGFpbmVyKHRoaXMuc2xpZGVySG9zdC5uYXRpdmVFbGVtZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIGlmICghY2hhbmdlc1tcImNvbmZpZ1wiXSB8fCAhdGhpcy5jb25maWcpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBuZXdTbGlkZXNSZWYgPSB0aGlzLmNvbmZpZy5zbGlkZXMgPz8gbnVsbDtcclxuXHJcbiAgICBpZiAobmV3U2xpZGVzUmVmICE9PSB0aGlzLmxhc3RTbGlkZXNSZWYpIHtcclxuICAgICAgdGhpcy5sYXN0U2xpZGVzUmVmID0gbmV3U2xpZGVzUmVmO1xyXG4gICAgICB0aGlzLmVuZ2luZS5kZXN0cm95KCk7XHJcbiAgICAgIHRoaXMucmVzb2x2ZVBsdWdpbnModGhpcy5jb25maWcpO1xyXG4gICAgfVxyXG4gIH1cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIHRoaXMuZGVzdHJveVNsaWRlcigpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdvVG8oaW5kZXg6IG51bWJlcikge1xyXG4gICAgdGhpcy5lbmdpbmUuc2VsZWN0U2xpZGUoaW5kZXgpOyAvLyBhZGQgdGhpcyBsaW5lXHJcbiAgICAvL3RoaXMuc2xpZGVDaGFuZ2UuZW1pdChpbmRleCk7XHJcbiAgfVxyXG5cclxuICBkZXN0cm95U2xpZGVyKCkge1xyXG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XHJcbiAgICB0aGlzLmVuZ2luZS5kZXN0cm95KCk7XHJcbiAgfSAvLyBkZXN0cm95cyBwbHVnaW5zIGFuZCBjbGVhcnMgc3RvcmVcclxuXHJcbiAgb25OZXh0KCkge1xyXG4gICAgdGhpcy5lbmdpbmUubmV4dCgpO1xyXG4gIH1cclxuICBvblByZXZpb3VzKCkge1xyXG4gICAgdGhpcy5lbmdpbmUucHJldmlvdXMoKTtcclxuICB9XHJcbiAgc2VsZWN0U2xpZGUoaW5kZXg6IG51bWJlcikge1xyXG4gICAgdGhpcy5lbmdpbmUuc2VsZWN0U2xpZGUoaW5kZXgpO1xyXG4gIH1cclxuXHJcbiAgLy8gSGFuZGxlIFBvaW50ZXJzXHJcblxyXG4gIG9uUG9pbnRlckRvd24oZXZlbnQ6IFBvaW50ZXJFdmVudCkge1xyXG4gICAgdGhpcy5kcmFnU3RhcnRYID0gZXZlbnQuY2xpZW50WDtcclxuICAgIHRoaXMuZHJhZ1N0YXJ0WSA9IGV2ZW50LmNsaWVudFk7XHJcbiAgICB0aGlzLmlzRHJhZ2dpbmdQb2ludGVyID0gZmFsc2U7XHJcblxyXG4gICAgLy8gRG8gbm90IGNhcHR1cmUgeWV0OyB3YWl0IHVudGlsIG1vdmVtZW50IGV4Y2VlZHMgdGhyZXNob2xkXHJcbiAgICB0aGlzLmVuZ2luZS5oYW5kbGVEcmFnU3RhcnQoZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgb25Qb2ludGVyTW92ZShldmVudDogUG9pbnRlckV2ZW50KSB7XHJcbiAgICBjb25zdCBkeCA9IE1hdGguYWJzKGV2ZW50LmNsaWVudFggLSB0aGlzLmRyYWdTdGFydFgpO1xyXG4gICAgY29uc3QgZHkgPSBNYXRoLmFicyhldmVudC5jbGllbnRZIC0gdGhpcy5kcmFnU3RhcnRZKTtcclxuXHJcbiAgICBpZiAoIXRoaXMuaXNEcmFnZ2luZ1BvaW50ZXIgJiYgKGR4ID4gNSB8fCBkeSA+IDUpKSB7XHJcbiAgICAgIHRoaXMuaXNEcmFnZ2luZ1BvaW50ZXIgPSB0cnVlO1xyXG5cclxuICAgICAgLy8gTm93IHN0YXJ0IGNhcHR1cmluZyBwb2ludGVyIHNvIGRyYWdnaW5nIHdvcmtzIG91dHNpZGUgdGhlIHNsaWRlciBib3VuZHNcclxuICAgICAgKGV2ZW50LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQpLnNldFBvaW50ZXJDYXB0dXJlKGV2ZW50LnBvaW50ZXJJZCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuaXNEcmFnZ2luZ1BvaW50ZXIpIHtcclxuICAgICAgdGhpcy5lbmdpbmUuaGFuZGxlRHJhZ01vdmUoZXZlbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25Qb2ludGVyVXAoZXZlbnQ6IFBvaW50ZXJFdmVudCkge1xyXG4gICAgaWYgKCFldmVudCkgcmV0dXJuO1xyXG5cclxuICAgIGlmICghdGhpcy5pc0RyYWdnaW5nUG9pbnRlcikge1xyXG4gICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcblxyXG4gICAgICAvLyBPbmx5IHNlbGVjdCB0aGUgc2xpZGUgaWYgY2xpY2sgaXMgbm90IG9uIGFuIGludGVyYWN0aXZlIGNoaWxkXHJcbiAgICAgIGNvbnN0IHNsaWRlRWwgPSB0YXJnZXQuY2xvc2VzdChcIi5zbGlkZVwiKTtcclxuICAgICAgaWYgKHNsaWRlRWwgJiYgIXRhcmdldC5jbG9zZXN0KFwiYnV0dG9uLCB2aWRlbywgYVwiKSkge1xyXG4gICAgICAgIGNvbnN0IGluZGV4QXR0ciA9IHNsaWRlRWwuZ2V0QXR0cmlidXRlKFwiZGF0YS1pbmRleFwiKTtcclxuICAgICAgICBjb25zdCBpbmRleCA9IGluZGV4QXR0ciA/IHBhcnNlSW50KGluZGV4QXR0ciwgMTApIDogbnVsbDtcclxuICAgICAgICBpZiAoaW5kZXggIT09IG51bGwpIHRoaXMuZW5naW5lLnNlbGVjdFNsaWRlKGluZGV4KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZW5naW5lLmhhbmRsZURyYWdFbmQoKTtcclxuICAgIHRoaXMuaXNEcmFnZ2luZ1BvaW50ZXIgPSBmYWxzZTtcclxuXHJcbiAgICAvLyBSZWxlYXNlIHBvaW50ZXIgY2FwdHVyZSBpZiBpdCB3YXMgY2FwdHVyZWRcclxuICAgIHRyeSB7XHJcbiAgICAgIChldmVudC5jdXJyZW50VGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5yZWxlYXNlUG9pbnRlckNhcHR1cmUoZXZlbnQucG9pbnRlcklkKTtcclxuICAgIH0gY2F0Y2gge31cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVzb2x2ZVBsdWdpbnMoY29uZmlnOiBTbGlkZXJDb25maWcpIHtcclxuICAgIGNvbnN0IHJ1bnRpbWVQbHVnaW5zOiBTbGlkZXJQbHVnaW5bXSA9IFtdO1xyXG5cclxuICAgIGNvbnN0IGNmZyA9IGNvbmZpZy5wbHVnaW5zO1xyXG5cclxuICAgIGlmIChjZmc/LmRyYWdnYWJsZSkgcnVudGltZVBsdWdpbnMucHVzaCh0aGlzLmRyYWdnYWJsZSk7XHJcbiAgICBpZiAoY2ZnPy5wYWdpbmF0aW9uKSBydW50aW1lUGx1Z2lucy5wdXNoKHRoaXMucGFnaW5hdGlvbik7XHJcbiAgICBpZiAoY2ZnPy5uYXZpZ2F0aW9uKSBydW50aW1lUGx1Z2lucy5wdXNoKHRoaXMubmF2aWdhdGlvbik7XHJcblxyXG4gICAgaWYgKGNmZz8uYXV0b3BsYXkpIHtcclxuICAgICAgdGhpcy5hdXRvcGxheS5zZXRDb25maWcoY2ZnLmF1dG9wbGF5KTtcclxuICAgICAgcnVudGltZVBsdWdpbnMucHVzaCh0aGlzLmF1dG9wbGF5KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY2ZnPy50aHVtYnMpIHJ1bnRpbWVQbHVnaW5zLnB1c2godGhpcy50aHVtYnMpO1xyXG5cclxuICAgIHRoaXMuZW5naW5lLmluaXQoeyAuLi5jb25maWcsIHBsdWdpbnM6IHVuZGVmaW5lZCB9LCBydW50aW1lUGx1Z2lucyk7XHJcbiAgfVxyXG59XHJcbiIsIjxuZy1jb250YWluZXIgKm5nSWY9XCJzdGF0ZSQgfCBhc3luYyBhcyBzdGF0ZVwiPlxyXG4gIDxkaXZcclxuICAgIGNsYXNzPVwic2xpZGVyXCJcclxuICAgICNzbGlkZXJIb3N0XHJcbiAgICBbY2xhc3Muc2xpZGVyLXZlcnRpY2FsXT1cInN0YXRlLnZlcnRpY2FsXCJcclxuICAgIFtjbGFzcy5zbGlkZXItZHJhZ2dhYmxlXT1cInN0YXRlLmlzRHJhZ2dpbmdcIlxyXG4gICAgW2NsYXNzLnNsaWRlci0tbWFpbl09XCIhY29uZmlnLmlzVGh1bWJzXCJcclxuICAgIFtjbGFzcy5zbGlkZXItLXRodW1ic109XCJjb25maWcuaXNUaHVtYnNcIlxyXG4gICAgKm5nSWY9XCJzdGF0ZS52aXNpYmxlU2xpZGVzPy5sZW5ndGggPiAwICYmIHN0YXRlLmlzVmlzaWJsZVwiXHJcbiAgICAocG9pbnRlcmRvd24pPVwib25Qb2ludGVyRG93bigkZXZlbnQpXCJcclxuICAgIChwb2ludGVybW92ZSk9XCJvblBvaW50ZXJNb3ZlKCRldmVudClcIlxyXG4gICAgKHBvaW50ZXJ1cCk9XCJvblBvaW50ZXJVcCgkZXZlbnQpXCJcclxuICAgIChwb2ludGVyY2FuY2VsKT1cIm9uUG9pbnRlclVwKCRldmVudClcIj5cclxuICAgIDxkaXZcclxuICAgICAgY2xhc3M9XCJzbGlkZXJfX3dyYXBwZXJcIlxyXG4gICAgICBbbmdTdHlsZV09XCJ7XHJcbiAgICAgICAgdHJhbnNmb3JtOiBzdGF0ZS50cmFuc2xhdGUsXHJcbiAgICAgICAgdHJhbnNpdGlvbjogc3RhdGUudHJhbnNpdGlvbixcclxuICAgICAgICBkaXNwbGF5OiAnZmxleCcsXHJcbiAgICAgICAgJ2ZsZXgtZGlyZWN0aW9uJzogc3RhdGUudmVydGljYWwgPyAnY29sdW1uJyA6ICdyb3cnLFxyXG4gICAgICAgICdqdXN0aWZ5LWNvbnRlbnQnOiBzdGF0ZS52aXNpYmxlU2xpZGVzPy5sZW5ndGggPCBzdGF0ZS5zbGlkZXNQZXJWaWV3ID8gJ2NlbnRlcicgOiAnZmxleC1zdGFydCcsXHJcbiAgICAgICAgZ2FwOiAoc3RhdGUuc2xpZGVzUGVyVmlldyA+IDEgPyBzdGF0ZS5nYXAgfHwgMCA6IDApICsgJ3B4JyxcclxuICAgICAgfVwiPlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgKm5nRm9yPVwibGV0IHNsaWRlIG9mIHN0YXRlLnZpc2libGVTbGlkZXM7IGxldCBpID0gaW5kZXhcIlxyXG4gICAgICAgIGNsYXNzPVwic2xpZGVcIlxyXG4gICAgICAgIFthdHRyLmRhdGEtaW5kZXhdPVwiaVwiXHJcbiAgICAgICAgW2NsYXNzLnNsaWRlLS1jdXJyZW50XT1cInN0YXRlLnNlbGVjdGVkU2xpZGUgPT09IGlcIlxyXG4gICAgICAgIFtzdHlsZS5mbGV4XT1cIlxyXG4gICAgICAgICAgIWNvbmZpZy5pc1RodW1ic1xyXG4gICAgICAgICAgICA/ICcwIDAgY2FsYygnICtcclxuICAgICAgICAgICAgICAxMDAgLyBzdGF0ZS5zbGlkZXNQZXJWaWV3ICtcclxuICAgICAgICAgICAgICAnJSAtICcgK1xyXG4gICAgICAgICAgICAgICgoc3RhdGUuZ2FwIHx8IDApICogKHN0YXRlLnNsaWRlc1BlclZpZXcgLSAxKSkgLyBzdGF0ZS5zbGlkZXNQZXJWaWV3ICtcclxuICAgICAgICAgICAgICAncHgpJ1xyXG4gICAgICAgICAgICA6ICcwIDAgJyArIHRodW1iU2l6ZSArICdweCdcclxuICAgICAgICBcIlxyXG4gICAgICAgIFtzdHlsZS53aWR0aF09XCJjb25maWcuaXNUaHVtYnMgPyB0aHVtYlNpemUgKyAncHgnIDogbnVsbFwiXHJcbiAgICAgICAgW3N0eWxlLmhlaWdodF09XCJjb25maWcuaXNUaHVtYnMgPyB0aHVtYlNpemUgKyAncHgnIDogbnVsbFwiXHJcbiAgICAgICAgKGNsaWNrKT1cImVuZ2luZS5zZWxlY3RTbGlkZShpKVwiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwic2xpZGVUZW1wbGF0ZSA/IHNsaWRlVGVtcGxhdGUgOiBkZWZhdWx0U2xpZGVUZW1wbGF0ZTsgY29udGV4dDogeyBzbGlkZTogc2xpZGUsIGluZGV4OiBpIH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9uZy1jb250YWluZXI+XHJcbiJdfQ==
|