@acorex/cdk 21.0.2-next.9 → 21.0.3-next.3
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-accordion.mjs +35 -35
- package/fesm2022/acorex-cdk-accordion.mjs.map +1 -1
- package/fesm2022/acorex-cdk-carousel.mjs +4 -4
- package/fesm2022/acorex-cdk-carousel.mjs.map +1 -1
- package/fesm2022/acorex-cdk-clipboard.mjs +7 -7
- package/fesm2022/acorex-cdk-clipboard.mjs.map +1 -1
- package/fesm2022/acorex-cdk-common.mjs +102 -103
- package/fesm2022/acorex-cdk-common.mjs.map +1 -1
- package/fesm2022/acorex-cdk-dom.mjs +3 -3
- package/fesm2022/acorex-cdk-double-click.mjs +5 -5
- package/fesm2022/acorex-cdk-double-click.mjs.map +1 -1
- package/fesm2022/acorex-cdk-drag-drop.mjs +68 -68
- package/fesm2022/acorex-cdk-drag-drop.mjs.map +1 -1
- package/fesm2022/acorex-cdk-drawer.mjs +35 -35
- package/fesm2022/acorex-cdk-drawer.mjs.map +1 -1
- package/fesm2022/acorex-cdk-focus-trap.mjs +19 -19
- package/fesm2022/acorex-cdk-focus-trap.mjs.map +1 -1
- package/fesm2022/acorex-cdk-full-screen.mjs +4 -4
- package/fesm2022/acorex-cdk-full-screen.mjs.map +1 -1
- package/fesm2022/acorex-cdk-horizontal-scroll.mjs +136 -0
- package/fesm2022/acorex-cdk-horizontal-scroll.mjs.map +1 -0
- package/fesm2022/acorex-cdk-input-mask.mjs +19 -13
- package/fesm2022/acorex-cdk-input-mask.mjs.map +1 -1
- package/fesm2022/acorex-cdk-list-navigation.mjs +17 -17
- package/fesm2022/acorex-cdk-list-navigation.mjs.map +1 -1
- package/fesm2022/acorex-cdk-outline.mjs +77 -66
- package/fesm2022/acorex-cdk-outline.mjs.map +1 -1
- package/fesm2022/acorex-cdk-overlay.mjs +17 -4
- package/fesm2022/acorex-cdk-overlay.mjs.map +1 -1
- package/fesm2022/acorex-cdk-pan-view.mjs +67 -49
- package/fesm2022/acorex-cdk-pan-view.mjs.map +1 -1
- package/fesm2022/acorex-cdk-resizable.mjs +46 -22
- package/fesm2022/acorex-cdk-resizable.mjs.map +1 -1
- package/fesm2022/acorex-cdk-selection.mjs +21 -21
- package/fesm2022/acorex-cdk-selection.mjs.map +1 -1
- package/fesm2022/acorex-cdk-sliding-item.mjs +11 -11
- package/fesm2022/acorex-cdk-sliding-item.mjs.map +1 -1
- package/fesm2022/acorex-cdk-sticky.mjs +3 -3
- package/fesm2022/acorex-cdk-uploader.mjs +298 -188
- package/fesm2022/acorex-cdk-uploader.mjs.map +1 -1
- package/fesm2022/acorex-cdk-virtual-scroll.mjs +17 -17
- package/fesm2022/acorex-cdk-virtual-scroll.mjs.map +1 -1
- package/fesm2022/acorex-cdk-wysiwyg.mjs +1 -1
- package/fesm2022/acorex-cdk-wysiwyg.mjs.map +1 -1
- package/fesm2022/acorex-cdk-z-index.mjs +4 -4
- package/fesm2022/acorex-cdk-z-index.mjs.map +1 -1
- package/horizontal-scroll/README.md +5 -0
- package/package.json +7 -2
- package/types/acorex-cdk-common.d.ts +1 -1
- package/types/acorex-cdk-drawer.d.ts +2 -0
- package/types/acorex-cdk-focus-trap.d.ts +2 -3
- package/types/acorex-cdk-horizontal-scroll.d.ts +44 -0
- package/types/acorex-cdk-input-mask.d.ts +1 -0
- package/types/acorex-cdk-outline.d.ts +1 -0
- package/types/acorex-cdk-overlay.d.ts +6 -0
- package/types/acorex-cdk-pan-view.d.ts +4 -0
- package/types/acorex-cdk-resizable.d.ts +2 -0
- package/types/acorex-cdk-uploader.d.ts +120 -110
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { isPlatformBrowser } from '@angular/common';
|
|
2
|
+
import * as i0 from '@angular/core';
|
|
3
|
+
import { inject, ElementRef, PLATFORM_ID, NgZone, input, afterNextRender, Directive } from '@angular/core';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Converts vertical mouse-wheel scrolling into horizontal scrolling on the host element.
|
|
7
|
+
* Applies only when the host can scroll horizontally.
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* <div axHorizontalScroll [speed]="150" class="overflow-x-auto">
|
|
11
|
+
* ...
|
|
12
|
+
* </div>
|
|
13
|
+
*/
|
|
14
|
+
class AXHorizontalScrollDirective {
|
|
15
|
+
constructor() {
|
|
16
|
+
this.elementRef = inject((ElementRef));
|
|
17
|
+
this.platformId = inject(PLATFORM_ID);
|
|
18
|
+
this.zone = inject(NgZone);
|
|
19
|
+
/**
|
|
20
|
+
* Disables wheel-to-horizontal conversion when true.
|
|
21
|
+
*/
|
|
22
|
+
this.disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
|
|
23
|
+
/**
|
|
24
|
+
* Horizontal scroll animation duration in milliseconds.
|
|
25
|
+
* Lower values scroll faster; `0` applies the scroll instantly.
|
|
26
|
+
*/
|
|
27
|
+
this.speed = input(200, ...(ngDevMode ? [{ debugName: "speed" }] : /* istanbul ignore next */ []));
|
|
28
|
+
this.animationFrameId = null;
|
|
29
|
+
this.targetScrollLeft = null;
|
|
30
|
+
this.scrollPosition = 0;
|
|
31
|
+
this.lastFrameTime = 0;
|
|
32
|
+
this.wheelListener = (event) => this.handleWheel(event);
|
|
33
|
+
this.#init = afterNextRender(() => {
|
|
34
|
+
if (!isPlatformBrowser(this.platformId))
|
|
35
|
+
return;
|
|
36
|
+
this.zone.runOutsideAngular(() => {
|
|
37
|
+
this.nativeElement.addEventListener('wheel', this.wheelListener, { passive: false });
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
#init;
|
|
42
|
+
ngOnDestroy() {
|
|
43
|
+
if (!isPlatformBrowser(this.platformId))
|
|
44
|
+
return;
|
|
45
|
+
this.stopAnimation();
|
|
46
|
+
this.nativeElement.removeEventListener('wheel', this.wheelListener);
|
|
47
|
+
}
|
|
48
|
+
get nativeElement() {
|
|
49
|
+
return this.elementRef.nativeElement;
|
|
50
|
+
}
|
|
51
|
+
handleWheel(event) {
|
|
52
|
+
if (this.disabled() || !this.canScrollHorizontally())
|
|
53
|
+
return;
|
|
54
|
+
if (event.shiftKey || Math.abs(event.deltaX) > Math.abs(event.deltaY))
|
|
55
|
+
return;
|
|
56
|
+
if (event.deltaY === 0)
|
|
57
|
+
return;
|
|
58
|
+
const element = this.nativeElement;
|
|
59
|
+
const maxScrollLeft = element.scrollWidth - element.clientWidth;
|
|
60
|
+
this.syncScrollState();
|
|
61
|
+
const currentPosition = this.targetScrollLeft ?? this.scrollPosition;
|
|
62
|
+
const atStart = currentPosition <= 0 && event.deltaY < 0;
|
|
63
|
+
const atEnd = currentPosition >= maxScrollLeft && event.deltaY > 0;
|
|
64
|
+
if (atStart || atEnd)
|
|
65
|
+
return;
|
|
66
|
+
event.preventDefault();
|
|
67
|
+
const nextTarget = Math.max(0, Math.min(maxScrollLeft, currentPosition + event.deltaY));
|
|
68
|
+
this.targetScrollLeft = nextTarget;
|
|
69
|
+
if (this.speed() <= 0) {
|
|
70
|
+
this.applyScrollPosition(nextTarget);
|
|
71
|
+
this.targetScrollLeft = null;
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
this.startAnimation();
|
|
75
|
+
}
|
|
76
|
+
syncScrollState() {
|
|
77
|
+
if (this.targetScrollLeft !== null)
|
|
78
|
+
return;
|
|
79
|
+
this.scrollPosition = this.nativeElement.scrollLeft;
|
|
80
|
+
this.targetScrollLeft = this.scrollPosition;
|
|
81
|
+
}
|
|
82
|
+
startAnimation() {
|
|
83
|
+
if (this.animationFrameId !== null)
|
|
84
|
+
return;
|
|
85
|
+
this.lastFrameTime = performance.now();
|
|
86
|
+
const step = (currentTime) => {
|
|
87
|
+
const target = this.targetScrollLeft;
|
|
88
|
+
if (target === null) {
|
|
89
|
+
this.stopAnimation();
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
const deltaTime = Math.max(currentTime - this.lastFrameTime, 1);
|
|
93
|
+
this.lastFrameTime = currentTime;
|
|
94
|
+
const factor = 1 - Math.exp(-deltaTime / this.speed());
|
|
95
|
+
this.scrollPosition += (target - this.scrollPosition) * factor;
|
|
96
|
+
this.applyScrollPosition(this.scrollPosition);
|
|
97
|
+
if (Math.abs(target - this.scrollPosition) < 0.5) {
|
|
98
|
+
this.applyScrollPosition(target);
|
|
99
|
+
this.targetScrollLeft = null;
|
|
100
|
+
this.stopAnimation();
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
this.animationFrameId = requestAnimationFrame(step);
|
|
104
|
+
};
|
|
105
|
+
this.animationFrameId = requestAnimationFrame(step);
|
|
106
|
+
}
|
|
107
|
+
applyScrollPosition(position) {
|
|
108
|
+
this.scrollPosition = position;
|
|
109
|
+
this.nativeElement.scrollLeft = position;
|
|
110
|
+
}
|
|
111
|
+
stopAnimation() {
|
|
112
|
+
if (this.animationFrameId === null)
|
|
113
|
+
return;
|
|
114
|
+
cancelAnimationFrame(this.animationFrameId);
|
|
115
|
+
this.animationFrameId = null;
|
|
116
|
+
}
|
|
117
|
+
canScrollHorizontally() {
|
|
118
|
+
const element = this.nativeElement;
|
|
119
|
+
return element.scrollWidth > element.clientWidth;
|
|
120
|
+
}
|
|
121
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXHorizontalScrollDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
122
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.9", 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 } }, ngImport: i0 }); }
|
|
123
|
+
}
|
|
124
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXHorizontalScrollDirective, decorators: [{
|
|
125
|
+
type: Directive,
|
|
126
|
+
args: [{
|
|
127
|
+
selector: '[axHorizontalScroll]',
|
|
128
|
+
}]
|
|
129
|
+
}], propDecorators: { disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], speed: [{ type: i0.Input, args: [{ isSignal: true, alias: "speed", required: false }] }] } });
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Generated bundle index. Do not edit.
|
|
133
|
+
*/
|
|
134
|
+
|
|
135
|
+
export { AXHorizontalScrollDirective };
|
|
136
|
+
//# sourceMappingURL=acorex-cdk-horizontal-scroll.mjs.map
|
|
@@ -0,0 +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 into horizontal scrolling on the host element.\n * Applies only when the host can scroll horizontally.\n *\n * Usage:\n * <div axHorizontalScroll [speed]=\"150\" class=\"overflow-x-auto\">\n * ...\n * </div>\n */\n@Directive({\n selector: '[axHorizontalScroll]',\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 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 readonly wheelListener = (event: WheelEvent) => this.handleWheel(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 });\n });\n\n ngOnDestroy(): void {\n if (!isPlatformBrowser(this.platformId)) return;\n\n this.stopAnimation();\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.canScrollHorizontally()) return;\n if (event.shiftKey || Math.abs(event.deltaX) > Math.abs(event.deltaY)) return;\n if (event.deltaY === 0) return;\n\n const element = this.nativeElement;\n const maxScrollLeft = element.scrollWidth - element.clientWidth;\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 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","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { isPlatformBrowser } from '@angular/common';
|
|
1
2
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { inject, ElementRef, input, output, effect, Directive } from '@angular/core';
|
|
3
|
+
import { inject, ElementRef, PLATFORM_ID, input, output, effect, Directive } from '@angular/core';
|
|
3
4
|
|
|
4
5
|
/**
|
|
5
6
|
* Directive that provides input masking functionality for various data types including
|
|
@@ -9,21 +10,22 @@ import { inject, ElementRef, input, output, effect, Directive } from '@angular/c
|
|
|
9
10
|
class AXInputMaskDirective {
|
|
10
11
|
constructor() {
|
|
11
12
|
this.elm = inject(ElementRef);
|
|
13
|
+
this.platformId = inject(PLATFORM_ID);
|
|
12
14
|
/**
|
|
13
15
|
* The mode of input masking to apply.
|
|
14
16
|
* @default 'digits'
|
|
15
17
|
*/
|
|
16
|
-
this.maskMode = input('digits', ...(ngDevMode ? [{ debugName: "maskMode" }] : []));
|
|
18
|
+
this.maskMode = input('digits', ...(ngDevMode ? [{ debugName: "maskMode" }] : /* istanbul ignore next */ []));
|
|
17
19
|
/**
|
|
18
20
|
* The separator character used in the mask (e.g., '/' for dates, ',' for thousands).
|
|
19
21
|
* @default '/'
|
|
20
22
|
*/
|
|
21
|
-
this.separator = input('/', ...(ngDevMode ? [{ debugName: "separator" }] : []));
|
|
23
|
+
this.separator = input('/', ...(ngDevMode ? [{ debugName: "separator" }] : /* istanbul ignore next */ []));
|
|
22
24
|
/**
|
|
23
25
|
* Whether to apply the mask eagerly (as user types) or on blur.
|
|
24
26
|
* @default false
|
|
25
27
|
*/
|
|
26
|
-
this.eager = input(false, ...(ngDevMode ? [{ debugName: "eager" }] : []));
|
|
28
|
+
this.eager = input(false, ...(ngDevMode ? [{ debugName: "eager" }] : /* istanbul ignore next */ []));
|
|
27
29
|
/**
|
|
28
30
|
* Event emitted when the masked value changes.
|
|
29
31
|
*/
|
|
@@ -32,17 +34,17 @@ class AXInputMaskDirective {
|
|
|
32
34
|
* Minimum allowed value for numeric inputs.
|
|
33
35
|
* @default null
|
|
34
36
|
*/
|
|
35
|
-
this.minValue = input(null, ...(ngDevMode ? [{ debugName: "minValue" }] : []));
|
|
37
|
+
this.minValue = input(null, ...(ngDevMode ? [{ debugName: "minValue" }] : /* istanbul ignore next */ []));
|
|
36
38
|
/**
|
|
37
39
|
* Maximum allowed value for numeric inputs.
|
|
38
40
|
* @default null
|
|
39
41
|
*/
|
|
40
|
-
this.maxValue = input(null, ...(ngDevMode ? [{ debugName: "maxValue" }] : []));
|
|
42
|
+
this.maxValue = input(null, ...(ngDevMode ? [{ debugName: "maxValue" }] : /* istanbul ignore next */ []));
|
|
41
43
|
/**
|
|
42
44
|
* Number of decimal places allowed for decimal inputs.
|
|
43
45
|
* @default 0
|
|
44
46
|
*/
|
|
45
|
-
this.decimal = input(0, ...(ngDevMode ? [{ debugName: "decimal" }] : []));
|
|
47
|
+
this.decimal = input(0, ...(ngDevMode ? [{ debugName: "decimal" }] : /* istanbul ignore next */ []));
|
|
46
48
|
/**
|
|
47
49
|
* Custom mask pattern for 'mask' mode.
|
|
48
50
|
* Use the following tokens:
|
|
@@ -56,23 +58,27 @@ class AXInputMaskDirective {
|
|
|
56
58
|
* @example 'AA-####' for license plates
|
|
57
59
|
* @example '##/##/####' for dates
|
|
58
60
|
*/
|
|
59
|
-
this.maskPattern = input(null, ...(ngDevMode ? [{ debugName: "maskPattern" }] : []));
|
|
61
|
+
this.maskPattern = input(null, ...(ngDevMode ? [{ debugName: "maskPattern" }] : /* istanbul ignore next */ []));
|
|
60
62
|
/**
|
|
61
63
|
* Custom token definitions to extend or override default mask tokens.
|
|
62
64
|
* Each token maps to a pattern regex and optional transformation.
|
|
63
65
|
* @example { 'P': { pattern: /[1-9]/, transform: (c) => c.toUpperCase() } }
|
|
64
66
|
*/
|
|
65
|
-
this.customTokens = input({}, ...(ngDevMode ? [{ debugName: "customTokens" }] : []));
|
|
67
|
+
this.customTokens = input({}, ...(ngDevMode ? [{ debugName: "customTokens" }] : /* istanbul ignore next */ []));
|
|
66
68
|
this.#eff = effect(() => {
|
|
69
|
+
if (!isPlatformBrowser(this.platformId))
|
|
70
|
+
return;
|
|
67
71
|
if (this.maskMode() === null)
|
|
68
72
|
return;
|
|
69
73
|
if (this.maskMode() === 'mask' && !this.maskPattern())
|
|
70
74
|
return;
|
|
71
75
|
this.initializeMask();
|
|
72
|
-
}, ...(ngDevMode ? [{ debugName: "#eff" }] : []));
|
|
76
|
+
}, ...(ngDevMode ? [{ debugName: "#eff" }] : /* istanbul ignore next */ []));
|
|
73
77
|
}
|
|
74
78
|
#eff;
|
|
75
79
|
async initializeMask() {
|
|
80
|
+
if (!isPlatformBrowser(this.platformId))
|
|
81
|
+
return;
|
|
76
82
|
if (this.maskaJs)
|
|
77
83
|
this.maskaJs.destroy();
|
|
78
84
|
let mask;
|
|
@@ -269,10 +275,10 @@ class AXInputMaskDirective {
|
|
|
269
275
|
}
|
|
270
276
|
return this.rangeValueLimit(finalValue);
|
|
271
277
|
}
|
|
272
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
273
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.
|
|
278
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXInputMaskDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
279
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.9", type: AXInputMaskDirective, isStandalone: true, selector: "[axInputMask]", inputs: { maskMode: { classPropertyName: "maskMode", publicName: "maskMode", isSignal: true, isRequired: false, transformFunction: null }, separator: { classPropertyName: "separator", publicName: "separator", isSignal: true, isRequired: false, transformFunction: null }, eager: { classPropertyName: "eager", publicName: "eager", isSignal: true, isRequired: false, transformFunction: null }, minValue: { classPropertyName: "minValue", publicName: "minValue", isSignal: true, isRequired: false, transformFunction: null }, maxValue: { classPropertyName: "maxValue", publicName: "maxValue", isSignal: true, isRequired: false, transformFunction: null }, decimal: { classPropertyName: "decimal", publicName: "decimal", isSignal: true, isRequired: false, transformFunction: null }, maskPattern: { classPropertyName: "maskPattern", publicName: "maskPattern", isSignal: true, isRequired: false, transformFunction: null }, customTokens: { classPropertyName: "customTokens", publicName: "customTokens", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onMaskChanged: "onMaskChanged" }, exportAs: ["axInputMask"], ngImport: i0 }); }
|
|
274
280
|
}
|
|
275
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
281
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXInputMaskDirective, decorators: [{
|
|
276
282
|
type: Directive,
|
|
277
283
|
args: [{
|
|
278
284
|
selector: '[axInputMask]',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acorex-cdk-input-mask.mjs","sources":["../../../../packages/cdk/input-mask/src/lib/input-mask.directive.ts","../../../../packages/cdk/input-mask/src/acorex-cdk-input-mask.ts"],"sourcesContent":["import { Directive, effect, ElementRef, inject, input, output } from '@angular/core';\nimport type { MaskInput } from 'maska';\n\n/**\n * Event payload for input mask value changes.\n */\nexport type AXInputMaskEvent = {\n masked: string;\n unmasked: string;\n completed: boolean;\n};\n\n/**\n * Available input mask modes for different data types.\n */\nexport type AXInputMaskModes = 'hijriDate' | 'digits' | 'thousandsSeparator' | 'decimal' | 'mask';\n\n/**\n * Token definitions for custom mask patterns.\n * - `#`: Digit (0-9)\n * - `^`: Letter (a-z, A-Z)\n * - `@`: Alphanumeric (0-9, a-z, A-Z)\n */\nexport type AXMaskTokens = {\n [key: string]: {\n pattern: RegExp;\n optional?: boolean;\n transform?: (char: string) => string;\n repeated?: boolean;\n multiple?: boolean;\n };\n};\n\n/**\n * Directive that provides input masking functionality for various data types including\n * Hijri dates, digits, decimal numbers, and thousands-separated numbers.\n * Built on top of the Maska.js library for robust input validation and formatting.\n */\n@Directive({\n selector: '[axInputMask]',\n exportAs: 'axInputMask',\n})\nexport class AXInputMaskDirective {\n private elm = inject(ElementRef);\n private maskaJs: MaskInput;\n\n /**\n * The mode of input masking to apply.\n * @default 'digits'\n */\n maskMode = input<AXInputMaskModes>('digits');\n\n /**\n * The separator character used in the mask (e.g., '/' for dates, ',' for thousands).\n * @default '/'\n */\n separator = input<string>('/');\n\n /**\n * Whether to apply the mask eagerly (as user types) or on blur.\n * @default false\n */\n eager = input(false);\n\n /**\n * Event emitted when the masked value changes.\n */\n onMaskChanged = output<AXInputMaskEvent>();\n\n /**\n * Minimum allowed value for numeric inputs.\n * @default null\n */\n minValue = input<number>(null);\n\n /**\n * Maximum allowed value for numeric inputs.\n * @default null\n */\n maxValue = input<number>(null);\n\n /**\n * Number of decimal places allowed for decimal inputs.\n * @default 0\n */\n decimal = input(0);\n\n /**\n * Custom mask pattern for 'mask' mode.\n * Use the following tokens:\n * - `#`: Required digit (0-9)\n * - `^`: Required letter (a-z, A-Z)\n * - `@`: Required alphanumeric (0-9, a-z, A-Z)\n *\n * Use ! before token to escape symbol. For example !# will render # instead of a digit.\n * Any other character is treated as a literal separator.\n * @example '(###) ###-####' for phone numbers\n * @example 'AA-####' for license plates\n * @example '##/##/####' for dates\n */\n maskPattern = input<string>(null);\n\n /**\n * Custom token definitions to extend or override default mask tokens.\n * Each token maps to a pattern regex and optional transformation.\n * @example { 'P': { pattern: /[1-9]/, transform: (c) => c.toUpperCase() } }\n */\n customTokens = input<AXMaskTokens>({});\n\n #eff = effect(() => {\n if (this.maskMode() === null) return;\n if (this.maskMode() === 'mask' && !this.maskPattern()) return;\n this.initializeMask();\n });\n\n private async initializeMask() {\n if (this.maskaJs) this.maskaJs.destroy();\n\n let mask: string[];\n let tokens: Record<\n string,\n { pattern: RegExp; optional?: boolean; repeated?: boolean; transform?: (char: string) => string }\n >;\n\n // Default tokens for built-in modes\n const defaultTokens: AXMaskTokens = {\n D: { pattern: /-/, optional: true },\n F: { pattern: /[0-9\\u06F0-\\u06F9\\u0660-\\u0669]/, repeated: true },\n X: { pattern: /[0-9\\u06F0-\\u06F9\\u0660-\\u0669.]/, repeated: true },\n U: { pattern: /[-0-9\\u06F0-\\u06F9\\u0660-\\u0669.]/, repeated: true },\n };\n\n // Tokens for custom mask mode\n const maskModeTokens: AXMaskTokens = {\n '#': { pattern: /[0-9]/ },\n '^': { pattern: /[a-zA-Z]/ },\n '@': { pattern: /[a-zA-Z0-9]/ },\n ...this.customTokens(),\n };\n\n switch (this.maskMode()) {\n case 'hijriDate':\n mask = [`1###${this.separator()}##${this.separator()}##`];\n tokens = defaultTokens;\n break;\n case 'digits':\n mask = ['DF'];\n tokens = defaultTokens;\n break;\n case 'decimal':\n mask = [`DX`];\n tokens = defaultTokens;\n break;\n case 'thousandsSeparator':\n mask = [`U`];\n tokens = defaultTokens;\n break;\n case 'mask':\n mask = [this.maskPattern()];\n tokens = maskModeTokens;\n break;\n }\n\n const { MaskInput } = await import('maska');\n\n this.maskaJs = new MaskInput(this.elm.nativeElement, {\n mask,\n reversed: this.maskMode() === 'thousandsSeparator' ? true : false,\n tokens,\n postProcess: (value) => {\n switch (this.maskMode()) {\n case 'hijriDate':\n return this.hijriMaskHandler(value);\n case 'digits':\n return this.rangeValueLimit(value);\n case 'decimal':\n return this.decimalMaskHandler(value);\n case 'thousandsSeparator':\n return this.thousandsSeparatorHandler(value);\n case 'mask':\n return value;\n default:\n return value;\n }\n },\n preProcess: (value) => {\n const normalized = this.convertToEnglishDigits(value);\n switch (this.maskMode()) {\n case 'hijriDate':\n return this.hijriMaskHandler(value);\n case 'digits':\n return this.rangeValueLimit(normalized);\n case 'decimal':\n return this.decimalMaskHandler(normalized);\n case 'thousandsSeparator':\n return this.thousandsSeparatorHandler(normalized);\n case 'mask':\n return value;\n default:\n return value;\n }\n },\n onMaska: (details) => {\n this.onMaskChanged.emit(details);\n },\n eager: this.eager(),\n });\n }\n\n private thousandsSeparatorHandler(value: string) {\n let thousandsSeparator = this.separator();\n\n switch (this.separator()) {\n case '-':\n thousandsSeparator = '_';\n break;\n case '.':\n thousandsSeparator = ',';\n break;\n }\n\n let clearValue: string;\n\n const firstChar = value.charAt(0);\n const restOfString = value.slice(1);\n\n if (firstChar === '-') {\n clearValue = '-' + restOfString.replace(/-/g, '');\n } else {\n clearValue = value.replace(/-/g, '');\n }\n\n // Ensure only one decimal point\n const decimalParts = clearValue.split('.');\n if (decimalParts.length > 2) {\n clearValue = decimalParts[0] + '.' + decimalParts.slice(1).join('');\n }\n\n // Apply range limits to the cleaned value\n clearValue = this.rangeValueLimit(clearValue);\n\n const addSeparator = clearValue.replace(/\\B(?=(\\d{3})+(?!\\d))/g, thousandsSeparator);\n\n return addSeparator;\n }\n\n private hijriMaskHandler(value: string) {\n const [yearStr, monthStr, dayStr] = value.split(this.separator());\n\n const year = +yearStr;\n const month = +monthStr;\n const day = +dayStr;\n\n //Month Logics\n if (!month || !year) return value;\n if (month > 12) {\n return `${yearStr}${this.separator()}12`;\n }\n if (month < 1) {\n return `${yearStr}${this.separator()}01`;\n }\n\n //Day Logics\n if (!day) return value;\n\n if (day < 1) {\n return `${yearStr}-${monthStr}${this.separator()}01`;\n }\n\n let maxDay = 30;\n if (month <= 6) {\n maxDay = 31;\n } else if (month === 12) {\n // Hijri leap year rule: (11 * year + 14) % 30 < 11\n const isKabise = (11 * year + 14) % 30 < 11;\n maxDay = isKabise ? 30 : 29;\n }\n\n if (day > maxDay) {\n return `${yearStr}${this.separator()}${monthStr}${this.separator()}${maxDay}`;\n }\n\n return value;\n }\n\n private rangeValueLimit(value: string) {\n let convertedValue: number;\n\n if (this.separator()) {\n convertedValue = +value.split(this.separator()).join('');\n } else {\n convertedValue = +value;\n }\n\n if (this.minValue() && convertedValue < this.minValue()) {\n return this.minValue().toString();\n }\n\n if (this.maxValue() && convertedValue > this.maxValue()) {\n return this.maxValue().toString();\n }\n\n return value;\n }\n\n private convertToEnglishDigits(value: string): string {\n return value\n .replace(/[۰-۹]/g, (c) => String(c.charCodeAt(0) - 0x06f0))\n .replace(/[٠-٩]/g, (c) => String(c.charCodeAt(0) - 0x0660));\n }\n\n private decimalMaskHandler(value: string) {\n // Remove any non-digit and non-decimal characters except the first decimal point\n let cleanValue = value;\n let finalValue: string;\n\n // Ensure only one decimal point\n const decimalParts = cleanValue.split('.');\n if (decimalParts.length > 2) {\n cleanValue = decimalParts[0] + '.' + decimalParts.slice(1).join('');\n }\n\n // Split into integer and decimal parts\n const parts = cleanValue.split('.');\n const integerPart = parts[0] || '';\n const decimalPart = parts[1] || '';\n\n // Limit decimal part to the specified number of digits\n const limitedDecimalPart = decimalPart.slice(0, this.decimal());\n\n // Reconstruct the value\n if (limitedDecimalPart.length > 0) {\n finalValue = integerPart + '.' + limitedDecimalPart;\n } else if (cleanValue.includes('.')) {\n // If there's a decimal point but no decimal part, keep the decimal point\n finalValue = integerPart + '.';\n } else {\n finalValue = integerPart;\n }\n\n return this.rangeValueLimit(finalValue);\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-input-mask.mjs","sources":["../../../../packages/cdk/input-mask/src/lib/input-mask.directive.ts","../../../../packages/cdk/input-mask/src/acorex-cdk-input-mask.ts"],"sourcesContent":["import { isPlatformBrowser } from '@angular/common';\nimport { Directive, effect, ElementRef, inject, input, output, PLATFORM_ID } from '@angular/core';\nimport type { MaskInput } from 'maska';\n\n/**\n * Event payload for input mask value changes.\n */\nexport type AXInputMaskEvent = {\n masked: string;\n unmasked: string;\n completed: boolean;\n};\n\n/**\n * Available input mask modes for different data types.\n */\nexport type AXInputMaskModes = 'hijriDate' | 'digits' | 'thousandsSeparator' | 'decimal' | 'mask';\n\n/**\n * Token definitions for custom mask patterns.\n * - `#`: Digit (0-9)\n * - `^`: Letter (a-z, A-Z)\n * - `@`: Alphanumeric (0-9, a-z, A-Z)\n */\nexport type AXMaskTokens = {\n [key: string]: {\n pattern: RegExp;\n optional?: boolean;\n transform?: (char: string) => string;\n repeated?: boolean;\n multiple?: boolean;\n };\n};\n\n/**\n * Directive that provides input masking functionality for various data types including\n * Hijri dates, digits, decimal numbers, and thousands-separated numbers.\n * Built on top of the Maska.js library for robust input validation and formatting.\n */\n@Directive({\n selector: '[axInputMask]',\n exportAs: 'axInputMask',\n})\nexport class AXInputMaskDirective {\n private elm = inject(ElementRef);\n private platformId = inject(PLATFORM_ID);\n private maskaJs: MaskInput;\n\n /**\n * The mode of input masking to apply.\n * @default 'digits'\n */\n maskMode = input<AXInputMaskModes>('digits');\n\n /**\n * The separator character used in the mask (e.g., '/' for dates, ',' for thousands).\n * @default '/'\n */\n separator = input<string>('/');\n\n /**\n * Whether to apply the mask eagerly (as user types) or on blur.\n * @default false\n */\n eager = input(false);\n\n /**\n * Event emitted when the masked value changes.\n */\n onMaskChanged = output<AXInputMaskEvent>();\n\n /**\n * Minimum allowed value for numeric inputs.\n * @default null\n */\n minValue = input<number>(null);\n\n /**\n * Maximum allowed value for numeric inputs.\n * @default null\n */\n maxValue = input<number>(null);\n\n /**\n * Number of decimal places allowed for decimal inputs.\n * @default 0\n */\n decimal = input(0);\n\n /**\n * Custom mask pattern for 'mask' mode.\n * Use the following tokens:\n * - `#`: Required digit (0-9)\n * - `^`: Required letter (a-z, A-Z)\n * - `@`: Required alphanumeric (0-9, a-z, A-Z)\n *\n * Use ! before token to escape symbol. For example !# will render # instead of a digit.\n * Any other character is treated as a literal separator.\n * @example '(###) ###-####' for phone numbers\n * @example 'AA-####' for license plates\n * @example '##/##/####' for dates\n */\n maskPattern = input<string>(null);\n\n /**\n * Custom token definitions to extend or override default mask tokens.\n * Each token maps to a pattern regex and optional transformation.\n * @example { 'P': { pattern: /[1-9]/, transform: (c) => c.toUpperCase() } }\n */\n customTokens = input<AXMaskTokens>({});\n\n #eff = effect(() => {\n if (!isPlatformBrowser(this.platformId)) return;\n if (this.maskMode() === null) return;\n if (this.maskMode() === 'mask' && !this.maskPattern()) return;\n this.initializeMask();\n });\n\n private async initializeMask() {\n if (!isPlatformBrowser(this.platformId)) return;\n\n if (this.maskaJs) this.maskaJs.destroy();\n\n let mask: string[];\n let tokens: Record<\n string,\n { pattern: RegExp; optional?: boolean; repeated?: boolean; transform?: (char: string) => string }\n >;\n\n // Default tokens for built-in modes\n const defaultTokens: AXMaskTokens = {\n D: { pattern: /-/, optional: true },\n F: { pattern: /[0-9\\u06F0-\\u06F9\\u0660-\\u0669]/, repeated: true },\n X: { pattern: /[0-9\\u06F0-\\u06F9\\u0660-\\u0669.]/, repeated: true },\n U: { pattern: /[-0-9\\u06F0-\\u06F9\\u0660-\\u0669.]/, repeated: true },\n };\n\n // Tokens for custom mask mode\n const maskModeTokens: AXMaskTokens = {\n '#': { pattern: /[0-9]/ },\n '^': { pattern: /[a-zA-Z]/ },\n '@': { pattern: /[a-zA-Z0-9]/ },\n ...this.customTokens(),\n };\n\n switch (this.maskMode()) {\n case 'hijriDate':\n mask = [`1###${this.separator()}##${this.separator()}##`];\n tokens = defaultTokens;\n break;\n case 'digits':\n mask = ['DF'];\n tokens = defaultTokens;\n break;\n case 'decimal':\n mask = [`DX`];\n tokens = defaultTokens;\n break;\n case 'thousandsSeparator':\n mask = [`U`];\n tokens = defaultTokens;\n break;\n case 'mask':\n mask = [this.maskPattern()];\n tokens = maskModeTokens;\n break;\n }\n\n const { MaskInput } = await import('maska');\n\n this.maskaJs = new MaskInput(this.elm.nativeElement, {\n mask,\n reversed: this.maskMode() === 'thousandsSeparator' ? true : false,\n tokens,\n postProcess: (value) => {\n switch (this.maskMode()) {\n case 'hijriDate':\n return this.hijriMaskHandler(value);\n case 'digits':\n return this.rangeValueLimit(value);\n case 'decimal':\n return this.decimalMaskHandler(value);\n case 'thousandsSeparator':\n return this.thousandsSeparatorHandler(value);\n case 'mask':\n return value;\n default:\n return value;\n }\n },\n preProcess: (value) => {\n const normalized = this.convertToEnglishDigits(value);\n switch (this.maskMode()) {\n case 'hijriDate':\n return this.hijriMaskHandler(value);\n case 'digits':\n return this.rangeValueLimit(normalized);\n case 'decimal':\n return this.decimalMaskHandler(normalized);\n case 'thousandsSeparator':\n return this.thousandsSeparatorHandler(normalized);\n case 'mask':\n return value;\n default:\n return value;\n }\n },\n onMaska: (details) => {\n this.onMaskChanged.emit(details);\n },\n eager: this.eager(),\n });\n }\n\n private thousandsSeparatorHandler(value: string) {\n let thousandsSeparator = this.separator();\n\n switch (this.separator()) {\n case '-':\n thousandsSeparator = '_';\n break;\n case '.':\n thousandsSeparator = ',';\n break;\n }\n\n let clearValue: string;\n\n const firstChar = value.charAt(0);\n const restOfString = value.slice(1);\n\n if (firstChar === '-') {\n clearValue = '-' + restOfString.replace(/-/g, '');\n } else {\n clearValue = value.replace(/-/g, '');\n }\n\n // Ensure only one decimal point\n const decimalParts = clearValue.split('.');\n if (decimalParts.length > 2) {\n clearValue = decimalParts[0] + '.' + decimalParts.slice(1).join('');\n }\n\n // Apply range limits to the cleaned value\n clearValue = this.rangeValueLimit(clearValue);\n\n const addSeparator = clearValue.replace(/\\B(?=(\\d{3})+(?!\\d))/g, thousandsSeparator);\n\n return addSeparator;\n }\n\n private hijriMaskHandler(value: string) {\n const [yearStr, monthStr, dayStr] = value.split(this.separator());\n\n const year = +yearStr;\n const month = +monthStr;\n const day = +dayStr;\n\n //Month Logics\n if (!month || !year) return value;\n if (month > 12) {\n return `${yearStr}${this.separator()}12`;\n }\n if (month < 1) {\n return `${yearStr}${this.separator()}01`;\n }\n\n //Day Logics\n if (!day) return value;\n\n if (day < 1) {\n return `${yearStr}-${monthStr}${this.separator()}01`;\n }\n\n let maxDay = 30;\n if (month <= 6) {\n maxDay = 31;\n } else if (month === 12) {\n // Hijri leap year rule: (11 * year + 14) % 30 < 11\n const isKabise = (11 * year + 14) % 30 < 11;\n maxDay = isKabise ? 30 : 29;\n }\n\n if (day > maxDay) {\n return `${yearStr}${this.separator()}${monthStr}${this.separator()}${maxDay}`;\n }\n\n return value;\n }\n\n private rangeValueLimit(value: string) {\n let convertedValue: number;\n\n if (this.separator()) {\n convertedValue = +value.split(this.separator()).join('');\n } else {\n convertedValue = +value;\n }\n\n if (this.minValue() && convertedValue < this.minValue()) {\n return this.minValue().toString();\n }\n\n if (this.maxValue() && convertedValue > this.maxValue()) {\n return this.maxValue().toString();\n }\n\n return value;\n }\n\n private convertToEnglishDigits(value: string): string {\n return value\n .replace(/[۰-۹]/g, (c) => String(c.charCodeAt(0) - 0x06f0))\n .replace(/[٠-٩]/g, (c) => String(c.charCodeAt(0) - 0x0660));\n }\n\n private decimalMaskHandler(value: string) {\n // Remove any non-digit and non-decimal characters except the first decimal point\n let cleanValue = value;\n let finalValue: string;\n\n // Ensure only one decimal point\n const decimalParts = cleanValue.split('.');\n if (decimalParts.length > 2) {\n cleanValue = decimalParts[0] + '.' + decimalParts.slice(1).join('');\n }\n\n // Split into integer and decimal parts\n const parts = cleanValue.split('.');\n const integerPart = parts[0] || '';\n const decimalPart = parts[1] || '';\n\n // Limit decimal part to the specified number of digits\n const limitedDecimalPart = decimalPart.slice(0, this.decimal());\n\n // Reconstruct the value\n if (limitedDecimalPart.length > 0) {\n finalValue = integerPart + '.' + limitedDecimalPart;\n } else if (cleanValue.includes('.')) {\n // If there's a decimal point but no decimal part, keep the decimal point\n finalValue = integerPart + '.';\n } else {\n finalValue = integerPart;\n }\n\n return this.rangeValueLimit(finalValue);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -4,12 +4,12 @@ import { CommonModule } from '@angular/common';
|
|
|
4
4
|
|
|
5
5
|
class AXListNavigationDirective {
|
|
6
6
|
constructor() {
|
|
7
|
-
this.childElem = contentChildren(AXListNavigationItemDirective, { ...(ngDevMode ? { debugName: "childElem" } : {}), descendants: true });
|
|
7
|
+
this.childElem = contentChildren(AXListNavigationItemDirective, { ...(ngDevMode ? { debugName: "childElem" } : /* istanbul ignore next */ {}), descendants: true });
|
|
8
8
|
this.elementRef = inject(ElementRef);
|
|
9
|
-
this.activeIndex = signal(0, ...(ngDevMode ? [{ debugName: "activeIndex" }] : []));
|
|
9
|
+
this.activeIndex = signal(0, ...(ngDevMode ? [{ debugName: "activeIndex" }] : /* istanbul ignore next */ []));
|
|
10
10
|
this.onNavigationChanged = output();
|
|
11
11
|
this.onKeypress = output();
|
|
12
|
-
this.orientation = input('vertical', ...(ngDevMode ? [{ debugName: "orientation" }] : []));
|
|
12
|
+
this.orientation = input('vertical', ...(ngDevMode ? [{ debugName: "orientation" }] : /* istanbul ignore next */ []));
|
|
13
13
|
this.scrollOption = {
|
|
14
14
|
behavior: 'smooth',
|
|
15
15
|
block: 'nearest',
|
|
@@ -19,7 +19,7 @@ class AXListNavigationDirective {
|
|
|
19
19
|
item.itemElem.nativeElement.tabIndex = 0;
|
|
20
20
|
item.index.set(index);
|
|
21
21
|
});
|
|
22
|
-
}, ...(ngDevMode ? [{ debugName: "#eff" }] : []));
|
|
22
|
+
}, ...(ngDevMode ? [{ debugName: "#eff" }] : /* istanbul ignore next */ []));
|
|
23
23
|
this.#init = afterNextRender(() => {
|
|
24
24
|
this.elementRef.nativeElement.tabIndex = -1;
|
|
25
25
|
this.elementRef.nativeElement.onkeydown = (e) => {
|
|
@@ -97,10 +97,10 @@ class AXListNavigationDirective {
|
|
|
97
97
|
});
|
|
98
98
|
e.itemElem.nativeElement.scrollIntoView(this.scrollOption);
|
|
99
99
|
}
|
|
100
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
101
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "21.
|
|
100
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXListNavigationDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
101
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "21.2.9", type: AXListNavigationDirective, isStandalone: true, selector: "[axListNavigation]", inputs: { orientation: { classPropertyName: "orientation", publicName: "orientation", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onNavigationChanged: "onNavigationChanged", onKeypress: "onKeypress" }, queries: [{ propertyName: "childElem", predicate: AXListNavigationItemDirective, descendants: true, isSignal: true }], exportAs: ["axListNavigation"], ngImport: i0 }); }
|
|
102
102
|
}
|
|
103
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
103
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXListNavigationDirective, decorators: [{
|
|
104
104
|
type: Directive,
|
|
105
105
|
args: [{
|
|
106
106
|
selector: '[axListNavigation]',
|
|
@@ -111,10 +111,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
|
|
|
111
111
|
class AXListNavigationItemDirective {
|
|
112
112
|
constructor() {
|
|
113
113
|
this.itemElem = inject(ElementRef);
|
|
114
|
-
this.isActive = signal(false, ...(ngDevMode ? [{ debugName: "isActive" }] : []));
|
|
115
|
-
this.index = signal(0, ...(ngDevMode ? [{ debugName: "index" }] : []));
|
|
114
|
+
this.isActive = signal(false, ...(ngDevMode ? [{ debugName: "isActive" }] : /* istanbul ignore next */ []));
|
|
115
|
+
this.index = signal(0, ...(ngDevMode ? [{ debugName: "index" }] : /* istanbul ignore next */ []));
|
|
116
116
|
this.navigationItemKey = Math.random();
|
|
117
|
-
this.navigationParentItemKey = signal(null, ...(ngDevMode ? [{ debugName: "navigationParentItemKey" }] : []));
|
|
117
|
+
this.navigationParentItemKey = signal(null, ...(ngDevMode ? [{ debugName: "navigationParentItemKey" }] : /* istanbul ignore next */ []));
|
|
118
118
|
this.onKeypress = output();
|
|
119
119
|
this.parent = inject(AXListNavigationDirective);
|
|
120
120
|
this.injectItemInsideItem = inject(AXListNavigationItemDirective, { optional: true, skipSelf: true });
|
|
@@ -135,10 +135,10 @@ class AXListNavigationItemDirective {
|
|
|
135
135
|
});
|
|
136
136
|
}
|
|
137
137
|
#init;
|
|
138
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
139
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.
|
|
138
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXListNavigationItemDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
139
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.9", type: AXListNavigationItemDirective, isStandalone: true, selector: "[axListNavigationItem]", outputs: { onKeypress: "onKeypress" }, exportAs: ["axListNavigationItem"], ngImport: i0 }); }
|
|
140
140
|
}
|
|
141
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
141
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXListNavigationItemDirective, decorators: [{
|
|
142
142
|
type: Directive,
|
|
143
143
|
args: [{
|
|
144
144
|
selector: '[axListNavigationItem]',
|
|
@@ -149,11 +149,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
|
|
|
149
149
|
const COMPONENT = [AXListNavigationDirective, AXListNavigationItemDirective];
|
|
150
150
|
const MODULES = [CommonModule];
|
|
151
151
|
class AXListNavigationModule {
|
|
152
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.
|
|
153
|
-
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.
|
|
154
|
-
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.
|
|
152
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXListNavigationModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
153
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.2.9", ngImport: i0, type: AXListNavigationModule, imports: [CommonModule, AXListNavigationDirective, AXListNavigationItemDirective], exports: [AXListNavigationDirective, AXListNavigationItemDirective] }); }
|
|
154
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXListNavigationModule, imports: [MODULES] }); }
|
|
155
155
|
}
|
|
156
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.
|
|
156
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: AXListNavigationModule, decorators: [{
|
|
157
157
|
type: NgModule,
|
|
158
158
|
args: [{
|
|
159
159
|
imports: [...MODULES, ...COMPONENT],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acorex-cdk-list-navigation.mjs","sources":["../../../../packages/cdk/list-navigation/src/lib/list-navigation.directive.ts","../../../../packages/cdk/list-navigation/src/lib/list-navigation-item.directive.ts","../../../../packages/cdk/list-navigation/src/lib/list-navigation.module.ts","../../../../packages/cdk/list-navigation/src/acorex-cdk-list-navigation.ts"],"sourcesContent":["import { AXHtmlEvent } from '@acorex/cdk/common';\nimport {\n afterNextRender,\n contentChildren,\n Directive,\n effect,\n ElementRef,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { AXListNavigationItemDirective } from './list-navigation-item.directive';\n\n@Directive({\n selector: '[axListNavigation]',\n exportAs: 'axListNavigation',\n})\nexport class AXListNavigationDirective {\n private childElem = contentChildren(AXListNavigationItemDirective, { descendants: true });\n private elementRef = inject(ElementRef);\n activeIndex = signal(0);\n onNavigationChanged = output<{ sender: AXListNavigationDirective }>();\n onKeypress = output<AXHtmlEvent<KeyboardEvent>>();\n orientation = input<'horizontal' | 'vertical'>('vertical');\n\n private scrollOption: ScrollIntoViewOptions = {\n behavior: 'smooth',\n block: 'nearest',\n };\n\n #eff = effect(() => {\n this.childElem().forEach((item, index) => {\n (item.itemElem.nativeElement as HTMLElement).tabIndex = 0;\n item.index.set(index);\n });\n });\n\n #init = afterNextRender(() => {\n (this.elementRef.nativeElement as HTMLElement).tabIndex = -1;\n\n (this.elementRef.nativeElement as HTMLElement).onkeydown = (e: KeyboardEvent) => {\n this.onKeypress.emit({ component: this, nativeEvent: e });\n\n if (e.key === 'Tab') {\n this.onNavigationChanged.emit({ sender: this });\n }\n\n if (this.orientation() === 'vertical') {\n switch (e.key) {\n case 'ArrowDown':\n this.navigationHandler('ArrowDown');\n break;\n case 'ArrowUp':\n this.navigationHandler('ArrowUp');\n break;\n case 'ArrowLeft':\n this.parentNavigationHandler();\n break;\n }\n } else if (this.orientation() === 'horizontal') {\n switch (e.key) {\n case 'ArrowRight':\n this.navigationHandler('ArrowDown');\n break;\n case 'ArrowLeft':\n this.navigationHandler('ArrowUp');\n break;\n case 'ArrowUp':\n this.parentNavigationHandler();\n break;\n }\n }\n };\n });\n\n private navigationHandler(e: string) {\n this.onNavigationChanged.emit({ sender: this });\n\n if (e === 'ArrowUp' && this.activeIndex() > 0) {\n this.activeIndex.update((prev) => prev - 1);\n this.focusOnIndex(this.activeIndex());\n } else if (e === 'ArrowDown' && this.activeIndex() < this.childElem().length - 1) {\n this.activeIndex.update((prev) => prev + 1);\n this.focusOnIndex(this.activeIndex());\n }\n }\n\n private parentNavigationHandler() {\n this.onNavigationChanged.emit({ sender: this });\n\n const selectedItemParentKey = this.childElem()[this.activeIndex()].navigationParentItemKey();\n if (!selectedItemParentKey) return;\n const parentElem = this.childElem().find((item) => item.navigationItemKey === selectedItemParentKey);\n if (!parentElem) return;\n setTimeout(() => {\n (parentElem.itemElem.nativeElement as HTMLAreaElement).focus();\n });\n (parentElem.itemElem.nativeElement as HTMLAreaElement).scrollIntoView(this.scrollOption);\n }\n\n focusOnIndex(index: number) {\n const selectedItem = this.childElem()[index]?.itemElem.nativeElement as HTMLElement;\n if (!selectedItem) return;\n setTimeout(() => {\n selectedItem.focus();\n });\n selectedItem.scrollIntoView(this.scrollOption);\n }\n\n navigateTo(e: AXListNavigationItemDirective) {\n setTimeout(() => {\n (e.itemElem.nativeElement as HTMLElement).focus();\n });\n (e.itemElem.nativeElement as HTMLElement).scrollIntoView(this.scrollOption);\n }\n}\n","import { AXHtmlEvent } from '@acorex/cdk/common';\nimport { afterNextRender, Directive, ElementRef, inject, output, signal } from '@angular/core';\nimport { AXListNavigationDirective } from './list-navigation.directive';\n\n@Directive({\n selector: '[axListNavigationItem]',\n exportAs: 'axListNavigationItem',\n})\nexport class AXListNavigationItemDirective {\n itemElem = inject(ElementRef);\n isActive = signal(false);\n index = signal(0);\n navigationItemKey = Math.random();\n navigationParentItemKey = signal(null);\n onKeypress = output<AXHtmlEvent<KeyboardEvent>>();\n\n private parent = inject(AXListNavigationDirective);\n private injectItemInsideItem = inject(AXListNavigationItemDirective, { optional: true, skipSelf: true });\n\n #init = afterNextRender(() => {\n (this.itemElem.nativeElement as HTMLElement).onkeydown = (e: KeyboardEvent) => {\n this.onKeypress.emit({ component: this, nativeEvent: e });\n };\n\n (this.itemElem.nativeElement as HTMLElement).onfocus = () => {\n this.isActive.set(true);\n this.parent.activeIndex.set(this.index());\n };\n\n (this.itemElem.nativeElement as HTMLElement).onblur = () => {\n this.isActive.set(false);\n };\n\n if (!this.injectItemInsideItem?.navigationItemKey) return;\n this.navigationParentItemKey.set(this.injectItemInsideItem.navigationItemKey);\n });\n}\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { AXListNavigationItemDirective } from './list-navigation-item.directive';\nimport { AXListNavigationDirective } from './list-navigation.directive';\n\nconst COMPONENT = [AXListNavigationDirective, AXListNavigationItemDirective];\n\nconst MODULES = [CommonModule];\n\n@NgModule({\n imports: [...MODULES, ...COMPONENT],\n exports: [...COMPONENT],\n providers: [],\n})\nexport class AXListNavigationModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;MAkBa,yBAAyB,CAAA;AAJtC,IAAA,WAAA,GAAA;QAKU,IAAA,CAAA,SAAS,GAAG,eAAe,CAAC,6BAA6B,sDAAI,WAAW,EAAE,IAAI,EAAA,CAAG;AACjF,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AACvC,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,CAAC,uDAAC;QACvB,IAAA,CAAA,mBAAmB,GAAG,MAAM,EAAyC;QACrE,IAAA,CAAA,UAAU,GAAG,MAAM,EAA8B;AACjD,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAA4B,UAAU,uDAAC;AAElD,QAAA,IAAA,CAAA,YAAY,GAA0B;AAC5C,YAAA,QAAQ,EAAE,QAAQ;AAClB,YAAA,KAAK,EAAE,SAAS;SACjB;AAED,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,MAAK;YACjB,IAAI,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,KAAI;gBACtC,IAAI,CAAC,QAAQ,CAAC,aAA6B,CAAC,QAAQ,GAAG,CAAC;AACzD,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;AACvB,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,gDAAC;AAEF,QAAA,IAAA,CAAA,KAAK,GAAG,eAAe,CAAC,MAAK;YAC1B,IAAI,CAAC,UAAU,CAAC,aAA6B,CAAC,QAAQ,GAAG,CAAC,CAAC;YAE3D,IAAI,CAAC,UAAU,CAAC,aAA6B,CAAC,SAAS,GAAG,CAAC,CAAgB,KAAI;AAC9E,gBAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;AAEzD,gBAAA,IAAI,CAAC,CAAC,GAAG,KAAK,KAAK,EAAE;oBACnB,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;gBACjD;AAEA,gBAAA,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,UAAU,EAAE;AACrC,oBAAA,QAAQ,CAAC,CAAC,GAAG;AACX,wBAAA,KAAK,WAAW;AACd,4BAAA,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC;4BACnC;AACF,wBAAA,KAAK,SAAS;AACZ,4BAAA,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC;4BACjC;AACF,wBAAA,KAAK,WAAW;4BACd,IAAI,CAAC,uBAAuB,EAAE;4BAC9B;;gBAEN;AAAO,qBAAA,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,YAAY,EAAE;AAC9C,oBAAA,QAAQ,CAAC,CAAC,GAAG;AACX,wBAAA,KAAK,YAAY;AACf,4BAAA,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC;4BACnC;AACF,wBAAA,KAAK,WAAW;AACd,4BAAA,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC;4BACjC;AACF,wBAAA,KAAK,SAAS;4BACZ,IAAI,CAAC,uBAAuB,EAAE;4BAC9B;;gBAEN;AACF,YAAA,CAAC;AACH,QAAA,CAAC,CAAC;AA0CH,IAAA;AArFC,IAAA,IAAI;AAOJ,IAAA,KAAK;AAsCG,IAAA,iBAAiB,CAAC,CAAS,EAAA;QACjC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QAE/C,IAAI,CAAC,KAAK,SAAS,IAAI,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,EAAE;AAC7C,YAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,GAAG,CAAC,CAAC;YAC3C,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QACvC;AAAO,aAAA,IAAI,CAAC,KAAK,WAAW,IAAI,IAAI,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE;AAChF,YAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,GAAG,CAAC,CAAC;YAC3C,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QACvC;IACF;IAEQ,uBAAuB,GAAA;QAC7B,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AAE/C,QAAA,MAAM,qBAAqB,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,uBAAuB,EAAE;AAC5F,QAAA,IAAI,CAAC,qBAAqB;YAAE;QAC5B,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,iBAAiB,KAAK,qBAAqB,CAAC;AACpG,QAAA,IAAI,CAAC,UAAU;YAAE;QACjB,UAAU,CAAC,MAAK;AACb,YAAA,UAAU,CAAC,QAAQ,CAAC,aAAiC,CAAC,KAAK,EAAE;AAChE,QAAA,CAAC,CAAC;QACD,UAAU,CAAC,QAAQ,CAAC,aAAiC,CAAC,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC;IAC1F;AAEA,IAAA,YAAY,CAAC,KAAa,EAAA;AACxB,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,aAA4B;AACnF,QAAA,IAAI,CAAC,YAAY;YAAE;QACnB,UAAU,CAAC,MAAK;YACd,YAAY,CAAC,KAAK,EAAE;AACtB,QAAA,CAAC,CAAC;AACF,QAAA,YAAY,CAAC,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC;IAChD;AAEA,IAAA,UAAU,CAAC,CAAgC,EAAA;QACzC,UAAU,CAAC,MAAK;AACb,YAAA,CAAC,CAAC,QAAQ,CAAC,aAA6B,CAAC,KAAK,EAAE;AACnD,QAAA,CAAC,CAAC;QACD,CAAC,CAAC,QAAQ,CAAC,aAA6B,CAAC,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC;IAC7E;8GAjGW,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAzB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,yBAAyB,iVACA,6BAA6B,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FADtD,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAJrC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,oBAAoB;AAC9B,oBAAA,QAAQ,EAAE,kBAAkB;AAC7B,iBAAA;AAEqC,SAAA,CAAA,EAAA,cAAA,EAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,UAAA,CAAA,MAAA,6BAA6B,CAAA,EAAA,EAAA,GAAE,EAAE,WAAW,EAAE,IAAI,EAAE,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,mBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,aAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;MCX7E,6BAA6B,CAAA;AAJ1C,IAAA,WAAA,GAAA;AAKE,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC;AAC7B,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,KAAK,oDAAC;AACxB,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,CAAC,iDAAC;AACjB,QAAA,IAAA,CAAA,iBAAiB,GAAG,IAAI,CAAC,MAAM,EAAE;AACjC,QAAA,IAAA,CAAA,uBAAuB,GAAG,MAAM,CAAC,IAAI,mEAAC;QACtC,IAAA,CAAA,UAAU,GAAG,MAAM,EAA8B;AAEzC,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,yBAAyB,CAAC;AAC1C,QAAA,IAAA,CAAA,oBAAoB,GAAG,MAAM,CAAC,6BAA6B,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAExG,QAAA,IAAA,CAAA,KAAK,GAAG,eAAe,CAAC,MAAK;YAC1B,IAAI,CAAC,QAAQ,CAAC,aAA6B,CAAC,SAAS,GAAG,CAAC,CAAgB,KAAI;AAC5E,gBAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;AAC3D,YAAA,CAAC;YAEA,IAAI,CAAC,QAAQ,CAAC,aAA6B,CAAC,OAAO,GAAG,MAAK;AAC1D,gBAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;AACvB,gBAAA,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;AAC3C,YAAA,CAAC;YAEA,IAAI,CAAC,QAAQ,CAAC,aAA6B,CAAC,MAAM,GAAG,MAAK;AACzD,gBAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;AAC1B,YAAA,CAAC;AAED,YAAA,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,iBAAiB;gBAAE;YACnD,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC;AAC/E,QAAA,CAAC,CAAC;AACH,IAAA;AAjBC,IAAA,KAAK;8GAXM,6BAA6B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAA7B,6BAA6B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,QAAA,EAAA,CAAA,sBAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAA7B,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBAJzC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,wBAAwB;AAClC,oBAAA,QAAQ,EAAE,sBAAsB;AACjC,iBAAA;;;ACFD,MAAM,SAAS,GAAG,CAAC,yBAAyB,EAAE,6BAA6B,CAAC;AAE5E,MAAM,OAAO,GAAG,CAAC,YAAY,CAAC;MAOjB,sBAAsB,CAAA;8GAAtB,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;+GAAtB,sBAAsB,EAAA,OAAA,EAAA,CAPlB,YAAY,EAFV,yBAAyB,EAAE,6BAA6B,CAAA,EAAA,OAAA,EAAA,CAAxD,yBAAyB,EAAE,6BAA6B,CAAA,EAAA,CAAA,CAAA;AAS9D,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,sBAAsB,YAJpB,OAAO,CAAA,EAAA,CAAA,CAAA;;2FAIT,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBALlC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE,CAAC,GAAG,OAAO,EAAE,GAAG,SAAS,CAAC;AACnC,oBAAA,OAAO,EAAE,CAAC,GAAG,SAAS,CAAC;AACvB,oBAAA,SAAS,EAAE,EAAE;AACd,iBAAA;;;ACbD;;AAEG;;;;"}
|
|
1
|
+
{"version":3,"file":"acorex-cdk-list-navigation.mjs","sources":["../../../../packages/cdk/list-navigation/src/lib/list-navigation.directive.ts","../../../../packages/cdk/list-navigation/src/lib/list-navigation-item.directive.ts","../../../../packages/cdk/list-navigation/src/lib/list-navigation.module.ts","../../../../packages/cdk/list-navigation/src/acorex-cdk-list-navigation.ts"],"sourcesContent":["import { AXHtmlEvent } from '@acorex/cdk/common';\nimport {\n afterNextRender,\n contentChildren,\n Directive,\n effect,\n ElementRef,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { AXListNavigationItemDirective } from './list-navigation-item.directive';\n\n@Directive({\n selector: '[axListNavigation]',\n exportAs: 'axListNavigation',\n})\nexport class AXListNavigationDirective {\n private childElem = contentChildren(AXListNavigationItemDirective, { descendants: true });\n private elementRef = inject(ElementRef);\n activeIndex = signal(0);\n onNavigationChanged = output<{ sender: AXListNavigationDirective }>();\n onKeypress = output<AXHtmlEvent<KeyboardEvent>>();\n orientation = input<'horizontal' | 'vertical'>('vertical');\n\n private scrollOption: ScrollIntoViewOptions = {\n behavior: 'smooth',\n block: 'nearest',\n };\n\n #eff = effect(() => {\n this.childElem().forEach((item, index) => {\n (item.itemElem.nativeElement as HTMLElement).tabIndex = 0;\n item.index.set(index);\n });\n });\n\n #init = afterNextRender(() => {\n (this.elementRef.nativeElement as HTMLElement).tabIndex = -1;\n\n (this.elementRef.nativeElement as HTMLElement).onkeydown = (e: KeyboardEvent) => {\n this.onKeypress.emit({ component: this, nativeEvent: e });\n\n if (e.key === 'Tab') {\n this.onNavigationChanged.emit({ sender: this });\n }\n\n if (this.orientation() === 'vertical') {\n switch (e.key) {\n case 'ArrowDown':\n this.navigationHandler('ArrowDown');\n break;\n case 'ArrowUp':\n this.navigationHandler('ArrowUp');\n break;\n case 'ArrowLeft':\n this.parentNavigationHandler();\n break;\n }\n } else if (this.orientation() === 'horizontal') {\n switch (e.key) {\n case 'ArrowRight':\n this.navigationHandler('ArrowDown');\n break;\n case 'ArrowLeft':\n this.navigationHandler('ArrowUp');\n break;\n case 'ArrowUp':\n this.parentNavigationHandler();\n break;\n }\n }\n };\n });\n\n private navigationHandler(e: string) {\n this.onNavigationChanged.emit({ sender: this });\n\n if (e === 'ArrowUp' && this.activeIndex() > 0) {\n this.activeIndex.update((prev) => prev - 1);\n this.focusOnIndex(this.activeIndex());\n } else if (e === 'ArrowDown' && this.activeIndex() < this.childElem().length - 1) {\n this.activeIndex.update((prev) => prev + 1);\n this.focusOnIndex(this.activeIndex());\n }\n }\n\n private parentNavigationHandler() {\n this.onNavigationChanged.emit({ sender: this });\n\n const selectedItemParentKey = this.childElem()[this.activeIndex()].navigationParentItemKey();\n if (!selectedItemParentKey) return;\n const parentElem = this.childElem().find((item) => item.navigationItemKey === selectedItemParentKey);\n if (!parentElem) return;\n setTimeout(() => {\n (parentElem.itemElem.nativeElement as HTMLAreaElement).focus();\n });\n (parentElem.itemElem.nativeElement as HTMLAreaElement).scrollIntoView(this.scrollOption);\n }\n\n focusOnIndex(index: number) {\n const selectedItem = this.childElem()[index]?.itemElem.nativeElement as HTMLElement;\n if (!selectedItem) return;\n setTimeout(() => {\n selectedItem.focus();\n });\n selectedItem.scrollIntoView(this.scrollOption);\n }\n\n navigateTo(e: AXListNavigationItemDirective) {\n setTimeout(() => {\n (e.itemElem.nativeElement as HTMLElement).focus();\n });\n (e.itemElem.nativeElement as HTMLElement).scrollIntoView(this.scrollOption);\n }\n}\n","import { AXHtmlEvent } from '@acorex/cdk/common';\nimport { afterNextRender, Directive, ElementRef, inject, output, signal } from '@angular/core';\nimport { AXListNavigationDirective } from './list-navigation.directive';\n\n@Directive({\n selector: '[axListNavigationItem]',\n exportAs: 'axListNavigationItem',\n})\nexport class AXListNavigationItemDirective {\n itemElem = inject(ElementRef);\n isActive = signal(false);\n index = signal(0);\n navigationItemKey = Math.random();\n navigationParentItemKey = signal(null);\n onKeypress = output<AXHtmlEvent<KeyboardEvent>>();\n\n private parent = inject(AXListNavigationDirective);\n private injectItemInsideItem = inject(AXListNavigationItemDirective, { optional: true, skipSelf: true });\n\n #init = afterNextRender(() => {\n (this.itemElem.nativeElement as HTMLElement).onkeydown = (e: KeyboardEvent) => {\n this.onKeypress.emit({ component: this, nativeEvent: e });\n };\n\n (this.itemElem.nativeElement as HTMLElement).onfocus = () => {\n this.isActive.set(true);\n this.parent.activeIndex.set(this.index());\n };\n\n (this.itemElem.nativeElement as HTMLElement).onblur = () => {\n this.isActive.set(false);\n };\n\n if (!this.injectItemInsideItem?.navigationItemKey) return;\n this.navigationParentItemKey.set(this.injectItemInsideItem.navigationItemKey);\n });\n}\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { AXListNavigationItemDirective } from './list-navigation-item.directive';\nimport { AXListNavigationDirective } from './list-navigation.directive';\n\nconst COMPONENT = [AXListNavigationDirective, AXListNavigationItemDirective];\n\nconst MODULES = [CommonModule];\n\n@NgModule({\n imports: [...MODULES, ...COMPONENT],\n exports: [...COMPONENT],\n providers: [],\n})\nexport class AXListNavigationModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|