@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.
- package/fesm2022/acorex-cdk-gesture.mjs +173 -0
- package/fesm2022/acorex-cdk-gesture.mjs.map +1 -0
- package/fesm2022/acorex-cdk-horizontal-scroll.mjs +58 -93
- package/fesm2022/acorex-cdk-horizontal-scroll.mjs.map +1 -1
- package/fesm2022/acorex-cdk-sliding-item.mjs +70 -60
- package/fesm2022/acorex-cdk-sliding-item.mjs.map +1 -1
- package/gesture/README.md +3 -0
- package/horizontal-scroll/README.md +1 -1
- package/package.json +8 -3
- package/sliding-item/README.md +4 -2
- package/types/acorex-cdk-gesture.d.ts +120 -0
- package/types/acorex-cdk-horizontal-scroll.d.ts +20 -23
- package/types/acorex-cdk-sliding-item.d.ts +22 -4
|
@@ -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
|
|
7
|
-
* Applies only when the host can scroll horizontally.
|
|
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
|
|
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.
|
|
35
|
-
this.
|
|
36
|
-
this.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
105
|
-
if (this.disabled() || !
|
|
101
|
+
handlePanStart(event) {
|
|
102
|
+
if (this.disabled() || !this.canScrollHorizontally()) {
|
|
103
|
+
this.ignorePan = true;
|
|
106
104
|
return;
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
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.
|
|
115
|
-
this.
|
|
116
|
-
|
|
117
|
-
|
|
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
|
-
|
|
120
|
+
}
|
|
121
|
+
handlePanMove(event) {
|
|
122
|
+
if (this.ignorePan || this.disabled() || !this.isPanning)
|
|
143
123
|
return;
|
|
144
124
|
event.preventDefault();
|
|
145
|
-
const
|
|
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
|
-
|
|
156
|
-
if (this.
|
|
128
|
+
handlePanEnd(event) {
|
|
129
|
+
if (this.ignorePan) {
|
|
130
|
+
this.ignorePan = false;
|
|
131
|
+
this.isPanning = false;
|
|
157
132
|
return;
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
this.
|
|
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
|
|
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
|
-
|
|
174
|
-
|
|
175
|
-
|
|
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":"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"}
|
|
@@ -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.
|
|
8
|
-
|
|
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
|
-
|
|
35
|
-
this.
|
|
36
|
-
this.
|
|
37
|
-
this.
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
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
|
-
|
|
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
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
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
|
-
|
|
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: [{
|
|
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({
|
|
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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"}
|
|
@@ -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
|
|
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.
|
|
3
|
+
"version": "22.1.0-next.31",
|
|
4
4
|
"peerDependencies": {
|
|
5
|
-
"@acorex/core": "22.1.0-next.
|
|
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"
|
package/sliding-item/README.md
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
-
# @acorex/cdk/sliding-
|
|
1
|
+
# @acorex/cdk/sliding-item
|
|
2
2
|
|
|
3
|
-
Secondary entry point of `@acorex/cdk`. It can be used by importing from `@acorex/cdk/sliding-
|
|
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
|
|
6
|
-
* Applies only when the host can scroll horizontally.
|
|
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
|
|
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
|
|
32
|
-
private
|
|
33
|
-
private
|
|
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
|
-
|
|
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
|
|
51
|
-
private
|
|
52
|
-
private
|
|
53
|
-
private
|
|
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,
|
|
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
|
|
7
|
-
private
|
|
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,
|
|
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 };
|