@ngneers/controls 0.0.1-pre6 → 0.0.1-pre7

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.
Files changed (148) hide show
  1. package/fesm2022/ngneers-controls-accordion.mjs +10 -10
  2. package/fesm2022/ngneers-controls-accordion.mjs.map +1 -1
  3. package/fesm2022/ngneers-controls-api-ng.mjs +12 -9
  4. package/fesm2022/ngneers-controls-api-ng.mjs.map +1 -1
  5. package/fesm2022/ngneers-controls-avatar.mjs +6 -6
  6. package/fesm2022/ngneers-controls-avatar.mjs.map +1 -1
  7. package/fesm2022/ngneers-controls-base.mjs +9 -9
  8. package/fesm2022/ngneers-controls-base.mjs.map +1 -1
  9. package/fesm2022/ngneers-controls-breadcrumb.mjs +7 -7
  10. package/fesm2022/ngneers-controls-breadcrumb.mjs.map +1 -1
  11. package/fesm2022/ngneers-controls-button-group.mjs +3 -3
  12. package/fesm2022/ngneers-controls-button-group.mjs.map +1 -1
  13. package/fesm2022/ngneers-controls-button.mjs +6 -6
  14. package/fesm2022/ngneers-controls-button.mjs.map +1 -1
  15. package/fesm2022/{ngneers-controls-calendar-time-Bzlv9Vkn.mjs → ngneers-controls-calendar-time-CKAqRgOP.mjs} +4 -4
  16. package/fesm2022/{ngneers-controls-calendar-time-Bzlv9Vkn.mjs.map → ngneers-controls-calendar-time-CKAqRgOP.mjs.map} +1 -1
  17. package/fesm2022/ngneers-controls-calendar.mjs +11 -11
  18. package/fesm2022/ngneers-controls-calendar.mjs.map +1 -1
  19. package/fesm2022/ngneers-controls-checkbox.mjs +4 -4
  20. package/fesm2022/ngneers-controls-checkbox.mjs.map +1 -1
  21. package/fesm2022/ngneers-controls-chip.mjs +4 -4
  22. package/fesm2022/ngneers-controls-chip.mjs.map +1 -1
  23. package/fesm2022/ngneers-controls-default-icons.mjs +61 -0
  24. package/fesm2022/ngneers-controls-default-icons.mjs.map +1 -0
  25. package/fesm2022/ngneers-controls-defer.mjs +3 -3
  26. package/fesm2022/ngneers-controls-defer.mjs.map +1 -1
  27. package/fesm2022/ngneers-controls-dialog.mjs +10 -10
  28. package/fesm2022/ngneers-controls-dialog.mjs.map +1 -1
  29. package/fesm2022/ngneers-controls-directives.mjs +21 -21
  30. package/fesm2022/ngneers-controls-directives.mjs.map +1 -1
  31. package/fesm2022/ngneers-controls-drawer.mjs +7 -7
  32. package/fesm2022/ngneers-controls-drawer.mjs.map +1 -1
  33. package/fesm2022/ngneers-controls-edit-inplace.mjs +7 -7
  34. package/fesm2022/ngneers-controls-edit-inplace.mjs.map +1 -1
  35. package/fesm2022/ngneers-controls-filter.mjs +4 -4
  36. package/fesm2022/ngneers-controls-filter.mjs.map +1 -1
  37. package/fesm2022/ngneers-controls-i18n.mjs +3 -3
  38. package/fesm2022/ngneers-controls-i18n.mjs.map +1 -1
  39. package/fesm2022/ngneers-controls-icon.mjs +108 -44
  40. package/fesm2022/ngneers-controls-icon.mjs.map +1 -1
  41. package/fesm2022/ngneers-controls-inplace.mjs +6 -6
  42. package/fesm2022/ngneers-controls-inplace.mjs.map +1 -1
  43. package/fesm2022/ngneers-controls-input-field.mjs +5 -5
  44. package/fesm2022/ngneers-controls-input-field.mjs.map +1 -1
  45. package/fesm2022/ngneers-controls-input-mask.mjs +3 -3
  46. package/fesm2022/ngneers-controls-input-mask.mjs.map +1 -1
  47. package/fesm2022/ngneers-controls-input.mjs +3 -3
  48. package/fesm2022/ngneers-controls-input.mjs.map +1 -1
  49. package/fesm2022/ngneers-controls-item-view.mjs +6 -6
  50. package/fesm2022/ngneers-controls-item-view.mjs.map +1 -1
  51. package/fesm2022/ngneers-controls-list-box.mjs +6 -6
  52. package/fesm2022/ngneers-controls-list-box.mjs.map +1 -1
  53. package/fesm2022/ngneers-controls-menu.mjs +10 -10
  54. package/fesm2022/ngneers-controls-menu.mjs.map +1 -1
  55. package/fesm2022/ngneers-controls-message.mjs +3 -3
  56. package/fesm2022/ngneers-controls-message.mjs.map +1 -1
  57. package/fesm2022/ngneers-controls-paginator.mjs +4 -4
  58. package/fesm2022/ngneers-controls-paginator.mjs.map +1 -1
  59. package/fesm2022/ngneers-controls-popover.mjs +11 -6
  60. package/fesm2022/ngneers-controls-popover.mjs.map +1 -1
  61. package/fesm2022/ngneers-controls-progress.mjs +3 -3
  62. package/fesm2022/ngneers-controls-progress.mjs.map +1 -1
  63. package/fesm2022/ngneers-controls-scroll-shadow.mjs +54 -0
  64. package/fesm2022/ngneers-controls-scroll-shadow.mjs.map +1 -0
  65. package/fesm2022/ngneers-controls-scroller.mjs +9 -9
  66. package/fesm2022/ngneers-controls-scroller.mjs.map +1 -1
  67. package/fesm2022/ngneers-controls-select-button.mjs +4 -4
  68. package/fesm2022/ngneers-controls-select-button.mjs.map +1 -1
  69. package/fesm2022/ngneers-controls-select.mjs +8 -7
  70. package/fesm2022/ngneers-controls-select.mjs.map +1 -1
  71. package/fesm2022/ngneers-controls-slider.mjs +3 -3
  72. package/fesm2022/ngneers-controls-slider.mjs.map +1 -1
  73. package/fesm2022/ngneers-controls-spinner.mjs +3 -3
  74. package/fesm2022/ngneers-controls-spinner.mjs.map +1 -1
  75. package/fesm2022/ngneers-controls-splitter.mjs +10 -10
  76. package/fesm2022/ngneers-controls-splitter.mjs.map +1 -1
  77. package/fesm2022/ngneers-controls-switch.mjs +3 -3
  78. package/fesm2022/ngneers-controls-switch.mjs.map +1 -1
  79. package/fesm2022/ngneers-controls-table.mjs +227 -293
  80. package/fesm2022/ngneers-controls-table.mjs.map +1 -1
  81. package/fesm2022/ngneers-controls-tabs.mjs +10 -10
  82. package/fesm2022/ngneers-controls-tabs.mjs.map +1 -1
  83. package/fesm2022/ngneers-controls-tag.mjs +3 -3
  84. package/fesm2022/ngneers-controls-tag.mjs.map +1 -1
  85. package/fesm2022/ngneers-controls-toast.mjs +10 -10
  86. package/fesm2022/ngneers-controls-toast.mjs.map +1 -1
  87. package/fesm2022/ngneers-controls-toggle-button.mjs +4 -4
  88. package/fesm2022/ngneers-controls-toggle-button.mjs.map +1 -1
  89. package/fesm2022/ngneers-controls-tooltip.mjs +44 -8
  90. package/fesm2022/ngneers-controls-tooltip.mjs.map +1 -1
  91. package/fesm2022/ngneers-controls-utils-ng.mjs +3 -3
  92. package/fesm2022/ngneers-controls-utils-ng.mjs.map +1 -1
  93. package/fesm2022/ngneers-controls-utils.mjs +1 -1
  94. package/fesm2022/ngneers-controls-utils.mjs.map +1 -1
  95. package/package.json +29 -11
  96. package/types/ngneers-controls-accordion.d.ts +6 -4
  97. package/types/ngneers-controls-api-ng.d.ts +5 -0
  98. package/types/ngneers-controls-api.d.ts +2 -2
  99. package/types/ngneers-controls-breadcrumb.d.ts +5 -3
  100. package/types/ngneers-controls-checkbox.d.ts +5 -3
  101. package/types/ngneers-controls-chip.d.ts +3 -1
  102. package/types/ngneers-controls-default-icons.d.ts +5 -0
  103. package/types/ngneers-controls-drawer.d.ts +3 -1
  104. package/types/ngneers-controls-filter.d.ts +1 -1
  105. package/types/ngneers-controls-icon.d.ts +23 -40
  106. package/types/ngneers-controls-input-field.d.ts +3 -1
  107. package/types/ngneers-controls-item-view.d.ts +4 -2
  108. package/types/ngneers-controls-menu.d.ts +3 -1
  109. package/types/ngneers-controls-message.d.ts +3 -1
  110. package/types/ngneers-controls-popover.d.ts +1 -0
  111. package/types/ngneers-controls-scroll-shadow.d.ts +16 -0
  112. package/types/ngneers-controls-select.d.ts +5 -10
  113. package/types/ngneers-controls-table.d.ts +29 -41
  114. package/types/ngneers-controls-tabs.d.ts +4 -2
  115. package/types/ngneers-controls-tag.d.ts +3 -1
  116. package/types/ngneers-controls-toast.d.ts +4 -2
  117. package/types/ngneers-controls-toggle-button.d.ts +5 -3
  118. package/types/ngneers-controls-tooltip.d.ts +7 -1
  119. package/fesm2022/ngneers-controls-icon-calendar-z5xA9wTT.mjs +0 -4
  120. package/fesm2022/ngneers-controls-icon-calendar-z5xA9wTT.mjs.map +0 -1
  121. package/fesm2022/ngneers-controls-icon-check-DdAQ9k-T.mjs +0 -4
  122. package/fesm2022/ngneers-controls-icon-check-DdAQ9k-T.mjs.map +0 -1
  123. package/fesm2022/ngneers-controls-icon-chevron_down-HO-z-xOr.mjs +0 -4
  124. package/fesm2022/ngneers-controls-icon-chevron_down-HO-z-xOr.mjs.map +0 -1
  125. package/fesm2022/ngneers-controls-icon-chevron_left-CC5psi16.mjs +0 -4
  126. package/fesm2022/ngneers-controls-icon-chevron_left-CC5psi16.mjs.map +0 -1
  127. package/fesm2022/ngneers-controls-icon-chevron_right-BRxlzx4G.mjs +0 -4
  128. package/fesm2022/ngneers-controls-icon-chevron_right-BRxlzx4G.mjs.map +0 -1
  129. package/fesm2022/ngneers-controls-icon-chevron_up-cqhPO7g2.mjs +0 -4
  130. package/fesm2022/ngneers-controls-icon-chevron_up-cqhPO7g2.mjs.map +0 -1
  131. package/fesm2022/ngneers-controls-icon-ellipsis-DXIGA1sk.mjs +0 -4
  132. package/fesm2022/ngneers-controls-icon-ellipsis-DXIGA1sk.mjs.map +0 -1
  133. package/fesm2022/ngneers-controls-icon-filter-oU7E6Xgr.mjs +0 -4
  134. package/fesm2022/ngneers-controls-icon-filter-oU7E6Xgr.mjs.map +0 -1
  135. package/fesm2022/ngneers-controls-icon-filter_solid-CqIKuR4N.mjs +0 -4
  136. package/fesm2022/ngneers-controls-icon-filter_solid-CqIKuR4N.mjs.map +0 -1
  137. package/fesm2022/ngneers-controls-icon-magnifying_glass-T4Hzbkig.mjs +0 -4
  138. package/fesm2022/ngneers-controls-icon-magnifying_glass-T4Hzbkig.mjs.map +0 -1
  139. package/fesm2022/ngneers-controls-icon-minus-oGDEFO4E.mjs +0 -4
  140. package/fesm2022/ngneers-controls-icon-minus-oGDEFO4E.mjs.map +0 -1
  141. package/fesm2022/ngneers-controls-icon-sort-CRD4tafz.mjs +0 -4
  142. package/fesm2022/ngneers-controls-icon-sort-CRD4tafz.mjs.map +0 -1
  143. package/fesm2022/ngneers-controls-icon-sort_down-DiFB1P6R.mjs +0 -4
  144. package/fesm2022/ngneers-controls-icon-sort_down-DiFB1P6R.mjs.map +0 -1
  145. package/fesm2022/ngneers-controls-icon-sort_up-Bq_q3hIi.mjs +0 -4
  146. package/fesm2022/ngneers-controls-icon-sort_up-Bq_q3hIi.mjs.map +0 -1
  147. package/fesm2022/ngneers-controls-icon-xmark-BZKZORiu.mjs +0 -4
  148. package/fesm2022/ngneers-controls-icon-xmark-BZKZORiu.mjs.map +0 -1
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { inject, ViewContainerRef, signal, input, computed, effect, TemplateRef, Directive, viewChild, DOCUMENT, ChangeDetectionStrategy, Component } from '@angular/core';
2
+ import { inject, ViewContainerRef, signal, input, computed, effect, afterRenderEffect, TemplateRef, Directive, viewChild, DOCUMENT, ChangeDetectionStrategy, Component } from '@angular/core';
3
3
  import { NGN_CONFIG, abortSignalOnDestroy, autoPositionElement, splitPlacement } from '@ngneers/controls/api/ng';
4
4
  import { NgnBase, provideSelf, NgnPt } from '@ngneers/controls/base';
5
5
  import { NgnDefer } from '@ngneers/controls/defer';
