@mintplayer/ng-swiper 21.7.0 → 21.9.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 +6 -6
- package/fesm2022/mintplayer-ng-swiper-observe-size.mjs.map +1 -1
- package/fesm2022/mintplayer-ng-swiper-swiper.mjs +232 -39
- package/fesm2022/mintplayer-ng-swiper-swiper.mjs.map +1 -1
- package/package.json +3 -2
- package/types/mintplayer-ng-swiper-swiper.d.ts +108 -3
|
@@ -13,9 +13,9 @@ class BsObserveSizeDirective {
|
|
|
13
13
|
});
|
|
14
14
|
}
|
|
15
15
|
}
|
|
16
|
-
size = signal(undefined, ...(ngDevMode ? [{ debugName: "size" }] : []));
|
|
17
|
-
width = computed(() => this.size()?.width, ...(ngDevMode ? [{ debugName: "width" }] : []));
|
|
18
|
-
height = computed(() => this.size()?.height, ...(ngDevMode ? [{ debugName: "height" }] : []));
|
|
16
|
+
size = signal(undefined, ...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
|
|
17
|
+
width = computed(() => this.size()?.width, ...(ngDevMode ? [{ debugName: "width" }] : /* istanbul ignore next */ []));
|
|
18
|
+
height = computed(() => this.size()?.height, ...(ngDevMode ? [{ debugName: "height" }] : /* istanbul ignore next */ []));
|
|
19
19
|
ngAfterViewInit() {
|
|
20
20
|
const el = this.element.nativeElement;
|
|
21
21
|
this.observer?.observe(el);
|
|
@@ -27,10 +27,10 @@ class BsObserveSizeDirective {
|
|
|
27
27
|
this.observer.disconnect();
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
31
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.
|
|
30
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.11", ngImport: i0, type: BsObserveSizeDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
31
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.11", type: BsObserveSizeDirective, isStandalone: true, selector: "[bsObserveSize]", exportAs: ["bsObserveSize"], ngImport: i0 });
|
|
32
32
|
}
|
|
33
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
33
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.11", ngImport: i0, type: BsObserveSizeDirective, decorators: [{
|
|
34
34
|
type: Directive,
|
|
35
35
|
args: [{
|
|
36
36
|
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;AAEA,IAAA,IAAI,GAAG,MAAM,CAAmB,SAAS,
|
|
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;AAEA,IAAA,IAAI,GAAG,MAAM,CAAmB,SAAS,2EAAC;AAC1C,IAAA,KAAK,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,EAAE,KAAK,4EAAC;AAC1C,IAAA,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,EAAE,MAAM,6EAAC;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;wGA7BW,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAtB,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAAtB,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,46 @@ class BsSwipeContainerDirective {
|
|
|
12
12
|
observeSize = inject(BsObserveSizeDirective);
|
|
13
13
|
containerElement = inject((ElementRef));
|
|
14
14
|
document = inject(DOCUMENT);
|
|
15
|
-
offsetLeft = signal(null, ...(ngDevMode ? [{ debugName: "offsetLeft" }] : []));
|
|
16
|
-
offsetRight = signal(null, ...(ngDevMode ? [{ debugName: "offsetRight" }] : []));
|
|
17
|
-
offsetTopPx = signal(null, ...(ngDevMode ? [{ debugName: "offsetTopPx" }] : []));
|
|
18
|
-
offsetBottomPx = signal(null, ...(ngDevMode ? [{ debugName: "offsetBottomPx" }] : []));
|
|
19
|
-
swipes = contentChildren(BS_SWIPE_SLIDE, ...(ngDevMode ? [{ debugName: "swipes" }] : []));
|
|
20
|
-
minimumOffset = input(50, ...(ngDevMode ? [{ debugName: "minimumOffset" }] : []));
|
|
21
|
-
animation = input('slide', ...(ngDevMode ? [{ debugName: "animation" }] : []));
|
|
22
|
-
orientation = input('horizontal', ...(ngDevMode ? [{ debugName: "orientation" }] : []));
|
|
15
|
+
offsetLeft = signal(null, ...(ngDevMode ? [{ debugName: "offsetLeft" }] : /* istanbul ignore next */ []));
|
|
16
|
+
offsetRight = signal(null, ...(ngDevMode ? [{ debugName: "offsetRight" }] : /* istanbul ignore next */ []));
|
|
17
|
+
offsetTopPx = signal(null, ...(ngDevMode ? [{ debugName: "offsetTopPx" }] : /* istanbul ignore next */ []));
|
|
18
|
+
offsetBottomPx = signal(null, ...(ngDevMode ? [{ debugName: "offsetBottomPx" }] : /* istanbul ignore next */ []));
|
|
19
|
+
swipes = contentChildren(BS_SWIPE_SLIDE, ...(ngDevMode ? [{ debugName: "swipes" }] : /* istanbul ignore next */ []));
|
|
20
|
+
minimumOffset = input(50, ...(ngDevMode ? [{ debugName: "minimumOffset" }] : /* istanbul ignore next */ []));
|
|
21
|
+
animation = input('slide', ...(ngDevMode ? [{ debugName: "animation" }] : /* istanbul ignore next */ []));
|
|
22
|
+
orientation = input('horizontal', ...(ngDevMode ? [{ debugName: "orientation" }] : /* istanbul ignore next */ []));
|
|
23
|
+
/**
|
|
24
|
+
* When true, the container handles ArrowLeft/Right (horizontal) or
|
|
25
|
+
* ArrowUp/Down (vertical) plus Home/End to move between slides. The
|
|
26
|
+
* keydown listeners live on the wrapping `bsSwipeViewport` host (only
|
|
27
|
+
* fire when focus is on the viewport itself); this input still gates
|
|
28
|
+
* dispatch inside `onKeyPress`.
|
|
29
|
+
*/
|
|
30
|
+
keyboardEvents = input(true, ...(ngDevMode ? [{ debugName: "keyboardEvents" }] : /* istanbul ignore next */ []));
|
|
23
31
|
// Mirror swiper.js's .swiper-horizontal / .swiper-vertical: declare the axis
|
|
24
32
|
// we own at the container level so Firefox Android's APZ excludes the
|
|
25
33
|
// perpendicular gesture (incl. pull-to-refresh) at touchstart arbitration time.
|
|
26
|
-
touchAction = computed(() => this.orientation() === 'horizontal' ? 'pan-y' : 'pan-x', ...(ngDevMode ? [{ debugName: "touchAction" }] : []));
|
|
27
|
-
|
|
34
|
+
touchAction = computed(() => this.orientation() === 'horizontal' ? 'pan-y' : 'pan-x', ...(ngDevMode ? [{ debugName: "touchAction" }] : /* istanbul ignore next */ []));
|
|
35
|
+
/**
|
|
36
|
+
* Computed `aria-keyshortcuts` value advertising the keys the directive
|
|
37
|
+
* actually responds to. Returns `null` (attribute removed) when keyboard
|
|
38
|
+
* handling is disabled, so SRs never advertise shortcuts that won't fire.
|
|
39
|
+
*/
|
|
40
|
+
ariaKeyshortcuts = computed(() => {
|
|
41
|
+
if (!this.keyboardEvents())
|
|
42
|
+
return null;
|
|
43
|
+
return this.orientation() === 'horizontal'
|
|
44
|
+
? 'ArrowLeft ArrowRight Home End'
|
|
45
|
+
: 'ArrowUp ArrowDown Home End';
|
|
46
|
+
}, ...(ngDevMode ? [{ debugName: "ariaKeyshortcuts" }] : /* istanbul ignore next */ []));
|
|
47
|
+
imageIndex = model(0, ...(ngDevMode ? [{ debugName: "imageIndex" }] : /* istanbul ignore next */ []));
|
|
28
48
|
animationStart = output();
|
|
29
49
|
animationEnd = output();
|
|
30
|
-
isViewInited = signal(false, ...(ngDevMode ? [{ debugName: "isViewInited" }] : []));
|
|
31
|
-
isAnimating = signal(false, ...(ngDevMode ? [{ debugName: "isAnimating" }] : []));
|
|
50
|
+
isViewInited = signal(false, ...(ngDevMode ? [{ debugName: "isViewInited" }] : /* istanbul ignore next */ []));
|
|
51
|
+
isAnimating = signal(false, ...(ngDevMode ? [{ debugName: "isAnimating" }] : /* istanbul ignore next */ []));
|
|
32
52
|
isDestroyed = false;
|
|
33
|
-
startTouch = signal(null, ...(ngDevMode ? [{ debugName: "startTouch" }] : []));
|
|
34
|
-
lastTouch = signal(null, ...(ngDevMode ? [{ debugName: "lastTouch" }] : []));
|
|
53
|
+
startTouch = signal(null, ...(ngDevMode ? [{ debugName: "startTouch" }] : /* istanbul ignore next */ []));
|
|
54
|
+
lastTouch = signal(null, ...(ngDevMode ? [{ debugName: "lastTouch" }] : /* istanbul ignore next */ []));
|
|
35
55
|
pendingAnimation;
|
|
36
56
|
pendingFadeTimeoutId;
|
|
37
57
|
// Computed signals for derived state
|
|
@@ -63,7 +83,7 @@ class BsSwipeContainerDirective {
|
|
|
63
83
|
else {
|
|
64
84
|
return (-imageIndex * 100);
|
|
65
85
|
}
|
|
66
|
-
}, ...(ngDevMode ? [{ debugName: "offset" }] : []));
|
|
86
|
+
}, ...(ngDevMode ? [{ debugName: "offset" }] : /* istanbul ignore next */ []));
|
|
67
87
|
padLeft = computed(() => {
|
|
68
88
|
const swipes = this.swipes();
|
|
69
89
|
if (swipes.length === 0)
|
|
@@ -78,7 +98,7 @@ class BsSwipeContainerDirective {
|
|
|
78
98
|
}
|
|
79
99
|
}
|
|
80
100
|
return count;
|
|
81
|
-
}, ...(ngDevMode ? [{ debugName: "padLeft" }] : []));
|
|
101
|
+
}, ...(ngDevMode ? [{ debugName: "padLeft" }] : /* istanbul ignore next */ []));
|
|
82
102
|
padRight = computed(() => {
|
|
83
103
|
const swipes = this.swipes();
|
|
84
104
|
if (swipes.length === 0)
|
|
@@ -93,13 +113,13 @@ class BsSwipeContainerDirective {
|
|
|
93
113
|
}
|
|
94
114
|
}
|
|
95
115
|
return count;
|
|
96
|
-
}, ...(ngDevMode ? [{ debugName: "padRight" }] : []));
|
|
97
|
-
offsetPrimary = computed(() => this.offset() - this.padLeft() * 100, ...(ngDevMode ? [{ debugName: "offsetPrimary" }] : []));
|
|
98
|
-
offsetSecondary = computed(() => -(this.offset() - this.padLeft() * 100) - (this.padRight() - 1) * 100, ...(ngDevMode ? [{ debugName: "offsetSecondary" }] : []));
|
|
116
|
+
}, ...(ngDevMode ? [{ debugName: "padRight" }] : /* istanbul ignore next */ []));
|
|
117
|
+
offsetPrimary = computed(() => this.offset() - this.padLeft() * 100, ...(ngDevMode ? [{ debugName: "offsetPrimary" }] : /* istanbul ignore next */ []));
|
|
118
|
+
offsetSecondary = computed(() => -(this.offset() - this.padLeft() * 100) - (this.padRight() - 1) * 100, ...(ngDevMode ? [{ debugName: "offsetSecondary" }] : /* istanbul ignore next */ []));
|
|
99
119
|
actualSwipes = computed(() => {
|
|
100
120
|
const swipes = this.swipes();
|
|
101
121
|
return swipes.filter(swipe => !swipe.offside());
|
|
102
|
-
}, ...(ngDevMode ? [{ debugName: "actualSwipes" }] : []));
|
|
122
|
+
}, ...(ngDevMode ? [{ debugName: "actualSwipes" }] : /* istanbul ignore next */ []));
|
|
103
123
|
// Computed signal that reactively tracks all swipe sizes
|
|
104
124
|
slideSizes = computed(() => {
|
|
105
125
|
const actualSwipes = this.actualSwipes();
|
|
@@ -108,12 +128,12 @@ class BsSwipeContainerDirective {
|
|
|
108
128
|
}
|
|
109
129
|
// Reading each swipe's size() creates reactive dependencies
|
|
110
130
|
return actualSwipes.map(swipe => swipe.observeSize.size());
|
|
111
|
-
}, ...(ngDevMode ? [{ debugName: "slideSizes" }] : []));
|
|
131
|
+
}, ...(ngDevMode ? [{ debugName: "slideSizes" }] : /* istanbul ignore next */ []));
|
|
112
132
|
maxSlideHeight = computed(() => {
|
|
113
133
|
const slideSizes = this.slideSizes();
|
|
114
134
|
const heights = slideSizes.map(s => s?.height ?? 1);
|
|
115
135
|
return heights.length ? Math.max(...heights) : 1;
|
|
116
|
-
}, ...(ngDevMode ? [{ debugName: "maxSlideHeight" }] : []));
|
|
136
|
+
}, ...(ngDevMode ? [{ debugName: "maxSlideHeight" }] : /* istanbul ignore next */ []));
|
|
117
137
|
currentSlideHeight = computed(() => {
|
|
118
138
|
const slideSizes = this.slideSizes();
|
|
119
139
|
const imageIndex = this.imageIndex();
|
|
@@ -124,7 +144,7 @@ class BsSwipeContainerDirective {
|
|
|
124
144
|
const result = (orientation === 'vertical') ? maxHeight : currHeight;
|
|
125
145
|
// Return null if measurements aren't valid yet to avoid collapsing the carousel
|
|
126
146
|
return result > 10 ? result : null;
|
|
127
|
-
}, ...(ngDevMode ? [{ debugName: "currentSlideHeight" }] : []));
|
|
147
|
+
}, ...(ngDevMode ? [{ debugName: "currentSlideHeight" }] : /* istanbul ignore next */ []));
|
|
128
148
|
constructor() {
|
|
129
149
|
// Effect to update offsetLeft/offsetTopPx based on offsetPrimary and orientation
|
|
130
150
|
effect(() => {
|
|
@@ -323,6 +343,60 @@ class BsSwipeContainerDirective {
|
|
|
323
343
|
onSwipe(distance) {
|
|
324
344
|
this.animateToIndexByDx(distance);
|
|
325
345
|
}
|
|
346
|
+
/**
|
|
347
|
+
* Public keydown dispatcher invoked by `bsSwipeViewport`'s host listener
|
|
348
|
+
* (the viewport is the focusable region; the container is non-focusable
|
|
349
|
+
* inner machinery). Maps the four arrow keys (orientation-aware) plus
|
|
350
|
+
* Home / End to slide navigation. Calls `preventDefault()` only for the
|
|
351
|
+
* keys this directive actually consumed, so cross-orientation arrows
|
|
352
|
+
* (e.g. ArrowUp on a horizontal swiper) still scroll the page normally.
|
|
353
|
+
*
|
|
354
|
+
* Parameter typed as `Event` because Angular host listeners infer `Event`
|
|
355
|
+
* from the template-style binding string; cast inside.
|
|
356
|
+
*/
|
|
357
|
+
onKeyPress(event) {
|
|
358
|
+
if (!this.keyboardEvents())
|
|
359
|
+
return;
|
|
360
|
+
const ev = event;
|
|
361
|
+
const orientation = this.orientation();
|
|
362
|
+
let handled = false;
|
|
363
|
+
switch (ev.key) {
|
|
364
|
+
case 'ArrowLeft':
|
|
365
|
+
if (orientation === 'horizontal') {
|
|
366
|
+
this.previous();
|
|
367
|
+
handled = true;
|
|
368
|
+
}
|
|
369
|
+
break;
|
|
370
|
+
case 'ArrowRight':
|
|
371
|
+
if (orientation === 'horizontal') {
|
|
372
|
+
this.next();
|
|
373
|
+
handled = true;
|
|
374
|
+
}
|
|
375
|
+
break;
|
|
376
|
+
case 'ArrowUp':
|
|
377
|
+
if (orientation === 'vertical') {
|
|
378
|
+
this.previous();
|
|
379
|
+
handled = true;
|
|
380
|
+
}
|
|
381
|
+
break;
|
|
382
|
+
case 'ArrowDown':
|
|
383
|
+
if (orientation === 'vertical') {
|
|
384
|
+
this.next();
|
|
385
|
+
handled = true;
|
|
386
|
+
}
|
|
387
|
+
break;
|
|
388
|
+
case 'Home':
|
|
389
|
+
this.goto(0);
|
|
390
|
+
handled = true;
|
|
391
|
+
break;
|
|
392
|
+
case 'End':
|
|
393
|
+
this.goto(Math.max(0, this.actualSwipes().length - 1));
|
|
394
|
+
handled = true;
|
|
395
|
+
break;
|
|
396
|
+
}
|
|
397
|
+
if (handled)
|
|
398
|
+
ev.preventDefault();
|
|
399
|
+
}
|
|
326
400
|
previous() {
|
|
327
401
|
this.gotoAnimate(-1, 'relative');
|
|
328
402
|
}
|
|
@@ -344,10 +418,10 @@ class BsSwipeContainerDirective {
|
|
|
344
418
|
this.animateToIndex(imageIndex, idx, 0, actualSwipes?.length ?? 1);
|
|
345
419
|
}, 20);
|
|
346
420
|
}
|
|
347
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
348
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "21.
|
|
421
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.11", ngImport: i0, type: BsSwipeContainerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
422
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "21.2.11", 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
423
|
}
|
|
350
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
424
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.11", ngImport: i0, type: BsSwipeContainerDirective, decorators: [{
|
|
351
425
|
type: Directive,
|
|
352
426
|
args: [{
|
|
353
427
|
selector: '[bsSwipeContainer]',
|
|
@@ -373,14 +447,49 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.6", ngImpor
|
|
|
373
447
|
'[style.flex-direction]': 'orientation() === "vertical" ? "column" : null',
|
|
374
448
|
},
|
|
375
449
|
}]
|
|
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"] }] } });
|
|
450
|
+
}], 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
451
|
|
|
378
452
|
class BsSwipeDirective {
|
|
379
453
|
container = inject(BsSwipeContainerDirective);
|
|
380
454
|
el = inject((ElementRef));
|
|
381
455
|
destroyRef = inject(DestroyRef);
|
|
382
456
|
observeSize = inject(BsObserveSizeDirective);
|
|
383
|
-
offside = input(false, ...(ngDevMode ? [{ debugName: "offside" }] : []));
|
|
457
|
+
offside = input(false, ...(ngDevMode ? [{ debugName: "offside" }] : /* istanbul ignore next */ []));
|
|
458
|
+
/**
|
|
459
|
+
* Word read by SRs after the position label. Default `'slide'` matches the
|
|
460
|
+
* APG carousel pattern; consumers building image galleries / step wizards
|
|
461
|
+
* can override (e.g. `'image'`, `'step'`). Pass `null` or `''` to suppress
|
|
462
|
+
* the attribute entirely (useful for non-paginated swipe UIs).
|
|
463
|
+
*/
|
|
464
|
+
ariaRoledescription = input('slide', ...(ngDevMode ? [{ debugName: "ariaRoledescription" }] : /* istanbul ignore next */ []));
|
|
465
|
+
/**
|
|
466
|
+
* Override the auto-computed `"N of M"` label. When `null` (the default),
|
|
467
|
+
* the directive computes it from this slide's index among non-offside
|
|
468
|
+
* siblings and the total non-offside count. Offside (clone) slides get
|
|
469
|
+
* no label and rely on `aria-hidden` instead.
|
|
470
|
+
*/
|
|
471
|
+
ariaLabel = input(null, ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
|
|
472
|
+
effectiveAriaRoledescription = computed(() => {
|
|
473
|
+
if (this.offside())
|
|
474
|
+
return null;
|
|
475
|
+
const value = this.ariaRoledescription();
|
|
476
|
+
return value ? value : null;
|
|
477
|
+
}, ...(ngDevMode ? [{ debugName: "effectiveAriaRoledescription" }] : /* istanbul ignore next */ []));
|
|
478
|
+
effectiveAriaLabel = computed(() => {
|
|
479
|
+
if (this.offside())
|
|
480
|
+
return null;
|
|
481
|
+
const explicit = this.ariaLabel();
|
|
482
|
+
if (explicit !== null)
|
|
483
|
+
return explicit;
|
|
484
|
+
const visible = this.container.actualSwipes();
|
|
485
|
+
const i = visible.indexOf(this);
|
|
486
|
+
if (i < 0)
|
|
487
|
+
return null;
|
|
488
|
+
const total = visible.length;
|
|
489
|
+
if (total === 0)
|
|
490
|
+
return null;
|
|
491
|
+
return `${i + 1} of ${total}`;
|
|
492
|
+
}, ...(ngDevMode ? [{ debugName: "effectiveAriaLabel" }] : /* istanbul ignore next */ []));
|
|
384
493
|
// Track if we've detected a swipe (vs a tap)
|
|
385
494
|
isSwipeDetected = false;
|
|
386
495
|
// 3px instead of a larger threshold so preventDefault() fires on the first or
|
|
@@ -399,7 +508,7 @@ class BsSwipeDirective {
|
|
|
399
508
|
// pan-y = allow vertical scroll, we handle horizontal swipes
|
|
400
509
|
// pan-x = allow horizontal scroll, we handle vertical swipes
|
|
401
510
|
this.touchAction = (orientation === 'horizontal') ? 'pan-y' : 'pan-x';
|
|
402
|
-
}, ...(ngDevMode ? [{ debugName: "orientationEffect" }] : []));
|
|
511
|
+
}, ...(ngDevMode ? [{ debugName: "orientationEffect" }] : /* istanbul ignore next */ []));
|
|
403
512
|
heightEffect = effect(() => {
|
|
404
513
|
const maxHeight = this.container.maxSlideHeight();
|
|
405
514
|
const orientation = this.container.orientation();
|
|
@@ -407,7 +516,7 @@ class BsSwipeDirective {
|
|
|
407
516
|
// to avoid circular dependency during initial load
|
|
408
517
|
const targetHeight = (orientation === 'vertical' && maxHeight > 10) ? maxHeight : null;
|
|
409
518
|
this.slideHeight = targetHeight;
|
|
410
|
-
}, ...(ngDevMode ? [{ debugName: "heightEffect" }] : []));
|
|
519
|
+
}, ...(ngDevMode ? [{ debugName: "heightEffect" }] : /* istanbul ignore next */ []));
|
|
411
520
|
inlineBlock = true;
|
|
412
521
|
block = false;
|
|
413
522
|
slideHeight = null;
|
|
@@ -508,10 +617,10 @@ class BsSwipeDirective {
|
|
|
508
617
|
this.container.onSwipe(distance);
|
|
509
618
|
}
|
|
510
619
|
}
|
|
511
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
512
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.
|
|
620
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.11", ngImport: i0, type: BsSwipeDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
621
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.11", 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
622
|
}
|
|
514
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
623
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.11", ngImport: i0, type: BsSwipeDirective, decorators: [{
|
|
515
624
|
type: Directive,
|
|
516
625
|
args: [{
|
|
517
626
|
selector: '[bsSwipe]',
|
|
@@ -527,9 +636,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.6", ngImpor
|
|
|
527
636
|
'[class.d-block]': 'block',
|
|
528
637
|
'[style.height.px]': 'slideHeight',
|
|
529
638
|
'[style.touch-action]': 'touchAction',
|
|
639
|
+
'[attr.role]': '"group"',
|
|
640
|
+
'[attr.aria-roledescription]': 'effectiveAriaRoledescription()',
|
|
641
|
+
'[attr.aria-label]': 'effectiveAriaLabel()',
|
|
642
|
+
'[attr.aria-hidden]': 'offside() ? "true" : null',
|
|
530
643
|
},
|
|
531
644
|
}]
|
|
532
|
-
}], ctorParameters: () => [], propDecorators: { offside: [{ type: i0.Input, args: [{ isSignal: true, alias: "offside", required: false }] }] } });
|
|
645
|
+
}], 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
646
|
|
|
534
647
|
/**
|
|
535
648
|
* Marks an element as the static viewport that wraps a `bsSwipeContainer`'s
|
|
@@ -550,21 +663,101 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.6", ngImpor
|
|
|
550
663
|
* - `pointer-events: none` — pairs with the `bsSwipe`'s `pe-auto` so taps
|
|
551
664
|
* on the gaps between slides (or on the viewport's letterboxing) pass
|
|
552
665
|
* through, while the slides themselves remain interactive.
|
|
666
|
+
*
|
|
667
|
+
* Owns the focusable, key-handling region for the swiper widget — APG
|
|
668
|
+
* carousel pattern places the slide-rotation tab stop here, not on the
|
|
669
|
+
* inner container or per-slide. Adds `tabindex` (default `0`), forwards
|
|
670
|
+
* `aria-orientation` + `aria-keyshortcuts` from the inner container, and
|
|
671
|
+
* delegates ArrowLeft/Right/Up/Down + Home/End keydowns to
|
|
672
|
+
* `BsSwipeContainerDirective.onKeyPress` only when the viewport itself is
|
|
673
|
+
* the event target — so an input/link inside a slide keeps its own key
|
|
674
|
+
* behaviour. Also owns the live-region tuple (`aria-live`, `-atomic`,
|
|
675
|
+
* `-relevant`, `-busy`) since the viewport is what SRs watch for slide
|
|
676
|
+
* content changes.
|
|
553
677
|
*/
|
|
554
678
|
class BsSwipeViewportDirective {
|
|
555
|
-
|
|
556
|
-
|
|
679
|
+
el = inject(ElementRef);
|
|
680
|
+
/**
|
|
681
|
+
* Tabindex on the viewport. Default `0` makes the swiper a single tab
|
|
682
|
+
* stop — APG carousel pattern. Pass `null` to opt out (e.g., a swipe
|
|
683
|
+
* card grid that doesn't need a focus stop), or `-1` for
|
|
684
|
+
* programmatic-only focus.
|
|
685
|
+
*/
|
|
686
|
+
tabIndex = input(0, ...(ngDevMode ? [{ debugName: "tabIndex" }] : /* istanbul ignore next */ []));
|
|
687
|
+
/**
|
|
688
|
+
* Drives the `aria-live` host attribute. Auto-advancing consumers can pass
|
|
689
|
+
* a computed signal that flips between `'off'` (during rotation) and
|
|
690
|
+
* `'polite'` (when paused / no auto-advance / reduced motion). Default
|
|
691
|
+
* `'off'` matches the carousel's "do not announce on every rotation tick"
|
|
692
|
+
* baseline.
|
|
693
|
+
*/
|
|
694
|
+
ariaLive = input('off', ...(ngDevMode ? [{ debugName: "ariaLive" }] : /* istanbul ignore next */ []));
|
|
695
|
+
/**
|
|
696
|
+
* Whether SRs should re-read the entire region on change (`true`) or only
|
|
697
|
+
* the diff (`false`). Default `false` — matches the typical case where
|
|
698
|
+
* only the active slide is meaningful.
|
|
699
|
+
*/
|
|
700
|
+
ariaAtomic = input(false, ...(ngDevMode ? [{ debugName: "ariaAtomic" }] : /* istanbul ignore next */ []));
|
|
701
|
+
/**
|
|
702
|
+
* Which kinds of mutations should trigger the live announcement. Default
|
|
703
|
+
* `null` (attribute absent → SRs use their own default of
|
|
704
|
+
* `'additions text'`). Consumers that want to tune this pass a value such
|
|
705
|
+
* as `'all'` or `'additions'`.
|
|
706
|
+
*/
|
|
707
|
+
ariaRelevant = input(null, ...(ngDevMode ? [{ debugName: "ariaRelevant" }] : /* istanbul ignore next */ []));
|
|
708
|
+
/**
|
|
709
|
+
* Hide the region from announcements while a transition is in flight, so
|
|
710
|
+
* the SR only reads the *final* slide. Default `null` (not busy);
|
|
711
|
+
* consumers wanting the polish wire it to the swipe container's
|
|
712
|
+
* `isAnimating` signal.
|
|
713
|
+
*/
|
|
714
|
+
ariaBusy = input(null, ...(ngDevMode ? [{ debugName: "ariaBusy" }] : /* istanbul ignore next */ []));
|
|
715
|
+
/**
|
|
716
|
+
* The inner `bsSwipeContainer` is required for the keydown delegation
|
|
717
|
+
* and the orientation / keyshortcuts forwarding. `contentChild` is the
|
|
718
|
+
* natural query because the container is always a descendant; the lookup
|
|
719
|
+
* settles on first CD pass.
|
|
720
|
+
*/
|
|
721
|
+
container = contentChild(BsSwipeContainerDirective, ...(ngDevMode ? [{ debugName: "container" }] : /* istanbul ignore next */ []));
|
|
722
|
+
effectiveOrientation = computed(() => this.container()?.orientation() ?? null, ...(ngDevMode ? [{ debugName: "effectiveOrientation" }] : /* istanbul ignore next */ []));
|
|
723
|
+
effectiveKeyshortcuts = computed(() => this.container()?.ariaKeyshortcuts() ?? null, ...(ngDevMode ? [{ debugName: "effectiveKeyshortcuts" }] : /* istanbul ignore next */ []));
|
|
724
|
+
/**
|
|
725
|
+
* Forwards the keydown to the container only when the viewport itself
|
|
726
|
+
* holds focus — `event.target === host` — so a focusable descendant
|
|
727
|
+
* (form input, link inside a slide) keeps native key handling. APG
|
|
728
|
+
* carousel pattern requires this guard.
|
|
729
|
+
*/
|
|
730
|
+
onKeyPress(event) {
|
|
731
|
+
if (event.target !== this.el.nativeElement)
|
|
732
|
+
return;
|
|
733
|
+
this.container()?.onKeyPress(event);
|
|
734
|
+
}
|
|
735
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.11", ngImport: i0, type: BsSwipeViewportDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
736
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "21.2.11", 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
737
|
}
|
|
558
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
738
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.11", ngImport: i0, type: BsSwipeViewportDirective, decorators: [{
|
|
559
739
|
type: Directive,
|
|
560
740
|
args: [{
|
|
561
741
|
selector: '[bsSwipeViewport]',
|
|
562
742
|
host: {
|
|
563
743
|
'[style.overscroll-behavior]': '"contain"',
|
|
564
744
|
'[style.pointer-events]': '"none"',
|
|
745
|
+
'[attr.tabindex]': 'tabIndex()',
|
|
746
|
+
'[attr.aria-live]': 'ariaLive()',
|
|
747
|
+
'[attr.aria-atomic]': 'ariaAtomic()',
|
|
748
|
+
'[attr.aria-relevant]': 'ariaRelevant()',
|
|
749
|
+
'[attr.aria-busy]': 'ariaBusy()',
|
|
750
|
+
'[attr.aria-orientation]': 'effectiveOrientation()',
|
|
751
|
+
'[attr.aria-keyshortcuts]': 'effectiveKeyshortcuts()',
|
|
752
|
+
'(keydown.ArrowLeft)': 'onKeyPress($event)',
|
|
753
|
+
'(keydown.ArrowRight)': 'onKeyPress($event)',
|
|
754
|
+
'(keydown.ArrowUp)': 'onKeyPress($event)',
|
|
755
|
+
'(keydown.ArrowDown)': 'onKeyPress($event)',
|
|
756
|
+
'(keydown.Home)': 'onKeyPress($event)',
|
|
757
|
+
'(keydown.End)': 'onKeyPress($event)',
|
|
565
758
|
},
|
|
566
759
|
}]
|
|
567
|
-
}] });
|
|
760
|
+
}], 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
761
|
|
|
569
762
|
/**
|
|
570
763
|
* 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,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mintplayer/ng-swiper",
|
|
3
3
|
"private": false,
|
|
4
|
-
"version": "21.
|
|
4
|
+
"version": "21.9.0",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
7
7
|
"url": "https://github.com/MintPlayer/mintplayer-ng-bootstrap",
|
|
@@ -35,5 +35,6 @@
|
|
|
35
35
|
"default": "./fesm2022/mintplayer-ng-swiper-swiper.mjs"
|
|
36
36
|
}
|
|
37
37
|
},
|
|
38
|
-
"sideEffects": false
|
|
38
|
+
"sideEffects": false,
|
|
39
|
+
"type": "module"
|
|
39
40
|
}
|
|
@@ -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 };
|