@acorex/cdk 22.1.0-next.30 → 22.1.0-next.31

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.
@@ -0,0 +1,173 @@
1
+ import { isPlatformBrowser } from '@angular/common';
2
+ import * as i0 from '@angular/core';
3
+ import { inject, ElementRef, NgZone, PLATFORM_ID, input, output, afterNextRender, effect, untracked, Directive } from '@angular/core';
4
+
5
+ const HAMMER_EVENTS = 'tap doubletap press pan panstart panmove panend swipe pinch rotate';
6
+ const HIGH_FREQUENCY_EVENTS = new Set(['pan', 'panmove', 'pinch', 'rotate']);
7
+ /**
8
+ * Attaches Hammer.js gesture recognition to the host element.
9
+ *
10
+ * Usage:
11
+ * <div axGesture [direction]="'all'" (tap)="onTap($event)" (pan)="onPan($event)"></div>
12
+ */
13
+ class AXGestureDirective {
14
+ constructor() {
15
+ this.el = inject((ElementRef));
16
+ this.zone = inject(NgZone);
17
+ this.platformId = inject(PLATFORM_ID);
18
+ /**
19
+ * Extra Hammer.js options forwarded to the manager constructor.
20
+ */
21
+ this.options = input({}, /* @ts-ignore */
22
+ ...(ngDevMode ? [{ debugName: "options" }] : /* istanbul ignore next */ []));
23
+ /**
24
+ * Pan and swipe direction. Defaults to horizontal, matching Hammer.js.
25
+ */
26
+ this.direction = input('horizontal', /* @ts-ignore */
27
+ ...(ngDevMode ? [{ debugName: "direction" }] : /* istanbul ignore next */ []));
28
+ /**
29
+ * Enables the multi-touch pinch recognizer. Disabled by default.
30
+ */
31
+ this.enablePinch = input(false, /* @ts-ignore */
32
+ ...(ngDevMode ? [{ debugName: "enablePinch" }] : /* istanbul ignore next */ []));
33
+ /**
34
+ * Enables the multi-touch rotate recognizer. Disabled by default.
35
+ */
36
+ this.enableRotate = input(false, /* @ts-ignore */
37
+ ...(ngDevMode ? [{ debugName: "enableRotate" }] : /* istanbul ignore next */ []));
38
+ /**
39
+ * Stops gesture recognition when true.
40
+ */
41
+ this.disabled = input(false, /* @ts-ignore */
42
+ ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
43
+ this.tap = output();
44
+ this.doubletap = output();
45
+ this.press = output();
46
+ this.pan = output();
47
+ this.panstart = output();
48
+ this.panmove = output();
49
+ this.panend = output();
50
+ this.swipe = output();
51
+ this.pinch = output();
52
+ this.rotate = output();
53
+ this.hammer = null;
54
+ this.hammerLib = null;
55
+ this.setupId = 0;
56
+ this.ready = false;
57
+ this.emitters = {
58
+ tap: this.tap,
59
+ doubletap: this.doubletap,
60
+ press: this.press,
61
+ pan: this.pan,
62
+ panstart: this.panstart,
63
+ panmove: this.panmove,
64
+ panend: this.panend,
65
+ swipe: this.swipe,
66
+ pinch: this.pinch,
67
+ rotate: this.rotate,
68
+ };
69
+ this.#init = afterNextRender(() => {
70
+ if (!isPlatformBrowser(this.platformId))
71
+ return;
72
+ this.ready = true;
73
+ void this.setup();
74
+ });
75
+ this.#config = effect(() => {
76
+ this.options();
77
+ this.direction();
78
+ this.enablePinch();
79
+ this.enableRotate();
80
+ this.disabled();
81
+ untracked(() => {
82
+ if (this.ready)
83
+ void this.setup();
84
+ });
85
+ }, /* @ts-ignore */
86
+ ...(ngDevMode ? [{ debugName: "#config" }] : /* istanbul ignore next */ []));
87
+ this.onHammerEvent = (ev) => {
88
+ const emit = this.emitters[ev.type];
89
+ if (!emit)
90
+ return;
91
+ if (HIGH_FREQUENCY_EVENTS.has(ev.type)) {
92
+ emit.emit(ev);
93
+ return;
94
+ }
95
+ this.zone.run(() => emit.emit(ev));
96
+ };
97
+ }
98
+ /**
99
+ * The underlying Hammer manager, or null when not initialized.
100
+ */
101
+ get manager() {
102
+ return this.hammer;
103
+ }
104
+ #init;
105
+ #config;
106
+ ngOnDestroy() {
107
+ this.setupId++;
108
+ this.teardown();
109
+ }
110
+ async setup() {
111
+ const id = ++this.setupId;
112
+ this.teardown();
113
+ if (this.disabled() || !isPlatformBrowser(this.platformId))
114
+ return;
115
+ const HammerLib = await this.loadHammer();
116
+ if (id !== this.setupId)
117
+ return;
118
+ this.zone.runOutsideAngular(() => {
119
+ const options = { ...this.options() };
120
+ if (!options.touchAction) {
121
+ const hostTouchAction = this.el.nativeElement.style.touchAction;
122
+ if (hostTouchAction) {
123
+ options.touchAction = hostTouchAction;
124
+ }
125
+ }
126
+ const hammer = new HammerLib(this.el.nativeElement, options);
127
+ const direction = this.toHammerDirection(HammerLib, this.direction());
128
+ hammer.get('pan')?.set({ direction });
129
+ hammer.get('swipe')?.set({ direction });
130
+ hammer.get('pinch')?.set({ enable: this.enablePinch() });
131
+ hammer.get('rotate')?.set({ enable: this.enableRotate() });
132
+ hammer.on(HAMMER_EVENTS, this.onHammerEvent);
133
+ this.hammer = hammer;
134
+ });
135
+ }
136
+ async loadHammer() {
137
+ if (this.hammerLib)
138
+ return this.hammerLib;
139
+ const mod = (await import('hammerjs'));
140
+ this.hammerLib = mod.default ?? mod;
141
+ return this.hammerLib;
142
+ }
143
+ toHammerDirection(HammerLib, direction) {
144
+ if (direction === 'all')
145
+ return HammerLib.DIRECTION_ALL;
146
+ if (direction === 'vertical')
147
+ return HammerLib.DIRECTION_VERTICAL;
148
+ return HammerLib.DIRECTION_HORIZONTAL;
149
+ }
150
+ teardown() {
151
+ if (!this.hammer)
152
+ return;
153
+ this.hammer.off(HAMMER_EVENTS, this.onHammerEvent);
154
+ this.hammer.destroy();
155
+ this.hammer = null;
156
+ }
157
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXGestureDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
158
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.8", type: AXGestureDirective, isStandalone: true, selector: "[axGesture]", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, direction: { classPropertyName: "direction", publicName: "direction", isSignal: true, isRequired: false, transformFunction: null }, enablePinch: { classPropertyName: "enablePinch", publicName: "enablePinch", isSignal: true, isRequired: false, transformFunction: null }, enableRotate: { classPropertyName: "enableRotate", publicName: "enableRotate", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { tap: "tap", doubletap: "doubletap", press: "press", pan: "pan", panstart: "panstart", panmove: "panmove", panend: "panend", swipe: "swipe", pinch: "pinch", rotate: "rotate" }, exportAs: ["axGesture"], ngImport: i0 }); }
159
+ }
160
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXGestureDirective, decorators: [{
161
+ type: Directive,
162
+ args: [{
163
+ selector: '[axGesture]',
164
+ exportAs: 'axGesture',
165
+ }]
166
+ }], propDecorators: { options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], direction: [{ type: i0.Input, args: [{ isSignal: true, alias: "direction", required: false }] }], enablePinch: [{ type: i0.Input, args: [{ isSignal: true, alias: "enablePinch", required: false }] }], enableRotate: [{ type: i0.Input, args: [{ isSignal: true, alias: "enableRotate", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], tap: [{ type: i0.Output, args: ["tap"] }], doubletap: [{ type: i0.Output, args: ["doubletap"] }], press: [{ type: i0.Output, args: ["press"] }], pan: [{ type: i0.Output, args: ["pan"] }], panstart: [{ type: i0.Output, args: ["panstart"] }], panmove: [{ type: i0.Output, args: ["panmove"] }], panend: [{ type: i0.Output, args: ["panend"] }], swipe: [{ type: i0.Output, args: ["swipe"] }], pinch: [{ type: i0.Output, args: ["pinch"] }], rotate: [{ type: i0.Output, args: ["rotate"] }] } });
167
+
168
+ /**
169
+ * Generated bundle index. Do not edit.
170
+ */
171
+
172
+ export { AXGestureDirective };
173
+ //# sourceMappingURL=acorex-cdk-gesture.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acorex-cdk-gesture.mjs","sources":["../../../../packages/cdk/gesture/src/lib/gesture.directive.ts","../../../../packages/cdk/gesture/src/acorex-cdk-gesture.ts"],"sourcesContent":["import { isPlatformBrowser } from '@angular/common';\nimport {\n afterNextRender,\n Directive,\n effect,\n ElementRef,\n inject,\n input,\n NgZone,\n OnDestroy,\n output,\n OutputEmitterRef,\n PLATFORM_ID,\n untracked,\n} from '@angular/core';\nimport { AXGestureDirection, AXGestureEvent, AXGestureManager, AXGestureOptions } from './gesture.types';\n\nconst HAMMER_EVENTS = 'tap doubletap press pan panstart panmove panend swipe pinch rotate';\nconst HIGH_FREQUENCY_EVENTS = new Set(['pan', 'panmove', 'pinch', 'rotate']);\n\ntype HammerStatic = {\n new (element: HTMLElement | SVGElement, options?: AXGestureOptions): AXGestureManager;\n DIRECTION_ALL: number;\n DIRECTION_HORIZONTAL: number;\n DIRECTION_VERTICAL: number;\n};\n\n/**\n * Attaches Hammer.js gesture recognition to the host element.\n *\n * Usage:\n * <div axGesture [direction]=\"'all'\" (tap)=\"onTap($event)\" (pan)=\"onPan($event)\"></div>\n */\n@Directive({\n selector: '[axGesture]',\n exportAs: 'axGesture',\n})\nexport class AXGestureDirective implements OnDestroy {\n private readonly el = inject(ElementRef<HTMLElement>);\n private readonly zone = inject(NgZone);\n private readonly platformId = inject(PLATFORM_ID);\n\n /**\n * Extra Hammer.js options forwarded to the manager constructor.\n */\n options = input<AXGestureOptions>({});\n\n /**\n * Pan and swipe direction. Defaults to horizontal, matching Hammer.js.\n */\n direction = input<AXGestureDirection>('horizontal');\n\n /**\n * Enables the multi-touch pinch recognizer. Disabled by default.\n */\n enablePinch = input(false);\n\n /**\n * Enables the multi-touch rotate recognizer. Disabled by default.\n */\n enableRotate = input(false);\n\n /**\n * Stops gesture recognition when true.\n */\n disabled = input(false);\n\n tap = output<AXGestureEvent>();\n doubletap = output<AXGestureEvent>();\n press = output<AXGestureEvent>();\n pan = output<AXGestureEvent>();\n panstart = output<AXGestureEvent>();\n panmove = output<AXGestureEvent>();\n panend = output<AXGestureEvent>();\n swipe = output<AXGestureEvent>();\n pinch = output<AXGestureEvent>();\n rotate = output<AXGestureEvent>();\n\n private hammer: AXGestureManager | null = null;\n private hammerLib: HammerStatic | null = null;\n private setupId = 0;\n private ready = false;\n\n private readonly emitters: Record<string, OutputEmitterRef<AXGestureEvent>> = {\n tap: this.tap,\n doubletap: this.doubletap,\n press: this.press,\n pan: this.pan,\n panstart: this.panstart,\n panmove: this.panmove,\n panend: this.panend,\n swipe: this.swipe,\n pinch: this.pinch,\n rotate: this.rotate,\n };\n\n /**\n * The underlying Hammer manager, or null when not initialized.\n */\n get manager(): AXGestureManager | null {\n return this.hammer;\n }\n\n #init = afterNextRender(() => {\n if (!isPlatformBrowser(this.platformId)) return;\n this.ready = true;\n void this.setup();\n });\n\n #config = effect(() => {\n this.options();\n this.direction();\n this.enablePinch();\n this.enableRotate();\n this.disabled();\n untracked(() => {\n if (this.ready) void this.setup();\n });\n });\n\n ngOnDestroy(): void {\n this.setupId++;\n this.teardown();\n }\n\n private async setup(): Promise<void> {\n const id = ++this.setupId;\n this.teardown();\n if (this.disabled() || !isPlatformBrowser(this.platformId)) return;\n\n const HammerLib = await this.loadHammer();\n if (id !== this.setupId) return;\n\n this.zone.runOutsideAngular(() => {\n const options: AXGestureOptions = { ...this.options() };\n if (!options.touchAction) {\n const hostTouchAction = this.el.nativeElement.style.touchAction;\n if (hostTouchAction) {\n options.touchAction = hostTouchAction;\n }\n }\n\n const hammer = new HammerLib(this.el.nativeElement, options);\n const direction = this.toHammerDirection(HammerLib, this.direction());\n\n hammer.get('pan')?.set({ direction });\n hammer.get('swipe')?.set({ direction });\n hammer.get('pinch')?.set({ enable: this.enablePinch() });\n hammer.get('rotate')?.set({ enable: this.enableRotate() });\n hammer.on(HAMMER_EVENTS, this.onHammerEvent);\n\n this.hammer = hammer;\n });\n }\n\n private async loadHammer(): Promise<HammerStatic> {\n if (this.hammerLib) return this.hammerLib;\n const mod = (await import('hammerjs')) as unknown as HammerStatic & { default?: HammerStatic };\n this.hammerLib = mod.default ?? mod;\n return this.hammerLib;\n }\n\n private toHammerDirection(HammerLib: HammerStatic, direction: AXGestureDirection): number {\n if (direction === 'all') return HammerLib.DIRECTION_ALL;\n if (direction === 'vertical') return HammerLib.DIRECTION_VERTICAL;\n return HammerLib.DIRECTION_HORIZONTAL;\n }\n\n private teardown(): void {\n if (!this.hammer) return;\n this.hammer.off(HAMMER_EVENTS, this.onHammerEvent);\n this.hammer.destroy();\n this.hammer = null;\n }\n\n private readonly onHammerEvent = (ev: AXGestureEvent) => {\n const emit = this.emitters[ev.type];\n if (!emit) return;\n if (HIGH_FREQUENCY_EVENTS.has(ev.type)) {\n emit.emit(ev);\n return;\n }\n this.zone.run(() => emit.emit(ev));\n };\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -1,23 +1,29 @@
1
1
  import { isPlatformBrowser } from '@angular/common';
