ng-hub-ui-utils 22.4.0 → 22.5.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,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { signal, computed, Injectable, effect, InjectionToken, inject, makeEnvironmentProviders, ElementRef, TemplateRef, createComponent, ApplicationRef, Pipe, ChangeDetectorRef, Injector, ViewContainerRef, NgZone, input, Renderer2, RendererStyleFlags2, HostListener, Directive } from '@angular/core';
2
+ import { signal, computed, Injectable, effect, InjectionToken, inject, makeEnvironmentProviders, ElementRef, TemplateRef, createComponent, ApplicationRef, Pipe, ChangeDetectorRef, Injector, ViewContainerRef, NgZone, input, Directive } from '@angular/core';
3
3
  import { fromEvent, Observable, Subject, isObservable, EMPTY, of, timer, race } from 'rxjs';
4
4
  import { takeUntil, map, filter, withLatestFrom, endWith, take, mergeMap, tap } from 'rxjs/operators';
5
5
  import { DOCUMENT } from '@angular/common';
@@ -1803,73 +1803,118 @@ const TOOLTIP_THEME_VARS = [
1803
1803
  '--hub-tooltip-font-family'
1804
1804
  ];
1805
1805
  /**
1806
- * Lightweight tooltip directive.
1806
+ * Framework-agnostic tooltip engine.
1807
1807
  *
1808
- * Apply `[tooltip]` to any element to show a positioned label on hover/focus.
1809
- * The tooltip element is appended to `<body>` so it is never clipped by an
1810
- * overflow container, and every visual aspect is themeable through
1811
- * `--hub-tooltip-*` CSS variables.
1808
+ * Binds hover/focus listeners to a host element and renders a body-portaled,
1809
+ * `--hub-tooltip-*`-themeable label on demand. It owns no Angular dependency, so
1810
+ * it can be reused both by the `[tooltip]` directive and by other primitives
1811
+ * (e.g. a badge overflow tooltip) that want the exact same visual contract
1812
+ * without re-implementing the DOM logic.
1812
1813
  *
1813
- * Styles ship in `styles/tooltip.scss` (mirroring `styles/overlay.scss`). Import
1814
- * it once in your app: `@use 'ng-hub-ui-utils/styles/tooltip';`.
1814
+ * Styles ship in `styles/tooltip.scss`. Import once in your app:
1815
+ * `@use 'ng-hub-ui-utils/styles/tooltip';`.
1815
1816
  */
1816
- class TooltipDirective {
1817
- /** Tooltip text content. */
1818
- tooltipTitle = input.required({ ...(ngDevMode ? { debugName: "tooltipTitle" } : /* istanbul ignore next */ {}), alias: 'tooltip' });
1819
- /** Placement of the tooltip relative to the host. */
1820
- placement = input('top', /* @ts-ignore */
1821
- ...(ngDevMode ? [{ debugName: "placement" }] : /* istanbul ignore next */ []));
1822
- /** Fade duration in milliseconds, also used as the removal delay on hide. */
1823
- delay = input(150, /* @ts-ignore */
1824
- ...(ngDevMode ? [{ debugName: "delay" }] : /* istanbul ignore next */ []));
1825
- /** Gap in pixels between the host and the tooltip. */
1826
- offset = input(8, /* @ts-ignore */
1827
- ...(ngDevMode ? [{ debugName: "offset" }] : /* istanbul ignore next */ []));
1817
+ class HubTooltipController {
1818
+ host;
1828
1819
  tooltipEl = null;
1829
1820
  hideTimeout = null;
1830
- host = inject(ElementRef);
1831
- renderer = inject(Renderer2);
1832
- document = inject(DOCUMENT);
1833
- ngOnDestroy() {
1834
- this.destroyTooltip();
1821
+ text = '';
1822
+ placement = 'top';
1823
+ delay = 150;
1824
+ offset = 8;
1825
+ doc;
1826
+ view;
1827
+ onShow = () => this.show();
1828
+ onHide = () => this.hide();
1829
+ /**
1830
+ * @param host Element the tooltip is anchored to and whose pointer/focus
1831
+ * events trigger the tooltip.
1832
+ * @param options Initial placement, delay and offset.
1833
+ */
1834
+ constructor(host, options) {
1835
+ this.host = host;
1836
+ this.doc = host.ownerDocument;
1837
+ this.view = this.doc.defaultView;
1838
+ this.setOptions(options);
1839
+ this.host.addEventListener('mouseenter', this.onShow);
1840
+ this.host.addEventListener('focus', this.onShow);
1841
+ this.host.addEventListener('mouseleave', this.onHide);
1842
+ this.host.addEventListener('blur', this.onHide);
1843
+ this.host.addEventListener('click', this.onHide);
1835
1844
  }
1836
- onShow() {
1837
- this.show();
1845
+ /**
1846
+ * Updates the tooltip label. An empty value disables the tooltip and hides any
1847
+ * currently visible instance.
1848
+ * @param text New tooltip content.
1849
+ */
1850
+ setText(text) {
1851
+ this.text = text ?? '';
1852
+ if (!this.text) {
1853
+ this.hide();
1854
+ return;
1855
+ }
1856
+ if (this.tooltipEl) {
1857
+ this.tooltipEl.textContent = this.text;
1858
+ this.position();
1859
+ }
1838
1860
  }
1839
- onHide() {
1840
- this.hide();
1861
+ /**
1862
+ * Updates placement/delay/offset. Only provided keys are overwritten.
1863
+ * @param options Partial tooltip options.
1864
+ */
1865
+ setOptions(options) {
1866
+ if (!options) {
1867
+ return;
1868
+ }
1869
+ if (options.placement) {
1870
+ this.placement = options.placement;
1871
+ }
1872
+ if (options.delay != null) {
1873
+ this.delay = options.delay;
1874
+ }
1875
+ if (options.offset != null) {
1876
+ this.offset = options.offset;
1877
+ }
1878
+ }
1879
+ /** Detaches listeners and removes any live tooltip element. */
1880
+ destroy() {
1881
+ this.host.removeEventListener('mouseenter', this.onShow);
1882
+ this.host.removeEventListener('focus', this.onShow);
1883
+ this.host.removeEventListener('mouseleave', this.onHide);
1884
+ this.host.removeEventListener('blur', this.onHide);
1885
+ this.host.removeEventListener('click', this.onHide);
1886
+ this.removeElement();
1841
1887
  }
1842
1888
  /** Creates, positions and reveals the tooltip element. */
1843
1889
  show() {
1844
- if (this.tooltipEl || !this.tooltipTitle()) {
1890
+ if (this.tooltipEl || !this.text) {
1845
1891
  return;
1846
1892
  }
1847
1893
  this.clearHideTimeout();
1848
- const el = this.renderer.createElement('span');
1849
- this.renderer.appendChild(el, this.renderer.createText(this.tooltipTitle()));
1850
- this.renderer.addClass(el, 'hub-tooltip');
1851
- this.renderer.addClass(el, `hub-tooltip--${this.placement()}`);
1852
- this.renderer.setStyle(el, 'transition-duration', `${this.delay()}ms`);
1894
+ const el = this.doc.createElement('span');
1895
+ el.textContent = this.text;
1896
+ el.classList.add('hub-tooltip', `hub-tooltip--${this.placement}`);
1897
+ el.style.transitionDuration = `${this.delay}ms`;
1853
1898
  this.forwardThemeVars(el);
1854
- this.renderer.appendChild(this.document.body, el);
1899
+ this.doc.body.appendChild(el);
1855
1900
  this.tooltipEl = el;
1856
1901
  this.position();
1857
- this.renderer.addClass(el, 'hub-tooltip--show');
1902
+ el.classList.add('hub-tooltip--show');
1858
1903
  }
1859
1904
  /** Fades the tooltip out and removes it after the fade completes. */
1860
1905
  hide() {
1861
1906
  if (!this.tooltipEl) {
1862
1907
  return;
1863
1908
  }
1864
- this.renderer.removeClass(this.tooltipEl, 'hub-tooltip--show');
1909
+ this.tooltipEl.classList.remove('hub-tooltip--show');
1865
1910
  this.clearHideTimeout();
1866
- this.hideTimeout = setTimeout(() => this.destroyTooltip(), this.delay());
1911
+ this.hideTimeout = setTimeout(() => this.removeElement(), this.delay);
1867
1912
  }
1868
1913
  /** Removes the tooltip element immediately. */
1869
- destroyTooltip() {
1914
+ removeElement() {
1870
1915
  this.clearHideTimeout();
1871
1916
  if (this.tooltipEl) {
1872
- this.renderer.removeChild(this.document.body, this.tooltipEl);
1917
+ this.tooltipEl.remove();
1873
1918
  this.tooltipEl = null;
1874
1919
  }
1875
1920
  }
@@ -1878,15 +1923,14 @@ class TooltipDirective {
1878
1923
  * the body-portaled tooltip, so scoped theming applies despite the portal.
1879
1924
  */
1880
1925
  forwardThemeVars(el) {
1881
- const view = this.document.defaultView;
1882
- if (!view) {
1926
+ if (!this.view) {
1883
1927
  return;
1884
1928
  }
1885
- const hostStyles = view.getComputedStyle(this.host.nativeElement);
1929
+ const hostStyles = this.view.getComputedStyle(this.host);
1886
1930
  for (const name of TOOLTIP_THEME_VARS) {
1887
1931
  const value = hostStyles.getPropertyValue(name).trim();
1888
1932
  if (value) {
1889
- this.renderer.setStyle(el, name, value, RendererStyleFlags2.DashCase);
1933
+ el.style.setProperty(name, value);
1890
1934
  }
1891
1935
  }
1892
1936
  }
@@ -1896,19 +1940,19 @@ class TooltipDirective {
1896
1940
  this.hideTimeout = null;
1897
1941
  }
1898
1942
  }
1899
- /** Positions the tooltip around the host according to `placement`. */
1943
+ /** Positions the tooltip around the host according to the current placement. */
1900
1944
  position() {
1901
1945
  if (!this.tooltipEl) {
1902
1946
  return;
1903
1947
  }
1904
- const hostRect = this.host.nativeElement.getBoundingClientRect();
1948
+ const hostRect = this.host.getBoundingClientRect();
1905
1949
  const tipRect = this.tooltipEl.getBoundingClientRect();
1906
- const scrollY = this.document.defaultView?.scrollY ?? 0;
1907
- const scrollX = this.document.defaultView?.scrollX ?? 0;
1908
- const offset = this.offset();
1950
+ const scrollY = this.view?.scrollY ?? 0;
1951
+ const scrollX = this.view?.scrollX ?? 0;
1952
+ const offset = this.offset;
1909
1953
  let top = 0;
1910
1954
  let left = 0;
1911
- switch (this.placement()) {
1955
+ switch (this.placement) {
1912
1956
  case 'bottom':
1913
1957
  top = hostRect.bottom + offset;
1914
1958
  left = hostRect.left + (hostRect.width - tipRect.width) / 2;
@@ -1927,33 +1971,79 @@ class TooltipDirective {
1927
1971
  left = hostRect.left + (hostRect.width - tipRect.width) / 2;
1928
1972
  break;
1929
1973
  }
1930
- this.renderer.setStyle(this.tooltipEl, 'top', `${top + scrollY}px`);
1931
- this.renderer.setStyle(this.tooltipEl, 'left', `${left + scrollX}px`);
1974
+ this.tooltipEl.style.top = `${top + scrollY}px`;
1975
+ this.tooltipEl.style.left = `${left + scrollX}px`;
1976
+ }
1977
+ }
1978
+
1979
+ /**
1980
+ * Ready-made {@link HubTooltipAdapter} backed by {@link HubTooltipController}.
1981
+ *
1982
+ * Wire it into any ng-hub-ui primitive that exposes an optional tooltip token,
1983
+ * e.g. `provideHubBadgeTooltip(hubTooltipAdapter)`.
1984
+ */
1985
+ const hubTooltipAdapter = {
1986
+ attach(host, text, options) {
1987
+ const controller = new HubTooltipController(host, options);
1988
+ controller.setText(text);
1989
+ return {
1990
+ update: (next) => controller.setText(next),
1991
+ destroy: () => controller.destroy()
1992
+ };
1993
+ }
1994
+ };
1995
+
1996
+ /**
1997
+ * Lightweight tooltip directive.
1998
+ *
1999
+ * Apply `[tooltip]` to any element to show a positioned label on hover/focus.
2000
+ * The tooltip element is appended to `<body>` so it is never clipped by an
2001
+ * overflow container, and every visual aspect is themeable through
2002
+ * `--hub-tooltip-*` CSS variables.
2003
+ *
2004
+ * All DOM work is delegated to {@link HubTooltipController}, so the directive and
2005
+ * any imperative consumer (e.g. a badge overflow tooltip) share the exact same
2006
+ * behaviour and styling.
2007
+ *
2008
+ * Styles ship in `styles/tooltip.scss` (mirroring `styles/overlay.scss`). Import
2009
+ * it once in your app: `@use 'ng-hub-ui-utils/styles/tooltip';`.
2010
+ */
2011
+ class TooltipDirective {
2012
+ /** Tooltip text content. */
2013
+ tooltipTitle = input.required({ ...(ngDevMode ? { debugName: "tooltipTitle" } : /* istanbul ignore next */ {}), alias: 'tooltip' });
2014
+ /** Placement of the tooltip relative to the host. */
2015
+ placement = input('top', /* @ts-ignore */
2016
+ ...(ngDevMode ? [{ debugName: "placement" }] : /* istanbul ignore next */ []));
2017
+ /** Fade duration in milliseconds, also used as the removal delay on hide. */
2018
+ delay = input(150, /* @ts-ignore */
2019
+ ...(ngDevMode ? [{ debugName: "delay" }] : /* istanbul ignore next */ []));
2020
+ /** Gap in pixels between the host and the tooltip. */
2021
+ offset = input(8, /* @ts-ignore */
2022
+ ...(ngDevMode ? [{ debugName: "offset" }] : /* istanbul ignore next */ []));
2023
+ host = inject(ElementRef);
2024
+ controller = new HubTooltipController(this.host.nativeElement);
2025
+ constructor() {
2026
+ effect(() => {
2027
+ this.controller.setOptions({
2028
+ placement: this.placement(),
2029
+ delay: this.delay(),
2030
+ offset: this.offset()
2031
+ });
2032
+ this.controller.setText(this.tooltipTitle());
2033
+ });
2034
+ }
2035
+ ngOnDestroy() {
2036
+ this.controller.destroy();
1932
2037
  }
1933
2038
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: TooltipDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
1934
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.1", type: TooltipDirective, isStandalone: true, selector: "[tooltip]", inputs: { tooltipTitle: { classPropertyName: "tooltipTitle", publicName: "tooltip", isSignal: true, isRequired: true, transformFunction: null }, placement: { classPropertyName: "placement", publicName: "placement", isSignal: true, isRequired: false, transformFunction: null }, delay: { classPropertyName: "delay", publicName: "delay", isSignal: true, isRequired: false, transformFunction: null }, offset: { classPropertyName: "offset", publicName: "offset", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "mouseenter": "onShow()", "focus": "onShow()", "mouseleave": "onHide()", "blur": "onHide()", "click": "onHide()" } }, ngImport: i0 });
2039
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.1", type: TooltipDirective, isStandalone: true, selector: "[tooltip]", inputs: { tooltipTitle: { classPropertyName: "tooltipTitle", publicName: "tooltip", isSignal: true, isRequired: true, transformFunction: null }, placement: { classPropertyName: "placement", publicName: "placement", isSignal: true, isRequired: false, transformFunction: null }, delay: { classPropertyName: "delay", publicName: "delay", isSignal: true, isRequired: false, transformFunction: null }, offset: { classPropertyName: "offset", publicName: "offset", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 });
1935
2040
  }
1936
2041
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImport: i0, type: TooltipDirective, decorators: [{
1937
2042
  type: Directive,
1938
2043
  args: [{
1939
2044
  selector: '[tooltip]'
1940
2045
  }]
1941
- }], propDecorators: { tooltipTitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "tooltip", required: true }] }], placement: [{ type: i0.Input, args: [{ isSignal: true, alias: "placement", required: false }] }], delay: [{ type: i0.Input, args: [{ isSignal: true, alias: "delay", required: false }] }], offset: [{ type: i0.Input, args: [{ isSignal: true, alias: "offset", required: false }] }], onShow: [{
1942
- type: HostListener,
1943
- args: ['mouseenter']
1944
- }, {
1945
- type: HostListener,
1946
- args: ['focus']
1947
- }], onHide: [{
1948
- type: HostListener,
1949
- args: ['mouseleave']
1950
- }, {
1951
- type: HostListener,
1952
- args: ['blur']
1953
- }, {
1954
- type: HostListener,
1955
- args: ['click']
1956
- }] } });
2046
+ }], ctorParameters: () => [], propDecorators: { tooltipTitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "tooltip", required: true }] }], placement: [{ type: i0.Input, args: [{ isSignal: true, alias: "placement", required: false }] }], delay: [{ type: i0.Input, args: [{ isSignal: true, alias: "delay", required: false }] }], offset: [{ type: i0.Input, args: [{ isSignal: true, alias: "offset", required: false }] }] } });
1957
2047
 
1958
2048
  /*
1959
2049
  * Public API Surface of utils
@@ -1963,5 +2053,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.1", ngImpor
1963
2053
  * Generated bundle index. Do not edit.
1964
2054
  */
1965
2055
 
