@acorex/cdk 22.0.0 → 22.0.1-next.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,12 +1,13 @@
1
1
  import { isPlatformBrowser } from '@angular/common';
2
2
  import * as i1 from '@acorex/cdk/gesture';
3
3
  import { AXGestureDirective } from '@acorex/cdk/gesture';
4
+ import { AXHtmlUtil } from '@acorex/core/utils';
4
5
  import * as i0 from '@angular/core';
5
- import { inject, ElementRef, PLATFORM_ID, NgZone, DestroyRef, input, afterNextRender, Directive } from '@angular/core';
6
+ import { inject, ElementRef, PLATFORM_ID, NgZone, DestroyRef, input, linkedSignal, effect, afterNextRender, Directive } from '@angular/core';
6
7
 
7
8
  /**
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.
9
+ * Converts vertical mouse-wheel scrolling and pan gestures into scrolling on the host element.
10
+ * Supports horizontal and vertical orientations. Pan is provided by the hosted AXGestureDirective.
10
11
  *
11
12
  * Usage:
12
13
  * <div axHorizontalScroll [speed]="150" class="overflow-x-auto">
@@ -16,6 +17,11 @@ import { inject, ElementRef, PLATFORM_ID, NgZone, DestroyRef, input, afterNextRe
16
17
  * Do not put `axGesture` on the same element; this directive already hosts it.
17
18
  */
18
19
  class AXHorizontalScrollDirective {
20
+ touchAction() {
21
+ if (this.disabled())
22
+ return null;
23
+ return this.isHorizontal() ? 'pan-y' : 'pan-x';
24
+ }
19
25
  constructor() {
20
26
  this.elementRef = inject((ElementRef));
21
27
  this.platformId = inject(PLATFORM_ID);
@@ -28,25 +34,40 @@ class AXHorizontalScrollDirective {
28
34
  this.disabled = input(false, /* @ts-ignore */
29
35
  ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
30
36
  /**
31
- * Horizontal scroll animation duration in milliseconds.
37
+ * Scroll axis. Horizontal converts wheel + pan; vertical uses pan only.
38
+ * @defaultValue 'horizontal'
39
+ */
40
+ this.orientation = input('horizontal', /* @ts-ignore */
41
+ ...(ngDevMode ? [{ debugName: "orientation" }] : /* istanbul ignore next */ []));
42
+ /** Internal orientation state; can be overridden programmatically by host components. */
43
+ this.scrollOrientation = linkedSignal(() => this.orientation(), /* @ts-ignore */
44
+ ...(ngDevMode ? [{ debugName: "scrollOrientation" }] : /* istanbul ignore next */ []));
45
+ /**
46
+ * Scroll animation duration in milliseconds.
32
47
  * Lower values scroll faster; `0` applies the scroll instantly.
33
48
  */
34
49
  this.speed = input(200, /* @ts-ignore */
35
50
  ...(ngDevMode ? [{ debugName: "speed" }] : /* istanbul ignore next */ []));
36
51
  this.animationFrameId = null;
37
- this.targetScrollLeft = null;
52
+ this.targetScrollPosition = null;
38
53
  this.scrollPosition = 0;
39
54
  this.lastFrameTime = 0;
40
55
  this.isPanning = false;
41
56
  this.ignorePan = false;
42
- this.panStartScrollLeft = 0;
57
+ this.panStartScrollPosition = 0;
43
58
  this.suppressClickListener = null;
44
59
  this.suppressClickTimer = null;
60
+ this._isRtl = false;
45
61
  this.interactiveSelector = 'input, textarea, select, option, [contenteditable]:not([contenteditable="false"])';
46
62
  this.wheelListener = (event) => this.handleWheel(event);
63
+ this.#orientationEffect = effect(() => {
64
+ this.gesture.gestureDirection.set(this.scrollOrientation());
65
+ }, /* @ts-ignore */
66
+ ...(ngDevMode ? [{ debugName: "#orientationEffect" }] : /* istanbul ignore next */ []));
47
67
  this.#init = afterNextRender(() => {
48
68
  if (!isPlatformBrowser(this.platformId))
49
69
  return;
70
+ this._isRtl = AXHtmlUtil.isRtl(this.nativeElement);
50
71
  this.zone.runOutsideAngular(() => {
51
72
  this.nativeElement.addEventListener('wheel', this.wheelListener, { passive: false });
52
73
  });
@@ -62,6 +83,7 @@ class AXHorizontalScrollDirective {
62
83
  }
63
84
  });
64
85
  }
86
+ #orientationEffect;
65
87
  #init;