2
+ import * as i1 from '@acorex/cdk/gesture';
3
+ import { AXGestureDirective } from '@acorex/cdk/gesture';
2
4
  import * as i0 from '@angular/core';
3
- import { inject, ElementRef, PLATFORM_ID, NgZone, input, afterNextRender, Directive } from '@angular/core';
5
+ import { inject, ElementRef, PLATFORM_ID, NgZone, DestroyRef, input, afterNextRender, Directive } from '@angular/core';
4
6
 
5
7
  /**
6
- * Converts vertical mouse-wheel scrolling and pointer drag/swipe into horizontal scrolling on the host element.
7
- * Applies only when the host can scroll horizontally. Pointer events cover mouse, touch, and pen.
8
+ * Converts vertical mouse-wheel scrolling and horizontal pan into horizontal scrolling on the host element.
9
+ * Applies only when the host can scroll horizontally. Pan is provided by the hosted AXGestureDirective.
8
10
  *
9
11
  * Usage:
10
12
  * <div axHorizontalScroll [speed]="150" class="overflow-x-auto">
11
13
  * ...
12
14
  * </div>
15
+ *
16
+ * Do not put `axGesture` on the same element; this directive already hosts it.
13
17
  */
14
18
  class AXHorizontalScrollDirective {
15
19
  constructor() {
16
20
  this.elementRef = inject((ElementRef));
17
21
  this.platformId = inject(PLATFORM_ID);
18
22
  this.zone = inject(NgZone);
23
+ this.gesture = inject(AXGestureDirective);
24
+ this.destroyRef = inject(DestroyRef);
19
25
  /**
20
- * Disables wheel-to-horizontal conversion and pointer drag when true.
26
+ * Disables wheel-to-horizontal conversion and pan scrolling when true.
21
27
  */
22
28
  this.disabled = input(false, /* @ts-ignore */
23
29
  ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
@@ -31,54 +37,45 @@ class AXHorizontalScrollDirective {
31
37
  this.targetScrollLeft = null;
32
38
  this.scrollPosition = 0;
33
39
  this.lastFrameTime = 0;
34
- this.pointerId = null;
35
- this.pointerStartX = 0;
36
- this.pointerStartY = 0;
37
- this.pointerStartScrollLeft = 0;
38
- this.pointerAxis = 'undecided';
39
- this.lastPointerX = 0;
40
- this.lastPointerTime = 0;
41
- this.pointerVelocityX = 0;
40
+ this.isPanning = false;
41
+ this.ignorePan = false;
42
+ this.panStartScrollLeft = 0;
42
43
  this.suppressClickListener = null;
43
44
  this.suppressClickTimer = null;
44
- this.axisLockThreshold = 6;
45
45
  this.interactiveSelector = 'input, textarea, select, option, [contenteditable]:not([contenteditable="false"])';
46
46
  this.wheelListener = (event) => this.handleWheel(event);
47
- this.pointerDownListener = (event) => this.handlePointerDown(event);
48
- this.pointerMoveListener = (event) => this.handlePointerMove(event);
49
- this.pointerUpListener = (event) => this.handlePointerUp(event);
50
47
  this.#init = afterNextRender(() => {
51
48
  if (!isPlatformBrowser(this.platformId))
52
49
  return;
53
50
  this.zone.runOutsideAngular(() => {
54
51
  this.nativeElement.addEventListener('wheel', this.wheelListener, { passive: false });
55
- this.nativeElement.addEventListener('pointerdown', this.pointerDownListener);
56
- this.nativeElement.addEventListener('pointermove', this.pointerMoveListener, { passive: false });
57
- this.nativeElement.addEventListener('pointerup', this.pointerUpListener);
58
- this.nativeElement.addEventListener('pointercancel', this.pointerUpListener);
59
- this.nativeElement.addEventListener('lostpointercapture', this.pointerUpListener);
60
52
  });
61
53
  });
54
+ const subscriptions = [
55
+ this.gesture.panstart.subscribe((event) => this.handlePanStart(event)),
56
+ this.gesture.panmove.subscribe((event) => this.handlePanMove(event)),
57
+ this.gesture.panend.subscribe((event) => this.handlePanEnd(event)),
58
+ ];
59
+ this.destroyRef.onDestroy(() => {
60
+ for (const subscription of subscriptions) {
61
+ subscription.unsubscribe();
62
+ }
63
+ });
62
64
  }
63
65
  #init;
64
66
  ngOnDestroy() {
65
67
  if (!isPlatformBrowser(this.platformId))
66
68
  return;
67
69
  this.stopAnimation();
68
- this.releasePointer();
70
+ this.clearPanStyles();
69
71
  this.clearClickSuppression();
70
72
  this.nativeElement.removeEventListener('wheel', this.wheelListener);
71
- this.nativeElement.removeEventListener('pointerdown', this.pointerDownListener);
72
- this.nativeElement.removeEventListener('pointermove', this.pointerMoveListener);
73
- this.nativeElement.removeEventListener('pointerup', this.pointerUpListener);
74
- this.nativeElement.removeEventListener('pointercancel', this.pointerUpListener);
75
- this.nativeElement.removeEventListener('lostpointercapture', this.pointerUpListener);
76
73
  }
77
74
  get nativeElement() {
78
75
  return this.elementRef.nativeElement;
79
76
  }
80
77
  handleWheel(event) {
81
- if (this.disabled() || this.pointerId !== null || !this.canScrollHorizontally())
78
+ if (this.disabled() || this.isPanning || !this.canScrollHorizontally())
82
79
  return;
83
80
  if (event.shiftKey || Math.abs(event.deltaX) > Math.abs(event.deltaY))
84
81
  return;
@@ -101,88 +98,55 @@ class AXHorizontalScrollDirective {
101
98
  }
102
99
  this.startAnimation();
103
100
  }
104
- handlePointerDown(event) {
105
- if (this.disabled() || !event.isPrimary || !this.canScrollHorizontally())
101
+ handlePanStart(event) {
102
+ if (this.disabled() || !this.canScrollHorizontally()) {
103
+ this.ignorePan = true;
106
104
  return;
107
- if (event.pointerType === 'mouse' && event.button !== 0)
108
- return;
109
- if (event.target instanceof Element && event.target.closest(this.interactiveSelector))
105
+ }
106
+ if (event.target instanceof Element && event.target.closest(this.interactiveSelector)) {
107
+ this.ignorePan = true;
110
108
  return;
109
+ }
110
+ this.ignorePan = false;
111
+ this.isPanning = true;
111
112
  this.stopAnimation();
112
113
  this.targetScrollLeft = null;
113
114
  this.scrollPosition = this.nativeElement.scrollLeft;
114
- this.pointerId = event.pointerId;
115
- this.pointerStartX = event.clientX;
116
- this.pointerStartY = event.clientY;
117
- this.pointerStartScrollLeft = this.scrollPosition;
118
- this.pointerAxis = 'undecided';
119
- this.lastPointerX = event.clientX;
120
- this.lastPointerTime = performance.now();
121
- this.pointerVelocityX = 0;
122
- }
123
- handlePointerMove(event) {
124
- if (this.pointerId !== event.pointerId || this.disabled())
125
- return;
126
- const deltaX = event.clientX - this.pointerStartX;
127
- const deltaY = event.clientY - this.pointerStartY;
128
- if (this.pointerAxis === 'undecided') {
129
- if (Math.hypot(deltaX, deltaY) < this.axisLockThreshold)
130
- return;
131
- this.pointerAxis = Math.abs(deltaX) > Math.abs(deltaY) ? 'horizontal' : 'vertical';
132
- if (this.pointerAxis === 'vertical') {
133
- this.releasePointer();
134
- return;
135
- }
136
- this.nativeElement.setPointerCapture(event.pointerId);
137
- this.nativeElement.style.userSelect = 'none';
138
- if (event.pointerType === 'mouse') {
139
- this.nativeElement.style.cursor = 'grabbing';
140
- }
115
+ this.panStartScrollLeft = this.scrollPosition;
116
+ this.nativeElement.style.userSelect = 'none';
117
+ if (event.pointerType === 'mouse') {
118
+ this.nativeElement.style.cursor = 'grabbing';
141
119
  }
142
- if (this.pointerAxis !== 'horizontal')
120
+ }
121
+ handlePanMove(event) {
122
+ if (this.ignorePan || this.disabled() || !this.isPanning)
143
123
  return;
144
124
  event.preventDefault();
145
- const now = performance.now();
146
- const elapsed = now - this.lastPointerTime;
147
- if (elapsed > 0) {
148
- this.pointerVelocityX = (event.clientX - this.lastPointerX) / elapsed;
149
- }
150
- this.lastPointerX = event.clientX;
151
- this.lastPointerTime = now;
152
- const next = Math.max(0, Math.min(this.getMaxScrollLeft(), this.pointerStartScrollLeft - deltaX));
125
+ const next = Math.max(0, Math.min(this.getMaxScrollLeft(), this.panStartScrollLeft - event.deltaX));
153
126
  this.applyScrollPosition(next);
154
127
  }
155
- handlePointerUp(event) {
156
- if (this.pointerId !== event.pointerId)
128
+ handlePanEnd(event) {
129
+ if (this.ignorePan) {
130
+ this.ignorePan = false;
131
+ this.isPanning = false;
157
132
  return;
158
- const wasHorizontalDrag = this.pointerAxis === 'horizontal';
159
- const velocityX = this.pointerVelocityX;
160
- const lastMoveAge = performance.now() - this.lastPointerTime;
161
- this.releasePointer();
162
- if (!wasHorizontalDrag)
133
+ }
134
+ this.isPanning = false;
135
+ this.clearPanStyles();
136
+ if (this.disabled())
163
137
  return;
164
138
  this.suppressClick();
165
- if (this.speed() <= 0 || lastMoveAge > 80)
139
+ if (this.speed() <= 0)
166
140
  return;
167
- const distance = -velocityX * this.speed();
141
+ const distance = -event.velocityX * this.speed();
168
142
  if (Math.abs(distance) < 8)
169
143
  return;
170
144
  this.targetScrollLeft = Math.max(0, Math.min(this.getMaxScrollLeft(), this.scrollPosition + distance));
171
145
  this.startAnimation();
172
146
  }
173
- releasePointer() {
174
- if (this.pointerId === null)
175
- return;
176
- const pointerId = this.pointerId;
177
- this.pointerId = null;
178
- this.pointerAxis = 'undecided';
179
- this.pointerVelocityX = 0;
180
- const element = this.nativeElement;
181
- if (element.hasPointerCapture(pointerId)) {
182
- element.releasePointerCapture(pointerId);
183
- }
184
- element.style.userSelect = '';
185
- element.style.cursor = '';
147
+ clearPanStyles() {
148
+ this.nativeElement.style.userSelect = '';
149
+ this.nativeElement.style.cursor = '';
186
150
  }
187
151
  suppressClick() {
188
152
  this.clearClickSuppression();
@@ -255,17 +219,18 @@ class AXHorizontalScrollDirective {
255
219
  return element.scrollWidth - element.clientWidth;
256
220
  }
257
221
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXHorizontalScrollDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
258
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.8", type: AXHorizontalScrollDirective, isStandalone: true, selector: "[axHorizontalScroll]", inputs: { disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, speed: { classPropertyName: "speed", publicName: "speed", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "style.touch-action": "disabled() ? null : \"pan-y\"" } }, ngImport: i0 }); }
222
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.8", type: AXHorizontalScrollDirective, isStandalone: true, selector: "[axHorizontalScroll]", inputs: { disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, speed: { classPropertyName: "speed", publicName: "speed", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "style.touch-action": "disabled() ? null : \"pan-y\"" } }, hostDirectives: [{ directive: i1.AXGestureDirective }], ngImport: i0 }); }
259
223
  }