1966
- export { ContentRef, FOCUSABLE_ELEMENTS_SELECTOR, GetPipe, HUB_TRANSLATION_CONFIG, HubDragDropService, HubTranslationService, IsObjectPipe, IsObservablePipe, IsStringPipe, OverlayPosition, OverlayRef, OverlayService, PopupService, ScrollBar, TooltipDirective, TranslatePipe, UcfirstPipe, UnwrapAsyncPipe, clamp, closest, computeTargetIndex, containsNode, copyArrayItem, createNativeDragImage, createPointerDragSession, debouncedSignal, equals, generateUniqueId, getActiveElement, getFocusableBoundaryElements, getValue, getValueInRange, hubCompleteTransition, hubFocusTrap, hubRunTransition, interpolateString, isDefined, isInteger, isNumber, isObject, isPromise, isString, mergeDeep, moveItemInArray, padNumber, provideHubTranslation, reflow, regExpEscape, removeAccents, resolveDropPosition, runInZone, toAbsoluteIndex, toInteger, toString, transferArrayItem };
2056
+ export { ContentRef, FOCUSABLE_ELEMENTS_SELECTOR, GetPipe, HUB_TRANSLATION_CONFIG, HubDragDropService, HubTooltipController, HubTranslationService, IsObjectPipe, IsObservablePipe, IsStringPipe, OverlayPosition, OverlayRef, OverlayService, PopupService, ScrollBar, TooltipDirective, TranslatePipe, UcfirstPipe, UnwrapAsyncPipe, clamp, closest, computeTargetIndex, containsNode, copyArrayItem, createNativeDragImage, createPointerDragSession, debouncedSignal, equals, generateUniqueId, getActiveElement, getFocusableBoundaryElements, getValue, getValueInRange, hubCompleteTransition, hubFocusTrap, hubRunTransition, hubTooltipAdapter, interpolateString, isDefined, isInteger, isNumber, isObject, isPromise, isString, mergeDeep, moveItemInArray, padNumber, provideHubTranslation, reflow, regExpEscape, removeAccents, resolveDropPosition, runInZone, toAbsoluteIndex, toInteger, toString, transferArrayItem };
1967
2057
  //# sourceMappingURL=ng-hub-ui-utils.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ng-hub-ui-utils.mjs","sources":["../../../projects/utils/src/lib/drag-drop/array-utils.ts","../../../projects/utils/src/lib/drag-drop/drop-position.ts","../../../projects/utils/src/lib/drag-drop/drag-image.ts","../../../projects/utils/src/lib/drag-drop/pointer-drag.ts","../../../projects/utils/src/lib/drag-drop/drag-drop.service.ts","../../../projects/utils/src/lib/drag-drop/index.ts","../../../projects/utils/src/lib/focus-trap.ts","../../../projects/utils/src/lib/util.ts","../../../projects/utils/src/lib/i18n/translation.tokens.ts","../../../projects/utils/src/lib/i18n/translation.service.ts","../../../projects/utils/src/lib/i18n/translation.provider.ts","../../../projects/utils/src/lib/overlay/overlay-position.ts","../../../projects/utils/src/lib/overlay/overlay-ref.ts","../../../projects/utils/src/lib/overlay/overlay-service.ts","../../../projects/utils/src/lib/pipes/get.pipe.ts","../../../projects/utils/src/lib/pipes/is-object.pipe.ts","../../../projects/utils/src/lib/pipes/is-observable.pipe.ts","../../../projects/utils/src/lib/pipes/is-string.pipe.ts","../../../projects/utils/src/lib/pipes/translate.pipe.ts","../../../projects/utils/src/lib/pipes/ucfirst.pipe.ts","../../../projects/utils/src/lib/pipes/unwrap-async.pipe.ts","../../../projects/utils/src/lib/transitions/util.ts","../../../projects/utils/src/lib/transitions/transition.ts","../../../projects/utils/src/lib/popup.ts","../../../projects/utils/src/lib/scrollbar.ts","../../../projects/utils/src/lib/tooltip/tooltip.directive.ts","../../../projects/utils/src/public-api.ts","../../../projects/utils/src/ng-hub-ui-utils.ts"],"sourcesContent":["/**\n * Clamps a value into the `[0, max]` range.\n *\n * @param value Value to clamp.\n * @param max Maximum allowed value.\n * @returns The clamped value.\n */\nexport function clamp(value: number, max: number): number {\n\treturn Math.max(0, Math.min(max, value));\n}\n\n/**\n * Moves an item within an array in place (mirrors `@angular/cdk`'s `moveItemInArray`).\n *\n * @param array Array to mutate.\n * @param fromIndex Current index of the item.\n * @param toIndex Target index of the item.\n */\nexport function moveItemInArray<T>(array: T[], fromIndex: number, toIndex: number): void {\n\tconst from = clamp(fromIndex, array.length - 1);\n\tconst to = clamp(toIndex, array.length - 1);\n\tif (from === to) {\n\t\treturn;\n\t}\n\tconst target = array[from];\n\tconst delta = to < from ? -1 : 1;\n\tfor (let i = from; i !== to; i += delta) {\n\t\tarray[i] = array[i + delta];\n\t}\n\tarray[to] = target;\n}\n\n/**\n * Transfers an item from one array to another in place (mirrors `transferArrayItem`).\n *\n * @param source Source array.\n * @param target Target array.\n * @param fromIndex Index of the item in the source array.\n * @param toIndex Insertion index in the target array.\n */\nexport function transferArrayItem<T>(source: T[], target: T[], fromIndex: number, toIndex: number): void {\n\tconst from = clamp(fromIndex, source.length - 1);\n\tconst to = clamp(toIndex, target.length);\n\tif (source.length) {\n\t\ttarget.splice(to, 0, source.splice(from, 1)[0]);\n\t}\n}\n\n/**\n * Copies an item from one array into another in place, leaving the source untouched.\n *\n * @param source Source array.\n * @param target Target array.\n * @param fromIndex Index of the item in the source array.\n * @param toIndex Insertion index in the target array.\n */\nexport function copyArrayItem<T>(source: ReadonlyArray<T>, target: T[], fromIndex: number, toIndex: number): void {\n\tif (!source.length) {\n\t\treturn;\n\t}\n\tconst from = clamp(fromIndex, source.length - 1);\n\tconst to = clamp(toIndex, target.length);\n\ttarget.splice(to, 0, source[from]);\n}\n\n/**\n * Computes the destination index in the underlying collection from the hovered target index\n * and the drop side. When reordering within the same container, the index is adjusted to\n * account for the gap left by removing the dragged item.\n *\n * @param targetIndex Absolute index of the hovered target item.\n * @param after Whether the item is dropped after (vs before) the target.\n * @param sameContainer Whether source and target collections are the same.\n * @param fromIndex Absolute index the dragged item occupied in the source collection.\n * @returns The resolved destination index.\n */\nexport function computeTargetIndex(targetIndex: number, after: boolean, sameContainer: boolean, fromIndex: number): number {\n\tlet index = after ? targetIndex + 1 : targetIndex;\n\tif (sameContainer && fromIndex < index) {\n\t\tindex -= 1;\n\t}\n\treturn Math.max(0, index);\n}\n\n/**\n * Maps a paginated visible index to its absolute index in the underlying collection.\n *\n * @param visibleIndex Index within the currently rendered slice.\n * @param sliceStart Absolute index of the first item in the slice.\n * @returns The absolute index.\n */\nexport function toAbsoluteIndex(visibleIndex: number, sliceStart: number): number {\n\treturn sliceStart + visibleIndex;\n}\n\n/**\n * Determines whether `target` is `node` or any of its descendants in a tree, where children\n * are stored under the `childrenKey` property. Used to forbid dropping a node into its own\n * subtree (which would create a cycle).\n *\n * @param node Root node of the subtree to search.\n * @param target Item to look for (e.g. the parent of a candidate drop container).\n * @param childrenKey Property name holding the children collection.\n * @returns `true` when `target` is `node` or one of its descendants.\n */\nexport function containsNode(node: any, target: any, childrenKey: string): boolean {\n\tif (target == null) {\n\t\treturn false;\n\t}\n\tif (node === target) {\n\t\treturn true;\n\t}\n\tconst children = node?.[childrenKey];\n\tif (!Array.isArray(children)) {\n\t\treturn false;\n\t}\n\treturn children.some((child) => containsNode(child, target, childrenKey));\n}\n","import { DropPosition } from './types';\n\n/**\n * Minimal rectangle shape (a subset of `DOMRect`) used for drop-position math.\n */\nexport interface DropRect {\n\ttop: number;\n\tbottom: number;\n\tleft: number;\n\tright: number;\n\twidth: number;\n\theight: number;\n}\n\n/**\n * Layout axis of a draggable collection, used to decide the drop side.\n *\n * - `vertical`: rows stacked top-to-bottom (default lists, board cards).\n * - `horizontal`: items laid left-to-right (board columns).\n * - `grid`: wrapping grid (list `cards` layout) — vertical band first, then horizontal.\n */\nexport type DragAxis = 'vertical' | 'horizontal' | 'grid';\n\n/**\n * Resolves whether a dragged item should drop before or after the hovered target, based on\n * the pointer position relative to the target's bounding rectangle and the layout axis.\n *\n * For `vertical` the Y axis decides; for `horizontal` the X axis decides (mirrored in RTL);\n * for `grid` the vertical band decides across rows and the horizontal axis decides within\n * the same row (mirrored in RTL).\n *\n * @param pointerX Pointer X in viewport coordinates.\n * @param pointerY Pointer Y in viewport coordinates.\n * @param rect Bounding rectangle of the target item.\n * @param axis Layout axis of the collection.\n * @param isRtl Whether the collection is in right-to-left mode.\n * @returns `'before'` or `'after'`.\n */\nexport function resolveDropPosition(\n\tpointerX: number,\n\tpointerY: number,\n\trect: DropRect,\n\taxis: DragAxis,\n\tisRtl: boolean\n): DropPosition {\n\tif (axis === 'horizontal') {\n\t\tconst midX = rect.left + rect.width / 2;\n\t\tconst before = isRtl ? pointerX > midX : pointerX < midX;\n\t\treturn before ? 'before' : 'after';\n\t}\n\n\tconst midY = rect.top + rect.height / 2;\n\tif (axis === 'vertical') {\n\t\treturn pointerY < midY ? 'before' : 'after';\n\t}\n\n\t// grid\n\tif (pointerY < rect.top) {\n\t\treturn 'before';\n\t}\n\tif (pointerY > rect.bottom) {\n\t\treturn 'after';\n\t}\n\tconst midX = rect.left + rect.width / 2;\n\tconst before = isRtl ? pointerX > midX : pointerX < midX;\n\treturn before ? 'before' : 'after';\n}\n","import { TemplateRef } from '@angular/core';\n\n/**\n * A rendered drag image, plus a disposer to tear it down once the drag ends.\n */\nexport interface DragImageResult {\n\t/** The root element to pass to `dataTransfer.setDragImage`. */\n\tnode: HTMLElement;\n\t/** Destroys the embedded view and removes the rendered nodes. */\n\tdestroy(): void;\n}\n\n/**\n * Renders a template off-screen so it can be used as a native drag image\n * (`dataTransfer.setDragImage`). The caller is responsible for calling `setDragImage` and,\n * on `dragend`, the returned `destroy()`.\n *\n * @param template Template to render as the drag preview.\n * @param context Template context (e.g. `{ item }`).\n * @param container Optional host element to mount into; when omitted, an off-screen holder is\n * appended to `document.body`.\n * @returns The rendered image and its disposer, or `null` when nothing renders (e.g. SSR or\n * an empty template).\n */\nexport function createNativeDragImage(\n\ttemplate: TemplateRef<any>,\n\tcontext: Record<string, unknown>,\n\tcontainer?: HTMLElement\n): DragImageResult | null {\n\tif (typeof document === 'undefined') {\n\t\treturn null;\n\t}\n\tconst view = template.createEmbeddedView(context);\n\tview.detectChanges();\n\tconst node = view.rootNodes.find((candidate: Node) => candidate.nodeType === Node.ELEMENT_NODE) as\n\t\t| HTMLElement\n\t\t| undefined;\n\tif (!node) {\n\t\tview.destroy();\n\t\treturn null;\n\t}\n\n\tconst mountedNodes: Node[] = [...view.rootNodes];\n\tlet holder: HTMLElement | null = null;\n\tif (container) {\n\t\tmountedNodes.forEach((rootNode: Node) => container.appendChild(rootNode));\n\t} else {\n\t\tholder = document.createElement('div');\n\t\tholder.style.position = 'fixed';\n\t\tholder.style.top = '-9999px';\n\t\tholder.style.left = '-9999px';\n\t\tholder.style.pointerEvents = 'none';\n\t\tmountedNodes.forEach((rootNode: Node) => holder!.appendChild(rootNode));\n\t\tdocument.body.appendChild(holder);\n\t}\n\n\treturn {\n\t\tnode,\n\t\tdestroy: () => {\n\t\t\t// Angular's `EmbeddedViewRef.destroy()` tears down the view but does NOT remove the\n\t\t\t// DOM nodes it produced, so remove them explicitly to keep the helper self-contained\n\t\t\t// (no caller-side `innerHTML` clearing needed). The off-screen holder is removed whole.\n\t\t\tview.destroy();\n\t\t\tif (holder) {\n\t\t\t\tholder.remove();\n\t\t\t} else {\n\t\t\t\tmountedNodes.forEach((rootNode: Node) => (rootNode as ChildNode).remove?.());\n\t\t\t}\n\t\t}\n\t};\n}\n","/**\n * Configuration for a Pointer Events drag session — the touch/pen fallback for native\n * HTML5 drag-and-drop, used where native dragging is unavailable (mobile/tablet).\n */\nexport interface PointerDragSessionConfig {\n\t/** The `pointerdown` event that initiated the gesture. */\n\tstartEvent: PointerEvent;\n\t/** The element being dragged. */\n\tsourceEl: HTMLElement;\n\t/** Builds the floating ghost content (custom preview render or a clone). */\n\tghostFactory: () => HTMLElement;\n\t/** Distance in pixels the pointer must travel before a drag begins (default 8). */\n\tthreshold?: number;\n\t/** Called once the gesture passes the threshold and becomes a drag. */\n\tonStart: () => void;\n\t/** Called on every move while dragging, with viewport coordinates. */\n\tonMove: (clientX: number, clientY: number) => void;\n\t/** Called on drop (pointer up after a real drag), with viewport coordinates. */\n\tonDrop: (clientX: number, clientY: number) => void;\n\t/** Called when the gesture is cancelled (e.g. `pointercancel`). */\n\tonCancel: () => void;\n\t/** Always called last for cleanup, regardless of outcome. */\n\tonEnd: () => void;\n}\n\n/**\n * Handle to an in-progress Pointer Events drag session.\n */\nexport interface PointerDragSession {\n\t/** Aborts the session and runs cleanup. */\n\tdestroy(): void;\n}\n\nconst EDGE_MARGIN = 48;\nconst MAX_SCROLL_SPEED = 16;\n\n/**\n * Creates a Pointer Events drag session that mirrors native drag-and-drop on touch devices.\n *\n * The session waits for the pointer to pass a movement threshold (so taps still behave as\n * taps), then renders a floating ghost that follows the finger, reports hover positions via\n * `onMove`, autoscrolls when near a scroll container's edges, and commits on pointer up.\n *\n * @param config Session configuration.\n * @returns A handle whose `destroy()` aborts the session.\n */\nexport function createPointerDragSession(config: PointerDragSessionConfig): PointerDragSession {\n\tconst threshold = config.threshold ?? 8;\n\tconst pointerId = config.startEvent.pointerId;\n\tconst startX = config.startEvent.clientX;\n\tconst startY = config.startEvent.clientY;\n\n\tconst rect = config.sourceEl.getBoundingClientRect();\n\tconst grabOffsetX = startX - rect.left;\n\tconst grabOffsetY = startY - rect.top;\n\n\tlet started = false;\n\tlet ghost: HTMLElement | null = null;\n\tlet scrollContainer: HTMLElement | Window = window;\n\tlet rafId: number | null = null;\n\tlet scrollVelocity = 0;\n\n\t/**\n\t * Positions the ghost under the pointer.\n\t *\n\t * @param x Pointer X.\n\t * @param y Pointer Y.\n\t */\n\tconst positionGhost = (x: number, y: number): void => {\n\t\tif (ghost) {\n\t\t\tghost.style.transform = `translate(${x - grabOffsetX}px, ${y - grabOffsetY}px)`;\n\t\t}\n\t};\n\n\t/**\n\t * Runs the autoscroll animation loop while the pointer sits in an edge zone.\n\t */\n\tconst scrollStep = (): void => {\n\t\tif (scrollVelocity !== 0) {\n\t\t\tif (scrollContainer === window) {\n\t\t\t\twindow.scrollBy(0, scrollVelocity);\n\t\t\t} else {\n\t\t\t\t(scrollContainer as HTMLElement).scrollTop += scrollVelocity;\n\t\t\t}\n\t\t\trafId = requestAnimationFrame(scrollStep);\n\t\t} else {\n\t\t\trafId = null;\n\t\t}\n\t};\n\n\t/**\n\t * Updates the autoscroll velocity from the pointer's proximity to the container edges.\n\t *\n\t * @param y Pointer Y.\n\t */\n\tconst updateAutoscroll = (y: number): void => {\n\t\tconst bounds =\n\t\t\tscrollContainer === window\n\t\t\t\t? { top: 0, bottom: window.innerHeight }\n\t\t\t\t: (scrollContainer as HTMLElement).getBoundingClientRect();\n\t\tif (y < bounds.top + EDGE_MARGIN) {\n\t\t\tscrollVelocity = -Math.ceil((MAX_SCROLL_SPEED * (bounds.top + EDGE_MARGIN - y)) / EDGE_MARGIN);\n\t\t} else if (y > bounds.bottom - EDGE_MARGIN) {\n\t\t\tscrollVelocity = Math.ceil((MAX_SCROLL_SPEED * (y - (bounds.bottom - EDGE_MARGIN))) / EDGE_MARGIN);\n\t\t} else {\n\t\t\tscrollVelocity = 0;\n\t\t}\n\t\tif (scrollVelocity !== 0 && rafId === null) {\n\t\t\trafId = requestAnimationFrame(scrollStep);\n\t\t}\n\t};\n\n\t/**\n\t * Begins the actual drag once the threshold is exceeded.\n\t *\n\t * @param x Pointer X.\n\t * @param y Pointer Y.\n\t */\n\tconst beginDrag = (x: number, y: number): void => {\n\t\tstarted = true;\n\t\tscrollContainer = findScrollContainer(config.sourceEl);\n\t\tghost = config.ghostFactory();\n\t\tghost.classList.add('hub-drag-ghost');\n\t\tghost.style.position = 'fixed';\n\t\tghost.style.top = '0';\n\t\tghost.style.left = '0';\n\t\tghost.style.width = `${rect.width}px`;\n\t\tghost.style.pointerEvents = 'none';\n\t\tghost.style.zIndex = '2147483647';\n\t\tghost.style.margin = '0';\n\t\tpositionGhost(x, y);\n\t\tdocument.body.appendChild(ghost);\n\t\tconfig.onStart();\n\t};\n\n\t/**\n\t * Handles pointer movement: starts the drag past threshold, then tracks and autoscrolls.\n\t *\n\t * @param event Pointer move event.\n\t */\n\tconst onPointerMove = (event: PointerEvent): void => {\n\t\tif (event.pointerId !== pointerId) {\n\t\t\treturn;\n\t\t}\n\t\tconst { clientX, clientY } = event;\n\t\tif (!started) {\n\t\t\tif (Math.abs(clientX - startX) < threshold && Math.abs(clientY - startY) < threshold) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tbeginDrag(clientX, clientY);\n\t\t}\n\t\tevent.preventDefault();\n\t\tpositionGhost(clientX, clientY);\n\t\tconfig.onMove(clientX, clientY);\n\t\tupdateAutoscroll(clientY);\n\t};\n\n\t/**\n\t * Handles pointer up: commits the drop when a drag actually happened.\n\t *\n\t * @param event Pointer up event.\n\t */\n\tconst onPointerUp = (event: PointerEvent): void => {\n\t\tif (event.pointerId !== pointerId) {\n\t\t\treturn;\n\t\t}\n\t\tif (started) {\n\t\t\tconfig.onDrop(event.clientX, event.clientY);\n\t\t}\n\t\tcleanup();\n\t};\n\n\t/**\n\t * Handles pointer cancellation.\n\t *\n\t * @param event Pointer cancel event.\n\t */\n\tconst onPointerCancel = (event: PointerEvent): void => {\n\t\tif (event.pointerId !== pointerId) {\n\t\t\treturn;\n\t\t}\n\t\tif (started) {\n\t\t\tconfig.onCancel();\n\t\t}\n\t\tcleanup();\n\t};\n\n\t/**\n\t * Removes listeners, the ghost and any pending animation frame, then notifies the owner.\n\t */\n\tconst cleanup = (): void => {\n\t\twindow.removeEventListener('pointermove', onPointerMove);\n\t\twindow.removeEventListener('pointerup', onPointerUp);\n\t\twindow.removeEventListener('pointercancel', onPointerCancel);\n\t\tif (rafId !== null) {\n\t\t\tcancelAnimationFrame(rafId);\n\t\t\trafId = null;\n\t\t}\n\t\tscrollVelocity = 0;\n\t\tghost?.remove();\n\t\tghost = null;\n\t\ttry {\n\t\t\tconfig.sourceEl.releasePointerCapture(pointerId);\n\t\t} catch {\n\t\t\t// Pointer capture may not be held; ignore.\n\t\t}\n\t\tconfig.onEnd();\n\t};\n\n\ttry {\n\t\tconfig.sourceEl.setPointerCapture(pointerId);\n\t} catch {\n\t\t// Environments without pointer capture (e.g. tests) can still proceed.\n\t}\n\twindow.addEventListener('pointermove', onPointerMove, { passive: false });\n\twindow.addEventListener('pointerup', onPointerUp);\n\twindow.addEventListener('pointercancel', onPointerCancel);\n\n\treturn { destroy: cleanup };\n}\n\n/**\n * Finds the nearest vertically scrollable ancestor of an element, falling back to `window`.\n *\n * @param el Starting element.\n * @returns The scroll container (an element) or `window`.\n */\nfunction findScrollContainer(el: HTMLElement | null): HTMLElement | Window {\n\tlet node = el?.parentElement ?? null;\n\twhile (node && node !== document.body && node !== document.documentElement) {\n\t\tconst style = getComputedStyle(node);\n\t\tconst overflowY = style.overflowY;\n\t\tif ((overflowY === 'auto' || overflowY === 'scroll') && node.scrollHeight > node.clientHeight) {\n\t\t\treturn node;\n\t\t}\n\t\tnode = node.parentElement;\n\t}\n\treturn window;\n}\n","import { computed, Injectable, signal } from '@angular/core';\nimport { ActiveDrag, DragRegistration, DragTarget } from './types';\n\n/**\n * Singleton coordinator that backs native HTML5 drag-and-drop reordering and cross-instance\n * transfers (e.g. between two lists, or any two owners that share a drag group).\n *\n * A drag spans two component instances (source and target) and the native `dataTransfer`\n * payload is unreadable during `dragover`, so a shared, root-provided service is the only\n * reliable channel to know what is being dragged and from where while hovering. The service\n * only coordinates state; it never mutates the underlying collections.\n */\n@Injectable({ providedIn: 'root' })\nexport class HubDragDropService {\n\treadonly #registrations = new Map<string, DragRegistration>();\n\treadonly #active = signal<ActiveDrag | null>(null);\n\treadonly #target = signal<DragTarget | null>(null);\n\n\t/** The drag currently in progress, or `null`. */\n\treadonly active = this.#active.asReadonly();\n\t/** The current drop target, or `null`. */\n\treadonly target = this.#target.asReadonly();\n\t/** Whether a drag is in progress. */\n\treadonly isDragging = computed(() => this.#active() !== null);\n\n\t/**\n\t * Registers an owner so it can participate in (and be a target of) cross-owner transfers.\n\t *\n\t * @param registration The owner registration.\n\t */\n\tregister(registration: DragRegistration): void {\n\t\tthis.#registrations.set(registration.ownerId, registration);\n\t}\n\n\t/**\n\t * Removes an owner registration (call on destroy).\n\t *\n\t * @param ownerId Identifier of the owner to remove.\n\t */\n\tunregister(ownerId: string): void {\n\t\tthis.#registrations.delete(ownerId);\n\t}\n\n\t/**\n\t * Starts a drag, recording the active item and clearing any previous target.\n\t *\n\t * @param drag The active drag snapshot.\n\t */\n\tbegin(drag: ActiveDrag): void {\n\t\tthis.#active.set(drag);\n\t\tthis.#target.set(null);\n\t}\n\n\t/**\n\t * Updates the transient drop target while hovering.\n\t *\n\t * @param target The hovered target, or `null` to clear it.\n\t */\n\tsetTarget(target: DragTarget | null): void {\n\t\tthis.#target.set(target);\n\t}\n\n\t/**\n\t * Ends the current drag and clears all transient state.\n\t */\n\tend(): void {\n\t\tthis.#active.set(null);\n\t\tthis.#target.set(null);\n\t}\n\n\t/**\n\t * Determines whether the active drag may be dropped on the given owner. An owner always\n\t * accepts its own items (in-owner reorder); a different owner accepts only when both\n\t * share the same non-null drag group.\n\t *\n\t * @param targetOwnerId Identifier of the candidate target owner.\n\t * @returns `true` when the drop is allowed.\n\t */\n\tcanDrop(targetOwnerId: string): boolean {\n\t\tconst active = this.#active();\n\t\tif (!active) {\n\t\t\treturn false;\n\t\t}\n\t\tif (targetOwnerId === active.sourceId) {\n\t\t\treturn true;\n\t\t}\n\t\tconst registration = this.#registrations.get(targetOwnerId);\n\t\tif (!registration) {\n\t\t\treturn false;\n\t\t}\n\t\tconst targetGroup = registration.group();\n\t\treturn active.sourceGroup != null && targetGroup != null && active.sourceGroup === targetGroup;\n\t}\n\n\t/**\n\t * Re-renders an owner on demand (used by the destination owner to refresh the source owner\n\t * after a cross-owner transfer).\n\t *\n\t * @param ownerId Identifier of the owner to refresh.\n\t */\n\trefreshSource(ownerId: string): void {\n\t\tthis.#registrations.get(ownerId)?.refresh?.();\n\t}\n\n\t/**\n\t * Asks an owner to commit the pending drop as the destination (Pointer Events fallback,\n\t * where the source component drives the gesture but the destination must commit/emit).\n\t *\n\t * @param ownerId Identifier of the destination owner.\n\t */\n\trequestCommit(ownerId: string): void {\n\t\tthis.#registrations.get(ownerId)?.commit?.();\n\t}\n\n\t/**\n\t * Resolves the drop target under a viewport point by hit-testing the DOM and delegating to\n\t * the owning component (which knows its own collections). Used by the Pointer Events\n\t * fallback, including cross-owner hovers where the target is a different component.\n\t *\n\t * @param clientX Viewport X coordinate.\n\t * @param clientY Viewport Y coordinate.\n\t * @returns The resolved target, or `null` when the point is not over a droppable owner.\n\t */\n\tresolveTargetAt(clientX: number, clientY: number): DragTarget | null {\n\t\tif (typeof document === 'undefined') {\n\t\t\treturn null;\n\t\t}\n\t\tconst element = document.elementFromPoint(clientX, clientY) as HTMLElement | null;\n\t\tconst hostEl = element?.closest('[data-hub-drag-owner]') as HTMLElement | null;\n\t\tconst ownerId = hostEl?.getAttribute('data-hub-drag-owner');\n\t\tif (!element || !ownerId || !this.canDrop(ownerId)) {\n\t\t\treturn null;\n\t\t}\n\t\treturn this.#registrations.get(ownerId)?.resolveTarget?.(element, clientX, clientY) ?? null;\n\t}\n}\n","/**\n * Native HTML5 drag-and-drop core shared across ng-hub-ui libraries.\n *\n * Provides the engine-agnostic, reusable pieces of a native drag-and-drop implementation:\n * pure array helpers, drop-position geometry, drag-image rendering, a Pointer Events touch\n * fallback, a singleton coordinator service (cross-instance transfers) and shared types.\n * UI primitives (handle/placeholder/preview directives) stay per-library, since their\n * selectors and data models differ.\n */\nexport * from './array-utils';\nexport * from './drop-position';\nexport * from './drag-image';\nexport * from './pointer-drag';\nexport * from './drag-drop.service';\nexport * from './types';\n","import { NgZone } from '@angular/core';\n\nimport { fromEvent, Observable } from 'rxjs';\nimport { filter, map, takeUntil, withLatestFrom } from 'rxjs/operators';\n\nexport const FOCUSABLE_ELEMENTS_SELECTOR = [\n\t'a[href]',\n\t'button:not([disabled])',\n\t'input:not([disabled]):not([type=\"hidden\"])',\n\t'select:not([disabled])',\n\t'textarea:not([disabled])',\n\t'[contenteditable]',\n\t'[tabindex]:not([tabindex=\"-1\"])'\n].join(', ');\n\n/**\n * Returns first and last focusable elements inside of a given element based on specific CSS selector\n */\nexport function getFocusableBoundaryElements(\n\telement: HTMLElement\n): HTMLElement[] {\n\tconst list: HTMLElement[] = Array.from(\n\t\telement.querySelectorAll(\n\t\t\tFOCUSABLE_ELEMENTS_SELECTOR\n\t\t) as NodeListOf<HTMLElement>\n\t).filter((el) => el.tabIndex !== -1);\n\treturn [list[0], list[list.length - 1]];\n}\n\n/**\n * Function that enforces browser focus to be trapped inside a DOM element.\n *\n * Works only for clicks inside the element and navigation with 'Tab', ignoring clicks outside of the element\n *\n * @param zone Angular zone\n * @param element The element around which focus will be trapped inside\n * @param stopFocusTrap$ The observable stream. When completed the focus trap will clean up listeners\n * and free internal resources\n * @param refocusOnClick Put the focus back to the last focused element whenever a click occurs on element (default to\n * false)\n */\nexport const hubFocusTrap = (\n\tzone: NgZone,\n\telement: HTMLElement,\n\tstopFocusTrap$: Observable<any>,\n\trefocusOnClick = false\n) => {\n\tzone.runOutsideAngular(() => {\n\t\t// last focused element\n\t\tconst lastFocusedElement$ = fromEvent<FocusEvent>(\n\t\t\telement,\n\t\t\t'focusin'\n\t\t).pipe(\n\t\t\ttakeUntil(stopFocusTrap$),\n\t\t\tmap((e) => e.target)\n\t\t);\n\n\t\t// 'tab' / 'shift+tab' stream\n\t\tfromEvent<KeyboardEvent>(element, 'keydown')\n\t\t\t.pipe(\n\t\t\t\ttakeUntil(stopFocusTrap$),\n\t\t\t\tfilter((e) => e.key === 'Tab'),\n\t\t\t\twithLatestFrom(lastFocusedElement$)\n\t\t\t)\n\t\t\t.subscribe(([tabEvent, focusedElement]) => {\n\t\t\t\tconst [first, last] = getFocusableBoundaryElements(element);\n\n\t\t\t\tif (\n\t\t\t\t\t(focusedElement === first || focusedElement === element) &&\n\t\t\t\t\ttabEvent.shiftKey\n\t\t\t\t) {\n\t\t\t\t\tlast.focus();\n\t\t\t\t\ttabEvent.preventDefault();\n\t\t\t\t}\n\n\t\t\t\tif (focusedElement === last && !tabEvent.shiftKey) {\n\t\t\t\t\tfirst.focus();\n\t\t\t\t\ttabEvent.preventDefault();\n\t\t\t\t}\n\t\t\t});\n\n\t\t// inside click\n\t\tif (refocusOnClick) {\n\t\t\tfromEvent(element, 'click')\n\t\t\t\t.pipe(\n\t\t\t\t\ttakeUntil(stopFocusTrap$),\n\t\t\t\t\twithLatestFrom(lastFocusedElement$),\n\t\t\t\t\tmap((arr) => arr[1] as HTMLElement)\n\t\t\t\t)\n\t\t\t\t.subscribe((lastFocusedElement) => lastFocusedElement.focus());\n\t\t}\n\t});\n};\n","import { effect, NgZone, Signal, signal } from '@angular/core';\nimport { Observable, OperatorFunction } from 'rxjs';\n\n/**\n * Converts a value to an integer using parseInt.\n *\n * @param {any} value - The `value` parameter in the `toInteger` function is the input value that needs to be converted to an\n * integer.\n *\n * @returns Is returning the parsed integer value of the input `value`.\n */\nexport function toInteger(value: any): number {\n\treturn parseInt(`${value}`, 10);\n}\n\nexport function toString(value: any): string {\n\treturn value !== undefined && value !== null ? `${value}` : '';\n}\n\nexport function getValueInRange(value: number, max: number, min = 0): number {\n\treturn Math.max(Math.min(value, max), min);\n}\n\nexport function isString(value: any): value is string {\n\treturn typeof value === 'string';\n}\n\nexport function isNumber(value: any): value is number {\n\treturn !isNaN(toInteger(value));\n}\n\nexport function isInteger(value: any): value is number {\n\treturn (\n\t\ttypeof value === 'number' &&\n\t\tisFinite(value) &&\n\t\tMath.floor(value) === value\n\t);\n}\n\nexport function isDefined(value: any): boolean {\n\treturn value !== undefined && value !== null;\n}\n\n/**\n * Determines if two objects or values are equivalent.\n *\n * @param o1 Object or value to compare.\n * @param o2 Object or value to compare.\n * @returns true if arguments are equal.\n */\nexport function equals(o1: any, o2: any): boolean {\n\tif (o1 === o2) {\n\t\treturn true;\n\t}\n\tif (o1 === null || o2 === null) {\n\t\treturn false;\n\t}\n\tif (o1 !== o1 && o2 !== o2) {\n\t\treturn true;\n\t} // NaN === NaN\n\tlet t1 = typeof o1,\n\t\tt2 = typeof o2,\n\t\tlength: number,\n\t\tkey: any,\n\t\tkeySet: any;\n\tif (t1 == t2 && t1 == 'object') {\n\t\tif (Array.isArray(o1)) {\n\t\t\tif (!Array.isArray(o2)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif ((length = o1.length) == o2.length) {\n\t\t\t\tfor (key = 0; key < length; key++) {\n\t\t\t\t\tif (!equals(o1[key], o2[key])) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t} else {\n\t\t\tif (Array.isArray(o2)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tkeySet = Object.create(null);\n\t\t\tfor (key in o1) {\n\t\t\t\tif (!equals(o1[key], o2[key])) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tkeySet[key] = true;\n\t\t\t}\n\t\t\tfor (key in o2) {\n\t\t\t\tif (!(key in keySet) && typeof o2[key] !== 'undefined') {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\n/**\n * Checks if a value is a Promise.\n *\n * @param {any} v - The parameter `v` in the `isPromise` function represents any value that is being checked to determine if it is\n * a Promise.\n *\n * @returns A boolean value indicating whether the input `v` is a Promise or not. If `v` has a `then` property, it is considered\n * a Promise and the function returns `true`. Otherwise, it returns `false`.\n */\nexport function isPromise<T>(v: any): v is Promise<T> {\n\treturn v && v.then;\n}\n\n/**\n * Pads a number with a leading zero if it is a valid number.\n *\n * @param {number} value - The `padNumber` function takes a number as input and pads it with a leading zero if it is a valid\n * number. If the input is not a number, it returns an empty string.\n *\n * @returns Takes a number as input and pads it with a leading zero if it is a valid number. If the input is a number, the function\n * returns the input value padded with a leading zero and sliced to keep only the last two characters. If the input is not a number,\n * an empty string is returned.\n */\nexport function padNumber(value: number) {\n\tif (isNumber(value)) {\n\t\treturn `0${value}`.slice(-2);\n\t} else {\n\t\treturn '';\n\t}\n}\n\n/**\n * Escapes special characters in a given text to be used in a regular expression.\n *\n * @param text - The `regExpEscape` function takes a `text` parameter as input. This function is designed to escape special\n * characters in a given text so that it can be safely used within a regular expression pattern.\n *\n * @returns A new string with any special characters in the input `text` escaped with a backslash.\n */\nexport function regExpEscape(text: string): string {\n\treturn text.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&');\n}\n\nexport function closest(\n\telement: HTMLElement,\n\tselector?: string\n): HTMLElement | null {\n\tif (!selector) {\n\t\treturn null;\n\t}\n\n\t/*\n\t * In certain browsers (e.g. Edge 44.18362.449.0) HTMLDocument does\n\t * not support `Element.prototype.closest`. To emulate the correct behaviour\n\t * we return null when the method is missing.\n\t *\n\t * Note that in evergreen browsers `closest(document.documentElement, 'html')`\n\t * will return the document element whilst in Edge null will be returned. This\n\t * compromise was deemed good enough.\n\t */\n\tif (typeof element.closest === 'undefined') {\n\t\treturn null;\n\t}\n\n\treturn element.closest(selector);\n}\n\n/**\n * Force a browser reflow\n *\n * @param element element where to apply the reflow\n */\nexport function reflow(element: HTMLElement) {\n\treturn (element || document.body).getBoundingClientRect();\n}\n\n/**\n * Creates an observable where all callbacks are executed inside a given zone\n *\n * @param zone\n */\nexport function runInZone<T>(zone: NgZone): OperatorFunction<T, T> {\n\treturn (source) => {\n\t\treturn new Observable((observer) => {\n\t\t\tconst next = (value: T) => zone.run(() => observer.next(value));\n\t\t\tconst error = (e: any) => zone.run(() => observer.error(e));\n\t\t\tconst complete = () => zone.run(() => observer.complete());\n\t\t\treturn source.subscribe({ next, error, complete });\n\t\t});\n\t};\n}\n\nexport function removeAccents(str: string): string {\n\treturn str.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '');\n}\n\n/**\n * Replaces placeholders in a string with corresponding values from a given object.\n *\n * @param expr a string that represents the expression to be interpolated.\n * @param params an optional object that contains the values to be interpolated into the expr string.\n * @returns the interpolated string.\n */\nexport function interpolateString(\n\texpr: string = '',\n\tparams: any = {},\n\ttemplateMatcher: RegExp = /{{\\s?([^{}\\s]*)\\s?}}/g\n) {\n\tif (!params) {\n\t\treturn expr;\n\t}\n\n\treturn expr.replace(templateMatcher, (substring: string, b: string) => {\n\t\tlet r = getValue(params, b);\n\t\treturn isDefined(r) ? r : substring;\n\t});\n}\n\n/**\n * Retrieves the value of a nested property from an object using dot notation.\n *\n * @param target the object from which you want to retrieve a value.\n * @param key a string that represents the property or nested properties of the target object.\n * @returns the value of the specified key in the target object.\n */\nexport function getValue(target: any, key: string): any {\n\tlet keys = typeof key === 'string' ? key.split('.') : [key];\n\tkey = '';\n\tdo {\n\t\tkey += keys.shift();\n\t\tif (\n\t\t\tisDefined(target) &&\n\t\t\tisDefined(target[key]) &&\n\t\t\t(typeof target[key] === 'object' || !keys.length)\n\t\t) {\n\t\t\ttarget = target[key];\n\t\t\tkey = '';\n\t\t} else if (!keys.length) {\n\t\t\ttarget = undefined;\n\t\t} else {\n\t\t\tkey += '.';\n\t\t}\n\t} while (keys.length);\n\n\treturn target;\n}\n\n/**\n * Checks if the given item is a plain object (not an array, null, or primitive).\n *\n * @param item Value to test.\n * @returns true when item is a non-null, non-array object.\n */\nexport function isObject(item: any): boolean {\n\treturn item !== null && typeof item === 'object' && !Array.isArray(item);\n}\n\n/**\n * Recursively deep-merges source into target, producing a new object.\n * Arrays are replaced, not merged. Primitives from source win.\n *\n * @param target Base object.\n * @param source Overrides to apply on top of target.\n * @returns New merged object.\n */\nexport function mergeDeep(target: any, source: any): any {\n\tconst output = Object.assign({}, target);\n\tif (isObject(target) && isObject(source)) {\n\t\tObject.keys(source).forEach((key: any) => {\n\t\t\tif (isObject(source[key])) {\n\t\t\t\tif (!(key in target)) {\n\t\t\t\t\tObject.assign(output, { [key]: source[key] });\n\t\t\t\t} else {\n\t\t\t\t\toutput[key] = mergeDeep(target[key], source[key]);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tObject.assign(output, { [key]: source[key] });\n\t\t\t}\n\t\t});\n\t}\n\treturn output;\n}\n\n/**\n * Generates a random alphanumeric string of the requested length.\n * Not cryptographically secure — intended for transient DOM ids and keys.\n *\n * @param length Desired character count.\n * @returns Random alphanumeric string.\n */\nexport function generateUniqueId(length: number): string {\n\tconst chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n\tlet result = '';\n\tfor (let i = 0; i < length; i++) {\n\t\tresult += chars.charAt(Math.floor(Math.random() * chars.length));\n\t}\n\treturn result;\n}\n\n/**\n * Creates a read-only signal that mirrors sourceSignal but only updates\n * after debounceDelay ms have elapsed since the last emission.\n * Cleans up the pending timer via the Angular effect cleanup mechanism.\n *\n * @template T Type of the signal value.\n * @param sourceSignal Signal to debounce.\n * @param debounceDelay Milliseconds to wait, or a signal that provides the delay.\n * @returns Debounced read-only signal.\n */\nexport function debouncedSignal<T>(sourceSignal: Signal<T>, debounceDelay: number | Signal<number> = 0): Signal<T> {\n\tconst debounced = signal(sourceSignal());\n\n\teffect((onCleanup) => {\n\t\tconst delay = typeof debounceDelay === 'number' ? debounceDelay : debounceDelay();\n\t\tconst value = sourceSignal();\n\n\t\tconst timeout = setTimeout(() => {\n\t\t\tdebounced.set(value);\n\t\t}, delay);\n\n\t\tonCleanup(() => clearTimeout(timeout));\n\t});\n\n\treturn debounced;\n}\n\n/**\n * Returns the active element in the given root.\n *\n * If the active element is inside a shadow root, it is searched recursively.\n */\nexport function getActiveElement(\n\troot: Document | ShadowRoot = document\n): Element | null {\n\tconst activeEl = root?.activeElement;\n\n\tif (!activeEl) {\n\t\treturn null;\n\t}\n\n\treturn activeEl.shadowRoot\n\t\t? getActiveElement(activeEl.shadowRoot)\n\t\t: activeEl;\n}\n","import { InjectionToken } from '@angular/core';\n\nexport interface HubTranslationConfig {\n\tdictionaries?: Record<string, Record<string, any>>;\n\tlanguage?: string;\n\tfallbackLanguage?: string;\n}\n\nexport const HUB_TRANSLATION_CONFIG = new InjectionToken<HubTranslationConfig>(\n\t'HUB_TRANSLATION_CONFIG'\n);\n","import { Injectable, inject } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { getValue } from '../util';\nimport { HUB_TRANSLATION_CONFIG, HubTranslationConfig } from './translation.tokens';\n\n@Injectable()\nexport class HubTranslationService {\n\t#config: HubTranslationConfig =\n\t\tinject(HUB_TRANSLATION_CONFIG, { optional: true }) ?? {};\n\n\tdefaultTranslations: Record<string, string | any> =\n\t\tthis.#config.dictionaries ?? {};\n\n\ttranslations!: Record<string, string>;\n\n\tprivate translationSource = new Subject<any>();\n\n\ttranslationObserver = this.translationSource.asObservable();\n\n\tconstructor() {\n\t\tthis.initialize();\n\t}\n\n\tinitialize() {\n\t\tconst language = this.#config.language ?? this.#config.fallbackLanguage ?? 'en';\n\t\tconst fallbackLanguage = this.#config.fallbackLanguage ?? 'en';\n\t\tconst fallbackTranslations =\n\t\t\tthis.defaultTranslations[fallbackLanguage] ?? {};\n\t\tconst selectedTranslations =\n\t\t\tthis.defaultTranslations[language] ?? fallbackTranslations;\n\n\t\tthis.setTranslations(selectedTranslations);\n\t}\n\n\t/**\n\t * Retrieves a value from a translations object based on a given key.\n\t */\n\tgetTranslation(key: string): any {\n\t\treturn getValue(this.translations, key);\n\t}\n\n\t/**\n\t * Merges fallback translations with the provided translations and updates observers.\n\t */\n\tsetTranslations(translations: Record<string, string> | any = {}) {\n\t\tconst fallbackLanguage = this.#config.fallbackLanguage ?? 'en';\n\t\tconst fallbackTranslations =\n\t\t\tthis.defaultTranslations[fallbackLanguage] ?? {};\n\t\tconst nextTranslations = translations ?? {};\n\n\t\tthis.translations = { ...fallbackTranslations, ...nextTranslations };\n\t\tthis.translationSource.next(this.translations);\n\t}\n}\n","import { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\nimport { HubTranslationService } from './translation.service';\nimport { HUB_TRANSLATION_CONFIG, HubTranslationConfig } from './translation.tokens';\n\n/**\n * Helper function to provide HubTranslationService and its configuration.\n * @param config Optional configuration for translations.\n * @returns EnvironmentProviders\n */\nexport function provideHubTranslation(config: HubTranslationConfig = {}): EnvironmentProviders {\n\treturn makeEnvironmentProviders([\n\t\tHubTranslationService,\n\t\t{\n\t\t\tprovide: HUB_TRANSLATION_CONFIG,\n\t\t\tuseValue: config\n\t\t}\n\t]);\n}\n","import { ElementRef } from '@angular/core';\nimport type { ConnectionPosition } from './connection-position';\nimport type { HorizontalConnectionPos } from './horizontal-connection-pos';\nimport type { VerticalConnectionPos } from './vertical-connection-pos';\n\n/**\n * Positions an overlay container relative to an origin element.\n * The first configured position that fits within the viewport is applied.\n */\nexport class OverlayPosition {\n\tprivate _origin: ElementRef | HTMLElement | null = null;\n\tprivate _positions: ConnectionPosition[] = [];\n\n\t/**\n\t * Sets the origin element used to position the overlay.\n\t *\n\t * @param origin Element reference or HTMLElement.\n\t * @returns This position instance for chaining.\n\t */\n\tflexibleConnectedTo(origin: ElementRef | HTMLElement): this {\n\t\tthis._origin = origin;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the preferred positions for the overlay.\n\t * The order of the array determines the fallback priority.\n\t *\n\t * @param positions Array of position configurations.\n\t * @returns This position instance for chaining.\n\t */\n\twithPositions(positions: ConnectionPosition[]): this {\n\t\tthis._positions = positions;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Applies the calculated position to the overlay element.\n\t *\n\t * @param overlayElement The overlay container element.\n\t */\n\tapply(overlayElement: HTMLElement): void {\n\t\tif (!this._origin) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst originElement = this._origin instanceof ElementRef ? this._origin.nativeElement : this._origin;\n\t\tconst originRect = originElement.getBoundingClientRect();\n\n\t\t// Try each position until we find one that fits in the viewport\n\t\tfor (const position of this._positions) {\n\t\t\tconst coords = this._calculatePosition(originRect, overlayElement, position);\n\n\t\t\tif (this._fitsInViewport(coords, overlayElement)) {\n\t\t\t\tthis._applyPosition(overlayElement, coords);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// If no position fits perfectly, use the first one\n\t\tif (this._positions.length > 0) {\n\t\t\tconst coords = this._calculatePosition(originRect, overlayElement, this._positions[0]);\n\t\t\tthis._applyPosition(overlayElement, coords);\n\t\t}\n\t}\n\n\t/**\n\t * Calculates the position coordinates based on the configuration.\n\t *\n\t * @param originRect Bounding rectangle of the origin element.\n\t * @param overlayElement The overlay element.\n\t * @param position Position configuration.\n\t * @returns Calculated x and y coordinates.\n\t */\n\tprivate _calculatePosition(originRect: DOMRect, overlayElement: HTMLElement, position: ConnectionPosition): { x: number; y: number } {\n\t\tconst overlayRect = overlayElement.getBoundingClientRect();\n\n\t\t// Calculate origin point\n\t\tlet x = this._getOriginX(originRect, position.originX);\n\t\tlet y = this._getOriginY(originRect, position.originY);\n\n\t\t// Adjust for overlay alignment\n\t\tx -= this._getOverlayX(overlayRect, position.overlayX);\n\t\ty -= this._getOverlayY(overlayRect, position.overlayY);\n\n\t\t// Apply offsets\n\t\tif (position.offsetX) {\n\t\t\tx += position.offsetX;\n\t\t}\n\t\tif (position.offsetY) {\n\t\t\ty += position.offsetY;\n\t\t}\n\n\t\treturn { x, y };\n\t}\n\n\t/**\n\t * Gets the X coordinate for the origin point.\n\t */\n\tprivate _getOriginX(rect: DOMRect, position: HorizontalConnectionPos): number {\n\t\tswitch (position) {\n\t\t\tcase 'start':\n\t\t\t\treturn rect.left;\n\t\t\tcase 'center':\n\t\t\t\treturn rect.left + rect.width / 2;\n\t\t\tcase 'end':\n\t\t\t\treturn rect.right;\n\t\t}\n\t}\n\n\t/**\n\t * Gets the Y coordinate for the origin point.\n\t */\n\tprivate _getOriginY(rect: DOMRect, position: VerticalConnectionPos): number {\n\t\tswitch (position) {\n\t\t\tcase 'top':\n\t\t\t\treturn rect.top;\n\t\t\tcase 'center':\n\t\t\t\treturn rect.top + rect.height / 2;\n\t\t\tcase 'bottom':\n\t\t\t\treturn rect.bottom;\n\t\t}\n\t}\n\n\t/**\n\t * Gets the X offset for the overlay alignment.\n\t */\n\tprivate _getOverlayX(rect: DOMRect, position: HorizontalConnectionPos): number {\n\t\tswitch (position) {\n\t\t\tcase 'start':\n\t\t\t\treturn 0;\n\t\t\tcase 'center':\n\t\t\t\treturn rect.width / 2;\n\t\t\tcase 'end':\n\t\t\t\treturn rect.width;\n\t\t}\n\t}\n\n\t/**\n\t * Gets the Y offset for the overlay alignment.\n\t */\n\tprivate _getOverlayY(rect: DOMRect, position: VerticalConnectionPos): number {\n\t\tswitch (position) {\n\t\t\tcase 'top':\n\t\t\t\treturn 0;\n\t\t\tcase 'center':\n\t\t\t\treturn rect.height / 2;\n\t\t\tcase 'bottom':\n\t\t\t\treturn rect.height;\n\t\t}\n\t}\n\n\t/**\n\t * Checks if the overlay fits within the viewport at the given coordinates.\n\t */\n\tprivate _fitsInViewport(\n\t\tcoords: { x: number; y: number },\n\t\toverlayElement: HTMLElement\n\t): boolean {\n\t\tconst overlayRect = overlayElement.getBoundingClientRect();\n\t\tconst viewportWidth = window.innerWidth;\n\t\tconst viewportHeight = window.innerHeight;\n\n\t\treturn (\n\t\t\tcoords.x >= 0 &&\n\t\t\tcoords.y >= 0 &&\n\t\t\tcoords.x + overlayRect.width <= viewportWidth &&\n\t\t\tcoords.y + overlayRect.height <= viewportHeight\n\t\t);\n\t}\n\n\t/**\n\t * Applies the calculated position to the overlay element.\n\t */\n\tprivate _applyPosition(\n\t\toverlayElement: HTMLElement,\n\t\tcoords: { x: number; y: number }\n\t): void {\n\t\toverlayElement.style.left = `${coords.x}px`;\n\t\toverlayElement.style.top = `${coords.y}px`;\n\t}\n}\n","import {\n\tApplicationRef,\n\tComponentRef,\n\tcreateComponent,\n\tEmbeddedViewRef,\n\tTemplateRef,\n\tType,\n\tViewContainerRef\n} from '@angular/core';\nimport type { OverlayConfig } from './overlay-config';\n\n/**\n * Manages a single overlay instance created by {@link OverlayService}.\n * Creates a container and optional backdrop in `document.body` and attaches\n * either a template or component as the overlay content.\n */\nexport class OverlayRef {\n\tprivate _backdropElement: HTMLElement | null = null;\n\tprivate _containerElement: HTMLElement | null = null;\n\tprivate _contentElement: HTMLElement | null = null;\n\tprivate _viewRef: EmbeddedViewRef<unknown> | null = null;\n\tprivate _componentRef: ComponentRef<unknown> | null = null;\n\tprivate _isAttached = false;\n\tprivate _backdropClickCallback?: () => void;\n\tprivate _backdropClickHandler?: () => void;\n\n\tconstructor(\n\t\tprivate _config: OverlayConfig,\n\t\tprivate _appRef: ApplicationRef\n\t) {}\n\n\t/**\n\t * Attaches content to the overlay.\n\t *\n\t * If the overlay is already attached, it only updates the position strategy\n\t * and returns the existing content element.\n\t *\n\t * @param content Template or component type to attach.\n\t * @param viewContainerRef View container used to create embedded views for templates.\n\t * @returns The attached content element (first root node).\n\t * @throws When a {@link TemplateRef} is provided without a {@link ViewContainerRef}.\n\t */\n\tattach(\n\t\tcontent: TemplateRef<unknown> | Type<unknown>,\n\t\tviewContainerRef?: ViewContainerRef\n\t): HTMLElement {\n\t\t// If already attached, just update position and return existing element\n\t\tif (this._isAttached && this._contentElement) {\n\t\t\tif (this._config.positionStrategy) {\n\t\t\t\tthis._config.positionStrategy.apply(this._containerElement!);\n\t\t\t}\n\t\t\treturn this._contentElement;\n\t\t}\n\n\t\tthis._createContainer();\n\t\tthis._createBackdrop();\n\n\t\tlet contentElement: HTMLElement;\n\n\t\tif (content instanceof TemplateRef) {\n\t\t\tif (!viewContainerRef) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'ViewContainerRef is required when attaching a TemplateRef'\n\t\t\t\t);\n\t\t\t}\n\t\t\t// Only create and attach view if not already created\n\t\t\tif (!this._viewRef) {\n\t\t\t\tthis._viewRef = viewContainerRef.createEmbeddedView(content);\n\t\t\t\tthis._viewRef.detectChanges();\n\t\t\t}\n\t\t\tcontentElement = this._viewRef.rootNodes[0] as HTMLElement;\n\t\t} else {\n\t\t\tif (this._componentRef) {\n\t\t\t\tthis._appRef.detachView(this._componentRef.hostView);\n\t\t\t\tthis._componentRef.destroy();\n\t\t\t}\n\t\t\tthis._componentRef = createComponent(content, {\n\t\t\t\tenvironmentInjector: this._appRef.injector\n\t\t\t});\n\t\t\tthis._appRef.attachView(this._componentRef.hostView);\n\t\t\tcontentElement = (this._componentRef.hostView as EmbeddedViewRef<unknown>)\n\t\t\t\t.rootNodes[0] as HTMLElement;\n\t\t}\n\n\t\tthis._contentElement = contentElement;\n\n\t\t// Only append if not already in container\n\t\tif (!this._containerElement!.contains(contentElement)) {\n\t\t\tthis._containerElement!.appendChild(contentElement);\n\t\t}\n\n\t\tthis._isAttached = true;\n\n\t\t// Apply position strategy\n\t\tif (this._config.positionStrategy) {\n\t\t\tthis._config.positionStrategy.apply(this._containerElement!);\n\t\t}\n\n\t\treturn contentElement;\n\t}\n\n\t/**\n\t * Detaches the content from the overlay container without disposing the overlay.\n\t */\n\tdetach(): void {\n\t\tif (!this._isAttached) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._contentElement && this._containerElement) {\n\t\t\tthis._containerElement.removeChild(this._contentElement);\n\t\t}\n\n\t\tthis._isAttached = false;\n\t}\n\n\t/**\n\t * Disposes the overlay and cleans up all allocated resources.\n\t */\n\tdispose(): void {\n\t\tthis.detach();\n\n\t\t// Destroy view ref if exists\n\t\tif (this._viewRef) {\n\t\t\tthis._viewRef.destroy();\n\t\t\tthis._viewRef = null;\n\t\t}\n\n\t\tif (this._componentRef) {\n\t\t\tthis._appRef.detachView(this._componentRef.hostView);\n\t\t\tthis._componentRef.destroy();\n\t\t\tthis._componentRef = null;\n\t\t}\n\n\t\tif (this._containerElement) {\n\t\t\tdocument.body.removeChild(this._containerElement);\n\t\t\tthis._containerElement = null;\n\t\t}\n\n\t\tif (this._backdropElement) {\n\t\t\t// Remove event listener before removing element from DOM\n\t\t\tif (this._backdropClickHandler) {\n\t\t\t\tthis._backdropElement.removeEventListener(\n\t\t\t\t\t'click',\n\t\t\t\t\tthis._backdropClickHandler\n\t\t\t\t);\n\t\t\t\tthis._backdropClickHandler = undefined;\n\t\t\t}\n\t\t\tdocument.body.removeChild(this._backdropElement);\n\t\t\tthis._backdropElement = null;\n\t\t}\n\n\t\tthis._contentElement = null;\n\t\tthis._backdropClickCallback = undefined;\n\t}\n\n\t/**\n\t * Checks whether content is currently attached to the overlay.\n\t */\n\thasAttached(): boolean {\n\t\treturn this._isAttached;\n\t}\n\n\t/**\n\t * Registers a callback for backdrop clicks.\n\t * The last registered callback replaces any previous one.\n\t *\n\t * @param callback Function to call when the backdrop is clicked.\n\t */\n\tonBackdropClick(callback: () => void): void {\n\t\tthis._backdropClickCallback = callback;\n\t}\n\n\t/**\n\t * Re-applies the configured position strategy to the overlay container.\n\t */\n\tupdatePosition(): void {\n\t\tif (this._config.positionStrategy && this._containerElement) {\n\t\t\tthis._config.positionStrategy.apply(this._containerElement);\n\t\t}\n\t}\n\n\t/**\n\t * Creates the overlay container element and appends it to the document.\n\t */\n\tprivate _createContainer(): void {\n\t\tif (this._containerElement) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._containerElement = document.createElement('div');\n\t\tthis._containerElement.classList.add('hub-overlay-container');\n\n\t\tif (this._config.panelClass) {\n\t\t\tconst classes = Array.isArray(this._config.panelClass)\n\t\t\t\t? this._config.panelClass\n\t\t\t\t: [this._config.panelClass];\n\t\t\tclasses.forEach((cls) => this._containerElement!.classList.add(cls));\n\t\t}\n\n\t\tif (this._config.width) {\n\t\t\tthis._containerElement.style.width =\n\t\t\t\ttypeof this._config.width === 'number'\n\t\t\t\t\t? `${this._config.width}px`\n\t\t\t\t\t: this._config.width;\n\t\t}\n\n\t\tif (this._config.height) {\n\t\t\tthis._containerElement.style.height =\n\t\t\t\ttypeof this._config.height === 'number'\n\t\t\t\t\t? `${this._config.height}px`\n\t\t\t\t\t: this._config.height;\n\t\t}\n\n\t\tthis._containerElement.style.position = 'fixed';\n\t\tthis._containerElement.style.zIndex = '1000';\n\n\t\tdocument.body.appendChild(this._containerElement);\n\t}\n\n\t/**\n\t * Creates the backdrop element if enabled and appends it to the document.\n\t */\n\tprivate _createBackdrop(): void {\n\t\tif (!this._config.hasBackdrop || this._backdropElement) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._backdropElement = document.createElement('div');\n\t\tthis._backdropElement.classList.add('hub-overlay-backdrop');\n\n\t\tif (this._config.backdropClass) {\n\t\t\tthis._backdropElement.classList.add(this._config.backdropClass);\n\t\t}\n\n\t\tthis._backdropElement.style.position = 'fixed';\n\t\tthis._backdropElement.style.top = '0';\n\t\tthis._backdropElement.style.left = '0';\n\t\tthis._backdropElement.style.width = '100%';\n\t\tthis._backdropElement.style.height = '100%';\n\t\tthis._backdropElement.style.zIndex = '999';\n\n\t\t// Store reference to the handler for cleanup\n\t\tthis._backdropClickHandler = () => {\n\t\t\tif (this._backdropClickCallback) {\n\t\t\t\tthis._backdropClickCallback();\n\t\t\t}\n\t\t};\n\n\t\tthis._backdropElement.addEventListener('click', this._backdropClickHandler);\n\n\t\tdocument.body.appendChild(this._backdropElement);\n\t}\n}\n","import { ApplicationRef, inject, Injectable } from '@angular/core';\nimport { OverlayPosition } from './overlay-position';\nimport { OverlayRef } from './overlay-ref';\nimport type { OverlayConfig } from './overlay-config';\n\n/**\n * Service for creating and managing overlay instances.\n */\n@Injectable({\n\tprovidedIn: 'root'\n})\nexport class OverlayService {\n\tprivate readonly _appRef = inject(ApplicationRef);\n\n\t/**\n\t * Creates a new overlay with the specified configuration.\n\t *\n\t * @param config Configuration options for the overlay.\n\t * @returns A reference to the created overlay.\n\t */\n\tcreate(config: OverlayConfig = {}): OverlayRef {\n\t\treturn new OverlayRef(config, this._appRef);\n\t}\n\n\t/**\n\t * Creates a position strategy builder for connected overlays.\n\t *\n\t * @returns A new {@link OverlayPosition} instance.\n\t */\n\tposition(): OverlayPosition {\n\t\treturn new OverlayPosition();\n\t}\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n\tname: 'get',\n\tstandalone: true\n})\nexport class GetPipe implements PipeTransform {\n\t/**\n\t * @param value The object to retrieve the property from.\n\t * @param path The dot-separated path string to the property.\n\t * @param defaultValue The value to return if the property is not found.\n\t */\n\ttransform(value: any, path: string, defaultValue?: any): any {\n\t\tif (typeof path !== 'string') {\n\t\t\treturn value;\n\t\t}\n\t\treturn path\n\t\t\t.split('.')\n\t\t\t.reduce(\n\t\t\t\t(a, c) =>\n\t\t\t\t\ta && a[c] !== null && a[c] !== undefined\n\t\t\t\t\t\t? a[c]\n\t\t\t\t\t\t: defaultValue || null,\n\t\t\t\tvalue\n\t\t\t);\n\t}\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n\tname: 'isObject'\n})\nexport class IsObjectPipe implements PipeTransform {\n\n\ttransform(value: any): boolean {\n\t\treturn typeof value === 'object';\n\t}\n\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { isObservable, Observable } from 'rxjs';\n\n@Pipe({\n\tname: 'isObservable',\n\tstandalone: true\n})\nexport class IsObservablePipe<T = any> implements PipeTransform {\n\ttransform(value: T | Observable<T>): boolean {\n\t\treturn isObservable(value);\n\t}\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n\tname: 'isString'\n})\nexport class IsStringPipe implements PipeTransform {\n\n\ttransform(value: any): boolean {\n\t\treturn typeof value === 'string';\n\t}\n\n}\n","import { ChangeDetectorRef, OnDestroy, Pipe, PipeTransform, inject } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { HubTranslationService } from '../i18n/translation.service';\nimport { equals, interpolateString, isDefined } from '../util';\n\n@Pipe({\n\tname: 'translate',\n\tstandalone: true,\n\tpure: false\n})\nexport class TranslatePipe implements PipeTransform, OnDestroy {\n\tprivate _ref = inject(ChangeDetectorRef);\n\tprivate _translationSvc = inject(HubTranslationService);\n\n\tvalue: string = '';\n\tlastKey: string | null = null;\n\tlastParams: any[] = [];\n\n\ttranslationSubscription: Subscription | undefined;\n\n\t/**\n\t * Updates the value of a key by interpolating the translation and marking for change detection.\n\t */\n\tupdateValue(key: string, interpolateParams?: Object): void {\n\t\tconst value = interpolateString(this._translationSvc.getTranslation(key), interpolateParams);\n\t\tthis.value = value !== undefined ? value : key;\n\t\tthis.lastKey = key;\n\t\tthis._ref.markForCheck();\n\t}\n\n\t/**\n\t * Transforms a translation key with optional interpolation params.\n\t */\n\ttransform(query: string, ...args: any[]): any {\n\t\tif (!query || !query.length) {\n\t\t\treturn query;\n\t\t}\n\n\t\t// If we ask another time for the same key, return the last value.\n\t\tif (equals(query, this.lastKey) && equals(args, this.lastParams)) {\n\t\t\treturn this.value;\n\t\t}\n\n\t\tlet interpolateParams: Object | undefined = undefined;\n\t\tif (isDefined(args[0]) && args.length) {\n\t\t\tif (typeof args[0] === 'string' && args[0].length) {\n\t\t\t\t// We accept objects written in the template such as {n:1}, {'n':1}, {n:'v'}.\n\t\t\t\t// This converts them to valid JSON.\n\t\t\t\tlet validArgs: string = args[0]\n\t\t\t\t\t.replace(/(\\')?([a-zA-Z0-9_]+)(\\')?(\\s)?:/g, '\"$2\":')\n\t\t\t\t\t.replace(/:(\\s)?(\\')(.*?)(\\')/g, ':\"$3\"');\n\t\t\t\ttry {\n\t\t\t\t\tinterpolateParams = JSON.parse(validArgs);\n\t\t\t\t} catch (e) {\n\t\t\t\t\tthrow new SyntaxError(`Wrong parameter in TranslatePipe. Expected a valid Object, received: ${args[0]}`);\n\t\t\t\t}\n\t\t\t} else if (typeof args[0] === 'object' && !Array.isArray(args[0])) {\n\t\t\t\tinterpolateParams = args[0];\n\t\t\t}\n\t\t}\n\n\t\t// Store the query, in case it changes.\n\t\tthis.lastKey = query;\n\n\t\t// Store the params, in case they change.\n\t\tthis.lastParams = args;\n\n\t\t// Set the value.\n\t\tthis.updateValue(query, interpolateParams);\n\n\t\t// Clean any existing subscription.\n\t\tthis._dispose();\n\n\t\tif (!this.translationSubscription) {\n\t\t\tthis.translationSubscription = this._translationSvc.translationObserver.subscribe(() => {\n\t\t\t\tif (this.lastKey) {\n\t\t\t\t\tthis.lastKey = null;\n\t\t\t\t\tthis.updateValue(query, interpolateParams);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\treturn this.value;\n\t}\n\n\t/**\n\t * Clean any existing subscription to change events.\n\t */\n\tprivate _dispose(): void {\n\t\tif (typeof this.translationSubscription !== 'undefined') {\n\t\t\tthis.translationSubscription.unsubscribe();\n\t\t\tthis.translationSubscription = undefined;\n\t\t}\n\t}\n\n\tngOnDestroy(): void {\n\t\tthis._dispose();\n\t}\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n\tname: 'ucfirst',\n\tstandalone: true\n})\nexport class UcfirstPipe implements PipeTransform {\n\ttransform(value: string = ''): string {\n\t\treturn value.charAt(0).toUpperCase() + value.slice(1);\n\t}\n}\n","import {\n\tChangeDetectorRef,\n\tinject,\n\tOnDestroy,\n\tPipe,\n\tPipeTransform\n} from '@angular/core';\nimport { Observable, Subscription } from 'rxjs';\n\n/**\n * A standalone pipe that unwraps the value of an observable or returns the value directly if it's not an observable.\n *\n * @description\n * The `UnwrapAsyncPipe` is used to unwrap the value emitted by an observable or return the value directly if it's not an observable.\n * It subscribes to the observable and returns the emitted value. If the input is not an observable, it simply returns the value.\n *\n * @usageNotes\n * ```html\n * <div>{{ observableOrValue | unwrapAsync }}</div>\n * ```\n *\n * @publicApi\n */\n@Pipe({\n\tname: 'unwrapAsync',\n\tstandalone: true,\n\tpure: false\n})\nexport class UnwrapAsyncPipe<T = any> implements PipeTransform, OnDestroy {\n\t#cdr = inject(ChangeDetectorRef);\n\n\t/**\n\t * The unwrapped value of the observable or the direct value.\n\t */\n\tvalue: T | null = null;\n\n\t/**\n\t * The subscription to the observable.\n\t */\n\tsubscription: Subscription | null = null;\n\n\t/**\n\t * Performs cleanup tasks when the pipe is destroyed.\n\t */\n\tngOnDestroy(): void {\n\t\tthis.unsubscribe();\n\t}\n\n\t/**\n\t * Transforms the input value.\n\t *\n\t * @param value The input value to transform. It can be an observable or a direct value.\n\t * @returns The unwrapped value of the observable or the direct value.\n\t */\n\ttransform(value: T | Observable<T>): T | null {\n\t\tif (value instanceof Observable) {\n\t\t\tthis.unsubscribe();\n\t\t\tthis.subscription = value.subscribe((result) => {\n\t\t\t\tthis.value = result;\n\t\t\t\tthis.#cdr.markForCheck();\n\t\t\t});\n\t\t} else {\n\t\t\t// Clean up subscription when switching to direct value\n\t\t\tthis.unsubscribe();\n\t\t\tthis.value = value;\n\t\t}\n\t\treturn this.value;\n\t}\n\n\t/**\n\t * Unsubscribes from the current subscription.\n\t */\n\tprivate unsubscribe(): void {\n\t\tif (this.subscription) {\n\t\t\tthis.subscription.unsubscribe();\n\t\t\tthis.subscription = null;\n\t\t}\n\t}\n}\n","export function getTransitionDurationMs(element: HTMLElement) {\n\tconst { transitionDelay, transitionDuration } = window.getComputedStyle(element);\n\tconst transitionDelaySec = parseFloat(transitionDelay);\n\tconst transitionDurationSec = parseFloat(transitionDuration);\n\n\treturn (transitionDelaySec + transitionDurationSec) * 1000;\n}\n","import { NgZone } from '@angular/core';\nimport { EMPTY, fromEvent, Observable, of, race, Subject, timer } from 'rxjs';\nimport { endWith, filter, takeUntil } from 'rxjs/operators';\nimport { runInZone } from '../util';\nimport { getTransitionDurationMs } from './util';\n\nconst transitionTimerDelayMs = 5;\n\nexport type TransitionStartFn<T = any> = (\n\telement: HTMLElement,\n\tanimation: boolean,\n\tcontext: T\n) => TransitionEndFn | void;\nexport type TransitionEndFn = () => void;\n\nexport interface TransitionOptions<T> {\n\tanimation: boolean;\n\trunningTransition: 'continue' | 'stop';\n\tcontext?: T;\n}\n\nexport interface TransitionCtx<T> {\n\ttransition$: Subject<any>;\n\tcomplete: () => void;\n\tcontext: T;\n}\n\nconst noopFn: TransitionEndFn = () => {};\n\nconst runningTransitions = new Map<HTMLElement, TransitionCtx<any>>();\n\nexport const hubRunTransition = <T>(\n\tzone: NgZone,\n\telement: HTMLElement,\n\tstartFn: TransitionStartFn<T>,\n\toptions: TransitionOptions<T>\n): Observable<void> => {\n\t// Getting initial context from options\n\tlet context = options.context || <T>{};\n\n\t// Checking if there are already running transitions on the given element.\n\tconst running = runningTransitions.get(element);\n\tif (running) {\n\t\tswitch (options.runningTransition) {\n\t\t\t// If there is one running and we want for it to 'continue' to run, we have to cancel the new one.\n\t\t\t// We're not emitting any values, but simply completing the observable (EMPTY).\n\t\t\tcase 'continue':\n\t\t\t\treturn EMPTY;\n\t\t\t// If there is one running and we want for it to 'stop', we have to complete the running one.\n\t\t\t// We're simply completing the running one and not emitting any values and merging newly provided context\n\t\t\t// with the one coming from currently running transition.\n\t\t\tcase 'stop':\n\t\t\t\tzone.run(() => running.transition$.complete());\n\t\t\t\tcontext = Object.assign(running.context, context);\n\t\t\t\trunningTransitions.delete(element);\n\t\t}\n\t}\n\n\t// Running the start function\n\tconst endFn = startFn(element, options.animation, context) || noopFn;\n\n\t// If 'prefer-reduced-motion' is enabled, the 'transition' will be set to 'none'.\n\t// If animations are disabled, we have to emit a value and complete the observable\n\t// In this case we have to call the end function, but can finish immediately by emitting a value,\n\t// completing the observable and executing end functions synchronously.\n\tif (\n\t\t!options.animation ||\n\t\twindow.getComputedStyle(element).transitionProperty === 'none'\n\t) {\n\t\tzone.run(() => endFn());\n\t\treturn of(undefined).pipe(runInZone(zone));\n\t}\n\n\t// Starting a new transition\n\tconst transition$ = new Subject<void>();\n\tconst finishTransition$ = new Subject<void>();\n\tconst stop$ = transition$.pipe(endWith(true));\n\trunningTransitions.set(element, {\n\t\ttransition$,\n\t\tcomplete: () => {\n\t\t\tfinishTransition$.next();\n\t\t\tfinishTransition$.complete();\n\t\t},\n\t\tcontext\n\t});\n\n\tconst transitionDurationMs = getTransitionDurationMs(element);\n\n\t// 1. We have to both listen for the 'transitionend' event and have a 'just-in-case' timer,\n\t// because 'transitionend' event might not be fired in some browsers, if the transitioning\n\t// element becomes invisible (ex. when scrolling, making browser tab inactive, etc.). The timer\n\t// guarantees, that we'll release the DOM element and complete 'hubRunTransition'.\n\t// 2. We need to filter transition end events, because they might bubble from shorter transitions\n\t// on inner DOM elements. We're only interested in the transition on the 'element' itself.\n\tzone.runOutsideAngular(() => {\n\t\tconst transitionEnd$ = fromEvent(element, 'transitionend').pipe(\n\t\t\ttakeUntil(stop$),\n\t\t\tfilter(({ target }) => target === element)\n\t\t);\n\t\tconst timer$ = timer(\n\t\t\ttransitionDurationMs + transitionTimerDelayMs\n\t\t).pipe(takeUntil(stop$));\n\n\t\trace(timer$, transitionEnd$, finishTransition$)\n\t\t\t.pipe(takeUntil(stop$))\n\t\t\t.subscribe(() => {\n\t\t\t\trunningTransitions.delete(element);\n\t\t\t\tzone.run(() => {\n\t\t\t\t\tendFn();\n\t\t\t\t\ttransition$.next();\n\t\t\t\t\ttransition$.complete();\n\t\t\t\t});\n\t\t\t});\n\t});\n\n\treturn transition$.asObservable();\n};\n\nexport const hubCompleteTransition = (element: HTMLElement) => {\n\trunningTransitions.get(element)?.complete();\n};\n","import {\n\tApplicationRef,\n\tComponentRef,\n\tinject,\n\tInjector,\n\tNgZone,\n\tTemplateRef,\n\tType,\n\tViewContainerRef,\n\tViewRef\n} from '@angular/core';\nimport { Observable, of } from 'rxjs';\nimport { mergeMap, take, tap } from 'rxjs/operators';\nimport { DOCUMENT } from '@angular/common';\nimport { hubRunTransition } from './transitions';\n\nexport class ContentRef {\n\tconstructor(\n\t\tpublic nodes: Node[][],\n\t\tpublic viewRef?: ViewRef,\n\t\tpublic componentRef?: ComponentRef<any>\n\t) {}\n}\n\nexport class PopupService<T> {\n\tprivate _windowRef: ComponentRef<T> | null = null;\n\tprivate _contentRef: ContentRef | null = null;\n\n\tprivate _document = inject(DOCUMENT);\n\tprivate _applicationRef = inject(ApplicationRef);\n\tprivate _injector = inject(Injector);\n\tprivate _viewContainerRef = inject(ViewContainerRef);\n\tprivate _ngZone = inject(NgZone);\n\n\tconstructor(private _componentType: Type<T>) {}\n\n\topen(\n\t\tcontent?: string | TemplateRef<any>,\n\t\ttemplateContext?: any,\n\t\tanimation = false\n\t): { windowRef: ComponentRef<T>; transition$: Observable<void> } {\n\t\tif (!this._windowRef) {\n\t\t\tthis._contentRef = this._getContentRef(content, templateContext);\n\t\t\tthis._windowRef = this._viewContainerRef.createComponent(\n\t\t\t\tthis._componentType,\n\t\t\t\t{\n\t\t\t\t\tinjector: this._injector,\n\t\t\t\t\tprojectableNodes: this._contentRef.nodes\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\tconst { nativeElement } = this._windowRef.location;\n\t\tconst transition$ = this._ngZone.onStable.pipe(\n\t\t\ttake(1),\n\t\t\tmergeMap(() =>\n\t\t\t\thubRunTransition(\n\t\t\t\t\tthis._ngZone,\n\t\t\t\t\tnativeElement,\n\t\t\t\t\t({ classList }) => classList.add('show'),\n\t\t\t\t\t{\n\t\t\t\t\t\tanimation,\n\t\t\t\t\t\trunningTransition: 'continue'\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\t)\n\t\t);\n\n\t\treturn { windowRef: this._windowRef, transition$ };\n\t}\n\n\tclose(animation = false): Observable<void> {\n\t\tif (!this._windowRef) {\n\t\t\treturn of(undefined);\n\t\t}\n\n\t\treturn hubRunTransition(\n\t\t\tthis._ngZone,\n\t\t\tthis._windowRef.location.nativeElement,\n\t\t\t({ classList }) => classList.remove('show'),\n\t\t\t{ animation, runningTransition: 'stop' }\n\t\t).pipe(\n\t\t\ttap(() => {\n\t\t\t\tthis._windowRef?.destroy();\n\t\t\t\tthis._contentRef?.viewRef?.destroy();\n\t\t\t\tthis._windowRef = null;\n\t\t\t\tthis._contentRef = null;\n\t\t\t})\n\t\t);\n\t}\n\n\tprivate _getContentRef(\n\t\tcontent?: string | TemplateRef<any>,\n\t\ttemplateContext?: any\n\t): ContentRef {\n\t\tif (!content) {\n\t\t\treturn new ContentRef([]);\n\t\t} else if (content instanceof TemplateRef) {\n\t\t\tconst viewRef = content.createEmbeddedView(templateContext);\n\t\t\tthis._applicationRef.attachView(viewRef);\n\t\t\treturn new ContentRef([viewRef.rootNodes], viewRef);\n\t\t} else {\n\t\t\treturn new ContentRef([\n\t\t\t\t[this._document.createTextNode(`${content}`)]\n\t\t\t]);\n\t\t}\n\t}\n}\n","import { inject, Injectable } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\n\n/** Type for the callback used to revert the scrollbar. */\nexport type ScrollbarReverter = () => void;\n\n/**\n * Utility to handle the scrollbar.\n *\n * It allows to hide the scrollbar and compensate the lack of a vertical scrollbar\n * by adding an equivalent padding on the right of the body, and to revert this change.\n */\n@Injectable({ providedIn: 'root' })\nexport class ScrollBar {\n\tprivate _document = inject(DOCUMENT);\n\n\t/**\n\t * To be called to hide a potential vertical scrollbar:\n\t * - if a scrollbar is there and has a width greater than 0, adds some compensation\n\t * padding to the body to keep the same layout as when the scrollbar is there\n\t * - adds overflow: hidden\n\t *\n\t * @return a callback used to revert the change\n\t */\n\thide(): ScrollbarReverter {\n\t\tconst scrollbarWidth = Math.abs(window.innerWidth - this._document.documentElement.clientWidth);\n\t\tconst body = this._document.body;\n\t\tconst bodyStyle = body.style;\n\t\tconst { overflow, paddingRight } = bodyStyle;\n\t\tif (scrollbarWidth > 0) {\n\t\t\tconst actualPadding = parseFloat(window.getComputedStyle(body).paddingRight);\n\t\t\tbodyStyle.paddingRight = `${actualPadding + scrollbarWidth}px`;\n\t\t}\n\t\tbodyStyle.overflow = 'hidden';\n\t\treturn () => {\n\t\t\tif (scrollbarWidth > 0) {\n\t\t\t\tbodyStyle.paddingRight = paddingRight;\n\t\t\t}\n\t\t\tbodyStyle.overflow = overflow;\n\t\t};\n\t}\n}\n","import { DOCUMENT } from '@angular/common';\nimport { Directive, ElementRef, HostListener, inject, input, OnDestroy, Renderer2, RendererStyleFlags2 } from '@angular/core';\n\n/** Supported tooltip placements relative to the host element. */\nexport type HubTooltipPlacement = 'top' | 'bottom' | 'left' | 'right';\n\n/**\n * Themeable custom properties forwarded from the host to the tooltip element.\n *\n * The tooltip is appended to `<body>`, so it cannot inherit scoped variables set\n * on an ancestor of the host. We resolve them on the host (which *does* inherit\n * from its scope) and copy any defined value onto the tooltip inline style, so\n * both `:root`-level and scoped theming work.\n */\nconst TOOLTIP_THEME_VARS = [\n\t'--hub-tooltip-bg',\n\t'--hub-tooltip-color',\n\t'--hub-tooltip-opacity',\n\t'--hub-tooltip-padding-x',\n\t'--hub-tooltip-padding-y',\n\t'--hub-tooltip-border-radius',\n\t'--hub-tooltip-font-size',\n\t'--hub-tooltip-font-weight',\n\t'--hub-tooltip-line-height',\n\t'--hub-tooltip-max-width',\n\t'--hub-tooltip-zindex',\n\t'--hub-tooltip-transition-duration',\n\t'--hub-tooltip-shadow',\n\t'--hub-tooltip-font-family'\n];\n\n/**\n * Lightweight tooltip directive.\n *\n * Apply `[tooltip]` to any element to show a positioned label on hover/focus.\n * The tooltip element is appended to `<body>` so it is never clipped by an\n * overflow container, and every visual aspect is themeable through\n * `--hub-tooltip-*` CSS variables.\n *\n * Styles ship in `styles/tooltip.scss` (mirroring `styles/overlay.scss`). Import\n * it once in your app: `@use 'ng-hub-ui-utils/styles/tooltip';`.\n */\n@Directive({\n\tselector: '[tooltip]'\n})\nexport class TooltipDirective implements OnDestroy {\n\t/** Tooltip text content. */\n\treadonly tooltipTitle = input.required<string>({ alias: 'tooltip' });\n\n\t/** Placement of the tooltip relative to the host. */\n\treadonly placement = input<HubTooltipPlacement>('top');\n\n\t/** Fade duration in milliseconds, also used as the removal delay on hide. */\n\treadonly delay = input<number>(150);\n\n\t/** Gap in pixels between the host and the tooltip. */\n\treadonly offset = input<number>(8);\n\n\tprivate tooltipEl: HTMLElement | null = null;\n\tprivate hideTimeout: ReturnType<typeof setTimeout> | null = null;\n\n\tprivate readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n\tprivate readonly renderer = inject(Renderer2);\n\tprivate readonly document = inject(DOCUMENT);\n\n\tngOnDestroy(): void {\n\t\tthis.destroyTooltip();\n\t}\n\n\t@HostListener('mouseenter')\n\t@HostListener('focus')\n\tprotected onShow(): void {\n\t\tthis.show();\n\t}\n\n\t@HostListener('mouseleave')\n\t@HostListener('blur')\n\t@HostListener('click')\n\tprotected onHide(): void {\n\t\tthis.hide();\n\t}\n\n\t/** Creates, positions and reveals the tooltip element. */\n\tprivate show(): void {\n\t\tif (this.tooltipEl || !this.tooltipTitle()) {\n\t\t\treturn;\n\t\t}\n\t\tthis.clearHideTimeout();\n\n\t\tconst el = this.renderer.createElement('span') as HTMLElement;\n\t\tthis.renderer.appendChild(el, this.renderer.createText(this.tooltipTitle()));\n\t\tthis.renderer.addClass(el, 'hub-tooltip');\n\t\tthis.renderer.addClass(el, `hub-tooltip--${this.placement()}`);\n\t\tthis.renderer.setStyle(el, 'transition-duration', `${this.delay()}ms`);\n\t\tthis.forwardThemeVars(el);\n\t\tthis.renderer.appendChild(this.document.body, el);\n\t\tthis.tooltipEl = el;\n\n\t\tthis.position();\n\t\tthis.renderer.addClass(el, 'hub-tooltip--show');\n\t}\n\n\t/** Fades the tooltip out and removes it after the fade completes. */\n\tprivate hide(): void {\n\t\tif (!this.tooltipEl) {\n\t\t\treturn;\n\t\t}\n\t\tthis.renderer.removeClass(this.tooltipEl, 'hub-tooltip--show');\n\t\tthis.clearHideTimeout();\n\t\tthis.hideTimeout = setTimeout(() => this.destroyTooltip(), this.delay());\n\t}\n\n\t/** Removes the tooltip element immediately. */\n\tprivate destroyTooltip(): void {\n\t\tthis.clearHideTimeout();\n\t\tif (this.tooltipEl) {\n\t\t\tthis.renderer.removeChild(this.document.body, this.tooltipEl);\n\t\t\tthis.tooltipEl = null;\n\t\t}\n\t}\n\n\t/**\n\t * Copies any `--hub-tooltip-*` value defined on the host (or its scope) onto\n\t * the body-portaled tooltip, so scoped theming applies despite the portal.\n\t */\n\tprivate forwardThemeVars(el: HTMLElement): void {\n\t\tconst view = this.document.defaultView;\n\t\tif (!view) {\n\t\t\treturn;\n\t\t}\n\t\tconst hostStyles = view.getComputedStyle(this.host.nativeElement);\n\t\tfor (const name of TOOLTIP_THEME_VARS) {\n\t\t\tconst value = hostStyles.getPropertyValue(name).trim();\n\t\t\tif (value) {\n\t\t\t\tthis.renderer.setStyle(el, name, value, RendererStyleFlags2.DashCase);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate clearHideTimeout(): void {\n\t\tif (this.hideTimeout !== null) {\n\t\t\tclearTimeout(this.hideTimeout);\n\t\t\tthis.hideTimeout = null;\n\t\t}\n\t}\n\n\t/** Positions the tooltip around the host according to `placement`. */\n\tprivate position(): void {\n\t\tif (!this.tooltipEl) {\n\t\t\treturn;\n\t\t}\n\t\tconst hostRect = this.host.nativeElement.getBoundingClientRect();\n\t\tconst tipRect = this.tooltipEl.getBoundingClientRect();\n\t\tconst scrollY = this.document.defaultView?.scrollY ?? 0;\n\t\tconst scrollX = this.document.defaultView?.scrollX ?? 0;\n\t\tconst offset = this.offset();\n\n\t\tlet top = 0;\n\t\tlet left = 0;\n\n\t\tswitch (this.placement()) {\n\t\t\tcase 'bottom':\n\t\t\t\ttop = hostRect.bottom + offset;\n\t\t\t\tleft = hostRect.left + (hostRect.width - tipRect.width) / 2;\n\t\t\t\tbreak;\n\t\t\tcase 'left':\n\t\t\t\ttop = hostRect.top + (hostRect.height - tipRect.height) / 2;\n\t\t\t\tleft = hostRect.left - tipRect.width - offset;\n\t\t\t\tbreak;\n\t\t\tcase 'right':\n\t\t\t\ttop = hostRect.top + (hostRect.height - tipRect.height) / 2;\n\t\t\t\tleft = hostRect.right + offset;\n\t\t\t\tbreak;\n\t\t\tcase 'top':\n\t\t\tdefault:\n\t\t\t\ttop = hostRect.top - tipRect.height - offset;\n\t\t\t\tleft = hostRect.left + (hostRect.width - tipRect.width) / 2;\n\t\t\t\tbreak;\n\t\t}\n\n\t\tthis.renderer.setStyle(this.tooltipEl, 'top', `${top + scrollY}px`);\n\t\tthis.renderer.setStyle(this.tooltipEl, 'left', `${left + scrollX}px`);\n\t}\n}\n","/*\n * Public API Surface of utils\n */\n\nexport * from './lib/drag-drop';\nexport * from './lib/focus-trap';\nexport * from './lib/i18n/translation.provider';\nexport * from './lib/i18n/translation.service';\nexport * from './lib/i18n/translation.tokens';\nexport * from './lib/overlay';\nexport { GetPipe } from './lib/pipes/get.pipe';\nexport { IsObjectPipe } from './lib/pipes/is-object.pipe';\nexport { IsObservablePipe } from './lib/pipes/is-observable.pipe';\nexport { IsStringPipe } from './lib/pipes/is-string.pipe';\nexport * from './lib/pipes/translate.pipe';\nexport { UcfirstPipe } from './lib/pipes/ucfirst.pipe';\nexport { UnwrapAsyncPipe } from './lib/pipes/unwrap-async.pipe';\nexport * from './lib/popup';\nexport * from './lib/scrollbar';\nexport * from './lib/tooltip/tooltip.directive';\nexport * from './lib/transitions';\nexport * from './lib/util';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ng-hub-ui-utils.mjs","sources":["../../../projects/utils/src/lib/drag-drop/array-utils.ts","../../../projects/utils/src/lib/drag-drop/drop-position.ts","../../../projects/utils/src/lib/drag-drop/drag-image.ts","../../../projects/utils/src/lib/drag-drop/pointer-drag.ts","../../../projects/utils/src/lib/drag-drop/drag-drop.service.ts","../../../projects/utils/src/lib/drag-drop/index.ts","../../../projects/utils/src/lib/focus-trap.ts","../../../projects/utils/src/lib/util.ts","../../../projects/utils/src/lib/i18n/translation.tokens.ts","../../../projects/utils/src/lib/i18n/translation.service.ts","../../../projects/utils/src/lib/i18n/translation.provider.ts","../../../projects/utils/src/lib/overlay/overlay-position.ts","../../../projects/utils/src/lib/overlay/overlay-ref.ts","../../../projects/utils/src/lib/overlay/overlay-service.ts","../../../projects/utils/src/lib/pipes/get.pipe.ts","../../../projects/utils/src/lib/pipes/is-object.pipe.ts","../../../projects/utils/src/lib/pipes/is-observable.pipe.ts","../../../projects/utils/src/lib/pipes/is-string.pipe.ts","../../../projects/utils/src/lib/pipes/translate.pipe.ts","../../../projects/utils/src/lib/pipes/ucfirst.pipe.ts","../../../projects/utils/src/lib/pipes/unwrap-async.pipe.ts","../../../projects/utils/src/lib/transitions/util.ts","../../../projects/utils/src/lib/transitions/transition.ts","../../../projects/utils/src/lib/popup.ts","../../../projects/utils/src/lib/scrollbar.ts","../../../projects/utils/src/lib/tooltip/tooltip-controller.ts","../../../projects/utils/src/lib/tooltip/tooltip-adapter.ts","../../../projects/utils/src/lib/tooltip/tooltip.directive.ts","../../../projects/utils/src/public-api.ts","../../../projects/utils/src/ng-hub-ui-utils.ts"],"sourcesContent":["/**\n * Clamps a value into the `[0, max]` range.\n *\n * @param value Value to clamp.\n * @param max Maximum allowed value.\n * @returns The clamped value.\n */\nexport function clamp(value: number, max: number): number {\n\treturn Math.max(0, Math.min(max, value));\n}\n\n/**\n * Moves an item within an array in place (mirrors `@angular/cdk`'s `moveItemInArray`).\n *\n * @param array Array to mutate.\n * @param fromIndex Current index of the item.\n * @param toIndex Target index of the item.\n */\nexport function moveItemInArray<T>(array: T[], fromIndex: number, toIndex: number): void {\n\tconst from = clamp(fromIndex, array.length - 1);\n\tconst to = clamp(toIndex, array.length - 1);\n\tif (from === to) {\n\t\treturn;\n\t}\n\tconst target = array[from];\n\tconst delta = to < from ? -1 : 1;\n\tfor (let i = from; i !== to; i += delta) {\n\t\tarray[i] = array[i + delta];\n\t}\n\tarray[to] = target;\n}\n\n/**\n * Transfers an item from one array to another in place (mirrors `transferArrayItem`).\n *\n * @param source Source array.\n * @param target Target array.\n * @param fromIndex Index of the item in the source array.\n * @param toIndex Insertion index in the target array.\n */\nexport function transferArrayItem<T>(source: T[], target: T[], fromIndex: number, toIndex: number): void {\n\tconst from = clamp(fromIndex, source.length - 1);\n\tconst to = clamp(toIndex, target.length);\n\tif (source.length) {\n\t\ttarget.splice(to, 0, source.splice(from, 1)[0]);\n\t}\n}\n\n/**\n * Copies an item from one array into another in place, leaving the source untouched.\n *\n * @param source Source array.\n * @param target Target array.\n * @param fromIndex Index of the item in the source array.\n * @param toIndex Insertion index in the target array.\n */\nexport function copyArrayItem<T>(source: ReadonlyArray<T>, target: T[], fromIndex: number, toIndex: number): void {\n\tif (!source.length) {\n\t\treturn;\n\t}\n\tconst from = clamp(fromIndex, source.length - 1);\n\tconst to = clamp(toIndex, target.length);\n\ttarget.splice(to, 0, source[from]);\n}\n\n/**\n * Computes the destination index in the underlying collection from the hovered target index\n * and the drop side. When reordering within the same container, the index is adjusted to\n * account for the gap left by removing the dragged item.\n *\n * @param targetIndex Absolute index of the hovered target item.\n * @param after Whether the item is dropped after (vs before) the target.\n * @param sameContainer Whether source and target collections are the same.\n * @param fromIndex Absolute index the dragged item occupied in the source collection.\n * @returns The resolved destination index.\n */\nexport function computeTargetIndex(targetIndex: number, after: boolean, sameContainer: boolean, fromIndex: number): number {\n\tlet index = after ? targetIndex + 1 : targetIndex;\n\tif (sameContainer && fromIndex < index) {\n\t\tindex -= 1;\n\t}\n\treturn Math.max(0, index);\n}\n\n/**\n * Maps a paginated visible index to its absolute index in the underlying collection.\n *\n * @param visibleIndex Index within the currently rendered slice.\n * @param sliceStart Absolute index of the first item in the slice.\n * @returns The absolute index.\n */\nexport function toAbsoluteIndex(visibleIndex: number, sliceStart: number): number {\n\treturn sliceStart + visibleIndex;\n}\n\n/**\n * Determines whether `target` is `node` or any of its descendants in a tree, where children\n * are stored under the `childrenKey` property. Used to forbid dropping a node into its own\n * subtree (which would create a cycle).\n *\n * @param node Root node of the subtree to search.\n * @param target Item to look for (e.g. the parent of a candidate drop container).\n * @param childrenKey Property name holding the children collection.\n * @returns `true` when `target` is `node` or one of its descendants.\n */\nexport function containsNode(node: any, target: any, childrenKey: string): boolean {\n\tif (target == null) {\n\t\treturn false;\n\t}\n\tif (node === target) {\n\t\treturn true;\n\t}\n\tconst children = node?.[childrenKey];\n\tif (!Array.isArray(children)) {\n\t\treturn false;\n\t}\n\treturn children.some((child) => containsNode(child, target, childrenKey));\n}\n","import { DropPosition } from './types';\n\n/**\n * Minimal rectangle shape (a subset of `DOMRect`) used for drop-position math.\n */\nexport interface DropRect {\n\ttop: number;\n\tbottom: number;\n\tleft: number;\n\tright: number;\n\twidth: number;\n\theight: number;\n}\n\n/**\n * Layout axis of a draggable collection, used to decide the drop side.\n *\n * - `vertical`: rows stacked top-to-bottom (default lists, board cards).\n * - `horizontal`: items laid left-to-right (board columns).\n * - `grid`: wrapping grid (list `cards` layout) — vertical band first, then horizontal.\n */\nexport type DragAxis = 'vertical' | 'horizontal' | 'grid';\n\n/**\n * Resolves whether a dragged item should drop before or after the hovered target, based on\n * the pointer position relative to the target's bounding rectangle and the layout axis.\n *\n * For `vertical` the Y axis decides; for `horizontal` the X axis decides (mirrored in RTL);\n * for `grid` the vertical band decides across rows and the horizontal axis decides within\n * the same row (mirrored in RTL).\n *\n * @param pointerX Pointer X in viewport coordinates.\n * @param pointerY Pointer Y in viewport coordinates.\n * @param rect Bounding rectangle of the target item.\n * @param axis Layout axis of the collection.\n * @param isRtl Whether the collection is in right-to-left mode.\n * @returns `'before'` or `'after'`.\n */\nexport function resolveDropPosition(\n\tpointerX: number,\n\tpointerY: number,\n\trect: DropRect,\n\taxis: DragAxis,\n\tisRtl: boolean\n): DropPosition {\n\tif (axis === 'horizontal') {\n\t\tconst midX = rect.left + rect.width / 2;\n\t\tconst before = isRtl ? pointerX > midX : pointerX < midX;\n\t\treturn before ? 'before' : 'after';\n\t}\n\n\tconst midY = rect.top + rect.height / 2;\n\tif (axis === 'vertical') {\n\t\treturn pointerY < midY ? 'before' : 'after';\n\t}\n\n\t// grid\n\tif (pointerY < rect.top) {\n\t\treturn 'before';\n\t}\n\tif (pointerY > rect.bottom) {\n\t\treturn 'after';\n\t}\n\tconst midX = rect.left + rect.width / 2;\n\tconst before = isRtl ? pointerX > midX : pointerX < midX;\n\treturn before ? 'before' : 'after';\n}\n","import { TemplateRef } from '@angular/core';\n\n/**\n * A rendered drag image, plus a disposer to tear it down once the drag ends.\n */\nexport interface DragImageResult {\n\t/** The root element to pass to `dataTransfer.setDragImage`. */\n\tnode: HTMLElement;\n\t/** Destroys the embedded view and removes the rendered nodes. */\n\tdestroy(): void;\n}\n\n/**\n * Renders a template off-screen so it can be used as a native drag image\n * (`dataTransfer.setDragImage`). The caller is responsible for calling `setDragImage` and,\n * on `dragend`, the returned `destroy()`.\n *\n * @param template Template to render as the drag preview.\n * @param context Template context (e.g. `{ item }`).\n * @param container Optional host element to mount into; when omitted, an off-screen holder is\n * appended to `document.body`.\n * @returns The rendered image and its disposer, or `null` when nothing renders (e.g. SSR or\n * an empty template).\n */\nexport function createNativeDragImage(\n\ttemplate: TemplateRef<any>,\n\tcontext: Record<string, unknown>,\n\tcontainer?: HTMLElement\n): DragImageResult | null {\n\tif (typeof document === 'undefined') {\n\t\treturn null;\n\t}\n\tconst view = template.createEmbeddedView(context);\n\tview.detectChanges();\n\tconst node = view.rootNodes.find((candidate: Node) => candidate.nodeType === Node.ELEMENT_NODE) as\n\t\t| HTMLElement\n\t\t| undefined;\n\tif (!node) {\n\t\tview.destroy();\n\t\treturn null;\n\t}\n\n\tconst mountedNodes: Node[] = [...view.rootNodes];\n\tlet holder: HTMLElement | null = null;\n\tif (container) {\n\t\tmountedNodes.forEach((rootNode: Node) => container.appendChild(rootNode));\n\t} else {\n\t\tholder = document.createElement('div');\n\t\tholder.style.position = 'fixed';\n\t\tholder.style.top = '-9999px';\n\t\tholder.style.left = '-9999px';\n\t\tholder.style.pointerEvents = 'none';\n\t\tmountedNodes.forEach((rootNode: Node) => holder!.appendChild(rootNode));\n\t\tdocument.body.appendChild(holder);\n\t}\n\n\treturn {\n\t\tnode,\n\t\tdestroy: () => {\n\t\t\t// Angular's `EmbeddedViewRef.destroy()` tears down the view but does NOT remove the\n\t\t\t// DOM nodes it produced, so remove them explicitly to keep the helper self-contained\n\t\t\t// (no caller-side `innerHTML` clearing needed). The off-screen holder is removed whole.\n\t\t\tview.destroy();\n\t\t\tif (holder) {\n\t\t\t\tholder.remove();\n\t\t\t} else {\n\t\t\t\tmountedNodes.forEach((rootNode: Node) => (rootNode as ChildNode).remove?.());\n\t\t\t}\n\t\t}\n\t};\n}\n","/**\n * Configuration for a Pointer Events drag session — the touch/pen fallback for native\n * HTML5 drag-and-drop, used where native dragging is unavailable (mobile/tablet).\n */\nexport interface PointerDragSessionConfig {\n\t/** The `pointerdown` event that initiated the gesture. */\n\tstartEvent: PointerEvent;\n\t/** The element being dragged. */\n\tsourceEl: HTMLElement;\n\t/** Builds the floating ghost content (custom preview render or a clone). */\n\tghostFactory: () => HTMLElement;\n\t/** Distance in pixels the pointer must travel before a drag begins (default 8). */\n\tthreshold?: number;\n\t/** Called once the gesture passes the threshold and becomes a drag. */\n\tonStart: () => void;\n\t/** Called on every move while dragging, with viewport coordinates. */\n\tonMove: (clientX: number, clientY: number) => void;\n\t/** Called on drop (pointer up after a real drag), with viewport coordinates. */\n\tonDrop: (clientX: number, clientY: number) => void;\n\t/** Called when the gesture is cancelled (e.g. `pointercancel`). */\n\tonCancel: () => void;\n\t/** Always called last for cleanup, regardless of outcome. */\n\tonEnd: () => void;\n}\n\n/**\n * Handle to an in-progress Pointer Events drag session.\n */\nexport interface PointerDragSession {\n\t/** Aborts the session and runs cleanup. */\n\tdestroy(): void;\n}\n\nconst EDGE_MARGIN = 48;\nconst MAX_SCROLL_SPEED = 16;\n\n/**\n * Creates a Pointer Events drag session that mirrors native drag-and-drop on touch devices.\n *\n * The session waits for the pointer to pass a movement threshold (so taps still behave as\n * taps), then renders a floating ghost that follows the finger, reports hover positions via\n * `onMove`, autoscrolls when near a scroll container's edges, and commits on pointer up.\n *\n * @param config Session configuration.\n * @returns A handle whose `destroy()` aborts the session.\n */\nexport function createPointerDragSession(config: PointerDragSessionConfig): PointerDragSession {\n\tconst threshold = config.threshold ?? 8;\n\tconst pointerId = config.startEvent.pointerId;\n\tconst startX = config.startEvent.clientX;\n\tconst startY = config.startEvent.clientY;\n\n\tconst rect = config.sourceEl.getBoundingClientRect();\n\tconst grabOffsetX = startX - rect.left;\n\tconst grabOffsetY = startY - rect.top;\n\n\tlet started = false;\n\tlet ghost: HTMLElement | null = null;\n\tlet scrollContainer: HTMLElement | Window = window;\n\tlet rafId: number | null = null;\n\tlet scrollVelocity = 0;\n\n\t/**\n\t * Positions the ghost under the pointer.\n\t *\n\t * @param x Pointer X.\n\t * @param y Pointer Y.\n\t */\n\tconst positionGhost = (x: number, y: number): void => {\n\t\tif (ghost) {\n\t\t\tghost.style.transform = `translate(${x - grabOffsetX}px, ${y - grabOffsetY}px)`;\n\t\t}\n\t};\n\n\t/**\n\t * Runs the autoscroll animation loop while the pointer sits in an edge zone.\n\t */\n\tconst scrollStep = (): void => {\n\t\tif (scrollVelocity !== 0) {\n\t\t\tif (scrollContainer === window) {\n\t\t\t\twindow.scrollBy(0, scrollVelocity);\n\t\t\t} else {\n\t\t\t\t(scrollContainer as HTMLElement).scrollTop += scrollVelocity;\n\t\t\t}\n\t\t\trafId = requestAnimationFrame(scrollStep);\n\t\t} else {\n\t\t\trafId = null;\n\t\t}\n\t};\n\n\t/**\n\t * Updates the autoscroll velocity from the pointer's proximity to the container edges.\n\t *\n\t * @param y Pointer Y.\n\t */\n\tconst updateAutoscroll = (y: number): void => {\n\t\tconst bounds =\n\t\t\tscrollContainer === window\n\t\t\t\t? { top: 0, bottom: window.innerHeight }\n\t\t\t\t: (scrollContainer as HTMLElement).getBoundingClientRect();\n\t\tif (y < bounds.top + EDGE_MARGIN) {\n\t\t\tscrollVelocity = -Math.ceil((MAX_SCROLL_SPEED * (bounds.top + EDGE_MARGIN - y)) / EDGE_MARGIN);\n\t\t} else if (y > bounds.bottom - EDGE_MARGIN) {\n\t\t\tscrollVelocity = Math.ceil((MAX_SCROLL_SPEED * (y - (bounds.bottom - EDGE_MARGIN))) / EDGE_MARGIN);\n\t\t} else {\n\t\t\tscrollVelocity = 0;\n\t\t}\n\t\tif (scrollVelocity !== 0 && rafId === null) {\n\t\t\trafId = requestAnimationFrame(scrollStep);\n\t\t}\n\t};\n\n\t/**\n\t * Begins the actual drag once the threshold is exceeded.\n\t *\n\t * @param x Pointer X.\n\t * @param y Pointer Y.\n\t */\n\tconst beginDrag = (x: number, y: number): void => {\n\t\tstarted = true;\n\t\tscrollContainer = findScrollContainer(config.sourceEl);\n\t\tghost = config.ghostFactory();\n\t\tghost.classList.add('hub-drag-ghost');\n\t\tghost.style.position = 'fixed';\n\t\tghost.style.top = '0';\n\t\tghost.style.left = '0';\n\t\tghost.style.width = `${rect.width}px`;\n\t\tghost.style.pointerEvents = 'none';\n\t\tghost.style.zIndex = '2147483647';\n\t\tghost.style.margin = '0';\n\t\tpositionGhost(x, y);\n\t\tdocument.body.appendChild(ghost);\n\t\tconfig.onStart();\n\t};\n\n\t/**\n\t * Handles pointer movement: starts the drag past threshold, then tracks and autoscrolls.\n\t *\n\t * @param event Pointer move event.\n\t */\n\tconst onPointerMove = (event: PointerEvent): void => {\n\t\tif (event.pointerId !== pointerId) {\n\t\t\treturn;\n\t\t}\n\t\tconst { clientX, clientY } = event;\n\t\tif (!started) {\n\t\t\tif (Math.abs(clientX - startX) < threshold && Math.abs(clientY - startY) < threshold) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tbeginDrag(clientX, clientY);\n\t\t}\n\t\tevent.preventDefault();\n\t\tpositionGhost(clientX, clientY);\n\t\tconfig.onMove(clientX, clientY);\n\t\tupdateAutoscroll(clientY);\n\t};\n\n\t/**\n\t * Handles pointer up: commits the drop when a drag actually happened.\n\t *\n\t * @param event Pointer up event.\n\t */\n\tconst onPointerUp = (event: PointerEvent): void => {\n\t\tif (event.pointerId !== pointerId) {\n\t\t\treturn;\n\t\t}\n\t\tif (started) {\n\t\t\tconfig.onDrop(event.clientX, event.clientY);\n\t\t}\n\t\tcleanup();\n\t};\n\n\t/**\n\t * Handles pointer cancellation.\n\t *\n\t * @param event Pointer cancel event.\n\t */\n\tconst onPointerCancel = (event: PointerEvent): void => {\n\t\tif (event.pointerId !== pointerId) {\n\t\t\treturn;\n\t\t}\n\t\tif (started) {\n\t\t\tconfig.onCancel();\n\t\t}\n\t\tcleanup();\n\t};\n\n\t/**\n\t * Removes listeners, the ghost and any pending animation frame, then notifies the owner.\n\t */\n\tconst cleanup = (): void => {\n\t\twindow.removeEventListener('pointermove', onPointerMove);\n\t\twindow.removeEventListener('pointerup', onPointerUp);\n\t\twindow.removeEventListener('pointercancel', onPointerCancel);\n\t\tif (rafId !== null) {\n\t\t\tcancelAnimationFrame(rafId);\n\t\t\trafId = null;\n\t\t}\n\t\tscrollVelocity = 0;\n\t\tghost?.remove();\n\t\tghost = null;\n\t\ttry {\n\t\t\tconfig.sourceEl.releasePointerCapture(pointerId);\n\t\t} catch {\n\t\t\t// Pointer capture may not be held; ignore.\n\t\t}\n\t\tconfig.onEnd();\n\t};\n\n\ttry {\n\t\tconfig.sourceEl.setPointerCapture(pointerId);\n\t} catch {\n\t\t// Environments without pointer capture (e.g. tests) can still proceed.\n\t}\n\twindow.addEventListener('pointermove', onPointerMove, { passive: false });\n\twindow.addEventListener('pointerup', onPointerUp);\n\twindow.addEventListener('pointercancel', onPointerCancel);\n\n\treturn { destroy: cleanup };\n}\n\n/**\n * Finds the nearest vertically scrollable ancestor of an element, falling back to `window`.\n *\n * @param el Starting element.\n * @returns The scroll container (an element) or `window`.\n */\nfunction findScrollContainer(el: HTMLElement | null): HTMLElement | Window {\n\tlet node = el?.parentElement ?? null;\n\twhile (node && node !== document.body && node !== document.documentElement) {\n\t\tconst style = getComputedStyle(node);\n\t\tconst overflowY = style.overflowY;\n\t\tif ((overflowY === 'auto' || overflowY === 'scroll') && node.scrollHeight > node.clientHeight) {\n\t\t\treturn node;\n\t\t}\n\t\tnode = node.parentElement;\n\t}\n\treturn window;\n}\n","import { computed, Injectable, signal } from '@angular/core';\nimport { ActiveDrag, DragRegistration, DragTarget } from './types';\n\n/**\n * Singleton coordinator that backs native HTML5 drag-and-drop reordering and cross-instance\n * transfers (e.g. between two lists, or any two owners that share a drag group).\n *\n * A drag spans two component instances (source and target) and the native `dataTransfer`\n * payload is unreadable during `dragover`, so a shared, root-provided service is the only\n * reliable channel to know what is being dragged and from where while hovering. The service\n * only coordinates state; it never mutates the underlying collections.\n */\n@Injectable({ providedIn: 'root' })\nexport class HubDragDropService {\n\treadonly #registrations = new Map<string, DragRegistration>();\n\treadonly #active = signal<ActiveDrag | null>(null);\n\treadonly #target = signal<DragTarget | null>(null);\n\n\t/** The drag currently in progress, or `null`. */\n\treadonly active = this.#active.asReadonly();\n\t/** The current drop target, or `null`. */\n\treadonly target = this.#target.asReadonly();\n\t/** Whether a drag is in progress. */\n\treadonly isDragging = computed(() => this.#active() !== null);\n\n\t/**\n\t * Registers an owner so it can participate in (and be a target of) cross-owner transfers.\n\t *\n\t * @param registration The owner registration.\n\t */\n\tregister(registration: DragRegistration): void {\n\t\tthis.#registrations.set(registration.ownerId, registration);\n\t}\n\n\t/**\n\t * Removes an owner registration (call on destroy).\n\t *\n\t * @param ownerId Identifier of the owner to remove.\n\t */\n\tunregister(ownerId: string): void {\n\t\tthis.#registrations.delete(ownerId);\n\t}\n\n\t/**\n\t * Starts a drag, recording the active item and clearing any previous target.\n\t *\n\t * @param drag The active drag snapshot.\n\t */\n\tbegin(drag: ActiveDrag): void {\n\t\tthis.#active.set(drag);\n\t\tthis.#target.set(null);\n\t}\n\n\t/**\n\t * Updates the transient drop target while hovering.\n\t *\n\t * @param target The hovered target, or `null` to clear it.\n\t */\n\tsetTarget(target: DragTarget | null): void {\n\t\tthis.#target.set(target);\n\t}\n\n\t/**\n\t * Ends the current drag and clears all transient state.\n\t */\n\tend(): void {\n\t\tthis.#active.set(null);\n\t\tthis.#target.set(null);\n\t}\n\n\t/**\n\t * Determines whether the active drag may be dropped on the given owner. An owner always\n\t * accepts its own items (in-owner reorder); a different owner accepts only when both\n\t * share the same non-null drag group.\n\t *\n\t * @param targetOwnerId Identifier of the candidate target owner.\n\t * @returns `true` when the drop is allowed.\n\t */\n\tcanDrop(targetOwnerId: string): boolean {\n\t\tconst active = this.#active();\n\t\tif (!active) {\n\t\t\treturn false;\n\t\t}\n\t\tif (targetOwnerId === active.sourceId) {\n\t\t\treturn true;\n\t\t}\n\t\tconst registration = this.#registrations.get(targetOwnerId);\n\t\tif (!registration) {\n\t\t\treturn false;\n\t\t}\n\t\tconst targetGroup = registration.group();\n\t\treturn active.sourceGroup != null && targetGroup != null && active.sourceGroup === targetGroup;\n\t}\n\n\t/**\n\t * Re-renders an owner on demand (used by the destination owner to refresh the source owner\n\t * after a cross-owner transfer).\n\t *\n\t * @param ownerId Identifier of the owner to refresh.\n\t */\n\trefreshSource(ownerId: string): void {\n\t\tthis.#registrations.get(ownerId)?.refresh?.();\n\t}\n\n\t/**\n\t * Asks an owner to commit the pending drop as the destination (Pointer Events fallback,\n\t * where the source component drives the gesture but the destination must commit/emit).\n\t *\n\t * @param ownerId Identifier of the destination owner.\n\t */\n\trequestCommit(ownerId: string): void {\n\t\tthis.#registrations.get(ownerId)?.commit?.();\n\t}\n\n\t/**\n\t * Resolves the drop target under a viewport point by hit-testing the DOM and delegating to\n\t * the owning component (which knows its own collections). Used by the Pointer Events\n\t * fallback, including cross-owner hovers where the target is a different component.\n\t *\n\t * @param clientX Viewport X coordinate.\n\t * @param clientY Viewport Y coordinate.\n\t * @returns The resolved target, or `null` when the point is not over a droppable owner.\n\t */\n\tresolveTargetAt(clientX: number, clientY: number): DragTarget | null {\n\t\tif (typeof document === 'undefined') {\n\t\t\treturn null;\n\t\t}\n\t\tconst element = document.elementFromPoint(clientX, clientY) as HTMLElement | null;\n\t\tconst hostEl = element?.closest('[data-hub-drag-owner]') as HTMLElement | null;\n\t\tconst ownerId = hostEl?.getAttribute('data-hub-drag-owner');\n\t\tif (!element || !ownerId || !this.canDrop(ownerId)) {\n\t\t\treturn null;\n\t\t}\n\t\treturn this.#registrations.get(ownerId)?.resolveTarget?.(element, clientX, clientY) ?? null;\n\t}\n}\n","/**\n * Native HTML5 drag-and-drop core shared across ng-hub-ui libraries.\n *\n * Provides the engine-agnostic, reusable pieces of a native drag-and-drop implementation:\n * pure array helpers, drop-position geometry, drag-image rendering, a Pointer Events touch\n * fallback, a singleton coordinator service (cross-instance transfers) and shared types.\n * UI primitives (handle/placeholder/preview directives) stay per-library, since their\n * selectors and data models differ.\n */\nexport * from './array-utils';\nexport * from './drop-position';\nexport * from './drag-image';\nexport * from './pointer-drag';\nexport * from './drag-drop.service';\nexport * from './types';\n","import { NgZone } from '@angular/core';\n\nimport { fromEvent, Observable } from 'rxjs';\nimport { filter, map, takeUntil, withLatestFrom } from 'rxjs/operators';\n\nexport const FOCUSABLE_ELEMENTS_SELECTOR = [\n\t'a[href]',\n\t'button:not([disabled])',\n\t'input:not([disabled]):not([type=\"hidden\"])',\n\t'select:not([disabled])',\n\t'textarea:not([disabled])',\n\t'[contenteditable]',\n\t'[tabindex]:not([tabindex=\"-1\"])'\n].join(', ');\n\n/**\n * Returns first and last focusable elements inside of a given element based on specific CSS selector\n */\nexport function getFocusableBoundaryElements(\n\telement: HTMLElement\n): HTMLElement[] {\n\tconst list: HTMLElement[] = Array.from(\n\t\telement.querySelectorAll(\n\t\t\tFOCUSABLE_ELEMENTS_SELECTOR\n\t\t) as NodeListOf<HTMLElement>\n\t).filter((el) => el.tabIndex !== -1);\n\treturn [list[0], list[list.length - 1]];\n}\n\n/**\n * Function that enforces browser focus to be trapped inside a DOM element.\n *\n * Works only for clicks inside the element and navigation with 'Tab', ignoring clicks outside of the element\n *\n * @param zone Angular zone\n * @param element The element around which focus will be trapped inside\n * @param stopFocusTrap$ The observable stream. When completed the focus trap will clean up listeners\n * and free internal resources\n * @param refocusOnClick Put the focus back to the last focused element whenever a click occurs on element (default to\n * false)\n */\nexport const hubFocusTrap = (\n\tzone: NgZone,\n\telement: HTMLElement,\n\tstopFocusTrap$: Observable<any>,\n\trefocusOnClick = false\n) => {\n\tzone.runOutsideAngular(() => {\n\t\t// last focused element\n\t\tconst lastFocusedElement$ = fromEvent<FocusEvent>(\n\t\t\telement,\n\t\t\t'focusin'\n\t\t).pipe(\n\t\t\ttakeUntil(stopFocusTrap$),\n\t\t\tmap((e) => e.target)\n\t\t);\n\n\t\t// 'tab' / 'shift+tab' stream\n\t\tfromEvent<KeyboardEvent>(element, 'keydown')\n\t\t\t.pipe(\n\t\t\t\ttakeUntil(stopFocusTrap$),\n\t\t\t\tfilter((e) => e.key === 'Tab'),\n\t\t\t\twithLatestFrom(lastFocusedElement$)\n\t\t\t)\n\t\t\t.subscribe(([tabEvent, focusedElement]) => {\n\t\t\t\tconst [first, last] = getFocusableBoundaryElements(element);\n\n\t\t\t\tif (\n\t\t\t\t\t(focusedElement === first || focusedElement === element) &&\n\t\t\t\t\ttabEvent.shiftKey\n\t\t\t\t) {\n\t\t\t\t\tlast.focus();\n\t\t\t\t\ttabEvent.preventDefault();\n\t\t\t\t}\n\n\t\t\t\tif (focusedElement === last && !tabEvent.shiftKey) {\n\t\t\t\t\tfirst.focus();\n\t\t\t\t\ttabEvent.preventDefault();\n\t\t\t\t}\n\t\t\t});\n\n\t\t// inside click\n\t\tif (refocusOnClick) {\n\t\t\tfromEvent(element, 'click')\n\t\t\t\t.pipe(\n\t\t\t\t\ttakeUntil(stopFocusTrap$),\n\t\t\t\t\twithLatestFrom(lastFocusedElement$),\n\t\t\t\t\tmap((arr) => arr[1] as HTMLElement)\n\t\t\t\t)\n\t\t\t\t.subscribe((lastFocusedElement) => lastFocusedElement.focus());\n\t\t}\n\t});\n};\n","import { effect, NgZone, Signal, signal } from '@angular/core';\nimport { Observable, OperatorFunction } from 'rxjs';\n\n/**\n * Converts a value to an integer using parseInt.\n *\n * @param {any} value - The `value` parameter in the `toInteger` function is the input value that needs to be converted to an\n * integer.\n *\n * @returns Is returning the parsed integer value of the input `value`.\n */\nexport function toInteger(value: any): number {\n\treturn parseInt(`${value}`, 10);\n}\n\nexport function toString(value: any): string {\n\treturn value !== undefined && value !== null ? `${value}` : '';\n}\n\nexport function getValueInRange(value: number, max: number, min = 0): number {\n\treturn Math.max(Math.min(value, max), min);\n}\n\nexport function isString(value: any): value is string {\n\treturn typeof value === 'string';\n}\n\nexport function isNumber(value: any): value is number {\n\treturn !isNaN(toInteger(value));\n}\n\nexport function isInteger(value: any): value is number {\n\treturn (\n\t\ttypeof value === 'number' &&\n\t\tisFinite(value) &&\n\t\tMath.floor(value) === value\n\t);\n}\n\nexport function isDefined(value: any): boolean {\n\treturn value !== undefined && value !== null;\n}\n\n/**\n * Determines if two objects or values are equivalent.\n *\n * @param o1 Object or value to compare.\n * @param o2 Object or value to compare.\n * @returns true if arguments are equal.\n */\nexport function equals(o1: any, o2: any): boolean {\n\tif (o1 === o2) {\n\t\treturn true;\n\t}\n\tif (o1 === null || o2 === null) {\n\t\treturn false;\n\t}\n\tif (o1 !== o1 && o2 !== o2) {\n\t\treturn true;\n\t} // NaN === NaN\n\tlet t1 = typeof o1,\n\t\tt2 = typeof o2,\n\t\tlength: number,\n\t\tkey: any,\n\t\tkeySet: any;\n\tif (t1 == t2 && t1 == 'object') {\n\t\tif (Array.isArray(o1)) {\n\t\t\tif (!Array.isArray(o2)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif ((length = o1.length) == o2.length) {\n\t\t\t\tfor (key = 0; key < length; key++) {\n\t\t\t\t\tif (!equals(o1[key], o2[key])) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t} else {\n\t\t\tif (Array.isArray(o2)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tkeySet = Object.create(null);\n\t\t\tfor (key in o1) {\n\t\t\t\tif (!equals(o1[key], o2[key])) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tkeySet[key] = true;\n\t\t\t}\n\t\t\tfor (key in o2) {\n\t\t\t\tif (!(key in keySet) && typeof o2[key] !== 'undefined') {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\n/**\n * Checks if a value is a Promise.\n *\n * @param {any} v - The parameter `v` in the `isPromise` function represents any value that is being checked to determine if it is\n * a Promise.\n *\n * @returns A boolean value indicating whether the input `v` is a Promise or not. If `v` has a `then` property, it is considered\n * a Promise and the function returns `true`. Otherwise, it returns `false`.\n */\nexport function isPromise<T>(v: any): v is Promise<T> {\n\treturn v && v.then;\n}\n\n/**\n * Pads a number with a leading zero if it is a valid number.\n *\n * @param {number} value - The `padNumber` function takes a number as input and pads it with a leading zero if it is a valid\n * number. If the input is not a number, it returns an empty string.\n *\n * @returns Takes a number as input and pads it with a leading zero if it is a valid number. If the input is a number, the function\n * returns the input value padded with a leading zero and sliced to keep only the last two characters. If the input is not a number,\n * an empty string is returned.\n */\nexport function padNumber(value: number) {\n\tif (isNumber(value)) {\n\t\treturn `0${value}`.slice(-2);\n\t} else {\n\t\treturn '';\n\t}\n}\n\n/**\n * Escapes special characters in a given text to be used in a regular expression.\n *\n * @param text - The `regExpEscape` function takes a `text` parameter as input. This function is designed to escape special\n * characters in a given text so that it can be safely used within a regular expression pattern.\n *\n * @returns A new string with any special characters in the input `text` escaped with a backslash.\n */\nexport function regExpEscape(text: string): string {\n\treturn text.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&');\n}\n\nexport function closest(\n\telement: HTMLElement,\n\tselector?: string\n): HTMLElement | null {\n\tif (!selector) {\n\t\treturn null;\n\t}\n\n\t/*\n\t * In certain browsers (e.g. Edge 44.18362.449.0) HTMLDocument does\n\t * not support `Element.prototype.closest`. To emulate the correct behaviour\n\t * we return null when the method is missing.\n\t *\n\t * Note that in evergreen browsers `closest(document.documentElement, 'html')`\n\t * will return the document element whilst in Edge null will be returned. This\n\t * compromise was deemed good enough.\n\t */\n\tif (typeof element.closest === 'undefined') {\n\t\treturn null;\n\t}\n\n\treturn element.closest(selector);\n}\n\n/**\n * Force a browser reflow\n *\n * @param element element where to apply the reflow\n */\nexport function reflow(element: HTMLElement) {\n\treturn (element || document.body).getBoundingClientRect();\n}\n\n/**\n * Creates an observable where all callbacks are executed inside a given zone\n *\n * @param zone\n */\nexport function runInZone<T>(zone: NgZone): OperatorFunction<T, T> {\n\treturn (source) => {\n\t\treturn new Observable((observer) => {\n\t\t\tconst next = (value: T) => zone.run(() => observer.next(value));\n\t\t\tconst error = (e: any) => zone.run(() => observer.error(e));\n\t\t\tconst complete = () => zone.run(() => observer.complete());\n\t\t\treturn source.subscribe({ next, error, complete });\n\t\t});\n\t};\n}\n\nexport function removeAccents(str: string): string {\n\treturn str.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '');\n}\n\n/**\n * Replaces placeholders in a string with corresponding values from a given object.\n *\n * @param expr a string that represents the expression to be interpolated.\n * @param params an optional object that contains the values to be interpolated into the expr string.\n * @returns the interpolated string.\n */\nexport function interpolateString(\n\texpr: string = '',\n\tparams: any = {},\n\ttemplateMatcher: RegExp = /{{\\s?([^{}\\s]*)\\s?}}/g\n) {\n\tif (!params) {\n\t\treturn expr;\n\t}\n\n\treturn expr.replace(templateMatcher, (substring: string, b: string) => {\n\t\tlet r = getValue(params, b);\n\t\treturn isDefined(r) ? r : substring;\n\t});\n}\n\n/**\n * Retrieves the value of a nested property from an object using dot notation.\n *\n * @param target the object from which you want to retrieve a value.\n * @param key a string that represents the property or nested properties of the target object.\n * @returns the value of the specified key in the target object.\n */\nexport function getValue(target: any, key: string): any {\n\tlet keys = typeof key === 'string' ? key.split('.') : [key];\n\tkey = '';\n\tdo {\n\t\tkey += keys.shift();\n\t\tif (\n\t\t\tisDefined(target) &&\n\t\t\tisDefined(target[key]) &&\n\t\t\t(typeof target[key] === 'object' || !keys.length)\n\t\t) {\n\t\t\ttarget = target[key];\n\t\t\tkey = '';\n\t\t} else if (!keys.length) {\n\t\t\ttarget = undefined;\n\t\t} else {\n\t\t\tkey += '.';\n\t\t}\n\t} while (keys.length);\n\n\treturn target;\n}\n\n/**\n * Checks if the given item is a plain object (not an array, null, or primitive).\n *\n * @param item Value to test.\n * @returns true when item is a non-null, non-array object.\n */\nexport function isObject(item: any): boolean {\n\treturn item !== null && typeof item === 'object' && !Array.isArray(item);\n}\n\n/**\n * Recursively deep-merges source into target, producing a new object.\n * Arrays are replaced, not merged. Primitives from source win.\n *\n * @param target Base object.\n * @param source Overrides to apply on top of target.\n * @returns New merged object.\n */\nexport function mergeDeep(target: any, source: any): any {\n\tconst output = Object.assign({}, target);\n\tif (isObject(target) && isObject(source)) {\n\t\tObject.keys(source).forEach((key: any) => {\n\t\t\tif (isObject(source[key])) {\n\t\t\t\tif (!(key in target)) {\n\t\t\t\t\tObject.assign(output, { [key]: source[key] });\n\t\t\t\t} else {\n\t\t\t\t\toutput[key] = mergeDeep(target[key], source[key]);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tObject.assign(output, { [key]: source[key] });\n\t\t\t}\n\t\t});\n\t}\n\treturn output;\n}\n\n/**\n * Generates a random alphanumeric string of the requested length.\n * Not cryptographically secure — intended for transient DOM ids and keys.\n *\n * @param length Desired character count.\n * @returns Random alphanumeric string.\n */\nexport function generateUniqueId(length: number): string {\n\tconst chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n\tlet result = '';\n\tfor (let i = 0; i < length; i++) {\n\t\tresult += chars.charAt(Math.floor(Math.random() * chars.length));\n\t}\n\treturn result;\n}\n\n/**\n * Creates a read-only signal that mirrors sourceSignal but only updates\n * after debounceDelay ms have elapsed since the last emission.\n * Cleans up the pending timer via the Angular effect cleanup mechanism.\n *\n * @template T Type of the signal value.\n * @param sourceSignal Signal to debounce.\n * @param debounceDelay Milliseconds to wait, or a signal that provides the delay.\n * @returns Debounced read-only signal.\n */\nexport function debouncedSignal<T>(sourceSignal: Signal<T>, debounceDelay: number | Signal<number> = 0): Signal<T> {\n\tconst debounced = signal(sourceSignal());\n\n\teffect((onCleanup) => {\n\t\tconst delay = typeof debounceDelay === 'number' ? debounceDelay : debounceDelay();\n\t\tconst value = sourceSignal();\n\n\t\tconst timeout = setTimeout(() => {\n\t\t\tdebounced.set(value);\n\t\t}, delay);\n\n\t\tonCleanup(() => clearTimeout(timeout));\n\t});\n\n\treturn debounced;\n}\n\n/**\n * Returns the active element in the given root.\n *\n * If the active element is inside a shadow root, it is searched recursively.\n */\nexport function getActiveElement(\n\troot: Document | ShadowRoot = document\n): Element | null {\n\tconst activeEl = root?.activeElement;\n\n\tif (!activeEl) {\n\t\treturn null;\n\t}\n\n\treturn activeEl.shadowRoot\n\t\t? getActiveElement(activeEl.shadowRoot)\n\t\t: activeEl;\n}\n","import { InjectionToken } from '@angular/core';\n\nexport interface HubTranslationConfig {\n\tdictionaries?: Record<string, Record<string, any>>;\n\tlanguage?: string;\n\tfallbackLanguage?: string;\n}\n\nexport const HUB_TRANSLATION_CONFIG = new InjectionToken<HubTranslationConfig>(\n\t'HUB_TRANSLATION_CONFIG'\n);\n","import { Injectable, inject } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { getValue } from '../util';\nimport { HUB_TRANSLATION_CONFIG, HubTranslationConfig } from './translation.tokens';\n\n@Injectable()\nexport class HubTranslationService {\n\t#config: HubTranslationConfig =\n\t\tinject(HUB_TRANSLATION_CONFIG, { optional: true }) ?? {};\n\n\tdefaultTranslations: Record<string, string | any> =\n\t\tthis.#config.dictionaries ?? {};\n\n\ttranslations!: Record<string, string>;\n\n\tprivate translationSource = new Subject<any>();\n\n\ttranslationObserver = this.translationSource.asObservable();\n\n\tconstructor() {\n\t\tthis.initialize();\n\t}\n\n\tinitialize() {\n\t\tconst language = this.#config.language ?? this.#config.fallbackLanguage ?? 'en';\n\t\tconst fallbackLanguage = this.#config.fallbackLanguage ?? 'en';\n\t\tconst fallbackTranslations =\n\t\t\tthis.defaultTranslations[fallbackLanguage] ?? {};\n\t\tconst selectedTranslations =\n\t\t\tthis.defaultTranslations[language] ?? fallbackTranslations;\n\n\t\tthis.setTranslations(selectedTranslations);\n\t}\n\n\t/**\n\t * Retrieves a value from a translations object based on a given key.\n\t */\n\tgetTranslation(key: string): any {\n\t\treturn getValue(this.translations, key);\n\t}\n\n\t/**\n\t * Merges fallback translations with the provided translations and updates observers.\n\t */\n\tsetTranslations(translations: Record<string, string> | any = {}) {\n\t\tconst fallbackLanguage = this.#config.fallbackLanguage ?? 'en';\n\t\tconst fallbackTranslations =\n\t\t\tthis.defaultTranslations[fallbackLanguage] ?? {};\n\t\tconst nextTranslations = translations ?? {};\n\n\t\tthis.translations = { ...fallbackTranslations, ...nextTranslations };\n\t\tthis.translationSource.next(this.translations);\n\t}\n}\n","import { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\nimport { HubTranslationService } from './translation.service';\nimport { HUB_TRANSLATION_CONFIG, HubTranslationConfig } from './translation.tokens';\n\n/**\n * Helper function to provide HubTranslationService and its configuration.\n * @param config Optional configuration for translations.\n * @returns EnvironmentProviders\n */\nexport function provideHubTranslation(config: HubTranslationConfig = {}): EnvironmentProviders {\n\treturn makeEnvironmentProviders([\n\t\tHubTranslationService,\n\t\t{\n\t\t\tprovide: HUB_TRANSLATION_CONFIG,\n\t\t\tuseValue: config\n\t\t}\n\t]);\n}\n","import { ElementRef } from '@angular/core';\nimport type { ConnectionPosition } from './connection-position';\nimport type { HorizontalConnectionPos } from './horizontal-connection-pos';\nimport type { VerticalConnectionPos } from './vertical-connection-pos';\n\n/**\n * Positions an overlay container relative to an origin element.\n * The first configured position that fits within the viewport is applied.\n */\nexport class OverlayPosition {\n\tprivate _origin: ElementRef | HTMLElement | null = null;\n\tprivate _positions: ConnectionPosition[] = [];\n\n\t/**\n\t * Sets the origin element used to position the overlay.\n\t *\n\t * @param origin Element reference or HTMLElement.\n\t * @returns This position instance for chaining.\n\t */\n\tflexibleConnectedTo(origin: ElementRef | HTMLElement): this {\n\t\tthis._origin = origin;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Sets the preferred positions for the overlay.\n\t * The order of the array determines the fallback priority.\n\t *\n\t * @param positions Array of position configurations.\n\t * @returns This position instance for chaining.\n\t */\n\twithPositions(positions: ConnectionPosition[]): this {\n\t\tthis._positions = positions;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Applies the calculated position to the overlay element.\n\t *\n\t * @param overlayElement The overlay container element.\n\t */\n\tapply(overlayElement: HTMLElement): void {\n\t\tif (!this._origin) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst originElement = this._origin instanceof ElementRef ? this._origin.nativeElement : this._origin;\n\t\tconst originRect = originElement.getBoundingClientRect();\n\n\t\t// Try each position until we find one that fits in the viewport\n\t\tfor (const position of this._positions) {\n\t\t\tconst coords = this._calculatePosition(originRect, overlayElement, position);\n\n\t\t\tif (this._fitsInViewport(coords, overlayElement)) {\n\t\t\t\tthis._applyPosition(overlayElement, coords);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// If no position fits perfectly, use the first one\n\t\tif (this._positions.length > 0) {\n\t\t\tconst coords = this._calculatePosition(originRect, overlayElement, this._positions[0]);\n\t\t\tthis._applyPosition(overlayElement, coords);\n\t\t}\n\t}\n\n\t/**\n\t * Calculates the position coordinates based on the configuration.\n\t *\n\t * @param originRect Bounding rectangle of the origin element.\n\t * @param overlayElement The overlay element.\n\t * @param position Position configuration.\n\t * @returns Calculated x and y coordinates.\n\t */\n\tprivate _calculatePosition(originRect: DOMRect, overlayElement: HTMLElement, position: ConnectionPosition): { x: number; y: number } {\n\t\tconst overlayRect = overlayElement.getBoundingClientRect();\n\n\t\t// Calculate origin point\n\t\tlet x = this._getOriginX(originRect, position.originX);\n\t\tlet y = this._getOriginY(originRect, position.originY);\n\n\t\t// Adjust for overlay alignment\n\t\tx -= this._getOverlayX(overlayRect, position.overlayX);\n\t\ty -= this._getOverlayY(overlayRect, position.overlayY);\n\n\t\t// Apply offsets\n\t\tif (position.offsetX) {\n\t\t\tx += position.offsetX;\n\t\t}\n\t\tif (position.offsetY) {\n\t\t\ty += position.offsetY;\n\t\t}\n\n\t\treturn { x, y };\n\t}\n\n\t/**\n\t * Gets the X coordinate for the origin point.\n\t */\n\tprivate _getOriginX(rect: DOMRect, position: HorizontalConnectionPos): number {\n\t\tswitch (position) {\n\t\t\tcase 'start':\n\t\t\t\treturn rect.left;\n\t\t\tcase 'center':\n\t\t\t\treturn rect.left + rect.width / 2;\n\t\t\tcase 'end':\n\t\t\t\treturn rect.right;\n\t\t}\n\t}\n\n\t/**\n\t * Gets the Y coordinate for the origin point.\n\t */\n\tprivate _getOriginY(rect: DOMRect, position: VerticalConnectionPos): number {\n\t\tswitch (position) {\n\t\t\tcase 'top':\n\t\t\t\treturn rect.top;\n\t\t\tcase 'center':\n\t\t\t\treturn rect.top + rect.height / 2;\n\t\t\tcase 'bottom':\n\t\t\t\treturn rect.bottom;\n\t\t}\n\t}\n\n\t/**\n\t * Gets the X offset for the overlay alignment.\n\t */\n\tprivate _getOverlayX(rect: DOMRect, position: HorizontalConnectionPos): number {\n\t\tswitch (position) {\n\t\t\tcase 'start':\n\t\t\t\treturn 0;\n\t\t\tcase 'center':\n\t\t\t\treturn rect.width / 2;\n\t\t\tcase 'end':\n\t\t\t\treturn rect.width;\n\t\t}\n\t}\n\n\t/**\n\t * Gets the Y offset for the overlay alignment.\n\t */\n\tprivate _getOverlayY(rect: DOMRect, position: VerticalConnectionPos): number {\n\t\tswitch (position) {\n\t\t\tcase 'top':\n\t\t\t\treturn 0;\n\t\t\tcase 'center':\n\t\t\t\treturn rect.height / 2;\n\t\t\tcase 'bottom':\n\t\t\t\treturn rect.height;\n\t\t}\n\t}\n\n\t/**\n\t * Checks if the overlay fits within the viewport at the given coordinates.\n\t */\n\tprivate _fitsInViewport(\n\t\tcoords: { x: number; y: number },\n\t\toverlayElement: HTMLElement\n\t): boolean {\n\t\tconst overlayRect = overlayElement.getBoundingClientRect();\n\t\tconst viewportWidth = window.innerWidth;\n\t\tconst viewportHeight = window.innerHeight;\n\n\t\treturn (\n\t\t\tcoords.x >= 0 &&\n\t\t\tcoords.y >= 0 &&\n\t\t\tcoords.x + overlayRect.width <= viewportWidth &&\n\t\t\tcoords.y + overlayRect.height <= viewportHeight\n\t\t);\n\t}\n\n\t/**\n\t * Applies the calculated position to the overlay element.\n\t */\n\tprivate _applyPosition(\n\t\toverlayElement: HTMLElement,\n\t\tcoords: { x: number; y: number }\n\t): void {\n\t\toverlayElement.style.left = `${coords.x}px`;\n\t\toverlayElement.style.top = `${coords.y}px`;\n\t}\n}\n","import {\n\tApplicationRef,\n\tComponentRef,\n\tcreateComponent,\n\tEmbeddedViewRef,\n\tTemplateRef,\n\tType,\n\tViewContainerRef\n} from '@angular/core';\nimport type { OverlayConfig } from './overlay-config';\n\n/**\n * Manages a single overlay instance created by {@link OverlayService}.\n * Creates a container and optional backdrop in `document.body` and attaches\n * either a template or component as the overlay content.\n */\nexport class OverlayRef {\n\tprivate _backdropElement: HTMLElement | null = null;\n\tprivate _containerElement: HTMLElement | null = null;\n\tprivate _contentElement: HTMLElement | null = null;\n\tprivate _viewRef: EmbeddedViewRef<unknown> | null = null;\n\tprivate _componentRef: ComponentRef<unknown> | null = null;\n\tprivate _isAttached = false;\n\tprivate _backdropClickCallback?: () => void;\n\tprivate _backdropClickHandler?: () => void;\n\n\tconstructor(\n\t\tprivate _config: OverlayConfig,\n\t\tprivate _appRef: ApplicationRef\n\t) {}\n\n\t/**\n\t * Attaches content to the overlay.\n\t *\n\t * If the overlay is already attached, it only updates the position strategy\n\t * and returns the existing content element.\n\t *\n\t * @param content Template or component type to attach.\n\t * @param viewContainerRef View container used to create embedded views for templates.\n\t * @returns The attached content element (first root node).\n\t * @throws When a {@link TemplateRef} is provided without a {@link ViewContainerRef}.\n\t */\n\tattach(\n\t\tcontent: TemplateRef<unknown> | Type<unknown>,\n\t\tviewContainerRef?: ViewContainerRef\n\t): HTMLElement {\n\t\t// If already attached, just update position and return existing element\n\t\tif (this._isAttached && this._contentElement) {\n\t\t\tif (this._config.positionStrategy) {\n\t\t\t\tthis._config.positionStrategy.apply(this._containerElement!);\n\t\t\t}\n\t\t\treturn this._contentElement;\n\t\t}\n\n\t\tthis._createContainer();\n\t\tthis._createBackdrop();\n\n\t\tlet contentElement: HTMLElement;\n\n\t\tif (content instanceof TemplateRef) {\n\t\t\tif (!viewContainerRef) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'ViewContainerRef is required when attaching a TemplateRef'\n\t\t\t\t);\n\t\t\t}\n\t\t\t// Only create and attach view if not already created\n\t\t\tif (!this._viewRef) {\n\t\t\t\tthis._viewRef = viewContainerRef.createEmbeddedView(content);\n\t\t\t\tthis._viewRef.detectChanges();\n\t\t\t}\n\t\t\tcontentElement = this._viewRef.rootNodes[0] as HTMLElement;\n\t\t} else {\n\t\t\tif (this._componentRef) {\n\t\t\t\tthis._appRef.detachView(this._componentRef.hostView);\n\t\t\t\tthis._componentRef.destroy();\n\t\t\t}\n\t\t\tthis._componentRef = createComponent(content, {\n\t\t\t\tenvironmentInjector: this._appRef.injector\n\t\t\t});\n\t\t\tthis._appRef.attachView(this._componentRef.hostView);\n\t\t\tcontentElement = (this._componentRef.hostView as EmbeddedViewRef<unknown>)\n\t\t\t\t.rootNodes[0] as HTMLElement;\n\t\t}\n\n\t\tthis._contentElement = contentElement;\n\n\t\t// Only append if not already in container\n\t\tif (!this._containerElement!.contains(contentElement)) {\n\t\t\tthis._containerElement!.appendChild(contentElement);\n\t\t}\n\n\t\tthis._isAttached = true;\n\n\t\t// Apply position strategy\n\t\tif (this._config.positionStrategy) {\n\t\t\tthis._config.positionStrategy.apply(this._containerElement!);\n\t\t}\n\n\t\treturn contentElement;\n\t}\n\n\t/**\n\t * Detaches the content from the overlay container without disposing the overlay.\n\t */\n\tdetach(): void {\n\t\tif (!this._isAttached) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._contentElement && this._containerElement) {\n\t\t\tthis._containerElement.removeChild(this._contentElement);\n\t\t}\n\n\t\tthis._isAttached = false;\n\t}\n\n\t/**\n\t * Disposes the overlay and cleans up all allocated resources.\n\t */\n\tdispose(): void {\n\t\tthis.detach();\n\n\t\t// Destroy view ref if exists\n\t\tif (this._viewRef) {\n\t\t\tthis._viewRef.destroy();\n\t\t\tthis._viewRef = null;\n\t\t}\n\n\t\tif (this._componentRef) {\n\t\t\tthis._appRef.detachView(this._componentRef.hostView);\n\t\t\tthis._componentRef.destroy();\n\t\t\tthis._componentRef = null;\n\t\t}\n\n\t\tif (this._containerElement) {\n\t\t\tdocument.body.removeChild(this._containerElement);\n\t\t\tthis._containerElement = null;\n\t\t}\n\n\t\tif (this._backdropElement) {\n\t\t\t// Remove event listener before removing element from DOM\n\t\t\tif (this._backdropClickHandler) {\n\t\t\t\tthis._backdropElement.removeEventListener(\n\t\t\t\t\t'click',\n\t\t\t\t\tthis._backdropClickHandler\n\t\t\t\t);\n\t\t\t\tthis._backdropClickHandler = undefined;\n\t\t\t}\n\t\t\tdocument.body.removeChild(this._backdropElement);\n\t\t\tthis._backdropElement = null;\n\t\t}\n\n\t\tthis._contentElement = null;\n\t\tthis._backdropClickCallback = undefined;\n\t}\n\n\t/**\n\t * Checks whether content is currently attached to the overlay.\n\t */\n\thasAttached(): boolean {\n\t\treturn this._isAttached;\n\t}\n\n\t/**\n\t * Registers a callback for backdrop clicks.\n\t * The last registered callback replaces any previous one.\n\t *\n\t * @param callback Function to call when the backdrop is clicked.\n\t */\n\tonBackdropClick(callback: () => void): void {\n\t\tthis._backdropClickCallback = callback;\n\t}\n\n\t/**\n\t * Re-applies the configured position strategy to the overlay container.\n\t */\n\tupdatePosition(): void {\n\t\tif (this._config.positionStrategy && this._containerElement) {\n\t\t\tthis._config.positionStrategy.apply(this._containerElement);\n\t\t}\n\t}\n\n\t/**\n\t * Creates the overlay container element and appends it to the document.\n\t */\n\tprivate _createContainer(): void {\n\t\tif (this._containerElement) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._containerElement = document.createElement('div');\n\t\tthis._containerElement.classList.add('hub-overlay-container');\n\n\t\tif (this._config.panelClass) {\n\t\t\tconst classes = Array.isArray(this._config.panelClass)\n\t\t\t\t? this._config.panelClass\n\t\t\t\t: [this._config.panelClass];\n\t\t\tclasses.forEach((cls) => this._containerElement!.classList.add(cls));\n\t\t}\n\n\t\tif (this._config.width) {\n\t\t\tthis._containerElement.style.width =\n\t\t\t\ttypeof this._config.width === 'number'\n\t\t\t\t\t? `${this._config.width}px`\n\t\t\t\t\t: this._config.width;\n\t\t}\n\n\t\tif (this._config.height) {\n\t\t\tthis._containerElement.style.height =\n\t\t\t\ttypeof this._config.height === 'number'\n\t\t\t\t\t? `${this._config.height}px`\n\t\t\t\t\t: this._config.height;\n\t\t}\n\n\t\tthis._containerElement.style.position = 'fixed';\n\t\tthis._containerElement.style.zIndex = '1000';\n\n\t\tdocument.body.appendChild(this._containerElement);\n\t}\n\n\t/**\n\t * Creates the backdrop element if enabled and appends it to the document.\n\t */\n\tprivate _createBackdrop(): void {\n\t\tif (!this._config.hasBackdrop || this._backdropElement) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._backdropElement = document.createElement('div');\n\t\tthis._backdropElement.classList.add('hub-overlay-backdrop');\n\n\t\tif (this._config.backdropClass) {\n\t\t\tthis._backdropElement.classList.add(this._config.backdropClass);\n\t\t}\n\n\t\tthis._backdropElement.style.position = 'fixed';\n\t\tthis._backdropElement.style.top = '0';\n\t\tthis._backdropElement.style.left = '0';\n\t\tthis._backdropElement.style.width = '100%';\n\t\tthis._backdropElement.style.height = '100%';\n\t\tthis._backdropElement.style.zIndex = '999';\n\n\t\t// Store reference to the handler for cleanup\n\t\tthis._backdropClickHandler = () => {\n\t\t\tif (this._backdropClickCallback) {\n\t\t\t\tthis._backdropClickCallback();\n\t\t\t}\n\t\t};\n\n\t\tthis._backdropElement.addEventListener('click', this._backdropClickHandler);\n\n\t\tdocument.body.appendChild(this._backdropElement);\n\t}\n}\n","import { ApplicationRef, inject, Injectable } from '@angular/core';\nimport { OverlayPosition } from './overlay-position';\nimport { OverlayRef } from './overlay-ref';\nimport type { OverlayConfig } from './overlay-config';\n\n/**\n * Service for creating and managing overlay instances.\n */\n@Injectable({\n\tprovidedIn: 'root'\n})\nexport class OverlayService {\n\tprivate readonly _appRef = inject(ApplicationRef);\n\n\t/**\n\t * Creates a new overlay with the specified configuration.\n\t *\n\t * @param config Configuration options for the overlay.\n\t * @returns A reference to the created overlay.\n\t */\n\tcreate(config: OverlayConfig = {}): OverlayRef {\n\t\treturn new OverlayRef(config, this._appRef);\n\t}\n\n\t/**\n\t * Creates a position strategy builder for connected overlays.\n\t *\n\t * @returns A new {@link OverlayPosition} instance.\n\t */\n\tposition(): OverlayPosition {\n\t\treturn new OverlayPosition();\n\t}\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n\tname: 'get',\n\tstandalone: true\n})\nexport class GetPipe implements PipeTransform {\n\t/**\n\t * @param value The object to retrieve the property from.\n\t * @param path The dot-separated path string to the property.\n\t * @param defaultValue The value to return if the property is not found.\n\t */\n\ttransform(value: any, path: string, defaultValue?: any): any {\n\t\tif (typeof path !== 'string') {\n\t\t\treturn value;\n\t\t}\n\t\treturn path\n\t\t\t.split('.')\n\t\t\t.reduce(\n\t\t\t\t(a, c) =>\n\t\t\t\t\ta && a[c] !== null && a[c] !== undefined\n\t\t\t\t\t\t? a[c]\n\t\t\t\t\t\t: defaultValue || null,\n\t\t\t\tvalue\n\t\t\t);\n\t}\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n\tname: 'isObject'\n})\nexport class IsObjectPipe implements PipeTransform {\n\n\ttransform(value: any): boolean {\n\t\treturn typeof value === 'object';\n\t}\n\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { isObservable, Observable } from 'rxjs';\n\n@Pipe({\n\tname: 'isObservable',\n\tstandalone: true\n})\nexport class IsObservablePipe<T = any> implements PipeTransform {\n\ttransform(value: T | Observable<T>): boolean {\n\t\treturn isObservable(value);\n\t}\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n\tname: 'isString'\n})\nexport class IsStringPipe implements PipeTransform {\n\n\ttransform(value: any): boolean {\n\t\treturn typeof value === 'string';\n\t}\n\n}\n","import { ChangeDetectorRef, OnDestroy, Pipe, PipeTransform, inject } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { HubTranslationService } from '../i18n/translation.service';\nimport { equals, interpolateString, isDefined } from '../util';\n\n@Pipe({\n\tname: 'translate',\n\tstandalone: true,\n\tpure: false\n})\nexport class TranslatePipe implements PipeTransform, OnDestroy {\n\tprivate _ref = inject(ChangeDetectorRef);\n\tprivate _translationSvc = inject(HubTranslationService);\n\n\tvalue: string = '';\n\tlastKey: string | null = null;\n\tlastParams: any[] = [];\n\n\ttranslationSubscription: Subscription | undefined;\n\n\t/**\n\t * Updates the value of a key by interpolating the translation and marking for change detection.\n\t */\n\tupdateValue(key: string, interpolateParams?: Object): void {\n\t\tconst value = interpolateString(this._translationSvc.getTranslation(key), interpolateParams);\n\t\tthis.value = value !== undefined ? value : key;\n\t\tthis.lastKey = key;\n\t\tthis._ref.markForCheck();\n\t}\n\n\t/**\n\t * Transforms a translation key with optional interpolation params.\n\t */\n\ttransform(query: string, ...args: any[]): any {\n\t\tif (!query || !query.length) {\n\t\t\treturn query;\n\t\t}\n\n\t\t// If we ask another time for the same key, return the last value.\n\t\tif (equals(query, this.lastKey) && equals(args, this.lastParams)) {\n\t\t\treturn this.value;\n\t\t}\n\n\t\tlet interpolateParams: Object | undefined = undefined;\n\t\tif (isDefined(args[0]) && args.length) {\n\t\t\tif (typeof args[0] === 'string' && args[0].length) {\n\t\t\t\t// We accept objects written in the template such as {n:1}, {'n':1}, {n:'v'}.\n\t\t\t\t// This converts them to valid JSON.\n\t\t\t\tlet validArgs: string = args[0]\n\t\t\t\t\t.replace(/(\\')?([a-zA-Z0-9_]+)(\\')?(\\s)?:/g, '\"$2\":')\n\t\t\t\t\t.replace(/:(\\s)?(\\')(.*?)(\\')/g, ':\"$3\"');\n\t\t\t\ttry {\n\t\t\t\t\tinterpolateParams = JSON.parse(validArgs);\n\t\t\t\t} catch (e) {\n\t\t\t\t\tthrow new SyntaxError(`Wrong parameter in TranslatePipe. Expected a valid Object, received: ${args[0]}`);\n\t\t\t\t}\n\t\t\t} else if (typeof args[0] === 'object' && !Array.isArray(args[0])) {\n\t\t\t\tinterpolateParams = args[0];\n\t\t\t}\n\t\t}\n\n\t\t// Store the query, in case it changes.\n\t\tthis.lastKey = query;\n\n\t\t// Store the params, in case they change.\n\t\tthis.lastParams = args;\n\n\t\t// Set the value.\n\t\tthis.updateValue(query, interpolateParams);\n\n\t\t// Clean any existing subscription.\n\t\tthis._dispose();\n\n\t\tif (!this.translationSubscription) {\n\t\t\tthis.translationSubscription = this._translationSvc.translationObserver.subscribe(() => {\n\t\t\t\tif (this.lastKey) {\n\t\t\t\t\tthis.lastKey = null;\n\t\t\t\t\tthis.updateValue(query, interpolateParams);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\treturn this.value;\n\t}\n\n\t/**\n\t * Clean any existing subscription to change events.\n\t */\n\tprivate _dispose(): void {\n\t\tif (typeof this.translationSubscription !== 'undefined') {\n\t\t\tthis.translationSubscription.unsubscribe();\n\t\t\tthis.translationSubscription = undefined;\n\t\t}\n\t}\n\n\tngOnDestroy(): void {\n\t\tthis._dispose();\n\t}\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n\tname: 'ucfirst',\n\tstandalone: true\n})\nexport class UcfirstPipe implements PipeTransform {\n\ttransform(value: string = ''): string {\n\t\treturn value.charAt(0).toUpperCase() + value.slice(1);\n\t}\n}\n","import {\n\tChangeDetectorRef,\n\tinject,\n\tOnDestroy,\n\tPipe,\n\tPipeTransform\n} from '@angular/core';\nimport { Observable, Subscription } from 'rxjs';\n\n/**\n * A standalone pipe that unwraps the value of an observable or returns the value directly if it's not an observable.\n *\n * @description\n * The `UnwrapAsyncPipe` is used to unwrap the value emitted by an observable or return the value directly if it's not an observable.\n * It subscribes to the observable and returns the emitted value. If the input is not an observable, it simply returns the value.\n *\n * @usageNotes\n * ```html\n * <div>{{ observableOrValue | unwrapAsync }}</div>\n * ```\n *\n * @publicApi\n */\n@Pipe({\n\tname: 'unwrapAsync',\n\tstandalone: true,\n\tpure: false\n})\nexport class UnwrapAsyncPipe<T = any> implements PipeTransform, OnDestroy {\n\t#cdr = inject(ChangeDetectorRef);\n\n\t/**\n\t * The unwrapped value of the observable or the direct value.\n\t */\n\tvalue: T | null = null;\n\n\t/**\n\t * The subscription to the observable.\n\t */\n\tsubscription: Subscription | null = null;\n\n\t/**\n\t * Performs cleanup tasks when the pipe is destroyed.\n\t */\n\tngOnDestroy(): void {\n\t\tthis.unsubscribe();\n\t}\n\n\t/**\n\t * Transforms the input value.\n\t *\n\t * @param value The input value to transform. It can be an observable or a direct value.\n\t * @returns The unwrapped value of the observable or the direct value.\n\t */\n\ttransform(value: T | Observable<T>): T | null {\n\t\tif (value instanceof Observable) {\n\t\t\tthis.unsubscribe();\n\t\t\tthis.subscription = value.subscribe((result) => {\n\t\t\t\tthis.value = result;\n\t\t\t\tthis.#cdr.markForCheck();\n\t\t\t});\n\t\t} else {\n\t\t\t// Clean up subscription when switching to direct value\n\t\t\tthis.unsubscribe();\n\t\t\tthis.value = value;\n\t\t}\n\t\treturn this.value;\n\t}\n\n\t/**\n\t * Unsubscribes from the current subscription.\n\t */\n\tprivate unsubscribe(): void {\n\t\tif (this.subscription) {\n\t\t\tthis.subscription.unsubscribe();\n\t\t\tthis.subscription = null;\n\t\t}\n\t}\n}\n","export function getTransitionDurationMs(element: HTMLElement) {\n\tconst { transitionDelay, transitionDuration } = window.getComputedStyle(element);\n\tconst transitionDelaySec = parseFloat(transitionDelay);\n\tconst transitionDurationSec = parseFloat(transitionDuration);\n\n\treturn (transitionDelaySec + transitionDurationSec) * 1000;\n}\n","import { NgZone } from '@angular/core';\nimport { EMPTY, fromEvent, Observable, of, race, Subject, timer } from 'rxjs';\nimport { endWith, filter, takeUntil } from 'rxjs/operators';\nimport { runInZone } from '../util';\nimport { getTransitionDurationMs } from './util';\n\nconst transitionTimerDelayMs = 5;\n\nexport type TransitionStartFn<T = any> = (\n\telement: HTMLElement,\n\tanimation: boolean,\n\tcontext: T\n) => TransitionEndFn | void;\nexport type TransitionEndFn = () => void;\n\nexport interface TransitionOptions<T> {\n\tanimation: boolean;\n\trunningTransition: 'continue' | 'stop';\n\tcontext?: T;\n}\n\nexport interface TransitionCtx<T> {\n\ttransition$: Subject<any>;\n\tcomplete: () => void;\n\tcontext: T;\n}\n\nconst noopFn: TransitionEndFn = () => {};\n\nconst runningTransitions = new Map<HTMLElement, TransitionCtx<any>>();\n\nexport const hubRunTransition = <T>(\n\tzone: NgZone,\n\telement: HTMLElement,\n\tstartFn: TransitionStartFn<T>,\n\toptions: TransitionOptions<T>\n): Observable<void> => {\n\t// Getting initial context from options\n\tlet context = options.context || <T>{};\n\n\t// Checking if there are already running transitions on the given element.\n\tconst running = runningTransitions.get(element);\n\tif (running) {\n\t\tswitch (options.runningTransition) {\n\t\t\t// If there is one running and we want for it to 'continue' to run, we have to cancel the new one.\n\t\t\t// We're not emitting any values, but simply completing the observable (EMPTY).\n\t\t\tcase 'continue':\n\t\t\t\treturn EMPTY;\n\t\t\t// If there is one running and we want for it to 'stop', we have to complete the running one.\n\t\t\t// We're simply completing the running one and not emitting any values and merging newly provided context\n\t\t\t// with the one coming from currently running transition.\n\t\t\tcase 'stop':\n\t\t\t\tzone.run(() => running.transition$.complete());\n\t\t\t\tcontext = Object.assign(running.context, context);\n\t\t\t\trunningTransitions.delete(element);\n\t\t}\n\t}\n\n\t// Running the start function\n\tconst endFn = startFn(element, options.animation, context) || noopFn;\n\n\t// If 'prefer-reduced-motion' is enabled, the 'transition' will be set to 'none'.\n\t// If animations are disabled, we have to emit a value and complete the observable\n\t// In this case we have to call the end function, but can finish immediately by emitting a value,\n\t// completing the observable and executing end functions synchronously.\n\tif (\n\t\t!options.animation ||\n\t\twindow.getComputedStyle(element).transitionProperty === 'none'\n\t) {\n\t\tzone.run(() => endFn());\n\t\treturn of(undefined).pipe(runInZone(zone));\n\t}\n\n\t// Starting a new transition\n\tconst transition$ = new Subject<void>();\n\tconst finishTransition$ = new Subject<void>();\n\tconst stop$ = transition$.pipe(endWith(true));\n\trunningTransitions.set(element, {\n\t\ttransition$,\n\t\tcomplete: () => {\n\t\t\tfinishTransition$.next();\n\t\t\tfinishTransition$.complete();\n\t\t},\n\t\tcontext\n\t});\n\n\tconst transitionDurationMs = getTransitionDurationMs(element);\n\n\t// 1. We have to both listen for the 'transitionend' event and have a 'just-in-case' timer,\n\t// because 'transitionend' event might not be fired in some browsers, if the transitioning\n\t// element becomes invisible (ex. when scrolling, making browser tab inactive, etc.). The timer\n\t// guarantees, that we'll release the DOM element and complete 'hubRunTransition'.\n\t// 2. We need to filter transition end events, because they might bubble from shorter transitions\n\t// on inner DOM elements. We're only interested in the transition on the 'element' itself.\n\tzone.runOutsideAngular(() => {\n\t\tconst transitionEnd$ = fromEvent(element, 'transitionend').pipe(\n\t\t\ttakeUntil(stop$),\n\t\t\tfilter(({ target }) => target === element)\n\t\t);\n\t\tconst timer$ = timer(\n\t\t\ttransitionDurationMs + transitionTimerDelayMs\n\t\t).pipe(takeUntil(stop$));\n\n\t\trace(timer$, transitionEnd$, finishTransition$)\n\t\t\t.pipe(takeUntil(stop$))\n\t\t\t.subscribe(() => {\n\t\t\t\trunningTransitions.delete(element);\n\t\t\t\tzone.run(() => {\n\t\t\t\t\tendFn();\n\t\t\t\t\ttransition$.next();\n\t\t\t\t\ttransition$.complete();\n\t\t\t\t});\n\t\t\t});\n\t});\n\n\treturn transition$.asObservable();\n};\n\nexport const hubCompleteTransition = (element: HTMLElement) => {\n\trunningTransitions.get(element)?.complete();\n};\n","import {\n\tApplicationRef,\n\tComponentRef,\n\tinject,\n\tInjector,\n\tNgZone,\n\tTemplateRef,\n\tType,\n\tViewContainerRef,\n\tViewRef\n} from '@angular/core';\nimport { Observable, of } from 'rxjs';\nimport { mergeMap, take, tap } from 'rxjs/operators';\nimport { DOCUMENT } from '@angular/common';\nimport { hubRunTransition } from './transitions';\n\nexport class ContentRef {\n\tconstructor(\n\t\tpublic nodes: Node[][],\n\t\tpublic viewRef?: ViewRef,\n\t\tpublic componentRef?: ComponentRef<any>\n\t) {}\n}\n\nexport class PopupService<T> {\n\tprivate _windowRef: ComponentRef<T> | null = null;\n\tprivate _contentRef: ContentRef | null = null;\n\n\tprivate _document = inject(DOCUMENT);\n\tprivate _applicationRef = inject(ApplicationRef);\n\tprivate _injector = inject(Injector);\n\tprivate _viewContainerRef = inject(ViewContainerRef);\n\tprivate _ngZone = inject(NgZone);\n\n\tconstructor(private _componentType: Type<T>) {}\n\n\topen(\n\t\tcontent?: string | TemplateRef<any>,\n\t\ttemplateContext?: any,\n\t\tanimation = false\n\t): { windowRef: ComponentRef<T>; transition$: Observable<void> } {\n\t\tif (!this._windowRef) {\n\t\t\tthis._contentRef = this._getContentRef(content, templateContext);\n\t\t\tthis._windowRef = this._viewContainerRef.createComponent(\n\t\t\t\tthis._componentType,\n\t\t\t\t{\n\t\t\t\t\tinjector: this._injector,\n\t\t\t\t\tprojectableNodes: this._contentRef.nodes\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\tconst { nativeElement } = this._windowRef.location;\n\t\tconst transition$ = this._ngZone.onStable.pipe(\n\t\t\ttake(1),\n\t\t\tmergeMap(() =>\n\t\t\t\thubRunTransition(\n\t\t\t\t\tthis._ngZone,\n\t\t\t\t\tnativeElement,\n\t\t\t\t\t({ classList }) => classList.add('show'),\n\t\t\t\t\t{\n\t\t\t\t\t\tanimation,\n\t\t\t\t\t\trunningTransition: 'continue'\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\t)\n\t\t);\n\n\t\treturn { windowRef: this._windowRef, transition$ };\n\t}\n\n\tclose(animation = false): Observable<void> {\n\t\tif (!this._windowRef) {\n\t\t\treturn of(undefined);\n\t\t}\n\n\t\treturn hubRunTransition(\n\t\t\tthis._ngZone,\n\t\t\tthis._windowRef.location.nativeElement,\n\t\t\t({ classList }) => classList.remove('show'),\n\t\t\t{ animation, runningTransition: 'stop' }\n\t\t).pipe(\n\t\t\ttap(() => {\n\t\t\t\tthis._windowRef?.destroy();\n\t\t\t\tthis._contentRef?.viewRef?.destroy();\n\t\t\t\tthis._windowRef = null;\n\t\t\t\tthis._contentRef = null;\n\t\t\t})\n\t\t);\n\t}\n\n\tprivate _getContentRef(\n\t\tcontent?: string | TemplateRef<any>,\n\t\ttemplateContext?: any\n\t): ContentRef {\n\t\tif (!content) {\n\t\t\treturn new ContentRef([]);\n\t\t} else if (content instanceof TemplateRef) {\n\t\t\tconst viewRef = content.createEmbeddedView(templateContext);\n\t\t\tthis._applicationRef.attachView(viewRef);\n\t\t\treturn new ContentRef([viewRef.rootNodes], viewRef);\n\t\t} else {\n\t\t\treturn new ContentRef([\n\t\t\t\t[this._document.createTextNode(`${content}`)]\n\t\t\t]);\n\t\t}\n\t}\n}\n","import { inject, Injectable } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\n\n/** Type for the callback used to revert the scrollbar. */\nexport type ScrollbarReverter = () => void;\n\n/**\n * Utility to handle the scrollbar.\n *\n * It allows to hide the scrollbar and compensate the lack of a vertical scrollbar\n * by adding an equivalent padding on the right of the body, and to revert this change.\n */\n@Injectable({ providedIn: 'root' })\nexport class ScrollBar {\n\tprivate _document = inject(DOCUMENT);\n\n\t/**\n\t * To be called to hide a potential vertical scrollbar:\n\t * - if a scrollbar is there and has a width greater than 0, adds some compensation\n\t * padding to the body to keep the same layout as when the scrollbar is there\n\t * - adds overflow: hidden\n\t *\n\t * @return a callback used to revert the change\n\t */\n\thide(): ScrollbarReverter {\n\t\tconst scrollbarWidth = Math.abs(window.innerWidth - this._document.documentElement.clientWidth);\n\t\tconst body = this._document.body;\n\t\tconst bodyStyle = body.style;\n\t\tconst { overflow, paddingRight } = bodyStyle;\n\t\tif (scrollbarWidth > 0) {\n\t\t\tconst actualPadding = parseFloat(window.getComputedStyle(body).paddingRight);\n\t\t\tbodyStyle.paddingRight = `${actualPadding + scrollbarWidth}px`;\n\t\t}\n\t\tbodyStyle.overflow = 'hidden';\n\t\treturn () => {\n\t\t\tif (scrollbarWidth > 0) {\n\t\t\t\tbodyStyle.paddingRight = paddingRight;\n\t\t\t}\n\t\t\tbodyStyle.overflow = overflow;\n\t\t};\n\t}\n}\n","import { HubTooltipOptions, HubTooltipPlacement } from './tooltip.types';\n\n/**\n * Themeable custom properties forwarded from the host to the tooltip element.\n *\n * The tooltip is appended to `<body>`, so it cannot inherit scoped variables set\n * on an ancestor of the host. We resolve them on the host (which *does* inherit\n * from its scope) and copy any defined value onto the tooltip inline style, so\n * both `:root`-level and scoped theming work.\n */\nconst TOOLTIP_THEME_VARS = [\n\t'--hub-tooltip-bg',\n\t'--hub-tooltip-color',\n\t'--hub-tooltip-opacity',\n\t'--hub-tooltip-padding-x',\n\t'--hub-tooltip-padding-y',\n\t'--hub-tooltip-border-radius',\n\t'--hub-tooltip-font-size',\n\t'--hub-tooltip-font-weight',\n\t'--hub-tooltip-line-height',\n\t'--hub-tooltip-max-width',\n\t'--hub-tooltip-zindex',\n\t'--hub-tooltip-transition-duration',\n\t'--hub-tooltip-shadow',\n\t'--hub-tooltip-font-family'\n];\n\n/**\n * Framework-agnostic tooltip engine.\n *\n * Binds hover/focus listeners to a host element and renders a body-portaled,\n * `--hub-tooltip-*`-themeable label on demand. It owns no Angular dependency, so\n * it can be reused both by the `[tooltip]` directive and by other primitives\n * (e.g. a badge overflow tooltip) that want the exact same visual contract\n * without re-implementing the DOM logic.\n *\n * Styles ship in `styles/tooltip.scss`. Import once in your app:\n * `@use 'ng-hub-ui-utils/styles/tooltip';`.\n */\nexport class HubTooltipController {\n\tprivate tooltipEl: HTMLElement | null = null;\n\tprivate hideTimeout: ReturnType<typeof setTimeout> | null = null;\n\n\tprivate text = '';\n\tprivate placement: HubTooltipPlacement = 'top';\n\tprivate delay = 150;\n\tprivate offset = 8;\n\n\tprivate readonly doc: Document;\n\tprivate readonly view: (Window & typeof globalThis) | null;\n\n\tprivate readonly onShow = (): void => this.show();\n\tprivate readonly onHide = (): void => this.hide();\n\n\t/**\n\t * @param host Element the tooltip is anchored to and whose pointer/focus\n\t * events trigger the tooltip.\n\t * @param options Initial placement, delay and offset.\n\t */\n\tconstructor(private readonly host: HTMLElement, options?: HubTooltipOptions) {\n\t\tthis.doc = host.ownerDocument;\n\t\tthis.view = this.doc.defaultView as (Window & typeof globalThis) | null;\n\t\tthis.setOptions(options);\n\n\t\tthis.host.addEventListener('mouseenter', this.onShow);\n\t\tthis.host.addEventListener('focus', this.onShow);\n\t\tthis.host.addEventListener('mouseleave', this.onHide);\n\t\tthis.host.addEventListener('blur', this.onHide);\n\t\tthis.host.addEventListener('click', this.onHide);\n\t}\n\n\t/**\n\t * Updates the tooltip label. An empty value disables the tooltip and hides any\n\t * currently visible instance.\n\t * @param text New tooltip content.\n\t */\n\tsetText(text: string): void {\n\t\tthis.text = text ?? '';\n\t\tif (!this.text) {\n\t\t\tthis.hide();\n\t\t\treturn;\n\t\t}\n\t\tif (this.tooltipEl) {\n\t\t\tthis.tooltipEl.textContent = this.text;\n\t\t\tthis.position();\n\t\t}\n\t}\n\n\t/**\n\t * Updates placement/delay/offset. Only provided keys are overwritten.\n\t * @param options Partial tooltip options.\n\t */\n\tsetOptions(options?: HubTooltipOptions): void {\n\t\tif (!options) {\n\t\t\treturn;\n\t\t}\n\t\tif (options.placement) {\n\t\t\tthis.placement = options.placement;\n\t\t}\n\t\tif (options.delay != null) {\n\t\t\tthis.delay = options.delay;\n\t\t}\n\t\tif (options.offset != null) {\n\t\t\tthis.offset = options.offset;\n\t\t}\n\t}\n\n\t/** Detaches listeners and removes any live tooltip element. */\n\tdestroy(): void {\n\t\tthis.host.removeEventListener('mouseenter', this.onShow);\n\t\tthis.host.removeEventListener('focus', this.onShow);\n\t\tthis.host.removeEventListener('mouseleave', this.onHide);\n\t\tthis.host.removeEventListener('blur', this.onHide);\n\t\tthis.host.removeEventListener('click', this.onHide);\n\t\tthis.removeElement();\n\t}\n\n\t/** Creates, positions and reveals the tooltip element. */\n\tprivate show(): void {\n\t\tif (this.tooltipEl || !this.text) {\n\t\t\treturn;\n\t\t}\n\t\tthis.clearHideTimeout();\n\n\t\tconst el = this.doc.createElement('span');\n\t\tel.textContent = this.text;\n\t\tel.classList.add('hub-tooltip', `hub-tooltip--${this.placement}`);\n\t\tel.style.transitionDuration = `${this.delay}ms`;\n\t\tthis.forwardThemeVars(el);\n\t\tthis.doc.body.appendChild(el);\n\t\tthis.tooltipEl = el;\n\n\t\tthis.position();\n\t\tel.classList.add('hub-tooltip--show');\n\t}\n\n\t/** Fades the tooltip out and removes it after the fade completes. */\n\tprivate hide(): void {\n\t\tif (!this.tooltipEl) {\n\t\t\treturn;\n\t\t}\n\t\tthis.tooltipEl.classList.remove('hub-tooltip--show');\n\t\tthis.clearHideTimeout();\n\t\tthis.hideTimeout = setTimeout(() => this.removeElement(), this.delay);\n\t}\n\n\t/** Removes the tooltip element immediately. */\n\tprivate removeElement(): void {\n\t\tthis.clearHideTimeout();\n\t\tif (this.tooltipEl) {\n\t\t\tthis.tooltipEl.remove();\n\t\t\tthis.tooltipEl = null;\n\t\t}\n\t}\n\n\t/**\n\t * Copies any `--hub-tooltip-*` value defined on the host (or its scope) onto\n\t * the body-portaled tooltip, so scoped theming applies despite the portal.\n\t */\n\tprivate forwardThemeVars(el: HTMLElement): void {\n\t\tif (!this.view) {\n\t\t\treturn;\n\t\t}\n\t\tconst hostStyles = this.view.getComputedStyle(this.host);\n\t\tfor (const name of TOOLTIP_THEME_VARS) {\n\t\t\tconst value = hostStyles.getPropertyValue(name).trim();\n\t\t\tif (value) {\n\t\t\t\tel.style.setProperty(name, value);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate clearHideTimeout(): void {\n\t\tif (this.hideTimeout !== null) {\n\t\t\tclearTimeout(this.hideTimeout);\n\t\t\tthis.hideTimeout = null;\n\t\t}\n\t}\n\n\t/** Positions the tooltip around the host according to the current placement. */\n\tprivate position(): void {\n\t\tif (!this.tooltipEl) {\n\t\t\treturn;\n\t\t}\n\t\tconst hostRect = this.host.getBoundingClientRect();\n\t\tconst tipRect = this.tooltipEl.getBoundingClientRect();\n\t\tconst scrollY = this.view?.scrollY ?? 0;\n\t\tconst scrollX = this.view?.scrollX ?? 0;\n\t\tconst offset = this.offset;\n\n\t\tlet top = 0;\n\t\tlet left = 0;\n\n\t\tswitch (this.placement) {\n\t\t\tcase 'bottom':\n\t\t\t\ttop = hostRect.bottom + offset;\n\t\t\t\tleft = hostRect.left + (hostRect.width - tipRect.width) / 2;\n\t\t\t\tbreak;\n\t\t\tcase 'left':\n\t\t\t\ttop = hostRect.top + (hostRect.height - tipRect.height) / 2;\n\t\t\t\tleft = hostRect.left - tipRect.width - offset;\n\t\t\t\tbreak;\n\t\t\tcase 'right':\n\t\t\t\ttop = hostRect.top + (hostRect.height - tipRect.height) / 2;\n\t\t\t\tleft = hostRect.right + offset;\n\t\t\t\tbreak;\n\t\t\tcase 'top':\n\t\t\tdefault:\n\t\t\t\ttop = hostRect.top - tipRect.height - offset;\n\t\t\t\tleft = hostRect.left + (hostRect.width - tipRect.width) / 2;\n\t\t\t\tbreak;\n\t\t}\n\n\t\tthis.tooltipEl.style.top = `${top + scrollY}px`;\n\t\tthis.tooltipEl.style.left = `${left + scrollX}px`;\n\t}\n}\n","import { HubTooltipController } from './tooltip-controller';\nimport { HubTooltipAdapter, HubTooltipHandle, HubTooltipOptions } from './tooltip.types';\n\n/**\n * Ready-made {@link HubTooltipAdapter} backed by {@link HubTooltipController}.\n *\n * Wire it into any ng-hub-ui primitive that exposes an optional tooltip token,\n * e.g. `provideHubBadgeTooltip(hubTooltipAdapter)`.\n */\nexport const hubTooltipAdapter: HubTooltipAdapter = {\n\tattach(host: HTMLElement, text: string, options?: HubTooltipOptions): HubTooltipHandle {\n\t\tconst controller = new HubTooltipController(host, options);\n\t\tcontroller.setText(text);\n\n\t\treturn {\n\t\t\tupdate: (next: string) => controller.setText(next),\n\t\t\tdestroy: () => controller.destroy()\n\t\t};\n\t}\n};\n","import { Directive, ElementRef, effect, inject, input, OnDestroy } from '@angular/core';\nimport { HubTooltipController } from './tooltip-controller';\nimport { HubTooltipPlacement } from './tooltip.types';\n\n/**\n * Lightweight tooltip directive.\n *\n * Apply `[tooltip]` to any element to show a positioned label on hover/focus.\n * The tooltip element is appended to `<body>` so it is never clipped by an\n * overflow container, and every visual aspect is themeable through\n * `--hub-tooltip-*` CSS variables.\n *\n * All DOM work is delegated to {@link HubTooltipController}, so the directive and\n * any imperative consumer (e.g. a badge overflow tooltip) share the exact same\n * behaviour and styling.\n *\n * Styles ship in `styles/tooltip.scss` (mirroring `styles/overlay.scss`). Import\n * it once in your app: `@use 'ng-hub-ui-utils/styles/tooltip';`.\n */\n@Directive({\n\tselector: '[tooltip]'\n})\nexport class TooltipDirective implements OnDestroy {\n\t/** Tooltip text content. */\n\treadonly tooltipTitle = input.required<string>({ alias: 'tooltip' });\n\n\t/** Placement of the tooltip relative to the host. */\n\treadonly placement = input<HubTooltipPlacement>('top');\n\n\t/** Fade duration in milliseconds, also used as the removal delay on hide. */\n\treadonly delay = input<number>(150);\n\n\t/** Gap in pixels between the host and the tooltip. */\n\treadonly offset = input<number>(8);\n\n\tprivate readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n\tprivate readonly controller = new HubTooltipController(this.host.nativeElement);\n\n\tconstructor() {\n\t\teffect(() => {\n\t\t\tthis.controller.setOptions({\n\t\t\t\tplacement: this.placement(),\n\t\t\t\tdelay: this.delay(),\n\t\t\t\toffset: this.offset()\n\t\t\t});\n\t\t\tthis.controller.setText(this.tooltipTitle());\n\t\t});\n\t}\n\n\tngOnDestroy(): void {\n\t\tthis.controller.destroy();\n\t}\n}\n","/*\n * Public API Surface of utils\n */\n\nexport * from './lib/drag-drop';\nexport * from './lib/focus-trap';\nexport * from './lib/i18n/translation.provider';\nexport * from './lib/i18n/translation.service';\nexport * from './lib/i18n/translation.tokens';\nexport * from './lib/overlay';\nexport { GetPipe } from './lib/pipes/get.pipe';\nexport { IsObjectPipe } from './lib/pipes/is-object.pipe';\nexport { IsObservablePipe } from './lib/pipes/is-observable.pipe';\nexport { IsStringPipe } from './lib/pipes/is-string.pipe';\nexport * from './lib/pipes/translate.pipe';\nexport { UcfirstPipe } from './lib/pipes/ucfirst.pipe';\nexport { UnwrapAsyncPipe } from './lib/pipes/unwrap-async.pipe';\nexport * from './lib/popup';\nexport * from './lib/scrollbar';\nexport * from './lib/tooltip/tooltip.types';\nexport * from './lib/tooltip/tooltip-controller';\nexport * from './lib/tooltip/tooltip-adapter';\nexport * from './lib/tooltip/tooltip.directive';\nexport * from './lib/transitions';\nexport * from './lib/util';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ng-hub-ui-utils",
