@shival99/z-ui 2.4.7 → 2.4.9

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.
@@ -2,27 +2,15 @@ import * as i0 from '@angular/core';
2
2
  import { input, inject, ElementRef, Renderer2, Directive } from '@angular/core';
3
3
  import { zTransform } from '@shival99/z-ui/utils';
4
4
 
5
- /** Counter-scales border-radius across a non-uniform scale() so corners don't squash into an ellipse mid-glide. */
6
- function zHoverGlideRadiusKeyframes(radius, scaleX, scaleY) {
7
- const steps = 12;
8
- return Array.from({ length: steps }, (_, index) => {
9
- const progress = index / (steps - 1);
10
- const x = scaleX + (1 - scaleX) * progress;
11
- const y = scaleY + (1 - scaleY) * progress;
12
- return { borderRadius: `${radius / x}px / ${radius / y}px` };
13
- });
14
- }
15
-
16
5
  /**
17
6
  * Shared sliding hover highlight for item lists (select options, autocomplete options, command
18
7
  * items, dropdown-menu items, ...). One absolutely-positioned box glides between hovered items
19
8
  * instead of each item toggling its own background — matches the "motion highlight" pattern from
20
9
  * animate-ui.
21
10
  *
22
- * The box's width/height are written once per move (a single layout op, same as any re-render) and
23
- * never transitioned only `transform` (translate + a briefly non-1 scale) animates via the Web
24
- * Animations API, so the glide runs on the compositor and never re-triggers layout on the frames in
25
- * between, which is what a CSS `transition` on width/height would otherwise do on every tick.
11
+ * The box's geometry is updated once per move. Pixel-aligned boxes use a compositor animation;
12
+ * fractional geometry (common at browser zoom levels) uses layout-property animation instead, so
13
+ * Chromium never has to rasterize a transformed text layer at a fractional device-pixel offset.
26
14
  *
27
15
  * Usage: put `[zHoverGlide]` on the scrollable/list container and give each hoverable item a
28
16
  * `data-glide-item` attribute (or pass a custom `[zHoverGlideSelector]`). Works with virtualized
@@ -173,7 +161,9 @@ class ZHoverGlideDirective {
173
161
  el.style.top = '0';
174
162
  el.style.left = '0';
175
163
  el.style.margin = '0';
176
- el.style.zIndex = '0';
164
+ // Keep the highlight behind item content without requiring every consumer to add a z-index.
165
+ // The host's isolated stacking context keeps this negative layer above the host background.
166
+ el.style.zIndex = '-1';
177
167
  el.style.opacity = '0';
178
168
  el.style.pointerEvents = 'none';
179
169
  el.style.transition = this._prefersReducedMotion ? 'none' : 'opacity 120ms ease-out';
@@ -187,29 +177,34 @@ class ZHoverGlideDirective {
187
177
  const container = this._elementRef.nativeElement;
188
178
  const containerRect = container.getBoundingClientRect();
189
179
  const targetRect = target.getBoundingClientRect();
190
- // Whole pixels only — a fractional box makes the browser re-snap subpixel rounding on every
191
- // frame, which reads as the surrounding content faintly jittering.
192
180
  const next = {
193
- x: Math.round(targetRect.left - containerRect.left + container.scrollLeft),
194
- y: Math.round(targetRect.top - containerRect.top + container.scrollTop),
195
- w: Math.round(targetRect.width),
196
- h: Math.round(targetRect.height),
181
+ x: targetRect.left - containerRect.left + container.scrollLeft,
182
+ y: targetRect.top - containerRect.top + container.scrollTop,
183
+ w: targetRect.width,
184
+ h: targetRect.height,
197
185
  };
198
186
  const previous = this._box;
199
187
  this._box = next;
200
188
  this._cancelAnimations();
201
- // Size and final position are a single, un-animated write — identical cost to any other
202
- // re-render. Only `transform` animates from here, so the glide itself never re-triggers layout.
203
189
  el.style.width = `${next.w}px`;
204
190
  el.style.height = `${next.h}px`;
205
- el.style.transform = `translate(${next.x}px, ${next.y}px)`;
206
191
  el.style.borderRadius = '';
207
192
  el.style.opacity = '1';
193
+ const canUseTransform = previous
194
+ ? this._canUseTransformAnimation(previous, next)
195
+ : this._canUseTransformAnimation(next);
208
196
  if (!previous || !shouldAnimate || this._prefersReducedMotion || typeof el.animate !== 'function') {
197
+ if (!canUseTransform) {
198
+ el.style.transform = 'none';
199
+ el.style.left = `${next.x}px`;
200
+ el.style.top = `${next.y}px`;
201
+ return;
202
+ }
203
+ el.style.left = '0';
204
+ el.style.top = '0';
205
+ el.style.transform = `translate(${next.x}px, ${next.y}px)`;
209
206
  return;
210
207
  }
211
- const scaleX = previous.w / next.w;
212
- const scaleY = previous.h / next.h;
213
208
  const options = { duration: 180, easing: 'cubic-bezier(0.22, 1, 0.36, 1)' };
214
209
  const animationGeneration = this._animationGeneration;
215
210
  let activeAnimationCount = 0;
@@ -229,20 +224,41 @@ class ZHoverGlideDirective {
229
224
  animation.addEventListener('cancel', cleanup, { once: true });
230
225
  this._animations.push(animation);
231
226
  };
232
- // `will-change` only for the animation's own lifetime: pinning it permanently keeps this
233
- // element on its own compositor layer at rest too, which makes Chromium periodically
234
- // re-rasterize the item text sitting on top of it at a slightly different subpixel offset —
235
- // seen as the text flashing blurry-then-sharp even though nothing has actually moved.
236
- el.style.willChange = 'transform';
237
- const transformAnimation = el.animate([
238
- { transform: `translate(${previous.x}px, ${previous.y}px) scale(${scaleX}, ${scaleY})` },
227
+ if (!canUseTransform) {
228
+ el.style.transform = 'none';
229
+ el.style.left = `${next.x}px`;
230
+ el.style.top = `${next.y}px`;
231
+ trackAnimation(el.animate([
232
+ {
233
+ left: `${previous.x}px`,
234
+ top: `${previous.y}px`,
235
+ width: `${previous.w}px`,
236
+ height: `${previous.h}px`,
237
+ },
238
+ { left: `${next.x}px`, top: `${next.y}px`, width: `${next.w}px`, height: `${next.h}px` },
239
+ ], options));
240
+ return;
241
+ }
242
+ el.style.left = '0';
243
+ el.style.top = '0';
244
+ el.style.transform = `translate(${next.x}px, ${next.y}px)`;
245
+ trackAnimation(el.animate([
246
+ { transform: `translate(${previous.x}px, ${previous.y}px)` },
239
247
  { transform: `translate(${next.x}px, ${next.y}px)` },
240
- ], options);
241
- trackAnimation(transformAnimation);
242
- const radius = parseFloat(getComputedStyle(el).borderTopLeftRadius) || 0;
243
- if (radius > 0 && (scaleX !== 1 || scaleY !== 1)) {
244
- trackAnimation(el.animate(zHoverGlideRadiusKeyframes(radius, scaleX, scaleY), options));
248
+ ], options));
249
+ }
250
+ _canUseTransformAnimation(...boxes) {
251
+ const pixelRatio = typeof window !== 'undefined' ? window.devicePixelRatio || 1 : 1;
252
+ const viewportScale = typeof window !== 'undefined' ? window.visualViewport?.scale || 1 : 1;
253
+ if (Math.abs(pixelRatio - Math.round(pixelRatio)) > 0.001 || Math.abs(viewportScale - 1) > 0.001) {
254
+ return false;
245
255
  }
256
+ return boxes
257
+ .flatMap(box => [box.x, box.y, box.w, box.h])
258
+ .every(value => {
259
+ const devicePixels = value * pixelRatio;
260
+ return Math.abs(devicePixels - Math.round(devicePixels)) < 0.001;
261
+ });
246
262
  }
247
263
  _fadeOut() {
248
264
  this._cancelAnimations();
@@ -288,7 +304,7 @@ class ZHoverGlideDirective {
288
304
  element.remove();
289
305
  }
290
306
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: ZHoverGlideDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
291
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.6", type: ZHoverGlideDirective, isStandalone: true, selector: "[zHoverGlide]", inputs: { zHoverGlideSelector: { classPropertyName: "zHoverGlideSelector", publicName: "zHoverGlideSelector", isSignal: true, isRequired: false, transformFunction: null }, zHoverGlideClass: { classPropertyName: "zHoverGlideClass", publicName: "zHoverGlideClass", isSignal: true, isRequired: false, transformFunction: null }, zHoverGlideDisabled: { classPropertyName: "zHoverGlideDisabled", publicName: "zHoverGlideDisabled", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "pointerover": "_onPointerOver($event)", "pointerout": "_onPointerOut($event)", "pointermove": "_onPointerMove($event)", "pointerleave": "_onPointerLeave()", "scroll": "_onScroll()" }, classAttribute: "relative" }, ngImport: i0 });
307
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.6", type: ZHoverGlideDirective, isStandalone: true, selector: "[zHoverGlide]", inputs: { zHoverGlideSelector: { classPropertyName: "zHoverGlideSelector", publicName: "zHoverGlideSelector", isSignal: true, isRequired: false, transformFunction: null }, zHoverGlideClass: { classPropertyName: "zHoverGlideClass", publicName: "zHoverGlideClass", isSignal: true, isRequired: false, transformFunction: null }, zHoverGlideDisabled: { classPropertyName: "zHoverGlideDisabled", publicName: "zHoverGlideDisabled", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "pointerover": "_onPointerOver($event)", "pointerout": "_onPointerOut($event)", "pointermove": "_onPointerMove($event)", "pointerleave": "_onPointerLeave()", "scroll": "_onScroll()" }, classAttribute: "relative isolate" }, ngImport: i0 });
292
308
  }
293
309
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImport: i0, type: ZHoverGlideDirective, decorators: [{
294
310
  type: Directive,
@@ -296,7 +312,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.6", ngImpor
296
312
  selector: '[zHoverGlide]',
297
313
  standalone: true,
298
314
  host: {
299
- class: 'relative',
315
+ class: 'relative isolate',
300
316
  '(pointerover)': '_onPointerOver($event)',
301
317
  '(pointerout)': '_onPointerOut($event)',
302
318
  '(pointermove)': '_onPointerMove($event)',
@@ -1 +1 @@
1
- {"version":3,"file":"shival99-z-ui-components-z-hover-glide.mjs","sources":["../../../../libs/core-ui/components/z-hover-glide/z-hover-glide.util.ts","../../../../libs/core-ui/components/z-hover-glide/z-hover-glide.directive.ts","../../../../libs/core-ui/components/z-hover-glide/shival99-z-ui-components-z-hover-glide.ts"],"sourcesContent":["/** Counter-scales border-radius across a non-uniform scale() so corners don't squash into an ellipse mid-glide. */\nexport function zHoverGlideRadiusKeyframes(radius: number, scaleX: number, scaleY: number): Keyframe[] {\n const steps = 12;\n return Array.from({ length: steps }, (_, index) => {\n const progress = index / (steps - 1);\n const x = scaleX + (1 - scaleX) * progress;\n const y = scaleY + (1 - scaleY) * progress;\n return { borderRadius: `${radius / x}px / ${radius / y}px` };\n });\n}\n","import { Directive, ElementRef, inject, input, OnDestroy, Renderer2 } from '@angular/core';\nimport { zTransform } from '@shival99/z-ui/utils';\nimport type { ZHoverGlideBox } from './z-hover-glide.types';\nimport { zHoverGlideRadiusKeyframes } from './z-hover-glide.util';\n\n/**\n * Shared sliding hover highlight for item lists (select options, autocomplete options, command\n * items, dropdown-menu items, ...). One absolutely-positioned box glides between hovered items\n * instead of each item toggling its own background — matches the \"motion highlight\" pattern from\n * animate-ui.\n *\n * The box's width/height are written once per move (a single layout op, same as any re-render) and\n * never transitioned — only `transform` (translate + a briefly non-1 scale) animates via the Web\n * Animations API, so the glide runs on the compositor and never re-triggers layout on the frames in\n * between, which is what a CSS `transition` on width/height would otherwise do on every tick.\n *\n * Usage: put `[zHoverGlide]` on the scrollable/list container and give each hoverable item a\n * `data-glide-item` attribute (or pass a custom `[zHoverGlideSelector]`). Works with virtualized\n * lists out of the box since it delegates from a single `pointerover` listener on the container\n * instead of binding per item.\n */\n@Directive({\n selector: '[zHoverGlide]',\n standalone: true,\n host: {\n class: 'relative',\n '(pointerover)': '_onPointerOver($event)',\n '(pointerout)': '_onPointerOut($event)',\n '(pointermove)': '_onPointerMove($event)',\n '(pointerleave)': '_onPointerLeave()',\n '(scroll)': '_onScroll()',\n },\n})\nexport class ZHoverGlideDirective implements OnDestroy {\n /** CSS selector (relative to the container) matching hoverable items. */\n public readonly zHoverGlideSelector = input<string>('[data-glide-item]');\n\n /** Classes applied to the sliding highlight box. */\n public readonly zHoverGlideClass = input<string>('bg-muted rounded-(--radius-sm)');\n\n public readonly zHoverGlideDisabled = input(false, { transform: zTransform });\n\n private readonly _elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly _renderer = inject(Renderer2);\n\n private _highlightEl: HTMLElement | null = null;\n private _currentTarget: HTMLElement | null = null;\n private _box: ZHoverGlideBox | null = null;\n private _animations: Animation[] = [];\n private _lastPointerPosition: { x: number; y: number } | null = null;\n private _scrollFrame: number | null = null;\n private _animationGeneration = 0;\n private readonly _prefersReducedMotion =\n typeof window !== 'undefined' &&\n typeof window.matchMedia === 'function' &&\n window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n\n public ngOnDestroy(): void {\n if (this._scrollFrame !== null && typeof cancelAnimationFrame === 'function') {\n cancelAnimationFrame(this._scrollFrame);\n }\n this._cancelAnimations();\n this._removeHighlightElements();\n }\n\n protected _onPointerOver(event: PointerEvent): void {\n if (this.zHoverGlideDisabled() || event.pointerType === 'touch') {\n return;\n }\n\n this._lastPointerPosition = { x: event.clientX, y: event.clientY };\n const source = event.target as HTMLElement | null;\n const target = this._getTarget(source);\n if (!target) {\n if (this._isNestedHostTarget(source)) {\n this._currentTarget = null;\n this._fadeOut();\n }\n return;\n }\n\n if (target === this._currentTarget) {\n return;\n }\n\n if (target.getAttribute('aria-disabled') === 'true' || (target as HTMLButtonElement).disabled) {\n this._currentTarget = null;\n this._fadeOut();\n return;\n }\n\n this._currentTarget = target;\n this._moveTo(target);\n }\n\n protected _onPointerOut(event: PointerEvent): void {\n const relatedTarget = event.relatedTarget as Node | null;\n if (relatedTarget && this._elementRef.nativeElement.contains(relatedTarget)) {\n return;\n }\n\n this._currentTarget = null;\n this._lastPointerPosition = null;\n this._fadeOut();\n }\n\n protected _onPointerMove(event: PointerEvent): void {\n if (!this.zHoverGlideDisabled() && event.pointerType !== 'touch') {\n this._lastPointerPosition = { x: event.clientX, y: event.clientY };\n }\n }\n\n protected _onScroll(): void {\n if (this.zHoverGlideDisabled() || !this._lastPointerPosition) {\n return;\n }\n\n if (typeof requestAnimationFrame !== 'function') {\n this._syncToPointer();\n return;\n }\n\n if (this._scrollFrame !== null) {\n return;\n }\n\n this._scrollFrame = requestAnimationFrame(() => {\n this._scrollFrame = null;\n this._syncToPointer();\n });\n }\n\n protected _onPointerLeave(): void {\n this._currentTarget = null;\n this._lastPointerPosition = null;\n this._fadeOut();\n }\n\n private _syncToPointer(): void {\n const pointer = this._lastPointerPosition;\n if (!pointer) {\n this._currentTarget = null;\n this._fadeOut();\n return;\n }\n\n const target = this._getTarget(document.elementFromPoint(pointer.x, pointer.y));\n if (!target || target.getAttribute('aria-disabled') === 'true' || (target as HTMLButtonElement).disabled) {\n this._currentTarget = null;\n this._fadeOut();\n return;\n }\n\n this._currentTarget = target;\n this._moveTo(target, false);\n }\n\n private _getTarget(source: EventTarget | null): HTMLElement | null {\n const target = (source as HTMLElement | null)?.closest(this.zHoverGlideSelector()) as HTMLElement | null;\n if (!target) {\n return null;\n }\n\n const container = this._elementRef.nativeElement;\n if (!container.contains(target) || target.closest('[zhoverglide]') !== container) {\n return null;\n }\n\n return target;\n }\n\n private _isNestedHostTarget(source: EventTarget | null): boolean {\n const sourceElement = source as HTMLElement | null;\n if (!sourceElement) {\n return false;\n }\n\n const nestedHost = sourceElement.closest('[zhoverglide]');\n return nestedHost !== null && nestedHost !== this._elementRef.nativeElement;\n }\n\n private _ensureHighlightEl(): HTMLElement {\n const container = this._elementRef.nativeElement;\n const highlights = Array.from(container.children).filter(child =>\n child.hasAttribute('data-z-hover-glide-highlight')\n ) as HTMLElement[];\n const current = this._highlightEl?.parentElement === container ? this._highlightEl : null;\n\n for (const highlight of highlights) {\n if (highlight !== current) {\n this._removeHighlightElement(highlight);\n }\n }\n\n if (current) {\n return current;\n }\n\n if (this._highlightEl) {\n this._removeHighlightElement(this._highlightEl);\n }\n\n const el = this._renderer.createElement('div') as HTMLElement;\n el.setAttribute('aria-hidden', 'true');\n el.setAttribute('data-z-hover-glide-highlight', '');\n el.style.position = 'absolute';\n el.style.top = '0';\n el.style.left = '0';\n el.style.margin = '0';\n el.style.zIndex = '0';\n el.style.opacity = '0';\n el.style.pointerEvents = 'none';\n el.style.transition = this._prefersReducedMotion ? 'none' : 'opacity 120ms ease-out';\n el.className = this.zHoverGlideClass();\n\n container.insertBefore(el, container.firstChild);\n this._highlightEl = el;\n\n return el;\n }\n\n private _moveTo(target: HTMLElement, shouldAnimate = true): void {\n const el = this._ensureHighlightEl();\n const container = this._elementRef.nativeElement;\n const containerRect = container.getBoundingClientRect();\n const targetRect = target.getBoundingClientRect();\n\n // Whole pixels only — a fractional box makes the browser re-snap subpixel rounding on every\n // frame, which reads as the surrounding content faintly jittering.\n const next: ZHoverGlideBox = {\n x: Math.round(targetRect.left - containerRect.left + container.scrollLeft),\n y: Math.round(targetRect.top - containerRect.top + container.scrollTop),\n w: Math.round(targetRect.width),\n h: Math.round(targetRect.height),\n };\n\n const previous = this._box;\n this._box = next;\n\n this._cancelAnimations();\n\n // Size and final position are a single, un-animated write — identical cost to any other\n // re-render. Only `transform` animates from here, so the glide itself never re-triggers layout.\n el.style.width = `${next.w}px`;\n el.style.height = `${next.h}px`;\n el.style.transform = `translate(${next.x}px, ${next.y}px)`;\n el.style.borderRadius = '';\n el.style.opacity = '1';\n\n if (!previous || !shouldAnimate || this._prefersReducedMotion || typeof el.animate !== 'function') {\n return;\n }\n\n const scaleX = previous.w / next.w;\n const scaleY = previous.h / next.h;\n const options: KeyframeAnimationOptions = { duration: 180, easing: 'cubic-bezier(0.22, 1, 0.36, 1)' };\n const animationGeneration = this._animationGeneration;\n let activeAnimationCount = 0;\n\n const trackAnimation = (animation: Animation): void => {\n activeAnimationCount += 1;\n const cleanup = (): void => {\n const index = this._animations.indexOf(animation);\n if (index >= 0) {\n this._animations.splice(index, 1);\n }\n activeAnimationCount = Math.max(0, activeAnimationCount - 1);\n if (animationGeneration === this._animationGeneration && activeAnimationCount === 0) {\n el.style.willChange = 'auto';\n }\n };\n animation.addEventListener('finish', cleanup, { once: true });\n animation.addEventListener('cancel', cleanup, { once: true });\n this._animations.push(animation);\n };\n\n // `will-change` only for the animation's own lifetime: pinning it permanently keeps this\n // element on its own compositor layer at rest too, which makes Chromium periodically\n // re-rasterize the item text sitting on top of it at a slightly different subpixel offset —\n // seen as the text flashing blurry-then-sharp even though nothing has actually moved.\n el.style.willChange = 'transform';\n const transformAnimation = el.animate(\n [\n { transform: `translate(${previous.x}px, ${previous.y}px) scale(${scaleX}, ${scaleY})` },\n { transform: `translate(${next.x}px, ${next.y}px)` },\n ],\n options\n );\n trackAnimation(transformAnimation);\n\n const radius = parseFloat(getComputedStyle(el).borderTopLeftRadius) || 0;\n if (radius > 0 && (scaleX !== 1 || scaleY !== 1)) {\n trackAnimation(el.animate(zHoverGlideRadiusKeyframes(radius, scaleX, scaleY), options));\n }\n }\n\n private _fadeOut(): void {\n this._cancelAnimations();\n this._box = null;\n if (!this._highlightEl) {\n return;\n }\n\n this._highlightEl.style.willChange = 'auto';\n this._highlightEl.style.opacity = '0';\n }\n\n private _cancelAnimations(): void {\n this._animationGeneration += 1;\n const animations = new Set(this._animations);\n const highlight = this._highlightEl;\n\n if (highlight && typeof highlight.getAnimations === 'function') {\n for (const animation of highlight.getAnimations()) {\n animations.add(animation);\n }\n }\n\n for (const animation of animations) {\n animation.cancel();\n }\n\n this._animations = [];\n if (highlight) {\n highlight.style.willChange = 'auto';\n }\n }\n\n private _removeHighlightElements(): void {\n const container = this._elementRef.nativeElement;\n for (const child of Array.from(container.children)) {\n if (child.hasAttribute('data-z-hover-glide-highlight')) {\n this._removeHighlightElement(child as HTMLElement);\n }\n }\n this._highlightEl = null;\n }\n\n private _removeHighlightElement(element: HTMLElement): void {\n if (typeof element.getAnimations === 'function') {\n for (const animation of element.getAnimations()) {\n animation.cancel();\n }\n }\n element.remove();\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":"shival99-z-ui-components-z-hover-glide.mjs","sources":["../../../../libs/core-ui/components/z-hover-glide/z-hover-glide.directive.ts","../../../../libs/core-ui/components/z-hover-glide/shival99-z-ui-components-z-hover-glide.ts"],"sourcesContent":["import { Directive, ElementRef, inject, input, OnDestroy, Renderer2 } from '@angular/core';\nimport { zTransform } from '@shival99/z-ui/utils';\nimport type { ZHoverGlideBox } from './z-hover-glide.types';\n\n/**\n * Shared sliding hover highlight for item lists (select options, autocomplete options, command\n * items, dropdown-menu items, ...). One absolutely-positioned box glides between hovered items\n * instead of each item toggling its own background — matches the \"motion highlight\" pattern from\n * animate-ui.\n *\n * The box's geometry is updated once per move. Pixel-aligned boxes use a compositor animation;\n * fractional geometry (common at browser zoom levels) uses layout-property animation instead, so\n * Chromium never has to rasterize a transformed text layer at a fractional device-pixel offset.\n *\n * Usage: put `[zHoverGlide]` on the scrollable/list container and give each hoverable item a\n * `data-glide-item` attribute (or pass a custom `[zHoverGlideSelector]`). Works with virtualized\n * lists out of the box since it delegates from a single `pointerover` listener on the container\n * instead of binding per item.\n */\n@Directive({\n selector: '[zHoverGlide]',\n standalone: true,\n host: {\n class: 'relative isolate',\n '(pointerover)': '_onPointerOver($event)',\n '(pointerout)': '_onPointerOut($event)',\n '(pointermove)': '_onPointerMove($event)',\n '(pointerleave)': '_onPointerLeave()',\n '(scroll)': '_onScroll()',\n },\n})\nexport class ZHoverGlideDirective implements OnDestroy {\n /** CSS selector (relative to the container) matching hoverable items. */\n public readonly zHoverGlideSelector = input<string>('[data-glide-item]');\n\n /** Classes applied to the sliding highlight box. */\n public readonly zHoverGlideClass = input<string>('bg-muted rounded-(--radius-sm)');\n\n public readonly zHoverGlideDisabled = input(false, { transform: zTransform });\n\n private readonly _elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly _renderer = inject(Renderer2);\n\n private _highlightEl: HTMLElement | null = null;\n private _currentTarget: HTMLElement | null = null;\n private _box: ZHoverGlideBox | null = null;\n private _animations: Animation[] = [];\n private _lastPointerPosition: { x: number; y: number } | null = null;\n private _scrollFrame: number | null = null;\n private _animationGeneration = 0;\n private readonly _prefersReducedMotion =\n typeof window !== 'undefined' &&\n typeof window.matchMedia === 'function' &&\n window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n\n public ngOnDestroy(): void {\n if (this._scrollFrame !== null && typeof cancelAnimationFrame === 'function') {\n cancelAnimationFrame(this._scrollFrame);\n }\n this._cancelAnimations();\n this._removeHighlightElements();\n }\n\n protected _onPointerOver(event: PointerEvent): void {\n if (this.zHoverGlideDisabled() || event.pointerType === 'touch') {\n return;\n }\n\n this._lastPointerPosition = { x: event.clientX, y: event.clientY };\n const source = event.target as HTMLElement | null;\n const target = this._getTarget(source);\n if (!target) {\n if (this._isNestedHostTarget(source)) {\n this._currentTarget = null;\n this._fadeOut();\n }\n return;\n }\n\n if (target === this._currentTarget) {\n return;\n }\n\n if (target.getAttribute('aria-disabled') === 'true' || (target as HTMLButtonElement).disabled) {\n this._currentTarget = null;\n this._fadeOut();\n return;\n }\n\n this._currentTarget = target;\n this._moveTo(target);\n }\n\n protected _onPointerOut(event: PointerEvent): void {\n const relatedTarget = event.relatedTarget as Node | null;\n if (relatedTarget && this._elementRef.nativeElement.contains(relatedTarget)) {\n return;\n }\n\n this._currentTarget = null;\n this._lastPointerPosition = null;\n this._fadeOut();\n }\n\n protected _onPointerMove(event: PointerEvent): void {\n if (!this.zHoverGlideDisabled() && event.pointerType !== 'touch') {\n this._lastPointerPosition = { x: event.clientX, y: event.clientY };\n }\n }\n\n protected _onScroll(): void {\n if (this.zHoverGlideDisabled() || !this._lastPointerPosition) {\n return;\n }\n\n if (typeof requestAnimationFrame !== 'function') {\n this._syncToPointer();\n return;\n }\n\n if (this._scrollFrame !== null) {\n return;\n }\n\n this._scrollFrame = requestAnimationFrame(() => {\n this._scrollFrame = null;\n this._syncToPointer();\n });\n }\n\n protected _onPointerLeave(): void {\n this._currentTarget = null;\n this._lastPointerPosition = null;\n this._fadeOut();\n }\n\n private _syncToPointer(): void {\n const pointer = this._lastPointerPosition;\n if (!pointer) {\n this._currentTarget = null;\n this._fadeOut();\n return;\n }\n\n const target = this._getTarget(document.elementFromPoint(pointer.x, pointer.y));\n if (!target || target.getAttribute('aria-disabled') === 'true' || (target as HTMLButtonElement).disabled) {\n this._currentTarget = null;\n this._fadeOut();\n return;\n }\n\n this._currentTarget = target;\n this._moveTo(target, false);\n }\n\n private _getTarget(source: EventTarget | null): HTMLElement | null {\n const target = (source as HTMLElement | null)?.closest(this.zHoverGlideSelector()) as HTMLElement | null;\n if (!target) {\n return null;\n }\n\n const container = this._elementRef.nativeElement;\n if (!container.contains(target) || target.closest('[zhoverglide]') !== container) {\n return null;\n }\n\n return target;\n }\n\n private _isNestedHostTarget(source: EventTarget | null): boolean {\n const sourceElement = source as HTMLElement | null;\n if (!sourceElement) {\n return false;\n }\n\n const nestedHost = sourceElement.closest('[zhoverglide]');\n return nestedHost !== null && nestedHost !== this._elementRef.nativeElement;\n }\n\n private _ensureHighlightEl(): HTMLElement {\n const container = this._elementRef.nativeElement;\n const highlights = Array.from(container.children).filter(child =>\n child.hasAttribute('data-z-hover-glide-highlight')\n ) as HTMLElement[];\n const current = this._highlightEl?.parentElement === container ? this._highlightEl : null;\n\n for (const highlight of highlights) {\n if (highlight !== current) {\n this._removeHighlightElement(highlight);\n }\n }\n\n if (current) {\n return current;\n }\n\n if (this._highlightEl) {\n this._removeHighlightElement(this._highlightEl);\n }\n\n const el = this._renderer.createElement('div') as HTMLElement;\n el.setAttribute('aria-hidden', 'true');\n el.setAttribute('data-z-hover-glide-highlight', '');\n el.style.position = 'absolute';\n el.style.top = '0';\n el.style.left = '0';\n el.style.margin = '0';\n // Keep the highlight behind item content without requiring every consumer to add a z-index.\n // The host's isolated stacking context keeps this negative layer above the host background.\n el.style.zIndex = '-1';\n el.style.opacity = '0';\n el.style.pointerEvents = 'none';\n el.style.transition = this._prefersReducedMotion ? 'none' : 'opacity 120ms ease-out';\n el.className = this.zHoverGlideClass();\n\n container.insertBefore(el, container.firstChild);\n this._highlightEl = el;\n\n return el;\n }\n\n private _moveTo(target: HTMLElement, shouldAnimate = true): void {\n const el = this._ensureHighlightEl();\n const container = this._elementRef.nativeElement;\n const containerRect = container.getBoundingClientRect();\n const targetRect = target.getBoundingClientRect();\n\n const next: ZHoverGlideBox = {\n x: targetRect.left - containerRect.left + container.scrollLeft,\n y: targetRect.top - containerRect.top + container.scrollTop,\n w: targetRect.width,\n h: targetRect.height,\n };\n\n const previous = this._box;\n this._box = next;\n\n this._cancelAnimations();\n\n el.style.width = `${next.w}px`;\n el.style.height = `${next.h}px`;\n el.style.borderRadius = '';\n el.style.opacity = '1';\n\n const canUseTransform = previous\n ? this._canUseTransformAnimation(previous, next)\n : this._canUseTransformAnimation(next);\n if (!previous || !shouldAnimate || this._prefersReducedMotion || typeof el.animate !== 'function') {\n if (!canUseTransform) {\n el.style.transform = 'none';\n el.style.left = `${next.x}px`;\n el.style.top = `${next.y}px`;\n return;\n }\n\n el.style.left = '0';\n el.style.top = '0';\n el.style.transform = `translate(${next.x}px, ${next.y}px)`;\n return;\n }\n\n const options: KeyframeAnimationOptions = { duration: 180, easing: 'cubic-bezier(0.22, 1, 0.36, 1)' };\n const animationGeneration = this._animationGeneration;\n let activeAnimationCount = 0;\n\n const trackAnimation = (animation: Animation): void => {\n activeAnimationCount += 1;\n const cleanup = (): void => {\n const index = this._animations.indexOf(animation);\n if (index >= 0) {\n this._animations.splice(index, 1);\n }\n activeAnimationCount = Math.max(0, activeAnimationCount - 1);\n if (animationGeneration === this._animationGeneration && activeAnimationCount === 0) {\n el.style.willChange = 'auto';\n }\n };\n animation.addEventListener('finish', cleanup, { once: true });\n animation.addEventListener('cancel', cleanup, { once: true });\n this._animations.push(animation);\n };\n\n if (!canUseTransform) {\n el.style.transform = 'none';\n el.style.left = `${next.x}px`;\n el.style.top = `${next.y}px`;\n trackAnimation(\n el.animate(\n [\n {\n left: `${previous.x}px`,\n top: `${previous.y}px`,\n width: `${previous.w}px`,\n height: `${previous.h}px`,\n },\n { left: `${next.x}px`, top: `${next.y}px`, width: `${next.w}px`, height: `${next.h}px` },\n ],\n options\n )\n );\n return;\n }\n\n el.style.left = '0';\n el.style.top = '0';\n el.style.transform = `translate(${next.x}px, ${next.y}px)`;\n trackAnimation(\n el.animate(\n [\n { transform: `translate(${previous.x}px, ${previous.y}px)` },\n { transform: `translate(${next.x}px, ${next.y}px)` },\n ],\n options\n )\n );\n }\n\n private _canUseTransformAnimation(...boxes: ZHoverGlideBox[]): boolean {\n const pixelRatio = typeof window !== 'undefined' ? window.devicePixelRatio || 1 : 1;\n const viewportScale = typeof window !== 'undefined' ? window.visualViewport?.scale || 1 : 1;\n if (Math.abs(pixelRatio - Math.round(pixelRatio)) > 0.001 || Math.abs(viewportScale - 1) > 0.001) {\n return false;\n }\n\n return boxes\n .flatMap(box => [box.x, box.y, box.w, box.h])\n .every(value => {\n const devicePixels = value * pixelRatio;\n return Math.abs(devicePixels - Math.round(devicePixels)) < 0.001;\n });\n }\n\n private _fadeOut(): void {\n this._cancelAnimations();\n this._box = null;\n if (!this._highlightEl) {\n return;\n }\n\n this._highlightEl.style.willChange = 'auto';\n this._highlightEl.style.opacity = '0';\n }\n\n private _cancelAnimations(): void {\n this._animationGeneration += 1;\n const animations = new Set(this._animations);\n const highlight = this._highlightEl;\n\n if (highlight && typeof highlight.getAnimations === 'function') {\n for (const animation of highlight.getAnimations()) {\n animations.add(animation);\n }\n }\n\n for (const animation of animations) {\n animation.cancel();\n }\n\n this._animations = [];\n if (highlight) {\n highlight.style.willChange = 'auto';\n }\n }\n\n private _removeHighlightElements(): void {\n const container = this._elementRef.nativeElement;\n for (const child of Array.from(container.children)) {\n if (child.hasAttribute('data-z-hover-glide-highlight')) {\n this._removeHighlightElement(child as HTMLElement);\n }\n }\n this._highlightEl = null;\n }\n\n private _removeHighlightElement(element: HTMLElement): void {\n if (typeof element.getAnimations === 'function') {\n for (const animation of element.getAnimations()) {\n animation.cancel();\n }\n }\n element.remove();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}