260
224
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXHorizontalScrollDirective, decorators: [{
261
225
  type: Directive,
262
226
  args: [{
263
227
  selector: '[axHorizontalScroll]',
228
+ hostDirectives: [AXGestureDirective],
264
229
  host: {
265
230
  '[style.touch-action]': 'disabled() ? null : "pan-y"',
266
231
  },
267
232
  }]
268
- }], propDecorators: { disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], speed: [{ type: i0.Input, args: [{ isSignal: true, alias: "speed", required: false }] }] } });
233
+ }], ctorParameters: () => [], propDecorators: { disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], speed: [{ type: i0.Input, args: [{ isSignal: true, alias: "speed", required: false }] }] } });
269
234
 
270
235
  /**
271
236
  * Generated bundle index. Do not edit.
@@ -1 +1 @@
1
- {"version":3,"file":"acorex-cdk-horizontal-scroll.mjs","sources":["../../../../packages/cdk/horizontal-scroll/src/lib/horizontal-scroll.directive.ts","../../../../packages/cdk/horizontal-scroll/src/acorex-cdk-horizontal-scroll.ts"],"sourcesContent":["import { isPlatformBrowser } from '@angular/common';\nimport { afterNextRender, Directive, ElementRef, inject, input, NgZone, OnDestroy, PLATFORM_ID } from '@angular/core';\n\n/**\n * Converts vertical mouse-wheel scrolling and pointer drag/swipe into horizontal scrolling on the host element.\n * Applies only when the host can scroll horizontally. Pointer events cover mouse, touch, and pen.\n *\n * Usage:\n * <div axHorizontalScroll [speed]=\"150\" class=\"overflow-x-auto\">\n * ...\n * </div>\n */\n@Directive({\n selector: '[axHorizontalScroll]',\n host: {\n '[style.touch-action]': 'disabled() ? null : \"pan-y\"',\n },\n})\nexport class AXHorizontalScrollDirective implements OnDestroy {\n private elementRef = inject(ElementRef<HTMLElement>);\n private platformId = inject(PLATFORM_ID);\n private zone = inject(NgZone);\n\n /**\n * Disables wheel-to-horizontal conversion and pointer drag when true.\n */\n disabled = input(false);\n\n /**\n * Horizontal scroll animation duration in milliseconds.\n * Lower values scroll faster; `0` applies the scroll instantly.\n */\n speed = input(200);\n\n private animationFrameId: number | null = null;\n private targetScrollLeft: number | null = null;\n private scrollPosition = 0;\n private lastFrameTime = 0;\n\n private pointerId: number | null = null;\n private pointerStartX = 0;\n private pointerStartY = 0;\n private pointerStartScrollLeft = 0;\n private pointerAxis: 'undecided' | 'horizontal' | 'vertical' = 'undecided';\n private lastPointerX = 0;\n private lastPointerTime = 0;\n private pointerVelocityX = 0;\n private suppressClickListener: ((event: Event) => void) | null = null;\n private suppressClickTimer: ReturnType<typeof setTimeout> | null = null;\n\n private readonly axisLockThreshold = 6;\n private readonly interactiveSelector =\n 'input, textarea, select, option, [contenteditable]:not([contenteditable=\"false\"])';\n\n private readonly wheelListener = (event: WheelEvent) => this.handleWheel(event);\n private readonly pointerDownListener = (event: PointerEvent) => this.handlePointerDown(event);\n private readonly pointerMoveListener = (event: PointerEvent) => this.handlePointerMove(event);\n private readonly pointerUpListener = (event: PointerEvent) => this.handlePointerUp(event);\n\n #init = afterNextRender(() => {\n if (!isPlatformBrowser(this.platformId)) return;\n\n this.zone.runOutsideAngular(() => {\n this.nativeElement.addEventListener('wheel', this.wheelListener, { passive: false });\n this.nativeElement.addEventListener('pointerdown', this.pointerDownListener);\n this.nativeElement.addEventListener('pointermove', this.pointerMoveListener, { passive: false });\n this.nativeElement.addEventListener('pointerup', this.pointerUpListener);\n this.nativeElement.addEventListener('pointercancel', this.pointerUpListener);\n this.nativeElement.addEventListener('lostpointercapture', this.pointerUpListener);\n });\n });\n\n ngOnDestroy(): void {\n if (!isPlatformBrowser(this.platformId)) return;\n\n this.stopAnimation();\n this.releasePointer();\n this.clearClickSuppression();\n this.nativeElement.removeEventListener('wheel', this.wheelListener);\n this.nativeElement.removeEventListener('pointerdown', this.pointerDownListener);\n this.nativeElement.removeEventListener('pointermove', this.pointerMoveListener);\n this.nativeElement.removeEventListener('pointerup', this.pointerUpListener);\n this.nativeElement.removeEventListener('pointercancel', this.pointerUpListener);\n this.nativeElement.removeEventListener('lostpointercapture', this.pointerUpListener);\n }\n\n private get nativeElement(): HTMLElement {\n return this.elementRef.nativeElement;\n }\n\n private handleWheel(event: WheelEvent): void {\n if (this.disabled() || this.pointerId !== null || !this.canScrollHorizontally()) return;\n if (event.shiftKey || Math.abs(event.deltaX) > Math.abs(event.deltaY)) return;\n if (event.deltaY === 0) return;\n\n const maxScrollLeft = this.getMaxScrollLeft();\n\n this.syncScrollState();\n\n const currentPosition = this.targetScrollLeft ?? this.scrollPosition;\n const atStart = currentPosition <= 0 && event.deltaY < 0;\n const atEnd = currentPosition >= maxScrollLeft && event.deltaY > 0;\n\n if (atStart || atEnd) return;\n\n event.preventDefault();\n\n const nextTarget = Math.max(0, Math.min(maxScrollLeft, currentPosition + event.deltaY));\n this.targetScrollLeft = nextTarget;\n\n if (this.speed() <= 0) {\n this.applyScrollPosition(nextTarget);\n this.targetScrollLeft = null;\n return;\n }\n\n this.startAnimation();\n }\n\n private handlePointerDown(event: PointerEvent): void {\n if (this.disabled() || !event.isPrimary || !this.canScrollHorizontally()) return;\n if (event.pointerType === 'mouse' && event.button !== 0) return;\n if (event.target instanceof Element && event.target.closest(this.interactiveSelector)) return;\n\n this.stopAnimation();\n this.targetScrollLeft = null;\n this.scrollPosition = this.nativeElement.scrollLeft;\n\n this.pointerId = event.pointerId;\n this.pointerStartX = event.clientX;\n this.pointerStartY = event.clientY;\n this.pointerStartScrollLeft = this.scrollPosition;\n this.pointerAxis = 'undecided';\n this.lastPointerX = event.clientX;\n this.lastPointerTime = performance.now();\n this.pointerVelocityX = 0;\n }\n\n private handlePointerMove(event: PointerEvent): void {\n if (this.pointerId !== event.pointerId || this.disabled()) return;\n\n const deltaX = event.clientX - this.pointerStartX;\n const deltaY = event.clientY - this.pointerStartY;\n\n if (this.pointerAxis === 'undecided') {\n if (Math.hypot(deltaX, deltaY) < this.axisLockThreshold) return;\n\n this.pointerAxis = Math.abs(deltaX) > Math.abs(deltaY) ? 'horizontal' : 'vertical';\n\n if (this.pointerAxis === 'vertical') {\n this.releasePointer();\n return;\n }\n\n this.nativeElement.setPointerCapture(event.pointerId);\n this.nativeElement.style.userSelect = 'none';\n if (event.pointerType === 'mouse') {\n this.nativeElement.style.cursor = 'grabbing';\n }\n }\n\n if (this.pointerAxis !== 'horizontal') return;\n\n event.preventDefault();\n\n const now = performance.now();\n const elapsed = now - this.lastPointerTime;\n if (elapsed > 0) {\n this.pointerVelocityX = (event.clientX - this.lastPointerX) / elapsed;\n }\n this.lastPointerX = event.clientX;\n this.lastPointerTime = now;\n\n const next = Math.max(0, Math.min(this.getMaxScrollLeft(), this.pointerStartScrollLeft - deltaX));\n this.applyScrollPosition(next);\n }\n\n private handlePointerUp(event: PointerEvent): void {\n if (this.pointerId !== event.pointerId) return;\n\n const wasHorizontalDrag = this.pointerAxis === 'horizontal';\n const velocityX = this.pointerVelocityX;\n const lastMoveAge = performance.now() - this.lastPointerTime;\n\n this.releasePointer();\n\n if (!wasHorizontalDrag) return;\n\n this.suppressClick();\n\n if (this.speed() <= 0 || lastMoveAge > 80) return;\n\n const distance = -velocityX * this.speed();\n if (Math.abs(distance) < 8) return;\n\n this.targetScrollLeft = Math.max(0, Math.min(this.getMaxScrollLeft(), this.scrollPosition + distance));\n this.startAnimation();\n }\n\n private releasePointer(): void {\n if (this.pointerId === null) return;\n\n const pointerId = this.pointerId;\n this.pointerId = null;\n this.pointerAxis = 'undecided';\n this.pointerVelocityX = 0;\n\n const element = this.nativeElement;\n if (element.hasPointerCapture(pointerId)) {\n element.releasePointerCapture(pointerId);\n }\n\n element.style.userSelect = '';\n element.style.cursor = '';\n }\n\n private suppressClick(): void {\n this.clearClickSuppression();\n\n const preventClick = (event: Event): void => {\n event.preventDefault();\n event.stopImmediatePropagation();\n this.clearClickSuppression();\n };\n\n this.suppressClickListener = preventClick;\n this.nativeElement.addEventListener('click', preventClick, true);\n this.suppressClickTimer = setTimeout(() => this.clearClickSuppression(), 400);\n }\n\n private clearClickSuppression(): void {\n if (this.suppressClickTimer !== null) {\n clearTimeout(this.suppressClickTimer);\n this.suppressClickTimer = null;\n }\n\n if (!this.suppressClickListener) return;\n\n this.nativeElement.removeEventListener('click', this.suppressClickListener, true);\n this.suppressClickListener = null;\n }\n\n private syncScrollState(): void {\n if (this.targetScrollLeft !== null) return;\n\n this.scrollPosition = this.nativeElement.scrollLeft;\n this.targetScrollLeft = this.scrollPosition;\n }\n\n private startAnimation(): void {\n if (this.animationFrameId !== null) return;\n\n this.lastFrameTime = performance.now();\n\n const step = (currentTime: number): void => {\n const target = this.targetScrollLeft;\n\n if (target === null) {\n this.stopAnimation();\n return;\n }\n\n const deltaTime = Math.max(currentTime - this.lastFrameTime, 1);\n this.lastFrameTime = currentTime;\n\n const factor = 1 - Math.exp(-deltaTime / this.speed());\n this.scrollPosition += (target - this.scrollPosition) * factor;\n this.applyScrollPosition(this.scrollPosition);\n\n if (Math.abs(target - this.scrollPosition) < 0.5) {\n this.applyScrollPosition(target);\n this.targetScrollLeft = null;\n this.stopAnimation();\n return;\n }\n\n this.animationFrameId = requestAnimationFrame(step);\n };\n\n this.animationFrameId = requestAnimationFrame(step);\n }\n\n private applyScrollPosition(position: number): void {\n this.scrollPosition = position;\n this.nativeElement.scrollLeft = position;\n }\n\n private stopAnimation(): void {\n if (this.animationFrameId === null) return;\n\n cancelAnimationFrame(this.animationFrameId);\n this.animationFrameId = null;\n }\n\n private canScrollHorizontally(): boolean {\n const element = this.nativeElement;\n return element.scrollWidth > element.clientWidth;\n }\n\n private getMaxScrollLeft(): number {\n const element = this.nativeElement;\n return element.scrollWidth - element.clientWidth;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"acorex-cdk-horizontal-scroll.mjs","sources":["../../../../packages/cdk/horizontal-scroll/src/lib/horizontal-scroll.directive.ts","../../../../packages/cdk/horizontal-scroll/src/acorex-cdk-horizontal-scroll.ts"],"sourcesContent":["import { isPlatformBrowser } from '@angular/common';\nimport { AXGestureDirective, AXGestureEvent } from '@acorex/cdk/gesture';\nimport {\n afterNextRender,\n DestroyRef,\n Directive,\n ElementRef,\n inject,\n input,\n NgZone,\n OnDestroy,\n PLATFORM_ID,\n} from '@angular/core';\n\n/**\n * Converts vertical mouse-wheel scrolling and horizontal pan into horizontal scrolling on the host element.\n * Applies only when the host can scroll horizontally. Pan is provided by the hosted AXGestureDirective.\n *\n * Usage:\n * <div axHorizontalScroll [speed]=\"150\" class=\"overflow-x-auto\">\n * ...\n * </div>\n *\n * Do not put `axGesture` on the same element; this directive already hosts it.\n */\n@Directive({\n selector: '[axHorizontalScroll]',\n hostDirectives: [AXGestureDirective],\n host: {\n '[style.touch-action]': 'disabled() ? null : \"pan-y\"',\n },\n})\nexport class AXHorizontalScrollDirective implements OnDestroy {\n private readonly elementRef = inject(ElementRef<HTMLElement>);\n private readonly platformId = inject(PLATFORM_ID);\n private readonly zone = inject(NgZone);\n private readonly gesture = inject(AXGestureDirective);\n private readonly destroyRef = inject(DestroyRef);\n\n /**\n * Disables wheel-to-horizontal conversion and pan scrolling when true.\n */\n disabled = input(false);\n\n /**\n * Horizontal scroll animation duration in milliseconds.\n * Lower values scroll faster; `0` applies the scroll instantly.\n */\n speed = input(200);\n\n private animationFrameId: number | null = null;\n private targetScrollLeft: number | null = null;\n private scrollPosition = 0;\n private lastFrameTime = 0;\n\n private isPanning = false;\n private ignorePan = false;\n private panStartScrollLeft = 0;\n private suppressClickListener: ((event: Event) => void) | null = null;\n private suppressClickTimer: ReturnType<typeof setTimeout> | null = null;\n\n private readonly interactiveSelector =\n 'input, textarea, select, option, [contenteditable]:not([contenteditable=\"false\"])';\n\n private readonly wheelListener = (event: WheelEvent) => this.handleWheel(event);\n\n constructor() {\n const subscriptions = [\n this.gesture.panstart.subscribe((event) => this.handlePanStart(event)),\n this.gesture.panmove.subscribe((event) => this.handlePanMove(event)),\n this.gesture.panend.subscribe((event) => this.handlePanEnd(event)),\n ];\n this.destroyRef.onDestroy(() => {\n for (const subscription of subscriptions) {\n subscription.unsubscribe();\n }\n });\n }\n\n #init = afterNextRender(() => {\n if (!isPlatformBrowser(this.platformId)) return;\n\n this.zone.runOutsideAngular(() => {\n this.nativeElement.addEventListener('wheel', this.wheelListener, { passive: false });\n });\n });\n\n ngOnDestroy(): void {\n if (!isPlatformBrowser(this.platformId)) return;\n\n this.stopAnimation();\n this.clearPanStyles();\n this.clearClickSuppression();\n this.nativeElement.removeEventListener('wheel', this.wheelListener);\n }\n\n private get nativeElement(): HTMLElement {\n return this.elementRef.nativeElement;\n }\n\n private handleWheel(event: WheelEvent): void {\n if (this.disabled() || this.isPanning || !this.canScrollHorizontally()) return;\n if (event.shiftKey || Math.abs(event.deltaX) > Math.abs(event.deltaY)) return;\n if (event.deltaY === 0) return;\n\n const maxScrollLeft = this.getMaxScrollLeft();\n\n this.syncScrollState();\n\n const currentPosition = this.targetScrollLeft ?? this.scrollPosition;\n const atStart = currentPosition <= 0 && event.deltaY < 0;\n const atEnd = currentPosition >= maxScrollLeft && event.deltaY > 0;\n\n if (atStart || atEnd) return;\n\n event.preventDefault();\n\n const nextTarget = Math.max(0, Math.min(maxScrollLeft, currentPosition + event.deltaY));\n this.targetScrollLeft = nextTarget;\n\n if (this.speed() <= 0) {\n this.applyScrollPosition(nextTarget);\n this.targetScrollLeft = null;\n return;\n }\n\n this.startAnimation();\n }\n\n private handlePanStart(event: AXGestureEvent): void {\n if (this.disabled() || !this.canScrollHorizontally()) {\n this.ignorePan = true;\n return;\n }\n if (event.target instanceof Element && event.target.closest(this.interactiveSelector)) {\n this.ignorePan = true;\n return;\n }\n\n this.ignorePan = false;\n this.isPanning = true;\n this.stopAnimation();\n this.targetScrollLeft = null;\n this.scrollPosition = this.nativeElement.scrollLeft;\n this.panStartScrollLeft = this.scrollPosition;\n this.nativeElement.style.userSelect = 'none';\n if (event.pointerType === 'mouse') {\n this.nativeElement.style.cursor = 'grabbing';\n }\n }\n\n private handlePanMove(event: AXGestureEvent): void {\n if (this.ignorePan || this.disabled() || !this.isPanning) return;\n\n event.preventDefault();\n const next = Math.max(0, Math.min(this.getMaxScrollLeft(), this.panStartScrollLeft - event.deltaX));\n this.applyScrollPosition(next);\n }\n\n private handlePanEnd(event: AXGestureEvent): void {\n if (this.ignorePan) {\n this.ignorePan = false;\n this.isPanning = false;\n return;\n }\n\n this.isPanning = false;\n this.clearPanStyles();\n\n if (this.disabled()) return;\n\n this.suppressClick();\n\n if (this.speed() <= 0) return;\n\n const distance = -event.velocityX * this.speed();\n if (Math.abs(distance) < 8) return;\n\n this.targetScrollLeft = Math.max(0, Math.min(this.getMaxScrollLeft(), this.scrollPosition + distance));\n this.startAnimation();\n }\n\n private clearPanStyles(): void {\n this.nativeElement.style.userSelect = '';\n this.nativeElement.style.cursor = '';\n }\n\n private suppressClick(): void {\n this.clearClickSuppression();\n\n const preventClick = (event: Event): void => {\n event.preventDefault();\n event.stopImmediatePropagation();\n this.clearClickSuppression();\n };\n\n this.suppressClickListener = preventClick;\n this.nativeElement.addEventListener('click', preventClick, true);\n this.suppressClickTimer = setTimeout(() => this.clearClickSuppression(), 400);\n }\n\n private clearClickSuppression(): void {\n if (this.suppressClickTimer !== null) {\n clearTimeout(this.suppressClickTimer);\n this.suppressClickTimer = null;\n }\n\n if (!this.suppressClickListener) return;\n\n this.nativeElement.removeEventListener('click', this.suppressClickListener, true);\n this.suppressClickListener = null;\n }\n\n private syncScrollState(): void {\n if (this.targetScrollLeft !== null) return;\n\n this.scrollPosition = this.nativeElement.scrollLeft;\n this.targetScrollLeft = this.scrollPosition;\n }\n\n private startAnimation(): void {\n if (this.animationFrameId !== null) return;\n\n this.lastFrameTime = performance.now();\n\n const step = (currentTime: number): void => {\n const target = this.targetScrollLeft;\n\n if (target === null) {\n this.stopAnimation();\n return;\n }\n\n const deltaTime = Math.max(currentTime - this.lastFrameTime, 1);\n this.lastFrameTime = currentTime;\n\n const factor = 1 - Math.exp(-deltaTime / this.speed());\n this.scrollPosition += (target - this.scrollPosition) * factor;\n this.applyScrollPosition(this.scrollPosition);\n\n if (Math.abs(target - this.scrollPosition) < 0.5) {\n this.applyScrollPosition(target);\n this.targetScrollLeft = null;\n this.stopAnimation();\n return;\n }\n\n this.animationFrameId = requestAnimationFrame(step);\n };\n\n this.animationFrameId = requestAnimationFrame(step);\n }\n\n private applyScrollPosition(position: number): void {\n this.scrollPosition = position;\n this.nativeElement.scrollLeft = position;\n }\n\n private stopAnimation(): void {\n if (this.animationFrameId === null) return;\n\n cancelAnimationFrame(this.animationFrameId);\n this.animationFrameId = null;\n }\n\n private canScrollHorizontally(): boolean {\n const element = this.nativeElement;\n return element.scrollWidth > element.clientWidth;\n }\n\n private getMaxScrollLeft(): number {\n const element = this.nativeElement;\n return element.scrollWidth - element.clientWidth;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;AAcA;;;;;;;;;;AAUG;MAQU,2BAA2B,CAAA;AAkCtC,IAAA,WAAA,GAAA;AAjCiB,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,EAAC,UAAuB,EAAC;AAC5C,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC;AAChC,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC;AACrB,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,kBAAkB,CAAC;AACpC,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAEhD;;AAEG;QACH,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,KAAK;qFAAC;AAEvB;;;AAGG;QACH,IAAA,CAAA,KAAK,GAAG,KAAK,CAAC,GAAG;kFAAC;QAEV,IAAA,CAAA,gBAAgB,GAAkB,IAAI;QACtC,IAAA,CAAA,gBAAgB,GAAkB,IAAI;QACtC,IAAA,CAAA,cAAc,GAAG,CAAC;QAClB,IAAA,CAAA,aAAa,GAAG,CAAC;QAEjB,IAAA,CAAA,SAAS,GAAG,KAAK;QACjB,IAAA,CAAA,SAAS,GAAG,KAAK;QACjB,IAAA,CAAA,kBAAkB,GAAG,CAAC;QACtB,IAAA,CAAA,qBAAqB,GAAoC,IAAI;QAC7D,IAAA,CAAA,kBAAkB,GAAyC,IAAI;QAEtD,IAAA,CAAA,mBAAmB,GAClC,mFAAmF;AAEpE,QAAA,IAAA,CAAA,aAAa,GAAG,CAAC,KAAiB,KAAK,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AAe/E,QAAA,IAAA,CAAA,KAAK,GAAG,eAAe,CAAC,MAAK;AAC3B,YAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC;gBAAE;AAEzC,YAAA,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAK;AAC/B,gBAAA,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AACtF,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;AAlBA,QAAA,MAAM,aAAa,GAAG;AACpB,YAAA,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;AACtE,YAAA,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;AACpE,YAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;SACnE;AACD,QAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAK;AAC7B,YAAA,KAAK,MAAM,YAAY,IAAI,aAAa,EAAE;gBACxC,YAAY,CAAC,WAAW,EAAE;YAC5B;AACF,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,KAAK;IAQL,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC;YAAE;QAEzC,IAAI,CAAC,aAAa,EAAE;QACpB,IAAI,CAAC,cAAc,EAAE;QACrB,IAAI,CAAC,qBAAqB,EAAE;QAC5B,IAAI,CAAC,aAAa,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC;IACrE;AAEA,IAAA,IAAY,aAAa,GAAA;AACvB,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,aAAa;IACtC;AAEQ,IAAA,WAAW,CAAC,KAAiB,EAAA;AACnC,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE;YAAE;QACxE,IAAI,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC;YAAE;AACvE,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE;AAExB,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,EAAE;QAE7C,IAAI,CAAC,eAAe,EAAE;QAEtB,MAAM,eAAe,GAAG,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,cAAc;QACpE,MAAM,OAAO,GAAG,eAAe,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QACxD,MAAM,KAAK,GAAG,eAAe,IAAI,aAAa,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAElE,IAAI,OAAO,IAAI,KAAK;YAAE;QAEtB,KAAK,CAAC,cAAc,EAAE;QAEtB,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,eAAe,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;AACvF,QAAA,IAAI,CAAC,gBAAgB,GAAG,UAAU;AAElC,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE;AACrB,YAAA,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC;AACpC,YAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;YAC5B;QACF;QAEA,IAAI,CAAC,cAAc,EAAE;IACvB;AAEQ,IAAA,cAAc,CAAC,KAAqB,EAAA;QAC1C,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,EAAE;AACpD,YAAA,IAAI,CAAC,SAAS,GAAG,IAAI;YACrB;QACF;AACA,QAAA,IAAI,KAAK,CAAC,MAAM,YAAY,OAAO,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,EAAE;AACrF,YAAA,IAAI,CAAC,SAAS,GAAG,IAAI;YACrB;QACF;AAEA,QAAA,IAAI,CAAC,SAAS,GAAG,KAAK;AACtB,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;QACrB,IAAI,CAAC,aAAa,EAAE;AACpB,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;QAC5B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU;AACnD,QAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,cAAc;QAC7C,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,UAAU,GAAG,MAAM;AAC5C,QAAA,IAAI,KAAK,CAAC,WAAW,KAAK,OAAO,EAAE;YACjC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,GAAG,UAAU;QAC9C;IACF;AAEQ,IAAA,aAAa,CAAC,KAAqB,EAAA;AACzC,QAAA,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE;QAE1D,KAAK,CAAC,cAAc,EAAE;QACtB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;AACnG,QAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC;IAChC;AAEQ,IAAA,YAAY,CAAC,KAAqB,EAAA;AACxC,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,YAAA,IAAI,CAAC,SAAS,GAAG,KAAK;AACtB,YAAA,IAAI,CAAC,SAAS,GAAG,KAAK;YACtB;QACF;AAEA,QAAA,IAAI,CAAC,SAAS,GAAG,KAAK;QACtB,IAAI,CAAC,cAAc,EAAE;QAErB,IAAI,IAAI,CAAC,QAAQ,EAAE;YAAE;QAErB,IAAI,CAAC,aAAa,EAAE;AAEpB,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC;YAAE;QAEvB,MAAM,QAAQ,GAAG,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,EAAE;AAChD,QAAA,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE;QAE5B,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC,CAAC;QACtG,IAAI,CAAC,cAAc,EAAE;IACvB;IAEQ,cAAc,GAAA;QACpB,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE;QACxC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE;IACtC;IAEQ,aAAa,GAAA;QACnB,IAAI,CAAC,qBAAqB,EAAE;AAE5B,QAAA,MAAM,YAAY,GAAG,CAAC,KAAY,KAAU;YAC1C,KAAK,CAAC,cAAc,EAAE;YACtB,KAAK,CAAC,wBAAwB,EAAE;YAChC,IAAI,CAAC,qBAAqB,EAAE;AAC9B,QAAA,CAAC;AAED,QAAA,IAAI,CAAC,qBAAqB,GAAG,YAAY;QACzC,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,OAAO,EAAE,YAAY,EAAE,IAAI,CAAC;AAChE,QAAA,IAAI,CAAC,kBAAkB,GAAG,UAAU,CAAC,MAAM,IAAI,CAAC,qBAAqB,EAAE,EAAE,GAAG,CAAC;IAC/E;IAEQ,qBAAqB,GAAA;AAC3B,QAAA,IAAI,IAAI,CAAC,kBAAkB,KAAK,IAAI,EAAE;AACpC,YAAA,YAAY,CAAC,IAAI,CAAC,kBAAkB,CAAC;AACrC,YAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI;QAChC;QAEA,IAAI,CAAC,IAAI,CAAC,qBAAqB;YAAE;AAEjC,QAAA,IAAI,CAAC,aAAa,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,qBAAqB,EAAE,IAAI,CAAC;AACjF,QAAA,IAAI,CAAC,qBAAqB,GAAG,IAAI;IACnC;IAEQ,eAAe,GAAA;AACrB,QAAA,IAAI,IAAI,CAAC,gBAAgB,KAAK,IAAI;YAAE;QAEpC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU;AACnD,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,cAAc;IAC7C;IAEQ,cAAc,GAAA;AACpB,QAAA,IAAI,IAAI,CAAC,gBAAgB,KAAK,IAAI;YAAE;AAEpC,QAAA,IAAI,CAAC,aAAa,GAAG,WAAW,CAAC,GAAG,EAAE;AAEtC,QAAA,MAAM,IAAI,GAAG,CAAC,WAAmB,KAAU;AACzC,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB;AAEpC,YAAA,IAAI,MAAM,KAAK,IAAI,EAAE;gBACnB,IAAI,CAAC,aAAa,EAAE;gBACpB;YACF;AAEA,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;AAC/D,YAAA,IAAI,CAAC,aAAa,GAAG,WAAW;AAEhC,YAAA,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;AACtD,YAAA,IAAI,CAAC,cAAc,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,cAAc,IAAI,MAAM;AAC9D,YAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,cAAc,CAAC;AAE7C,YAAA,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,GAAG,EAAE;AAChD,gBAAA,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC;AAChC,gBAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;gBAC5B,IAAI,CAAC,aAAa,EAAE;gBACpB;YACF;AAEA,YAAA,IAAI,CAAC,gBAAgB,GAAG,qBAAqB,CAAC,IAAI,CAAC;AACrD,QAAA,CAAC;AAED,QAAA,IAAI,CAAC,gBAAgB,GAAG,qBAAqB,CAAC,IAAI,CAAC;IACrD;AAEQ,IAAA,mBAAmB,CAAC,QAAgB,EAAA;AAC1C,QAAA,IAAI,CAAC,cAAc,GAAG,QAAQ;AAC9B,QAAA,IAAI,CAAC,aAAa,CAAC,UAAU,GAAG,QAAQ;IAC1C;IAEQ,aAAa,GAAA;AACnB,QAAA,IAAI,IAAI,CAAC,gBAAgB,KAAK,IAAI;YAAE;AAEpC,QAAA,oBAAoB,CAAC,IAAI,CAAC,gBAAgB,CAAC;AAC3C,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;IAC9B;IAEQ,qBAAqB,GAAA;AAC3B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa;AAClC,QAAA,OAAO,OAAO,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW;IAClD;IAEQ,gBAAgB,GAAA;AACtB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa;AAClC,QAAA,OAAO,OAAO,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW;IAClD;8GAjPW,2BAA2B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAA3B,2BAA2B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,oBAAA,EAAA,+BAAA,EAAA,EAAA,EAAA,cAAA,EAAA,CAAA,EAAA,SAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAA3B,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBAPvC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,sBAAsB;oBAChC,cAAc,EAAE,CAAC,kBAAkB,CAAC;AACpC,oBAAA,IAAI,EAAE;AACJ,wBAAA,sBAAsB,EAAE,6BAA6B;AACtD,qBAAA;AACF,iBAAA;;;AC/BD;;AAEG;;;;"}
@@ -1,13 +1,18 @@
1
+ import * as i1 from '@acorex/cdk/gesture';
2
+ import { AXGestureDirective } from '@acorex/cdk/gesture';
1
3
  import * as i0 from '@angular/core';
2
- import { inject, ElementRef, signal, effect, afterNextRender, Directive } from '@angular/core';
4
+ import { inject, ElementRef, DestroyRef, signal, effect, afterNextRender, Directive } from '@angular/core';
3
5
 
6
+ /**
7
+ * Enables horizontal sliding on the host via the hosted AXGestureDirective pan events.
8
+ *
9
+ * Do not put `axGesture` on the same element; this directive already hosts it.
10
+ */
4
11
  class AXSlidingItemDirective {
5
12
  constructor() {
6
- this.hostElement = inject(ElementRef);
7
- this.isMouseDown = signal(false, /* @ts-ignore */
8
- ...(ngDevMode ? [{ debugName: "isMouseDown" }] : /* istanbul ignore next */ []));
9
- this.prevX = signal(0, /* @ts-ignore */
10
- ...(ngDevMode ? [{ debugName: "prevX" }] : /* istanbul ignore next */ []));
13
+ this.hostElement = inject((ElementRef));
14
+ this.gesture = inject(AXGestureDirective);
15
+ this.destroyRef = inject(DestroyRef);
11
16
  this.currentX = signal(0, /* @ts-ignore */
12
17
  ...(ngDevMode ? [{ debugName: "currentX" }] : /* istanbul ignore next */ []));
13
18
  this.stopPoint = signal(0, /* @ts-ignore */
@@ -16,6 +21,9 @@ class AXSlidingItemDirective {
16
21
  ...(ngDevMode ? [{ debugName: "disableSlidingRight" }] : /* istanbul ignore next */ []));
17
22
  this.disableSlidingLeft = signal(false, /* @ts-ignore */
18
23
  ...(ngDevMode ? [{ debugName: "disableSlidingLeft" }] : /* istanbul ignore next */ []));
24
+ this.cursor = signal('grab', /* @ts-ignore */
25
+ ...(ngDevMode ? [{ debugName: "cursor" }] : /* istanbul ignore next */ []));
26
+ this.originX = 0;
19
27
  this.#positionChange = effect(() => {
20
28
  if (this.currentX() > 0 && this.disableSlidingRight())
21
29
  return;
@@ -26,77 +34,79 @@ class AXSlidingItemDirective {
26
34
  ...(ngDevMode ? [{ debugName: "#positionChange" }] : /* istanbul ignore next */ []));
27
35
  this.#init = afterNextRender(() => {
28
36
  const el = this.hostElement.nativeElement.parentElement;
37
+ if (!el)
38
+ return;
29
39
  el.style.display = 'flex';
30
40
  el.style.justifyContent = 'space-between';
31
41
  el.style.position = 'relative';
32
42
  el.style.overflow = 'hidden';
33
43
  });
34
- this.#effect2 = effect(() => {
35
- this.hostElement.nativeElement.style.position = 'absolute';
36
- this.hostElement.nativeElement.style.top = '0';
37
- this.hostElement.nativeElement.style.left = '0';
38
- this.hostElement.nativeElement.style.width = '100%';
39
- this.hostElement.nativeElement.style.height = '100%';
40
- this.hostElement.nativeElement.style.zIndex = '1';
41
- this.hostElement.nativeElement.style.cursor = 'grab';
42
- this.hostElement.nativeElement.style.userSelect = 'none';
43
- this.hostElement.nativeElement.style.touchAction = 'none';
44
- this.hostElement.nativeElement.onpointerdown = (e) => {
45
- this.hostElement.nativeElement.style.transition = 'none';
46
- this.hostElement.nativeElement.style.cursor = 'grabbing';
47
- this.isMouseDown.set(true);
48
- this.prevX.set(e.clientX);
49
- };
50
- this.hostElement.nativeElement.onpointermove = (e) => {
51
- if (!this.isMouseDown())
52
- return;
53
- const currentX = e.clientX;
54
- const deltaX = currentX - this.prevX();
55
- this.currentX.update((prev) => prev + deltaX);
56
- this.prevX.set(currentX);
57
- };
58
- this.hostElement.nativeElement.onpointerup = () => {
59
- this.isMouseDown.set(false);
60
- this.dismiss();
61
- };
62
- this.hostElement.nativeElement.onpointerleave = () => {
63
- if (!this.isMouseDown())
64
- return;
65
- this.isMouseDown.set(false);
66
- this.dismiss();
67
- };
68
- }, /* @ts-ignore */
69
- ...(ngDevMode ? [{ debugName: "#effect2" }] : /* istanbul ignore next */ []));
44
+ const subscriptions = [
45
+ this.gesture.panstart.subscribe(() => this.handlePanStart()),
46
+ this.gesture.panmove.subscribe((event) => this.handlePanMove(event)),
47
+ this.gesture.panend.subscribe(() => this.handlePanEnd()),
48
+ ];
49
+ this.destroyRef.onDestroy(() => {
50
+ for (const subscription of subscriptions) {
51
+ subscription.unsubscribe();
52
+ }
53
+ });
70
54
  }