3
- "version": "22.4.0",
3
+ "version": "22.5.0",
4
4
  "peerDependencies": {
5
5
  "@angular/common": ">=18.0.0",
6
6
  "@angular/core": ">=18.0.0"
@@ -769,6 +769,110 @@ declare class ScrollBar {
769
769
 
770
770
  /** Supported tooltip placements relative to the host element. */
771
771
  type HubTooltipPlacement = 'top' | 'bottom' | 'left' | 'right';
772
+ /**
773
+ * Imperative configuration shared by the tooltip directive and any consumer that
774
+ * drives a tooltip through `HubTooltipController`.
775
+ */
776
+ interface HubTooltipOptions {
777
+ /** Placement of the tooltip relative to the host. */
778
+ placement?: HubTooltipPlacement;
779
+ /** Fade duration in milliseconds, also used as the removal delay on hide. */
780
+ delay?: number;
781
+ /** Gap in pixels between the host and the tooltip. */
782
+ offset?: number;
783
+ }
784
+ /**
785
+ * Live handle returned by `HubTooltipAdapter.attach`, used to update or tear
786
+ * down a tooltip.
787
+ */
788
+ interface HubTooltipHandle {
789
+ /** Updates the tooltip label (empty string disables it). */
790
+ update(text: string): void;
791
+ /** Detaches listeners and removes the tooltip. */
792
+ destroy(): void;
793
+ }
794
+ /**
795
+ * Minimal, framework-agnostic tooltip contract.
796
+ *
797
+ * It is deliberately defined by structure (not by import) so any primitive in
798
+ * the ecosystem — such as `ng-hub-ui-badges` — can accept this implementation
799
+ * through its own token without taking a hard dependency on this package.
800
+ */
801
+ interface HubTooltipAdapter {
802
+ /**
803
+ * Attaches a hub-ui tooltip to `host` with the given initial `text`.
804
+ * @returns A handle to update or tear down the tooltip.
805
+ */
806
+ attach(host: HTMLElement, text: string, options?: HubTooltipOptions): HubTooltipHandle;
807
+ }
808
+
809
+ /**
810
+ * Framework-agnostic tooltip engine.
811
+ *
812
+ * Binds hover/focus listeners to a host element and renders a body-portaled,
813
+ * `--hub-tooltip-*`-themeable label on demand. It owns no Angular dependency, so
814
+ * it can be reused both by the `[tooltip]` directive and by other primitives
815
+ * (e.g. a badge overflow tooltip) that want the exact same visual contract
816
+ * without re-implementing the DOM logic.
817
+ *
818
+ * Styles ship in `styles/tooltip.scss`. Import once in your app:
819
+ * `@use 'ng-hub-ui-utils/styles/tooltip';`.
820
+ */
821
+ declare class HubTooltipController {
822
+ private readonly host;
823
+ private tooltipEl;
824
+ private hideTimeout;
825
+ private text;
826
+ private placement;
827
+ private delay;
828
+ private offset;
829
+ private readonly doc;
830
+ private readonly view;
831
+ private readonly onShow;
832
+ private readonly onHide;
833
+ /**
834
+ * @param host Element the tooltip is anchored to and whose pointer/focus
835
+ * events trigger the tooltip.
836
+ * @param options Initial placement, delay and offset.
837
+ */
838
+ constructor(host: HTMLElement, options?: HubTooltipOptions);
839
+ /**
840
+ * Updates the tooltip label. An empty value disables the tooltip and hides any
841
+ * currently visible instance.
842
+ * @param text New tooltip content.
843
+ */
844
+ setText(text: string): void;
845
+ /**
846
+ * Updates placement/delay/offset. Only provided keys are overwritten.
847
+ * @param options Partial tooltip options.
848
+ */
849
+ setOptions(options?: HubTooltipOptions): void;
850
+ /** Detaches listeners and removes any live tooltip element. */
851
+ destroy(): void;
852
+ /** Creates, positions and reveals the tooltip element. */
853
+ private show;
854
+ /** Fades the tooltip out and removes it after the fade completes. */
855
+ private hide;
856
+ /** Removes the tooltip element immediately. */
857
+ private removeElement;
858
+ /**
859
+ * Copies any `--hub-tooltip-*` value defined on the host (or its scope) onto
860
+ * the body-portaled tooltip, so scoped theming applies despite the portal.
861
+ */
862
+ private forwardThemeVars;
863
+ private clearHideTimeout;
864
+ /** Positions the tooltip around the host according to the current placement. */
865
+ private position;
866
+ }
867
+
868
+ /**
869
+ * Ready-made {@link HubTooltipAdapter} backed by {@link HubTooltipController}.
870
+ *
871
+ * Wire it into any ng-hub-ui primitive that exposes an optional tooltip token,
872
+ * e.g. `provideHubBadgeTooltip(hubTooltipAdapter)`.
873
+ */
874
+ declare const hubTooltipAdapter: HubTooltipAdapter;
875
+
772
876
  /**
773
877
  * Lightweight tooltip directive.
774
878
  *
@@ -777,6 +881,10 @@ type HubTooltipPlacement = 'top' | 'bottom' | 'left' | 'right';
777
881
  * overflow container, and every visual aspect is themeable through
778
882
  * `--hub-tooltip-*` CSS variables.
779
883
  *
884
+ * All DOM work is delegated to {@link HubTooltipController}, so the directive and
885
+ * any imperative consumer (e.g. a badge overflow tooltip) share the exact same
886
+ * behaviour and styling.
887
+ *
780
888
  * Styles ship in `styles/tooltip.scss` (mirroring `styles/overlay.scss`). Import
781
889
  * it once in your app: `@use 'ng-hub-ui-utils/styles/tooltip';`.
782
890
  */
@@ -789,28 +897,10 @@ declare class TooltipDirective implements OnDestroy {
789
897
  readonly delay: i0.InputSignal<number>;
790
898
  /** Gap in pixels between the host and the tooltip. */
791
899
  readonly offset: i0.InputSignal<number>;
792
- private tooltipEl;
793
- private hideTimeout;
794
900
  private readonly host;
795
- private readonly renderer;
796
- private readonly document;
901
+ private readonly controller;
902
+ constructor();
797
903
  ngOnDestroy(): void;
798
- protected onShow(): void;
799
- protected onHide(): void;
800
- /** Creates, positions and reveals the tooltip element. */
801
- private show;
802
- /** Fades the tooltip out and removes it after the fade completes. */
803
- private hide;
804
- /** Removes the tooltip element immediately. */
805
- private destroyTooltip;
806
- /**
807
- * Copies any `--hub-tooltip-*` value defined on the host (or its scope) onto
808
- * the body-portaled tooltip, so scoped theming applies despite the portal.
809
- */
810
- private forwardThemeVars;
811
- private clearHideTimeout;
812
- /** Positions the tooltip around the host according to `placement`. */
813
- private position;
814
904
  static ɵfac: i0.ɵɵFactoryDeclaration<TooltipDirective, never>;
815
905
  static ɵdir: i0.ɵɵDirectiveDeclaration<TooltipDirective, "[tooltip]", never, { "tooltipTitle": { "alias": "tooltip"; "required": true; "isSignal": true; }; "placement": { "alias": "placement"; "required": false; "isSignal": true; }; "delay": { "alias": "delay"; "required": false; "isSignal": true; }; "offset": { "alias": "offset"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
816
906
  }
@@ -955,5 +1045,5 @@ declare function debouncedSignal<T>(sourceSignal: Signal<T>, debounceDelay?: num
955
1045
  */
956
1046
  declare function getActiveElement(root?: Document | ShadowRoot): Element | null;
957
1047
 
958
- export { ContentRef, FOCUSABLE_ELEMENTS_SELECTOR, GetPipe, HUB_TRANSLATION_CONFIG, HubDragDropService, HubTranslationService, IsObjectPipe, IsObservablePipe, IsStringPipe, OverlayPosition, OverlayRef, OverlayService, PopupService, ScrollBar, TooltipDirective, TranslatePipe, UcfirstPipe, UnwrapAsyncPipe, clamp, closest, computeTargetIndex, containsNode, copyArrayItem, createNativeDragImage, createPointerDragSession, debouncedSignal, equals, generateUniqueId, getActiveElement, getFocusableBoundaryElements, getValue, getValueInRange, hubCompleteTransition, hubFocusTrap, hubRunTransition, interpolateString, isDefined, isInteger, isNumber, isObject, isPromise, isString, mergeDeep, moveItemInArray, padNumber, provideHubTranslation, reflow, regExpEscape, removeAccents, resolveDropPosition, runInZone, toAbsoluteIndex, toInteger, toString, transferArrayItem };
959
- export type { ActiveDrag, ConnectionPosition, DragAxis, DragContainerRef, DragImageResult, DragPointerMode, DragRegistration, DragTarget, DropPosition, DropRect, HorizontalConnectionPos, HubTooltipPlacement, HubTranslationConfig, OverlayConfig, PointerDragSession, PointerDragSessionConfig, ScrollbarReverter, TransitionCtx, TransitionEndFn, TransitionOptions, TransitionStartFn, VerticalConnectionPos };
1048
+ export { ContentRef, FOCUSABLE_ELEMENTS_SELECTOR, GetPipe, HUB_TRANSLATION_CONFIG, HubDragDropService, HubTooltipController, HubTranslationService, IsObjectPipe, IsObservablePipe, IsStringPipe, OverlayPosition, OverlayRef, OverlayService, PopupService, ScrollBar, TooltipDirective, TranslatePipe, UcfirstPipe, UnwrapAsyncPipe, clamp, closest, computeTargetIndex, containsNode, copyArrayItem, createNativeDragImage, createPointerDragSession, debouncedSignal, equals, generateUniqueId, getActiveElement, getFocusableBoundaryElements, getValue, getValueInRange, hubCompleteTransition, hubFocusTrap, hubRunTransition, hubTooltipAdapter, interpolateString, isDefined, isInteger, isNumber, isObject, isPromise, isString, mergeDeep, moveItemInArray, padNumber, provideHubTranslation, reflow, regExpEscape, removeAccents, resolveDropPosition, runInZone, toAbsoluteIndex, toInteger, toString, transferArrayItem };
1049
+ export type { ActiveDrag, ConnectionPosition, DragAxis, DragContainerRef, DragImageResult, DragPointerMode, DragRegistration, DragTarget, DropPosition, DropRect, HorizontalConnectionPos, HubTooltipAdapter, HubTooltipHandle, HubTooltipOptions, HubTooltipPlacement, HubTranslationConfig, OverlayConfig, PointerDragSession, PointerDragSessionConfig, ScrollbarReverter, TransitionCtx, TransitionEndFn, TransitionOptions, TransitionStartFn, VerticalConnectionPos };
Binary file