@@ -123,6 +123,12 @@ class NgnTooltip extends NgnBase {
123
123
  * @default true
124
124
  */
125
125
  hideOnClick = input(null, { ...(ngDevMode ? { debugName: "hideOnClick" } : /* istanbul ignore next */ {}), alias: 'ngnTooltipHideOnClick' });
126
+ /**
127
+ * Whether to automatically manage ARIA attributes for the tooltip.
128
+ * @alias ngnTooltipAutoAriaMode
129
+ * @default 'description'
130
+ */
131
+ autoAriaMode = input(null, { ...(ngDevMode ? { debugName: "autoAriaMode" } : /* istanbul ignore next */ {}), alias: 'ngnTooltipAutoAriaMode' });
126
132
  effectiveOptions = computed(() => {
127
133
  const defaults = this._config.defaults.tooltip;
128
134
  return {
@@ -137,6 +143,7 @@ class NgnTooltip extends NgnBase {
137
143
  this.options()?.hideOnTooltipHover ??
138
144
  defaults.hideOnTooltipHover) !== false,
139
145
  hideOnClick: (this.hideOnClick() ?? this.options()?.hideOnClick ?? defaults.hideOnClick) !== false,
146
+ autoAriaMode: this.autoAriaMode() ?? this.options()?.autoAriaMode ?? defaults.autoAriaMode,
140
147
  };
141
148
  }, ...(ngDevMode ? [{ debugName: "effectiveOptions" }] : /* istanbul ignore next */ []));
142
149
  tooltip = computed(() => this._tooltip()?.instance, ...(ngDevMode ? [{ debugName: "tooltip" }] : /* istanbul ignore next */ []));
@@ -163,6 +170,34 @@ class NgnTooltip extends NgnBase {
163
170
  effect(() => this._tooltip()?.setInput('showOnlyIfTruncated', this.showOnlyIfTruncated()));
164
171
  effect(() => this._tooltip()?.setInput('size', this.size()));
165
172
  effect(() => this._tooltip()?.setInput('options', this.effectiveOptions()));
173
+ afterRenderEffect(() => {
174
+ const el = this.element.nativeElement;
175
+ const content = this.content();
176
+ const autoAriaMode = this.effectiveOptions().autoAriaMode;
177
+ el.removeAttribute('aria-label');
178
+ el.removeAttribute('aria-description');
179
+ el.removeAttribute('aria-labelledby');
180
+ el.removeAttribute('aria-describedby');
181
+ if (autoAriaMode === 'none' || !content) {
182
+ return;
183
+ }
184
+ const tooltip = this.tooltip();
185
+ const isShown = tooltip?.isShown() ?? false;
186
+ if (typeof content === 'string') {
187
+ if (isShown && tooltip) {
188
+ const attr = autoAriaMode === 'label' ? 'aria-labelledby' : 'aria-describedby';
189
+ el.setAttribute(attr, tooltip.id);
190
+ }
191
+ else {
192
+ const attr = autoAriaMode === 'label' ? 'aria-label' : 'aria-description';
193
+ el.setAttribute(attr, content);
194
+ }
195
+ }
196
+ else if (content instanceof TemplateRef && isShown && tooltip) {
197
+ const attr = autoAriaMode === 'label' ? 'aria-labelledby' : 'aria-describedby';
198
+ el.setAttribute(attr, tooltip.id);
199
+ }
200
+ });
166
201
  }
167
202
  ngOnDestroy() {
168
203
  this._tooltip()?.destroy();
@@ -227,17 +262,17 @@ class NgnTooltip extends NgnBase {
227
262
  tooltip.setInput('content', null);
228
263
  }
229
264
  }
230
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.2", ngImport: i0, type: NgnTooltip, deps: [], target: i0.ɵɵFactoryTarget.Directive });
231
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.2", type: NgnTooltip, isStandalone: true, selector: "[ngnTooltip]", inputs: { content: { classPropertyName: "content", publicName: "ngnTooltip", isSignal: true, isRequired: false, transformFunction: null }, showOnlyIfTruncated: { classPropertyName: "showOnlyIfTruncated", publicName: "ngnTooltipShowOnlyIfTruncated", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "ngnTooltipSize", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "ngnTooltipOptions", isSignal: true, isRequired: false, transformFunction: null }, placement: { classPropertyName: "placement", publicName: "ngnTooltipPlacement", isSignal: true, isRequired: false, transformFunction: null }, offset: { classPropertyName: "offset", publicName: "ngnTooltipOffset", isSignal: true, isRequired: false, transformFunction: null }, showDelay: { classPropertyName: "showDelay", publicName: "ngnTooltipShowDelay", isSignal: true, isRequired: false, transformFunction: null }, hideDelay: { classPropertyName: "hideDelay", publicName: "ngnTooltipHideDelay", isSignal: true, isRequired: false, transformFunction: null }, showArrow: { classPropertyName: "showArrow", publicName: "ngnTooltipShowArrow", isSignal: true, isRequired: false, transformFunction: null }, showOnHover: { classPropertyName: "showOnHover", publicName: "ngnTooltipShowOnHover", isSignal: true, isRequired: false, transformFunction: null }, showOnFocus: { classPropertyName: "showOnFocus", publicName: "ngnTooltipShowOnFocus", isSignal: true, isRequired: false, transformFunction: null }, hideOnTooltipHover: { classPropertyName: "hideOnTooltipHover", publicName: "ngnTooltipHideOnTooltipHover", isSignal: true, isRequired: false, transformFunction: null }, hideOnClick: { classPropertyName: "hideOnClick", publicName: "ngnTooltipHideOnClick", isSignal: true, isRequired: false, transformFunction: null } }, providers: [provideSelf(NgnTooltip)], exportAs: ["ngnTooltip"], usesInheritance: true, ngImport: i0 });
265
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.10", ngImport: i0, type: NgnTooltip, deps: [], target: i0.ɵɵFactoryTarget.Directive });
266
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.10", type: NgnTooltip, isStandalone: true, selector: "[ngnTooltip]", inputs: { content: { classPropertyName: "content", publicName: "ngnTooltip", isSignal: true, isRequired: false, transformFunction: null }, showOnlyIfTruncated: { classPropertyName: "showOnlyIfTruncated", publicName: "ngnTooltipShowOnlyIfTruncated", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "ngnTooltipSize", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "ngnTooltipOptions", isSignal: true, isRequired: false, transformFunction: null }, placement: { classPropertyName: "placement", publicName: "ngnTooltipPlacement", isSignal: true, isRequired: false, transformFunction: null }, offset: { classPropertyName: "offset", publicName: "ngnTooltipOffset", isSignal: true, isRequired: false, transformFunction: null }, showDelay: { classPropertyName: "showDelay", publicName: "ngnTooltipShowDelay", isSignal: true, isRequired: false, transformFunction: null }, hideDelay: { classPropertyName: "hideDelay", publicName: "ngnTooltipHideDelay", isSignal: true, isRequired: false, transformFunction: null }, showArrow: { classPropertyName: "showArrow", publicName: "ngnTooltipShowArrow", isSignal: true, isRequired: false, transformFunction: null }, showOnHover: { classPropertyName: "showOnHover", publicName: "ngnTooltipShowOnHover", isSignal: true, isRequired: false, transformFunction: null }, showOnFocus: { classPropertyName: "showOnFocus", publicName: "ngnTooltipShowOnFocus", isSignal: true, isRequired: false, transformFunction: null }, hideOnTooltipHover: { classPropertyName: "hideOnTooltipHover", publicName: "ngnTooltipHideOnTooltipHover", isSignal: true, isRequired: false, transformFunction: null }, hideOnClick: { classPropertyName: "hideOnClick", publicName: "ngnTooltipHideOnClick", isSignal: true, isRequired: false, transformFunction: null }, autoAriaMode: { classPropertyName: "autoAriaMode", publicName: "ngnTooltipAutoAriaMode", isSignal: true, isRequired: false, transformFunction: null } }, providers: [provideSelf(NgnTooltip)], exportAs: ["ngnTooltip"], usesInheritance: true, ngImport: i0 });
232
267
  }
233
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.2", ngImport: i0, type: NgnTooltip, decorators: [{
268
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.10", ngImport: i0, type: NgnTooltip, decorators: [{
234
269
  type: Directive,
235
270
  args: [{
236
271
  selector: '[ngnTooltip]',
237
272
  exportAs: 'ngnTooltip',
238
273
  providers: [provideSelf(NgnTooltip)],
239
274
  }]