71
55
  #positionChange;
72
56
  #init;
73
- #effect2;
57
+ handlePanStart() {
58
+ this.hostElement.nativeElement.style.transition = 'none';
59
+ this.cursor.set('grabbing');
60
+ this.originX = this.currentX();
61
+ }
62
+ handlePanMove(event) {
63
+ let next = this.originX + event.deltaX;
64
+ if (next > 0 && this.disableSlidingRight())
65
+ next = 0;
66
+ if (next < 0 && this.disableSlidingLeft())
67
+ next = 0;
68
+ this.currentX.set(next);
69
+ }
70
+ handlePanEnd() {
71
+ this.dismiss();
72
+ }
74
73
  dismiss() {
75
- const el = this.hostElement.nativeElement;
76
74
  this.hostElement.nativeElement.style.transition = '.5s transform ease';
77
- el.style.cursor = 'grab';
78
- if (this.stopPoint()) {
79
- el.style.transform = `translate(${this.stopPoint()}, 0)`;
80
- this.currentX.set(this.stopPoint());
81
- this.prevX.set(this.stopPoint());
82
- }
83
- else {
84
- el.style.transform = `translate(0, 0)`;
85
- this.currentX.set(0);
86
- this.prevX.set(0);
87
- }
75
+ this.cursor.set('grab');
76
+ const target = this.stopPoint();
77
+ this.currentX.set(target);
78
+ this.setPosition(target);
88
79
  }
