@acorex/cdk 22.1.8 → 22.2.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,7 +1,6 @@
1
1
  import * as i0 from '@angular/core';
2
- import { inject, ElementRef, DestroyRef, input, booleanAttribute, output, afterRenderEffect, Directive, computed, ViewEncapsulation, ChangeDetectionStrategy, Component, Pipe } from '@angular/core';
2
+ import { inject, ElementRef, DestroyRef, input, booleanAttribute, output, afterRenderEffect, Directive, Pipe } from '@angular/core';
3
3
  import { AXHighlightService, splitHighlightSegments } from '@acorex/core/utils';
4
- import { DomSanitizer } from '@angular/platform-browser';
5
4
 
6
5
  /**
7
6
  * Directive that highlights text within the host element or its descendants.
@@ -80,75 +79,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
80
79
  }]
81
80
  }], ctorParameters: () => [], propDecorators: { axHighlight: [{ type: i0.Input, args: [{ isSignal: true, alias: "axHighlight", required: false }] }], highlightSelector: [{ type: i0.Input, args: [{ isSignal: true, alias: "highlightSelector", required: false }] }], highlightOptions: [{ type: i0.Input, args: [{ isSignal: true, alias: "highlightOptions", required: false }] }], highlightDisabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "highlightDisabled", required: false }] }], matchCount: [{ type: i0.Output, args: ["matchCount"] }] } });
82
81
 
83
- /**
84
- * Renders text with search-term matches wrapped in `.ax-highlight` spans.
85
- *
86
- * Uses a single innerHTML string so Angular control-flow whitespace cannot insert
87
- * gaps between highlighted and non-highlighted characters.
88
- *
89
- * Does not use the `ax-highlight-text` class on the host — that class is reserved for
90
- * {@link AXHighlightService} DOM wrappers.
91
- */
92
- class AXHighlightTextComponent {
93
- constructor() {
94
- this.sanitizer = inject(DomSanitizer);
95
- /** The full text to render. */
96
- this.text = input('', /* @ts-ignore */
97
- ...(ngDevMode ? [{ debugName: "text" }] : /* istanbul ignore next */ []));
98
- /** The search term or terms to highlight within the text. */
99
- this.query = input('', /* @ts-ignore */
100
- ...(ngDevMode ? [{ debugName: "query" }] : /* istanbul ignore next */ []));
101
- /** When true, highlighting is disabled and plain text is shown. */
102
- this.highlightDisabled = input(false, { ...(ngDevMode ? { debugName: "highlightDisabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
103
- /** Optional highlight behavior configuration. */
104
- this.highlightOptions = input(/* @ts-ignore */
105
- ...(ngDevMode ? [undefined, { debugName: "highlightOptions" }] : /* istanbul ignore next */ []));
106
- this.segments = computed(() => {
107
- const content = this.text() ?? '';
108
- if (this.highlightDisabled()) {
109
- return content ? [{ text: content, match: false }] : [];
110
- }
111
- const query = this.query();
112
- const terms = Array.isArray(query) ? query : [query];
113
- const normalized = terms.map((value) => value.trim()).filter(Boolean);
114
- if (!normalized.length) {
115
- return content ? [{ text: content, match: false }] : [];
116
- }
117
- return splitHighlightSegments(content, normalized, this.highlightOptions());
118
- }, /* @ts-ignore */
119
- ...(ngDevMode ? [{ debugName: "segments" }] : /* istanbul ignore next */ []));
120
- this.highlightedHtml = computed(() => {
121
- const segments = this.segments();
122
- if (!segments.length) {
123
- return this.sanitizer.bypassSecurityTrustHtml('');
124
- }
125
- const html = segments
126
- .map((segment) => segment.match
127
- ? `<span class="ax-highlight">${this.#escapeHtml(segment.text)}</span>`
128
- : this.#escapeHtml(segment.text))
129
- .join('');
130
- return this.sanitizer.bypassSecurityTrustHtml(html);
131
- }, /* @ts-ignore */
132
- ...(ngDevMode ? [{ debugName: "highlightedHtml" }] : /* istanbul ignore next */ []));
133
- }
134
- #escapeHtml(value) {
135
- return value
136
- .replace(/&/g, '&amp;')
137
- .replace(/</g, '&lt;')
138
- .replace(/>/g, '&gt;')
139
- .replace(/"/g, '&quot;')
140
- .replace(/'/g, '&#39;');
141
- }
142
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXHighlightTextComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
143
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.8", type: AXHighlightTextComponent, isStandalone: true, selector: "ax-highlight-text", inputs: { text: { classPropertyName: "text", publicName: "text", isSignal: true, isRequired: false, transformFunction: null }, query: { classPropertyName: "query", publicName: "query", isSignal: true, isRequired: false, transformFunction: null }, highlightDisabled: { classPropertyName: "highlightDisabled", publicName: "highlightDisabled", isSignal: true, isRequired: false, transformFunction: null }, highlightOptions: { classPropertyName: "highlightOptions", publicName: "highlightOptions", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "ax-highlight-text-root" }, ngImport: i0, template: `<span class="ax-highlight-text-content" [innerHTML]="highlightedHtml()"></span>`, isInline: true, styles: ["ax-highlight-text.ax-highlight-text-root{display:contents}ax-highlight-text .ax-highlight-text-content{display:inline;margin:0;padding:0;font:inherit;letter-spacing:inherit;word-spacing:inherit}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
144
- }
145
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXHighlightTextComponent, decorators: [{
146
- type: Component,
147
- args: [{ selector: 'ax-highlight-text', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
148
- class: 'ax-highlight-text-root',
149
- }, template: `<span class="ax-highlight-text-content" [innerHTML]="highlightedHtml()"></span>`, styles: ["ax-highlight-text.ax-highlight-text-root{display:contents}ax-highlight-text .ax-highlight-text-content{display:inline;margin:0;padding:0;font:inherit;letter-spacing:inherit;word-spacing:inherit}\n"] }]
150
- }], propDecorators: { text: [{ type: i0.Input, args: [{ isSignal: true, alias: "text", required: false }] }], query: [{ type: i0.Input, args: [{ isSignal: true, alias: "query", required: false }] }], highlightDisabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "highlightDisabled", required: false }] }], highlightOptions: [{ type: i0.Input, args: [{ isSignal: true, alias: "highlightOptions", required: false }] }] } });
151
-
152
82
  /**
153
83
  * Pure pipe that splits text into highlight segments for template rendering.
154
84
  */
