@mintplayer/ng-swiper 21.8.0 → 22.0.0

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