80
+ /**
81
+ * Sets the position of the sliding element.
82
+ *
83
+ * @param pos - The horizontal position in pixels to set the element to
84
+ * @returns void - No return value. The element's transform is updated to the specified position.
85
+ */
89
86
  setPosition(pos) {
90
- const el = this.hostElement.nativeElement;
91
- el.style.transform = `translate(${pos}px, 0)`;
87
+ this.hostElement.nativeElement.style.transform = `translate(${pos}px, 0)`;
92
88
  }
93
89
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXSlidingItemDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
94
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: AXSlidingItemDirective, isStandalone: true, selector: "[axSlidingItem]", ngImport: i0 }); }
90
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: AXSlidingItemDirective, isStandalone: true, selector: "[axSlidingItem]", host: { properties: { "style.position": "\"absolute\"", "style.top": "\"0\"", "style.left": "\"0\"", "style.width": "\"100%\"", "style.height": "\"100%\"", "style.z-index": "\"1\"", "style.cursor": "cursor()", "style.user-select": "\"none\"", "style.touch-action": "\"none\"" } }, hostDirectives: [{ directive: i1.AXGestureDirective }], ngImport: i0 }); }
95
91
  }
96
92
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXSlidingItemDirective, decorators: [{
97
93
  type: Directive,
98
- args: [{ selector: '[axSlidingItem]' }]
99
- }] });
94
+ args: [{
95
+ selector: '[axSlidingItem]',
96
+ hostDirectives: [AXGestureDirective],
97
+ host: {
98
+ '[style.position]': '"absolute"',
99
+ '[style.top]': '"0"',
100
+ '[style.left]': '"0"',
101
+ '[style.width]': '"100%"',
102
+ '[style.height]': '"100%"',
103
+ '[style.z-index]': '"1"',
104
+ '[style.cursor]': 'cursor()',
105
+ '[style.user-select]': '"none"',
106
+ '[style.touch-action]': '"none"',
107
+ },
108
+ }]
109
+ }], ctorParameters: () => [] });
100
110
 