@@ -174,5 +104,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
174
104
  * Generated bundle index. Do not edit.
175
105
  */
176
106
 
177
- export { AXHighlightDirective, AXHighlightTextComponent, AXHighlightTextPipe };
107
+ export { AXHighlightDirective, AXHighlightTextPipe };
178
108
  //# sourceMappingURL=acorex-cdk-highlight.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"acorex-cdk-highlight.mjs","sources":["../../../../packages/cdk/highlight/src/lib/highlight.directive.ts","../../../../packages/cdk/highlight/src/lib/highlight-text.component.ts","../../../../packages/cdk/highlight/src/lib/highlight-text.pipe.ts","../../../../packages/cdk/highlight/src/acorex-cdk-highlight.ts"],"sourcesContent":["import {\n afterRenderEffect,\n booleanAttribute,\n DestroyRef,\n Directive,\n ElementRef,\n inject,\n input,\n output,\n} from '@angular/core';\nimport { AXHighlightOptions, AXHighlightService } from '@acorex/core/utils';\n\n/**\n * Directive that highlights text within the host element or its descendants.\n *\n * Usage:\n * ```html\n * <div [axHighlight]=\"query()\">...</div>\n * <table [axHighlight]=\"query()\" highlightSelector=\"tbody td\">...</table>\n * ```\n */\n@Directive({\n selector: '[axHighlight]',\n})\nexport class AXHighlightDirective {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly destroyRef = inject(DestroyRef);\n private readonly highlightService = inject(AXHighlightService);\n\n /**\n * Text or list of texts to search and highlight.\n */\n readonly axHighlight = input<string | readonly string[]>('');\n\n /**\n * Optional CSS selector scoped to the host element.\n * When omitted, highlighting is applied to the host element itself.\n */\n readonly highlightSelector = input<string>();\n\n /**\n * Optional highlight behavior configuration.\n */\n readonly highlightOptions = input<AXHighlightOptions>();\n\n /**\n * When true, highlighting is disabled and any existing highlights are cleared.\n */\n readonly highlightDisabled = input(false, { transform: booleanAttribute });\n\n /**\n * Emits the number of matches highlighted after each render cycle.\n */\n readonly matchCount = output<number>();\n\n constructor() {\n afterRenderEffect(() => {\n const target = this.resolveTarget();\n\n if (this.highlightDisabled()) {\n this.highlightService.clear(target);\n this.matchCount.emit(0);\n return;\n }\n\n const terms = this.axHighlight();\n const normalizedTerms = (Array.isArray(terms) ? terms : [terms]).map((term) => term.trim()).filter(Boolean);\n\n if (!normalizedTerms.length) {\n this.highlightService.clear(target);\n this.matchCount.emit(0);\n return;\n }\n\n const count = this.highlightService.highlight(target, normalizedTerms, this.highlightOptions());\n this.matchCount.emit(count);\n });\n\n this.destroyRef.onDestroy(() => {\n this.highlightService.clear(this.resolveTarget());\n });\n }\n\n private resolveTarget(): Element | Element[] {\n const selector = this.highlightSelector()?.trim();\n const hostElement = this.host.nativeElement;\n\n if (!selector) {\n return hostElement;\n }\n\n return Array.from(hostElement.querySelectorAll(selector));\n }\n}\n","import { AXHighlightOptions, AXHighlightSegment, splitHighlightSegments } from '@acorex/core/utils';\nimport {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n booleanAttribute,\n computed,\n inject,\n input,\n} from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\n\n/**\n * Renders text with search-term matches wrapped in `.ax-highlight` spans.\n *\n * Uses a single innerHTML string so Angular control-flow whitespace cannot insert\n * gaps between highlighted and non-highlighted characters.\n *\n * Does not use the `ax-highlight-text` class on the host — that class is reserved for\n * {@link AXHighlightService} DOM wrappers.\n */\n@Component({\n selector: 'ax-highlight-text',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'ax-highlight-text-root',\n },\n styles: [\n `\n ax-highlight-text.ax-highlight-text-root {\n display: contents;\n }\n\n ax-highlight-text .ax-highlight-text-content {\n display: inline;\n margin: 0;\n padding: 0;\n font: inherit;\n letter-spacing: inherit;\n word-spacing: inherit;\n }\n `,\n ],\n template: `<span class=\"ax-highlight-text-content\" [innerHTML]=\"highlightedHtml()\"></span>`,\n})\nexport class AXHighlightTextComponent {\n private readonly sanitizer = inject(DomSanitizer);\n\n /** The full text to render. */\n readonly text = input('');\n\n /** The search term or terms to highlight within the text. */\n readonly query = input<string | readonly string[]>('');\n\n /** When true, highlighting is disabled and plain text is shown. */\n readonly highlightDisabled = input(false, { transform: booleanAttribute });\n\n /** Optional highlight behavior configuration. */\n readonly highlightOptions = input<AXHighlightOptions>();\n\n protected readonly segments = computed((): AXHighlightSegment[] => {\n const content = this.text() ?? '';\n if (this.highlightDisabled()) {\n return content ? [{ text: content, match: false }] : [];\n }\n\n const query = this.query();\n const terms = Array.isArray(query) ? query : [query];\n const normalized = terms.map((value) => value.trim()).filter(Boolean);\n if (!normalized.length) {\n return content ? [{ text: content, match: false }] : [];\n }\n\n return splitHighlightSegments(content, normalized, this.highlightOptions());\n });\n\n protected readonly highlightedHtml = computed((): SafeHtml => {\n const segments = this.segments();\n if (!segments.length) {\n return this.sanitizer.bypassSecurityTrustHtml('');\n }\n\n const html = segments\n .map((segment) =>\n segment.match\n ? `<span class=\"ax-highlight\">${this.#escapeHtml(segment.text)}</span>`\n : this.#escapeHtml(segment.text),\n )\n .join('');\n\n return this.sanitizer.bypassSecurityTrustHtml(html);\n });\n\n #escapeHtml(value: string): string {\n return value\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;');\n }\n}\n","import { AXHighlightOptions, AXHighlightSegment, splitHighlightSegments } from '@acorex/core/utils';\nimport { Pipe, PipeTransform } from '@angular/core';\n\n/**\n * Pure pipe that splits text into highlight segments for template rendering.\n */\n@Pipe({\n name: 'axHighlightText',\n})\nexport class AXHighlightTextPipe implements PipeTransform {\n transform(\n text: string | null | undefined,\n query: string | readonly string[] | null | undefined,\n options?: AXHighlightOptions,\n ): AXHighlightSegment[] {\n const content = text ?? '';\n if (query == null) {\n return content ? [{ text: content, match: false }] : [];\n }\n\n return splitHighlightSegments(content, query, options);\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-highlight.mjs","sources":["../../../../packages/cdk/highlight/src/lib/highlight.directive.ts","../../../../packages/cdk/highlight/src/lib/highlight-text.pipe.ts","../../../../packages/cdk/highlight/src/acorex-cdk-highlight.ts"],"sourcesContent":["import {\n afterRenderEffect,\n booleanAttribute,\n DestroyRef,\n Directive,\n ElementRef,\n inject,\n input,\n output,\n} from '@angular/core';\nimport { AXHighlightOptions, AXHighlightService } from '@acorex/core/utils';\n\n/**\n * Directive that highlights text within the host element or its descendants.\n *\n * Usage:\n * ```html\n * <div [axHighlight]=\"query()\">...</div>\n * <table [axHighlight]=\"query()\" highlightSelector=\"tbody td\">...</table>\n * ```\n */\n@Directive({\n selector: '[axHighlight]',\n})\nexport class AXHighlightDirective {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly destroyRef = inject(DestroyRef);\n private readonly highlightService = inject(AXHighlightService);\n\n /**\n * Text or list of texts to search and highlight.\n */\n readonly axHighlight = input<string | readonly string[]>('');\n\n /**\n * Optional CSS selector scoped to the host element.\n * When omitted, highlighting is applied to the host element itself.\n */\n readonly highlightSelector = input<string>();\n\n /**\n * Optional highlight behavior configuration.\n */\n readonly highlightOptions = input<AXHighlightOptions>();\n\n /**\n * When true, highlighting is disabled and any existing highlights are cleared.\n */\n readonly highlightDisabled = input(false, { transform: booleanAttribute });\n\n /**\n * Emits the number of matches highlighted after each render cycle.\n */\n readonly matchCount = output<number>();\n\n constructor() {\n afterRenderEffect(() => {\n const target = this.resolveTarget();\n\n if (this.highlightDisabled()) {\n this.highlightService.clear(target);\n this.matchCount.emit(0);\n return;\n }\n\n const terms = this.axHighlight();\n const normalizedTerms = (Array.isArray(terms) ? terms : [terms]).map((term) => term.trim()).filter(Boolean);\n\n if (!normalizedTerms.length) {\n this.highlightService.clear(target);\n this.matchCount.emit(0);\n return;\n }\n\n const count = this.highlightService.highlight(target, normalizedTerms, this.highlightOptions());\n this.matchCount.emit(count);\n });\n\n this.destroyRef.onDestroy(() => {\n this.highlightService.clear(this.resolveTarget());\n });\n }\n\n private resolveTarget(): Element | Element[] {\n const selector = this.highlightSelector()?.trim();\n const hostElement = this.host.nativeElement;\n\n if (!selector) {\n return hostElement;\n }\n\n return Array.from(hostElement.querySelectorAll(selector));\n }\n}\n","import { AXHighlightOptions, AXHighlightSegment, splitHighlightSegments } from '@acorex/core/utils';\nimport { Pipe, PipeTransform } from '@angular/core';\n\n/**\n * Pure pipe that splits text into highlight segments for template rendering.\n */\n@Pipe({\n name: 'axHighlightText',\n})\nexport class AXHighlightTextPipe implements PipeTransform {\n transform(\n text: string | null | undefined,\n query: string | readonly string[] | null | undefined,\n options?: AXHighlightOptions,\n ): AXHighlightSegment[] {\n const content = text ?? '';\n if (query == null) {\n return content ? [{ text: content, match: false }] : [];\n }\n\n return splitHighlightSegments(content, query, options);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
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
6
  import { inject, ElementRef, PLATFORM_ID, NgZone, DestroyRef, input, linkedSignal, effect, afterNextRender, Directive } from '@angular/core';
