@mintplayer/ng-swiper 21.8.0 → 22.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/fesm2022/mintplayer-ng-swiper-observe-size.mjs +9 -6
- package/fesm2022/mintplayer-ng-swiper-observe-size.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-swiper-swiper.mjs +272 -39
- package/fesm2022/mintplayer-ng-swiper-swiper.mjs.map +1 -1
- package/observe-size/package.json +4 -0
- package/package.json +6 -5
- package/swiper/package.json +4 -0
- package/types/mintplayer-ng-swiper-swiper.d.ts +108 -3
|
@@ -13,9 +13,12 @@ class BsObserveSizeDirective {
|
|
|
13
13
|
});
|
|
14
14
|
}
|
|
15
15
|
}
|
|
16
|
-
size = signal(undefined,
|
|
17
|
-
|
|
18
|
-
|
|
16
|
+
size = signal(undefined, /* @ts-ignore */
|
|
17
|
+
...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
|
|
18
|
+
width = computed(() => this.size()?.width, /* @ts-ignore */
|
|
19
|
+
...(ngDevMode ? [{ debugName: "width" }] : /* istanbul ignore next */ []));
|
|
20
|
+
height = computed(() => this.size()?.height, /* @ts-ignore */
|
|
21
|
+
...(ngDevMode ? [{ debugName: "height" }] : /* istanbul ignore next */ []));
|
|
19
22
|
ngAfterViewInit() {
|
|
20
23
|
const el = this.element.nativeElement;
|
|
21
24
|
this.observer?.observe(el);
|
|
@@ -27,10 +30,10 @@ class BsObserveSizeDirective {
|
|
|
27
30
|
this.observer.disconnect();
|
|
28
31
|
}
|
|
29
32
|
}
|
|
30
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
31
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "
|
|
33
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: BsObserveSizeDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
34
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.0", type: BsObserveSizeDirective, isStandalone: true, selector: "[bsObserveSize]", exportAs: ["bsObserveSize"], ngImport: i0 });
|
|
32
35
|
}
|
|
33
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
36
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: BsObserveSizeDirective, decorators: [{
|
|
34
37
|
type: Directive,
|
|
35
38
|
args: [{
|
|
36
39
|
selector: '[bsObserveSize]',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mintplayer-ng-swiper-observe-size.mjs","sources":["../../../../libs/mintplayer-ng-swiper/observe-size/src/observe-size.directive.ts","../../../../libs/mintplayer-ng-swiper/observe-size/mintplayer-ng-swiper-observe-size.ts"],"sourcesContent":["import { isPlatformServer } from '@angular/common';\nimport { AfterViewInit, computed, Directive, ElementRef, inject, OnDestroy, PLATFORM_ID, signal } from '@angular/core';\nimport { Size } from './size';\n\n@Directive({\n selector: '[bsObserveSize]',\n exportAs: 'bsObserveSize'\n})\nexport class BsObserveSizeDirective implements AfterViewInit, OnDestroy {\n private element = inject(ElementRef);\n private platformId = inject(PLATFORM_ID);\n\n private observer?: ResizeObserver;\n\n constructor() {\n if (!isPlatformServer(this.platformId) && typeof ResizeObserver !== 'undefined') {\n this.observer = new ResizeObserver((entries) => {\n this.size.set(entries[0].contentRect);\n });\n }\n }\n\n size = signal<Size | undefined>(undefined);\n width = computed(() => this.size()?.width);\n height = computed(() => this.size()?.height);\n\n ngAfterViewInit() {\n const el: HTMLElement = this.element.nativeElement;\n this.observer?.observe(el);\n this.size.set({ width: el.clientWidth, height: el.clientHeight });\n }\n\n ngOnDestroy() {\n if (this.observer) {\n this.observer.unobserve(this.element.nativeElement);\n this.observer.disconnect();\n }\n }\n}","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;MAQa,sBAAsB,CAAA;AACzB,IAAA,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC;AAC5B,IAAA,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC;AAEhC,IAAA,QAAQ;AAEhB,IAAA,WAAA,GAAA;AACE,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,OAAO,cAAc,KAAK,WAAW,EAAE;YAC/E,IAAI,CAAC,QAAQ,GAAG,IAAI,cAAc,CAAC,CAAC,OAAO,KAAI;AAC7C,gBAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;AACvC,YAAA,CAAC,CAAC;QACJ;IACF;
|
|
1
|
+
{"version":3,"file":"mintplayer-ng-swiper-observe-size.mjs","sources":["../../../../libs/mintplayer-ng-swiper/observe-size/src/observe-size.directive.ts","../../../../libs/mintplayer-ng-swiper/observe-size/mintplayer-ng-swiper-observe-size.ts"],"sourcesContent":["import { isPlatformServer } from '@angular/common';\nimport { AfterViewInit, computed, Directive, ElementRef, inject, OnDestroy, PLATFORM_ID, signal } from '@angular/core';\nimport { Size } from './size';\n\n@Directive({\n selector: '[bsObserveSize]',\n exportAs: 'bsObserveSize'\n})\nexport class BsObserveSizeDirective implements AfterViewInit, OnDestroy {\n private element = inject(ElementRef);\n private platformId = inject(PLATFORM_ID);\n\n private observer?: ResizeObserver;\n\n constructor() {\n if (!isPlatformServer(this.platformId) && typeof ResizeObserver !== 'undefined') {\n this.observer = new ResizeObserver((entries) => {\n this.size.set(entries[0].contentRect);\n });\n }\n }\n\n size = signal<Size | undefined>(undefined);\n width = computed(() => this.size()?.width);\n height = computed(() => this.size()?.height);\n\n ngAfterViewInit() {\n const el: HTMLElement = this.element.nativeElement;\n this.observer?.observe(el);\n this.size.set({ width: el.clientWidth, height: el.clientHeight });\n }\n\n ngOnDestroy() {\n if (this.observer) {\n this.observer.unobserve(this.element.nativeElement);\n this.observer.disconnect();\n }\n }\n}","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;MAQa,sBAAsB,CAAA;AACzB,IAAA,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC;AAC5B,IAAA,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC;AAEhC,IAAA,QAAQ;AAEhB,IAAA,WAAA,GAAA;AACE,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,OAAO,cAAc,KAAK,WAAW,EAAE;YAC/E,IAAI,CAAC,QAAQ,GAAG,IAAI,cAAc,CAAC,CAAC,OAAO,KAAI;AAC7C,gBAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;AACvC,YAAA,CAAC,CAAC;QACJ;IACF;IAEA,IAAI,GAAG,MAAM,CAAmB,SAAS;6EAAC;IAC1C,KAAK,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,EAAE,KAAK;8EAAC;IAC1C,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,EAAE,MAAM;+EAAC;IAE5C,eAAe,GAAA;AACb,QAAA,MAAM,EAAE,GAAgB,IAAI,CAAC,OAAO,CAAC,aAAa;AAClD,QAAA,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC;AAC1B,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,CAAC,YAAY,EAAE,CAAC;IACnE;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjB,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC;AACnD,YAAA,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE;QAC5B;IACF;uGA7BW,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAtB,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAtB,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAJlC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,iBAAiB;AAC3B,oBAAA,QAAQ,EAAE;AACX,iBAAA;;;ACPD;;AAEG;;;;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { InjectionToken, inject, ElementRef, signal, contentChildren, input, computed, model, output, effect, Directive, DestroyRef, afterNextRender } from '@angular/core';
|
|
2
|
+
import { InjectionToken, inject, ElementRef, signal, contentChildren, input, computed, model, output, effect, Directive, DestroyRef, afterNextRender, contentChild } from '@angular/core';
|
|
3
3
|
import * as i1 from '@mintplayer/ng-swiper/observe-size';
|
|
4
4
|
import { BsObserveSizeDirective } from '@mintplayer/ng-swiper/observe-size';
|
|
5
5
|
import { DOCUMENT } from '@angular/common';
|
|
@@ -12,26 +12,62 @@ class BsSwipeContainerDirective {
|
|
|
12
12
|
observeSize = inject(BsObserveSizeDirective);
|
|
13
13
|
containerElement = inject((ElementRef));
|
|
14
14
|
document = inject(DOCUMENT);
|
|
15
|
-
offsetLeft = signal(null,
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
15
|
+
offsetLeft = signal(null, /* @ts-ignore */
|
|
16
|
+
...(ngDevMode ? [{ debugName: "offsetLeft" }] : /* istanbul ignore next */ []));
|
|
17
|
+
offsetRight = signal(null, /* @ts-ignore */
|
|
18
|
+
...(ngDevMode ? [{ debugName: "offsetRight" }] : /* istanbul ignore next */ []));
|
|
19
|
+
offsetTopPx = signal(null, /* @ts-ignore */
|
|
20
|
+
...(ngDevMode ? [{ debugName: "offsetTopPx" }] : /* istanbul ignore next */ []));
|
|
21
|
+
offsetBottomPx = signal(null, /* @ts-ignore */
|
|
22
|
+
...(ngDevMode ? [{ debugName: "offsetBottomPx" }] : /* istanbul ignore next */ []));
|
|
23
|
+
swipes = contentChildren(BS_SWIPE_SLIDE, /* @ts-ignore */
|
|
24
|
+
...(ngDevMode ? [{ debugName: "swipes" }] : /* istanbul ignore next */ []));
|
|
25
|
+
minimumOffset = input(50, /* @ts-ignore */
|
|
26
|
+
...(ngDevMode ? [{ debugName: "minimumOffset" }] : /* istanbul ignore next */ []));
|
|
27
|
+
animation = input('slide', /* @ts-ignore */
|
|
28
|
+
...(ngDevMode ? [{ debugName: "animation" }] : /* istanbul ignore next */ []));
|
|
29
|
+
orientation = input('horizontal', /* @ts-ignore */
|
|
30
|
+
...(ngDevMode ? [{ debugName: "orientation" }] : /* istanbul ignore next */ []));
|
|
31
|
+
/**
|
|
32
|
+
* When true, the container handles ArrowLeft/Right (horizontal) or
|
|
33
|
+
* ArrowUp/Down (vertical) plus Home/End to move between slides. The
|
|
34
|
+
* keydown listeners live on the wrapping `bsSwipeViewport` host (only
|
|
35
|
+
* fire when focus is on the viewport itself); this input still gates
|
|
36
|
+
* dispatch inside `onKeyPress`.
|
|
37
|
+
*/
|
|
38
|
+
keyboardEvents = input(true, /* @ts-ignore */
|
|
39
|
+
...(ngDevMode ? [{ debugName: "keyboardEvents" }] : /* istanbul ignore next */ []));
|
|
23
40
|
// Mirror swiper.js's .swiper-horizontal / .swiper-vertical: declare the axis
|
|
24
41
|
// we own at the container level so Firefox Android's APZ excludes the
|
|
25
42
|
// perpendicular gesture (incl. pull-to-refresh) at touchstart arbitration time.
|
|
26
|
-
touchAction = computed(() => this.orientation() === 'horizontal' ? 'pan-y' : 'pan-x',
|
|
27
|
-
|
|
43
|
+
touchAction = computed(() => this.orientation() === 'horizontal' ? 'pan-y' : 'pan-x', /* @ts-ignore */
|
|
44
|
+
...(ngDevMode ? [{ debugName: "touchAction" }] : /* istanbul ignore next */ []));
|
|
45
|
+
/**
|
|
46
|
+
* Computed `aria-keyshortcuts` value advertising the keys the directive
|
|
47
|
+
* actually responds to. Returns `null` (attribute removed) when keyboard
|
|
48
|
+
* handling is disabled, so SRs never advertise shortcuts that won't fire.
|
|
49
|
+
*/
|
|
50
|
+
ariaKeyshortcuts = computed(() => {
|
|
51
|
+
if (!this.keyboardEvents())
|
|
52
|
+
return null;
|
|
53
|
+
return this.orientation() === 'horizontal'
|
|
54
|
+
? 'ArrowLeft ArrowRight Home End'
|
|
55
|
+
: 'ArrowUp ArrowDown Home End';
|
|
56
|
+
}, /* @ts-ignore */
|
|
57
|
+
...(ngDevMode ? [{ debugName: "ariaKeyshortcuts" }] : /* istanbul ignore next */ []));
|
|
58
|
+
imageIndex = model(0, /* @ts-ignore */
|
|
59
|
+
...(ngDevMode ? [{ debugName: "imageIndex" }] : /* istanbul ignore next */ []));
|
|
28
60
|
animationStart = output();
|
|
29
61
|
animationEnd = output();
|
|
30
|
-
isViewInited = signal(false,
|
|
31
|
-
|
|
62
|
+
isViewInited = signal(false, /* @ts-ignore */
|
|
63
|
+
...(ngDevMode ? [{ debugName: "isViewInited" }] : /* istanbul ignore next */ []));
|
|
64
|
+
isAnimating = signal(false, /* @ts-ignore */
|
|
65
|
+
...(ngDevMode ? [{ debugName: "isAnimating" }] : /* istanbul ignore next */ []));
|
|
32
66
|
isDestroyed = false;
|
|
33
|
-
startTouch = signal(null,
|
|
34
|
-
|
|
67
|
+
startTouch = signal(null, /* @ts-ignore */
|
|
68
|
+
...(ngDevMode ? [{ debugName: "startTouch" }] : /* istanbul ignore next */ []));
|
|
69
|
+
lastTouch = signal(null, /* @ts-ignore */
|
|
70
|
+
...(ngDevMode ? [{ debugName: "lastTouch" }] : /* istanbul ignore next */ []));
|
|
35
71
|
pendingAnimation;
|
|
36
72
|
pendingFadeTimeoutId;
|
|
37
73
|
// Computed signals for derived state
|
|
@@ -63,7 +99,8 @@ class BsSwipeContainerDirective {
|
|
|
63
99
|
else {
|
|
64
100
|
return (-imageIndex * 100);
|
|
65
101
|
}
|
|
66
|
-
},
|
|
102
|
+
}, /* @ts-ignore */
|
|
103
|
+
...(ngDevMode ? [{ debugName: "offset" }] : /* istanbul ignore next */ []));
|
|
67
104
|
padLeft = computed(() => {
|
|
68
105
|
const swipes = this.swipes();
|
|
69
106
|
if (swipes.length === 0)
|
|
@@ -78,7 +115,8 @@ class BsSwipeContainerDirective {
|
|
|
78
115
|
}
|
|
79
116
|
}
|
|
80
117
|
return count;
|
|
81
|
-
},
|
|
118
|
+
}, /* @ts-ignore */
|
|
119
|
+
...(ngDevMode ? [{ debugName: "padLeft" }] : /* istanbul ignore next */ []));
|
|
82
120
|
padRight = computed(() => {
|
|
83
121
|
const swipes = this.swipes();
|
|
84
122
|
if (swipes.length === 0)
|
|
@@ -93,13 +131,17 @@ class BsSwipeContainerDirective {
|
|
|
93
131
|
}
|
|
94
132
|
}
|
|
95
133
|
return count;
|
|
96
|
-
},
|
|
97
|
-
|
|
98
|
-
|
|
134
|
+
}, /* @ts-ignore */
|
|
135
|
+
...(ngDevMode ? [{ debugName: "padRight" }] : /* istanbul ignore next */ []));
|
|
136
|
+
offsetPrimary = computed(() => this.offset() - this.padLeft() * 100, /* @ts-ignore */
|
|
137
|
+
...(ngDevMode ? [{ debugName: "offsetPrimary" }] : /* istanbul ignore next */ []));
|
|
138
|
+
offsetSecondary = computed(() => -(this.offset() - this.padLeft() * 100) - (this.padRight() - 1) * 100, /* @ts-ignore */
|
|
139
|
+
...(ngDevMode ? [{ debugName: "offsetSecondary" }] : /* istanbul ignore next */ []));
|
|
99
140
|
actualSwipes = computed(() => {
|
|
100
141
|
const swipes = this.swipes();
|
|
101
142
|
return swipes.filter(swipe => !swipe.offside());
|
|
102
|
-
},
|
|
143
|
+
}, /* @ts-ignore */
|
|
144
|
+
...(ngDevMode ? [{ debugName: "actualSwipes" }] : /* istanbul ignore next */ []));
|
|
103
145
|
// Computed signal that reactively tracks all swipe sizes
|
|
104
146
|
slideSizes = computed(() => {
|
|
105
147
|
const actualSwipes = this.actualSwipes();
|
|
@@ -108,12 +150,14 @@ class BsSwipeContainerDirective {
|
|
|
108
150
|
}
|
|
109
151
|
// Reading each swipe's size() creates reactive dependencies
|
|
110
152
|
return actualSwipes.map(swipe => swipe.observeSize.size());
|
|
111
|
-
},
|
|
153
|
+
}, /* @ts-ignore */
|
|
154
|
+
...(ngDevMode ? [{ debugName: "slideSizes" }] : /* istanbul ignore next */ []));
|
|
112
155
|
maxSlideHeight = computed(() => {
|
|
113
156
|
const slideSizes = this.slideSizes();
|
|
114
157
|
const heights = slideSizes.map(s => s?.height ?? 1);
|
|
115
158
|
return heights.length ? Math.max(...heights) : 1;
|
|
116
|
-
},
|
|
159
|
+
}, /* @ts-ignore */
|
|
160
|
+
...(ngDevMode ? [{ debugName: "maxSlideHeight" }] : /* istanbul ignore next */ []));
|
|
117
161
|
currentSlideHeight = computed(() => {
|
|
118
162
|
const slideSizes = this.slideSizes();
|
|
119
163
|
const imageIndex = this.imageIndex();
|
|
@@ -124,7 +168,8 @@ class BsSwipeContainerDirective {
|
|
|
124
168
|
const result = (orientation === 'vertical') ? maxHeight : currHeight;
|
|
125
169
|
// Return null if measurements aren't valid yet to avoid collapsing the carousel
|
|
126
170
|
return result > 10 ? result : null;
|
|
127
|
-
},
|
|
171
|
+
}, /* @ts-ignore */
|
|
172
|
+
...(ngDevMode ? [{ debugName: "currentSlideHeight" }] : /* istanbul ignore next */ []));
|
|
128
173
|
constructor() {
|
|
129
174
|
// Effect to update offsetLeft/offsetTopPx based on offsetPrimary and orientation
|
|
130
175
|
effect(() => {
|
|
@@ -323,6 +368,60 @@ class BsSwipeContainerDirective {
|
|
|
323
368
|
onSwipe(distance) {
|
|
324
369
|
this.animateToIndexByDx(distance);
|
|
325
370
|
}
|
|
371
|
+
/**
|
|
372
|
+
* Public keydown dispatcher invoked by `bsSwipeViewport`'s host listener
|
|
373
|
+
* (the viewport is the focusable region; the container is non-focusable
|
|
374
|
+
* inner machinery). Maps the four arrow keys (orientation-aware) plus
|
|
375
|
+
* Home / End to slide navigation. Calls `preventDefault()` only for the
|
|
376
|
+
* keys this directive actually consumed, so cross-orientation arrows
|
|
377
|
+
* (e.g. ArrowUp on a horizontal swiper) still scroll the page normally.
|
|
378
|
+
*
|
|
379
|
+
* Parameter typed as `Event` because Angular host listeners infer `Event`
|
|
380
|
+
* from the template-style binding string; cast inside.
|
|
381
|
+
*/
|
|
382
|
+
onKeyPress(event) {
|
|
383
|
+
if (!this.keyboardEvents())
|
|
384
|
+
return;
|
|
385
|
+
const ev = event;
|
|
386
|
+
const orientation = this.orientation();
|
|
387
|
+
let handled = false;
|
|
388
|
+
switch (ev.key) {
|
|
389
|
+
case 'ArrowLeft':
|
|
390
|
+
if (orientation === 'horizontal') {
|
|
391
|
+
this.previous();
|
|
392
|
+
handled = true;
|
|
393
|
+
}
|
|
394
|
+
break;
|
|
395
|
+
case 'ArrowRight':
|
|
396
|
+
if (orientation === 'horizontal') {
|
|
397
|
+
this.next();
|
|
398
|
+
handled = true;
|
|
399
|
+
}
|
|
400
|
+
break;
|
|
401
|
+
case 'ArrowUp':
|
|
402
|
+
if (orientation === 'vertical') {
|
|
403
|
+
this.previous();
|
|
404
|
+
handled = true;
|
|
405
|
+
}
|
|
406
|
+
break;
|
|
407
|
+
case 'ArrowDown':
|
|
408
|
+
if (orientation === 'vertical') {
|
|
409
|
+
this.next();
|
|
410
|
+
handled = true;
|
|
411
|
+
}
|
|
412
|
+
break;
|
|
413
|
+
case 'Home':
|
|
414
|
+
this.goto(0);
|
|
415
|
+
handled = true;
|
|
416
|
+
break;
|
|
417
|
+
case 'End':
|
|
418
|
+
this.goto(Math.max(0, this.actualSwipes().length - 1));
|
|
419
|
+
handled = true;
|
|
420
|
+
break;
|
|
421
|
+
}
|
|
422
|
+
if (handled)
|
|
423
|
+
ev.preventDefault();
|
|
424
|
+
}
|
|
326
425
|
previous() {
|
|
327
426
|
this.gotoAnimate(-1, 'relative');
|
|
328
427
|
}
|
|
@@ -344,10 +443,10 @@ class BsSwipeContainerDirective {
|
|
|
344
443
|
this.animateToIndex(imageIndex, idx, 0, actualSwipes?.length ?? 1);
|
|
345
444
|
}, 20);
|
|
346
445
|
}
|
|
347
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
348
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "
|
|
446
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: BsSwipeContainerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
447
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "22.0.0", type: BsSwipeContainerDirective, isStandalone: true, selector: "[bsSwipeContainer]", inputs: { minimumOffset: { classPropertyName: "minimumOffset", publicName: "minimumOffset", isSignal: true, isRequired: false, transformFunction: null }, animation: { classPropertyName: "animation", publicName: "animation", isSignal: true, isRequired: false, transformFunction: null }, orientation: { classPropertyName: "orientation", publicName: "orientation", isSignal: true, isRequired: false, transformFunction: null }, keyboardEvents: { classPropertyName: "keyboardEvents", publicName: "keyboardEvents", isSignal: true, isRequired: false, transformFunction: null }, imageIndex: { classPropertyName: "imageIndex", publicName: "imageIndex", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { imageIndex: "imageIndexChange", animationStart: "animationStart", animationEnd: "animationEnd" }, host: { properties: { "style.margin-left.%": "offsetLeft()", "style.margin-right.%": "offsetRight()", "style.margin-top.px": "offsetTopPx()", "style.margin-bottom.px": "offsetBottomPx()", "style.touch-action": "touchAction()", "style.overscroll-behavior": "\"contain\"", "style.pointer-events": "\"none\"", "style.white-space": "orientation() === \"horizontal\" ? \"nowrap\" : null", "style.display": "orientation() === \"vertical\" ? \"flex\" : \"block\"", "style.flex-direction": "orientation() === \"vertical\" ? \"column\" : null" } }, queries: [{ propertyName: "swipes", predicate: BS_SWIPE_SLIDE, isSignal: true }], exportAs: ["bsSwipeContainer"], hostDirectives: [{ directive: i1.BsObserveSizeDirective }], ngImport: i0 });
|
|
349
448
|
}
|
|
350
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
449
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: BsSwipeContainerDirective, decorators: [{
|
|
351
450
|
type: Directive,
|
|
352
451
|
args: [{
|
|
353
452
|
selector: '[bsSwipeContainer]',
|
|
@@ -373,14 +472,54 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.11", ngImpo
|
|
|
373
472
|
'[style.flex-direction]': 'orientation() === "vertical" ? "column" : null',
|
|
374
473
|
},
|
|
375
474
|
}]
|
|
376
|
-
}], ctorParameters: () => [], propDecorators: { swipes: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => BS_SWIPE_SLIDE), { isSignal: true }] }], minimumOffset: [{ type: i0.Input, args: [{ isSignal: true, alias: "minimumOffset", required: false }] }], animation: [{ type: i0.Input, args: [{ isSignal: true, alias: "animation", required: false }] }], orientation: [{ type: i0.Input, args: [{ isSignal: true, alias: "orientation", required: false }] }], imageIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "imageIndex", required: false }] }, { type: i0.Output, args: ["imageIndexChange"] }], animationStart: [{ type: i0.Output, args: ["animationStart"] }], animationEnd: [{ type: i0.Output, args: ["animationEnd"] }] } });
|
|
475
|
+
}], ctorParameters: () => [], propDecorators: { swipes: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => BS_SWIPE_SLIDE), { isSignal: true }] }], minimumOffset: [{ type: i0.Input, args: [{ isSignal: true, alias: "minimumOffset", required: false }] }], animation: [{ type: i0.Input, args: [{ isSignal: true, alias: "animation", required: false }] }], orientation: [{ type: i0.Input, args: [{ isSignal: true, alias: "orientation", required: false }] }], keyboardEvents: [{ type: i0.Input, args: [{ isSignal: true, alias: "keyboardEvents", required: false }] }], imageIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "imageIndex", required: false }] }, { type: i0.Output, args: ["imageIndexChange"] }], animationStart: [{ type: i0.Output, args: ["animationStart"] }], animationEnd: [{ type: i0.Output, args: ["animationEnd"] }] } });
|
|
377
476
|
|
|
378
477
|
class BsSwipeDirective {
|
|
379
478
|
container = inject(BsSwipeContainerDirective);
|
|
380
479
|
el = inject((ElementRef));
|
|
381
480
|
destroyRef = inject(DestroyRef);
|
|
382
481
|
observeSize = inject(BsObserveSizeDirective);
|
|
383
|
-
offside = input(false,
|
|
482
|
+
offside = input(false, /* @ts-ignore */
|
|
483
|
+
...(ngDevMode ? [{ debugName: "offside" }] : /* istanbul ignore next */ []));
|
|
484
|
+
/**
|
|
485
|
+
* Word read by SRs after the position label. Default `'slide'` matches the
|
|
486
|
+
* APG carousel pattern; consumers building image galleries / step wizards
|
|
487
|
+
* can override (e.g. `'image'`, `'step'`). Pass `null` or `''` to suppress
|
|
488
|
+
* the attribute entirely (useful for non-paginated swipe UIs).
|
|
489
|
+
*/
|
|
490
|
+
ariaRoledescription = input('slide', /* @ts-ignore */
|
|
491
|
+
...(ngDevMode ? [{ debugName: "ariaRoledescription" }] : /* istanbul ignore next */ []));
|
|
492
|
+
/**
|
|
493
|
+
* Override the auto-computed `"N of M"` label. When `null` (the default),
|
|
494
|
+
* the directive computes it from this slide's index among non-offside
|
|
495
|
+
* siblings and the total non-offside count. Offside (clone) slides get
|
|
496
|
+
* no label and rely on `aria-hidden` instead.
|
|
497
|
+
*/
|
|
498
|
+
ariaLabel = input(null, /* @ts-ignore */
|
|
499
|
+
...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
|
|
500
|
+
effectiveAriaRoledescription = computed(() => {
|
|
501
|
+
if (this.offside())
|
|
502
|
+
return null;
|
|
503
|
+
const value = this.ariaRoledescription();
|
|
504
|
+
return value ? value : null;
|
|
505
|
+
}, /* @ts-ignore */
|
|
506
|
+
...(ngDevMode ? [{ debugName: "effectiveAriaRoledescription" }] : /* istanbul ignore next */ []));
|
|
507
|
+
effectiveAriaLabel = computed(() => {
|
|
508
|
+
if (this.offside())
|
|
509
|
+
return null;
|
|
510
|
+
const explicit = this.ariaLabel();
|
|
511
|
+
if (explicit !== null)
|
|
512
|
+
return explicit;
|
|
513
|
+
const visible = this.container.actualSwipes();
|
|
514
|
+
const i = visible.indexOf(this);
|
|
515
|
+
if (i < 0)
|
|
516
|
+
return null;
|
|
517
|
+
const total = visible.length;
|
|
518
|
+
if (total === 0)
|
|
519
|
+
return null;
|
|
520
|
+
return `${i + 1} of ${total}`;
|
|
521
|
+
}, /* @ts-ignore */
|
|
522
|
+
...(ngDevMode ? [{ debugName: "effectiveAriaLabel" }] : /* istanbul ignore next */ []));
|
|
384
523
|
// Track if we've detected a swipe (vs a tap)
|
|
385
524
|
isSwipeDetected = false;
|
|
386
525
|
// 3px instead of a larger threshold so preventDefault() fires on the first or
|
|
@@ -399,7 +538,8 @@ class BsSwipeDirective {
|
|
|
399
538
|
// pan-y = allow vertical scroll, we handle horizontal swipes
|
|
400
539
|
// pan-x = allow horizontal scroll, we handle vertical swipes
|
|
401
540
|
this.touchAction = (orientation === 'horizontal') ? 'pan-y' : 'pan-x';
|
|
402
|
-
},
|
|
541
|
+
}, /* @ts-ignore */
|
|
542
|
+
...(ngDevMode ? [{ debugName: "orientationEffect" }] : /* istanbul ignore next */ []));
|
|
403
543
|
heightEffect = effect(() => {
|
|
404
544
|
const maxHeight = this.container.maxSlideHeight();
|
|
405
545
|
const orientation = this.container.orientation();
|
|
@@ -407,7 +547,8 @@ class BsSwipeDirective {
|
|
|
407
547
|
// to avoid circular dependency during initial load
|
|
408
548
|
const targetHeight = (orientation === 'vertical' && maxHeight > 10) ? maxHeight : null;
|
|
409
549
|
this.slideHeight = targetHeight;
|
|
410
|
-
},
|
|
550
|
+
}, /* @ts-ignore */
|
|
551
|
+
...(ngDevMode ? [{ debugName: "heightEffect" }] : /* istanbul ignore next */ []));
|
|
411
552
|
inlineBlock = true;
|
|
412
553
|
block = false;
|
|
413
554
|
slideHeight = null;
|
|
@@ -508,10 +649,10 @@ class BsSwipeDirective {
|
|
|
508
649
|
this.container.onSwipe(distance);
|
|
509
650
|
}
|
|
510
651
|
}
|
|
511
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
512
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "
|
|
652
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: BsSwipeDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
653
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.0", type: BsSwipeDirective, isStandalone: true, selector: "[bsSwipe]", inputs: { offside: { classPropertyName: "offside", publicName: "offside", isSignal: true, isRequired: false, transformFunction: null }, ariaRoledescription: { classPropertyName: "ariaRoledescription", publicName: "ariaRoledescription", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.align-top": "true", "class.float-none": "true", "class.w-100": "true", "class.pe-auto": "true", "class.me-0": "true", "class.d-inline-block": "inlineBlock", "class.d-block": "block", "style.height.px": "slideHeight", "style.touch-action": "touchAction", "attr.role": "\"group\"", "attr.aria-roledescription": "effectiveAriaRoledescription()", "attr.aria-label": "effectiveAriaLabel()", "attr.aria-hidden": "offside() ? \"true\" : null" } }, providers: [{ provide: BS_SWIPE_SLIDE, useExisting: BsSwipeDirective }], hostDirectives: [{ directive: i1.BsObserveSizeDirective }], ngImport: i0 });
|
|
513
654
|
}
|
|
514
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
655
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: BsSwipeDirective, decorators: [{
|
|
515
656
|
type: Directive,
|
|
516
657
|
args: [{
|
|
517
658
|
selector: '[bsSwipe]',
|
|
@@ -527,9 +668,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.11", ngImpo
|
|
|
527
668
|
'[class.d-block]': 'block',
|
|
528
669
|
'[style.height.px]': 'slideHeight',
|
|
529
670
|
'[style.touch-action]': 'touchAction',
|
|
671
|
+
'[attr.role]': '"group"',
|
|
672
|
+
'[attr.aria-roledescription]': 'effectiveAriaRoledescription()',
|
|
673
|
+
'[attr.aria-label]': 'effectiveAriaLabel()',
|
|
674
|
+
'[attr.aria-hidden]': 'offside() ? "true" : null',
|
|
530
675
|
},
|
|
531
676
|
}]
|
|
532
|
-
}], ctorParameters: () => [], propDecorators: { offside: [{ type: i0.Input, args: [{ isSignal: true, alias: "offside", required: false }] }] } });
|
|
677
|
+
}], ctorParameters: () => [], propDecorators: { offside: [{ type: i0.Input, args: [{ isSignal: true, alias: "offside", required: false }] }], ariaRoledescription: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaRoledescription", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }] } });
|
|
533
678
|
|
|
534
679
|
/**
|
|
535
680
|
* Marks an element as the static viewport that wraps a `bsSwipeContainer`'s
|
|
@@ -550,21 +695,109 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.11", ngImpo
|
|
|
550
695
|
* - `pointer-events: none` — pairs with the `bsSwipe`'s `pe-auto` so taps
|
|
551
696
|
* on the gaps between slides (or on the viewport's letterboxing) pass
|
|
552
697
|
* through, while the slides themselves remain interactive.
|
|
698
|
+
*
|
|
699
|
+
* Owns the focusable, key-handling region for the swiper widget — APG
|
|
700
|
+
* carousel pattern places the slide-rotation tab stop here, not on the
|
|
701
|
+
* inner container or per-slide. Adds `tabindex` (default `0`), forwards
|
|
702
|
+
* `aria-orientation` + `aria-keyshortcuts` from the inner container, and
|
|
703
|
+
* delegates ArrowLeft/Right/Up/Down + Home/End keydowns to
|
|
704
|
+
* `BsSwipeContainerDirective.onKeyPress` only when the viewport itself is
|
|
705
|
+
* the event target — so an input/link inside a slide keeps its own key
|
|
706
|
+
* behaviour. Also owns the live-region tuple (`aria-live`, `-atomic`,
|
|
707
|
+
* `-relevant`, `-busy`) since the viewport is what SRs watch for slide
|
|
708
|
+
* content changes.
|
|
553
709
|
*/
|
|
554
710
|
class BsSwipeViewportDirective {
|
|
555
|
-
|
|
556
|
-
|
|
711
|
+
el = inject(ElementRef);
|
|
712
|
+
/**
|
|
713
|
+
* Tabindex on the viewport. Default `0` makes the swiper a single tab
|
|
714
|
+
* stop — APG carousel pattern. Pass `null` to opt out (e.g., a swipe
|
|
715
|
+
* card grid that doesn't need a focus stop), or `-1` for
|
|
716
|
+
* programmatic-only focus.
|
|
717
|
+
*/
|
|
718
|
+
tabIndex = input(0, /* @ts-ignore */
|
|
719
|
+
...(ngDevMode ? [{ debugName: "tabIndex" }] : /* istanbul ignore next */ []));
|
|
720
|
+
/**
|
|
721
|
+
* Drives the `aria-live` host attribute. Auto-advancing consumers can pass
|
|
722
|
+
* a computed signal that flips between `'off'` (during rotation) and
|
|
723
|
+
* `'polite'` (when paused / no auto-advance / reduced motion). Default
|
|
724
|
+
* `'off'` matches the carousel's "do not announce on every rotation tick"
|
|
725
|
+
* baseline.
|
|
726
|
+
*/
|
|
727
|
+
ariaLive = input('off', /* @ts-ignore */
|
|
728
|
+
...(ngDevMode ? [{ debugName: "ariaLive" }] : /* istanbul ignore next */ []));
|
|
729
|
+
/**
|
|
730
|
+
* Whether SRs should re-read the entire region on change (`true`) or only
|
|
731
|
+
* the diff (`false`). Default `false` — matches the typical case where
|
|
732
|
+
* only the active slide is meaningful.
|
|
733
|
+
*/
|
|
734
|
+
ariaAtomic = input(false, /* @ts-ignore */
|
|
735
|
+
...(ngDevMode ? [{ debugName: "ariaAtomic" }] : /* istanbul ignore next */ []));
|
|
736
|
+
/**
|
|
737
|
+
* Which kinds of mutations should trigger the live announcement. Default
|
|
738
|
+
* `null` (attribute absent → SRs use their own default of
|
|
739
|
+
* `'additions text'`). Consumers that want to tune this pass a value such
|
|
740
|
+
* as `'all'` or `'additions'`.
|
|
741
|
+
*/
|
|
742
|
+
ariaRelevant = input(null, /* @ts-ignore */
|
|
743
|
+
...(ngDevMode ? [{ debugName: "ariaRelevant" }] : /* istanbul ignore next */ []));
|
|
744
|
+
/**
|
|
745
|
+
* Hide the region from announcements while a transition is in flight, so
|
|
746
|
+
* the SR only reads the *final* slide. Default `null` (not busy);
|
|
747
|
+
* consumers wanting the polish wire it to the swipe container's
|
|
748
|
+
* `isAnimating` signal.
|
|
749
|
+
*/
|
|
750
|
+
ariaBusy = input(null, /* @ts-ignore */
|
|
751
|
+
...(ngDevMode ? [{ debugName: "ariaBusy" }] : /* istanbul ignore next */ []));
|
|
752
|
+
/**
|
|
753
|
+
* The inner `bsSwipeContainer` is required for the keydown delegation
|
|
754
|
+
* and the orientation / keyshortcuts forwarding. `contentChild` is the
|
|
755
|
+
* natural query because the container is always a descendant; the lookup
|
|
756
|
+
* settles on first CD pass.
|
|
757
|
+
*/
|
|
758
|
+
container = contentChild(BsSwipeContainerDirective, /* @ts-ignore */
|
|
759
|
+
...(ngDevMode ? [{ debugName: "container" }] : /* istanbul ignore next */ []));
|
|
760
|
+
effectiveOrientation = computed(() => this.container()?.orientation() ?? null, /* @ts-ignore */
|
|
761
|
+
...(ngDevMode ? [{ debugName: "effectiveOrientation" }] : /* istanbul ignore next */ []));
|
|
762
|
+
effectiveKeyshortcuts = computed(() => this.container()?.ariaKeyshortcuts() ?? null, /* @ts-ignore */
|
|
763
|
+
...(ngDevMode ? [{ debugName: "effectiveKeyshortcuts" }] : /* istanbul ignore next */ []));
|
|
764
|
+
/**
|
|
765
|
+
* Forwards the keydown to the container only when the viewport itself
|
|
766
|
+
* holds focus — `event.target === host` — so a focusable descendant
|
|
767
|
+
* (form input, link inside a slide) keeps native key handling. APG
|
|
768
|
+
* carousel pattern requires this guard.
|
|
769
|
+
*/
|
|
770
|
+
onKeyPress(event) {
|
|
771
|
+
if (event.target !== this.el.nativeElement)
|
|
772
|
+
return;
|
|
773
|
+
this.container()?.onKeyPress(event);
|
|
774
|
+
}
|
|
775
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: BsSwipeViewportDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
776
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "22.0.0", type: BsSwipeViewportDirective, isStandalone: true, selector: "[bsSwipeViewport]", inputs: { tabIndex: { classPropertyName: "tabIndex", publicName: "tabIndex", isSignal: true, isRequired: false, transformFunction: null }, ariaLive: { classPropertyName: "ariaLive", publicName: "ariaLive", isSignal: true, isRequired: false, transformFunction: null }, ariaAtomic: { classPropertyName: "ariaAtomic", publicName: "ariaAtomic", isSignal: true, isRequired: false, transformFunction: null }, ariaRelevant: { classPropertyName: "ariaRelevant", publicName: "ariaRelevant", isSignal: true, isRequired: false, transformFunction: null }, ariaBusy: { classPropertyName: "ariaBusy", publicName: "ariaBusy", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "keydown.ArrowLeft": "onKeyPress($event)", "keydown.ArrowRight": "onKeyPress($event)", "keydown.ArrowUp": "onKeyPress($event)", "keydown.ArrowDown": "onKeyPress($event)", "keydown.Home": "onKeyPress($event)", "keydown.End": "onKeyPress($event)" }, properties: { "style.overscroll-behavior": "\"contain\"", "style.pointer-events": "\"none\"", "attr.tabindex": "tabIndex()", "attr.aria-live": "ariaLive()", "attr.aria-atomic": "ariaAtomic()", "attr.aria-relevant": "ariaRelevant()", "attr.aria-busy": "ariaBusy()", "attr.aria-orientation": "effectiveOrientation()", "attr.aria-keyshortcuts": "effectiveKeyshortcuts()" } }, queries: [{ propertyName: "container", first: true, predicate: BsSwipeContainerDirective, descendants: true, isSignal: true }], ngImport: i0 });
|
|
557
777
|
}
|
|
558
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
778
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: BsSwipeViewportDirective, decorators: [{
|
|
559
779
|
type: Directive,
|
|
560
780
|
args: [{
|
|
561
781
|
selector: '[bsSwipeViewport]',
|
|
562
782
|
host: {
|
|
563
783
|
'[style.overscroll-behavior]': '"contain"',
|
|
564
784
|
'[style.pointer-events]': '"none"',
|
|
785
|
+
'[attr.tabindex]': 'tabIndex()',
|
|
786
|
+
'[attr.aria-live]': 'ariaLive()',
|
|
787
|
+
'[attr.aria-atomic]': 'ariaAtomic()',
|
|
788
|
+
'[attr.aria-relevant]': 'ariaRelevant()',
|
|
789
|
+
'[attr.aria-busy]': 'ariaBusy()',
|
|
790
|
+
'[attr.aria-orientation]': 'effectiveOrientation()',
|
|
791
|
+
'[attr.aria-keyshortcuts]': 'effectiveKeyshortcuts()',
|
|
792
|
+
'(keydown.ArrowLeft)': 'onKeyPress($event)',
|
|
793
|
+
'(keydown.ArrowRight)': 'onKeyPress($event)',
|
|
794
|
+
'(keydown.ArrowUp)': 'onKeyPress($event)',
|
|
795
|
+
'(keydown.ArrowDown)': 'onKeyPress($event)',
|
|
796
|
+
'(keydown.Home)': 'onKeyPress($event)',
|
|
797
|
+
'(keydown.End)': 'onKeyPress($event)',
|
|
565
798
|
},
|
|
566
799
|
}]
|
|
567
|
-
}] });
|
|
800
|
+
}], propDecorators: { tabIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "tabIndex", required: false }] }], ariaLive: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLive", required: false }] }], ariaAtomic: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaAtomic", required: false }] }], ariaRelevant: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaRelevant", required: false }] }], ariaBusy: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaBusy", required: false }] }], container: [{ type: i0.ContentChild, args: [i0.forwardRef(() => BsSwipeContainerDirective), { isSignal: true }] }] } });
|
|
568
801
|
|
|
569
802
|
/**
|
|
570
803
|
* Generated bundle index. Do not edit.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mintplayer-ng-swiper-swiper.mjs","sources":["../../../../libs/mintplayer-ng-swiper/swiper/src/tokens/bs-swipe-slide.ts","../../../../libs/mintplayer-ng-swiper/swiper/src/directives/swipe-container/swipe-container.directive.ts","../../../../libs/mintplayer-ng-swiper/swiper/src/directives/swipe/swipe.directive.ts","../../../../libs/mintplayer-ng-swiper/swiper/src/directives/swipe-viewport/swipe-viewport.directive.ts","../../../../libs/mintplayer-ng-swiper/swiper/mintplayer-ng-swiper-swiper.ts"],"sourcesContent":["import { InjectionToken, Signal } from '@angular/core';\nimport { Size } from '@mintplayer/ng-swiper/observe-size';\n\n/**\n * Minimal contract a slide must satisfy to be queried by `bsSwipeContainer`.\n *\n * The container uses two pieces of slide state:\n * - `offside()` distinguishes wraparound clones from real slides\n * - `observeSize.size()` feeds the container's slide-height computation\n *\n * Modelling this as a token + interface (rather than `contentChildren(BsSwipeDirective)`\n * directly) breaks a circular import between the swipe and swipe-container\n * directive modules. The cycle is harmless for class-based `inject()` (which\n * resolves at construction time), but it caused the container's lazy\n * `extractQueriesMetadata` getter to see `BsSwipeDirective` as undefined in\n * vitest's JIT-compiled test environment, which made render-based specs\n * impossible. Routing the query through this token-and-interface pair fixes\n * that without requiring a deeper refactor.\n */\nexport interface BsSwipeSlide {\n offside: Signal<boolean>;\n observeSize: { size: Signal<Size | undefined> };\n}\n\nexport const BS_SWIPE_SLIDE = new InjectionToken<BsSwipeSlide>('BsSwipeSlide');\n","import { DOCUMENT } from '@angular/common';\nimport { animate, AnimationBuilder, AnimationPlayer, style } from '@angular/animations';\nimport { AfterViewInit, computed, contentChildren, Directive, effect, ElementRef, inject, input, model, OnDestroy, output, signal } from '@angular/core';\nimport { BsObserveSizeDirective, Size } from '@mintplayer/ng-swiper/observe-size';\nimport { LastTouch } from '../../interfaces/last-touch';\nimport { StartTouch } from '../../interfaces/start-touch';\nimport { BS_SWIPE_SLIDE } from '../../tokens/bs-swipe-slide';\n\n@Directive({\n selector: '[bsSwipeContainer]',\n exportAs: 'bsSwipeContainer',\n hostDirectives: [BsObserveSizeDirective],\n host: {\n '[style.margin-left.%]': 'offsetLeft()',\n '[style.margin-right.%]': 'offsetRight()',\n '[style.margin-top.px]': 'offsetTopPx()',\n '[style.margin-bottom.px]': 'offsetBottomPx()',\n '[style.touch-action]': 'touchAction()',\n '[style.overscroll-behavior]': '\"contain\"',\n // Pairs with bsSwipe's [class.pe-auto]: gaps between slides are click-through,\n // slides themselves remain interactive.\n '[style.pointer-events]': '\"none\"',\n // Horizontal mode lays slides out as inline-block in a single row; nowrap\n // prevents them wrapping when their combined width exceeds the container.\n '[style.white-space]': 'orientation() === \"horizontal\" ? \"nowrap\" : null',\n // Vertical mode stacks slides as a column. Horizontal mode is explicitly\n // 'block' so a consumer-applied class (e.g. d-flex) can't silently change\n // the layout model — the directive's slides assume an inline-block flow.\n '[style.display]': 'orientation() === \"vertical\" ? \"flex\" : \"block\"',\n '[style.flex-direction]': 'orientation() === \"vertical\" ? \"column\" : null',\n },\n})\nexport class BsSwipeContainerDirective implements AfterViewInit, OnDestroy {\n private animationBuilder = inject(AnimationBuilder);\n private observeSize = inject(BsObserveSizeDirective);\n containerElement = inject(ElementRef<HTMLDivElement>);\n document = inject(DOCUMENT) as Document;\n\n offsetLeft = signal<number | null>(null);\n offsetRight = signal<number | null>(null);\n offsetTopPx = signal<number | null>(null);\n offsetBottomPx = signal<number | null>(null);\n\n readonly swipes = contentChildren(BS_SWIPE_SLIDE);\n\n minimumOffset = input(50);\n animation = input<'slide' | 'fade' | 'none'>('slide');\n orientation = input<'horizontal' | 'vertical'>('horizontal');\n // Mirror swiper.js's .swiper-horizontal / .swiper-vertical: declare the axis\n // we own at the container level so Firefox Android's APZ excludes the\n // perpendicular gesture (incl. pull-to-refresh) at touchstart arbitration time.\n touchAction = computed(() => this.orientation() === 'horizontal' ? 'pan-y' : 'pan-x');\n imageIndex = model<number>(0);\n animationStart = output<void>();\n animationEnd = output<void>();\n\n isViewInited = signal<boolean>(false);\n isAnimating = signal<boolean>(false);\n private isDestroyed = false;\n startTouch = signal<StartTouch | null>(null);\n lastTouch = signal<LastTouch | null>(null);\n pendingAnimation?: AnimationPlayer;\n private pendingFadeTimeoutId?: ReturnType<typeof setTimeout>;\n\n // Computed signals for derived state\n offset = computed(() => {\n const startTouch = this.startTouch();\n const lastTouch = this.lastTouch();\n const imageIndex = this.imageIndex();\n const isViewInited = this.isViewInited();\n const orientation = this.orientation();\n const containerSize = this.observeSize.size();\n const maxSlideHeight = this.maxSlideHeight();\n\n if (!isViewInited) {\n return (-imageIndex * 100);\n } else if (!!startTouch && !!lastTouch) {\n // For horizontal: use container width\n // For vertical: use maxSlideHeight (single slide height, not total container height)\n const containerLength = orientation === 'horizontal'\n ? (containerSize?.width ?? this.containerElement.nativeElement.clientWidth)\n : maxSlideHeight;\n if (containerLength === 0) {\n return (-imageIndex * 100);\n }\n const delta = orientation === 'horizontal'\n ? (lastTouch.position.x - startTouch.position.x)\n : (lastTouch.position.y - startTouch.position.y);\n return (-imageIndex * 100 + (delta / containerLength) * 100);\n } else {\n return (-imageIndex * 100);\n }\n });\n\n padLeft = computed(() => {\n const swipes = this.swipes();\n if (swipes.length === 0) return 1; // Default to 1 to prevent container collapse before swipes are loaded\n\n let count = 0;\n for (const s of swipes) {\n if (!s.offside()) {\n break;\n } else {\n count++;\n }\n }\n return count;\n });\n\n padRight = computed(() => {\n const swipes = this.swipes();\n if (swipes.length === 0) return 1; // Default to 1 to prevent container collapse before swipes are loaded\n\n let count = 0;\n for (const s of [...swipes].reverse()) {\n if (!s.offside()) {\n break;\n } else {\n count++;\n }\n }\n return count;\n });\n\n offsetPrimary = computed(() => this.offset() - this.padLeft() * 100);\n offsetSecondary = computed(() => -(this.offset() - this.padLeft() * 100) - (this.padRight() - 1) * 100);\n\n actualSwipes = computed(() => {\n const swipes = this.swipes();\n return swipes.filter(swipe => !swipe.offside());\n });\n\n // Computed signal that reactively tracks all swipe sizes\n private slideSizes = computed(() => {\n const actualSwipes = this.actualSwipes();\n if (!actualSwipes || actualSwipes.length === 0) {\n return [];\n }\n // Reading each swipe's size() creates reactive dependencies\n return actualSwipes.map(swipe => swipe.observeSize.size());\n });\n\n maxSlideHeight = computed(() => {\n const slideSizes = this.slideSizes();\n const heights = slideSizes.map(s => s?.height ?? 1);\n return heights.length ? Math.max(...heights) : 1;\n });\n\n currentSlideHeight = computed<number | null>(() => {\n const slideSizes = this.slideSizes();\n const imageIndex = this.imageIndex();\n const orientation = this.orientation();\n const heights = slideSizes.map(s => s?.height ?? 0);\n const maxHeight = heights.length ? Math.max(...heights) : 0;\n const currHeight: number = slideSizes[imageIndex]?.height ?? maxHeight;\n const result = (orientation === 'vertical') ? maxHeight : currHeight;\n // Return null if measurements aren't valid yet to avoid collapsing the carousel\n return result > 10 ? result : null;\n });\n\n constructor() {\n // Effect to update offsetLeft/offsetTopPx based on offsetPrimary and orientation\n effect(() => {\n const animation = this.animation();\n const offsetPrimary = this.offsetPrimary();\n const orientation = this.orientation();\n const maxSlideHeight = this.maxSlideHeight();\n const isAnimating = this.isAnimating();\n\n // Skip updating offsets during animation to avoid interfering with CSS animation\n if (isAnimating) {\n return;\n }\n\n // In fade mode slides are positioned by CSS (position: absolute) rather\n // than by margin offsets — keep the host margins null so they don't\n // visually shift the absolute layer's containing block.\n if (animation === 'fade') {\n this.offsetLeft.set(null);\n this.offsetTopPx.set(null);\n return;\n }\n\n if (orientation === 'horizontal') {\n this.offsetLeft.set(offsetPrimary);\n this.offsetTopPx.set(null);\n } else {\n // For vertical mode, convert percentage to pixels using slide height\n // offsetPrimary is in percentage units (e.g., -100 means -100%)\n // We need to convert to pixels based on actual slide height\n this.offsetTopPx.set((offsetPrimary / 100) * maxSlideHeight);\n this.offsetLeft.set(null);\n }\n });\n\n // Effect to update offsetRight/offsetBottomPx based on offsetSecondary and orientation\n effect(() => {\n const animation = this.animation();\n const offsetSecondary = this.offsetSecondary();\n const orientation = this.orientation();\n const maxSlideHeight = this.maxSlideHeight();\n const isAnimating = this.isAnimating();\n\n // Skip updating offsets during animation to avoid interfering with CSS animation\n if (isAnimating) {\n return;\n }\n\n if (animation === 'fade') {\n this.offsetRight.set(null);\n this.offsetBottomPx.set(null);\n return;\n }\n\n if (orientation === 'horizontal') {\n this.offsetRight.set(offsetSecondary);\n this.offsetBottomPx.set(null);\n } else {\n // For vertical mode, convert percentage to pixels using slide height\n this.offsetBottomPx.set((offsetSecondary / 100) * maxSlideHeight);\n this.offsetRight.set(null);\n }\n });\n\n }\n\n ngAfterViewInit() {\n this.isViewInited.set(true);\n }\n\n ngOnDestroy() {\n this.isDestroyed = true;\n this.pendingAnimation?.destroy();\n if (this.pendingFadeTimeoutId !== undefined) {\n clearTimeout(this.pendingFadeTimeoutId);\n this.pendingFadeTimeoutId = undefined;\n }\n }\n\n animateToIndexByDx(distance: number) {\n const imageIndex = this.imageIndex();\n const actualSwipes = this.actualSwipes();\n\n let newIndex: number;\n if (Math.abs(distance) < this.minimumOffset()) {\n newIndex = imageIndex;\n } else {\n newIndex = imageIndex + (distance < 0 ? 1 : -1);\n }\n\n this.animateToIndex(imageIndex, newIndex, distance, actualSwipes?.length ?? 1);\n }\n\n animateToIndex(oldIndex: number, newIndex: number, distance: number, totalSlides: number) {\n const animation = this.animation();\n const orientation = this.orientation();\n const containerElement = this.containerElement.nativeElement;\n const maxSlideHeight = this.maxSlideHeight();\n // For vertical mode, use maxSlideHeight instead of container height\n const containerLength = orientation === 'horizontal'\n ? containerElement.clientWidth\n : maxSlideHeight;\n\n this.animationStart.emit();\n\n // Handle 'none' animation mode - instant transition\n if (animation === 'none') {\n // Correct the image index immediately\n if (newIndex === -1) {\n this.imageIndex.set(totalSlides - 1);\n } else if (newIndex === totalSlides) {\n this.imageIndex.set(0);\n } else {\n this.imageIndex.set(newIndex);\n }\n this.startTouch.set(null);\n this.lastTouch.set(null);\n this.animationEnd.emit();\n return;\n }\n\n // Handle 'fade' animation mode - opacity is driven by CSS in the consumer\n // (via [class.active] + a CSS transition). Update the index synchronously\n // and defer animationEnd to roughly match the CSS transition duration so\n // consumers waiting on it (e.g. auto-advance pacing) still see consistent\n // event timing across animation modes.\n if (animation === 'fade') {\n // If a previous fade is still pending its animationEnd, cancel it so we\n // don't double-emit when navigation is triggered rapidly.\n if (this.pendingFadeTimeoutId !== undefined) {\n clearTimeout(this.pendingFadeTimeoutId);\n }\n if (newIndex === -1) {\n this.imageIndex.set(totalSlides - 1);\n } else if (newIndex === totalSlides) {\n this.imageIndex.set(0);\n } else {\n this.imageIndex.set(newIndex);\n }\n this.startTouch.set(null);\n this.lastTouch.set(null);\n this.pendingFadeTimeoutId = setTimeout(() => {\n this.pendingFadeTimeoutId = undefined;\n if (!this.isDestroyed) this.animationEnd.emit();\n }, 500);\n return;\n }\n\n // Set animating flag and clear host bindings so animation has full control\n this.isAnimating.set(true);\n if (orientation === 'horizontal') {\n this.offsetLeft.set(null);\n this.offsetRight.set(null);\n } else {\n this.offsetTopPx.set(null);\n this.offsetBottomPx.set(null);\n }\n\n if (orientation === 'horizontal') {\n this.pendingAnimation = this.animationBuilder.build([\n style({\n 'margin-left': (-(oldIndex + 1) * containerLength + distance) + 'px',\n 'margin-right': ((oldIndex + 1) * containerLength - distance) + 'px',\n }),\n animate('500ms ease', style({\n 'margin-left': (-(newIndex + 1) * containerLength) + 'px',\n 'margin-right': ((newIndex + 1) * containerLength) + 'px',\n })),\n ]).create(containerElement);\n } else {\n this.pendingAnimation = this.animationBuilder.build([\n style({\n 'margin-top': (-(oldIndex + 1) * containerLength + distance) + 'px',\n 'margin-bottom': ((oldIndex + 1) * containerLength - distance) + 'px',\n }),\n animate('500ms ease', style({\n 'margin-top': (-(newIndex + 1) * containerLength) + 'px',\n 'margin-bottom': ((newIndex + 1) * containerLength) + 'px',\n })),\n ]).create(containerElement);\n }\n this.pendingAnimation.onDone(() => {\n if (this.isDestroyed) return;\n // Correct the image index\n if (newIndex === -1) {\n this.imageIndex.set(totalSlides - 1);\n } else if (newIndex === totalSlides) {\n this.imageIndex.set(0);\n } else {\n this.imageIndex.set(newIndex);\n }\n this.startTouch.set(null);\n this.lastTouch.set(null);\n this.pendingAnimation?.destroy();\n this.pendingAnimation = undefined;\n // Clear animating flag so effects can update offsets again\n this.isAnimating.set(false);\n this.animationEnd.emit();\n });\n this.pendingAnimation.play();\n }\n\n onSwipe(distance: number) {\n this.animateToIndexByDx(distance);\n }\n\n previous() {\n this.gotoAnimate(-1, 'relative');\n }\n\n next() {\n this.gotoAnimate(1, 'relative');\n }\n\n goto(index: number) {\n this.gotoAnimate(index, 'absolute');\n }\n\n private gotoAnimate(index: number, type: 'absolute' | 'relative') {\n this.pendingAnimation?.finish();\n setTimeout(() => {\n if (this.isDestroyed) return;\n this.pendingAnimation?.finish();\n const actualSwipes = this.actualSwipes();\n const imageIndex = this.imageIndex();\n const idx = (type === 'relative') ? imageIndex + index : index;\n this.animateToIndex(imageIndex, idx, 0, actualSwipes?.length ?? 1);\n }, 20);\n }\n\n}\n","import { afterNextRender, DestroyRef, Directive, effect, ElementRef, inject, input } from \"@angular/core\";\nimport { BsObserveSizeDirective } from \"@mintplayer/ng-swiper/observe-size\";\nimport { BsSwipeContainerDirective } from \"../swipe-container/swipe-container.directive\";\nimport { BS_SWIPE_SLIDE, BsSwipeSlide } from \"../../tokens/bs-swipe-slide\";\n\n@Directive({\n selector: '[bsSwipe]',\n hostDirectives: [BsObserveSizeDirective],\n providers: [{ provide: BS_SWIPE_SLIDE, useExisting: BsSwipeDirective }],\n host: {\n '[class.align-top]': 'true',\n '[class.float-none]': 'true',\n '[class.w-100]': 'true',\n '[class.pe-auto]': 'true',\n '[class.me-0]': 'true',\n '[class.d-inline-block]': 'inlineBlock',\n '[class.d-block]': 'block',\n '[style.height.px]': 'slideHeight',\n '[style.touch-action]': 'touchAction',\n },\n})\nexport class BsSwipeDirective implements BsSwipeSlide {\n private container = inject(BsSwipeContainerDirective);\n private el = inject(ElementRef<HTMLElement>);\n private destroyRef = inject(DestroyRef);\n observeSize = inject(BsObserveSizeDirective);\n\n public offside = input(false);\n\n // Track if we've detected a swipe (vs a tap)\n private isSwipeDetected = false;\n // 3px instead of a larger threshold so preventDefault() fires on the first or\n // second touchmove — Firefox Android's APZ can otherwise claim a downward\n // gesture as pull-to-refresh before our handler arbitrates the direction.\n private readonly SWIPE_THRESHOLD = 3; // pixels\n\n // Synchronous copy of start position for use during the 20ms gap\n // before startTouch signal is set (needed to call preventDefault\n // on early touchmove events to block Firefox Android PullToRefresh)\n private touchStartPos: { x: number, y: number } | null = null;\n\n private orientationEffect = effect(() => {\n const orientation = this.container.orientation();\n this.inlineBlock = (orientation === 'horizontal');\n this.block = (orientation === 'vertical');\n // Tell browser which axis we handle, allowing scroll on the other axis\n // pan-y = allow vertical scroll, we handle horizontal swipes\n // pan-x = allow horizontal scroll, we handle vertical swipes\n this.touchAction = (orientation === 'horizontal') ? 'pan-y' : 'pan-x';\n });\n\n private heightEffect = effect(() => {\n const maxHeight = this.container.maxSlideHeight();\n const orientation = this.container.orientation();\n // Only set height when we have valid measurements (> 10px threshold)\n // to avoid circular dependency during initial load\n const targetHeight = (orientation === 'vertical' && maxHeight > 10) ? maxHeight : null;\n this.slideHeight = targetHeight;\n });\n\n inlineBlock = true;\n block = false;\n slideHeight: number | null = null;\n touchAction: 'pan-x' | 'pan-y' = 'pan-y';\n\n constructor() {\n // Register touch listeners manually with { passive: false } for touchmove/touchend.\n // Angular's host event bindings register passive listeners by default for touch events,\n // which silently ignores preventDefault(). This caused Firefox Android's PullToRefresh\n // to trigger because the browser's default action was never actually cancelled.\n // Wrapped in afterNextRender so it doesn't run during SSR (nativeElement is not a real\n // DOM element on the server); the callback fires before the next paint, so it always\n // attaches before the user can physically touch the slide.\n afterNextRender(() => {\n const elem = this.el.nativeElement;\n const onTouchStart = (ev: TouchEvent) => this.onTouchStart(ev);\n const onTouchMove = (ev: TouchEvent) => this.onTouchMove(ev);\n const onTouchEnd = (ev: TouchEvent) => this.onTouchEnd(ev);\n\n elem.addEventListener('touchstart', onTouchStart, { passive: true });\n elem.addEventListener('touchmove', onTouchMove, { passive: false });\n elem.addEventListener('touchend', onTouchEnd, { passive: false });\n\n this.destroyRef.onDestroy(() => {\n elem.removeEventListener('touchstart', onTouchStart);\n elem.removeEventListener('touchmove', onTouchMove);\n elem.removeEventListener('touchend', onTouchEnd);\n });\n });\n }\n\n onTouchStart(ev: TouchEvent) {\n if (ev.touches.length === 1) {\n ev.stopPropagation(); // Prevent bubbling, but allow clicks\n this.isSwipeDetected = false;\n this.touchStartPos = { x: ev.touches[0].clientX, y: ev.touches[0].clientY };\n this.container.pendingAnimation?.finish();\n\n setTimeout(() => {\n this.container.startTouch.set({\n position: {\n x: ev.touches[0].clientX,\n y: ev.touches[0].clientY,\n },\n timestamp: Date.now(),\n });\n this.container.lastTouch.set({\n position: {\n x: ev.touches[0].clientX,\n y: ev.touches[0].clientY,\n },\n isTouching: true,\n });\n }, 20);\n }\n }\n\n onTouchMove(ev: TouchEvent) {\n ev.stopPropagation();\n\n // Direction lock: only own the gesture when movement on our axis exceeds the\n // threshold AND dominates the perpendicular axis. Without the dominance check,\n // a small primary-axis jitter combined with a real perpendicular scroll would\n // wrongly block native page scrolling. Once locked in, keep calling\n // preventDefault for the rest of the stroke.\n // Use synchronous touchStartPos as fallback during the 20ms gap before the\n // startTouch signal is set, so preventDefault fires on early touchmove events\n // (prevents Firefox Android PullToRefresh).\n const startTouch = this.container.startTouch();\n const refPos = startTouch?.position ?? this.touchStartPos;\n if (refPos) {\n const dx = Math.abs(ev.touches[0].clientX - refPos.x);\n const dy = Math.abs(ev.touches[0].clientY - refPos.y);\n const orientation = this.container.orientation();\n const primary = orientation === 'horizontal' ? dx : dy;\n const perpendicular = orientation === 'horizontal' ? dy : dx;\n if (!this.isSwipeDetected && primary > this.SWIPE_THRESHOLD && primary >= perpendicular) {\n this.isSwipeDetected = true;\n }\n if (this.isSwipeDetected) {\n ev.preventDefault();\n }\n }\n\n this.container.lastTouch.set({\n position: {\n x: ev.touches[0].clientX,\n y: ev.touches[0].clientY,\n },\n isTouching: true,\n });\n }\n\n onTouchEnd(ev: TouchEvent) {\n ev.stopPropagation();\n this.touchStartPos = null;\n if (this.isSwipeDetected) {\n ev.preventDefault();\n }\n\n const startTouch = this.container.startTouch();\n const lastTouch = this.container.lastTouch();\n const orientation = this.container.orientation();\n\n if (!!startTouch && !!lastTouch) {\n const distance = (orientation === 'horizontal')\n ? lastTouch.position.x - startTouch.position.x\n : lastTouch.position.y - startTouch.position.y;\n this.container.onSwipe(distance);\n }\n }\n\n}\n","import { Directive } from '@angular/core';\n\n/**\n * Marks an element as the static viewport that wraps a `bsSwipeContainer`'s\n * moving track. The element it's applied to is expected to have\n * `overflow: hidden` (via a class or its own styling) so the moving track\n * is clipped to a fixed window.\n *\n * Applies the CSS that historically lived on the consuming component's\n * outer wrapper (bs-carousel's `.carousel-inner`):\n *\n * - `overscroll-behavior: contain` — keeps Firefox Android's APZ from\n * chaining a vertical drag into the document and triggering native\n * pull-to-refresh. Even though Firefox documented this as not honoured\n * for PTR historically, the empirical behaviour on the carousel demo\n * showed this property was load-bearing alongside the per-slide\n * `touch-action: pan-x`.\n *\n * - `pointer-events: none` — pairs with the `bsSwipe`'s `pe-auto` so taps\n * on the gaps between slides (or on the viewport's letterboxing) pass\n * through, while the slides themselves remain interactive.\n */\n@Directive({\n selector: '[bsSwipeViewport]',\n host: {\n '[style.overscroll-behavior]': '\"contain\"',\n '[style.pointer-events]': '\"none\"',\n },\n})\nexport class BsSwipeViewportDirective {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"mintplayer-ng-swiper-swiper.mjs","sources":["../../../../libs/mintplayer-ng-swiper/swiper/src/tokens/bs-swipe-slide.ts","../../../../libs/mintplayer-ng-swiper/swiper/src/directives/swipe-container/swipe-container.directive.ts","../../../../libs/mintplayer-ng-swiper/swiper/src/directives/swipe/swipe.directive.ts","../../../../libs/mintplayer-ng-swiper/swiper/src/directives/swipe-viewport/swipe-viewport.directive.ts","../../../../libs/mintplayer-ng-swiper/swiper/mintplayer-ng-swiper-swiper.ts"],"sourcesContent":["import { InjectionToken, Signal } from '@angular/core';\nimport { Size } from '@mintplayer/ng-swiper/observe-size';\n\n/**\n * Minimal contract a slide must satisfy to be queried by `bsSwipeContainer`.\n *\n * The container uses two pieces of slide state:\n * - `offside()` distinguishes wraparound clones from real slides\n * - `observeSize.size()` feeds the container's slide-height computation\n *\n * Modelling this as a token + interface (rather than `contentChildren(BsSwipeDirective)`\n * directly) breaks a circular import between the swipe and swipe-container\n * directive modules. The cycle is harmless for class-based `inject()` (which\n * resolves at construction time), but it caused the container's lazy\n * `extractQueriesMetadata` getter to see `BsSwipeDirective` as undefined in\n * vitest's JIT-compiled test environment, which made render-based specs\n * impossible. Routing the query through this token-and-interface pair fixes\n * that without requiring a deeper refactor.\n */\nexport interface BsSwipeSlide {\n offside: Signal<boolean>;\n observeSize: { size: Signal<Size | undefined> };\n}\n\nexport const BS_SWIPE_SLIDE = new InjectionToken<BsSwipeSlide>('BsSwipeSlide');\n","import { DOCUMENT } from '@angular/common';\nimport { animate, AnimationBuilder, AnimationPlayer, style } from '@angular/animations';\nimport { AfterViewInit, computed, contentChildren, Directive, effect, ElementRef, inject, input, model, OnDestroy, output, signal } from '@angular/core';\nimport { BsObserveSizeDirective, Size } from '@mintplayer/ng-swiper/observe-size';\nimport { LastTouch } from '../../interfaces/last-touch';\nimport { StartTouch } from '../../interfaces/start-touch';\nimport { BS_SWIPE_SLIDE } from '../../tokens/bs-swipe-slide';\n\n@Directive({\n selector: '[bsSwipeContainer]',\n exportAs: 'bsSwipeContainer',\n hostDirectives: [BsObserveSizeDirective],\n host: {\n '[style.margin-left.%]': 'offsetLeft()',\n '[style.margin-right.%]': 'offsetRight()',\n '[style.margin-top.px]': 'offsetTopPx()',\n '[style.margin-bottom.px]': 'offsetBottomPx()',\n '[style.touch-action]': 'touchAction()',\n '[style.overscroll-behavior]': '\"contain\"',\n // Pairs with bsSwipe's [class.pe-auto]: gaps between slides are click-through,\n // slides themselves remain interactive.\n '[style.pointer-events]': '\"none\"',\n // Horizontal mode lays slides out as inline-block in a single row; nowrap\n // prevents them wrapping when their combined width exceeds the container.\n '[style.white-space]': 'orientation() === \"horizontal\" ? \"nowrap\" : null',\n // Vertical mode stacks slides as a column. Horizontal mode is explicitly\n // 'block' so a consumer-applied class (e.g. d-flex) can't silently change\n // the layout model — the directive's slides assume an inline-block flow.\n '[style.display]': 'orientation() === \"vertical\" ? \"flex\" : \"block\"',\n '[style.flex-direction]': 'orientation() === \"vertical\" ? \"column\" : null',\n },\n})\nexport class BsSwipeContainerDirective implements AfterViewInit, OnDestroy {\n private animationBuilder = inject(AnimationBuilder);\n private observeSize = inject(BsObserveSizeDirective);\n containerElement = inject(ElementRef<HTMLDivElement>);\n document = inject(DOCUMENT) as Document;\n\n offsetLeft = signal<number | null>(null);\n offsetRight = signal<number | null>(null);\n offsetTopPx = signal<number | null>(null);\n offsetBottomPx = signal<number | null>(null);\n\n readonly swipes = contentChildren(BS_SWIPE_SLIDE);\n\n minimumOffset = input(50);\n animation = input<'slide' | 'fade' | 'none'>('slide');\n orientation = input<'horizontal' | 'vertical'>('horizontal');\n /**\n * When true, the container handles ArrowLeft/Right (horizontal) or\n * ArrowUp/Down (vertical) plus Home/End to move between slides. The\n * keydown listeners live on the wrapping `bsSwipeViewport` host (only\n * fire when focus is on the viewport itself); this input still gates\n * dispatch inside `onKeyPress`.\n */\n keyboardEvents = input(true);\n // Mirror swiper.js's .swiper-horizontal / .swiper-vertical: declare the axis\n // we own at the container level so Firefox Android's APZ excludes the\n // perpendicular gesture (incl. pull-to-refresh) at touchstart arbitration time.\n touchAction = computed(() => this.orientation() === 'horizontal' ? 'pan-y' : 'pan-x');\n /**\n * Computed `aria-keyshortcuts` value advertising the keys the directive\n * actually responds to. Returns `null` (attribute removed) when keyboard\n * handling is disabled, so SRs never advertise shortcuts that won't fire.\n */\n ariaKeyshortcuts = computed(() => {\n if (!this.keyboardEvents()) return null;\n return this.orientation() === 'horizontal'\n ? 'ArrowLeft ArrowRight Home End'\n : 'ArrowUp ArrowDown Home End';\n });\n imageIndex = model<number>(0);\n animationStart = output<void>();\n animationEnd = output<void>();\n\n isViewInited = signal<boolean>(false);\n isAnimating = signal<boolean>(false);\n private isDestroyed = false;\n startTouch = signal<StartTouch | null>(null);\n lastTouch = signal<LastTouch | null>(null);\n pendingAnimation?: AnimationPlayer;\n private pendingFadeTimeoutId?: ReturnType<typeof setTimeout>;\n\n // Computed signals for derived state\n offset = computed(() => {\n const startTouch = this.startTouch();\n const lastTouch = this.lastTouch();\n const imageIndex = this.imageIndex();\n const isViewInited = this.isViewInited();\n const orientation = this.orientation();\n const containerSize = this.observeSize.size();\n const maxSlideHeight = this.maxSlideHeight();\n\n if (!isViewInited) {\n return (-imageIndex * 100);\n } else if (!!startTouch && !!lastTouch) {\n // For horizontal: use container width\n // For vertical: use maxSlideHeight (single slide height, not total container height)\n const containerLength = orientation === 'horizontal'\n ? (containerSize?.width ?? this.containerElement.nativeElement.clientWidth)\n : maxSlideHeight;\n if (containerLength === 0) {\n return (-imageIndex * 100);\n }\n const delta = orientation === 'horizontal'\n ? (lastTouch.position.x - startTouch.position.x)\n : (lastTouch.position.y - startTouch.position.y);\n return (-imageIndex * 100 + (delta / containerLength) * 100);\n } else {\n return (-imageIndex * 100);\n }\n });\n\n padLeft = computed(() => {\n const swipes = this.swipes();\n if (swipes.length === 0) return 1; // Default to 1 to prevent container collapse before swipes are loaded\n\n let count = 0;\n for (const s of swipes) {\n if (!s.offside()) {\n break;\n } else {\n count++;\n }\n }\n return count;\n });\n\n padRight = computed(() => {\n const swipes = this.swipes();\n if (swipes.length === 0) return 1; // Default to 1 to prevent container collapse before swipes are loaded\n\n let count = 0;\n for (const s of [...swipes].reverse()) {\n if (!s.offside()) {\n break;\n } else {\n count++;\n }\n }\n return count;\n });\n\n offsetPrimary = computed(() => this.offset() - this.padLeft() * 100);\n offsetSecondary = computed(() => -(this.offset() - this.padLeft() * 100) - (this.padRight() - 1) * 100);\n\n actualSwipes = computed(() => {\n const swipes = this.swipes();\n return swipes.filter(swipe => !swipe.offside());\n });\n\n // Computed signal that reactively tracks all swipe sizes\n private slideSizes = computed(() => {\n const actualSwipes = this.actualSwipes();\n if (!actualSwipes || actualSwipes.length === 0) {\n return [];\n }\n // Reading each swipe's size() creates reactive dependencies\n return actualSwipes.map(swipe => swipe.observeSize.size());\n });\n\n maxSlideHeight = computed(() => {\n const slideSizes = this.slideSizes();\n const heights = slideSizes.map(s => s?.height ?? 1);\n return heights.length ? Math.max(...heights) : 1;\n });\n\n currentSlideHeight = computed<number | null>(() => {\n const slideSizes = this.slideSizes();\n const imageIndex = this.imageIndex();\n const orientation = this.orientation();\n const heights = slideSizes.map(s => s?.height ?? 0);\n const maxHeight = heights.length ? Math.max(...heights) : 0;\n const currHeight: number = slideSizes[imageIndex]?.height ?? maxHeight;\n const result = (orientation === 'vertical') ? maxHeight : currHeight;\n // Return null if measurements aren't valid yet to avoid collapsing the carousel\n return result > 10 ? result : null;\n });\n\n constructor() {\n // Effect to update offsetLeft/offsetTopPx based on offsetPrimary and orientation\n effect(() => {\n const animation = this.animation();\n const offsetPrimary = this.offsetPrimary();\n const orientation = this.orientation();\n const maxSlideHeight = this.maxSlideHeight();\n const isAnimating = this.isAnimating();\n\n // Skip updating offsets during animation to avoid interfering with CSS animation\n if (isAnimating) {\n return;\n }\n\n // In fade mode slides are positioned by CSS (position: absolute) rather\n // than by margin offsets — keep the host margins null so they don't\n // visually shift the absolute layer's containing block.\n if (animation === 'fade') {\n this.offsetLeft.set(null);\n this.offsetTopPx.set(null);\n return;\n }\n\n if (orientation === 'horizontal') {\n this.offsetLeft.set(offsetPrimary);\n this.offsetTopPx.set(null);\n } else {\n // For vertical mode, convert percentage to pixels using slide height\n // offsetPrimary is in percentage units (e.g., -100 means -100%)\n // We need to convert to pixels based on actual slide height\n this.offsetTopPx.set((offsetPrimary / 100) * maxSlideHeight);\n this.offsetLeft.set(null);\n }\n });\n\n // Effect to update offsetRight/offsetBottomPx based on offsetSecondary and orientation\n effect(() => {\n const animation = this.animation();\n const offsetSecondary = this.offsetSecondary();\n const orientation = this.orientation();\n const maxSlideHeight = this.maxSlideHeight();\n const isAnimating = this.isAnimating();\n\n // Skip updating offsets during animation to avoid interfering with CSS animation\n if (isAnimating) {\n return;\n }\n\n if (animation === 'fade') {\n this.offsetRight.set(null);\n this.offsetBottomPx.set(null);\n return;\n }\n\n if (orientation === 'horizontal') {\n this.offsetRight.set(offsetSecondary);\n this.offsetBottomPx.set(null);\n } else {\n // For vertical mode, convert percentage to pixels using slide height\n this.offsetBottomPx.set((offsetSecondary / 100) * maxSlideHeight);\n this.offsetRight.set(null);\n }\n });\n\n }\n\n ngAfterViewInit() {\n this.isViewInited.set(true);\n }\n\n ngOnDestroy() {\n this.isDestroyed = true;\n this.pendingAnimation?.destroy();\n if (this.pendingFadeTimeoutId !== undefined) {\n clearTimeout(this.pendingFadeTimeoutId);\n this.pendingFadeTimeoutId = undefined;\n }\n }\n\n animateToIndexByDx(distance: number) {\n const imageIndex = this.imageIndex();\n const actualSwipes = this.actualSwipes();\n\n let newIndex: number;\n if (Math.abs(distance) < this.minimumOffset()) {\n newIndex = imageIndex;\n } else {\n newIndex = imageIndex + (distance < 0 ? 1 : -1);\n }\n\n this.animateToIndex(imageIndex, newIndex, distance, actualSwipes?.length ?? 1);\n }\n\n animateToIndex(oldIndex: number, newIndex: number, distance: number, totalSlides: number) {\n const animation = this.animation();\n const orientation = this.orientation();\n const containerElement = this.containerElement.nativeElement;\n const maxSlideHeight = this.maxSlideHeight();\n // For vertical mode, use maxSlideHeight instead of container height\n const containerLength = orientation === 'horizontal'\n ? containerElement.clientWidth\n : maxSlideHeight;\n\n this.animationStart.emit();\n\n // Handle 'none' animation mode - instant transition\n if (animation === 'none') {\n // Correct the image index immediately\n if (newIndex === -1) {\n this.imageIndex.set(totalSlides - 1);\n } else if (newIndex === totalSlides) {\n this.imageIndex.set(0);\n } else {\n this.imageIndex.set(newIndex);\n }\n this.startTouch.set(null);\n this.lastTouch.set(null);\n this.animationEnd.emit();\n return;\n }\n\n // Handle 'fade' animation mode - opacity is driven by CSS in the consumer\n // (via [class.active] + a CSS transition). Update the index synchronously\n // and defer animationEnd to roughly match the CSS transition duration so\n // consumers waiting on it (e.g. auto-advance pacing) still see consistent\n // event timing across animation modes.\n if (animation === 'fade') {\n // If a previous fade is still pending its animationEnd, cancel it so we\n // don't double-emit when navigation is triggered rapidly.\n if (this.pendingFadeTimeoutId !== undefined) {\n clearTimeout(this.pendingFadeTimeoutId);\n }\n if (newIndex === -1) {\n this.imageIndex.set(totalSlides - 1);\n } else if (newIndex === totalSlides) {\n this.imageIndex.set(0);\n } else {\n this.imageIndex.set(newIndex);\n }\n this.startTouch.set(null);\n this.lastTouch.set(null);\n this.pendingFadeTimeoutId = setTimeout(() => {\n this.pendingFadeTimeoutId = undefined;\n if (!this.isDestroyed) this.animationEnd.emit();\n }, 500);\n return;\n }\n\n // Set animating flag and clear host bindings so animation has full control\n this.isAnimating.set(true);\n if (orientation === 'horizontal') {\n this.offsetLeft.set(null);\n this.offsetRight.set(null);\n } else {\n this.offsetTopPx.set(null);\n this.offsetBottomPx.set(null);\n }\n\n if (orientation === 'horizontal') {\n this.pendingAnimation = this.animationBuilder.build([\n style({\n 'margin-left': (-(oldIndex + 1) * containerLength + distance) + 'px',\n 'margin-right': ((oldIndex + 1) * containerLength - distance) + 'px',\n }),\n animate('500ms ease', style({\n 'margin-left': (-(newIndex + 1) * containerLength) + 'px',\n 'margin-right': ((newIndex + 1) * containerLength) + 'px',\n })),\n ]).create(containerElement);\n } else {\n this.pendingAnimation = this.animationBuilder.build([\n style({\n 'margin-top': (-(oldIndex + 1) * containerLength + distance) + 'px',\n 'margin-bottom': ((oldIndex + 1) * containerLength - distance) + 'px',\n }),\n animate('500ms ease', style({\n 'margin-top': (-(newIndex + 1) * containerLength) + 'px',\n 'margin-bottom': ((newIndex + 1) * containerLength) + 'px',\n })),\n ]).create(containerElement);\n }\n this.pendingAnimation.onDone(() => {\n if (this.isDestroyed) return;\n // Correct the image index\n if (newIndex === -1) {\n this.imageIndex.set(totalSlides - 1);\n } else if (newIndex === totalSlides) {\n this.imageIndex.set(0);\n } else {\n this.imageIndex.set(newIndex);\n }\n this.startTouch.set(null);\n this.lastTouch.set(null);\n this.pendingAnimation?.destroy();\n this.pendingAnimation = undefined;\n // Clear animating flag so effects can update offsets again\n this.isAnimating.set(false);\n this.animationEnd.emit();\n });\n this.pendingAnimation.play();\n }\n\n onSwipe(distance: number) {\n this.animateToIndexByDx(distance);\n }\n\n /**\n * Public keydown dispatcher invoked by `bsSwipeViewport`'s host listener\n * (the viewport is the focusable region; the container is non-focusable\n * inner machinery). Maps the four arrow keys (orientation-aware) plus\n * Home / End to slide navigation. Calls `preventDefault()` only for the\n * keys this directive actually consumed, so cross-orientation arrows\n * (e.g. ArrowUp on a horizontal swiper) still scroll the page normally.\n *\n * Parameter typed as `Event` because Angular host listeners infer `Event`\n * from the template-style binding string; cast inside.\n */\n onKeyPress(event: Event) {\n if (!this.keyboardEvents()) return;\n const ev = event as KeyboardEvent;\n const orientation = this.orientation();\n let handled = false;\n switch (ev.key) {\n case 'ArrowLeft':\n if (orientation === 'horizontal') { this.previous(); handled = true; }\n break;\n case 'ArrowRight':\n if (orientation === 'horizontal') { this.next(); handled = true; }\n break;\n case 'ArrowUp':\n if (orientation === 'vertical') { this.previous(); handled = true; }\n break;\n case 'ArrowDown':\n if (orientation === 'vertical') { this.next(); handled = true; }\n break;\n case 'Home':\n this.goto(0); handled = true;\n break;\n case 'End':\n this.goto(Math.max(0, this.actualSwipes().length - 1)); handled = true;\n break;\n }\n if (handled) ev.preventDefault();\n }\n\n previous() {\n this.gotoAnimate(-1, 'relative');\n }\n\n next() {\n this.gotoAnimate(1, 'relative');\n }\n\n goto(index: number) {\n this.gotoAnimate(index, 'absolute');\n }\n\n private gotoAnimate(index: number, type: 'absolute' | 'relative') {\n this.pendingAnimation?.finish();\n setTimeout(() => {\n if (this.isDestroyed) return;\n this.pendingAnimation?.finish();\n const actualSwipes = this.actualSwipes();\n const imageIndex = this.imageIndex();\n const idx = (type === 'relative') ? imageIndex + index : index;\n this.animateToIndex(imageIndex, idx, 0, actualSwipes?.length ?? 1);\n }, 20);\n }\n\n}\n","import { afterNextRender, computed, DestroyRef, Directive, effect, ElementRef, inject, input } from \"@angular/core\";\nimport { BsObserveSizeDirective } from \"@mintplayer/ng-swiper/observe-size\";\nimport { BsSwipeContainerDirective } from \"../swipe-container/swipe-container.directive\";\nimport { BS_SWIPE_SLIDE, BsSwipeSlide } from \"../../tokens/bs-swipe-slide\";\n\n@Directive({\n selector: '[bsSwipe]',\n hostDirectives: [BsObserveSizeDirective],\n providers: [{ provide: BS_SWIPE_SLIDE, useExisting: BsSwipeDirective }],\n host: {\n '[class.align-top]': 'true',\n '[class.float-none]': 'true',\n '[class.w-100]': 'true',\n '[class.pe-auto]': 'true',\n '[class.me-0]': 'true',\n '[class.d-inline-block]': 'inlineBlock',\n '[class.d-block]': 'block',\n '[style.height.px]': 'slideHeight',\n '[style.touch-action]': 'touchAction',\n '[attr.role]': '\"group\"',\n '[attr.aria-roledescription]': 'effectiveAriaRoledescription()',\n '[attr.aria-label]': 'effectiveAriaLabel()',\n '[attr.aria-hidden]': 'offside() ? \"true\" : null',\n },\n})\nexport class BsSwipeDirective implements BsSwipeSlide {\n private container = inject(BsSwipeContainerDirective);\n private el = inject(ElementRef<HTMLElement>);\n private destroyRef = inject(DestroyRef);\n observeSize = inject(BsObserveSizeDirective);\n\n public offside = input(false);\n\n /**\n * Word read by SRs after the position label. Default `'slide'` matches the\n * APG carousel pattern; consumers building image galleries / step wizards\n * can override (e.g. `'image'`, `'step'`). Pass `null` or `''` to suppress\n * the attribute entirely (useful for non-paginated swipe UIs).\n */\n ariaRoledescription = input<string | null>('slide');\n\n /**\n * Override the auto-computed `\"N of M\"` label. When `null` (the default),\n * the directive computes it from this slide's index among non-offside\n * siblings and the total non-offside count. Offside (clone) slides get\n * no label and rely on `aria-hidden` instead.\n */\n ariaLabel = input<string | null>(null);\n\n readonly effectiveAriaRoledescription = computed(() => {\n if (this.offside()) return null;\n const value = this.ariaRoledescription();\n return value ? value : null;\n });\n\n readonly effectiveAriaLabel = computed(() => {\n if (this.offside()) return null;\n const explicit = this.ariaLabel();\n if (explicit !== null) return explicit;\n const visible = this.container.actualSwipes();\n const i = visible.indexOf(this);\n if (i < 0) return null;\n const total = visible.length;\n if (total === 0) return null;\n return `${i + 1} of ${total}`;\n });\n\n // Track if we've detected a swipe (vs a tap)\n private isSwipeDetected = false;\n // 3px instead of a larger threshold so preventDefault() fires on the first or\n // second touchmove — Firefox Android's APZ can otherwise claim a downward\n // gesture as pull-to-refresh before our handler arbitrates the direction.\n private readonly SWIPE_THRESHOLD = 3; // pixels\n\n // Synchronous copy of start position for use during the 20ms gap\n // before startTouch signal is set (needed to call preventDefault\n // on early touchmove events to block Firefox Android PullToRefresh)\n private touchStartPos: { x: number, y: number } | null = null;\n\n private orientationEffect = effect(() => {\n const orientation = this.container.orientation();\n this.inlineBlock = (orientation === 'horizontal');\n this.block = (orientation === 'vertical');\n // Tell browser which axis we handle, allowing scroll on the other axis\n // pan-y = allow vertical scroll, we handle horizontal swipes\n // pan-x = allow horizontal scroll, we handle vertical swipes\n this.touchAction = (orientation === 'horizontal') ? 'pan-y' : 'pan-x';\n });\n\n private heightEffect = effect(() => {\n const maxHeight = this.container.maxSlideHeight();\n const orientation = this.container.orientation();\n // Only set height when we have valid measurements (> 10px threshold)\n // to avoid circular dependency during initial load\n const targetHeight = (orientation === 'vertical' && maxHeight > 10) ? maxHeight : null;\n this.slideHeight = targetHeight;\n });\n\n inlineBlock = true;\n block = false;\n slideHeight: number | null = null;\n touchAction: 'pan-x' | 'pan-y' = 'pan-y';\n\n constructor() {\n // Register touch listeners manually with { passive: false } for touchmove/touchend.\n // Angular's host event bindings register passive listeners by default for touch events,\n // which silently ignores preventDefault(). This caused Firefox Android's PullToRefresh\n // to trigger because the browser's default action was never actually cancelled.\n // Wrapped in afterNextRender so it doesn't run during SSR (nativeElement is not a real\n // DOM element on the server); the callback fires before the next paint, so it always\n // attaches before the user can physically touch the slide.\n afterNextRender(() => {\n const elem = this.el.nativeElement;\n const onTouchStart = (ev: TouchEvent) => this.onTouchStart(ev);\n const onTouchMove = (ev: TouchEvent) => this.onTouchMove(ev);\n const onTouchEnd = (ev: TouchEvent) => this.onTouchEnd(ev);\n\n elem.addEventListener('touchstart', onTouchStart, { passive: true });\n elem.addEventListener('touchmove', onTouchMove, { passive: false });\n elem.addEventListener('touchend', onTouchEnd, { passive: false });\n\n this.destroyRef.onDestroy(() => {\n elem.removeEventListener('touchstart', onTouchStart);\n elem.removeEventListener('touchmove', onTouchMove);\n elem.removeEventListener('touchend', onTouchEnd);\n });\n });\n }\n\n onTouchStart(ev: TouchEvent) {\n if (ev.touches.length === 1) {\n ev.stopPropagation(); // Prevent bubbling, but allow clicks\n this.isSwipeDetected = false;\n this.touchStartPos = { x: ev.touches[0].clientX, y: ev.touches[0].clientY };\n this.container.pendingAnimation?.finish();\n\n setTimeout(() => {\n this.container.startTouch.set({\n position: {\n x: ev.touches[0].clientX,\n y: ev.touches[0].clientY,\n },\n timestamp: Date.now(),\n });\n this.container.lastTouch.set({\n position: {\n x: ev.touches[0].clientX,\n y: ev.touches[0].clientY,\n },\n isTouching: true,\n });\n }, 20);\n }\n }\n\n onTouchMove(ev: TouchEvent) {\n ev.stopPropagation();\n\n // Direction lock: only own the gesture when movement on our axis exceeds the\n // threshold AND dominates the perpendicular axis. Without the dominance check,\n // a small primary-axis jitter combined with a real perpendicular scroll would\n // wrongly block native page scrolling. Once locked in, keep calling\n // preventDefault for the rest of the stroke.\n // Use synchronous touchStartPos as fallback during the 20ms gap before the\n // startTouch signal is set, so preventDefault fires on early touchmove events\n // (prevents Firefox Android PullToRefresh).\n const startTouch = this.container.startTouch();\n const refPos = startTouch?.position ?? this.touchStartPos;\n if (refPos) {\n const dx = Math.abs(ev.touches[0].clientX - refPos.x);\n const dy = Math.abs(ev.touches[0].clientY - refPos.y);\n const orientation = this.container.orientation();\n const primary = orientation === 'horizontal' ? dx : dy;\n const perpendicular = orientation === 'horizontal' ? dy : dx;\n if (!this.isSwipeDetected && primary > this.SWIPE_THRESHOLD && primary >= perpendicular) {\n this.isSwipeDetected = true;\n }\n if (this.isSwipeDetected) {\n ev.preventDefault();\n }\n }\n\n this.container.lastTouch.set({\n position: {\n x: ev.touches[0].clientX,\n y: ev.touches[0].clientY,\n },\n isTouching: true,\n });\n }\n\n onTouchEnd(ev: TouchEvent) {\n ev.stopPropagation();\n this.touchStartPos = null;\n if (this.isSwipeDetected) {\n ev.preventDefault();\n }\n\n const startTouch = this.container.startTouch();\n const lastTouch = this.container.lastTouch();\n const orientation = this.container.orientation();\n\n if (!!startTouch && !!lastTouch) {\n const distance = (orientation === 'horizontal')\n ? lastTouch.position.x - startTouch.position.x\n : lastTouch.position.y - startTouch.position.y;\n this.container.onSwipe(distance);\n }\n }\n\n}\n","import { computed, contentChild, Directive, ElementRef, inject, input } from '@angular/core';\nimport { BsSwipeContainerDirective } from '../swipe-container/swipe-container.directive';\n\n/**\n * Marks an element as the static viewport that wraps a `bsSwipeContainer`'s\n * moving track. The element it's applied to is expected to have\n * `overflow: hidden` (via a class or its own styling) so the moving track\n * is clipped to a fixed window.\n *\n * Applies the CSS that historically lived on the consuming component's\n * outer wrapper (bs-carousel's `.carousel-inner`):\n *\n * - `overscroll-behavior: contain` — keeps Firefox Android's APZ from\n * chaining a vertical drag into the document and triggering native\n * pull-to-refresh. Even though Firefox documented this as not honoured\n * for PTR historically, the empirical behaviour on the carousel demo\n * showed this property was load-bearing alongside the per-slide\n * `touch-action: pan-x`.\n *\n * - `pointer-events: none` — pairs with the `bsSwipe`'s `pe-auto` so taps\n * on the gaps between slides (or on the viewport's letterboxing) pass\n * through, while the slides themselves remain interactive.\n *\n * Owns the focusable, key-handling region for the swiper widget — APG\n * carousel pattern places the slide-rotation tab stop here, not on the\n * inner container or per-slide. Adds `tabindex` (default `0`), forwards\n * `aria-orientation` + `aria-keyshortcuts` from the inner container, and\n * delegates ArrowLeft/Right/Up/Down + Home/End keydowns to\n * `BsSwipeContainerDirective.onKeyPress` only when the viewport itself is\n * the event target — so an input/link inside a slide keeps its own key\n * behaviour. Also owns the live-region tuple (`aria-live`, `-atomic`,\n * `-relevant`, `-busy`) since the viewport is what SRs watch for slide\n * content changes.\n */\n@Directive({\n selector: '[bsSwipeViewport]',\n host: {\n '[style.overscroll-behavior]': '\"contain\"',\n '[style.pointer-events]': '\"none\"',\n '[attr.tabindex]': 'tabIndex()',\n '[attr.aria-live]': 'ariaLive()',\n '[attr.aria-atomic]': 'ariaAtomic()',\n '[attr.aria-relevant]': 'ariaRelevant()',\n '[attr.aria-busy]': 'ariaBusy()',\n '[attr.aria-orientation]': 'effectiveOrientation()',\n '[attr.aria-keyshortcuts]': 'effectiveKeyshortcuts()',\n '(keydown.ArrowLeft)': 'onKeyPress($event)',\n '(keydown.ArrowRight)': 'onKeyPress($event)',\n '(keydown.ArrowUp)': 'onKeyPress($event)',\n '(keydown.ArrowDown)': 'onKeyPress($event)',\n '(keydown.Home)': 'onKeyPress($event)',\n '(keydown.End)': 'onKeyPress($event)',\n },\n})\nexport class BsSwipeViewportDirective {\n private readonly el = inject<ElementRef<HTMLElement>>(ElementRef);\n\n /**\n * Tabindex on the viewport. Default `0` makes the swiper a single tab\n * stop — APG carousel pattern. Pass `null` to opt out (e.g., a swipe\n * card grid that doesn't need a focus stop), or `-1` for\n * programmatic-only focus.\n */\n tabIndex = input<number | null>(0);\n\n /**\n * Drives the `aria-live` host attribute. Auto-advancing consumers can pass\n * a computed signal that flips between `'off'` (during rotation) and\n * `'polite'` (when paused / no auto-advance / reduced motion). Default\n * `'off'` matches the carousel's \"do not announce on every rotation tick\"\n * baseline.\n */\n ariaLive = input<'off' | 'polite' | 'assertive'>('off');\n\n /**\n * Whether SRs should re-read the entire region on change (`true`) or only\n * the diff (`false`). Default `false` — matches the typical case where\n * only the active slide is meaningful.\n */\n ariaAtomic = input<boolean | null>(false);\n\n /**\n * Which kinds of mutations should trigger the live announcement. Default\n * `null` (attribute absent → SRs use their own default of\n * `'additions text'`). Consumers that want to tune this pass a value such\n * as `'all'` or `'additions'`.\n */\n ariaRelevant = input<string | null>(null);\n\n /**\n * Hide the region from announcements while a transition is in flight, so\n * the SR only reads the *final* slide. Default `null` (not busy);\n * consumers wanting the polish wire it to the swipe container's\n * `isAnimating` signal.\n */\n ariaBusy = input<boolean | null>(null);\n\n /**\n * The inner `bsSwipeContainer` is required for the keydown delegation\n * and the orientation / keyshortcuts forwarding. `contentChild` is the\n * natural query because the container is always a descendant; the lookup\n * settles on first CD pass.\n */\n private readonly container = contentChild(BsSwipeContainerDirective);\n\n readonly effectiveOrientation = computed(() => this.container()?.orientation() ?? null);\n readonly effectiveKeyshortcuts = computed(() => this.container()?.ariaKeyshortcuts() ?? null);\n\n /**\n * Forwards the keydown to the container only when the viewport itself\n * holds focus — `event.target === host` — so a focusable descendant\n * (form input, link inside a slide) keeps native key handling. APG\n * carousel pattern requires this guard.\n */\n onKeyPress(event: Event) {\n if (event.target !== this.el.nativeElement) return;\n this.container()?.onKeyPress(event);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mintplayer/ng-swiper",
|
|
3
3
|
"private": false,
|
|
4
|
-
"version": "
|
|
4
|
+
"version": "22.0.0",
|
|
5
|
+
"license": "Apache-2.0",
|
|
5
6
|
"repository": {
|
|
6
7
|
"type": "git",
|
|
7
8
|
"url": "https://github.com/MintPlayer/mintplayer-ng-bootstrap",
|
|
8
9
|
"directory": "libs/mintplayer-ng-swiper"
|
|
9
10
|
},
|
|
10
11
|
"peerDependencies": {
|
|
11
|
-
"@angular/common": "^
|
|
12
|
-
"@angular/core": "^
|
|
13
|
-
"@angular/animations": "^
|
|
14
|
-
"@angular/platform-browser": "^
|
|
12
|
+
"@angular/common": "^22.0.0",
|
|
13
|
+
"@angular/core": "^22.0.0",
|
|
14
|
+
"@angular/animations": "^22.0.0",
|
|
15
|
+
"@angular/platform-browser": "^22.0.0"
|
|
15
16
|
},
|
|
16
17
|
"dependencies": {
|
|
17
18
|
"tslib": "^2.3.0"
|
|
@@ -35,6 +35,22 @@ declare class BsSwipeDirective implements BsSwipeSlide {
|
|
|
35
35
|
private destroyRef;
|
|
36
36
|
observeSize: BsObserveSizeDirective;
|
|
37
37
|
offside: _angular_core.InputSignal<boolean>;
|
|
38
|
+
/**
|
|
39
|
+
* Word read by SRs after the position label. Default `'slide'` matches the
|
|
40
|
+
* APG carousel pattern; consumers building image galleries / step wizards
|
|
41
|
+
* can override (e.g. `'image'`, `'step'`). Pass `null` or `''` to suppress
|
|
42
|
+
* the attribute entirely (useful for non-paginated swipe UIs).
|
|
43
|
+
*/
|
|
44
|
+
ariaRoledescription: _angular_core.InputSignal<string | null>;
|
|
45
|
+
/**
|
|
46
|
+
* Override the auto-computed `"N of M"` label. When `null` (the default),
|
|
47
|
+
* the directive computes it from this slide's index among non-offside
|
|
48
|
+
* siblings and the total non-offside count. Offside (clone) slides get
|
|
49
|
+
* no label and rely on `aria-hidden` instead.
|
|
50
|
+
*/
|
|
51
|
+
ariaLabel: _angular_core.InputSignal<string | null>;
|
|
52
|
+
readonly effectiveAriaRoledescription: _angular_core.Signal<string | null>;
|
|
53
|
+
readonly effectiveAriaLabel: _angular_core.Signal<string | null>;
|
|
38
54
|
private isSwipeDetected;
|
|
39
55
|
private readonly SWIPE_THRESHOLD;
|
|
40
56
|
private touchStartPos;
|
|
@@ -49,7 +65,7 @@ declare class BsSwipeDirective implements BsSwipeSlide {
|
|
|
49
65
|
onTouchMove(ev: TouchEvent): void;
|
|
50
66
|
onTouchEnd(ev: TouchEvent): void;
|
|
51
67
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<BsSwipeDirective, never>;
|
|
52
|
-
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<BsSwipeDirective, "[bsSwipe]", never, { "offside": { "alias": "offside"; "required": false; "isSignal": true; }; }, {}, never, never, true, [{ directive: typeof i1.BsObserveSizeDirective; inputs: {}; outputs: {}; }]>;
|
|
68
|
+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<BsSwipeDirective, "[bsSwipe]", never, { "offside": { "alias": "offside"; "required": false; "isSignal": true; }; "ariaRoledescription": { "alias": "ariaRoledescription"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, {}, never, never, true, [{ directive: typeof i1.BsObserveSizeDirective; inputs: {}; outputs: {}; }]>;
|
|
53
69
|
}
|
|
54
70
|
|
|
55
71
|
interface Point {
|
|
@@ -80,7 +96,21 @@ declare class BsSwipeContainerDirective implements AfterViewInit, OnDestroy {
|
|
|
80
96
|
minimumOffset: _angular_core.InputSignal<number>;
|
|
81
97
|
animation: _angular_core.InputSignal<"slide" | "fade" | "none">;
|
|
82
98
|
orientation: _angular_core.InputSignal<"horizontal" | "vertical">;
|
|
99
|
+
/**
|
|
100
|
+
* When true, the container handles ArrowLeft/Right (horizontal) or
|
|
101
|
+
* ArrowUp/Down (vertical) plus Home/End to move between slides. The
|
|
102
|
+
* keydown listeners live on the wrapping `bsSwipeViewport` host (only
|
|
103
|
+
* fire when focus is on the viewport itself); this input still gates
|
|
104
|
+
* dispatch inside `onKeyPress`.
|
|
105
|
+
*/
|
|
106
|
+
keyboardEvents: _angular_core.InputSignal<boolean>;
|
|
83
107
|
touchAction: _angular_core.Signal<"pan-y" | "pan-x">;
|
|
108
|
+
/**
|
|
109
|
+
* Computed `aria-keyshortcuts` value advertising the keys the directive
|
|
110
|
+
* actually responds to. Returns `null` (attribute removed) when keyboard
|
|
111
|
+
* handling is disabled, so SRs never advertise shortcuts that won't fire.
|
|
112
|
+
*/
|
|
113
|
+
ariaKeyshortcuts: _angular_core.Signal<"ArrowLeft ArrowRight Home End" | "ArrowUp ArrowDown Home End" | null>;
|
|
84
114
|
imageIndex: _angular_core.ModelSignal<number>;
|
|
85
115
|
animationStart: _angular_core.OutputEmitterRef<void>;
|
|
86
116
|
animationEnd: _angular_core.OutputEmitterRef<void>;
|
|
@@ -106,12 +136,24 @@ declare class BsSwipeContainerDirective implements AfterViewInit, OnDestroy {
|
|
|
106
136
|
animateToIndexByDx(distance: number): void;
|
|
107
137
|
animateToIndex(oldIndex: number, newIndex: number, distance: number, totalSlides: number): void;
|
|
108
138
|
onSwipe(distance: number): void;
|
|
139
|
+
/**
|
|
140
|
+
* Public keydown dispatcher invoked by `bsSwipeViewport`'s host listener
|
|
141
|
+
* (the viewport is the focusable region; the container is non-focusable
|
|
142
|
+
* inner machinery). Maps the four arrow keys (orientation-aware) plus
|
|
143
|
+
* Home / End to slide navigation. Calls `preventDefault()` only for the
|
|
144
|
+
* keys this directive actually consumed, so cross-orientation arrows
|
|
145
|
+
* (e.g. ArrowUp on a horizontal swiper) still scroll the page normally.
|
|
146
|
+
*
|
|
147
|
+
* Parameter typed as `Event` because Angular host listeners infer `Event`
|
|
148
|
+
* from the template-style binding string; cast inside.
|
|
149
|
+
*/
|
|
150
|
+
onKeyPress(event: Event): void;
|
|
109
151
|
previous(): void;
|
|
110
152
|
next(): void;
|
|
111
153
|
goto(index: number): void;
|
|
112
154
|
private gotoAnimate;
|
|
113
155
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<BsSwipeContainerDirective, never>;
|
|
114
|
-
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<BsSwipeContainerDirective, "[bsSwipeContainer]", ["bsSwipeContainer"], { "minimumOffset": { "alias": "minimumOffset"; "required": false; "isSignal": true; }; "animation": { "alias": "animation"; "required": false; "isSignal": true; }; "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; "imageIndex": { "alias": "imageIndex"; "required": false; "isSignal": true; }; }, { "imageIndex": "imageIndexChange"; "animationStart": "animationStart"; "animationEnd": "animationEnd"; }, ["swipes"], never, true, [{ directive: typeof i1.BsObserveSizeDirective; inputs: {}; outputs: {}; }]>;
|
|
156
|
+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<BsSwipeContainerDirective, "[bsSwipeContainer]", ["bsSwipeContainer"], { "minimumOffset": { "alias": "minimumOffset"; "required": false; "isSignal": true; }; "animation": { "alias": "animation"; "required": false; "isSignal": true; }; "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; "keyboardEvents": { "alias": "keyboardEvents"; "required": false; "isSignal": true; }; "imageIndex": { "alias": "imageIndex"; "required": false; "isSignal": true; }; }, { "imageIndex": "imageIndexChange"; "animationStart": "animationStart"; "animationEnd": "animationEnd"; }, ["swipes"], never, true, [{ directive: typeof i1.BsObserveSizeDirective; inputs: {}; outputs: {}; }]>;
|
|
115
157
|
}
|
|
116
158
|
|
|
117
159
|
/**
|
|
@@ -133,10 +175,73 @@ declare class BsSwipeContainerDirective implements AfterViewInit, OnDestroy {
|
|
|
133
175
|
* - `pointer-events: none` — pairs with the `bsSwipe`'s `pe-auto` so taps
|
|
134
176
|
* on the gaps between slides (or on the viewport's letterboxing) pass
|
|
135
177
|
* through, while the slides themselves remain interactive.
|
|
178
|
+
*
|
|
179
|
+
* Owns the focusable, key-handling region for the swiper widget — APG
|
|
180
|
+
* carousel pattern places the slide-rotation tab stop here, not on the
|
|
181
|
+
* inner container or per-slide. Adds `tabindex` (default `0`), forwards
|
|
182
|
+
* `aria-orientation` + `aria-keyshortcuts` from the inner container, and
|
|
183
|
+
* delegates ArrowLeft/Right/Up/Down + Home/End keydowns to
|
|
184
|
+
* `BsSwipeContainerDirective.onKeyPress` only when the viewport itself is
|
|
185
|
+
* the event target — so an input/link inside a slide keeps its own key
|
|
186
|
+
* behaviour. Also owns the live-region tuple (`aria-live`, `-atomic`,
|
|
187
|
+
* `-relevant`, `-busy`) since the viewport is what SRs watch for slide
|
|
188
|
+
* content changes.
|
|
136
189
|
*/
|
|
137
190
|
declare class BsSwipeViewportDirective {
|
|
191
|
+
private readonly el;
|
|
192
|
+
/**
|
|
193
|
+
* Tabindex on the viewport. Default `0` makes the swiper a single tab
|
|
194
|
+
* stop — APG carousel pattern. Pass `null` to opt out (e.g., a swipe
|
|
195
|
+
* card grid that doesn't need a focus stop), or `-1` for
|
|
196
|
+
* programmatic-only focus.
|
|
197
|
+
*/
|
|
198
|
+
tabIndex: _angular_core.InputSignal<number | null>;
|
|
199
|
+
/**
|
|
200
|
+
* Drives the `aria-live` host attribute. Auto-advancing consumers can pass
|
|
201
|
+
* a computed signal that flips between `'off'` (during rotation) and
|
|
202
|
+
* `'polite'` (when paused / no auto-advance / reduced motion). Default
|
|
203
|
+
* `'off'` matches the carousel's "do not announce on every rotation tick"
|
|
204
|
+
* baseline.
|
|
205
|
+
*/
|
|
206
|
+
ariaLive: _angular_core.InputSignal<"off" | "polite" | "assertive">;
|
|
207
|
+
/**
|
|
208
|
+
* Whether SRs should re-read the entire region on change (`true`) or only
|
|
209
|
+
* the diff (`false`). Default `false` — matches the typical case where
|
|
210
|
+
* only the active slide is meaningful.
|
|
211
|
+
*/
|
|
212
|
+
ariaAtomic: _angular_core.InputSignal<boolean | null>;
|
|
213
|
+
/**
|
|
214
|
+
* Which kinds of mutations should trigger the live announcement. Default
|
|
215
|
+
* `null` (attribute absent → SRs use their own default of
|
|
216
|
+
* `'additions text'`). Consumers that want to tune this pass a value such
|
|
217
|
+
* as `'all'` or `'additions'`.
|
|
218
|
+
*/
|
|
219
|
+
ariaRelevant: _angular_core.InputSignal<string | null>;
|
|
220
|
+
/**
|
|
221
|
+
* Hide the region from announcements while a transition is in flight, so
|
|
222
|
+
* the SR only reads the *final* slide. Default `null` (not busy);
|
|
223
|
+
* consumers wanting the polish wire it to the swipe container's
|
|
224
|
+
* `isAnimating` signal.
|
|
225
|
+
*/
|
|
226
|
+
ariaBusy: _angular_core.InputSignal<boolean | null>;
|
|
227
|
+
/**
|
|
228
|
+
* The inner `bsSwipeContainer` is required for the keydown delegation
|
|
229
|
+
* and the orientation / keyshortcuts forwarding. `contentChild` is the
|
|
230
|
+
* natural query because the container is always a descendant; the lookup
|
|
231
|
+
* settles on first CD pass.
|
|
232
|
+
*/
|
|
233
|
+
private readonly container;
|
|
234
|
+
readonly effectiveOrientation: _angular_core.Signal<"horizontal" | "vertical" | null>;
|
|
235
|
+
readonly effectiveKeyshortcuts: _angular_core.Signal<"ArrowLeft ArrowRight Home End" | "ArrowUp ArrowDown Home End" | null>;
|
|
236
|
+
/**
|
|
237
|
+
* Forwards the keydown to the container only when the viewport itself
|
|
238
|
+
* holds focus — `event.target === host` — so a focusable descendant
|
|
239
|
+
* (form input, link inside a slide) keeps native key handling. APG
|
|
240
|
+
* carousel pattern requires this guard.
|
|
241
|
+
*/
|
|
242
|
+
onKeyPress(event: Event): void;
|
|
138
243
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<BsSwipeViewportDirective, never>;
|
|
139
|
-
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<BsSwipeViewportDirective, "[bsSwipeViewport]", never, {}, {},
|
|
244
|
+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<BsSwipeViewportDirective, "[bsSwipeViewport]", never, { "tabIndex": { "alias": "tabIndex"; "required": false; "isSignal": true; }; "ariaLive": { "alias": "ariaLive"; "required": false; "isSignal": true; }; "ariaAtomic": { "alias": "ariaAtomic"; "required": false; "isSignal": true; }; "ariaRelevant": { "alias": "ariaRelevant"; "required": false; "isSignal": true; }; "ariaBusy": { "alias": "ariaBusy"; "required": false; "isSignal": true; }; }, {}, ["container"], never, true, never>;
|
|
140
245
|
}
|
|
141
246
|
|
|
142
247
|
export { BS_SWIPE_SLIDE, BsSwipeContainerDirective, BsSwipeDirective, BsSwipeViewportDirective };
|