66
88
  ngOnDestroy() {
67
89
  if (!isPlatformBrowser(this.platformId))
@@ -74,32 +96,79 @@ class AXHorizontalScrollDirective {
74
96
  get nativeElement() {
75
97
  return this.elementRef.nativeElement;
76
98
  }
99
+ isHorizontal() {
100
+ return this.scrollOrientation() === 'horizontal';
101
+ }
102
+ get rtlSign() {
103
+ return this.isHorizontal() && this._isRtl ? -1 : 1;
104
+ }
105
+ refreshRtlState() {
106
+ if (isPlatformBrowser(this.platformId)) {
107
+ this._isRtl = AXHtmlUtil.isRtl(this.nativeElement);
108
+ }
109
+ }
110
+ getCurrentScrollPosition() {
111
+ if (this.isHorizontal()) {
112
+ return this.nativeElement.scrollLeft * this.rtlSign;
113
+ }
114
+ return this.nativeElement.scrollTop;
115
+ }
116
+ getMaxScrollPosition() {
117
+ const element = this.nativeElement;
118
+ return this.isHorizontal()
119
+ ? element.scrollWidth - element.clientWidth
120
+ : element.scrollHeight - element.clientHeight;
121
+ }
122
+ canScroll() {
123
+ const element = this.nativeElement;
124
+ return this.isHorizontal()
125
+ ? element.scrollWidth > element.clientWidth
126
+ : element.scrollHeight > element.clientHeight;
127
+ }
128
+ applyScrollPosition(position) {
129
+ this.scrollPosition = position;
130
+ if (this.isHorizontal()) {
131
+ this.nativeElement.scrollLeft = position * this.rtlSign;
132
+ }
133
+ else {
134
+ this.nativeElement.scrollTop = position;
135
+ }
136
+ }
137
+ isDragInProgress() {
138
+ const host = this.nativeElement;
139
+ if (host.classList.contains('ax-drop-list-sorting-active')) {
140
+ return true;
141
+ }
142
+ return host.querySelector('.ax-dragging') !== null;
143
+ }
77
144
  handleWheel(event) {
78
- if (this.disabled() || this.isPanning || !this.canScrollHorizontally())
145
+ if (this.disabled() || this.isPanning || !this.isHorizontal() || !this.canScroll())
79
146
  return;
80
147
  if (event.shiftKey || Math.abs(event.deltaX) > Math.abs(event.deltaY))
81
148
  return;
82
149
  if (event.deltaY === 0)
83
150
  return;
84
- const maxScrollLeft = this.getMaxScrollLeft();
151
+ this.refreshRtlState();
152
+ const maxScroll = this.getMaxScrollPosition();
153
+ const step = event.deltaY * this.rtlSign;
85
154
  this.syncScrollState();
86
- const currentPosition = this.targetScrollLeft ?? this.scrollPosition;
87
- const atStart = currentPosition <= 0 && event.deltaY < 0;
88
- const atEnd = currentPosition >= maxScrollLeft && event.deltaY > 0;
155
+ const currentPosition = this.targetScrollPosition ?? this.scrollPosition;
156
+ const atStart = currentPosition <= 0 && step < 0;
157
+ const atEnd = currentPosition >= maxScroll && step > 0;
89
158
  if (atStart || atEnd)
90
159
  return;
91
160
  event.preventDefault();
92
- const nextTarget = Math.max(0, Math.min(maxScrollLeft, currentPosition + event.deltaY));
93
- this.targetScrollLeft = nextTarget;
161
+ const nextTarget = Math.max(0, Math.min(maxScroll, currentPosition + step));
162
+ this.targetScrollPosition = nextTarget;
94
163
  if (this.speed() <= 0) {
95
164
  this.applyScrollPosition(nextTarget);
96
- this.targetScrollLeft = null;
165
+ this.targetScrollPosition = null;
97
166
  return;
98
167
  }
99
168
  this.startAnimation();
100
169
  }
101
170
  handlePanStart(event) {
102
- if (this.disabled() || !this.canScrollHorizontally()) {
171
+ if (this.disabled() || !this.canScroll() || this.isDragInProgress()) {
103
172
  this.ignorePan = true;
104
173
  return;
105
174
  }
@@ -107,22 +176,24 @@ class AXHorizontalScrollDirective {
107
176
  this.ignorePan = true;
108
177
  return;
109
178
  }
179
+ this.refreshRtlState();
110
180
  this.ignorePan = false;
111
181
  this.isPanning = true;
112
182
  this.stopAnimation();
113
- this.targetScrollLeft = null;
114
- this.scrollPosition = this.nativeElement.scrollLeft;
115
- this.panStartScrollLeft = this.scrollPosition;
183
+ this.targetScrollPosition = null;
184
+ this.scrollPosition = this.getCurrentScrollPosition();
185
+ this.panStartScrollPosition = this.scrollPosition;
116
186
  this.nativeElement.style.userSelect = 'none';
117
187
  if (event.pointerType === 'mouse') {
118
188
  this.nativeElement.style.cursor = 'grabbing';
119
189
  }
120
190
  }
121
191
  handlePanMove(event) {
122
- if (this.ignorePan || this.disabled() || !this.isPanning)
192
+ if (this.ignorePan || this.disabled() || !this.isPanning || this.isDragInProgress())
123
193
  return;
124
194
  event.preventDefault();
125
- const next = Math.max(0, Math.min(this.getMaxScrollLeft(), this.panStartScrollLeft - event.deltaX));
195
+ const delta = this.isHorizontal() ? event.deltaX : event.deltaY;
196
+ const next = Math.max(0, Math.min(this.getMaxScrollPosition(), this.panStartScrollPosition - delta * this.rtlSign));
126
197
  this.applyScrollPosition(next);
127
198
  }
128
199
  handlePanEnd(event) {
@@ -138,10 +209,11 @@ class AXHorizontalScrollDirective {
138
209
  this.suppressClick();
139
210
  if (this.speed() <= 0)
140
211
  return;
141
- const distance = -event.velocityX * this.speed();
212
+ const velocity = this.isHorizontal() ? event.velocityX : event.velocityY;
213
+ const distance = -velocity * this.speed() * this.rtlSign;
142
214
  if (Math.abs(distance) < 8)
143
215
  return;
144
- this.targetScrollLeft = Math.max(0, Math.min(this.getMaxScrollLeft(), this.scrollPosition + distance));
216
+ this.targetScrollPosition = Math.max(0, Math.min(this.getMaxScrollPosition(), this.scrollPosition + distance));
145
217
  this.startAnimation();
146
218
  }
147
219
  clearPanStyles() {
@@ -170,17 +242,17 @@ class AXHorizontalScrollDirective {
170
242
  this.suppressClickListener = null;
171
243
  }
172
244
  syncScrollState() {
173
- if (this.targetScrollLeft !== null)
245
+ if (this.targetScrollPosition !== null)
174
246
  return;
175
- this.scrollPosition = this.nativeElement.scrollLeft;
176
- this.targetScrollLeft = this.scrollPosition;
247
+ this.scrollPosition = this.getCurrentScrollPosition();
248
+ this.targetScrollPosition = this.scrollPosition;
177
249
  }
178
250
  startAnimation() {
179
251
  if (this.animationFrameId !== null)
180
252
  return;
181
253
  this.lastFrameTime = performance.now();
182
254
  const step = (currentTime) => {
183
- const target = this.targetScrollLeft;
255
+ const target = this.targetScrollPosition;
184
256
  if (target === null) {
185
257
  this.stopAnimation();
186
258
  return;
@@ -192,7 +264,7 @@ class AXHorizontalScrollDirective {
192
264
  this.applyScrollPosition(this.scrollPosition);
193
265
  if (Math.abs(target - this.scrollPosition) < 0.5) {
194
266
  this.applyScrollPosition(target);
195
- this.targetScrollLeft = null;
267
+ this.targetScrollPosition = null;
196
268
  this.stopAnimation();
197
269
  return;
198
270
  }
@@ -200,26 +272,14 @@ class AXHorizontalScrollDirective {
200
272
  };
201
273
  this.animationFrameId = requestAnimationFrame(step);
202
274
  }
203
- applyScrollPosition(position) {
204
- this.scrollPosition = position;
205
- this.nativeElement.scrollLeft = position;
206
- }
207
275
  stopAnimation() {
208
276
  if (this.animationFrameId === null)
209
277
  return;
210
278
  cancelAnimationFrame(this.animationFrameId);
211
279
  this.animationFrameId = null;
212
280
  }
213
- canScrollHorizontally() {
214
- const element = this.nativeElement;
215
- return element.scrollWidth > element.clientWidth;
216
- }
217
- getMaxScrollLeft() {
218
- const element = this.nativeElement;
219
- return element.scrollWidth - element.clientWidth;
220
- }
221
281
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXHorizontalScrollDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
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 }); }
282
+ 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 }, orientation: { classPropertyName: "orientation", publicName: "orientation", isSignal: true, isRequired: false, transformFunction: null }, speed: { classPropertyName: "speed", publicName: "speed", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "style.touch-action": "touchAction()" } }, hostDirectives: [{ directive: i1.AXGestureDirective }], ngImport: i0 }); }
223
283
  }