240
- }], ctorParameters: () => [], propDecorators: { content: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnTooltip", required: false }] }], showOnlyIfTruncated: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnTooltipShowOnlyIfTruncated", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnTooltipSize", required: false }] }], options: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnTooltipOptions", required: false }] }], placement: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnTooltipPlacement", required: false }] }], offset: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnTooltipOffset", required: false }] }], showDelay: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnTooltipShowDelay", required: false }] }], hideDelay: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnTooltipHideDelay", required: false }] }], showArrow: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnTooltipShowArrow", required: false }] }], showOnHover: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnTooltipShowOnHover", required: false }] }], showOnFocus: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnTooltipShowOnFocus", required: false }] }], hideOnTooltipHover: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnTooltipHideOnTooltipHover", required: false }] }], hideOnClick: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnTooltipHideOnClick", required: false }] }] } });
275
+ }], ctorParameters: () => [], propDecorators: { content: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnTooltip", required: false }] }], showOnlyIfTruncated: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnTooltipShowOnlyIfTruncated", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnTooltipSize", required: false }] }], options: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnTooltipOptions", required: false }] }], placement: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnTooltipPlacement", required: false }] }], offset: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnTooltipOffset", required: false }] }], showDelay: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnTooltipShowDelay", required: false }] }], hideDelay: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnTooltipHideDelay", required: false }] }], showArrow: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnTooltipShowArrow", required: false }] }], showOnHover: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnTooltipShowOnHover", required: false }] }], showOnFocus: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnTooltipShowOnFocus", required: false }] }], hideOnTooltipHover: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnTooltipHideOnTooltipHover", required: false }] }], hideOnClick: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnTooltipHideOnClick", required: false }] }], autoAriaMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnTooltipAutoAriaMode", required: false }] }] } });
241
276
  class TooltipComponent extends NgnBase {
242
277
  _showHideTimeout;
243
278
  theme = this.injectThemeTemplate(tooltipControlTemplate, {
@@ -409,10 +444,10 @@ class TooltipComponent extends NgnBase {
409
444
  toPixels(value) {
410
445
  return value !== undefined ? `${value}px` : undefined;
411
446
  }
412
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.2", ngImport: i0, type: TooltipComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
413
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.2", type: TooltipComponent, isStandalone: true, selector: "ngn-tooltip", inputs: { anchor: { classPropertyName: "anchor", publicName: "anchor", isSignal: true, isRequired: true, transformFunction: null }, text: { classPropertyName: "text", publicName: "text", isSignal: true, isRequired: false, transformFunction: null }, content: { classPropertyName: "content", publicName: "content", isSignal: true, isRequired: false, transformFunction: null }, showOnlyIfTruncated: { classPropertyName: "showOnlyIfTruncated", publicName: "showOnlyIfTruncated", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "toggle": "onToggle($event)", "mouseenter": "onMouseEnter()", "mouseleave": "onMouseLeave()", "click": "onClick($event)" }, properties: { "class": "positionClass()", "style.--anchor-start": "toPixels(relativeAnchorElementPosition()?.start)", "style.--anchor-center": "toPixels(relativeAnchorElementPosition()?.center)", "style.--anchor-end": "toPixels(relativeAnchorElementPosition()?.end)", "style.left": "toPixels(position().x)", "style.top": "toPixels(position().y)", "attr.popover": "'hint'", "attr.id": "id", "attr.role": "'tooltip'" } }, providers: [provideSelf(TooltipComponent)], viewQueries: [{ propertyName: "_defaultContentTemplate", first: true, predicate: ["defaultContentTemplate"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div [ptInt]=\"this\" [ptClass]=\"'content'\">\r\n <ngn-defer [lazyContent]=\"contentTemplate()\" [open]=\"isShown()\" [cache]=\"false\"></ngn-defer>\r\n</div>\r\n\r\n<ng-template #defaultContentTemplate>\r\n <span [ptInt]=\"this\" [ptClass]=\"'text'\">{{ text() }}</span>\r\n</ng-template>\r\n", dependencies: [{ kind: "directive", type: NgnPt, selector: "[ptInt]", inputs: ["ptInt", "ptClass"] }, { kind: "component", type: NgnDefer, selector: "ngn-defer", inputs: ["lazyContent", "lazyContentContext", "open", "lazy", "cache", "hiddenOnClosed"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
447
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.10", ngImport: i0, type: TooltipComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
448
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.10", type: TooltipComponent, isStandalone: true, selector: "ngn-tooltip", inputs: { anchor: { classPropertyName: "anchor", publicName: "anchor", isSignal: true, isRequired: true, transformFunction: null }, text: { classPropertyName: "text", publicName: "text", isSignal: true, isRequired: false, transformFunction: null }, content: { classPropertyName: "content", publicName: "content", isSignal: true, isRequired: false, transformFunction: null }, showOnlyIfTruncated: { classPropertyName: "showOnlyIfTruncated", publicName: "showOnlyIfTruncated", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "toggle": "onToggle($event)", "mouseenter": "onMouseEnter()", "mouseleave": "onMouseLeave()", "click": "onClick($event)" }, properties: { "class": "positionClass()", "style.--anchor-start": "toPixels(relativeAnchorElementPosition()?.start)", "style.--anchor-center": "toPixels(relativeAnchorElementPosition()?.center)", "style.--anchor-end": "toPixels(relativeAnchorElementPosition()?.end)", "style.left": "toPixels(position().x)", "style.top": "toPixels(position().y)", "attr.popover": "'hint'", "attr.id": "id", "attr.role": "'tooltip'", "attr.aria-hidden": "isShown() ? null : true" } }, providers: [provideSelf(TooltipComponent)], viewQueries: [{ propertyName: "_defaultContentTemplate", first: true, predicate: ["defaultContentTemplate"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div [ptInt]=\"this\" [ptClass]=\"'content'\">\r\n <ngn-defer [lazyContent]=\"contentTemplate()\" [open]=\"isShown()\" [cache]=\"false\"></ngn-defer>\r\n</div>\r\n\r\n<ng-template #defaultContentTemplate>\r\n <span [ptInt]=\"this\" [ptClass]=\"'text'\">{{ text() }}</span>\r\n</ng-template>\r\n", dependencies: [{ kind: "directive", type: NgnPt, selector: "[ptInt]", inputs: ["ptInt", "ptClass"] }, { kind: "component", type: NgnDefer, selector: "ngn-defer", inputs: ["lazyContent", "lazyContentContext", "open", "lazy", "cache", "hiddenOnClosed"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
414
449
  }
415
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.2", ngImport: i0, type: TooltipComponent, decorators: [{
450
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.10", ngImport: i0, type: TooltipComponent, decorators: [{
416
451
  type: Component,
417
452
  args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'ngn-tooltip', imports: [NgnPt, NgnDefer], providers: [provideSelf(TooltipComponent)], host: {
418
453
  '[class]': `positionClass()`,
@@ -428,6 +463,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.2", ngImpor
428
463
  '(mouseenter)': 'onMouseEnter()',
429
464
  '(mouseleave)': 'onMouseLeave()',
430
465
  '(click)': 'onClick($event)',
466
+ '[attr.aria-hidden]': `isShown() ? null : true`,
431
467
  }, template: "<div [ptInt]=\"this\" [ptClass]=\"'content'\">\r\n <ngn-defer [lazyContent]=\"contentTemplate()\" [open]=\"isShown()\" [cache]=\"false\"></ngn-defer>\r\n</div>\r\n\r\n<ng-template #defaultContentTemplate>\r\n <span [ptInt]=\"this\" [ptClass]=\"'text'\">{{ text() }}</span>\r\n</ng-template>\r\n" }]
432
468
  }], ctorParameters: () => [], propDecorators: { anchor: [{ type: i0.Input, args: [{ isSignal: true, alias: "anchor", required: true }] }], text: [{ type: i0.Input, args: [{ isSignal: true, alias: "text", required: false }] }], content: [{ type: i0.Input, args: [{ isSignal: true, alias: "content", required: false }] }], showOnlyIfTruncated: [{ type: i0.Input, args: [{ isSignal: true, alias: "showOnlyIfTruncated", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], _defaultContentTemplate: [{ type: i0.ViewChild, args: ['defaultContentTemplate', { isSignal: true }] }] } });
433
469
  function isElementTruncated(element) {
@@ -1 +1 @@
1
- {"version":3,"file":"ngneers-controls-tooltip.mjs","sources":["../../src/tooltip/relative-anchor-element-position.ts","../../src/tooltip/tooltip.ts","../../src/tooltip/tooltip.html","../../src/tooltip/ngneers-controls-tooltip.ts"],"sourcesContent":["import type { Middleware, Placement } from '@floating-ui/dom';\r\n\r\nexport type RelativeAnchorElementPositionData = {\r\n start: number;\r\n center: number;\r\n end: number;\r\n};\r\n\r\nexport const relativeAnchorElementPosition: Middleware = {\r\n name: 'relativeAnchorElementPosition',\r\n async fn(state) {\r\n const { placement, rects } = state;\r\n\r\n const axis = getAxis(placement);\r\n const axisSize = axis === 'x' ? 'width' : 'height';\r\n\r\n return {\r\n data: {\r\n start: rects.reference[axis] - state[axis],\r\n center: rects.reference[axis] + rects.reference[axisSize] / 2 - state[axis],\r\n end: rects.reference[axis] + rects.reference[axisSize] - state[axis],\r\n } satisfies RelativeAnchorElementPositionData,\r\n };\r\n },\r\n};\r\n\r\nfunction getAxis(placement: Placement): 'x' | 'y' {\r\n switch (placement.split('-')[0]) {\r\n case 'top':\r\n case 'bottom':\r\n return 'x';\r\n case 'left':\r\n case 'right':\r\n return 'y';\r\n default:\r\n throw new Error(`Unknown placement: ${placement}`);\r\n }\r\n}\r\n","import {\r\n Component,\r\n ComponentRef,\r\n computed,\r\n Directive,\r\n DOCUMENT,\r\n effect,\r\n inject,\r\n input,\r\n type OnDestroy,\r\n signal,\r\n TemplateRef,\r\n viewChild,\r\n ViewContainerRef,\r\n ChangeDetectionStrategy,\r\n} from '@angular/core';\r\nimport {\r\n abortSignalOnDestroy,\r\n autoPositionElement,\r\n type AutoPositioningHandle,\r\n NGN_CONFIG,\r\n type PositioningSizeConstraints,\r\n splitPlacement,\r\n type TooltipOptions,\r\n} from '@ngneers/controls/api/ng';\r\nimport { NgnBase, provideSelf, NgnPt } from '@ngneers/controls/base';\r\nimport { NgnDefer } from '@ngneers/controls/defer';\r\nimport { getTimeSpanMilliseconds, notNullish, type TimeSpan } from '@ngneers/controls/utils';\r\nimport { computedWithPrevious, generateElementId } from '@ngneers/controls/utils-ng';\r\nimport { tooltipControlTemplate } from '@ngneers/controls-themes/templates/tooltip';\r\n\r\nimport {\r\n relativeAnchorElementPosition,\r\n type RelativeAnchorElementPositionData,\r\n} from './relative-anchor-element-position';\r\n\r\nimport type { Placement } from '@floating-ui/dom';\r\n\r\n/**\r\n * @category control\r\n */\r\n@Directive({\r\n selector: '[ngnTooltip]',\r\n exportAs: 'ngnTooltip',\r\n providers: [provideSelf(NgnTooltip)],\r\n})\r\nexport class NgnTooltip extends NgnBase<'tooltip'> implements OnDestroy {\r\n protected readonly theme = null;\r\n private readonly _viewContainerRef = inject(ViewContainerRef);\r\n private readonly _config = inject(NGN_CONFIG);\r\n private readonly _tooltip = signal<ComponentRef<TooltipComponent> | null>(null);\r\n\r\n /**\r\n * The content of the tooltip, can be a string or a TemplateRef.\r\n * If the value is falsy, the tooltip will not be shown.\r\n * @alias ngnTooltip\r\n */\r\n public readonly content = input<TemplateRef<unknown> | string | null | undefined>(null, {\r\n alias: 'ngnTooltip',\r\n });\r\n /**\r\n * If set to `true`, the tooltip will only be shown if the anchor element is truncated. `\"\"` is equivalent to `true`.\r\n * @alias ngnTooltipShowOnlyIfTruncated\r\n * @default false\r\n */\r\n public readonly showOnlyIfTruncated = input<boolean | ''>(false, {\r\n alias: 'ngnTooltipShowOnlyIfTruncated',\r\n });\r\n /**\r\n * The size constraints for the tooltip.\r\n * This can be used to limit the width and height of the tooltip.\r\n * If not provided, the tooltip is only constrained by the size of the screen.\r\n * @alias ngnTooltipSize\r\n */\r\n public readonly size = input<PositioningSizeConstraints | null | undefined>(null, {\r\n alias: 'ngnTooltipSize',\r\n });\r\n\r\n /**\r\n * The options for the tooltip.\r\n * This is a shorthand for setting multiple options at once.\r\n * The individual options take precedence over the options set here.\r\n * @alias ngnTooltipOptions\r\n */\r\n public readonly options = input<Partial<TooltipOptions> | null | undefined>(null, {\r\n alias: 'ngnTooltipOptions',\r\n });\r\n /**\r\n * The placement of the tooltip relative to the anchor element.\r\n * @alias ngnTooltipPlacement\r\n * @default 'bottom'\r\n */\r\n public readonly placement = input<Placement | null | undefined>(null, {\r\n alias: 'ngnTooltipPlacement',\r\n });\r\n /**\r\n * The offset in Pixels of the tooltip from the anchor element.\r\n * @alias ngnTooltipOffset\r\n * @default 4\r\n */\r\n public readonly offset = input<number | null | undefined>(null, {\r\n alias: 'ngnTooltipOffset',\r\n });\r\n /**\r\n * The delay before the tooltip is shown. If a number is provided, it is interpreted as milliseconds.\r\n * @alias ngnTooltipShowDelay\r\n * @default '0.5s'\r\n */\r\n public readonly showDelay = input<TimeSpan | null | undefined>(null, {\r\n alias: 'ngnTooltipShowDelay',\r\n });\r\n /**\r\n * The delay before the tooltip is hidden. If a number is provided, it is interpreted as milliseconds.\r\n * @alias ngnTooltipHideDelay\r\n * @default '0.1s'\r\n */\r\n public readonly hideDelay = input<TimeSpan | null | undefined>(null, {\r\n alias: 'ngnTooltipHideDelay',\r\n });\r\n /**\r\n * Whether to show an arrow pointing to the anchor element. `\"\"` is equivalent to `true`.\r\n * @alias ngnTooltipShowArrow\r\n * @default true\r\n */\r\n public readonly showArrow = input<boolean | '' | null | undefined>(null, {\r\n alias: 'ngnTooltipShowArrow',\r\n });\r\n /**\r\n * Shows the tooltip on hover.\r\n * @alias ngnTooltipShowOnHover\r\n * @default true\r\n */\r\n public readonly showOnHover = input<boolean | '' | null | undefined>(null, {\r\n alias: 'ngnTooltipShowOnHover',\r\n });\r\n /**\r\n * Shows the tooltip on focus.\r\n * @alias ngnTooltipShowOnFocus\r\n * @default true\r\n */\r\n public readonly showOnFocus = input<boolean | '' | null | undefined>(null, {\r\n alias: 'ngnTooltipShowOnFocus',\r\n });\r\n /**\r\n * Hides the tooltip (without delay) when the mouse hovers over the tooltip.\r\n * @alias ngnTooltipHideOnTooltipHover\r\n * @default false\r\n */\r\n public readonly hideOnTooltipHover = input<boolean | '' | null | undefined>(null, {\r\n alias: 'ngnTooltipHideOnTooltipHover',\r\n });\r\n /**\r\n * Hides the tooltip (without delay) when the user clicks on the tooltip.\r\n * @alias ngnTooltipHideOnClick\r\n * @default true\r\n */\r\n public readonly hideOnClick = input<boolean | '' | null | undefined>(null, {\r\n alias: 'ngnTooltipHideOnClick',\r\n });\r\n\r\n public readonly effectiveOptions = computed<TooltipOptions>(() => {\r\n const defaults = this._config.defaults.tooltip;\r\n return {\r\n placement: this.placement() ?? this.options()?.placement ?? defaults.placement,\r\n offset: this.offset() ?? this.options()?.offset ?? defaults.offset,\r\n showDelay: this.showDelay() ?? this.options()?.showDelay ?? defaults.showDelay,\r\n hideDelay: this.hideDelay() ?? this.options()?.hideDelay ?? defaults.hideDelay,\r\n showArrow: (this.showArrow() ?? this.options()?.showArrow ?? defaults.showArrow) !== false,\r\n showOnHover:\r\n (this.showOnHover() ?? this.options()?.showOnHover ?? defaults.showOnHover) !== false,\r\n showOnFocus:\r\n (this.showOnFocus() ?? this.options()?.showOnFocus ?? defaults.showOnFocus) !== false,\r\n hideOnTooltipHover:\r\n (this.hideOnTooltipHover() ??\r\n this.options()?.hideOnTooltipHover ??\r\n defaults.hideOnTooltipHover) !== false,\r\n hideOnClick:\r\n (this.hideOnClick() ?? this.options()?.hideOnClick ?? defaults.hideOnClick) !== false,\r\n };\r\n });\r\n\r\n public readonly tooltip = computed(() => this._tooltip()?.instance);\r\n\r\n constructor() {\r\n super();\r\n\r\n const abortSignal = abortSignalOnDestroy();\r\n this.element.nativeElement.addEventListener('mouseenter', this.onMouseEnter.bind(this), {\r\n signal: abortSignal,\r\n });\r\n this.element.nativeElement.addEventListener('mouseleave', this.onMouseLeave.bind(this), {\r\n signal: abortSignal,\r\n });\r\n this.element.nativeElement.addEventListener('focus', this.onFocus.bind(this), {\r\n signal: abortSignal,\r\n });\r\n this.element.nativeElement.addEventListener('blur', this.onBlur.bind(this), {\r\n signal: abortSignal,\r\n });\r\n\r\n effect(() => {\r\n const tooltip = this._tooltip();\r\n if (tooltip) this.updateContent(tooltip);\r\n });\r\n effect(() => this._tooltip()?.setInput('showOnlyIfTruncated', this.showOnlyIfTruncated()));\r\n effect(() => this._tooltip()?.setInput('size', this.size()));\r\n effect(() => this._tooltip()?.setInput('options', this.effectiveOptions()));\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n this._tooltip()?.destroy();\r\n this._tooltip.set(null);\r\n }\r\n\r\n public show(): void {\r\n const tooltip = this._tooltip();\r\n if (tooltip) {\r\n tooltip.instance.show();\r\n } else {\r\n const tooltip = this.getTooltip();\r\n if (tooltip) {\r\n requestAnimationFrame(() => tooltip.show());\r\n }\r\n }\r\n }\r\n\r\n public hide(): void {\r\n this._tooltip()?.instance.hide();\r\n }\r\n\r\n protected onMouseEnter() {\r\n if (this.effectiveOptions().showOnHover) {\r\n this.show();\r\n }\r\n }\r\n\r\n protected onMouseLeave() {\r\n if (this.effectiveOptions().showOnHover) {\r\n this.hide();\r\n }\r\n }\r\n\r\n protected onFocus() {\r\n if (this.effectiveOptions().showOnFocus) {\r\n this.show();\r\n }\r\n }\r\n\r\n protected onBlur() {\r\n if (this.effectiveOptions().showOnFocus) {\r\n this.hide();\r\n }\r\n }\r\n\r\n private getTooltip(): TooltipComponent | undefined {\r\n let tooltip = this._tooltip();\r\n if (!tooltip && this.content()) {\r\n tooltip = this._viewContainerRef.createComponent(TooltipComponent);\r\n tooltip.setInput('anchor', this.element.nativeElement);\r\n this.updateContent(tooltip);\r\n tooltip.setInput('showOnlyIfTruncated', this.showOnlyIfTruncated());\r\n tooltip.setInput('size', this.size());\r\n tooltip.setInput('options', this.effectiveOptions());\r\n this._tooltip.set(tooltip);\r\n }\r\n return tooltip?.instance;\r\n }\r\n\r\n private updateContent(tooltip: ComponentRef<TooltipComponent>) {\r\n const content = this.content();\r\n if (content instanceof TemplateRef) {\r\n tooltip.setInput('text', null);\r\n tooltip.setInput('content', content);\r\n } else {\r\n tooltip.setInput('text', content);\r\n tooltip.setInput('content', null);\r\n }\r\n }\r\n}\r\n\r\n@Component({\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n selector: 'ngn-tooltip',\r\n templateUrl: './tooltip.html',\r\n imports: [NgnPt, NgnDefer],\r\n providers: [provideSelf(TooltipComponent)],\r\n host: {\r\n '[class]': `positionClass()`,\r\n '[style.--anchor-start]': `toPixels(relativeAnchorElementPosition()?.start)`,\r\n '[style.--anchor-center]': `toPixels(relativeAnchorElementPosition()?.center)`,\r\n '[style.--anchor-end]': `toPixels(relativeAnchorElementPosition()?.end)`,\r\n '[style.left]': `toPixels(position().x)`,\r\n '[style.top]': `toPixels(position().y)`,\r\n '[attr.popover]': `'hint'`,\r\n '[attr.id]': `id`,\r\n '[attr.role]': `'tooltip'`,\r\n '(toggle)': 'onToggle($event)',\r\n '(mouseenter)': 'onMouseEnter()',\r\n '(mouseleave)': 'onMouseLeave()',\r\n '(click)': 'onClick($event)',\r\n },\r\n})\r\nexport class TooltipComponent extends NgnBase<'tooltip'> {\r\n private _showHideTimeout?: ReturnType<typeof setTimeout>;\r\n protected readonly theme = this.injectThemeTemplate(tooltipControlTemplate, {\r\n root: true,\r\n closing: () => this.isClosing(),\r\n 'with-arrow': () => this.options().showArrow !== false,\r\n });\r\n private readonly _config = inject(NGN_CONFIG);\r\n\r\n /**\r\n * The anchor element to which the tooltip is attached.\r\n */\r\n public readonly anchor = input.required<HTMLElement>();\r\n /**\r\n * The text content of the tooltip.\r\n */\r\n public readonly text = input<string | null>();\r\n /**\r\n * The content template of the tooltip.\r\n */\r\n public readonly content = input<TemplateRef<unknown>>();\r\n /**\r\n * If set to `true`, the tooltip will only be shown if the anchor element is truncated. `\"\"` is equivalent to `true`.\r\n * @default `false`\r\n */\r\n public readonly showOnlyIfTruncated = input<boolean | ''>(false);\r\n /**\r\n * The size constraints for the tooltip.\r\n * This can be used to limit the width and height of the tooltip.\r\n * If not provided, the tooltip is only constrained by the size of the screen.\r\n */\r\n public readonly size = input<PositioningSizeConstraints | null>();\r\n /**\r\n * The options for the tooltip.\r\n *\r\n */\r\n public readonly options = input<TooltipOptions>(this._config.defaults.tooltip);\r\n\r\n protected readonly showDelayMs = computed(() =>\r\n getTimeSpanMilliseconds(this.options().showDelay)\r\n );\r\n protected readonly hideDelayMs = computed(() =>\r\n getTimeSpanMilliseconds(this.options().hideDelay)\r\n );\r\n\r\n protected readonly position = signal<{ x: number; y: number }>({ x: 0, y: 0 });\r\n protected readonly positionClass = signal<string>('');\r\n protected readonly relativeAnchorElementPosition = signal<\r\n RelativeAnchorElementPositionData | undefined\r\n >(undefined);\r\n\r\n private readonly _isShown = signal(false);\r\n private readonly _isClosing = signal(false);\r\n\r\n public readonly id = generateElementId();\r\n public readonly isShown = this._isShown.asReadonly();\r\n public readonly isClosing = this._isClosing.asReadonly();\r\n\r\n private readonly _defaultContentTemplate =\r\n viewChild.required<TemplateRef<unknown>>('defaultContentTemplate');\r\n protected readonly contentTemplate = computed(\r\n () => this.content() ?? this._defaultContentTemplate()\r\n );\r\n\r\n private readonly _autoPos = computedWithPrevious<AutoPositioningHandle | undefined>(prev => {\r\n prev?.stop();\r\n const element = this.element.nativeElement;\r\n if (!element) {\r\n return undefined;\r\n }\r\n return autoPositionElement(this.anchor(), element, {\r\n injector: this.injector,\r\n stopped: true,\r\n resize: false,\r\n sizeConstraints: this.size() ?? undefined,\r\n placement: this.options().placement,\r\n offset: this.options().offset,\r\n middleware: [relativeAnchorElementPosition],\r\n disableSettingStyles: true,\r\n strategy: 'fixed',\r\n onPositionChange: ({ x, y, placement, middlewareData }) => {\r\n this.relativeAnchorElementPosition.set(middlewareData[relativeAnchorElementPosition.name]);\r\n this.position.set({ x, y });\r\n this.positionClass.set(\r\n splitPlacement(placement)\r\n .filter(notNullish)\r\n .map(x => this.theme.class(x))\r\n .join(' ')\r\n );\r\n },\r\n });\r\n });\r\n\r\n constructor() {\r\n super();\r\n const document = inject(DOCUMENT);\r\n const destroyAbortSignal = abortSignalOnDestroy();\r\n effect(() => {\r\n if (this.isShown() && !this.isClosing()) {\r\n document.addEventListener('keydown', this.onDocumentKeyDown.bind(this), {\r\n signal: destroyAbortSignal,\r\n });\r\n } else {\r\n document.removeEventListener('keydown', this.onDocumentKeyDown.bind(this));\r\n }\r\n });\r\n effect(() => {\r\n if (this.isShown()) {\r\n this._autoPos()?.start();\r\n } else {\r\n this._autoPos()?.stop();\r\n }\r\n });\r\n }\r\n\r\n public show(skipDelay = false) {\r\n clearTimeout(this._showHideTimeout);\r\n\r\n const delay = skipDelay ? 0 : this.showDelayMs();\r\n if (delay <= 0) {\r\n this.onShow();\r\n } else {\r\n this._showHideTimeout = setTimeout(() => this.onShow(), delay);\r\n }\r\n }\r\n\r\n public hide(skipDelay = false) {\r\n clearTimeout(this._showHideTimeout);\r\n\r\n const delay = skipDelay ? 0 : this.hideDelayMs();\r\n if (delay <= 0) {\r\n this.onHide();\r\n } else {\r\n this._showHideTimeout = setTimeout(() => this.onHide(), delay);\r\n }\r\n }\r\n\r\n protected onMouseEnter() {\r\n if (this.options().hideOnTooltipHover) {\r\n this.hide(true);\r\n } else {\r\n this.show(true);\r\n }\r\n }\r\n\r\n protected onMouseLeave() {\r\n this.hide();\r\n }\r\n\r\n protected onClick(event: PointerEvent) {\r\n if (this.options().hideOnClick) {\r\n this.hide(true);\r\n }\r\n event.stopPropagation();\r\n }\r\n\r\n protected onDocumentKeyDown(event: KeyboardEvent) {\r\n if (event.key === 'Escape' || event.key === 'Esc') {\r\n this.hide(true);\r\n event.preventDefault();\r\n }\r\n }\r\n\r\n protected onShow() {\r\n if (!this.content() && !this.text()) {\r\n return;\r\n }\r\n if (this.showOnlyIfTruncated() !== false && !isElementTruncated(this.anchor())) {\r\n return;\r\n }\r\n\r\n this._isShown.set(true);\r\n this.element.nativeElement.showPopover();\r\n }\r\n\r\n protected onHide() {\r\n this._isClosing.set(true);\r\n requestAnimationFrame(() => {\r\n Promise.all(this.element.nativeElement.getAnimations().map(a => a.finished))\r\n .then(() => this.element.nativeElement.hidePopover())\r\n .catch(() => {})\r\n .finally(() => this._isClosing.set(false));\r\n });\r\n }\r\n\r\n protected onToggle(event: Event) {\r\n const evt = event as ToggleEvent;\r\n if (evt.newState === 'closed') {\r\n this._isShown.set(false);\r\n } else {\r\n this._isShown.set(true);\r\n }\r\n }\r\n\r\n protected toPixels(value: number | undefined): string | undefined {\r\n return value !== undefined ? `${value}px` : undefined;\r\n }\r\n}\r\n\r\nfunction isElementTruncated(element: HTMLElement): boolean {\r\n return (\r\n element.clientWidth < element.scrollWidth || // horizontal overflow\r\n element.clientHeight < element.scrollHeight || // vertical overflow\r\n element.offsetWidth < element.scrollWidth || // single-line ellipsis\r\n element.offsetHeight < element.scrollHeight // multi-line ellipsis (line-clamp)\r\n );\r\n}\r\n","<div [ptInt]=\"this\" [ptClass]=\"'content'\">\r\n <ngn-defer [lazyContent]=\"contentTemplate()\" [open]=\"isShown()\" [cache]=\"false\"></ngn-defer>\r\n</div>\r\n\r\n<ng-template #defaultContentTemplate>\r\n <span [ptInt]=\"this\" [ptClass]=\"'text'\">{{ text() }}</span>\r\n</ng-template>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ngneers-controls-tooltip.mjs","sources":["../../src/tooltip/relative-anchor-element-position.ts","../../src/tooltip/tooltip.ts","../../src/tooltip/tooltip.html","../../src/tooltip/ngneers-controls-tooltip.ts"],"sourcesContent":["import type { Middleware, Placement } from '@floating-ui/dom';\r\n\r\nexport type RelativeAnchorElementPositionData = {\r\n start: number;\r\n center: number;\r\n end: number;\r\n};\r\n\r\nexport const relativeAnchorElementPosition: Middleware = {\r\n name: 'relativeAnchorElementPosition',\r\n async fn(state) {\r\n const { placement, rects } = state;\r\n\r\n const axis = getAxis(placement);\r\n const axisSize = axis === 'x' ? 'width' : 'height';\r\n\r\n return {\r\n data: {\r\n start: rects.reference[axis] - state[axis],\r\n center: rects.reference[axis] + rects.reference[axisSize] / 2 - state[axis],\r\n end: rects.reference[axis] + rects.reference[axisSize] - state[axis],\r\n } satisfies RelativeAnchorElementPositionData,\r\n };\r\n },\r\n};\r\n\r\nfunction getAxis(placement: Placement): 'x' | 'y' {\r\n switch (placement.split('-')[0]) {\r\n case 'top':\r\n case 'bottom':\r\n return 'x';\r\n case 'left':\r\n case 'right':\r\n return 'y';\r\n default:\r\n throw new Error(`Unknown placement: ${placement}`);\r\n }\r\n}\r\n","import {\r\n Component,\r\n ComponentRef,\r\n computed,\r\n Directive,\r\n DOCUMENT,\r\n effect,\r\n inject,\r\n input,\r\n type OnDestroy,\r\n signal,\r\n TemplateRef,\r\n viewChild,\r\n ViewContainerRef,\r\n ChangeDetectionStrategy,\r\n afterRenderEffect,\r\n} from '@angular/core';\r\nimport {\r\n abortSignalOnDestroy,\r\n autoPositionElement,\r\n type AutoPositioningHandle,\r\n NGN_CONFIG,\r\n type PositioningSizeConstraints,\r\n splitPlacement,\r\n type TooltipOptions,\r\n} from '@ngneers/controls/api/ng';\r\nimport { NgnBase, provideSelf, NgnPt } from '@ngneers/controls/base';\r\nimport { NgnDefer } from '@ngneers/controls/defer';\r\nimport { getTimeSpanMilliseconds, notNullish, type TimeSpan } from '@ngneers/controls/utils';\r\nimport { computedWithPrevious, generateElementId } from '@ngneers/controls/utils-ng';\r\nimport { tooltipControlTemplate } from '@ngneers/controls-themes/templates/tooltip';\r\n\r\nimport {\r\n relativeAnchorElementPosition,\r\n type RelativeAnchorElementPositionData,\r\n} from './relative-anchor-element-position';\r\n\r\nimport type { Placement } from '@floating-ui/dom';\r\n\r\n/**\r\n * @category control\r\n */\r\n@Directive({\r\n selector: '[ngnTooltip]',\r\n exportAs: 'ngnTooltip',\r\n providers: [provideSelf(NgnTooltip)],\r\n})\r\nexport class NgnTooltip extends NgnBase<'tooltip'> implements OnDestroy {\r\n protected readonly theme = null;\r\n private readonly _viewContainerRef = inject(ViewContainerRef);\r\n private readonly _config = inject(NGN_CONFIG);\r\n private readonly _tooltip = signal<ComponentRef<TooltipComponent> | null>(null);\r\n\r\n /**\r\n * The content of the tooltip, can be a string or a TemplateRef.\r\n * If the value is falsy, the tooltip will not be shown.\r\n * @alias ngnTooltip\r\n */\r\n public readonly content = input<TemplateRef<unknown> | string | null | undefined>(null, {\r\n alias: 'ngnTooltip',\r\n });\r\n /**\r\n * If set to `true`, the tooltip will only be shown if the anchor element is truncated. `\"\"` is equivalent to `true`.\r\n * @alias ngnTooltipShowOnlyIfTruncated\r\n * @default false\r\n */\r\n public readonly showOnlyIfTruncated = input<boolean | ''>(false, {\r\n alias: 'ngnTooltipShowOnlyIfTruncated',\r\n });\r\n /**\r\n * The size constraints for the tooltip.\r\n * This can be used to limit the width and height of the tooltip.\r\n * If not provided, the tooltip is only constrained by the size of the screen.\r\n * @alias ngnTooltipSize\r\n */\r\n public readonly size = input<PositioningSizeConstraints | null | undefined>(null, {\r\n alias: 'ngnTooltipSize',\r\n });\r\n\r\n /**\r\n * The options for the tooltip.\r\n * This is a shorthand for setting multiple options at once.\r\n * The individual options take precedence over the options set here.\r\n * @alias ngnTooltipOptions\r\n */\r\n public readonly options = input<Partial<TooltipOptions> | null | undefined>(null, {\r\n alias: 'ngnTooltipOptions',\r\n });\r\n /**\r\n * The placement of the tooltip relative to the anchor element.\r\n * @alias ngnTooltipPlacement\r\n * @default 'bottom'\r\n */\r\n public readonly placement = input<Placement | null | undefined>(null, {\r\n alias: 'ngnTooltipPlacement',\r\n });\r\n /**\r\n * The offset in Pixels of the tooltip from the anchor element.\r\n * @alias ngnTooltipOffset\r\n * @default 4\r\n */\r\n public readonly offset = input<number | null | undefined>(null, {\r\n alias: 'ngnTooltipOffset',\r\n });\r\n /**\r\n * The delay before the tooltip is shown. If a number is provided, it is interpreted as milliseconds.\r\n * @alias ngnTooltipShowDelay\r\n * @default '0.5s'\r\n */\r\n public readonly showDelay = input<TimeSpan | null | undefined>(null, {\r\n alias: 'ngnTooltipShowDelay',\r\n });\r\n /**\r\n * The delay before the tooltip is hidden. If a number is provided, it is interpreted as milliseconds.\r\n * @alias ngnTooltipHideDelay\r\n * @default '0.1s'\r\n */\r\n public readonly hideDelay = input<TimeSpan | null | undefined>(null, {\r\n alias: 'ngnTooltipHideDelay',\r\n });\r\n /**\r\n * Whether to show an arrow pointing to the anchor element. `\"\"` is equivalent to `true`.\r\n * @alias ngnTooltipShowArrow\r\n * @default true\r\n */\r\n public readonly showArrow = input<boolean | '' | null | undefined>(null, {\r\n alias: 'ngnTooltipShowArrow',\r\n });\r\n /**\r\n * Shows the tooltip on hover.\r\n * @alias ngnTooltipShowOnHover\r\n * @default true\r\n */\r\n public readonly showOnHover = input<boolean | '' | null | undefined>(null, {\r\n alias: 'ngnTooltipShowOnHover',\r\n });\r\n /**\r\n * Shows the tooltip on focus.\r\n * @alias ngnTooltipShowOnFocus\r\n * @default true\r\n */\r\n public readonly showOnFocus = input<boolean | '' | null | undefined>(null, {\r\n alias: 'ngnTooltipShowOnFocus',\r\n });\r\n /**\r\n * Hides the tooltip (without delay) when the mouse hovers over the tooltip.\r\n * @alias ngnTooltipHideOnTooltipHover\r\n * @default false\r\n */\r\n public readonly hideOnTooltipHover = input<boolean | '' | null | undefined>(null, {\r\n alias: 'ngnTooltipHideOnTooltipHover',\r\n });\r\n /**\r\n * Hides the tooltip (without delay) when the user clicks on the tooltip.\r\n * @alias ngnTooltipHideOnClick\r\n * @default true\r\n */\r\n public readonly hideOnClick = input<boolean | '' | null | undefined>(null, {\r\n alias: 'ngnTooltipHideOnClick',\r\n });\r\n /**\r\n * Whether to automatically manage ARIA attributes for the tooltip.\r\n * @alias ngnTooltipAutoAriaMode\r\n * @default 'description'\r\n */\r\n public readonly autoAriaMode = input<'label' | 'description' | 'none' | null | undefined>(null, {\r\n alias: 'ngnTooltipAutoAriaMode',\r\n });\r\n\r\n public readonly effectiveOptions = computed<TooltipOptions>(() => {\r\n const defaults = this._config.defaults.tooltip;\r\n return {\r\n placement: this.placement() ?? this.options()?.placement ?? defaults.placement,\r\n offset: this.offset() ?? this.options()?.offset ?? defaults.offset,\r\n showDelay: this.showDelay() ?? this.options()?.showDelay ?? defaults.showDelay,\r\n hideDelay: this.hideDelay() ?? this.options()?.hideDelay ?? defaults.hideDelay,\r\n showArrow: (this.showArrow() ?? this.options()?.showArrow ?? defaults.showArrow) !== false,\r\n showOnHover:\r\n (this.showOnHover() ?? this.options()?.showOnHover ?? defaults.showOnHover) !== false,\r\n showOnFocus:\r\n (this.showOnFocus() ?? this.options()?.showOnFocus ?? defaults.showOnFocus) !== false,\r\n hideOnTooltipHover:\r\n (this.hideOnTooltipHover() ??\r\n this.options()?.hideOnTooltipHover ??\r\n defaults.hideOnTooltipHover) !== false,\r\n hideOnClick:\r\n (this.hideOnClick() ?? this.options()?.hideOnClick ?? defaults.hideOnClick) !== false,\r\n autoAriaMode: this.autoAriaMode() ?? this.options()?.autoAriaMode ?? defaults.autoAriaMode,\r\n };\r\n });\r\n\r\n public readonly tooltip = computed(() => this._tooltip()?.instance);\r\n\r\n constructor() {\r\n super();\r\n\r\n const abortSignal = abortSignalOnDestroy();\r\n this.element.nativeElement.addEventListener('mouseenter', this.onMouseEnter.bind(this), {\r\n signal: abortSignal,\r\n });\r\n this.element.nativeElement.addEventListener('mouseleave', this.onMouseLeave.bind(this), {\r\n signal: abortSignal,\r\n });\r\n this.element.nativeElement.addEventListener('focus', this.onFocus.bind(this), {\r\n signal: abortSignal,\r\n });\r\n this.element.nativeElement.addEventListener('blur', this.onBlur.bind(this), {\r\n signal: abortSignal,\r\n });\r\n\r\n effect(() => {\r\n const tooltip = this._tooltip();\r\n if (tooltip) this.updateContent(tooltip);\r\n });\r\n effect(() => this._tooltip()?.setInput('showOnlyIfTruncated', this.showOnlyIfTruncated()));\r\n effect(() => this._tooltip()?.setInput('size', this.size()));\r\n effect(() => this._tooltip()?.setInput('options', this.effectiveOptions()));\r\n\r\n afterRenderEffect(() => {\r\n const el = this.element.nativeElement;\r\n const content = this.content();\r\n const autoAriaMode = this.effectiveOptions().autoAriaMode;\r\n\r\n el.removeAttribute('aria-label');\r\n el.removeAttribute('aria-description');\r\n el.removeAttribute('aria-labelledby');\r\n el.removeAttribute('aria-describedby');\r\n\r\n if (autoAriaMode === 'none' || !content) {\r\n return;\r\n }\r\n\r\n const tooltip = this.tooltip();\r\n const isShown = tooltip?.isShown() ?? false;\r\n\r\n if (typeof content === 'string') {\r\n if (isShown && tooltip) {\r\n const attr = autoAriaMode === 'label' ? 'aria-labelledby' : 'aria-describedby';\r\n el.setAttribute(attr, tooltip.id);\r\n } else {\r\n const attr = autoAriaMode === 'label' ? 'aria-label' : 'aria-description';\r\n el.setAttribute(attr, content);\r\n }\r\n } else if (content instanceof TemplateRef && isShown && tooltip) {\r\n const attr = autoAriaMode === 'label' ? 'aria-labelledby' : 'aria-describedby';\r\n el.setAttribute(attr, tooltip.id);\r\n }\r\n });\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n this._tooltip()?.destroy();\r\n this._tooltip.set(null);\r\n }\r\n\r\n public show(): void {\r\n const tooltip = this._tooltip();\r\n if (tooltip) {\r\n tooltip.instance.show();\r\n } else {\r\n const tooltip = this.getTooltip();\r\n if (tooltip) {\r\n requestAnimationFrame(() => tooltip.show());\r\n }\r\n }\r\n }\r\n\r\n public hide(): void {\r\n this._tooltip()?.instance.hide();\r\n }\r\n\r\n protected onMouseEnter() {\r\n if (this.effectiveOptions().showOnHover) {\r\n this.show();\r\n }\r\n }\r\n\r\n protected onMouseLeave() {\r\n if (this.effectiveOptions().showOnHover) {\r\n this.hide();\r\n }\r\n }\r\n\r\n protected onFocus() {\r\n if (this.effectiveOptions().showOnFocus) {\r\n this.show();\r\n }\r\n }\r\n\r\n protected onBlur() {\r\n if (this.effectiveOptions().showOnFocus) {\r\n this.hide();\r\n }\r\n }\r\n\r\n private getTooltip(): TooltipComponent | undefined {\r\n let tooltip = this._tooltip();\r\n if (!tooltip && this.content()) {\r\n tooltip = this._viewContainerRef.createComponent(TooltipComponent);\r\n tooltip.setInput('anchor', this.element.nativeElement);\r\n this.updateContent(tooltip);\r\n tooltip.setInput('showOnlyIfTruncated', this.showOnlyIfTruncated());\r\n tooltip.setInput('size', this.size());\r\n tooltip.setInput('options', this.effectiveOptions());\r\n this._tooltip.set(tooltip);\r\n }\r\n return tooltip?.instance;\r\n }\r\n\r\n private updateContent(tooltip: ComponentRef<TooltipComponent>) {\r\n const content = this.content();\r\n if (content instanceof TemplateRef) {\r\n tooltip.setInput('text', null);\r\n tooltip.setInput('content', content);\r\n } else {\r\n tooltip.setInput('text', content);\r\n tooltip.setInput('content', null);\r\n }\r\n }\r\n}\r\n\r\n@Component({\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n selector: 'ngn-tooltip',\r\n templateUrl: './tooltip.html',\r\n imports: [NgnPt, NgnDefer],\r\n providers: [provideSelf(TooltipComponent)],\r\n host: {\r\n '[class]': `positionClass()`,\r\n '[style.--anchor-start]': `toPixels(relativeAnchorElementPosition()?.start)`,\r\n '[style.--anchor-center]': `toPixels(relativeAnchorElementPosition()?.center)`,\r\n '[style.--anchor-end]': `toPixels(relativeAnchorElementPosition()?.end)`,\r\n '[style.left]': `toPixels(position().x)`,\r\n '[style.top]': `toPixels(position().y)`,\r\n '[attr.popover]': `'hint'`,\r\n '[attr.id]': `id`,\r\n '[attr.role]': `'tooltip'`,\r\n '(toggle)': 'onToggle($event)',\r\n '(mouseenter)': 'onMouseEnter()',\r\n '(mouseleave)': 'onMouseLeave()',\r\n '(click)': 'onClick($event)',\r\n '[attr.aria-hidden]': `isShown() ? null : true`,\r\n },\r\n})\r\nexport class TooltipComponent extends NgnBase<'tooltip'> {\r\n private _showHideTimeout?: ReturnType<typeof setTimeout>;\r\n protected readonly theme = this.injectThemeTemplate(tooltipControlTemplate, {\r\n root: true,\r\n closing: () => this.isClosing(),\r\n 'with-arrow': () => this.options().showArrow !== false,\r\n });\r\n private readonly _config = inject(NGN_CONFIG);\r\n\r\n /**\r\n * The anchor element to which the tooltip is attached.\r\n */\r\n public readonly anchor = input.required<HTMLElement>();\r\n /**\r\n * The text content of the tooltip.\r\n */\r\n public readonly text = input<string | null>();\r\n /**\r\n * The content template of the tooltip.\r\n */\r\n public readonly content = input<TemplateRef<unknown>>();\r\n /**\r\n * If set to `true`, the tooltip will only be shown if the anchor element is truncated. `\"\"` is equivalent to `true`.\r\n * @default `false`\r\n */\r\n public readonly showOnlyIfTruncated = input<boolean | ''>(false);\r\n /**\r\n * The size constraints for the tooltip.\r\n * This can be used to limit the width and height of the tooltip.\r\n * If not provided, the tooltip is only constrained by the size of the screen.\r\n */\r\n public readonly size = input<PositioningSizeConstraints | null>();\r\n /**\r\n * The options for the tooltip.\r\n *\r\n */\r\n public readonly options = input<TooltipOptions>(this._config.defaults.tooltip);\r\n\r\n protected readonly showDelayMs = computed(() =>\r\n getTimeSpanMilliseconds(this.options().showDelay)\r\n );\r\n protected readonly hideDelayMs = computed(() =>\r\n getTimeSpanMilliseconds(this.options().hideDelay)\r\n );\r\n\r\n protected readonly position = signal<{ x: number; y: number }>({ x: 0, y: 0 });\r\n protected readonly positionClass = signal<string>('');\r\n protected readonly relativeAnchorElementPosition = signal<\r\n RelativeAnchorElementPositionData | undefined\r\n >(undefined);\r\n\r\n private readonly _isShown = signal(false);\r\n private readonly _isClosing = signal(false);\r\n\r\n public readonly id = generateElementId();\r\n public readonly isShown = this._isShown.asReadonly();\r\n public readonly isClosing = this._isClosing.asReadonly();\r\n\r\n private readonly _defaultContentTemplate =\r\n viewChild.required<TemplateRef<unknown>>('defaultContentTemplate');\r\n protected readonly contentTemplate = computed(\r\n () => this.content() ?? this._defaultContentTemplate()\r\n );\r\n\r\n private readonly _autoPos = computedWithPrevious<AutoPositioningHandle | undefined>(prev => {\r\n prev?.stop();\r\n const element = this.element.nativeElement;\r\n if (!element) {\r\n return undefined;\r\n }\r\n return autoPositionElement(this.anchor(), element, {\r\n injector: this.injector,\r\n stopped: true,\r\n resize: false,\r\n sizeConstraints: this.size() ?? undefined,\r\n placement: this.options().placement,\r\n offset: this.options().offset,\r\n middleware: [relativeAnchorElementPosition],\r\n disableSettingStyles: true,\r\n strategy: 'fixed',\r\n onPositionChange: ({ x, y, placement, middlewareData }) => {\r\n this.relativeAnchorElementPosition.set(middlewareData[relativeAnchorElementPosition.name]);\r\n this.position.set({ x, y });\r\n this.positionClass.set(\r\n splitPlacement(placement)\r\n .filter(notNullish)\r\n .map(x => this.theme.class(x))\r\n .join(' ')\r\n );\r\n },\r\n });\r\n });\r\n\r\n constructor() {\r\n super();\r\n const document = inject(DOCUMENT);\r\n const destroyAbortSignal = abortSignalOnDestroy();\r\n effect(() => {\r\n if (this.isShown() && !this.isClosing()) {\r\n document.addEventListener('keydown', this.onDocumentKeyDown.bind(this), {\r\n signal: destroyAbortSignal,\r\n });\r\n } else {\r\n document.removeEventListener('keydown', this.onDocumentKeyDown.bind(this));\r\n }\r\n });\r\n effect(() => {\r\n if (this.isShown()) {\r\n this._autoPos()?.start();\r\n } else {\r\n this._autoPos()?.stop();\r\n }\r\n });\r\n }\r\n\r\n public show(skipDelay = false) {\r\n clearTimeout(this._showHideTimeout);\r\n\r\n const delay = skipDelay ? 0 : this.showDelayMs();\r\n if (delay <= 0) {\r\n this.onShow();\r\n } else {\r\n this._showHideTimeout = setTimeout(() => this.onShow(), delay);\r\n }\r\n }\r\n\r\n public hide(skipDelay = false) {\r\n clearTimeout(this._showHideTimeout);\r\n\r\n const delay = skipDelay ? 0 : this.hideDelayMs();\r\n if (delay <= 0) {\r\n this.onHide();\r\n } else {\r\n this._showHideTimeout = setTimeout(() => this.onHide(), delay);\r\n }\r\n }\r\n\r\n protected onMouseEnter() {\r\n if (this.options().hideOnTooltipHover) {\r\n this.hide(true);\r\n } else {\r\n this.show(true);\r\n }\r\n }\r\n\r\n protected onMouseLeave() {\r\n this.hide();\r\n }\r\n\r\n protected onClick(event: PointerEvent) {\r\n if (this.options().hideOnClick) {\r\n this.hide(true);\r\n }\r\n event.stopPropagation();\r\n }\r\n\r\n protected onDocumentKeyDown(event: KeyboardEvent) {\r\n if (event.key === 'Escape' || event.key === 'Esc') {\r\n this.hide(true);\r\n event.preventDefault();\r\n }\r\n }\r\n\r\n protected onShow() {\r\n if (!this.content() && !this.text()) {\r\n return;\r\n }\r\n if (this.showOnlyIfTruncated() !== false && !isElementTruncated(this.anchor())) {\r\n return;\r\n }\r\n\r\n this._isShown.set(true);\r\n this.element.nativeElement.showPopover();\r\n }\r\n\r\n protected onHide() {\r\n this._isClosing.set(true);\r\n requestAnimationFrame(() => {\r\n Promise.all(this.element.nativeElement.getAnimations().map(a => a.finished))\r\n .then(() => this.element.nativeElement.hidePopover())\r\n .catch(() => {})\r\n .finally(() => this._isClosing.set(false));\r\n });\r\n }\r\n\r\n protected onToggle(event: Event) {\r\n const evt = event as ToggleEvent;\r\n if (evt.newState === 'closed') {\r\n this._isShown.set(false);\r\n } else {\r\n this._isShown.set(true);\r\n }\r\n }\r\n\r\n protected toPixels(value: number | undefined): string | undefined {\r\n return value !== undefined ? `${value}px` : undefined;\r\n }\r\n}\r\n\r\nfunction isElementTruncated(element: HTMLElement): boolean {\r\n return (\r\n element.clientWidth < element.scrollWidth || // horizontal overflow\r\n element.clientHeight < element.scrollHeight || // vertical overflow\r\n element.offsetWidth < element.scrollWidth || // single-line ellipsis\r\n element.offsetHeight < element.scrollHeight // multi-line ellipsis (line-clamp)\r\n );\r\n}\r\n","<div [ptInt]=\"this\" [ptClass]=\"'content'\">\r\n <ngn-defer [lazyContent]=\"contentTemplate()\" [open]=\"isShown()\" [cache]=\"false\"></ngn-defer>\r\n</div>\r\n\r\n<ng-template #defaultContentTemplate>\r\n <span [ptInt]=\"this\" [ptClass]=\"'text'\">{{ text() }}</span>\r\n</ng-template>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -145,10 +145,10 @@ class NgnGlobal {
145
145
  set fancyLogging(value) {
146
146
  this._window[globalPropertyName].fancyLogging = value;
147
147
  }
148
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.2", ngImport: i0, type: NgnGlobal, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
149
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.2", ngImport: i0, type: NgnGlobal });
148
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.10", ngImport: i0, type: NgnGlobal, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
149
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.10", ngImport: i0, type: NgnGlobal });
150
150
  }
151
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.2", ngImport: i0, type: NgnGlobal, decorators: [{
151
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.10", ngImport: i0, type: NgnGlobal, decorators: [{
152
152
  type: Injectable
153
153
  }], ctorParameters: () => [] });
154
154
 
@@ -1 +1 @@
1
- {"version":3,"file":"ngneers-controls-utils-ng.mjs","sources":["../../src/utils-ng/signals.ts","../../src/utils-ng/dom.ts","../../src/utils-ng/globals.ts","../../src/utils-ng/generate-id.ts","../../src/utils-ng/inject.ts","../../src/utils-ng/state.ts","../../src/utils-ng/ngneers-controls-utils-ng.ts"],"sourcesContent":["import {\r\n afterRenderEffect,\r\n computed,\r\n effect,\r\n type EffectRef,\r\n type InputSignal,\r\n type InputSignalWithTransform,\r\n signal,\r\n type Signal,\r\n untracked,\r\n} from '@angular/core';\r\nimport { SIGNAL } from '@angular/core/primitives/signals';\r\n\r\nexport function signalWithPrevious<T>(\r\n signal: Signal<T>,\r\n previous?: T\r\n): Signal<{ current: T; previous: T | undefined }> {\r\n let current = previous;\r\n\r\n return computed(() => {\r\n const prev = current;\r\n current = signal();\r\n return { current, previous: prev };\r\n });\r\n}\r\n\r\nexport function computedWithPrevious<T>(computeFn: (prev?: T) => T, previous?: T): Signal<T> {\r\n let current = previous;\r\n\r\n return computed<T>(() => {\r\n const prev = current;\r\n current = computeFn(prev);\r\n return current;\r\n });\r\n}\r\n\r\nexport function effectWithPrevious<T>(\r\n signal: Signal<T>,\r\n effectFn: (current: T, previous: T | undefined) => void\r\n): EffectRef {\r\n const sig = signalWithPrevious(signal);\r\n return effect(() => {\r\n const { current, previous } = sig();\r\n effectFn(current, previous);\r\n });\r\n}\r\nfunction explicitEffectBase<T extends readonly Signal<any>[]>(\r\n usedEffectFn: (fn: () => void) => EffectRef,\r\n signals: [...T],\r\n effectFn: (values: { [K in keyof T]: T[K] extends Signal<infer U> ? U : never }) => void\r\n): EffectRef {\r\n return usedEffectFn(() => {\r\n const values = signals.map(sig => sig()) as {\r\n [K in keyof T]: T[K] extends Signal<infer U> ? U : never;\r\n };\r\n untracked(() => {\r\n effectFn(values);\r\n });\r\n });\r\n}\r\n\r\nexport function explicitEffect<T extends readonly Signal<any>[]>(\r\n signals: [...T],\r\n effectFn: (values: { [K in keyof T]: T[K] extends Signal<infer U> ? U : never }) => void\r\n): EffectRef {\r\n return explicitEffectBase(effect, signals, effectFn);\r\n}\r\n\r\nexport function explicitAfterRenderEffect<T extends readonly Signal<any>[]>(\r\n signals: [...T],\r\n effectFn: (values: { [K in keyof T]: T[K] extends Signal<infer U> ? U : never }) => void\r\n): EffectRef {\r\n return explicitEffectBase(afterRenderEffect, signals, effectFn);\r\n}\r\n\r\nexport function asyncComputed<T>(\r\n computeFn: () => Promise<T>,\r\n initial: T\r\n): { (): T; isRunning: Signal<boolean>; firstRunCompleted: Signal<boolean> } {\r\n let latestId = 0;\r\n let latestCompletedId = 0;\r\n const isRunningSignal = signal(false);\r\n const firstRunCompleted = signal(false);\r\n const returnSignal = signal<T>(initial);\r\n\r\n effect(() => {\r\n const currentId = ++latestId;\r\n isRunningSignal.set(true);\r\n\r\n computeFn()\r\n .then(value => {\r\n // Only update the signal if this is the latest call\r\n if (currentId <= latestCompletedId) {\r\n console.debug('asyncComputed: ignoring stale value update');\r\n return;\r\n }\r\n latestCompletedId = currentId;\r\n returnSignal.set(value);\r\n firstRunCompleted.set(true);\r\n\r\n // Set isRunning to false if this is the latest operation\r\n if (currentId === latestId) {\r\n isRunningSignal.set(false);\r\n }\r\n })\r\n .catch(error => {\r\n // Also check if this is the latest operation on error\r\n if (currentId === latestId) {\r\n isRunningSignal.set(false);\r\n }\r\n console.error('Error in asyncComputed:', error);\r\n });\r\n });\r\n\r\n const returnFn = returnSignal as unknown as {\r\n (): T;\r\n isRunning: Signal<boolean>;\r\n firstRunCompleted: Signal<boolean>;\r\n };\r\n returnFn.isRunning = isRunningSignal.asReadonly();\r\n returnFn.firstRunCompleted = firstRunCompleted;\r\n return returnFn;\r\n}\r\n\r\nexport function setInputSignalValue<T>(\r\n input: InputSignal<T> | InputSignalWithTransform<T, unknown>,\r\n value: T\r\n): void {\r\n input[SIGNAL].applyValueToInputSignal(input[SIGNAL], value);\r\n}\r\n\r\nexport function afterRenderComputed<T>(computeFn: () => T, defaultValue: T): () => T {\r\n const value = signal(defaultValue);\r\n afterRenderEffect(() => {\r\n value.set(computeFn());\r\n });\r\n return value.asReadonly();\r\n}\r\n\r\nexport function debounceSignal<T>(input: Signal<T>, delayMs: (() => number) | number): Signal<T> {\r\n const delayFn = typeof delayMs === 'function' ? delayMs : () => delayMs;\r\n const debounced = signal(input());\r\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\r\n\r\n effect(onCleanup => {\r\n const value = input();\r\n const delay = delayFn();\r\n\r\n // Clear any pending timeout\r\n if (timeoutId !== undefined) {\r\n clearTimeout(timeoutId);\r\n }\r\n\r\n // Set new timeout\r\n timeoutId = setTimeout(() => {\r\n debounced.set(value);\r\n timeoutId = undefined;\r\n }, delay);\r\n\r\n // Cleanup function to clear timeout when effect is destroyed or re-run\r\n onCleanup(() => {\r\n if (timeoutId !== undefined) {\r\n clearTimeout(timeoutId);\r\n timeoutId = undefined;\r\n }\r\n });\r\n });\r\n\r\n return debounced.asReadonly();\r\n}\r\n","import { toggleClass } from '@ngneers/controls/utils';\r\n\r\nimport { effectWithPrevious } from './signals';\r\n\r\nimport type { Signal } from '@angular/core';\r\n\r\nexport function classSignal(element: HTMLElement, klass: Signal<string | string[]>) {\r\n effectWithPrevious(klass, (current, previous) => {\r\n if (previous) {\r\n toggleClass(element, previous, false);\r\n }\r\n if (current) {\r\n toggleClass(element, current, true);\r\n }\r\n });\r\n}\r\n","import { DOCUMENT, inject, Injectable } from '@angular/core';\nimport { globalPropertyName, type NgnGlobalType } from '@ngneers/controls/utils';\n\n@Injectable()\nexport class NgnGlobal implements NgnGlobalType {\n private readonly _window = inject(DOCUMENT).defaultView || window;\n constructor() {\n this._window[globalPropertyName] ??= {\n nextElementId: 1,\n fancyLogging: true,\n };\n }\n\n public get nextElementId(): number {\n return this._window[globalPropertyName].nextElementId;\n }\n public set nextElementId(value: number) {\n this._window[globalPropertyName].nextElementId = value;\n }\n\n public get fancyLogging(): boolean {\n return this._window[globalPropertyName].fancyLogging;\n }\n public set fancyLogging(value: boolean) {\n this._window[globalPropertyName].fancyLogging = value;\n }\n}\n","import { inject } from '@angular/core';\n\nimport { NgnGlobal } from './globals';\n\nconst idPrefix = 'ngn-id-';\n\nexport function generateElementId() {\n return idPrefix + inject(NgnGlobal).nextElementId++;\n}\n","import { inject, type ProviderToken } from '@angular/core';\r\nimport { throwExp } from '@ngneers/controls/utils';\r\n\r\nexport function injectOrThrow<T>(token: ProviderToken<T>, moduleName: string, errorMsg: string): T {\r\n return inject(token, { optional: true }) ?? throwExp(moduleName, errorMsg);\r\n}\r\n","import {\r\n Injector,\r\n DestroyRef,\r\n inject,\r\n DOCUMENT,\r\n signal,\r\n afterRenderEffect,\r\n untracked,\r\n effect,\r\n} from '@angular/core';\r\n\r\nexport type NgnStateStorage = 'local' | 'session';\r\n\r\nexport function loadState<T>(storage: NgnStateStorage, key: string) {\r\n const storageType = storage === 'local' ? localStorage : sessionStorage;\r\n const state = storageType.getItem(key);\r\n return state ? (JSON.parse(state) as T) : null;\r\n}\r\n\r\nexport function saveState<T>(storage: NgnStateStorage, key: string, state: T | null) {\r\n const storageType = storage === 'local' ? localStorage : sessionStorage;\r\n if (state === null) {\r\n storageType.removeItem(key);\r\n return;\r\n }\r\n storageType.setItem(key, JSON.stringify(state));\r\n}\r\n\r\nexport type RegisterStateOptions<T> = {\r\n storage: () => NgnStateStorage;\r\n key: () => string | null | undefined;\r\n valueFn: (previousState: T | null) => T | null;\r\n onLoad: (state: T | null) => T | null;\r\n debounce?: number;\r\n injector?: Injector;\r\n};\r\nexport function registerState<T>(options: RegisterStateOptions<T>) {\r\n const { storage, key, valueFn, onLoad, debounce } = options;\r\n const destroyRef = options?.injector?.get(DestroyRef) ?? inject(DestroyRef);\r\n const document = options?.injector?.get<Document>(DOCUMENT) ?? inject(DOCUMENT);\r\n\r\n const load = () => {\r\n const k = key();\r\n return k ? loadState<T>(storage(), k) : null;\r\n };\r\n\r\n const stateSignal = signal<T | null | undefined>(undefined);\r\n\r\n let timer: ReturnType<typeof setTimeout> | undefined = undefined;\r\n const save = () => {\r\n const k = key();\r\n const s = stateSignal();\r\n if (k && s !== undefined) saveState(storage(), k, s);\r\n };\r\n\r\n afterRenderEffect(() => {\r\n let state = load();\r\n if (onLoad) {\r\n state = untracked(() => onLoad(state));\r\n }\r\n stateSignal.set(state);\r\n }, options);\r\n afterRenderEffect(() => {\r\n stateSignal.set(valueFn(untracked(() => stateSignal() ?? null)));\r\n }, options);\r\n effect(() => {\r\n stateSignal();\r\n if (debounce === 0) {\r\n save();\r\n } else {\r\n clearTimeout(timer);\r\n timer = setTimeout(save, debounce);\r\n }\r\n }, options);\r\n\r\n // Ensure saving happens on destroy and unload\r\n document.defaultView?.addEventListener('beforeunload', save);\r\n destroyRef.onDestroy(() => {\r\n clearTimeout(timer);\r\n document.defaultView?.removeEventListener('beforeunload', save);\r\n save();\r\n });\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ngneers-controls-utils-ng.mjs","sources":["../../src/utils-ng/signals.ts","../../src/utils-ng/dom.ts","../../src/utils-ng/globals.ts","../../src/utils-ng/generate-id.ts","../../src/utils-ng/inject.ts","../../src/utils-ng/state.ts","../../src/utils-ng/ngneers-controls-utils-ng.ts"],"sourcesContent":["import {\r\n afterRenderEffect,\r\n computed,\r\n effect,\r\n type EffectRef,\r\n type InputSignal,\r\n type InputSignalWithTransform,\r\n signal,\r\n type Signal,\r\n untracked,\r\n} from '@angular/core';\r\nimport { SIGNAL } from '@angular/core/primitives/signals';\r\n\r\nexport function signalWithPrevious<T>(\r\n signal: Signal<T>,\r\n previous?: T\r\n): Signal<{ current: T; previous: T | undefined }> {\r\n let current = previous;\r\n\r\n return computed(() => {\r\n const prev = current;\r\n current = signal();\r\n return { current, previous: prev };\r\n });\r\n}\r\n\r\nexport function computedWithPrevious<T>(computeFn: (prev?: T) => T, previous?: T): Signal<T> {\r\n let current = previous;\r\n\r\n return computed<T>(() => {\r\n const prev = current;\r\n current = computeFn(prev);\r\n return current;\r\n });\r\n}\r\n\r\nexport function effectWithPrevious<T>(\r\n signal: Signal<T>,\r\n effectFn: (current: T, previous: T | undefined) => void\r\n): EffectRef {\r\n const sig = signalWithPrevious(signal);\r\n return effect(() => {\r\n const { current, previous } = sig();\r\n effectFn(current, previous);\r\n });\r\n}\r\nfunction explicitEffectBase<T extends readonly Signal<any>[]>(\r\n usedEffectFn: (fn: () => void) => EffectRef,\r\n signals: [...T],\r\n effectFn: (values: { [K in keyof T]: T[K] extends Signal<infer U> ? U : never }) => void\r\n): EffectRef {\r\n return usedEffectFn(() => {\r\n const values = signals.map(sig => sig()) as {\r\n [K in keyof T]: T[K] extends Signal<infer U> ? U : never;\r\n };\r\n untracked(() => {\r\n effectFn(values);\r\n });\r\n });\r\n}\r\n\r\nexport function explicitEffect<T extends readonly Signal<any>[]>(\r\n signals: [...T],\r\n effectFn: (values: { [K in keyof T]: T[K] extends Signal<infer U> ? U : never }) => void\r\n): EffectRef {\r\n return explicitEffectBase(effect, signals, effectFn);\r\n}\r\n\r\nexport function explicitAfterRenderEffect<T extends readonly Signal<any>[]>(\r\n signals: [...T],\r\n effectFn: (values: { [K in keyof T]: T[K] extends Signal<infer U> ? U : never }) => void\r\n): EffectRef {\r\n return explicitEffectBase(afterRenderEffect, signals, effectFn);\r\n}\r\n\r\nexport function asyncComputed<T>(\r\n computeFn: () => Promise<T>,\r\n initial: T\r\n): { (): T; isRunning: Signal<boolean>; firstRunCompleted: Signal<boolean> } {\r\n let latestId = 0;\r\n let latestCompletedId = 0;\r\n const isRunningSignal = signal(false);\r\n const firstRunCompleted = signal(false);\r\n const returnSignal = signal<T>(initial);\r\n\r\n effect(() => {\r\n const currentId = ++latestId;\r\n isRunningSignal.set(true);\r\n\r\n computeFn()\r\n .then(value => {\r\n // Only update the signal if this is the latest call\r\n if (currentId <= latestCompletedId) {\r\n console.debug('asyncComputed: ignoring stale value update');\r\n return;\r\n }\r\n latestCompletedId = currentId;\r\n returnSignal.set(value);\r\n firstRunCompleted.set(true);\r\n\r\n // Set isRunning to false if this is the latest operation\r\n if (currentId === latestId) {\r\n isRunningSignal.set(false);\r\n }\r\n })\r\n .catch(error => {\r\n // Also check if this is the latest operation on error\r\n if (currentId === latestId) {\r\n isRunningSignal.set(false);\r\n }\r\n console.error('Error in asyncComputed:', error);\r\n });\r\n });\r\n\r\n const returnFn = returnSignal as unknown as {\r\n (): T;\r\n isRunning: Signal<boolean>;\r\n firstRunCompleted: Signal<boolean>;\r\n };\r\n returnFn.isRunning = isRunningSignal.asReadonly();\r\n returnFn.firstRunCompleted = firstRunCompleted;\r\n return returnFn;\r\n}\r\n\r\nexport function setInputSignalValue<T>(\r\n input: InputSignal<T> | InputSignalWithTransform<T, unknown>,\r\n value: T\r\n): void {\r\n input[SIGNAL].applyValueToInputSignal(input[SIGNAL], value);\r\n}\r\n\r\nexport function afterRenderComputed<T>(computeFn: () => T, defaultValue: T): () => T {\r\n const value = signal(defaultValue);\r\n afterRenderEffect(() => {\r\n value.set(computeFn());\r\n });\r\n return value.asReadonly();\r\n}\r\n\r\nexport function debounceSignal<T>(input: Signal<T>, delayMs: (() => number) | number): Signal<T> {\r\n const delayFn = typeof delayMs === 'function' ? delayMs : () => delayMs;\r\n const debounced = signal(input());\r\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\r\n\r\n effect(onCleanup => {\r\n const value = input();\r\n const delay = delayFn();\r\n\r\n // Clear any pending timeout\r\n if (timeoutId !== undefined) {\r\n clearTimeout(timeoutId);\r\n }\r\n\r\n // Set new timeout\r\n timeoutId = setTimeout(() => {\r\n debounced.set(value);\r\n timeoutId = undefined;\r\n }, delay);\r\n\r\n // Cleanup function to clear timeout when effect is destroyed or re-run\r\n onCleanup(() => {\r\n if (timeoutId !== undefined) {\r\n clearTimeout(timeoutId);\r\n timeoutId = undefined;\r\n }\r\n });\r\n });\r\n\r\n return debounced.asReadonly();\r\n}\r\n","import { toggleClass } from '@ngneers/controls/utils';\r\n\r\nimport { effectWithPrevious } from './signals';\r\n\r\nimport type { Signal } from '@angular/core';\r\n\r\nexport function classSignal(element: HTMLElement, klass: Signal<string | string[]>) {\r\n effectWithPrevious(klass, (current, previous) => {\r\n if (previous) {\r\n toggleClass(element, previous, false);\r\n }\r\n if (current) {\r\n toggleClass(element, current, true);\r\n }\r\n });\r\n}\r\n","import { DOCUMENT, inject, Injectable } from '@angular/core';\nimport { globalPropertyName, type NgnGlobalType } from '@ngneers/controls/utils';\n\n@Injectable()\nexport class NgnGlobal implements NgnGlobalType {\n private readonly _window = inject(DOCUMENT).defaultView || window;\n constructor() {\n this._window[globalPropertyName] ??= {\n nextElementId: 1,\n fancyLogging: true,\n };\n }\n\n public get nextElementId(): number {\n return this._window[globalPropertyName].nextElementId;\n }\n public set nextElementId(value: number) {\n this._window[globalPropertyName].nextElementId = value;\n }\n\n public get fancyLogging(): boolean {\n return this._window[globalPropertyName].fancyLogging;\n }\n public set fancyLogging(value: boolean) {\n this._window[globalPropertyName].fancyLogging = value;\n }\n}\n","import { inject } from '@angular/core';\n\nimport { NgnGlobal } from './globals';\n\nconst idPrefix = 'ngn-id-';\n\nexport function generateElementId() {\n return idPrefix + inject(NgnGlobal).nextElementId++;\n}\n","import { inject, type ProviderToken } from '@angular/core';\r\nimport { throwExp } from '@ngneers/controls/utils';\r\n\r\nexport function injectOrThrow<T>(token: ProviderToken<T>, moduleName: string, errorMsg: string): T {\r\n return inject(token, { optional: true }) ?? throwExp(moduleName, errorMsg);\r\n}\r\n","import {\r\n Injector,\r\n DestroyRef,\r\n inject,\r\n DOCUMENT,\r\n signal,\r\n afterRenderEffect,\r\n untracked,\r\n effect,\r\n} from '@angular/core';\r\n\r\nexport type NgnStateStorage = 'local' | 'session';\r\n\r\nexport function loadState<T>(storage: NgnStateStorage, key: string) {\r\n const storageType = storage === 'local' ? localStorage : sessionStorage;\r\n const state = storageType.getItem(key);\r\n return state ? (JSON.parse(state) as T) : null;\r\n}\r\n\r\nexport function saveState<T>(storage: NgnStateStorage, key: string, state: T | null) {\r\n const storageType = storage === 'local' ? localStorage : sessionStorage;\r\n if (state === null) {\r\n storageType.removeItem(key);\r\n return;\r\n }\r\n storageType.setItem(key, JSON.stringify(state));\r\n}\r\n\r\nexport type RegisterStateOptions<T> = {\r\n storage: () => NgnStateStorage;\r\n key: () => string | null | undefined;\r\n valueFn: (previousState: T | null) => T | null;\r\n onLoad: (state: T | null) => T | null;\r\n debounce?: number;\r\n injector?: Injector;\r\n};\r\nexport function registerState<T>(options: RegisterStateOptions<T>) {\r\n const { storage, key, valueFn, onLoad, debounce } = options;\r\n const destroyRef = options?.injector?.get(DestroyRef) ?? inject(DestroyRef);\r\n const document = options?.injector?.get<Document>(DOCUMENT) ?? inject(DOCUMENT);\r\n\r\n const load = () => {\r\n const k = key();\r\n return k ? loadState<T>(storage(), k) : null;\r\n };\r\n\r\n const stateSignal = signal<T | null | undefined>(undefined);\r\n\r\n let timer: ReturnType<typeof setTimeout> | undefined = undefined;\r\n const save = () => {\r\n const k = key();\r\n const s = stateSignal();\r\n if (k && s !== undefined) saveState(storage(), k, s);\r\n };\r\n\r\n afterRenderEffect(() => {\r\n let state = load();\r\n if (onLoad) {\r\n state = untracked(() => onLoad(state));\r\n }\r\n stateSignal.set(state);\r\n }, options);\r\n afterRenderEffect(() => {\r\n stateSignal.set(valueFn(untracked(() => stateSignal() ?? null)));\r\n }, options);\r\n effect(() => {\r\n stateSignal();\r\n if (debounce === 0) {\r\n save();\r\n } else {\r\n clearTimeout(timer);\r\n timer = setTimeout(save, debounce);\r\n }\r\n }, options);\r\n\r\n // Ensure saving happens on destroy and unload\r\n document.defaultView?.addEventListener('beforeunload', save);\r\n destroyRef.onDestroy(() => {\r\n clearTimeout(timer);\r\n document.defaultView?.removeEventListener('beforeunload', save);\r\n save();\r\n });\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -78,7 +78,7 @@ function throwExp(moduleName, errorMsg, ...additionalContext) {
78
78
  class NgnError extends Error {
79
79
  additionalContext;
80
80
  constructor(area, errorMsg, ...additionalContext) {
81
- if (typeof window !== 'undefined' && window['__ngn-controls-global__'].fancyLogging) {
81
+ if (typeof window !== 'undefined' && window['__ngn-controls-global__']?.fancyLogging) {
82
82
  console.log(`%c💥%c[${area}]`, 'font-size: 24px;', 'color: #ff0042; font-size: 20px; background-color: #000000;', ...additionalContext);
83
83
  }
84
84
  super(`[${area}] ${errorMsg}`);
@@ -1 +1 @@
1
- {"version":3,"file":"ngneers-controls-utils.mjs","sources":["../../src/utils/dom.ts","../../src/utils/object.ts","../../src/utils/equality.ts","../../src/utils/error.ts","../../src/utils/functions.ts","../../src/utils/fuzzy-match.ts","../../src/utils/globals.ts","../../src/utils/logger.ts","../../src/utils/not-nullish.ts","../../src/utils/positioning.ts","../../src/utils/time-span.ts","../../src/utils/ngneers-controls-utils.ts"],"sourcesContent":["export function toggleClass(element: HTMLElement, className: string | string[], state: boolean) {\r\n const classes = Array.isArray(className)\r\n ? className.flatMap(x => x.split(' '))\r\n : className.split(' ');\r\n classes.forEach(cls => element.classList.toggle(cls, state));\r\n}\r\n","import type { AllKeysOfUnion } from './types';\r\n\r\nexport function deepCopy<T>(obj: T): T extends ReadonlyArray<infer U> ? Array<U> : T {\r\n return JSON.parse(JSON.stringify(obj));\r\n}\r\n\r\nexport function objectKeys<T extends object>(obj: T): (keyof T)[] {\r\n return Object.keys(obj) as (keyof T)[];\r\n}\r\n\r\nexport function objectEntries<T extends object>(obj: T): [keyof T, T[keyof T]][] {\r\n return Object.entries(obj) as [keyof T, T[keyof T]][];\r\n}\r\n\r\nexport function isObject(item: unknown): item is Record<string, unknown> {\r\n return item !== null && typeof item === 'object' && !Array.isArray(item);\r\n}\r\n\r\nexport function deepMerge<T extends Record<string, unknown>, U extends Record<string, unknown>>(\r\n target: T,\r\n source: U\r\n): T & U {\r\n const output = { ...target } as T & U;\r\n for (const key of objectKeys(source)) {\r\n const value = source[key];\r\n if (isObject(value) && isObject(output[key])) {\r\n (output[key] as Record<string, unknown>) = deepMerge(\r\n output[key] as Record<string, unknown>,\r\n value\r\n );\r\n } else {\r\n (output[key] as U[keyof U]) = value;\r\n }\r\n }\r\n return output;\r\n}\r\n\r\nexport function getPropertyIfExists<T extends object, K extends AllKeysOfUnion<T>>(\r\n obj: T,\r\n key: K\r\n): T[K] | undefined {\r\n if (key in obj) {\r\n return obj[key];\r\n }\r\n return undefined;\r\n}\r\n","import { objectKeys } from './object';\r\n\r\nexport function areObjectsDeepEqual<T extends object>(a: T, b: T): boolean {\r\n if (Object.keys(a).length !== Object.keys(b).length) {\r\n return false;\r\n }\r\n return objectKeys(a).every(key => {\r\n if (typeof a[key] !== typeof b[key]) {\r\n return false;\r\n }\r\n if (typeof a[key] === 'object') {\r\n return areObjectsDeepEqual(a[key] as object, b[key] as object);\r\n }\r\n return a[key] === b[key];\r\n });\r\n}\r\n\r\nexport function areArraysDeepEqual<T>(a: readonly T[], b: readonly T[]): boolean {\r\n if (a.length !== b.length) {\r\n return false;\r\n }\r\n for (let i = 0; i < a.length; i++) {\r\n if (typeof a[i] === 'object' && typeof b[i] === 'object') {\r\n const res = areObjectsDeepEqual(a[i] as object, b[i] as object);\r\n if (!res) {\r\n return false;\r\n }\r\n } else {\r\n const res = a[i] === b[i];\r\n if (!res) {\r\n return false;\r\n }\r\n }\r\n }\r\n return true;\r\n}\r\n","export function throwExp(\r\n moduleName: string,\r\n errorMsg: string,\r\n ...additionalContext: unknown[]\r\n): never {\r\n throw new NgnError(moduleName, errorMsg, ...additionalContext);\r\n}\r\n\r\nexport class NgnError extends Error {\r\n public readonly additionalContext?: unknown[];\r\n constructor(area: string, errorMsg: string, ...additionalContext: unknown[]) {\r\n if (typeof window !== 'undefined' && window['__ngn-controls-global__'].fancyLogging) {\r\n console.log(\r\n `%c💥%c[${area}]`,\r\n 'font-size: 24px;',\r\n 'color: #ff0042; font-size: 20px; background-color: #000000;',\r\n ...additionalContext\r\n );\r\n }\r\n\r\n super(`[${area}] ${errorMsg}`);\r\n this.name = 'NgnError';\r\n this.additionalContext = additionalContext;\r\n }\r\n}\r\n","export function maybeCallback<T>(value: T | (() => T)): T {\r\n return typeof value === 'function' ? (value as () => T)() : value;\r\n}\r\n","export function fuzzyMatch(input: string, search: string) {\r\n // Edge cases\r\n const searchLen = search.length;\r\n if (searchLen === 0) return true;\r\n const inputLen = input.length;\r\n if (searchLen > inputLen) return false;\r\n\r\n // Micro-optimized main loop\r\n let searchPos = 0;\r\n\r\n for (let i = 0; i < inputLen && searchPos < searchLen; i++) {\r\n if (input.charCodeAt(i) === search.charCodeAt(searchPos)) {\r\n searchPos++;\r\n // Early exit when remaining input can't contain remaining search\r\n if (searchLen - searchPos > inputLen - i - 1) return false;\r\n }\r\n // Early exit when remaining lengths match but current chars don't\r\n else if (searchLen - searchPos === inputLen - i) return false;\r\n }\r\n\r\n return searchPos === searchLen;\r\n}\r\n","export const globalPropertyName = '__ngn-controls-global__';\r\n\r\nexport interface NgnGlobalType {\r\n nextElementId: number;\r\n fancyLogging: boolean;\r\n}\r\n\r\ndeclare global {\r\n interface Window {\r\n [globalPropertyName]: NgnGlobalType;\r\n }\r\n}\r\n","export type LogLevel = 'debug' | 'info' | 'warn' | 'error';\r\n\r\nexport const Logger = new (class {\r\n public logLevel: LogLevel = 'info';\r\n\r\n public debug(...args: unknown[]) {\r\n if (this.logLevel === 'debug') {\r\n console.debug(...args);\r\n }\r\n }\r\n\r\n public info(...args: unknown[]) {\r\n if (this.logLevel === 'debug' || this.logLevel === 'info') {\r\n console.info(...args);\r\n }\r\n }\r\n\r\n public warn(...args: unknown[]) {\r\n if (this.logLevel === 'debug' || this.logLevel === 'info' || this.logLevel === 'warn') {\r\n console.warn(...args);\r\n }\r\n }\r\n\r\n public error(...args: unknown[]) {\r\n if (\r\n this.logLevel === 'debug' ||\r\n this.logLevel === 'info' ||\r\n this.logLevel === 'warn' ||\r\n this.logLevel === 'error'\r\n ) {\r\n console.error(...args);\r\n }\r\n }\r\n})();\r\n","export function notNullish<T>(value: T | null | undefined): value is T {\r\n return value !== null && value !== undefined;\r\n}\r\n","export function getScrollTop(\r\n elementOffsetTop: number,\r\n elementHeight: number,\r\n containerHeight: number,\r\n currentScrollTop: number,\r\n behavior: ScrollLogicalPosition\r\n): number {\r\n switch (behavior) {\r\n case 'start':\r\n return elementOffsetTop;\r\n case 'end':\r\n return elementOffsetTop - containerHeight + elementHeight;\r\n case 'center':\r\n return elementOffsetTop - (containerHeight - elementHeight) / 2;\r\n case 'nearest': {\r\n const start = elementOffsetTop;\r\n const end = elementOffsetTop - containerHeight + elementHeight;\r\n if (currentScrollTop > end && currentScrollTop < start) {\r\n return currentScrollTop;\r\n }\r\n return Math.abs(start - currentScrollTop) < Math.abs(end - currentScrollTop) ? start : end;\r\n }\r\n }\r\n}\r\n","const timeSpanRegex = /^(?:(.+)d)?(?:(.+)h)?(?:(.+)m)?(?:([^m]+)s)?(?:(.+)ms)?$/;\r\n\r\n/**\r\n * Represents a time span that can be expressed in various formats:\r\n * - As a number (milliseconds)\r\n * - As a string in the format \"XdXhXmXsXms\" where each part is optional (e.g., \"1d2h30m45s500ms\" or \"2h15m\")\r\n * - As an object with properties for days, hours, minutes, seconds, and milliseconds\r\n * @example\r\n * ```typescript\r\n * // As a number\r\n * const duration1: TimeSpan = 5000;\r\n * // As a string\r\n * const duration2: TimeSpan = \"1d2h30m45s500ms\";\r\n * // As an object\r\n * const duration3: TimeSpan = { days: 1, hours: 2, minutes: 30, seconds: 45, milliseconds: 500 };\r\n * ```\r\n */\r\nexport type TimeSpan =\r\n | number\r\n | `${`${number}d` | ''}${`${number}h` | ''}${`${number}m` | ''}${`${number}s` | ''}${`${number}ms` | ''}`\r\n | {\r\n /**\r\n * Number of days in the time span.\r\n */\r\n days?: number;\r\n /**\r\n * Number of hours in the time span.\r\n */\r\n hours?: number;\r\n /**\r\n * Number of minutes in the time span.\r\n */\r\n minutes?: number;\r\n /**\r\n * Number of seconds in the time span.\r\n */\r\n seconds?: number;\r\n /**\r\n * Number of milliseconds in the time span.\r\n */\r\n milliseconds?: number;\r\n };\r\n\r\n/**\r\n * Checks if the provided value is a valid TimeSpan.\r\n * @param value The value to check.\r\n * @returns `true` if the value is a valid TimeSpan, otherwise `false`.\r\n */\r\nexport function isTimeSpan(value: unknown): value is TimeSpan {\r\n if (typeof value === 'number') return true;\r\n if (typeof value === 'string') {\r\n const match = value.match(timeSpanRegex);\r\n return !!match && !match.slice(1).some(part => part !== undefined && isNaN(Number(part)));\r\n }\r\n if (typeof value === 'object' && value !== null) {\r\n return (\r\n 'days' in value ||\r\n 'hours' in value ||\r\n 'minutes' in value ||\r\n 'seconds' in value ||\r\n 'milliseconds' in value\r\n );\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Converts a TimeSpan to milliseconds.\r\n * @param timeSpan The TimeSpan to convert.\r\n * @returns The equivalent time span in milliseconds.\r\n */\r\nexport function getTimeSpanMilliseconds(timeSpan: TimeSpan): number {\r\n if (typeof timeSpan === 'number') return timeSpan;\r\n\r\n if (typeof timeSpan === 'string') {\r\n const parts = parseTimeSpanString(timeSpan);\r\n return parts ? toMilliseconds(...parts) : 0;\r\n }\r\n\r\n const { days, hours, minutes, seconds, milliseconds } = timeSpan;\r\n return toMilliseconds(days, hours, minutes, seconds, milliseconds);\r\n}\r\n\r\n/**\r\n * Converts a TimeSpan to a string representation.\r\n * @param timeSpan The TimeSpan to convert.\r\n * @returns A string representation of the time span.\r\n */\r\nexport function getTimeSpanString(timeSpan: TimeSpan): string {\r\n if (typeof timeSpan === 'number') return `${timeSpan}ms`;\r\n if (typeof timeSpan === 'string') return timeSpan;\r\n\r\n const { days, hours, minutes, seconds, milliseconds } = timeSpan;\r\n return (\r\n (days ? `${days}d` : '') +\r\n (hours ? `${hours}h` : '') +\r\n (minutes ? `${minutes}m` : '') +\r\n (seconds ? `${seconds}s` : '') +\r\n (milliseconds ? `${milliseconds}ms` : '')\r\n );\r\n}\r\n\r\n/**\r\n * Converts a TimeSpan to an object representation.\r\n * @param timeSpan The TimeSpan to convert.\r\n * @returns An object representation of the time span with properties for days, hours, minutes, seconds, and milliseconds.\r\n */\r\nexport function getTimeSpan(timeSpan: TimeSpan): TimeSpan & object {\r\n if (typeof timeSpan === 'number') {\r\n return { milliseconds: timeSpan };\r\n }\r\n\r\n if (typeof timeSpan === 'string') {\r\n const parts = parseTimeSpanString(timeSpan);\r\n if (!parts) return {};\r\n const [days, hours, minutes, seconds, milliseconds] = parts;\r\n return { days, hours, minutes, seconds, milliseconds };\r\n }\r\n\r\n return timeSpan;\r\n}\r\n\r\nfunction parseTimeSpanString(timeSpan: string): number[] | undefined {\r\n const match = timeSpan.match(timeSpanRegex);\r\n if (!match) return undefined;\r\n return match.slice(1).map(part => Number(part) || 0);\r\n}\r\n\r\nfunction toMilliseconds(\r\n days?: number,\r\n hours?: number,\r\n minutes?: number,\r\n seconds?: number,\r\n milliseconds?: number\r\n): number {\r\n return (\r\n (days || 0) * 86400000 + // 24 * 60 * 60 * 1000\r\n (hours || 0) * 3600000 + // 60 * 60 * 1000\r\n (minutes || 0) * 60000 + // 60 * 1000\r\n (seconds || 0) * 1000 +\r\n (milliseconds || 0)\r\n );\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ngneers-controls-utils.mjs","sources":["../../src/utils/dom.ts","../../src/utils/object.ts","../../src/utils/equality.ts","../../src/utils/error.ts","../../src/utils/functions.ts","../../src/utils/fuzzy-match.ts","../../src/utils/globals.ts","../../src/utils/logger.ts","../../src/utils/not-nullish.ts","../../src/utils/positioning.ts","../../src/utils/time-span.ts","../../src/utils/ngneers-controls-utils.ts"],"sourcesContent":["export function toggleClass(element: HTMLElement, className: string | string[], state: boolean) {\r\n const classes = Array.isArray(className)\r\n ? className.flatMap(x => x.split(' '))\r\n : className.split(' ');\r\n classes.forEach(cls => element.classList.toggle(cls, state));\r\n}\r\n","import type { AllKeysOfUnion } from './types';\r\n\r\nexport function deepCopy<T>(obj: T): T extends ReadonlyArray<infer U> ? Array<U> : T {\r\n return JSON.parse(JSON.stringify(obj));\r\n}\r\n\r\nexport function objectKeys<T extends object>(obj: T): (keyof T)[] {\r\n return Object.keys(obj) as (keyof T)[];\r\n}\r\n\r\nexport function objectEntries<T extends object>(obj: T): [keyof T, T[keyof T]][] {\r\n return Object.entries(obj) as [keyof T, T[keyof T]][];\r\n}\r\n\r\nexport function isObject(item: unknown): item is Record<string, unknown> {\r\n return item !== null && typeof item === 'object' && !Array.isArray(item);\r\n}\r\n\r\nexport function deepMerge<T extends Record<string, unknown>, U extends Record<string, unknown>>(\r\n target: T,\r\n source: U\r\n): T & U {\r\n const output = { ...target } as T & U;\r\n for (const key of objectKeys(source)) {\r\n const value = source[key];\r\n if (isObject(value) && isObject(output[key])) {\r\n (output[key] as Record<string, unknown>) = deepMerge(\r\n output[key] as Record<string, unknown>,\r\n value\r\n );\r\n } else {\r\n (output[key] as U[keyof U]) = value;\r\n }\r\n }\r\n return output;\r\n}\r\n\r\nexport function getPropertyIfExists<T extends object, K extends AllKeysOfUnion<T>>(\r\n obj: T,\r\n key: K\r\n): T[K] | undefined {\r\n if (key in obj) {\r\n return obj[key];\r\n }\r\n return undefined;\r\n}\r\n","import { objectKeys } from './object';\r\n\r\nexport function areObjectsDeepEqual<T extends object>(a: T, b: T): boolean {\r\n if (Object.keys(a).length !== Object.keys(b).length) {\r\n return false;\r\n }\r\n return objectKeys(a).every(key => {\r\n if (typeof a[key] !== typeof b[key]) {\r\n return false;\r\n }\r\n if (typeof a[key] === 'object') {\r\n return areObjectsDeepEqual(a[key] as object, b[key] as object);\r\n }\r\n return a[key] === b[key];\r\n });\r\n}\r\n\r\nexport function areArraysDeepEqual<T>(a: readonly T[], b: readonly T[]): boolean {\r\n if (a.length !== b.length) {\r\n return false;\r\n }\r\n for (let i = 0; i < a.length; i++) {\r\n if (typeof a[i] === 'object' && typeof b[i] === 'object') {\r\n const res = areObjectsDeepEqual(a[i] as object, b[i] as object);\r\n if (!res) {\r\n return false;\r\n }\r\n } else {\r\n const res = a[i] === b[i];\r\n if (!res) {\r\n return false;\r\n }\r\n }\r\n }\r\n return true;\r\n}\r\n","export function throwExp(\r\n moduleName: string,\r\n errorMsg: string,\r\n ...additionalContext: unknown[]\r\n): never {\r\n throw new NgnError(moduleName, errorMsg, ...additionalContext);\r\n}\r\n\r\nexport class NgnError extends Error {\r\n public readonly additionalContext?: unknown[];\r\n constructor(area: string, errorMsg: string, ...additionalContext: unknown[]) {\r\n if (typeof window !== 'undefined' && window['__ngn-controls-global__']?.fancyLogging) {\r\n console.log(\r\n `%c💥%c[${area}]`,\r\n 'font-size: 24px;',\r\n 'color: #ff0042; font-size: 20px; background-color: #000000;',\r\n ...additionalContext\r\n );\r\n }\r\n\r\n super(`[${area}] ${errorMsg}`);\r\n this.name = 'NgnError';\r\n this.additionalContext = additionalContext;\r\n }\r\n}\r\n","export function maybeCallback<T>(value: T | (() => T)): T {\r\n return typeof value === 'function' ? (value as () => T)() : value;\r\n}\r\n","export function fuzzyMatch(input: string, search: string) {\r\n // Edge cases\r\n const searchLen = search.length;\r\n if (searchLen === 0) return true;\r\n const inputLen = input.length;\r\n if (searchLen > inputLen) return false;\r\n\r\n // Micro-optimized main loop\r\n let searchPos = 0;\r\n\r\n for (let i = 0; i < inputLen && searchPos < searchLen; i++) {\r\n if (input.charCodeAt(i) === search.charCodeAt(searchPos)) {\r\n searchPos++;\r\n // Early exit when remaining input can't contain remaining search\r\n if (searchLen - searchPos > inputLen - i - 1) return false;\r\n }\r\n // Early exit when remaining lengths match but current chars don't\r\n else if (searchLen - searchPos === inputLen - i) return false;\r\n }\r\n\r\n return searchPos === searchLen;\r\n}\r\n","export const globalPropertyName = '__ngn-controls-global__';\r\n\r\nexport interface NgnGlobalType {\r\n nextElementId: number;\r\n fancyLogging: boolean;\r\n}\r\n\r\ndeclare global {\r\n interface Window {\r\n [globalPropertyName]: NgnGlobalType;\r\n }\r\n}\r\n","export type LogLevel = 'debug' | 'info' | 'warn' | 'error';\r\n\r\nexport const Logger = new (class {\r\n public logLevel: LogLevel = 'info';\r\n\r\n public debug(...args: unknown[]) {\r\n if (this.logLevel === 'debug') {\r\n console.debug(...args);\r\n }\r\n }\r\n\r\n public info(...args: unknown[]) {\r\n if (this.logLevel === 'debug' || this.logLevel === 'info') {\r\n console.info(...args);\r\n }\r\n }\r\n\r\n public warn(...args: unknown[]) {\r\n if (this.logLevel === 'debug' || this.logLevel === 'info' || this.logLevel === 'warn') {\r\n console.warn(...args);\r\n }\r\n }\r\n\r\n public error(...args: unknown[]) {\r\n if (\r\n this.logLevel === 'debug' ||\r\n this.logLevel === 'info' ||\r\n this.logLevel === 'warn' ||\r\n this.logLevel === 'error'\r\n ) {\r\n console.error(...args);\r\n }\r\n }\r\n})();\r\n","export function notNullish<T>(value: T | null | undefined): value is T {\r\n return value !== null && value !== undefined;\r\n}\r\n","export function getScrollTop(\r\n elementOffsetTop: number,\r\n elementHeight: number,\r\n containerHeight: number,\r\n currentScrollTop: number,\r\n behavior: ScrollLogicalPosition\r\n): number {\r\n switch (behavior) {\r\n case 'start':\r\n return elementOffsetTop;\r\n case 'end':\r\n return elementOffsetTop - containerHeight + elementHeight;\r\n case 'center':\r\n return elementOffsetTop - (containerHeight - elementHeight) / 2;\r\n case 'nearest': {\r\n const start = elementOffsetTop;\r\n const end = elementOffsetTop - containerHeight + elementHeight;\r\n if (currentScrollTop > end && currentScrollTop < start) {\r\n return currentScrollTop;\r\n }\r\n return Math.abs(start - currentScrollTop) < Math.abs(end - currentScrollTop) ? start : end;\r\n }\r\n }\r\n}\r\n","const timeSpanRegex = /^(?:(.+)d)?(?:(.+)h)?(?:(.+)m)?(?:([^m]+)s)?(?:(.+)ms)?$/;\r\n\r\n/**\r\n * Represents a time span that can be expressed in various formats:\r\n * - As a number (milliseconds)\r\n * - As a string in the format \"XdXhXmXsXms\" where each part is optional (e.g., \"1d2h30m45s500ms\" or \"2h15m\")\r\n * - As an object with properties for days, hours, minutes, seconds, and milliseconds\r\n * @example\r\n * ```typescript\r\n * // As a number\r\n * const duration1: TimeSpan = 5000;\r\n * // As a string\r\n * const duration2: TimeSpan = \"1d2h30m45s500ms\";\r\n * // As an object\r\n * const duration3: TimeSpan = { days: 1, hours: 2, minutes: 30, seconds: 45, milliseconds: 500 };\r\n * ```\r\n */\r\nexport type TimeSpan =\r\n | number\r\n | `${`${number}d` | ''}${`${number}h` | ''}${`${number}m` | ''}${`${number}s` | ''}${`${number}ms` | ''}`\r\n | {\r\n /**\r\n * Number of days in the time span.\r\n */\r\n days?: number;\r\n /**\r\n * Number of hours in the time span.\r\n */\r\n hours?: number;\r\n /**\r\n * Number of minutes in the time span.\r\n */\r\n minutes?: number;\r\n /**\r\n * Number of seconds in the time span.\r\n */\r\n seconds?: number;\r\n /**\r\n * Number of milliseconds in the time span.\r\n */\r\n milliseconds?: number;\r\n };\r\n\r\n/**\r\n * Checks if the provided value is a valid TimeSpan.\r\n * @param value The value to check.\r\n * @returns `true` if the value is a valid TimeSpan, otherwise `false`.\r\n */\r\nexport function isTimeSpan(value: unknown): value is TimeSpan {\r\n if (typeof value === 'number') return true;\r\n if (typeof value === 'string') {\r\n const match = value.match(timeSpanRegex);\r\n return !!match && !match.slice(1).some(part => part !== undefined && isNaN(Number(part)));\r\n }\r\n if (typeof value === 'object' && value !== null) {\r\n return (\r\n 'days' in value ||\r\n 'hours' in value ||\r\n 'minutes' in value ||\r\n 'seconds' in value ||\r\n 'milliseconds' in value\r\n );\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Converts a TimeSpan to milliseconds.\r\n * @param timeSpan The TimeSpan to convert.\r\n * @returns The equivalent time span in milliseconds.\r\n */\r\nexport function getTimeSpanMilliseconds(timeSpan: TimeSpan): number {\r\n if (typeof timeSpan === 'number') return timeSpan;\r\n\r\n if (typeof timeSpan === 'string') {\r\n const parts = parseTimeSpanString(timeSpan);\r\n return parts ? toMilliseconds(...parts) : 0;\r\n }\r\n\r\n const { days, hours, minutes, seconds, milliseconds } = timeSpan;\r\n return toMilliseconds(days, hours, minutes, seconds, milliseconds);\r\n}\r\n\r\n/**\r\n * Converts a TimeSpan to a string representation.\r\n * @param timeSpan The TimeSpan to convert.\r\n * @returns A string representation of the time span.\r\n */\r\nexport function getTimeSpanString(timeSpan: TimeSpan): string {\r\n if (typeof timeSpan === 'number') return `${timeSpan}ms`;\r\n if (typeof timeSpan === 'string') return timeSpan;\r\n\r\n const { days, hours, minutes, seconds, milliseconds } = timeSpan;\r\n return (\r\n (days ? `${days}d` : '') +\r\n (hours ? `${hours}h` : '') +\r\n (minutes ? `${minutes}m` : '') +\r\n (seconds ? `${seconds}s` : '') +\r\n (milliseconds ? `${milliseconds}ms` : '')\r\n );\r\n}\r\n\r\n/**\r\n * Converts a TimeSpan to an object representation.\r\n * @param timeSpan The TimeSpan to convert.\r\n * @returns An object representation of the time span with properties for days, hours, minutes, seconds, and milliseconds.\r\n */\r\nexport function getTimeSpan(timeSpan: TimeSpan): TimeSpan & object {\r\n if (typeof timeSpan === 'number') {\r\n return { milliseconds: timeSpan };\r\n }\r\n\r\n if (typeof timeSpan === 'string') {\r\n const parts = parseTimeSpanString(timeSpan);\r\n if (!parts) return {};\r\n const [days, hours, minutes, seconds, milliseconds] = parts;\r\n return { days, hours, minutes, seconds, milliseconds };\r\n }\r\n\r\n return timeSpan;\r\n}\r\n\r\nfunction parseTimeSpanString(timeSpan: string): number[] | undefined {\r\n const match = timeSpan.match(timeSpanRegex);\r\n if (!match) return undefined;\r\n return match.slice(1).map(part => Number(part) || 0);\r\n}\r\n\r\nfunction toMilliseconds(\r\n days?: number,\r\n hours?: number,\r\n minutes?: number,\r\n seconds?: number,\r\n milliseconds?: number\r\n): number {\r\n return (\r\n (days || 0) * 86400000 + // 24 * 60 * 60 * 1000\r\n (hours || 0) * 3600000 + // 60 * 60 * 1000\r\n (minutes || 0) * 60000 + // 60 * 1000\r\n (seconds || 0) * 1000 +\r\n (milliseconds || 0)\r\n );\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,24 +1,33 @@
1
1
  {
2
2
  "name": "@ngneers/controls",
3
- "version": "0.0.1-pre6",
4
- "private": false,
3
+ "version": "0.0.1-pre7",
5
4
  "dependencies": {
6
- "@ngneers/controls-custom-types": "^0.0.1-pre2",
5
+ "@ngneers/controls-custom-types": "^0.0.1-pre3",
7
6
  "tslib": "^2.8.1"
8
7
  },
9
8
  "peerDependencies": {
10
- "@angular/common": "21.2.2",
11
- "@angular/compiler": "21.2.2",
12
- "@angular/core": "21.2.2",
13
- "@angular/forms": "21.2.2",
14
- "@angular/platform-browser": "21.2.2",
15
- "@angular/router": "21.2.2",
9
+ "@angular/common": "21.2.10",
10
+ "@angular/compiler": "21.2.10",
11
+ "@angular/core": "21.2.10",
12
+ "@angular/forms": "21.2.10",
13
+ "@angular/platform-browser": "21.2.10",
14
+ "@angular/router": "21.2.10",
16
15
  "@floating-ui/dom": "^1.7.1",
17
- "@ngneers/controls-themes": "^0.0.1-pre2",
16
+ "@iconify/icons-tabler": "^1.0.0",
17
+ "@iconify/types": "^2.0.0",
18
+ "@ngneers/controls-themes": "^0.0.1-pre3",
18
19
  "@ngneers/signal-translate": "^20.0.0",
19
20
  "rxjs": "~7.8.0"
20
21
  },
22
+ "peerDependenciesMeta": {
23
+ "@iconify/icons-tabler": {
24
+ "optional": true
25
+ }
26
+ },
21
27
  "sideEffects": false,
28
+ "publishConfig": {
29
+ "access": "public"
30
+ },
22
31
  "module": "fesm2022/ngneers-controls.mjs",
23
32
  "typings": "types/ngneers-controls.d.ts",
24
33
  "exports": {
@@ -77,6 +86,10 @@
77
86
  "types": "./types/ngneers-controls-chip.d.ts",
78
87
  "default": "./fesm2022/ngneers-controls-chip.mjs"
79
88
  },
89
+ "./default-icons": {
90
+ "types": "./types/ngneers-controls-default-icons.d.ts",
91
+ "default": "./fesm2022/ngneers-controls-default-icons.mjs"
92
+ },
80
93
  "./defer": {
81
94
  "types": "./types/ngneers-controls-defer.d.ts",
82
95
  "default": "./fesm2022/ngneers-controls-defer.mjs"
@@ -153,6 +166,10 @@
153
166
  "types": "./types/ngneers-controls-progress.d.ts",
154
167
  "default": "./fesm2022/ngneers-controls-progress.mjs"
155
168
  },
169
+ "./scroll-shadow": {
170
+ "types": "./types/ngneers-controls-scroll-shadow.d.ts",
171
+ "default": "./fesm2022/ngneers-controls-scroll-shadow.mjs"
172
+ },
156
173
  "./scroller": {
157
174
  "types": "./types/ngneers-controls-scroller.d.ts",
158
175
  "default": "./fesm2022/ngneers-controls-scroller.mjs"
@@ -213,5 +230,6 @@
213
230
  "types": "./types/ngneers-controls-utils-ng.d.ts",
214
231
  "default": "./fesm2022/ngneers-controls-utils-ng.mjs"
215
232
  }
216
- }
233
+ },
234
+ "type": "module"
217
235
  }