6
7
 
@@ -56,6 +57,7 @@ class AXHorizontalScrollDirective {
56
57
  this.panStartScrollPosition = 0;
57
58
  this.suppressClickListener = null;
58
59
  this.suppressClickTimer = null;
60
+ this._isRtl = false;
59
61
  this.interactiveSelector = 'input, textarea, select, option, [contenteditable]:not([contenteditable="false"])';
60
62
  this.wheelListener = (event) => this.handleWheel(event);
61
63
  this.#orientationEffect = effect(() => {
@@ -65,6 +67,7 @@ class AXHorizontalScrollDirective {
65
67
  this.#init = afterNextRender(() => {
66
68
  if (!isPlatformBrowser(this.platformId))
67
69
  return;
70
+ this._isRtl = AXHtmlUtil.isRtl(this.nativeElement);
68
71
  this.zone.runOutsideAngular(() => {
69
72
  this.nativeElement.addEventListener('wheel', this.wheelListener, { passive: false });
70
73
  });
@@ -96,8 +99,19 @@ class AXHorizontalScrollDirective {
96
99
  isHorizontal() {
97
100
  return this.scrollOrientation() === 'horizontal';
98
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
+ }
99
110
  getCurrentScrollPosition() {
100
- return this.isHorizontal() ? this.nativeElement.scrollLeft : this.nativeElement.scrollTop;
111
+ if (this.isHorizontal()) {
112
+ return this.nativeElement.scrollLeft * this.rtlSign;
113
+ }
114
+ return this.nativeElement.scrollTop;
101
115
  }
102
116
  getMaxScrollPosition() {
103
117
  const element = this.nativeElement;
@@ -114,7 +128,7 @@ class AXHorizontalScrollDirective {
114
128
  applyScrollPosition(position) {
115
129
  this.scrollPosition = position;
116
130
  if (this.isHorizontal()) {
117
- this.nativeElement.scrollLeft = position;
131
+ this.nativeElement.scrollLeft = position * this.rtlSign;
118
132
  }
119
133
  else {
120
134
  this.nativeElement.scrollTop = position;
@@ -134,15 +148,17 @@ class AXHorizontalScrollDirective {
134
148
  return;
135
149
  if (event.deltaY === 0)
136
150
  return;
151
+ this.refreshRtlState();
137
152
  const maxScroll = this.getMaxScrollPosition();
153
+ const step = event.deltaY * this.rtlSign;
138
154
  this.syncScrollState();
139
155
  const currentPosition = this.targetScrollPosition ?? this.scrollPosition;
140
- const atStart = currentPosition <= 0 && event.deltaY < 0;
141
- const atEnd = currentPosition >= maxScroll && event.deltaY > 0;
156
+ const atStart = currentPosition <= 0 && step < 0;
157
+ const atEnd = currentPosition >= maxScroll && step > 0;
142
158
  if (atStart || atEnd)
143
159
  return;
144
160
  event.preventDefault();
145
- const nextTarget = Math.max(0, Math.min(maxScroll, currentPosition + event.deltaY));
161
+ const nextTarget = Math.max(0, Math.min(maxScroll, currentPosition + step));
146
162
  this.targetScrollPosition = nextTarget;
147
163
  if (this.speed() <= 0) {
148
164
  this.applyScrollPosition(nextTarget);
@@ -160,6 +176,7 @@ class AXHorizontalScrollDirective {
160
176
  this.ignorePan = true;
161
177
  return;
162
178
  }
179
+ this.refreshRtlState();
163
180
  this.ignorePan = false;
164
181
  this.isPanning = true;
165
182
  this.stopAnimation();
@@ -176,7 +193,7 @@ class AXHorizontalScrollDirective {
176
193
  return;
177
194
  event.preventDefault();
178
195
  const delta = this.isHorizontal() ? event.deltaX : event.deltaY;
179
- const next = Math.max(0, Math.min(this.getMaxScrollPosition(), this.panStartScrollPosition - delta));
196
+ const next = Math.max(0, Math.min(this.getMaxScrollPosition(), this.panStartScrollPosition - delta * this.rtlSign));
180
197
  this.applyScrollPosition(next);
181
198
  }
182
199
  handlePanEnd(event) {
@@ -193,7 +210,7 @@ class AXHorizontalScrollDirective {
193
210
  if (this.speed() <= 0)
194
211
  return;
195
212
  const velocity = this.isHorizontal() ? event.velocityX : event.velocityY;
196
- const distance = -velocity * this.speed();
213
+ const distance = -velocity * this.speed() * this.rtlSign;
197
214
  if (Math.abs(distance) < 8)
198
215
  return;
199
216
  this.targetScrollPosition = Math.max(0, Math.min(this.getMaxScrollPosition(), this.scrollPosition + distance));
@@ -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 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\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.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 getCurrentScrollPosition(): number {\n return this.isHorizontal() ? this.nativeElement.scrollLeft : 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;\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 const maxScroll = this.getMaxScrollPosition();\n\n this.syncScrollState();\n\n const currentPosition = this.targetScrollPosition ?? this.scrollPosition;\n const atStart = currentPosition <= 0 && event.deltaY < 0;\n const atEnd = currentPosition >= maxScroll && event.deltaY > 0;\n\n if (atStart || atEnd) return;\n\n event.preventDefault();\n\n const nextTarget = Math.max(0, Math.min(maxScroll, currentPosition + event.deltaY));\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.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(0, Math.min(this.getMaxScrollPosition(), this.panStartScrollPosition - delta));\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();\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":";;;;;;AAgBA;;;;;;;;;;AAUG;MAQU,2BAA2B,CAAA;IA2C5B,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;AA/CiB,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;QAEtD,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;AAEzC,YAAA,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAK;AAC/B,gBAAA,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AACtF,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;AAtBA,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;IAQL,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC;YAAE;QAEzC,IAAI,CAAC,aAAa,EAAE;QACpB,IAAI,CAAC,cAAc,EAAE;QACrB,IAAI,CAAC,qBAAqB,EAAE;QAC5B,IAAI,CAAC,aAAa,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC;IACrE;AAEA,IAAA,IAAY,aAAa,GAAA;AACvB,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,aAAa;IACtC;IAEQ,YAAY,GAAA;AAClB,QAAA,OAAO,IAAI,CAAC,iBAAiB,EAAE,KAAK,YAAY;IAClD;IAEQ,wBAAwB,GAAA;QAC9B,OAAO,IAAI,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS;IAC3F;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;AACvB,YAAA,IAAI,CAAC,aAAa,CAAC,UAAU,GAAG,QAAQ;QAC1C;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;AAExB,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,oBAAoB,EAAE;QAE7C,IAAI,CAAC,eAAe,EAAE;QAEtB,MAAM,eAAe,GAAG,IAAI,CAAC,oBAAoB,IAAI,IAAI,CAAC,cAAc;QACxE,MAAM,OAAO,GAAG,eAAe,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QACxD,MAAM,KAAK,GAAG,eAAe,IAAI,SAAS,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAE9D,IAAI,OAAO,IAAI,KAAK;YAAE;QAEtB,KAAK,CAAC,cAAc,EAAE;QAEtB,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,eAAe,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;AACnF,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;AAEA,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;QAC/D,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,IAAI,CAAC,sBAAsB,GAAG,KAAK,CAAC,CAAC;AACpG,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;QACxE,MAAM,QAAQ,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,EAAE;AACzC,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;8GAhSW,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;;;ACjCD;;AAEG;;;;"}
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":"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"}
@@ -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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"}
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@acorex/cdk",
3
- "version": "22.1.8",
3
+ "version": "22.2.0",
4
4
  "peerDependencies": {
5
- "@acorex/core": "22.1.8",
5
+ "@acorex/core": "22.2.0",
6
6
  "quill": ">=2.0.2",
7
7
  "qrcode": ">=1.5.4",
8
8
  "swiper": ">=11.1.15",
@@ -104,6 +104,10 @@
104
104
  "types": "./types/acorex-cdk-selection.d.ts",
105
105
  "default": "./fesm2022/acorex-cdk-selection.mjs"
106
106
  },
107
+ "./shimmer": {
108
+ "types": "./types/acorex-cdk-shimmer.d.ts",
109
+ "default": "./fesm2022/acorex-cdk-shimmer.mjs"
110
+ },
107
111
  "./sliding-item": {
108
112
  "types": "./types/acorex-cdk-sliding-item.d.ts",
109
113
  "default": "./fesm2022/acorex-cdk-sliding-item.mjs"
@@ -0,0 +1,11 @@
1
+ # @acorex/cdk/shimmer
2
+
3
+ Text shimmer directive for loading or streaming states.
4
+
5
+ ```typescript
6
+ import { AXShimmerDirective } from '@acorex/cdk/shimmer';
7
+ ```
8
+
9
+ ```html
10
+ <p class="text-sm text-neutral-500" axShimmer>Generating response…</p>
11
+ ```