224
284
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXHorizontalScrollDirective, decorators: [{
225
285
  type: Directive,
@@ -227,10 +287,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
227
287
  selector: '[axHorizontalScroll]',
228
288
  hostDirectives: [AXGestureDirective],
229
289
  host: {
230
- '[style.touch-action]': 'disabled() ? null : "pan-y"',
290
+ '[style.touch-action]': 'touchAction()',
231
291
  },
232
292
  }]
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 }] }] } });
293
+ }], ctorParameters: () => [], propDecorators: { disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], orientation: [{ type: i0.Input, args: [{ isSignal: true, alias: "orientation", required: false }] }], speed: [{ type: i0.Input, args: [{ isSignal: true, alias: "speed", required: false }] }] } });
234
294
 
235
295
  /**
236
296
  * 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 { 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
+ {"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 { AXHtmlUtil } from '@acorex/core/utils';\nimport {\n afterNextRender,\n DestroyRef,\n Directive,\n effect,\n ElementRef,\n inject,\n input,\n linkedSignal,\n NgZone,\n OnDestroy,\n PLATFORM_ID,\n} from '@angular/core';\n\n/**\n * Converts vertical mouse-wheel scrolling and pan gestures into scrolling on the host element.\n * Supports horizontal and vertical orientations. 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]': 'touchAction()',\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 * Scroll axis. Horizontal converts wheel + pan; vertical uses pan only.\n * @defaultValue 'horizontal'\n */\n orientation = input<'horizontal' | 'vertical'>('horizontal');\n\n /** Internal orientation state; can be overridden programmatically by host components. */\n readonly scrollOrientation = linkedSignal(() => this.orientation());\n\n /**\n * 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 targetScrollPosition: number | null = null;\n private scrollPosition = 0;\n private lastFrameTime = 0;\n\n private isPanning = false;\n private ignorePan = false;\n private panStartScrollPosition = 0;\n private suppressClickListener: ((event: Event) => void) | null = null;\n private suppressClickTimer: ReturnType<typeof setTimeout> | null = null;\n private _isRtl = false;\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 protected touchAction(): string | null {\n if (this.disabled()) return null;\n return this.isHorizontal() ? 'pan-y' : 'pan-x';\n }\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 #orientationEffect = effect(() => {\n this.gesture.gestureDirection.set(this.scrollOrientation());\n });\n\n #init = afterNextRender(() => {\n if (!isPlatformBrowser(this.platformId)) return;\n\n this._isRtl = AXHtmlUtil.isRtl(this.nativeElement);\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 isHorizontal(): boolean {\n return this.scrollOrientation() === 'horizontal';\n }\n\n private get rtlSign(): number {\n return this.isHorizontal() && this._isRtl ? -1 : 1;\n }\n\n private refreshRtlState(): void {\n if (isPlatformBrowser(this.platformId)) {\n this._isRtl = AXHtmlUtil.isRtl(this.nativeElement);\n }\n }\n\n private getCurrentScrollPosition(): number {\n if (this.isHorizontal()) {\n return this.nativeElement.scrollLeft * this.rtlSign;\n }\n return this.nativeElement.scrollTop;\n }\n\n private getMaxScrollPosition(): number {\n const element = this.nativeElement;\n return this.isHorizontal()\n ? element.scrollWidth - element.clientWidth\n : element.scrollHeight - element.clientHeight;\n }\n\n private canScroll(): boolean {\n const element = this.nativeElement;\n return this.isHorizontal()\n ? element.scrollWidth > element.clientWidth\n : element.scrollHeight > element.clientHeight;\n }\n\n private applyScrollPosition(position: number): void {\n this.scrollPosition = position;\n if (this.isHorizontal()) {\n this.nativeElement.scrollLeft = position * this.rtlSign;\n } else {\n this.nativeElement.scrollTop = position;\n }\n }\n\n private isDragInProgress(): boolean {\n const host = this.nativeElement;\n if (host.classList.contains('ax-drop-list-sorting-active')) {\n return true;\n }\n return host.querySelector('.ax-dragging') !== null;\n }\n\n private handleWheel(event: WheelEvent): void {\n if (this.disabled() || this.isPanning || !this.isHorizontal() || !this.canScroll()) return;\n if (event.shiftKey || Math.abs(event.deltaX) > Math.abs(event.deltaY)) return;\n if (event.deltaY === 0) return;\n\n this.refreshRtlState();\n\n const maxScroll = this.getMaxScrollPosition();\n const step = event.deltaY * this.rtlSign;\n\n this.syncScrollState();\n\n const currentPosition = this.targetScrollPosition ?? this.scrollPosition;\n const atStart = currentPosition <= 0 && step < 0;\n const atEnd = currentPosition >= maxScroll && step > 0;\n\n if (atStart || atEnd) return;\n\n event.preventDefault();\n\n const nextTarget = Math.max(0, Math.min(maxScroll, currentPosition + step));\n this.targetScrollPosition = nextTarget;\n\n if (this.speed() <= 0) {\n this.applyScrollPosition(nextTarget);\n this.targetScrollPosition = null;\n return;\n }\n\n this.startAnimation();\n }\n\n private handlePanStart(event: AXGestureEvent): void {\n if (this.disabled() || !this.canScroll() || this.isDragInProgress()) {\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.refreshRtlState();\n this.ignorePan = false;\n this.isPanning = true;\n this.stopAnimation();\n this.targetScrollPosition = null;\n this.scrollPosition = this.getCurrentScrollPosition();\n this.panStartScrollPosition = 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 || this.isDragInProgress()) return;\n\n event.preventDefault();\n const delta = this.isHorizontal() ? event.deltaX : event.deltaY;\n const next = Math.max(\n 0,\n Math.min(this.getMaxScrollPosition(), this.panStartScrollPosition - delta * this.rtlSign),\n );\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 velocity = this.isHorizontal() ? event.velocityX : event.velocityY;\n const distance = -velocity * this.speed() * this.rtlSign;\n if (Math.abs(distance) < 8) return;\n\n this.targetScrollPosition = Math.max(\n 0,\n Math.min(this.getMaxScrollPosition(), this.scrollPosition + distance),\n );\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.targetScrollPosition !== null) return;\n\n this.scrollPosition = this.getCurrentScrollPosition();\n this.targetScrollPosition = 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.targetScrollPosition;\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.targetScrollPosition = null;\n this.stopAnimation();\n return;\n }\n\n this.animationFrameId = requestAnimationFrame(step);\n };\n\n this.animationFrameId = requestAnimationFrame(step);\n }\n\n private stopAnimation(): void {\n if (this.animationFrameId === null) return;\n\n cancelAnimationFrame(this.animationFrameId);\n this.animationFrameId = null;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;AAiBA;;;;;;;;;;AAUG;MAQU,2BAA2B,CAAA;IA4C5B,WAAW,GAAA;QACnB,IAAI,IAAI,CAAC,QAAQ,EAAE;AAAE,YAAA,OAAO,IAAI;AAChC,QAAA,OAAO,IAAI,CAAC,YAAY,EAAE,GAAG,OAAO,GAAG,OAAO;IAChD;AAEA,IAAA,WAAA,GAAA;AAhDiB,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,EAAC,UAAuB,EAAC;AAC5C,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC;AAChC,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC;AACrB,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,kBAAkB,CAAC;AACpC,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAEhD;;AAEG;QACH,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,KAAK;qFAAC;AAEvB;;;AAGG;QACH,IAAA,CAAA,WAAW,GAAG,KAAK,CAA4B,YAAY;wFAAC;;QAGnD,IAAA,CAAA,iBAAiB,GAAG,YAAY,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE;8FAAC;AAEnE;;;AAGG;QACH,IAAA,CAAA,KAAK,GAAG,KAAK,CAAC,GAAG;kFAAC;QAEV,IAAA,CAAA,gBAAgB,GAAkB,IAAI;QACtC,IAAA,CAAA,oBAAoB,GAAkB,IAAI;QAC1C,IAAA,CAAA,cAAc,GAAG,CAAC;QAClB,IAAA,CAAA,aAAa,GAAG,CAAC;QAEjB,IAAA,CAAA,SAAS,GAAG,KAAK;QACjB,IAAA,CAAA,SAAS,GAAG,KAAK;QACjB,IAAA,CAAA,sBAAsB,GAAG,CAAC;QAC1B,IAAA,CAAA,qBAAqB,GAAoC,IAAI;QAC7D,IAAA,CAAA,kBAAkB,GAAyC,IAAI;QAC/D,IAAA,CAAA,MAAM,GAAG,KAAK;QAEL,IAAA,CAAA,mBAAmB,GAClC,mFAAmF;AAEpE,QAAA,IAAA,CAAA,aAAa,GAAG,CAAC,KAAiB,KAAK,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AAoB/E,QAAA,IAAA,CAAA,kBAAkB,GAAG,MAAM,CAAC,MAAK;AAC/B,YAAA,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC7D,CAAC;+FAAC;AAEF,QAAA,IAAA,CAAA,KAAK,GAAG,eAAe,CAAC,MAAK;AAC3B,YAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC;gBAAE;YAEzC,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC;AAElD,YAAA,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAK;AAC/B,gBAAA,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AACtF,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;AAxBA,QAAA,MAAM,aAAa,GAAG;AACpB,YAAA,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;AACtE,YAAA,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;AACpE,YAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;SACnE;AACD,QAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAK;AAC7B,YAAA,KAAK,MAAM,YAAY,IAAI,aAAa,EAAE;gBACxC,YAAY,CAAC,WAAW,EAAE;YAC5B;AACF,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,kBAAkB;AAIlB,IAAA,KAAK;IAUL,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC;YAAE;QAEzC,IAAI,CAAC,aAAa,EAAE;QACpB,IAAI,CAAC,cAAc,EAAE;QACrB,IAAI,CAAC,qBAAqB,EAAE;QAC5B,IAAI,CAAC,aAAa,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC;IACrE;AAEA,IAAA,IAAY,aAAa,GAAA;AACvB,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,aAAa;IACtC;IAEQ,YAAY,GAAA;AAClB,QAAA,OAAO,IAAI,CAAC,iBAAiB,EAAE,KAAK,YAAY;IAClD;AAEA,IAAA,IAAY,OAAO,GAAA;AACjB,QAAA,OAAO,IAAI,CAAC,YAAY,EAAE,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC;IACpD;IAEQ,eAAe,GAAA;AACrB,QAAA,IAAI,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;YACtC,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC;QACpD;IACF;IAEQ,wBAAwB,GAAA;AAC9B,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE,EAAE;YACvB,OAAO,IAAI,CAAC,aAAa,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO;QACrD;AACA,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,SAAS;IACrC;IAEQ,oBAAoB,GAAA;AAC1B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa;QAClC,OAAO,IAAI,CAAC,YAAY;AACtB,cAAE,OAAO,CAAC,WAAW,GAAG,OAAO,CAAC;cAC9B,OAAO,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY;IACjD;IAEQ,SAAS,GAAA;AACf,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa;QAClC,OAAO,IAAI,CAAC,YAAY;AACtB,cAAE,OAAO,CAAC,WAAW,GAAG,OAAO,CAAC;cAC9B,OAAO,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY;IACjD;AAEQ,IAAA,mBAAmB,CAAC,QAAgB,EAAA;AAC1C,QAAA,IAAI,CAAC,cAAc,GAAG,QAAQ;AAC9B,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE,EAAE;YACvB,IAAI,CAAC,aAAa,CAAC,UAAU,GAAG,QAAQ,GAAG,IAAI,CAAC,OAAO;QACzD;aAAO;AACL,YAAA,IAAI,CAAC,aAAa,CAAC,SAAS,GAAG,QAAQ;QACzC;IACF;IAEQ,gBAAgB,GAAA;AACtB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa;QAC/B,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,6BAA6B,CAAC,EAAE;AAC1D,YAAA,OAAO,IAAI;QACb;QACA,OAAO,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,KAAK,IAAI;IACpD;AAEQ,IAAA,WAAW,CAAC,KAAiB,EAAA;AACnC,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YAAE;QACpF,IAAI,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC;YAAE;AACvE,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE;QAExB,IAAI,CAAC,eAAe,EAAE;AAEtB,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,oBAAoB,EAAE;QAC7C,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO;QAExC,IAAI,CAAC,eAAe,EAAE;QAEtB,MAAM,eAAe,GAAG,IAAI,CAAC,oBAAoB,IAAI,IAAI,CAAC,cAAc;QACxE,MAAM,OAAO,GAAG,eAAe,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC;QAChD,MAAM,KAAK,GAAG,eAAe,IAAI,SAAS,IAAI,IAAI,GAAG,CAAC;QAEtD,IAAI,OAAO,IAAI,KAAK;YAAE;QAEtB,KAAK,CAAC,cAAc,EAAE;AAEtB,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,eAAe,GAAG,IAAI,CAAC,CAAC;AAC3E,QAAA,IAAI,CAAC,oBAAoB,GAAG,UAAU;AAEtC,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE;AACrB,YAAA,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC;AACpC,YAAA,IAAI,CAAC,oBAAoB,GAAG,IAAI;YAChC;QACF;QAEA,IAAI,CAAC,cAAc,EAAE;IACvB;AAEQ,IAAA,cAAc,CAAC,KAAqB,EAAA;AAC1C,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,gBAAgB,EAAE,EAAE;AACnE,YAAA,IAAI,CAAC,SAAS,GAAG,IAAI;YACrB;QACF;AACA,QAAA,IAAI,KAAK,CAAC,MAAM,YAAY,OAAO,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,EAAE;AACrF,YAAA,IAAI,CAAC,SAAS,GAAG,IAAI;YACrB;QACF;QAEA,IAAI,CAAC,eAAe,EAAE;AACtB,QAAA,IAAI,CAAC,SAAS,GAAG,KAAK;AACtB,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;QACrB,IAAI,CAAC,aAAa,EAAE;AACpB,QAAA,IAAI,CAAC,oBAAoB,GAAG,IAAI;AAChC,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,wBAAwB,EAAE;AACrD,QAAA,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,cAAc;QACjD,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,UAAU,GAAG,MAAM;AAC5C,QAAA,IAAI,KAAK,CAAC,WAAW,KAAK,OAAO,EAAE;YACjC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,GAAG,UAAU;QAC9C;IACF;AAEQ,IAAA,aAAa,CAAC,KAAqB,EAAA;AACzC,QAAA,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,gBAAgB,EAAE;YAAE;QAErF,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,GAAG,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM;AAC/D,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CACnB,CAAC,EACD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,IAAI,CAAC,sBAAsB,GAAG,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,CAC1F;AACD,QAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC;IAChC;AAEQ,IAAA,YAAY,CAAC,KAAqB,EAAA;AACxC,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,YAAA,IAAI,CAAC,SAAS,GAAG,KAAK;AACtB,YAAA,IAAI,CAAC,SAAS,GAAG,KAAK;YACtB;QACF;AAEA,QAAA,IAAI,CAAC,SAAS,GAAG,KAAK;QACtB,IAAI,CAAC,cAAc,EAAE;QAErB,IAAI,IAAI,CAAC,QAAQ,EAAE;YAAE;QAErB,IAAI,CAAC,aAAa,EAAE;AAEpB,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC;YAAE;AAEvB,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,GAAG,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS;AACxE,QAAA,MAAM,QAAQ,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,OAAO;AACxD,QAAA,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE;QAE5B,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,GAAG,CAClC,CAAC,EACD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC,CACtE;QACD,IAAI,CAAC,cAAc,EAAE;IACvB;IAEQ,cAAc,GAAA;QACpB,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE;QACxC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE;IACtC;IAEQ,aAAa,GAAA;QACnB,IAAI,CAAC,qBAAqB,EAAE;AAE5B,QAAA,MAAM,YAAY,GAAG,CAAC,KAAY,KAAU;YAC1C,KAAK,CAAC,cAAc,EAAE;YACtB,KAAK,CAAC,wBAAwB,EAAE;YAChC,IAAI,CAAC,qBAAqB,EAAE;AAC9B,QAAA,CAAC;AAED,QAAA,IAAI,CAAC,qBAAqB,GAAG,YAAY;QACzC,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,OAAO,EAAE,YAAY,EAAE,IAAI,CAAC;AAChE,QAAA,IAAI,CAAC,kBAAkB,GAAG,UAAU,CAAC,MAAM,IAAI,CAAC,qBAAqB,EAAE,EAAE,GAAG,CAAC;IAC/E;IAEQ,qBAAqB,GAAA;AAC3B,QAAA,IAAI,IAAI,CAAC,kBAAkB,KAAK,IAAI,EAAE;AACpC,YAAA,YAAY,CAAC,IAAI,CAAC,kBAAkB,CAAC;AACrC,YAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI;QAChC;QAEA,IAAI,CAAC,IAAI,CAAC,qBAAqB;YAAE;AAEjC,QAAA,IAAI,CAAC,aAAa,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,qBAAqB,EAAE,IAAI,CAAC;AACjF,QAAA,IAAI,CAAC,qBAAqB,GAAG,IAAI;IACnC;IAEQ,eAAe,GAAA;AACrB,QAAA,IAAI,IAAI,CAAC,oBAAoB,KAAK,IAAI;YAAE;AAExC,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,wBAAwB,EAAE;AACrD,QAAA,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,cAAc;IACjD;IAEQ,cAAc,GAAA;AACpB,QAAA,IAAI,IAAI,CAAC,gBAAgB,KAAK,IAAI;YAAE;AAEpC,QAAA,IAAI,CAAC,aAAa,GAAG,WAAW,CAAC,GAAG,EAAE;AAEtC,QAAA,MAAM,IAAI,GAAG,CAAC,WAAmB,KAAU;AACzC,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,oBAAoB;AAExC,YAAA,IAAI,MAAM,KAAK,IAAI,EAAE;gBACnB,IAAI,CAAC,aAAa,EAAE;gBACpB;YACF;AAEA,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;AAC/D,YAAA,IAAI,CAAC,aAAa,GAAG,WAAW;AAEhC,YAAA,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;AACtD,YAAA,IAAI,CAAC,cAAc,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,cAAc,IAAI,MAAM;AAC9D,YAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,cAAc,CAAC;AAE7C,YAAA,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,GAAG,EAAE;AAChD,gBAAA,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC;AAChC,gBAAA,IAAI,CAAC,oBAAoB,GAAG,IAAI;gBAChC,IAAI,CAAC,aAAa,EAAE;gBACpB;YACF;AAEA,YAAA,IAAI,CAAC,gBAAgB,GAAG,qBAAqB,CAAC,IAAI,CAAC;AACrD,QAAA,CAAC;AAED,QAAA,IAAI,CAAC,gBAAgB,GAAG,qBAAqB,CAAC,IAAI,CAAC;IACrD;IAEQ,aAAa,GAAA;AACnB,QAAA,IAAI,IAAI,CAAC,gBAAgB,KAAK,IAAI;YAAE;AAEpC,QAAA,oBAAoB,CAAC,IAAI,CAAC,gBAAgB,CAAC;AAC3C,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;IAC9B;8GAvTW,2BAA2B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAA3B,2BAA2B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,oBAAA,EAAA,eAAA,EAAA,EAAA,EAAA,cAAA,EAAA,CAAA,EAAA,SAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAA3B,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBAPvC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,sBAAsB;oBAChC,cAAc,EAAE,CAAC,kBAAkB,CAAC;AACpC,oBAAA,IAAI,EAAE;AACJ,wBAAA,sBAAsB,EAAE,eAAe;AACxC,qBAAA;AACF,iBAAA;;;AClCD;;AAEG;;;;"}
@@ -0,0 +1,220 @@
1
+ import { isPlatformBrowser } from '@angular/common';
2
+ import { AX_STYLE_COLOR_TYPES } from '@acorex/cdk/common';
3
+ import * as i0 from '@angular/core';
4
+ import { inject, ElementRef, DestroyRef, PLATFORM_ID, signal, input, effect, afterNextRender, Directive } from '@angular/core';
5
+
6
+ const SHIMMER_DEFAULT_SPREAD = 'calc(3ch + 40px)';
7
+ const SHIMMER_ANIMATION_KEY = '__axShimmerAnimation';
8
+ /**
9
+ * Applies the shimmer text effect to a host element.
10
+ */
11
+ class AXShimmerDirective {
12
+ constructor() {
13
+ this.hostElement = inject((ElementRef));
14
+ this.destroyRef = inject(DestroyRef);
15
+ this.platformId = inject(PLATFORM_ID);
16
+ this.refresh = signal(0, /* @ts-ignore */
17
+ ...(ngDevMode ? [{ debugName: "refresh" }] : /* istanbul ignore next */ []));
18
+ /**
19
+ * Plays the shimmer animation once instead of looping.
20
+ *
21
+ * @defaultValue false
22
+ */
23
+ this.once = input(false, /* @ts-ignore */
24
+ ...(ngDevMode ? [{ debugName: "once" }] : /* istanbul ignore next */ []));
25
+ /**
26
+ * Reverses the shimmer sweep direction.
27
+ *
28
+ * @defaultValue false
29
+ */
30
+ this.reverse = input(false, /* @ts-ignore */
31
+ ...(ngDevMode ? [{ debugName: "reverse" }] : /* istanbul ignore next */ []));
32
+ /**
33
+ * Disables the shimmer effect and renders normal text.
34
+ *
35
+ * @defaultValue false
36
+ */
37
+ this.disabled = input(false, /* @ts-ignore */
38
+ ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
39
+ /**
40
+ * Duration of one shimmer sweep in milliseconds.
41
+ *
42
+ * @defaultValue 2000
43
+ */
44
+ this.duration = input(2000, /* @ts-ignore */
45
+ ...(ngDevMode ? [{ debugName: "duration" }] : /* istanbul ignore next */ []));
46
+ /**
47
+ * Width of the highlight band. Numbers use the spacing scale; strings accept any CSS length.
48
+ */
49
+ this.spread = input(null, /* @ts-ignore */
50
+ ...(ngDevMode ? [{ debugName: "spread" }] : /* istanbul ignore next */ []));
51
+ /**
52
+ * Tilt of the highlight band in degrees.
53
+ *
54
+ * @defaultValue 20
55
+ */
56
+ this.angle = input(20, /* @ts-ignore */
57
+ ...(ngDevMode ? [{ debugName: "angle" }] : /* istanbul ignore next */ []));
58
+ /**
59
+ * Explicit highlight color. Accepts ACoreX semantic colors (`primary`, `danger`, …) or any CSS color value.
60
+ * Falls back to a tint derived from currentColor when omitted.
61
+ */
62
+ this.color = input(null, /* @ts-ignore */
63
+ ...(ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []));
64
+ this.#syncShimmer = effect(() => {
65
+ this.refresh();
66
+ if (!isPlatformBrowser(this.platformId)) {
67
+ return;
68
+ }
69
+ if (this.disabled() || this.prefersReducedMotion()) {
70
+ this.cancelShimmerAnimation();
71
+ this.clearShimmerStyles();
72
+ return;
73
+ }
74
+ this.applyShimmerStyles({
75
+ spread: this.spread(),
76
+ angle: this.angle(),
77
+ color: this.color(),
78
+ });
79
+ this.restartShimmerAnimation({
80
+ duration: this.duration(),
81
+ once: this.once(),
82
+ reverse: this.reverse(),
83
+ rtl: this.isRtl(),
84
+ });
85
+ }, /* @ts-ignore */
86
+ ...(ngDevMode ? [{ debugName: "#syncShimmer" }] : /* istanbul ignore next */ []));
87
+ afterNextRender(() => {
88
+ if (!isPlatformBrowser(this.platformId)) {
89
+ return;
90
+ }
91
+ const themeObserver = new MutationObserver(() => {
92
+ this.refresh.update((value) => value + 1);
93
+ });
94
+ themeObserver.observe(document.documentElement, {
95
+ attributes: true,
96
+ attributeFilter: ['class', 'dir'],
97
+ });
98
+ const motionQuery = window.matchMedia('(prefers-reduced-motion: reduce)');
99
+ const onMotionPreferenceChange = () => {
100
+ this.refresh.update((value) => value + 1);
101
+ };
102
+ motionQuery.addEventListener('change', onMotionPreferenceChange);
103
+ this.destroyRef.onDestroy(() => {
104
+ themeObserver.disconnect();
105
+ motionQuery.removeEventListener('change', onMotionPreferenceChange);
106
+ this.cancelShimmerAnimation();
107
+ this.clearShimmerStyles();
108
+ });
109
+ });
110
+ }
111
+ #syncShimmer;
112
+ get element() {
113
+ return this.hostElement.nativeElement;
114
+ }
115
+ resolveSpread(spread) {
116
+ if (spread == null || spread === '') {
117
+ return SHIMMER_DEFAULT_SPREAD;
118
+ }
119
+ return typeof spread === 'number' ? `calc(var(--spacing) * ${spread})` : spread;
120
+ }
121
+ isSemanticColor(color) {
122
+ return AX_STYLE_COLOR_TYPES.includes(color);
123
+ }
124
+ resolveHighlightColor(color, isDark) {
125
+ if (!color || color === 'default') {
126
+ return isDark
127
+ ? 'color-mix(in oklch, currentColor 55%, white)'
128
+ : 'color-mix(in oklch, currentColor 30%, transparent)';
129
+ }
130
+ if (this.isSemanticColor(color)) {
131
+ return `var(--color-${color})`;
132
+ }
133
+ return color;
134
+ }
135
+ isDarkMode() {
136
+ return this.element.closest('.dark') !== null || document.documentElement.classList.contains('dark');
137
+ }
138
+ isRtl() {
139
+ const dirHost = this.element.closest('[dir]');
140
+ return dirHost?.getAttribute('dir') === 'rtl' || document.documentElement.getAttribute('dir') === 'rtl';
141
+ }
142
+ prefersReducedMotion() {
143
+ return window.matchMedia('(prefers-reduced-motion: reduce)').matches;
144
+ }
145
+ buildBackgroundImage(angle, spread, highlight) {
146
+ const base = 'currentColor';
147
+ return `linear-gradient(${90 + angle}deg, ${base} calc(50% - ${spread}), color-mix(in oklch, ${highlight}, ${base} 50%) calc(50% - calc(${spread} * 0.5)), ${highlight} 50%, color-mix(in oklch, ${highlight}, ${base} 50%) calc(50% + calc(${spread} * 0.5)), ${base} calc(50% + ${spread}))`;
148
+ }
149
+ applyShimmerStyles(state) {
150
+ const spread = this.resolveSpread(state.spread);
151
+ const highlight = this.resolveHighlightColor(state.color, this.isDarkMode());
152
+ const style = this.element.style;
153
+ style.setProperty('--shimmer-spread', spread);
154
+ style.setProperty('--shimmer-angle', `${state.angle}deg`);
155
+ style.setProperty('--shimmer-color', state.color ?? '');
156
+ style.display = 'inline-block';
157
+ style.backgroundImage = this.buildBackgroundImage(state.angle, spread, highlight);
158
+ style.backgroundRepeat = 'no-repeat';
159
+ style.backgroundSize = `calc(200% + ${spread} * 2) 100%`;
160
+ style.backgroundPosition = '0 0';
161
+ style.backgroundClip = 'text';
162
+ style.setProperty('-webkit-background-clip', 'text');
163
+ style.setProperty('-webkit-text-fill-color', 'transparent');
164
+ }
165
+ clearShimmerStyles() {
166
+ const style = this.element.style;
167
+ style.removeProperty('--shimmer-spread');
168
+ style.removeProperty('--shimmer-angle');
169
+ style.removeProperty('--shimmer-color');
170
+ style.removeProperty('--shimmer-duration');
171
+ style.removeProperty('display');
172
+ style.removeProperty('background-image');
173
+ style.removeProperty('background-repeat');
174
+ style.removeProperty('background-size');
175
+ style.removeProperty('background-position');
176
+ style.removeProperty('background-clip');
177
+ style.removeProperty('-webkit-background-clip');
178
+ style.removeProperty('-webkit-text-fill-color');
179
+ }
180
+ restartShimmerAnimation(options) {
181
+ this.cancelShimmerAnimation();
182
+ this.element.style.setProperty('--shimmer-duration', `${options.duration}ms`);
183
+ let direction = 'normal';
184
+ if (options.reverse) {
185
+ direction = 'reverse';
186
+ }
187
+ else if (options.rtl) {
188
+ direction = 'reverse';
189
+ }
190
+ const animation = this.element.animate([{ backgroundPosition: '100% 0' }, { backgroundPosition: '0 0' }], {
191
+ duration: options.duration,
192
+ iterations: options.once ? 1 : Infinity,
193
+ direction,
194
+ fill: options.once ? 'backwards' : 'auto',
195
+ easing: 'linear',
196
+ });
197
+ this.element[SHIMMER_ANIMATION_KEY] = animation;
198
+ return animation;
199
+ }
200
+ cancelShimmerAnimation() {
201
+ const animation = this.element[SHIMMER_ANIMATION_KEY];
202
+ animation?.cancel();
203
+ delete this.element[SHIMMER_ANIMATION_KEY];
204
+ }
205
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXShimmerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
206
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.8", type: AXShimmerDirective, isStandalone: true, selector: "[axShimmer]", inputs: { once: { classPropertyName: "once", publicName: "once", isSignal: true, isRequired: false, transformFunction: null }, reverse: { classPropertyName: "reverse", publicName: "reverse", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, duration: { classPropertyName: "duration", publicName: "duration", isSignal: true, isRequired: false, transformFunction: null }, spread: { classPropertyName: "spread", publicName: "spread", isSignal: true, isRequired: false, transformFunction: null }, angle: { classPropertyName: "angle", publicName: "angle", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 }); }
207
+ }
208
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXShimmerDirective, decorators: [{
209
+ type: Directive,
210
+ args: [{
211
+ selector: '[axShimmer]',
212
+ }]
213
+ }], ctorParameters: () => [], propDecorators: { once: [{ type: i0.Input, args: [{ isSignal: true, alias: "once", required: false }] }], reverse: [{ type: i0.Input, args: [{ isSignal: true, alias: "reverse", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], duration: [{ type: i0.Input, args: [{ isSignal: true, alias: "duration", required: false }] }], spread: [{ type: i0.Input, args: [{ isSignal: true, alias: "spread", required: false }] }], angle: [{ type: i0.Input, args: [{ isSignal: true, alias: "angle", required: false }] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }] } });
214
+
215
+ /**
216
+ * Generated bundle index. Do not edit.
217
+ */
218
+
219
+ export { AXShimmerDirective };
220
+ //# sourceMappingURL=acorex-cdk-shimmer.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acorex-cdk-shimmer.mjs","sources":["../../../../packages/cdk/shimmer/src/lib/shimmer.directive.ts","../../../../packages/cdk/shimmer/src/acorex-cdk-shimmer.ts"],"sourcesContent":["import { isPlatformBrowser } from '@angular/common';\nimport { AXStyleColorType, AX_STYLE_COLOR_TYPES } from '@acorex/cdk/common';\nimport { afterNextRender, DestroyRef, Directive, effect, ElementRef, inject, input, PLATFORM_ID, signal } from '@angular/core';\n\nconst SHIMMER_DEFAULT_SPREAD = 'calc(3ch + 40px)';\nconst SHIMMER_ANIMATION_KEY = '__axShimmerAnimation';\n\ninterface AXShimmerStyleState {\n spread: string | number | null;\n angle: number;\n color: AXStyleColorType | string | null;\n}\n\ninterface AXShimmerAnimationOptions {\n duration: number;\n once: boolean;\n reverse: boolean;\n rtl: boolean;\n}\n\n/**\n * Applies the shimmer text effect to a host element.\n */\n@Directive({\n selector: '[axShimmer]',\n})\nexport class AXShimmerDirective {\n private readonly hostElement = inject(ElementRef<HTMLElement>);\n private readonly destroyRef = inject(DestroyRef);\n private readonly platformId = inject(PLATFORM_ID);\n private readonly refresh = signal(0);\n\n /**\n * Plays the shimmer animation once instead of looping.\n *\n * @defaultValue false\n */\n once = input(false);\n\n /**\n * Reverses the shimmer sweep direction.\n *\n * @defaultValue false\n */\n reverse = input(false);\n\n /**\n * Disables the shimmer effect and renders normal text.\n *\n * @defaultValue false\n */\n disabled = input(false);\n\n /**\n * Duration of one shimmer sweep in milliseconds.\n *\n * @defaultValue 2000\n */\n duration = input(2000);\n\n /**\n * Width of the highlight band. Numbers use the spacing scale; strings accept any CSS length.\n */\n spread = input<string | number | null>(null);\n\n /**\n * Tilt of the highlight band in degrees.\n *\n * @defaultValue 20\n */\n angle = input(20);\n\n /**\n * Explicit highlight color. Accepts ACoreX semantic colors (`primary`, `danger`, …) or any CSS color value.\n * Falls back to a tint derived from currentColor when omitted.\n */\n color = input<AXStyleColorType | string | null>(null);\n\n constructor() {\n afterNextRender(() => {\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n\n const themeObserver = new MutationObserver(() => {\n this.refresh.update((value) => value + 1);\n });\n themeObserver.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class', 'dir'],\n });\n\n const motionQuery = window.matchMedia('(prefers-reduced-motion: reduce)');\n const onMotionPreferenceChange = () => {\n this.refresh.update((value) => value + 1);\n };\n motionQuery.addEventListener('change', onMotionPreferenceChange);\n\n this.destroyRef.onDestroy(() => {\n themeObserver.disconnect();\n motionQuery.removeEventListener('change', onMotionPreferenceChange);\n this.cancelShimmerAnimation();\n this.clearShimmerStyles();\n });\n });\n }\n\n #syncShimmer = effect(() => {\n this.refresh();\n\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n\n if (this.disabled() || this.prefersReducedMotion()) {\n this.cancelShimmerAnimation();\n this.clearShimmerStyles();\n return;\n }\n\n this.applyShimmerStyles({\n spread: this.spread(),\n angle: this.angle(),\n color: this.color(),\n });\n\n this.restartShimmerAnimation({\n duration: this.duration(),\n once: this.once(),\n reverse: this.reverse(),\n rtl: this.isRtl(),\n });\n });\n\n private get element(): HTMLElement {\n return this.hostElement.nativeElement;\n }\n\n private resolveSpread(spread: string | number | null): string {\n if (spread == null || spread === '') {\n return SHIMMER_DEFAULT_SPREAD;\n }\n\n return typeof spread === 'number' ? `calc(var(--spacing) * ${spread})` : spread;\n }\n\n private isSemanticColor(color: string): color is AXStyleColorType {\n return AX_STYLE_COLOR_TYPES.includes(color as AXStyleColorType);\n }\n\n private resolveHighlightColor(color: AXStyleColorType | string | null, isDark: boolean): string {\n if (!color || color === 'default') {\n return isDark\n ? 'color-mix(in oklch, currentColor 55%, white)'\n : 'color-mix(in oklch, currentColor 30%, transparent)';\n }\n\n if (this.isSemanticColor(color)) {\n return `var(--color-${color})`;\n }\n\n return color;\n }\n\n private isDarkMode(): boolean {\n return this.element.closest('.dark') !== null || document.documentElement.classList.contains('dark');\n }\n\n private isRtl(): boolean {\n const dirHost = this.element.closest('[dir]');\n return dirHost?.getAttribute('dir') === 'rtl' || document.documentElement.getAttribute('dir') === 'rtl';\n }\n\n private prefersReducedMotion(): boolean {\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n }\n\n private buildBackgroundImage(angle: number, spread: string, highlight: string): string {\n const base = 'currentColor';\n\n return `linear-gradient(${90 + angle}deg, ${base} calc(50% - ${spread}), color-mix(in oklch, ${highlight}, ${base} 50%) calc(50% - calc(${spread} * 0.5)), ${highlight} 50%, color-mix(in oklch, ${highlight}, ${base} 50%) calc(50% + calc(${spread} * 0.5)), ${base} calc(50% + ${spread}))`;\n }\n\n private applyShimmerStyles(state: AXShimmerStyleState): void {\n const spread = this.resolveSpread(state.spread);\n const highlight = this.resolveHighlightColor(state.color, this.isDarkMode());\n const style = this.element.style;\n\n style.setProperty('--shimmer-spread', spread);\n style.setProperty('--shimmer-angle', `${state.angle}deg`);\n style.setProperty('--shimmer-color', state.color ?? '');\n\n style.display = 'inline-block';\n style.backgroundImage = this.buildBackgroundImage(state.angle, spread, highlight);\n style.backgroundRepeat = 'no-repeat';\n style.backgroundSize = `calc(200% + ${spread} * 2) 100%`;\n style.backgroundPosition = '0 0';\n style.backgroundClip = 'text';\n style.setProperty('-webkit-background-clip', 'text');\n style.setProperty('-webkit-text-fill-color', 'transparent');\n }\n\n private clearShimmerStyles(): void {\n const style = this.element.style;\n\n style.removeProperty('--shimmer-spread');\n style.removeProperty('--shimmer-angle');\n style.removeProperty('--shimmer-color');\n style.removeProperty('--shimmer-duration');\n style.removeProperty('display');\n style.removeProperty('background-image');\n style.removeProperty('background-repeat');\n style.removeProperty('background-size');\n style.removeProperty('background-position');\n style.removeProperty('background-clip');\n style.removeProperty('-webkit-background-clip');\n style.removeProperty('-webkit-text-fill-color');\n }\n\n private restartShimmerAnimation(options: AXShimmerAnimationOptions): Animation | null {\n this.cancelShimmerAnimation();\n\n this.element.style.setProperty('--shimmer-duration', `${options.duration}ms`);\n\n let direction: PlaybackDirection = 'normal';\n if (options.reverse) {\n direction = 'reverse';\n } else if (options.rtl) {\n direction = 'reverse';\n }\n\n const animation = this.element.animate([{ backgroundPosition: '100% 0' }, { backgroundPosition: '0 0' }], {\n duration: options.duration,\n iterations: options.once ? 1 : Infinity,\n direction,\n fill: options.once ? 'backwards' : 'auto',\n easing: 'linear',\n });\n\n (this.element as HTMLElement & { [SHIMMER_ANIMATION_KEY]?: Animation })[SHIMMER_ANIMATION_KEY] = animation;\n return animation;\n }\n\n private cancelShimmerAnimation(): void {\n const animation = (this.element as HTMLElement & { [SHIMMER_ANIMATION_KEY]?: Animation })[SHIMMER_ANIMATION_KEY];\n animation?.cancel();\n delete (this.element as HTMLElement & { [SHIMMER_ANIMATION_KEY]?: Animation })[SHIMMER_ANIMATION_KEY];\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}