101
111
  /**
102
112
  * Generated bundle index. Do not edit.
@@ -1 +1 @@
1
- {"version":3,"file":"acorex-cdk-sliding-item.mjs","sources":["../../../../packages/cdk/sliding-item/src/lib/sliding-item.directive.ts","../../../../packages/cdk/sliding-item/src/acorex-cdk-sliding-item.ts"],"sourcesContent":["import { afterNextRender, Directive, effect, ElementRef, inject, signal } from '@angular/core';\n\n@Directive({ selector: '[axSlidingItem]' })\nexport class AXSlidingItemDirective {\n private hostElement = inject(ElementRef);\n private isMouseDown = signal(false);\n private prevX = signal(0);\n currentX = signal(0);\n stopPoint = signal(0);\n disableSlidingRight = signal(false);\n disableSlidingLeft = signal(false);\n\n #positionChange = effect(() => {\n if (this.currentX() > 0 && this.disableSlidingRight()) return;\n if (this.currentX() < 0 && this.disableSlidingLeft()) return;\n this.setPosition(this.currentX());\n });\n\n #init = afterNextRender(() => {\n const el = (this.hostElement.nativeElement as HTMLElement).parentElement;\n el.style.display = 'flex';\n el.style.justifyContent = 'space-between';\n el.style.position = 'relative';\n el.style.overflow = 'hidden';\n });\n\n #effect2 = effect(() => {\n this.hostElement.nativeElement.style.position = 'absolute';\n this.hostElement.nativeElement.style.top = '0';\n this.hostElement.nativeElement.style.left = '0';\n this.hostElement.nativeElement.style.width = '100%';\n this.hostElement.nativeElement.style.height = '100%';\n this.hostElement.nativeElement.style.zIndex = '1';\n this.hostElement.nativeElement.style.cursor = 'grab';\n this.hostElement.nativeElement.style.userSelect = 'none';\n this.hostElement.nativeElement.style.touchAction = 'none';\n\n this.hostElement.nativeElement.onpointerdown = (e: PointerEvent) => {\n this.hostElement.nativeElement.style.transition = 'none';\n this.hostElement.nativeElement.style.cursor = 'grabbing';\n this.isMouseDown.set(true);\n this.prevX.set(e.clientX);\n };\n\n this.hostElement.nativeElement.onpointermove = (e: PointerEvent) => {\n if (!this.isMouseDown()) return;\n const currentX = e.clientX;\n const deltaX = currentX - this.prevX();\n this.currentX.update((prev) => prev + deltaX);\n this.prevX.set(currentX);\n };\n\n this.hostElement.nativeElement.onpointerup = () => {\n this.isMouseDown.set(false);\n this.dismiss();\n };\n\n this.hostElement.nativeElement.onpointerleave = () => {\n if (!this.isMouseDown()) return;\n this.isMouseDown.set(false);\n this.dismiss();\n };\n });\n\n private dismiss() {\n const el = this.hostElement.nativeElement as HTMLElement;\n this.hostElement.nativeElement.style.transition = '.5s transform ease';\n el.style.cursor = 'grab';\n\n if (this.stopPoint()) {\n el.style.transform = `translate(${this.stopPoint()}, 0)`;\n this.currentX.set(this.stopPoint());\n this.prevX.set(this.stopPoint());\n } else {\n el.style.transform = `translate(0, 0)`;\n this.currentX.set(0);\n this.prevX.set(0);\n }\n }\n\n setPosition(pos: number) {\n const el = this.hostElement.nativeElement as HTMLElement;\n el.style.transform = `translate(${pos}px, 0)`;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"acorex-cdk-sliding-item.mjs","sources":["../../../../packages/cdk/sliding-item/src/lib/sliding-item.directive.ts","../../../../packages/cdk/sliding-item/src/acorex-cdk-sliding-item.ts"],"sourcesContent":["import { AXGestureDirective, AXGestureEvent } from '@acorex/cdk/gesture';\nimport { afterNextRender, DestroyRef, Directive, effect, ElementRef, inject, signal } from '@angular/core';\n\n/**\n * Enables horizontal sliding on the host via the hosted AXGestureDirective pan events.\n *\n * Do not put `axGesture` on the same element; this directive already hosts it.\n */\n@Directive({\n selector: '[axSlidingItem]',\n hostDirectives: [AXGestureDirective],\n host: {\n '[style.position]': '\"absolute\"',\n '[style.top]': '\"0\"',\n '[style.left]': '\"0\"',\n '[style.width]': '\"100%\"',\n '[style.height]': '\"100%\"',\n '[style.z-index]': '\"1\"',\n '[style.cursor]': 'cursor()',\n '[style.user-select]': '\"none\"',\n '[style.touch-action]': '\"none\"',\n },\n})\nexport class AXSlidingItemDirective {\n private readonly hostElement = inject(ElementRef<HTMLElement>);\n private readonly gesture = inject(AXGestureDirective);\n private readonly destroyRef = inject(DestroyRef);\n\n currentX = signal(0);\n stopPoint = signal(0);\n disableSlidingRight = signal(false);\n disableSlidingLeft = signal(false);\n\n protected readonly cursor = signal('grab');\n private originX = 0;\n\n constructor() {\n const subscriptions = [\n this.gesture.panstart.subscribe(() => this.handlePanStart()),\n this.gesture.panmove.subscribe((event) => this.handlePanMove(event)),\n this.gesture.panend.subscribe(() => this.handlePanEnd()),\n ];\n this.destroyRef.onDestroy(() => {\n for (const subscription of subscriptions) {\n subscription.unsubscribe();\n }\n });\n }\n\n #positionChange = effect(() => {\n if (this.currentX() > 0 && this.disableSlidingRight()) return;\n if (this.currentX() < 0 && this.disableSlidingLeft()) return;\n this.setPosition(this.currentX());\n });\n\n #init = afterNextRender(() => {\n const el = this.hostElement.nativeElement.parentElement;\n if (!el) return;\n el.style.display = 'flex';\n el.style.justifyContent = 'space-between';\n el.style.position = 'relative';\n el.style.overflow = 'hidden';\n });\n\n private handlePanStart(): void {\n this.hostElement.nativeElement.style.transition = 'none';\n this.cursor.set('grabbing');\n this.originX = this.currentX();\n }\n\n private handlePanMove(event: AXGestureEvent): void {\n let next = this.originX + event.deltaX;\n if (next > 0 && this.disableSlidingRight()) next = 0;\n if (next < 0 && this.disableSlidingLeft()) next = 0;\n this.currentX.set(next);\n }\n\n private handlePanEnd(): void {\n this.dismiss();\n }\n\n private dismiss(): void {\n this.hostElement.nativeElement.style.transition = '.5s transform ease';\n this.cursor.set('grab');\n const target = this.stopPoint();\n this.currentX.set(target);\n this.setPosition(target);\n }\n\n /**\n * Sets the position of the sliding element.\n *\n * @param pos - The horizontal position in pixels to set the element to\n * @returns void - No return value. The element's transform is updated to the specified position.\n */\n setPosition(pos: number): void {\n this.hostElement.nativeElement.style.transform = `translate(${pos}px, 0)`;\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,3 @@
1
+ # @acorex/cdk/gesture
2
+
3
+ Secondary entry point of `@acorex/cdk`. It can be used by importing from `@acorex/cdk/gesture`.
@@ -2,4 +2,4 @@
2
2
 
3
3
  Secondary entry point of `@acorex/cdk`. It can be used by importing from `@acorex/cdk/horizontal-scroll`.
4
4
 
5
- Converts vertical mouse-wheel scrolling and pointer drag/swipe into horizontal scrolling on scrollable host elements. Pointer events cover mouse, touch, and pen.
5
+ Converts vertical mouse-wheel scrolling and horizontal pan into horizontal scrolling on scrollable host elements. Pan is provided by a hosted `AXGestureDirective`. Do not put `axGesture` on the same element.
package/package.json CHANGED
@@ -1,12 +1,13 @@
1
1
  {
2
2
  "name": "@acorex/cdk",
3
- "version": "22.1.0-next.30",
3
+ "version": "22.1.0-next.31",
4
4
  "peerDependencies": {
5
- "@acorex/core": "22.1.0-next.30",
5
+ "@acorex/core": "22.1.0-next.31",
6
6
  "quill": ">=2.0.2",
7
7
  "qrcode": ">=1.5.4",
8
8
  "swiper": ">=11.1.15",
9
- "maska": ">=3.1.1"
9
+ "maska": ">=3.1.1",
10
+ "hammerjs": ">=2.0.8"
10
11
  },
11
12
  "sideEffects": false,
12
13
  "module": "fesm2022/acorex-cdk.mjs",
@@ -59,6 +60,10 @@
59
60
  "types": "./types/acorex-cdk-full-screen.d.ts",
60
61
  "default": "./fesm2022/acorex-cdk-full-screen.mjs"
61
62
  },
63
+ "./gesture": {
64
+ "types": "./types/acorex-cdk-gesture.d.ts",
65
+ "default": "./fesm2022/acorex-cdk-gesture.mjs"
66
+ },
62
67
  "./horizontal-scroll": {
63
68
  "types": "./types/acorex-cdk-horizontal-scroll.d.ts",
64
69
  "default": "./fesm2022/acorex-cdk-horizontal-scroll.mjs"
@@ -1,3 +1,5 @@
1
- # @acorex/cdk/sliding-items
1
+ # @acorex/cdk/sliding-item
2
2
 
3
- Secondary entry point of `@acorex/cdk`. It can be used by importing from `@acorex/cdk/sliding-items`.
3
+ Secondary entry point of `@acorex/cdk`. It can be used by importing from `@acorex/cdk/sliding-item`.
4
+
5
+ Enables horizontal sliding on the host via a hosted `AXGestureDirective`. Do not put `axGesture` on the same element.
@@ -0,0 +1,120 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import { OnDestroy, OutputEmitterRef } from '@angular/core';
3
+
4
+ /**
5
+ * Hammer.js event payload emitted by AXGestureDirective outputs.
6
+ */
7
+ interface AXGestureEvent {
8
+ type: string;
9
+ deltaX: number;
10
+ deltaY: number;
11
+ deltaTime: number;
12
+ distance: number;
13
+ angle: number;
14
+ velocity: number;
15
+ velocityX: number;
16
+ velocityY: number;
17
+ direction: number;
18
+ offsetDirection: number;
19
+ scale: number;
20
+ rotation: number;
21
+ center: {
22
+ x: number;
23
+ y: number;
24
+ };
25
+ srcEvent: Event;
26
+ target: HTMLElement;
27
+ pointerType: string;
28
+ eventType: number;
29
+ isFirst: boolean;
30
+ isFinal: boolean;
31
+ preventDefault: () => void;
32
+ }
33
+ /**
34
+ * Hammer.js constructor options passed through to the manager.
35
+ */
36
+ interface AXGestureOptions {
37
+ touchAction?: string;
38
+ enable?: boolean;
39
+ cssProps?: Record<string, string | number>;
40
+ domEvents?: boolean;
41
+ inputTarget?: EventTarget;
42
+ }
43
+ /**
44
+ * Allowed pan and swipe directions. Maps to Hammer.DIRECTION_* constants.
45
+ */
46
+ type AXGestureDirection = 'all' | 'horizontal' | 'vertical';
47
+ /**
48
+ * Public surface of the Hammer manager exposed via AXGestureDirective.manager.
49
+ */
50
+ interface AXGestureManager {
51
+ get: (name: string) => {
52
+ set: (options: object) => unknown;
53
+ } | null;
54
+ on: (events: string, handler: (ev: AXGestureEvent) => void) => void;
55
+ off: (events: string, handler: (ev: AXGestureEvent) => void) => void;
56
+ destroy: () => void;
57
+ }
58
+
59
+ /**
60
+ * Attaches Hammer.js gesture recognition to the host element.
61
+ *
62
+ * Usage:
63
+ * <div axGesture [direction]="'all'" (tap)="onTap($event)" (pan)="onPan($event)"></div>
64
+ */
65
+ declare class AXGestureDirective implements OnDestroy {
66
+ #private;
67
+ private readonly el;
68
+ private readonly zone;
69
+ private readonly platformId;
70
+ /**
71
+ * Extra Hammer.js options forwarded to the manager constructor.
72
+ */
73
+ options: _angular_core.InputSignal<AXGestureOptions>;
74
+ /**
75
+ * Pan and swipe direction. Defaults to horizontal, matching Hammer.js.
76
+ */
77
+ direction: _angular_core.InputSignal<AXGestureDirection>;
78
+ /**
79
+ * Enables the multi-touch pinch recognizer. Disabled by default.
80
+ */
81
+ enablePinch: _angular_core.InputSignal<boolean>;
82
+ /**
83
+ * Enables the multi-touch rotate recognizer. Disabled by default.
84
+ */
85
+ enableRotate: _angular_core.InputSignal<boolean>;
86
+ /**
87
+ * Stops gesture recognition when true.
88
+ */
89
+ disabled: _angular_core.InputSignal<boolean>;
90
+ tap: OutputEmitterRef<AXGestureEvent>;
91
+ doubletap: OutputEmitterRef<AXGestureEvent>;
92
+ press: OutputEmitterRef<AXGestureEvent>;
93
+ pan: OutputEmitterRef<AXGestureEvent>;
94
+ panstart: OutputEmitterRef<AXGestureEvent>;
95
+ panmove: OutputEmitterRef<AXGestureEvent>;
96
+ panend: OutputEmitterRef<AXGestureEvent>;
97
+ swipe: OutputEmitterRef<AXGestureEvent>;
98
+ pinch: OutputEmitterRef<AXGestureEvent>;
99
+ rotate: OutputEmitterRef<AXGestureEvent>;
100
+ private hammer;
101
+ private hammerLib;
102
+ private setupId;
103
+ private ready;
104
+ private readonly emitters;
105
+ /**
106
+ * The underlying Hammer manager, or null when not initialized.
107
+ */
108
+ get manager(): AXGestureManager | null;
109
+ ngOnDestroy(): void;
110
+ private setup;
111
+ private loadHammer;
112
+ private toHammerDirection;
113
+ private teardown;
114
+ private readonly onHammerEvent;
115
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXGestureDirective, never>;
116
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<AXGestureDirective, "[axGesture]", ["axGesture"], { "options": { "alias": "options"; "required": false; "isSignal": true; }; "direction": { "alias": "direction"; "required": false; "isSignal": true; }; "enablePinch": { "alias": "enablePinch"; "required": false; "isSignal": true; }; "enableRotate": { "alias": "enableRotate"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "tap": "tap"; "doubletap": "doubletap"; "press": "press"; "pan": "pan"; "panstart": "panstart"; "panmove": "panmove"; "panend": "panend"; "swipe": "swipe"; "pinch": "pinch"; "rotate": "rotate"; }, never, never, true, never>;
117
+ }
118
+
119
+ export { AXGestureDirective };
120
+ export type { AXGestureDirection, AXGestureEvent, AXGestureManager, AXGestureOptions };
@@ -1,22 +1,27 @@
1
1
  import * as _angular_core from '@angular/core';
2
2
  import { OnDestroy } from '@angular/core';
3
+ import * as i1 from '@acorex/cdk/gesture';
3
4
 
4
5
  /**
5
- * Converts vertical mouse-wheel scrolling and pointer drag/swipe into horizontal scrolling on the host element.
6
- * Applies only when the host can scroll horizontally. Pointer events cover mouse, touch, and pen.
6
+ * Converts vertical mouse-wheel scrolling and horizontal pan into horizontal scrolling on the host element.
7
+ * Applies only when the host can scroll horizontally. Pan is provided by the hosted AXGestureDirective.
7
8
  *
8
9
  * Usage:
9
10
  * <div axHorizontalScroll [speed]="150" class="overflow-x-auto">
10
11
  * ...
11
12
  * </div>
13
+ *
14
+ * Do not put `axGesture` on the same element; this directive already hosts it.
12
15
  */
13
16
  declare class AXHorizontalScrollDirective implements OnDestroy {
14
17
  #private;
15
- private elementRef;
16
- private platformId;
17
- private zone;
18
+ private readonly elementRef;
19
+ private readonly platformId;
20
+ private readonly zone;
21
+ private readonly gesture;
22
+ private readonly destroyRef;
18
23
  /**
19
- * Disables wheel-to-horizontal conversion and pointer drag when true.
24
+ * Disables wheel-to-horizontal conversion and pan scrolling when true.
20
25
  */
21
26
  disabled: _angular_core.InputSignal<boolean>;
22
27
  /**
@@ -28,29 +33,21 @@ declare class AXHorizontalScrollDirective implements OnDestroy {
28
33
  private targetScrollLeft;
29
34
  private scrollPosition;
30
35
  private lastFrameTime;
31
- private pointerId;
32
- private pointerStartX;
33
- private pointerStartY;
34
- private pointerStartScrollLeft;
35
- private pointerAxis;
36
- private lastPointerX;
37
- private lastPointerTime;
38
- private pointerVelocityX;
36
+ private isPanning;
37
+ private ignorePan;
38
+ private panStartScrollLeft;
39
39
  private suppressClickListener;
40
40
  private suppressClickTimer;
41
- private readonly axisLockThreshold;
42
41
  private readonly interactiveSelector;
43
42
  private readonly wheelListener;
44
- private readonly pointerDownListener;
45
- private readonly pointerMoveListener;
46
- private readonly pointerUpListener;
43
+ constructor();
47
44
  ngOnDestroy(): void;
48
45
  private get nativeElement();
49
46
  private handleWheel;
50
- private handlePointerDown;
51
- private handlePointerMove;
52
- private handlePointerUp;
53
- private releasePointer;
47
+ private handlePanStart;
48
+ private handlePanMove;
49
+ private handlePanEnd;
50
+ private clearPanStyles;
54
51
  private suppressClick;
55
52
  private clearClickSuppression;
56
53
  private syncScrollState;
@@ -60,7 +57,7 @@ declare class AXHorizontalScrollDirective implements OnDestroy {
60
57
  private canScrollHorizontally;
61
58
  private getMaxScrollLeft;
62
59
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXHorizontalScrollDirective, never>;
63
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<AXHorizontalScrollDirective, "[axHorizontalScroll]", never, { "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "speed": { "alias": "speed"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
60
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<AXHorizontalScrollDirective, "[axHorizontalScroll]", never, { "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "speed": { "alias": "speed"; "required": false; "isSignal": true; }; }, {}, never, never, true, [{ directive: typeof i1.AXGestureDirective; inputs: {}; outputs: {}; }]>;
64
61
  }
65
62
 
66
63
  export { AXHorizontalScrollDirective };
@@ -1,18 +1,36 @@
1
1
  import * as _angular_core from '@angular/core';
2
+ import * as i1 from '@acorex/cdk/gesture';
2
3
 
4
+ /**
5
+ * Enables horizontal sliding on the host via the hosted AXGestureDirective pan events.
6
+ *
7
+ * Do not put `axGesture` on the same element; this directive already hosts it.
8
+ */
3
9
  declare class AXSlidingItemDirective {
4
10
  #private;
5
- private hostElement;
6
- private isMouseDown;
7
- private prevX;
11
+ private readonly hostElement;
12
+ private readonly gesture;
13
+ private readonly destroyRef;
8
14
  currentX: _angular_core.WritableSignal<number>;
9
15
  stopPoint: _angular_core.WritableSignal<number>;
10
16
  disableSlidingRight: _angular_core.WritableSignal<boolean>;
11
17
  disableSlidingLeft: _angular_core.WritableSignal<boolean>;
18
+ protected readonly cursor: _angular_core.WritableSignal<string>;
19
+ private originX;
20
+ constructor();
21
+ private handlePanStart;
22
+ private handlePanMove;
23
+ private handlePanEnd;
12
24
  private dismiss;
25
+ /**
26
+ * Sets the position of the sliding element.
27
+ *
28
+ * @param pos - The horizontal position in pixels to set the element to
29
+ * @returns void - No return value. The element's transform is updated to the specified position.
30
+ */
13
31
  setPosition(pos: number): void;
14
32
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXSlidingItemDirective, never>;
15
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<AXSlidingItemDirective, "[axSlidingItem]", never, {}, {}, never, never, true, never>;
33
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<AXSlidingItemDirective, "[axSlidingItem]", never, {}, {}, never, never, true, [{ directive: typeof i1.AXGestureDirective; inputs: {}; outputs: {}; }]>;
16
34
  }
17
35
 
18
36
  export { AXSlidingItemDirective };