@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 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":"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"}