@frame-ui-ng/components 0.4.0-beta.0 → 0.4.1

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 (161) hide show
  1. package/confirm-popover/src/styles/confirm-popover.css +20 -0
  2. package/drag-drop/src/styles/_vars.css +28 -0
  3. package/drag-drop/src/styles/drag-drop.css +132 -0
  4. package/fesm2022/frame-ui-ng-components-accordion.mjs +26 -21
  5. package/fesm2022/frame-ui-ng-components-accordion.mjs.map +1 -1
  6. package/fesm2022/frame-ui-ng-components-alert.mjs +4 -0
  7. package/fesm2022/frame-ui-ng-components-alert.mjs.map +1 -1
  8. package/fesm2022/frame-ui-ng-components-avatar.mjs +7 -0
  9. package/fesm2022/frame-ui-ng-components-avatar.mjs.map +1 -1
  10. package/fesm2022/frame-ui-ng-components-badge.mjs +4 -0
  11. package/fesm2022/frame-ui-ng-components-badge.mjs.map +1 -1
  12. package/fesm2022/frame-ui-ng-components-breadcrumb.mjs +13 -6
  13. package/fesm2022/frame-ui-ng-components-breadcrumb.mjs.map +1 -1
  14. package/fesm2022/frame-ui-ng-components-button-group.mjs +1 -0
  15. package/fesm2022/frame-ui-ng-components-button-group.mjs.map +1 -1
  16. package/fesm2022/frame-ui-ng-components-button.mjs +5 -0
  17. package/fesm2022/frame-ui-ng-components-button.mjs.map +1 -1
  18. package/fesm2022/frame-ui-ng-components-calendar.mjs +4 -0
  19. package/fesm2022/frame-ui-ng-components-calendar.mjs.map +1 -1
  20. package/fesm2022/frame-ui-ng-components-card.mjs +15 -15
  21. package/fesm2022/frame-ui-ng-components-card.mjs.map +1 -1
  22. package/fesm2022/frame-ui-ng-components-carousel.mjs +33 -16
  23. package/fesm2022/frame-ui-ng-components-carousel.mjs.map +1 -1
  24. package/fesm2022/frame-ui-ng-components-checkbox.mjs +7 -9
  25. package/fesm2022/frame-ui-ng-components-checkbox.mjs.map +1 -1
  26. package/fesm2022/frame-ui-ng-components-collapsible.mjs +24 -23
  27. package/fesm2022/frame-ui-ng-components-collapsible.mjs.map +1 -1
  28. package/fesm2022/frame-ui-ng-components-combobox.mjs +66 -18
  29. package/fesm2022/frame-ui-ng-components-combobox.mjs.map +1 -1
  30. package/fesm2022/frame-ui-ng-components-command.mjs +47 -16
  31. package/fesm2022/frame-ui-ng-components-command.mjs.map +1 -1
  32. package/fesm2022/frame-ui-ng-components-confirm-modal.mjs +3 -0
  33. package/fesm2022/frame-ui-ng-components-confirm-modal.mjs.map +1 -1
  34. package/fesm2022/frame-ui-ng-components-confirm-popover.mjs +423 -0
  35. package/fesm2022/frame-ui-ng-components-confirm-popover.mjs.map +1 -0
  36. package/fesm2022/frame-ui-ng-components-context-menu.mjs +71 -45
  37. package/fesm2022/frame-ui-ng-components-context-menu.mjs.map +1 -1
  38. package/fesm2022/frame-ui-ng-components-date-picker.mjs +3 -0
  39. package/fesm2022/frame-ui-ng-components-date-picker.mjs.map +1 -1
  40. package/fesm2022/frame-ui-ng-components-drag-drop.mjs +293 -0
  41. package/fesm2022/frame-ui-ng-components-drag-drop.mjs.map +1 -0
  42. package/fesm2022/frame-ui-ng-components-dropdown-menu.mjs +73 -36
  43. package/fesm2022/frame-ui-ng-components-dropdown-menu.mjs.map +1 -1
  44. package/fesm2022/frame-ui-ng-components-empty.mjs +6 -0
  45. package/fesm2022/frame-ui-ng-components-empty.mjs.map +1 -1
  46. package/fesm2022/frame-ui-ng-components-field.mjs +21 -12
  47. package/fesm2022/frame-ui-ng-components-field.mjs.map +1 -1
  48. package/fesm2022/frame-ui-ng-components-forms.mjs +1 -0
  49. package/fesm2022/frame-ui-ng-components-forms.mjs.map +1 -1
  50. package/fesm2022/frame-ui-ng-components-hover-card.mjs +49 -43
  51. package/fesm2022/frame-ui-ng-components-hover-card.mjs.map +1 -1
  52. package/fesm2022/frame-ui-ng-components-input-otp.mjs +5 -0
  53. package/fesm2022/frame-ui-ng-components-input-otp.mjs.map +1 -1
  54. package/fesm2022/frame-ui-ng-components-input.mjs +13 -0
  55. package/fesm2022/frame-ui-ng-components-input.mjs.map +1 -1
  56. package/fesm2022/frame-ui-ng-components-item.mjs +10 -0
  57. package/fesm2022/frame-ui-ng-components-item.mjs.map +1 -1
  58. package/fesm2022/frame-ui-ng-components-menubar.mjs +15 -0
  59. package/fesm2022/frame-ui-ng-components-menubar.mjs.map +1 -1
  60. package/fesm2022/frame-ui-ng-components-modal.mjs +128 -114
  61. package/fesm2022/frame-ui-ng-components-modal.mjs.map +1 -1
  62. package/fesm2022/frame-ui-ng-components-navigation-menu.mjs +14 -0
  63. package/fesm2022/frame-ui-ng-components-navigation-menu.mjs.map +1 -1
  64. package/fesm2022/frame-ui-ng-components-pagination.mjs +8 -0
  65. package/fesm2022/frame-ui-ng-components-pagination.mjs.map +1 -1
  66. package/fesm2022/frame-ui-ng-components-popover.mjs +63 -51
  67. package/fesm2022/frame-ui-ng-components-popover.mjs.map +1 -1
  68. package/fesm2022/frame-ui-ng-components-progress.mjs +2 -0
  69. package/fesm2022/frame-ui-ng-components-progress.mjs.map +1 -1
  70. package/fesm2022/frame-ui-ng-components-radio-group.mjs +5 -0
  71. package/fesm2022/frame-ui-ng-components-radio-group.mjs.map +1 -1
  72. package/fesm2022/frame-ui-ng-components-resizable.mjs +6 -0
  73. package/fesm2022/frame-ui-ng-components-resizable.mjs.map +1 -1
  74. package/fesm2022/frame-ui-ng-components-select.mjs +62 -14
  75. package/fesm2022/frame-ui-ng-components-select.mjs.map +1 -1
  76. package/fesm2022/frame-ui-ng-components-separator.mjs +1 -0
  77. package/fesm2022/frame-ui-ng-components-separator.mjs.map +1 -1
  78. package/fesm2022/frame-ui-ng-components-sheet.mjs +99 -88
  79. package/fesm2022/frame-ui-ng-components-sheet.mjs.map +1 -1
  80. package/fesm2022/frame-ui-ng-components-sidebar.mjs +27 -12
  81. package/fesm2022/frame-ui-ng-components-sidebar.mjs.map +1 -1
  82. package/fesm2022/frame-ui-ng-components-skeleton.mjs +1 -0
  83. package/fesm2022/frame-ui-ng-components-skeleton.mjs.map +1 -1
  84. package/fesm2022/frame-ui-ng-components-slider.mjs +29 -16
  85. package/fesm2022/frame-ui-ng-components-slider.mjs.map +1 -1
  86. package/fesm2022/frame-ui-ng-components-spinner.mjs +1 -0
  87. package/fesm2022/frame-ui-ng-components-spinner.mjs.map +1 -1
  88. package/fesm2022/frame-ui-ng-components-switch.mjs +6 -0
  89. package/fesm2022/frame-ui-ng-components-switch.mjs.map +1 -1
  90. package/fesm2022/frame-ui-ng-components-table.mjs +76 -50
  91. package/fesm2022/frame-ui-ng-components-table.mjs.map +1 -1
  92. package/fesm2022/frame-ui-ng-components-tabs.mjs +4 -0
  93. package/fesm2022/frame-ui-ng-components-tabs.mjs.map +1 -1
  94. package/fesm2022/frame-ui-ng-components-textarea.mjs +1 -0
  95. package/fesm2022/frame-ui-ng-components-textarea.mjs.map +1 -1
  96. package/fesm2022/frame-ui-ng-components-toast.mjs +2 -0
  97. package/fesm2022/frame-ui-ng-components-toast.mjs.map +1 -1
  98. package/fesm2022/frame-ui-ng-components-toggle.mjs +23 -16
  99. package/fesm2022/frame-ui-ng-components-toggle.mjs.map +1 -1
  100. package/fesm2022/frame-ui-ng-components-tooltip.mjs +30 -25
  101. package/fesm2022/frame-ui-ng-components-tooltip.mjs.map +1 -1
  102. package/fesm2022/frame-ui-ng-components-virtual-scroll.mjs +26 -8
  103. package/fesm2022/frame-ui-ng-components-virtual-scroll.mjs.map +1 -1
  104. package/fesm2022/frame-ui-ng-components.mjs +1387 -552
  105. package/fesm2022/frame-ui-ng-components.mjs.map +1 -1
  106. package/package.json +10 -2
  107. package/popover/src/styles/popover.css +106 -101
  108. package/src/styles/components.css +6 -4
  109. package/styles/components.css +6 -4
  110. package/styles.css +6 -4
  111. package/types/frame-ui-ng-components-accordion.d.ts +11 -4
  112. package/types/frame-ui-ng-components-alert.d.ts +4 -0
  113. package/types/frame-ui-ng-components-avatar.d.ts +7 -0
  114. package/types/frame-ui-ng-components-badge.d.ts +4 -0
  115. package/types/frame-ui-ng-components-breadcrumb.d.ts +7 -0
  116. package/types/frame-ui-ng-components-button-group.d.ts +1 -0
  117. package/types/frame-ui-ng-components-button.d.ts +5 -0
  118. package/types/frame-ui-ng-components-calendar.d.ts +1 -0
  119. package/types/frame-ui-ng-components-card.d.ts +8 -3
  120. package/types/frame-ui-ng-components-carousel.d.ts +11 -2
  121. package/types/frame-ui-ng-components-checkbox.d.ts +3 -2
  122. package/types/frame-ui-ng-components-collapsible.d.ts +9 -4
  123. package/types/frame-ui-ng-components-combobox.d.ts +32 -3
  124. package/types/frame-ui-ng-components-command.d.ts +26 -4
  125. package/types/frame-ui-ng-components-confirm-modal.d.ts +2 -0
  126. package/types/frame-ui-ng-components-confirm-popover.d.ts +87 -0
  127. package/types/frame-ui-ng-components-context-menu.d.ts +29 -10
  128. package/types/frame-ui-ng-components-date-picker.d.ts +1 -0
  129. package/types/frame-ui-ng-components-drag-drop.d.ts +103 -0
  130. package/types/frame-ui-ng-components-dropdown-menu.d.ts +32 -9
  131. package/types/frame-ui-ng-components-empty.d.ts +6 -0
  132. package/types/frame-ui-ng-components-field.d.ts +9 -0
  133. package/types/frame-ui-ng-components-forms.d.ts +1 -0
  134. package/types/frame-ui-ng-components-hover-card.d.ts +8 -2
  135. package/types/frame-ui-ng-components-input-otp.d.ts +4 -0
  136. package/types/frame-ui-ng-components-input.d.ts +13 -0
  137. package/types/frame-ui-ng-components-item.d.ts +10 -0
  138. package/types/frame-ui-ng-components-menubar.d.ts +15 -0
  139. package/types/frame-ui-ng-components-modal.d.ts +12 -0
  140. package/types/frame-ui-ng-components-navigation-menu.d.ts +14 -0
  141. package/types/frame-ui-ng-components-pagination.d.ts +8 -0
  142. package/types/frame-ui-ng-components-popover.d.ts +14 -2
  143. package/types/frame-ui-ng-components-progress.d.ts +2 -0
  144. package/types/frame-ui-ng-components-radio-group.d.ts +5 -0
  145. package/types/frame-ui-ng-components-resizable.d.ts +3 -0
  146. package/types/frame-ui-ng-components-select.d.ts +23 -2
  147. package/types/frame-ui-ng-components-separator.d.ts +1 -0
  148. package/types/frame-ui-ng-components-sheet.d.ts +11 -0
  149. package/types/frame-ui-ng-components-sidebar.d.ts +21 -0
  150. package/types/frame-ui-ng-components-skeleton.d.ts +1 -0
  151. package/types/frame-ui-ng-components-slider.d.ts +5 -2
  152. package/types/frame-ui-ng-components-spinner.d.ts +1 -0
  153. package/types/frame-ui-ng-components-switch.d.ts +6 -0
  154. package/types/frame-ui-ng-components-table.d.ts +26 -0
  155. package/types/frame-ui-ng-components-tabs.d.ts +4 -0
  156. package/types/frame-ui-ng-components-textarea.d.ts +1 -0
  157. package/types/frame-ui-ng-components-toast.d.ts +2 -0
  158. package/types/frame-ui-ng-components-toggle.d.ts +8 -2
  159. package/types/frame-ui-ng-components-tooltip.d.ts +6 -2
  160. package/types/frame-ui-ng-components-virtual-scroll.d.ts +11 -2
  161. package/types/frame-ui-ng-components.d.ts +492 -76
@@ -2,7 +2,7 @@ import { Overlay } from '@angular/cdk/overlay';
2
2
  import { ComponentPortal } from '@angular/cdk/portal';
3
3
  import { DOCUMENT, isPlatformBrowser, NgTemplateOutlet } from '@angular/common';
4
4
  import * as i0 from '@angular/core';
5
- import { inject, DestroyRef, ElementRef, PLATFORM_ID, input, booleanAttribute, numberAttribute, signal, effect, Directive, TemplateRef, ChangeDetectionStrategy, Component, NgModule } from '@angular/core';
5
+ import { inject, DestroyRef, ElementRef, PLATFORM_ID, input, booleanAttribute, numberAttribute, signal, Directive, computed, TemplateRef, ChangeDetectionStrategy, Component, NgModule } from '@angular/core';
6
6
  import { parseCssPixelValue, clampNumber } from '@frame-ui-ng/components/utils';
7
7
 
8
8
  function buildTooltipPositions(options) {
@@ -75,6 +75,7 @@ const FR_TOOLTIP_TOKEN_NAMES = [
75
75
  ];
76
76
 
77
77
  let nextInlineTooltipId = 0;
78
+ /** Tooltip trigger directive with delay and placement options. */
78
79
  class FrTooltipDirective {
79
80
  destroyRef = inject(DestroyRef);
80
81
  document = inject(DOCUMENT);
@@ -103,17 +104,22 @@ class FrTooltipDirective {
103
104
  wrapped = false;
104
105
  wrapper = null;
105
106
  teardownListeners = [];
107
+ lastPanelInputKey = '';
106
108
  constructor() {
107
109
  this.destroyRef.onDestroy(() => this.destroy());
108
- effect(() => {
109
- const content = this.content();
110
- if (this.panelRef && content) {
111
- this.updatePanelInputs();
112
- }
113
- if (!content) {
114
- this.close();
115
- }
116
- });
110
+ }
111
+ ngDoCheck() {
112
+ const content = this.content();
113
+ if (!content) {
114
+ this.close();
115
+ this.lastPanelInputKey = '';
116
+ return;
117
+ }
118
+ const panelInputKey = [content, this.arrow(), this.side(), this.tooltipId].map(String).join('|');
119
+ if (this.panelRef && panelInputKey !== this.lastPanelInputKey) {
120
+ this.updatePanelInputs();
121
+ }
122
+ this.lastPanelInputKey = panelInputKey;
117
123
  }
118
124
  ngAfterViewInit() {
119
125
  if (!isPlatformBrowser(this.platformId)) {
@@ -147,6 +153,7 @@ class FrTooltipDirective {
147
153
  return;
148
154
  }
149
155
  const wrapper = this.document.createElement('span');
156
+ // Disabled form controls do not emit pointer/focus events, so the wrapper becomes the trigger.
150
157
  wrapper.className = 'frame-tooltip__disabled-trigger';
151
158
  wrapper.tabIndex = 0;
152
159
  parent.insertBefore(wrapper, element);
@@ -284,6 +291,7 @@ class FrTooltipDirective {
284
291
  }
285
292
  copyCustomProperties(source, overlayPane, panel) {
286
293
  const sourceStyles = getComputedStyle(source);
294
+ // Overlay content is portaled, so copy theme tokens from the trigger into the pane.
287
295
  for (const propertyName of FR_TOOLTIP_TOKEN_NAMES) {
288
296
  const propertyValue = sourceStyles.getPropertyValue(propertyName);
289
297
  if (propertyValue.trim()) {
@@ -306,6 +314,7 @@ class FrTooltipDirective {
306
314
  if (!this.arrow() || this.arrowFrameId !== -1) {
307
315
  return;
308
316
  }
317
+ // Coalesce position changes until CDK has applied the latest overlay geometry.
309
318
  this.arrowFrameId = requestAnimationFrame(() => {
310
319
  this.arrowFrameId = -1;
311
320
  this.syncArrowPosition(this.pendingArrowSide);
@@ -381,6 +390,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
381
390
  },
382
391
  }]
383
392
  }], ctorParameters: () => [], propDecorators: { content: [{ type: i0.Input, args: [{ isSignal: true, alias: "frTooltip", required: false }] }], align: [{ type: i0.Input, args: [{ isSignal: true, alias: "frTooltipAlign", required: false }] }], alignOffset: [{ type: i0.Input, args: [{ isSignal: true, alias: "frTooltipAlignOffset", required: false }] }], arrow: [{ type: i0.Input, args: [{ isSignal: true, alias: "frTooltipArrow", required: false }] }], closeDelay: [{ type: i0.Input, args: [{ isSignal: true, alias: "frTooltipCloseDelay", required: false }] }], openDelay: [{ type: i0.Input, args: [{ isSignal: true, alias: "frTooltipOpenDelay", required: false }] }], side: [{ type: i0.Input, args: [{ isSignal: true, alias: "frTooltipSide", required: false }] }], sideOffset: [{ type: i0.Input, args: [{ isSignal: true, alias: "frTooltipSideOffset", required: false }] }] } });
393
+ /** Shortcut slot for tooltip. */
384
394
  class FrTooltipShortcut {
385
395
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrTooltipShortcut, deps: [], target: i0.ɵɵFactoryTarget.Directive });
386
396
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrTooltipShortcut, isStandalone: true, selector: "[frTooltipShortcut]", host: { classAttribute: "frame-tooltip__shortcut" }, ngImport: i0 });
@@ -394,25 +404,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
394
404
  },
395
405
  }]
396
406
  }] });
407
+ /** Inline overlay panel that renders tooltip text or template content. */
397
408
  class FrTooltipInlinePanel {
398
409
  arrow = input(false, { ...(ngDevMode ? { debugName: "arrow" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
399
410
  content = input('', ...(ngDevMode ? [{ debugName: "content" }] : /* istanbul ignore next */ []));
400
411
  id = input.required(...(ngDevMode ? [{ debugName: "id" }] : /* istanbul ignore next */ []));
401
412
  side = input('top', ...(ngDevMode ? [{ debugName: "side" }] : /* istanbul ignore next */ []));
402
- templateContent = signal(null, ...(ngDevMode ? [{ debugName: "templateContent" }] : /* istanbul ignore next */ []));
403
- textContent = signal('', ...(ngDevMode ? [{ debugName: "textContent" }] : /* istanbul ignore next */ []));
404
- constructor() {
405
- effect(() => {
406
- const content = this.content();
407
- if (content instanceof TemplateRef) {
408
- this.templateContent.set(content);
409
- this.textContent.set('');
410
- return;
411
- }
412
- this.templateContent.set(null);
413
- this.textContent.set(content ?? '');
414
- });
415
- }
413
+ templateContent = computed(() => {
414
+ const content = this.content();
415
+ return content instanceof TemplateRef ? content : null;
416
+ }, ...(ngDevMode ? [{ debugName: "templateContent" }] : /* istanbul ignore next */ []));
417
+ textContent = computed(() => {
418
+ const content = this.content();
419
+ return content instanceof TemplateRef ? '' : content;
420
+ }, ...(ngDevMode ? [{ debugName: "textContent" }] : /* istanbul ignore next */ []));
416
421
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrTooltipInlinePanel, deps: [], target: i0.ɵɵFactoryTarget.Component });
417
422
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.16", type: FrTooltipInlinePanel, isStandalone: true, selector: "frame-tooltip-inline-panel", inputs: { arrow: { classPropertyName: "arrow", publicName: "arrow", isSignal: true, isRequired: false, transformFunction: null }, content: { classPropertyName: "content", publicName: "content", isSignal: true, isRequired: false, transformFunction: null }, id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: true, transformFunction: null }, side: { classPropertyName: "side", publicName: "side", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
418
423
  <div
@@ -452,7 +457,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
452
457
  </div>
453
458
  `,
454
459
  }]
455
- }], ctorParameters: () => [], propDecorators: { arrow: [{ type: i0.Input, args: [{ isSignal: true, alias: "arrow", required: false }] }], content: [{ type: i0.Input, args: [{ isSignal: true, alias: "content", required: false }] }], id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: true }] }], side: [{ type: i0.Input, args: [{ isSignal: true, alias: "side", required: false }] }] } });
460
+ }], propDecorators: { arrow: [{ type: i0.Input, args: [{ isSignal: true, alias: "arrow", required: false }] }], content: [{ type: i0.Input, args: [{ isSignal: true, alias: "content", required: false }] }], id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: true }] }], side: [{ type: i0.Input, args: [{ isSignal: true, alias: "side", required: false }] }] } });
456
461
 
457
462
  const FR_TOOLTIP_SIDES = ['top', 'right', 'bottom', 'left'];
458
463
  const FR_TOOLTIP_ALIGNMENTS = ['start', 'center', 'end'];
@@ -1 +1 @@
1
- {"version":3,"file":"frame-ui-ng-components-tooltip.mjs","sources":["../../../projects/components/tooltip/src/tooltip.position.ts","../../../projects/components/tooltip/src/tooltip.tokens.ts","../../../projects/components/tooltip/src/tooltip.directive.ts","../../../projects/components/tooltip/src/tooltip.types.ts","../../../projects/components/tooltip/tooltip.module.ts","../../../projects/components/tooltip/frame-ui-ng-components-tooltip.ts"],"sourcesContent":["import { ConnectedPosition } from '@angular/cdk/overlay';\n\nimport { FrTooltipAlignment, FrTooltipSide } from './tooltip.types';\n\nexport function buildTooltipPositions(options: {\n align: FrTooltipAlignment;\n alignOffset: number;\n side: FrTooltipSide;\n sideOffset: number;\n}): ConnectedPosition[] {\n const primary = buildPosition(options.side, options);\n const opposite = oppositeSide(options.side);\n const fallback = buildPosition(opposite, {\n align: options.align,\n alignOffset: options.alignOffset,\n sideOffset: options.sideOffset,\n });\n\n return [primary, fallback];\n}\n\nfunction buildPosition(\n side: FrTooltipSide,\n options: {\n align: FrTooltipAlignment;\n alignOffset: number;\n sideOffset: number;\n },\n): ConnectedPosition {\n if (side === 'top' || side === 'bottom') {\n const isBottom = side === 'bottom';\n\n return {\n originX: options.align,\n originY: isBottom ? 'bottom' : 'top',\n overlayX: options.align,\n overlayY: isBottom ? 'top' : 'bottom',\n offsetX: options.alignOffset,\n offsetY: isBottom ? options.sideOffset : -options.sideOffset,\n };\n }\n\n const isRight = side === 'right';\n\n return {\n originX: isRight ? 'end' : 'start',\n originY: verticalPosition(options.align),\n overlayX: isRight ? 'start' : 'end',\n overlayY: verticalPosition(options.align),\n offsetX: isRight ? options.sideOffset : -options.sideOffset,\n offsetY: options.alignOffset,\n };\n}\n\nfunction verticalPosition(align: FrTooltipAlignment): 'top' | 'center' | 'bottom' {\n if (align === 'center') {\n return 'center';\n }\n\n return align === 'start' ? 'top' : 'bottom';\n}\n\nfunction oppositeSide(side: FrTooltipSide): FrTooltipSide {\n if (side === 'top') {\n return 'bottom';\n }\n\n if (side === 'bottom') {\n return 'top';\n }\n\n if (side === 'left') {\n return 'right';\n }\n\n return 'left';\n}\n","export const FR_TOOLTIP_TOKEN_NAMES = [\r\n '--frame-tooltip-content-bg',\r\n '--frame-tooltip-content-color',\r\n '--frame-tooltip-content-border',\r\n '--frame-tooltip-content-radius',\r\n '--frame-tooltip-content-shadow',\r\n '--frame-tooltip-content-padding',\r\n '--frame-tooltip-content-max-width',\r\n '--frame-tooltip-content-font-size',\r\n '--frame-tooltip-content-font-weight',\r\n '--frame-tooltip-content-line-height',\r\n '--frame-tooltip-arrow-size',\r\n '--frame-tooltip-motion-duration',\r\n '--frame-tooltip-motion-distance',\r\n '--frame-tooltip-motion-scale',\r\n '--frame-tooltip-motion-easing',\r\n] as const;\r\n","import { ConnectedOverlayPositionChange, Overlay, OverlayRef } from '@angular/cdk/overlay';\r\nimport { ComponentPortal } from '@angular/cdk/portal';\r\nimport { DOCUMENT, NgTemplateOutlet, isPlatformBrowser } from '@angular/common';\r\nimport {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n Component,\r\n ComponentRef,\r\n DestroyRef,\r\n Directive,\r\n ElementRef,\r\n PLATFORM_ID,\r\n TemplateRef,\r\n booleanAttribute,\r\n effect,\r\n inject,\r\n input,\r\n signal,\r\n numberAttribute,\r\n} from '@angular/core';\r\nimport { clampNumber, parseCssPixelValue } from '@frame-ui-ng/components/utils';\r\n\r\nimport { buildTooltipPositions } from './tooltip.position';\r\nimport { FR_TOOLTIP_TOKEN_NAMES } from './tooltip.tokens';\r\nimport { FrTooltipAlignment, FrTooltipSide } from './tooltip.types';\r\n\r\nlet nextInlineTooltipId = 0;\r\n\r\n@Directive({\r\n selector: '[frTooltip]',\r\n host: {\r\n class: 'frame-tooltip__trigger',\r\n '[attr.aria-describedby]': 'isOpen() ? tooltipId : null',\r\n '[attr.data-state]': 'isOpen() ? \"open\" : \"closed\"',\r\n },\r\n})\r\nexport class FrTooltipDirective implements AfterViewInit {\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly document = inject(DOCUMENT);\r\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\r\n private readonly overlay = inject(Overlay);\r\n private readonly platformId = inject(PLATFORM_ID);\r\n\r\n readonly content = input<string | TemplateRef<unknown> | null>(null, { alias: 'frTooltip' });\r\n readonly align = input<FrTooltipAlignment>('center', { alias: 'frTooltipAlign' });\r\n readonly alignOffset = input(0, { alias: 'frTooltipAlignOffset' });\r\n readonly arrow = input(false, { alias: 'frTooltipArrow', transform: booleanAttribute });\r\n readonly closeDelay = input(0, { alias: 'frTooltipCloseDelay' });\r\n readonly openDelay = input(0, { alias: 'frTooltipOpenDelay', transform: numberAttribute });\r\n readonly side = input<FrTooltipSide>('top', { alias: 'frTooltipSide' });\r\n readonly sideOffset = input(8, { alias: 'frTooltipSideOffset' });\r\n\r\n protected readonly isOpen = signal(false);\r\n protected readonly tooltipId = `frame-tooltip-inline-${nextInlineTooltipId++}`;\r\n\r\n private closeTimer: ReturnType<typeof setTimeout> | null = null;\r\n private disabledObserver: MutationObserver | null = null;\r\n private openTimer: ReturnType<typeof setTimeout> | null = null;\r\n private overlayRef: OverlayRef | null = null;\r\n private panelRef: ComponentRef<FrTooltipInlinePanel> | null = null;\r\n private arrowFrameId = -1;\r\n private currentSide: FrTooltipSide = this.side();\r\n private pendingArrowSide: FrTooltipSide = this.side();\r\n private triggerElement = this.elementRef.nativeElement;\r\n private wrapped = false;\r\n private wrapper: HTMLElement | null = null;\r\n private teardownListeners: Array<() => void> = [];\r\n\r\n constructor() {\r\n this.destroyRef.onDestroy(() => this.destroy());\r\n\r\n effect(() => {\r\n const content = this.content();\r\n\r\n if (this.panelRef && content) {\r\n this.updatePanelInputs();\r\n }\r\n\r\n if (!content) {\r\n this.close();\r\n }\r\n });\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n if (!isPlatformBrowser(this.platformId)) {\r\n return;\r\n }\r\n\r\n this.ensureDisabledHostWrapper();\r\n this.bindTriggerEvents();\r\n this.observeDisabledState();\r\n }\r\n\r\n private bindTriggerEvents(): void {\r\n const target = this.triggerElement;\r\n\r\n this.teardownListeners.push(this.listen(target, 'mouseenter', () => this.openWithDelay()));\r\n this.teardownListeners.push(this.listen(target, 'mouseleave', () => this.closeWithDelay()));\r\n this.teardownListeners.push(this.listen(target, 'focusin', () => this.openWithDelay()));\r\n this.teardownListeners.push(this.listen(target, 'focusout', () => this.closeWithDelay()));\r\n this.teardownListeners.push(\r\n this.listen(target, 'keydown', (event) => {\r\n const keyboardEvent = event as KeyboardEvent;\r\n\r\n if (keyboardEvent.key === 'Escape') {\r\n keyboardEvent.preventDefault();\r\n this.close();\r\n }\r\n }),\r\n );\r\n }\r\n\r\n private ensureDisabledHostWrapper(): void {\r\n const element = this.elementRef.nativeElement;\r\n\r\n if (!('disabled' in element) || !element.hasAttribute('disabled') || this.wrapped) {\r\n return;\r\n }\r\n\r\n const parent = element.parentNode;\r\n\r\n if (!parent) {\r\n return;\r\n }\r\n\r\n const wrapper = this.document.createElement('span');\r\n wrapper.className = 'frame-tooltip__disabled-trigger';\r\n wrapper.tabIndex = 0;\r\n parent.insertBefore(wrapper, element);\r\n wrapper.appendChild(element);\r\n this.triggerElement = wrapper;\r\n this.wrapper = wrapper;\r\n this.wrapped = true;\r\n }\r\n\r\n private observeDisabledState(): void {\r\n const element = this.elementRef.nativeElement;\r\n\r\n if (!('disabled' in element)) {\r\n return;\r\n }\r\n\r\n this.disabledObserver = new MutationObserver(() => {\r\n if (!element.hasAttribute('disabled') || this.wrapped) {\r\n return;\r\n }\r\n\r\n this.teardownTriggerListeners();\r\n this.ensureDisabledHostWrapper();\r\n this.bindTriggerEvents();\r\n });\r\n this.disabledObserver.observe(element, { attributes: true, attributeFilter: ['disabled'] });\r\n }\r\n\r\n private openWithDelay(): void {\r\n if (!this.content()) {\r\n return;\r\n }\r\n\r\n this.cancelClose();\r\n this.cancelOpen();\r\n\r\n const delay = Math.max(0, this.openDelay());\r\n\r\n if (delay === 0) {\r\n this.open();\r\n return;\r\n }\r\n\r\n this.openTimer = setTimeout(() => this.open(), delay);\r\n }\r\n\r\n private closeWithDelay(): void {\r\n this.cancelOpen();\r\n this.cancelClose();\r\n\r\n const delay = Math.max(0, this.closeDelay());\r\n\r\n if (delay === 0) {\r\n this.close();\r\n return;\r\n }\r\n\r\n this.closeTimer = setTimeout(() => this.close(), delay);\r\n }\r\n\r\n private open(): void {\r\n const content = this.content();\r\n\r\n if (!content) {\r\n return;\r\n }\r\n\r\n if (!this.overlayRef) {\r\n this.overlayRef = this.createOverlay();\r\n }\r\n\r\n if (!this.overlayRef.hasAttached()) {\r\n this.panelRef = this.overlayRef.attach(new ComponentPortal(FrTooltipInlinePanel));\r\n this.updatePanelInputs();\r\n this.syncCustomPropertiesToOverlay();\r\n this.scheduleArrowPosition();\r\n }\r\n\r\n this.isOpen.set(true);\r\n }\r\n\r\n private close(): void {\r\n this.cancelOpen();\r\n this.cancelClose();\r\n this.overlayRef?.detach();\r\n this.panelRef = null;\r\n this.isOpen.set(false);\r\n }\r\n\r\n private createOverlay(): OverlayRef {\r\n const positionStrategy = this.overlay\r\n .position()\r\n .flexibleConnectedTo(this.triggerElement)\r\n .withPositions(this.positions())\r\n .withPush(true)\r\n .withViewportMargin(8);\r\n\r\n positionStrategy.positionChanges.subscribe((event) => this.handlePositionChange(event));\r\n\r\n const overlayRef = this.overlay.create({\r\n panelClass: ['frame-tooltip-overlay', `frame-tooltip-overlay--${this.side()}`],\r\n positionStrategy,\r\n scrollStrategy: this.overlay.scrollStrategies.reposition(),\r\n });\r\n\r\n overlayRef.keydownEvents().subscribe((event) => {\r\n if (event.key === 'Escape') {\r\n event.preventDefault();\r\n this.close();\r\n }\r\n });\r\n\r\n return overlayRef;\r\n }\r\n\r\n private positions() {\r\n return buildTooltipPositions({\r\n align: this.align(),\r\n alignOffset: this.alignOffset(),\r\n side: this.side(),\r\n sideOffset: this.sideOffset(),\r\n });\r\n }\r\n\r\n private handlePositionChange(event: ConnectedOverlayPositionChange): void {\r\n const pair = event.connectionPair;\r\n const side = pair.overlayY === 'top'\r\n ? 'bottom'\r\n : pair.overlayY === 'bottom'\r\n ? 'top'\r\n : pair.overlayX === 'start'\r\n ? 'right'\r\n : 'left';\r\n\r\n this.panelRef?.setInput('side', side);\r\n this.currentSide = side;\r\n this.overlayRef?.removePanelClass(['frame-tooltip-overlay--top', 'frame-tooltip-overlay--right', 'frame-tooltip-overlay--bottom', 'frame-tooltip-overlay--left']);\r\n this.overlayRef?.addPanelClass(`frame-tooltip-overlay--${side}`);\r\n this.scheduleArrowPosition(side);\r\n }\r\n\r\n private updatePanelInputs(): void {\r\n const panelRef = this.panelRef;\r\n\r\n if (!panelRef) {\r\n return;\r\n }\r\n\r\n panelRef.setInput('arrow', this.arrow());\r\n panelRef.setInput('content', this.content() ?? '');\r\n panelRef.setInput('id', this.tooltipId);\r\n panelRef.setInput('side', this.side());\r\n this.currentSide = this.side();\r\n }\r\n\r\n private syncCustomPropertiesToOverlay(): void {\r\n const overlayPane = this.overlayRef?.overlayElement;\r\n const panel = overlayPane?.querySelector<HTMLElement>('.frame-tooltip__content');\r\n\r\n if (!overlayPane || !panel) {\r\n return;\r\n }\r\n\r\n this.copyCustomProperties(this.elementRef.nativeElement, overlayPane, panel);\r\n\r\n if (this.wrapper) {\r\n this.copyCustomProperties(this.wrapper, overlayPane, panel);\r\n }\r\n }\r\n\r\n private copyCustomProperties(source: HTMLElement, overlayPane: HTMLElement, panel: HTMLElement): void {\r\n const sourceStyles = getComputedStyle(source);\r\n\r\n for (const propertyName of FR_TOOLTIP_TOKEN_NAMES) {\r\n const propertyValue = sourceStyles.getPropertyValue(propertyName);\r\n\r\n if (propertyValue.trim()) {\r\n overlayPane.style.setProperty(propertyName, propertyValue);\r\n panel.style.setProperty(propertyName, propertyValue);\r\n }\r\n }\r\n\r\n for (let index = 0; index < sourceStyles.length; index += 1) {\r\n const propertyName = sourceStyles.item(index);\r\n\r\n if (!propertyName.startsWith('--frame-tooltip-')) {\r\n continue;\r\n }\r\n\r\n const propertyValue = sourceStyles.getPropertyValue(propertyName);\r\n overlayPane.style.setProperty(propertyName, propertyValue);\r\n panel.style.setProperty(propertyName, propertyValue);\r\n }\r\n }\r\n\r\n private scheduleArrowPosition(side = this.currentSide): void {\r\n this.pendingArrowSide = side;\r\n\r\n if (!this.arrow() || this.arrowFrameId !== -1) {\r\n return;\r\n }\r\n\r\n this.arrowFrameId = requestAnimationFrame(() => {\r\n this.arrowFrameId = -1;\r\n this.syncArrowPosition(this.pendingArrowSide);\r\n });\r\n }\r\n\r\n private syncArrowPosition(side: FrTooltipSide): void {\r\n const panel = this.overlayRef?.overlayElement.querySelector<HTMLElement>('.frame-tooltip__content');\r\n\r\n if (!panel) {\r\n return;\r\n }\r\n\r\n const panelRect = panel.getBoundingClientRect();\r\n const triggerRect = this.triggerElement.getBoundingClientRect();\r\n\r\n if (!panelRect.width || !panelRect.height || !triggerRect.width || !triggerRect.height) {\r\n return;\r\n }\r\n\r\n const arrowSize = parseCssPixelValue(\r\n getComputedStyle(panel).getPropertyValue('--frame-tooltip-arrow-size'),\r\n 8,\r\n );\r\n const edgeInset = arrowSize / 2;\r\n\r\n if (side === 'top' || side === 'bottom') {\r\n const triggerCenter = triggerRect.left + triggerRect.width / 2 - panelRect.left;\r\n const arrowX = clampNumber(triggerCenter - arrowSize / 2, edgeInset, panelRect.width - arrowSize - edgeInset);\r\n panel.style.setProperty('--frame-tooltip-arrow-x', `${Math.round(arrowX * 100) / 100}px`);\r\n return;\r\n }\r\n\r\n const triggerCenter = triggerRect.top + triggerRect.height / 2 - panelRect.top;\r\n const arrowY = clampNumber(triggerCenter - arrowSize / 2, edgeInset, panelRect.height - arrowSize - edgeInset);\r\n panel.style.setProperty('--frame-tooltip-arrow-y', `${Math.round(arrowY * 100) / 100}px`);\r\n }\r\n\r\n private listen(target: HTMLElement, eventName: string, listener: EventListener): () => void {\r\n target.addEventListener(eventName, listener);\r\n return () => target.removeEventListener(eventName, listener);\r\n }\r\n\r\n private cancelOpen(): void {\r\n if (this.openTimer) {\r\n clearTimeout(this.openTimer);\r\n this.openTimer = null;\r\n }\r\n }\r\n\r\n private cancelClose(): void {\r\n if (this.closeTimer) {\r\n clearTimeout(this.closeTimer);\r\n this.closeTimer = null;\r\n }\r\n }\r\n\r\n private destroy(): void {\r\n this.close();\r\n if (this.arrowFrameId !== -1) {\r\n cancelAnimationFrame(this.arrowFrameId);\r\n this.arrowFrameId = -1;\r\n }\r\n this.overlayRef?.dispose();\r\n this.overlayRef = null;\r\n this.disabledObserver?.disconnect();\r\n this.disabledObserver = null;\r\n\r\n this.teardownTriggerListeners();\r\n }\r\n\r\n private teardownTriggerListeners(): void {\r\n for (const teardown of this.teardownListeners) {\r\n teardown();\r\n }\r\n\r\n this.teardownListeners = [];\r\n }\r\n}\r\n\r\n@Directive({\r\n selector: '[frTooltipShortcut]',\r\n host: {\r\n class: 'frame-tooltip__shortcut',\r\n },\r\n})\r\nexport class FrTooltipShortcut {}\r\n\r\n@Component({\r\n selector: 'frame-tooltip-inline-panel',\r\n imports: [NgTemplateOutlet],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n template: `\r\n <div\r\n class=\"frame-tooltip__content\"\r\n role=\"tooltip\"\r\n [id]=\"id()\"\r\n [attr.data-side]=\"side()\"\r\n [attr.data-arrow]=\"arrow() ? '' : null\"\r\n >\r\n @if (templateContent(); as template) {\r\n <ng-container [ngTemplateOutlet]=\"template\" />\r\n } @else {\r\n {{ textContent() }}\r\n }\r\n </div>\r\n `,\r\n})\r\nclass FrTooltipInlinePanel {\r\n readonly arrow = input(false, { transform: booleanAttribute });\r\n readonly content = input<string | TemplateRef<unknown>>('');\r\n readonly id = input.required<string>();\r\n readonly side = input('top');\r\n\r\n protected readonly templateContent = signal<TemplateRef<unknown> | null>(null);\r\n protected readonly textContent = signal('');\r\n\r\n constructor() {\r\n effect(() => {\r\n const content = this.content();\r\n\r\n if (content instanceof TemplateRef) {\r\n this.templateContent.set(content);\r\n this.textContent.set('');\r\n return;\r\n }\r\n\r\n this.templateContent.set(null);\r\n this.textContent.set(content ?? '');\r\n });\r\n }\r\n}\r\n","export const FR_TOOLTIP_SIDES = ['top', 'right', 'bottom', 'left'] as const;\nexport const FR_TOOLTIP_ALIGNMENTS = ['start', 'center', 'end'] as const;\n\nexport type FrTooltipSide = (typeof FR_TOOLTIP_SIDES)[number];\nexport type FrTooltipAlignment = (typeof FR_TOOLTIP_ALIGNMENTS)[number];\n","import { NgModule } from '@angular/core';\r\n\r\nimport { FrTooltipDirective, FrTooltipShortcut } from './src/tooltip.directive';\r\n\r\n@NgModule({\r\n imports: [FrTooltipDirective, FrTooltipShortcut],\r\n exports: [FrTooltipDirective, FrTooltipShortcut],\r\n})\r\nexport class FrTooltipModule {}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"frame-ui-ng-components-tooltip.mjs","sources":["../../../projects/components/tooltip/src/tooltip.position.ts","../../../projects/components/tooltip/src/tooltip.tokens.ts","../../../projects/components/tooltip/src/tooltip.directive.ts","../../../projects/components/tooltip/src/tooltip.types.ts","../../../projects/components/tooltip/tooltip.module.ts","../../../projects/components/tooltip/frame-ui-ng-components-tooltip.ts"],"sourcesContent":["import { ConnectedPosition } from '@angular/cdk/overlay';\n\nimport { FrTooltipAlignment, FrTooltipSide } from './tooltip.types';\n\nexport function buildTooltipPositions(options: {\n align: FrTooltipAlignment;\n alignOffset: number;\n side: FrTooltipSide;\n sideOffset: number;\n}): ConnectedPosition[] {\n const primary = buildPosition(options.side, options);\n const opposite = oppositeSide(options.side);\n const fallback = buildPosition(opposite, {\n align: options.align,\n alignOffset: options.alignOffset,\n sideOffset: options.sideOffset,\n });\n\n return [primary, fallback];\n}\n\nfunction buildPosition(\n side: FrTooltipSide,\n options: {\n align: FrTooltipAlignment;\n alignOffset: number;\n sideOffset: number;\n },\n): ConnectedPosition {\n if (side === 'top' || side === 'bottom') {\n const isBottom = side === 'bottom';\n\n return {\n originX: options.align,\n originY: isBottom ? 'bottom' : 'top',\n overlayX: options.align,\n overlayY: isBottom ? 'top' : 'bottom',\n offsetX: options.alignOffset,\n offsetY: isBottom ? options.sideOffset : -options.sideOffset,\n };\n }\n\n const isRight = side === 'right';\n\n return {\n originX: isRight ? 'end' : 'start',\n originY: verticalPosition(options.align),\n overlayX: isRight ? 'start' : 'end',\n overlayY: verticalPosition(options.align),\n offsetX: isRight ? options.sideOffset : -options.sideOffset,\n offsetY: options.alignOffset,\n };\n}\n\nfunction verticalPosition(align: FrTooltipAlignment): 'top' | 'center' | 'bottom' {\n if (align === 'center') {\n return 'center';\n }\n\n return align === 'start' ? 'top' : 'bottom';\n}\n\nfunction oppositeSide(side: FrTooltipSide): FrTooltipSide {\n if (side === 'top') {\n return 'bottom';\n }\n\n if (side === 'bottom') {\n return 'top';\n }\n\n if (side === 'left') {\n return 'right';\n }\n\n return 'left';\n}\n","export const FR_TOOLTIP_TOKEN_NAMES = [\r\n '--frame-tooltip-content-bg',\r\n '--frame-tooltip-content-color',\r\n '--frame-tooltip-content-border',\r\n '--frame-tooltip-content-radius',\r\n '--frame-tooltip-content-shadow',\r\n '--frame-tooltip-content-padding',\r\n '--frame-tooltip-content-max-width',\r\n '--frame-tooltip-content-font-size',\r\n '--frame-tooltip-content-font-weight',\r\n '--frame-tooltip-content-line-height',\r\n '--frame-tooltip-arrow-size',\r\n '--frame-tooltip-motion-duration',\r\n '--frame-tooltip-motion-distance',\r\n '--frame-tooltip-motion-scale',\r\n '--frame-tooltip-motion-easing',\r\n] as const;\r\n","import { ConnectedOverlayPositionChange, Overlay, OverlayRef } from '@angular/cdk/overlay';\r\nimport { ComponentPortal } from '@angular/cdk/portal';\r\nimport { DOCUMENT, NgTemplateOutlet, isPlatformBrowser } from '@angular/common';\r\nimport {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n Component,\r\n ComponentRef,\r\n DestroyRef,\r\n Directive,\r\n DoCheck,\r\n ElementRef,\r\n PLATFORM_ID,\r\n TemplateRef,\r\n booleanAttribute,\r\n computed,\r\n inject,\r\n input,\r\n signal,\r\n numberAttribute,\r\n} from '@angular/core';\r\nimport { clampNumber, parseCssPixelValue } from '@frame-ui-ng/components/utils';\r\n\r\nimport { buildTooltipPositions } from './tooltip.position';\r\nimport { FR_TOOLTIP_TOKEN_NAMES } from './tooltip.tokens';\r\nimport { FrTooltipAlignment, FrTooltipSide } from './tooltip.types';\r\n\r\nlet nextInlineTooltipId = 0;\r\n\r\n/** Tooltip trigger directive with delay and placement options. */\r\n@Directive({\r\n selector: '[frTooltip]',\r\n host: {\r\n class: 'frame-tooltip__trigger',\r\n '[attr.aria-describedby]': 'isOpen() ? tooltipId : null',\r\n '[attr.data-state]': 'isOpen() ? \"open\" : \"closed\"',\r\n },\r\n})\r\nexport class FrTooltipDirective implements AfterViewInit, DoCheck {\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly document = inject(DOCUMENT);\r\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\r\n private readonly overlay = inject(Overlay);\r\n private readonly platformId = inject(PLATFORM_ID);\r\n\r\n readonly content = input<string | TemplateRef<unknown> | null>(null, { alias: 'frTooltip' });\r\n readonly align = input<FrTooltipAlignment>('center', { alias: 'frTooltipAlign' });\r\n readonly alignOffset = input(0, { alias: 'frTooltipAlignOffset' });\r\n readonly arrow = input(false, { alias: 'frTooltipArrow', transform: booleanAttribute });\r\n readonly closeDelay = input(0, { alias: 'frTooltipCloseDelay' });\r\n readonly openDelay = input(0, { alias: 'frTooltipOpenDelay', transform: numberAttribute });\r\n readonly side = input<FrTooltipSide>('top', { alias: 'frTooltipSide' });\r\n readonly sideOffset = input(8, { alias: 'frTooltipSideOffset' });\r\n\r\n protected readonly isOpen = signal(false);\r\n protected readonly tooltipId = `frame-tooltip-inline-${nextInlineTooltipId++}`;\r\n\r\n private closeTimer: ReturnType<typeof setTimeout> | null = null;\r\n private disabledObserver: MutationObserver | null = null;\r\n private openTimer: ReturnType<typeof setTimeout> | null = null;\r\n private overlayRef: OverlayRef | null = null;\r\n private panelRef: ComponentRef<FrTooltipInlinePanel> | null = null;\r\n private arrowFrameId = -1;\r\n private currentSide: FrTooltipSide = this.side();\r\n private pendingArrowSide: FrTooltipSide = this.side();\r\n private triggerElement = this.elementRef.nativeElement;\r\n private wrapped = false;\r\n private wrapper: HTMLElement | null = null;\r\n private teardownListeners: Array<() => void> = [];\r\n private lastPanelInputKey = '';\r\n\r\n constructor() {\r\n this.destroyRef.onDestroy(() => this.destroy());\r\n }\r\n\r\n ngDoCheck(): void {\r\n const content = this.content();\r\n\r\n if (!content) {\r\n this.close();\r\n this.lastPanelInputKey = '';\r\n return;\r\n }\r\n\r\n const panelInputKey = [content, this.arrow(), this.side(), this.tooltipId].map(String).join('|');\r\n\r\n if (this.panelRef && panelInputKey !== this.lastPanelInputKey) {\r\n this.updatePanelInputs();\r\n }\r\n\r\n this.lastPanelInputKey = panelInputKey;\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n if (!isPlatformBrowser(this.platformId)) {\r\n return;\r\n }\r\n\r\n this.ensureDisabledHostWrapper();\r\n this.bindTriggerEvents();\r\n this.observeDisabledState();\r\n }\r\n\r\n private bindTriggerEvents(): void {\r\n const target = this.triggerElement;\r\n\r\n this.teardownListeners.push(this.listen(target, 'mouseenter', () => this.openWithDelay()));\r\n this.teardownListeners.push(this.listen(target, 'mouseleave', () => this.closeWithDelay()));\r\n this.teardownListeners.push(this.listen(target, 'focusin', () => this.openWithDelay()));\r\n this.teardownListeners.push(this.listen(target, 'focusout', () => this.closeWithDelay()));\r\n this.teardownListeners.push(\r\n this.listen(target, 'keydown', (event) => {\r\n const keyboardEvent = event as KeyboardEvent;\r\n\r\n if (keyboardEvent.key === 'Escape') {\r\n keyboardEvent.preventDefault();\r\n this.close();\r\n }\r\n }),\r\n );\r\n }\r\n\r\n private ensureDisabledHostWrapper(): void {\r\n const element = this.elementRef.nativeElement;\r\n\r\n if (!('disabled' in element) || !element.hasAttribute('disabled') || this.wrapped) {\r\n return;\r\n }\r\n\r\n const parent = element.parentNode;\r\n\r\n if (!parent) {\r\n return;\r\n }\r\n\r\n const wrapper = this.document.createElement('span');\r\n // Disabled form controls do not emit pointer/focus events, so the wrapper becomes the trigger.\r\n wrapper.className = 'frame-tooltip__disabled-trigger';\r\n wrapper.tabIndex = 0;\r\n parent.insertBefore(wrapper, element);\r\n wrapper.appendChild(element);\r\n this.triggerElement = wrapper;\r\n this.wrapper = wrapper;\r\n this.wrapped = true;\r\n }\r\n\r\n private observeDisabledState(): void {\r\n const element = this.elementRef.nativeElement;\r\n\r\n if (!('disabled' in element)) {\r\n return;\r\n }\r\n\r\n this.disabledObserver = new MutationObserver(() => {\r\n if (!element.hasAttribute('disabled') || this.wrapped) {\r\n return;\r\n }\r\n\r\n this.teardownTriggerListeners();\r\n this.ensureDisabledHostWrapper();\r\n this.bindTriggerEvents();\r\n });\r\n this.disabledObserver.observe(element, { attributes: true, attributeFilter: ['disabled'] });\r\n }\r\n\r\n private openWithDelay(): void {\r\n if (!this.content()) {\r\n return;\r\n }\r\n\r\n this.cancelClose();\r\n this.cancelOpen();\r\n\r\n const delay = Math.max(0, this.openDelay());\r\n\r\n if (delay === 0) {\r\n this.open();\r\n return;\r\n }\r\n\r\n this.openTimer = setTimeout(() => this.open(), delay);\r\n }\r\n\r\n private closeWithDelay(): void {\r\n this.cancelOpen();\r\n this.cancelClose();\r\n\r\n const delay = Math.max(0, this.closeDelay());\r\n\r\n if (delay === 0) {\r\n this.close();\r\n return;\r\n }\r\n\r\n this.closeTimer = setTimeout(() => this.close(), delay);\r\n }\r\n\r\n private open(): void {\r\n const content = this.content();\r\n\r\n if (!content) {\r\n return;\r\n }\r\n\r\n if (!this.overlayRef) {\r\n this.overlayRef = this.createOverlay();\r\n }\r\n\r\n if (!this.overlayRef.hasAttached()) {\r\n this.panelRef = this.overlayRef.attach(new ComponentPortal(FrTooltipInlinePanel));\r\n this.updatePanelInputs();\r\n this.syncCustomPropertiesToOverlay();\r\n this.scheduleArrowPosition();\r\n }\r\n\r\n this.isOpen.set(true);\r\n }\r\n\r\n private close(): void {\r\n this.cancelOpen();\r\n this.cancelClose();\r\n this.overlayRef?.detach();\r\n this.panelRef = null;\r\n this.isOpen.set(false);\r\n }\r\n\r\n private createOverlay(): OverlayRef {\r\n const positionStrategy = this.overlay\r\n .position()\r\n .flexibleConnectedTo(this.triggerElement)\r\n .withPositions(this.positions())\r\n .withPush(true)\r\n .withViewportMargin(8);\r\n\r\n positionStrategy.positionChanges.subscribe((event) => this.handlePositionChange(event));\r\n\r\n const overlayRef = this.overlay.create({\r\n panelClass: ['frame-tooltip-overlay', `frame-tooltip-overlay--${this.side()}`],\r\n positionStrategy,\r\n scrollStrategy: this.overlay.scrollStrategies.reposition(),\r\n });\r\n\r\n overlayRef.keydownEvents().subscribe((event) => {\r\n if (event.key === 'Escape') {\r\n event.preventDefault();\r\n this.close();\r\n }\r\n });\r\n\r\n return overlayRef;\r\n }\r\n\r\n private positions() {\r\n return buildTooltipPositions({\r\n align: this.align(),\r\n alignOffset: this.alignOffset(),\r\n side: this.side(),\r\n sideOffset: this.sideOffset(),\r\n });\r\n }\r\n\r\n private handlePositionChange(event: ConnectedOverlayPositionChange): void {\r\n const pair = event.connectionPair;\r\n const side = pair.overlayY === 'top'\r\n ? 'bottom'\r\n : pair.overlayY === 'bottom'\r\n ? 'top'\r\n : pair.overlayX === 'start'\r\n ? 'right'\r\n : 'left';\r\n\r\n this.panelRef?.setInput('side', side);\r\n this.currentSide = side;\r\n this.overlayRef?.removePanelClass(['frame-tooltip-overlay--top', 'frame-tooltip-overlay--right', 'frame-tooltip-overlay--bottom', 'frame-tooltip-overlay--left']);\r\n this.overlayRef?.addPanelClass(`frame-tooltip-overlay--${side}`);\r\n this.scheduleArrowPosition(side);\r\n }\r\n\r\n private updatePanelInputs(): void {\r\n const panelRef = this.panelRef;\r\n\r\n if (!panelRef) {\r\n return;\r\n }\r\n\r\n panelRef.setInput('arrow', this.arrow());\r\n panelRef.setInput('content', this.content() ?? '');\r\n panelRef.setInput('id', this.tooltipId);\r\n panelRef.setInput('side', this.side());\r\n this.currentSide = this.side();\r\n }\r\n\r\n private syncCustomPropertiesToOverlay(): void {\r\n const overlayPane = this.overlayRef?.overlayElement;\r\n const panel = overlayPane?.querySelector<HTMLElement>('.frame-tooltip__content');\r\n\r\n if (!overlayPane || !panel) {\r\n return;\r\n }\r\n\r\n this.copyCustomProperties(this.elementRef.nativeElement, overlayPane, panel);\r\n\r\n if (this.wrapper) {\r\n this.copyCustomProperties(this.wrapper, overlayPane, panel);\r\n }\r\n }\r\n\r\n private copyCustomProperties(source: HTMLElement, overlayPane: HTMLElement, panel: HTMLElement): void {\r\n const sourceStyles = getComputedStyle(source);\r\n\r\n // Overlay content is portaled, so copy theme tokens from the trigger into the pane.\r\n for (const propertyName of FR_TOOLTIP_TOKEN_NAMES) {\r\n const propertyValue = sourceStyles.getPropertyValue(propertyName);\r\n\r\n if (propertyValue.trim()) {\r\n overlayPane.style.setProperty(propertyName, propertyValue);\r\n panel.style.setProperty(propertyName, propertyValue);\r\n }\r\n }\r\n\r\n for (let index = 0; index < sourceStyles.length; index += 1) {\r\n const propertyName = sourceStyles.item(index);\r\n\r\n if (!propertyName.startsWith('--frame-tooltip-')) {\r\n continue;\r\n }\r\n\r\n const propertyValue = sourceStyles.getPropertyValue(propertyName);\r\n overlayPane.style.setProperty(propertyName, propertyValue);\r\n panel.style.setProperty(propertyName, propertyValue);\r\n }\r\n }\r\n\r\n private scheduleArrowPosition(side = this.currentSide): void {\r\n this.pendingArrowSide = side;\r\n\r\n if (!this.arrow() || this.arrowFrameId !== -1) {\r\n return;\r\n }\r\n\r\n // Coalesce position changes until CDK has applied the latest overlay geometry.\r\n this.arrowFrameId = requestAnimationFrame(() => {\r\n this.arrowFrameId = -1;\r\n this.syncArrowPosition(this.pendingArrowSide);\r\n });\r\n }\r\n\r\n private syncArrowPosition(side: FrTooltipSide): void {\r\n const panel = this.overlayRef?.overlayElement.querySelector<HTMLElement>('.frame-tooltip__content');\r\n\r\n if (!panel) {\r\n return;\r\n }\r\n\r\n const panelRect = panel.getBoundingClientRect();\r\n const triggerRect = this.triggerElement.getBoundingClientRect();\r\n\r\n if (!panelRect.width || !panelRect.height || !triggerRect.width || !triggerRect.height) {\r\n return;\r\n }\r\n\r\n const arrowSize = parseCssPixelValue(\r\n getComputedStyle(panel).getPropertyValue('--frame-tooltip-arrow-size'),\r\n 8,\r\n );\r\n const edgeInset = arrowSize / 2;\r\n\r\n if (side === 'top' || side === 'bottom') {\r\n const triggerCenter = triggerRect.left + triggerRect.width / 2 - panelRect.left;\r\n const arrowX = clampNumber(triggerCenter - arrowSize / 2, edgeInset, panelRect.width - arrowSize - edgeInset);\r\n panel.style.setProperty('--frame-tooltip-arrow-x', `${Math.round(arrowX * 100) / 100}px`);\r\n return;\r\n }\r\n\r\n const triggerCenter = triggerRect.top + triggerRect.height / 2 - panelRect.top;\r\n const arrowY = clampNumber(triggerCenter - arrowSize / 2, edgeInset, panelRect.height - arrowSize - edgeInset);\r\n panel.style.setProperty('--frame-tooltip-arrow-y', `${Math.round(arrowY * 100) / 100}px`);\r\n }\r\n\r\n private listen(target: HTMLElement, eventName: string, listener: EventListener): () => void {\r\n target.addEventListener(eventName, listener);\r\n return () => target.removeEventListener(eventName, listener);\r\n }\r\n\r\n private cancelOpen(): void {\r\n if (this.openTimer) {\r\n clearTimeout(this.openTimer);\r\n this.openTimer = null;\r\n }\r\n }\r\n\r\n private cancelClose(): void {\r\n if (this.closeTimer) {\r\n clearTimeout(this.closeTimer);\r\n this.closeTimer = null;\r\n }\r\n }\r\n\r\n private destroy(): void {\r\n this.close();\r\n if (this.arrowFrameId !== -1) {\r\n cancelAnimationFrame(this.arrowFrameId);\r\n this.arrowFrameId = -1;\r\n }\r\n this.overlayRef?.dispose();\r\n this.overlayRef = null;\r\n this.disabledObserver?.disconnect();\r\n this.disabledObserver = null;\r\n\r\n this.teardownTriggerListeners();\r\n }\r\n\r\n private teardownTriggerListeners(): void {\r\n for (const teardown of this.teardownListeners) {\r\n teardown();\r\n }\r\n\r\n this.teardownListeners = [];\r\n }\r\n}\r\n\r\n/** Shortcut slot for tooltip. */\r\n@Directive({\r\n selector: '[frTooltipShortcut]',\r\n host: {\r\n class: 'frame-tooltip__shortcut',\r\n },\r\n})\r\nexport class FrTooltipShortcut {}\r\n\r\n/** Inline overlay panel that renders tooltip text or template content. */\r\n@Component({\r\n selector: 'frame-tooltip-inline-panel',\r\n imports: [NgTemplateOutlet],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n template: `\r\n <div\r\n class=\"frame-tooltip__content\"\r\n role=\"tooltip\"\r\n [id]=\"id()\"\r\n [attr.data-side]=\"side()\"\r\n [attr.data-arrow]=\"arrow() ? '' : null\"\r\n >\r\n @if (templateContent(); as template) {\r\n <ng-container [ngTemplateOutlet]=\"template\" />\r\n } @else {\r\n {{ textContent() }}\r\n }\r\n </div>\r\n `,\r\n})\r\nclass FrTooltipInlinePanel {\r\n readonly arrow = input(false, { transform: booleanAttribute });\r\n readonly content = input<string | TemplateRef<unknown>>('');\r\n readonly id = input.required<string>();\r\n readonly side = input('top');\r\n\r\n protected readonly templateContent = computed(() => {\r\n const content = this.content();\r\n return content instanceof TemplateRef ? content : null;\r\n });\r\n protected readonly textContent = computed(() => {\r\n const content = this.content();\r\n return content instanceof TemplateRef ? '' : content;\r\n });\r\n}\r\n\r\n","export const FR_TOOLTIP_SIDES = ['top', 'right', 'bottom', 'left'] as const;\nexport const FR_TOOLTIP_ALIGNMENTS = ['start', 'center', 'end'] as const;\n\nexport type FrTooltipSide = (typeof FR_TOOLTIP_SIDES)[number];\nexport type FrTooltipAlignment = (typeof FR_TOOLTIP_ALIGNMENTS)[number];\n","import { NgModule } from '@angular/core';\r\n\r\nimport { FrTooltipDirective, FrTooltipShortcut } from './src/tooltip.directive';\r\n\r\n@NgModule({\r\n imports: [FrTooltipDirective, FrTooltipShortcut],\r\n exports: [FrTooltipDirective, FrTooltipShortcut],\r\n})\r\nexport class FrTooltipModule {}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { inject, DestroyRef, ElementRef, signal, input, computed, Directive, TemplateRef, ViewContainerRef, effect, NgModule } from '@angular/core';
2
+ import { inject, DestroyRef, ElementRef, signal, input, computed, Directive, TemplateRef, ViewContainerRef, NgModule } from '@angular/core';
3
3
  import { clampNumber } from '@frame-ui-ng/components/utils';
4
4
 
5
5
  function calculateVirtualRange(options) {
@@ -45,6 +45,7 @@ function calculateScrollOffsetForIndex(index, alignment, itemSize, viewportSize,
45
45
  }
46
46
  }
47
47
 
48
+ /** Viewport controller for virtual scrolling. */
48
49
  class FrVirtualViewport {
49
50
  destroyRef = inject(DestroyRef);
50
51
  elementRef = inject(ElementRef);
@@ -88,6 +89,7 @@ class FrVirtualViewport {
88
89
  }
89
90
  scrollToIndex(index, alignment = 'auto') {
90
91
  const element = this.elementRef.nativeElement;
92
+ // Virtual scrolling assumes fixed item heights, so index math can stay O(1).
91
93
  const nextScrollTop = calculateScrollOffsetForIndex(index, alignment, this.itemSize(), element.clientHeight, this.totalCount(), element.scrollTop);
92
94
  element.scrollTop = nextScrollTop;
93
95
  this.scrollTop.set(nextScrollTop);
@@ -121,6 +123,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
121
123
  }]
122
124
  }], ctorParameters: () => [], propDecorators: { itemSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "itemSize", required: true }] }], overscan: [{ type: i0.Input, args: [{ isSignal: true, alias: "overscan", required: false }] }], height: [{ type: i0.Input, args: [{ isSignal: true, alias: "height", required: false }] }] } });
123
125
 
126
+ /** Measured content wrapper for virtual scrolling. */
124
127
  class FrVirtualContent {
125
128
  viewport = inject(FrVirtualViewport);
126
129
  before = computed(() => this.viewport.before(), ...(ngDevMode ? [{ debugName: "before" }] : /* istanbul ignore next */ []));
@@ -140,6 +143,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
140
143
  }]
141
144
  }] });
142
145
 
146
+ /** Structural directive for rendering virtualized ranges. */
143
147
  class FrVirtualFor {
144
148
  templateRef = inject(TemplateRef);
145
149
  viewContainerRef = inject(ViewContainerRef);
@@ -147,6 +151,7 @@ class FrVirtualFor {
147
151
  views = [];
148
152
  frVirtualForOf = input.required(...(ngDevMode ? [{ debugName: "frVirtualForOf" }] : /* istanbul ignore next */ []));
149
153
  frVirtualForTrackBy = input(null, ...(ngDevMode ? [{ debugName: "frVirtualForTrackBy" }] : /* istanbul ignore next */ []));
154
+ lastRenderKey = '';
150
155
  slice = computed(() => {
151
156
  const items = this.frVirtualForOf();
152
157
  const start = this.viewport.startIndex();
@@ -157,12 +162,21 @@ class FrVirtualFor {
157
162
  visible: items.slice(start, end),
158
163
  };
159
164
  }, ...(ngDevMode ? [{ debugName: "slice" }] : /* istanbul ignore next */ []));
160
- constructor() {
161
- effect(() => {
162
- const items = this.frVirtualForOf();
163
- this.viewport.setTotalCount(items.length);
164
- this.render();
165
- });
165
+ ngDoCheck() {
166
+ const items = this.frVirtualForOf();
167
+ const renderKey = [
168
+ items,
169
+ items.length,
170
+ this.viewport.startIndex(),
171
+ this.viewport.endIndex(),
172
+ this.frVirtualForTrackBy(),
173
+ ].map(String).join('|');
174
+ this.viewport.setTotalCount(items.length);
175
+ if (renderKey === this.lastRenderKey) {
176
+ return;
177
+ }
178
+ this.lastRenderKey = renderKey;
179
+ this.render();
166
180
  }
167
181
  static ngTemplateContextGuard(_directive, _context) {
168
182
  return true;
@@ -215,8 +229,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
215
229
  args: [{
216
230
  selector: '[frVirtualFor][frVirtualForOf]',
217
231
  }]
218
- }], ctorParameters: () => [], propDecorators: { frVirtualForOf: [{ type: i0.Input, args: [{ isSignal: true, alias: "frVirtualForOf", required: true }] }], frVirtualForTrackBy: [{ type: i0.Input, args: [{ isSignal: true, alias: "frVirtualForTrackBy", required: false }] }] } });
232
+ }], propDecorators: { frVirtualForOf: [{ type: i0.Input, args: [{ isSignal: true, alias: "frVirtualForOf", required: true }] }], frVirtualForTrackBy: [{ type: i0.Input, args: [{ isSignal: true, alias: "frVirtualForTrackBy", required: false }] }] } });
219
233
 
234
+ /** List wrapper for virtualized items. */
220
235
  class FrVirtualList {
221
236
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrVirtualList, deps: [], target: i0.ɵɵFactoryTarget.Directive });
222
237
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrVirtualList, isStandalone: true, selector: "[frVirtualList], frame-virtual-list", host: { classAttribute: "frame-virtual-scroll__list" }, ngImport: i0 });
@@ -230,6 +245,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
230
245
  },
231
246
  }]
232
247
  }] });
248
+ /** Panel wrapper for virtualized content. */
233
249
  class FrVirtualPanel {
234
250
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrVirtualPanel, deps: [], target: i0.ɵɵFactoryTarget.Directive });
235
251
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrVirtualPanel, isStandalone: true, selector: "[frVirtualPanel], frame-virtual-panel", host: { classAttribute: "frame-virtual-scroll__panel" }, ngImport: i0 });
@@ -243,6 +259,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
243
259
  },
244
260
  }]
245
261
  }] });
262
+ /** Item wrapper for virtualized rows. */
246
263
  class FrVirtualItem {
247
264
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrVirtualItem, deps: [], target: i0.ɵɵFactoryTarget.Directive });
248
265
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrVirtualItem, isStandalone: true, selector: "[frVirtualItem], frame-virtual-item", host: { classAttribute: "frame-virtual-scroll__item" }, ngImport: i0 });
@@ -256,6 +273,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
256
273
  },
257
274
  }]
258
275
  }] });
276
+ /** Meta slot for virtual item. */
259
277
  class FrVirtualItemMeta {
260
278
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: FrVirtualItemMeta, deps: [], target: i0.ɵɵFactoryTarget.Directive });
261
279
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.16", type: FrVirtualItemMeta, isStandalone: true, selector: "[frVirtualItemMeta], frame-virtual-item-meta", host: { classAttribute: "frame-virtual-scroll__item-meta" }, ngImport: i0 });
@@ -1 +1 @@
1
- {"version":3,"file":"frame-ui-ng-components-virtual-scroll.mjs","sources":["../../../projects/components/virtual-scroll/src/virtual-scroll.engine.ts","../../../projects/components/virtual-scroll/src/virtual-scroll.viewport.ts","../../../projects/components/virtual-scroll/src/virtual-scroll.content.ts","../../../projects/components/virtual-scroll/src/virtual-scroll.for.ts","../../../projects/components/virtual-scroll/src/virtual-scroll.primitives.ts","../../../projects/components/virtual-scroll/virtual-scroll.module.ts","../../../projects/components/virtual-scroll/frame-ui-ng-components-virtual-scroll.ts"],"sourcesContent":["import { clampNumber } from '@frame-ui-ng/components/utils';\r\n\r\nexport interface FrVirtualRange {\r\n start: number;\r\n end: number;\r\n before: number;\r\n after: number;\r\n}\r\n\r\nexport interface FrVirtualRangeOptions {\r\n itemSize: number;\r\n overscan: number;\r\n scrollTop: number;\r\n totalCount: number;\r\n viewportSize: number;\r\n}\r\n\r\nexport type FrVirtualScrollAlignment = 'auto' | 'start' | 'center' | 'end' | 'nearest';\r\n\r\nexport function calculateVirtualRange(options: FrVirtualRangeOptions): FrVirtualRange {\r\n const itemSize = Math.max(options.itemSize, 1);\r\n const totalCount = Math.max(options.totalCount, 0);\r\n const viewportSize = Math.max(options.viewportSize, 0);\r\n const overscan = Math.max(Math.trunc(options.overscan), 0);\r\n const visibleCount = Math.max(Math.ceil(viewportSize / itemSize), 1);\r\n const rawStart = Math.floor(Math.max(options.scrollTop, 0) / itemSize) - overscan;\r\n const start = clampNumber(rawStart, 0, totalCount);\r\n const end = clampNumber(start + visibleCount + overscan * 2, start, totalCount);\r\n\r\n return {\r\n start,\r\n end,\r\n before: start * itemSize,\r\n after: Math.max(totalCount - end, 0) * itemSize,\r\n };\r\n}\r\n\r\nexport function calculateScrollOffsetForIndex(\r\n index: number,\r\n alignment: FrVirtualScrollAlignment,\r\n itemSize: number,\r\n viewportSize: number,\r\n totalCount: number,\r\n currentScrollTop: number,\r\n): number {\r\n const normalizedItemSize = Math.max(itemSize, 1);\r\n const normalizedViewportSize = Math.max(viewportSize, 0);\r\n const maxScrollTop = Math.max(totalCount * normalizedItemSize - normalizedViewportSize, 0);\r\n const clampedIndex = clampNumber(index, 0, Math.max(totalCount - 1, 0));\r\n const itemStart = clampedIndex * normalizedItemSize;\r\n const itemEnd = itemStart + normalizedItemSize;\r\n\r\n switch (alignment) {\r\n case 'start':\r\n return clampNumber(itemStart, 0, maxScrollTop);\r\n case 'center':\r\n return clampNumber(itemStart - (normalizedViewportSize - normalizedItemSize) / 2, 0, maxScrollTop);\r\n case 'end':\r\n return clampNumber(itemEnd - normalizedViewportSize, 0, maxScrollTop);\r\n case 'nearest':\r\n case 'auto':\r\n default:\r\n if (itemStart < currentScrollTop) {\r\n return clampNumber(itemStart, 0, maxScrollTop);\r\n }\r\n\r\n if (itemEnd > currentScrollTop + normalizedViewportSize) {\r\n return clampNumber(itemEnd - normalizedViewportSize, 0, maxScrollTop);\r\n }\r\n\r\n return clampNumber(currentScrollTop, 0, maxScrollTop);\r\n }\r\n}\r\n","import {\n Directive,\n DestroyRef,\n ElementRef,\n computed,\n inject,\n input,\n signal,\n} from '@angular/core';\n\nimport {\n FrVirtualScrollAlignment,\n calculateScrollOffsetForIndex,\n calculateVirtualRange,\n} from './virtual-scroll.engine';\n\n@Directive({\n selector: '[frVirtualViewport], frame-virtual-viewport',\n exportAs: 'frVirtualViewport',\n host: {\n class: 'frame-virtual-scroll__viewport',\n '(scroll)': 'handleScroll()',\n '[style.block-size]': 'height()',\n },\n})\nexport class FrVirtualViewport {\n private readonly destroyRef = inject(DestroyRef);\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly scrollTop = signal(0);\n private readonly totalCount = signal(0);\n private readonly viewportSize = signal(0);\n private resizeObserver: ResizeObserver | null = null;\n\n readonly itemSize = input.required<number>();\n readonly overscan = input(4);\n readonly height = input<string | null>(null);\n\n readonly range = computed(() =>\n calculateVirtualRange({\n itemSize: this.itemSize(),\n overscan: this.overscan(),\n scrollTop: this.scrollTop(),\n totalCount: this.totalCount(),\n viewportSize: this.viewportSize(),\n }),\n );\n\n readonly before = computed(() => this.range().before);\n readonly after = computed(() => this.range().after);\n readonly startIndex = computed(() => this.range().start);\n readonly endIndex = computed(() => this.range().end);\n readonly renderedCount = computed(() => this.range().end - this.range().start);\n readonly totalSize = computed(() => this.totalCount() * Math.max(this.itemSize(), 1));\n\n constructor() {\n queueMicrotask(() => {\n this.measure();\n this.attachResizeObserver();\n });\n\n this.destroyRef.onDestroy(() => {\n this.resizeObserver?.disconnect();\n });\n }\n\n setTotalCount(count: number): void {\n this.totalCount.set(Math.max(Math.trunc(count), 0));\n this.measure();\n }\n\n measure(): void {\n const element = this.elementRef.nativeElement;\n this.viewportSize.set(element.clientHeight);\n this.scrollTop.set(element.scrollTop);\n }\n\n scrollToIndex(index: number, alignment: FrVirtualScrollAlignment = 'auto'): void {\n const element = this.elementRef.nativeElement;\n const nextScrollTop = calculateScrollOffsetForIndex(\n index,\n alignment,\n this.itemSize(),\n element.clientHeight,\n this.totalCount(),\n element.scrollTop,\n );\n\n element.scrollTop = nextScrollTop;\n this.scrollTop.set(nextScrollTop);\n }\n\n protected handleScroll(): void {\n this.scrollTop.set(this.elementRef.nativeElement.scrollTop);\n }\n\n private attachResizeObserver(): void {\n const element = this.elementRef.nativeElement;\n\n if (typeof ResizeObserver === 'undefined') {\n return;\n }\n\n this.resizeObserver = new ResizeObserver(() => {\n this.measure();\n });\n this.resizeObserver.observe(element);\n }\n}\n","import { Directive, computed, inject } from '@angular/core';\n\nimport { FrVirtualViewport } from './virtual-scroll.viewport';\n\n@Directive({\n selector: '[frVirtualContent], frame-virtual-content',\n host: {\n class: 'frame-virtual-scroll__content',\n '[style.padding-top.px]': 'before()',\n '[style.padding-bottom.px]': 'after()',\n },\n})\nexport class FrVirtualContent {\n private readonly viewport = inject(FrVirtualViewport);\n\n protected readonly before = computed(() => this.viewport.before());\n protected readonly after = computed(() => this.viewport.after());\n}\n","import {\n Directive,\n EmbeddedViewRef,\n TemplateRef,\n ViewContainerRef,\n computed,\n effect,\n inject,\n input,\n} from '@angular/core';\n\nimport { FrVirtualViewport } from './virtual-scroll.viewport';\n\nexport interface FrVirtualForContext<T> {\n $implicit: T;\n count: number;\n even: boolean;\n first: boolean;\n index: number;\n last: boolean;\n odd: boolean;\n}\n\nexport type FrVirtualTrackBy<T> = (index: number, item: T) => unknown;\n\n@Directive({\n selector: '[frVirtualFor][frVirtualForOf]',\n})\nexport class FrVirtualFor<T> {\n private readonly templateRef = inject<TemplateRef<FrVirtualForContext<T>>>(TemplateRef);\n private readonly viewContainerRef = inject(ViewContainerRef);\n private readonly viewport = inject(FrVirtualViewport);\n private readonly views: EmbeddedViewRef<FrVirtualForContext<T>>[] = [];\n\n readonly frVirtualForOf = input.required<readonly T[]>();\n readonly frVirtualForTrackBy = input<FrVirtualTrackBy<T> | null>(null);\n\n private readonly slice = computed(() => {\n const items = this.frVirtualForOf();\n const start = this.viewport.startIndex();\n const end = this.viewport.endIndex();\n\n return {\n items,\n start,\n visible: items.slice(start, end),\n };\n });\n\n constructor() {\n effect(() => {\n const items = this.frVirtualForOf();\n this.viewport.setTotalCount(items.length);\n this.render();\n });\n }\n\n static ngTemplateContextGuard<T>(\n _directive: FrVirtualFor<T>,\n _context: unknown,\n ): _context is FrVirtualForContext<T> {\n return true;\n }\n\n private render(): void {\n const { items, start, visible } = this.slice();\n const trackBy = this.frVirtualForTrackBy();\n\n while (this.views.length > visible.length) {\n this.viewContainerRef.remove(this.views.length - 1);\n this.views.pop();\n }\n\n for (let offset = 0; offset < visible.length; offset += 1) {\n const item = visible[offset]!;\n const index = start + offset;\n const view = this.views[offset] ?? this.createView(offset, item, index, items.length);\n const context = view.context;\n const identity = trackBy?.(index, item) ?? item;\n\n if ((view as EmbeddedViewRef<FrVirtualForContext<T>> & { __frameVirtualIdentity?: unknown }).__frameVirtualIdentity !== identity) {\n (view as EmbeddedViewRef<FrVirtualForContext<T>> & { __frameVirtualIdentity?: unknown }).__frameVirtualIdentity =\n identity;\n }\n\n context.$implicit = item;\n context.count = items.length;\n context.index = index;\n context.first = index === 0;\n context.last = index === items.length - 1;\n context.even = index % 2 === 0;\n context.odd = !context.even;\n view.detectChanges();\n }\n }\n\n private createView(\n offset: number,\n item: T,\n index: number,\n count: number,\n ): EmbeddedViewRef<FrVirtualForContext<T>> {\n const view = this.viewContainerRef.createEmbeddedView(\n this.templateRef,\n {\n $implicit: item,\n count,\n even: index % 2 === 0,\n first: index === 0,\n index,\n last: index === count - 1,\n odd: index % 2 !== 0,\n },\n offset,\n );\n\n this.views[offset] = view;\n return view;\n }\n}\n","import { Directive } from '@angular/core';\n\n@Directive({\n selector: '[frVirtualList], frame-virtual-list',\n host: {\n class: 'frame-virtual-scroll__list',\n },\n})\nexport class FrVirtualList {}\n\n@Directive({\n selector: '[frVirtualPanel], frame-virtual-panel',\n host: {\n class: 'frame-virtual-scroll__panel',\n },\n})\nexport class FrVirtualPanel {}\n\n@Directive({\n selector: '[frVirtualItem], frame-virtual-item',\n host: {\n class: 'frame-virtual-scroll__item',\n },\n})\nexport class FrVirtualItem {}\n\n@Directive({\n selector: '[frVirtualItemMeta], frame-virtual-item-meta',\n host: {\n class: 'frame-virtual-scroll__item-meta',\n },\n})\nexport class FrVirtualItemMeta {}\n","import { NgModule } from '@angular/core';\nimport {\n FrVirtualContent,\n FrVirtualFor,\n FrVirtualItem,\n FrVirtualItemMeta,\n FrVirtualList,\n FrVirtualPanel,\n FrVirtualViewport,\n} from './src/virtual-scroll';\n\n@NgModule({\n imports: [\n FrVirtualContent,\n FrVirtualFor,\n FrVirtualItem,\n FrVirtualItemMeta,\n FrVirtualList,\n FrVirtualPanel,\n FrVirtualViewport,\n ],\n exports: [\n FrVirtualContent,\n FrVirtualFor,\n FrVirtualItem,\n FrVirtualItemMeta,\n FrVirtualList,\n FrVirtualPanel,\n FrVirtualViewport,\n ],\n})\nexport class FrVirtualScrollModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"frame-ui-ng-components-virtual-scroll.mjs","sources":["../../../projects/components/virtual-scroll/src/virtual-scroll.engine.ts","../../../projects/components/virtual-scroll/src/virtual-scroll.viewport.ts","../../../projects/components/virtual-scroll/src/virtual-scroll.content.ts","../../../projects/components/virtual-scroll/src/virtual-scroll.for.ts","../../../projects/components/virtual-scroll/src/virtual-scroll.primitives.ts","../../../projects/components/virtual-scroll/virtual-scroll.module.ts","../../../projects/components/virtual-scroll/frame-ui-ng-components-virtual-scroll.ts"],"sourcesContent":["import { clampNumber } from '@frame-ui-ng/components/utils';\r\n\r\nexport interface FrVirtualRange {\r\n start: number;\r\n end: number;\r\n before: number;\r\n after: number;\r\n}\r\n\r\nexport interface FrVirtualRangeOptions {\r\n itemSize: number;\r\n overscan: number;\r\n scrollTop: number;\r\n totalCount: number;\r\n viewportSize: number;\r\n}\r\n\r\nexport type FrVirtualScrollAlignment = 'auto' | 'start' | 'center' | 'end' | 'nearest';\r\n\r\nexport function calculateVirtualRange(options: FrVirtualRangeOptions): FrVirtualRange {\r\n const itemSize = Math.max(options.itemSize, 1);\r\n const totalCount = Math.max(options.totalCount, 0);\r\n const viewportSize = Math.max(options.viewportSize, 0);\r\n const overscan = Math.max(Math.trunc(options.overscan), 0);\r\n const visibleCount = Math.max(Math.ceil(viewportSize / itemSize), 1);\r\n const rawStart = Math.floor(Math.max(options.scrollTop, 0) / itemSize) - overscan;\r\n const start = clampNumber(rawStart, 0, totalCount);\r\n const end = clampNumber(start + visibleCount + overscan * 2, start, totalCount);\r\n\r\n return {\r\n start,\r\n end,\r\n before: start * itemSize,\r\n after: Math.max(totalCount - end, 0) * itemSize,\r\n };\r\n}\r\n\r\nexport function calculateScrollOffsetForIndex(\r\n index: number,\r\n alignment: FrVirtualScrollAlignment,\r\n itemSize: number,\r\n viewportSize: number,\r\n totalCount: number,\r\n currentScrollTop: number,\r\n): number {\r\n const normalizedItemSize = Math.max(itemSize, 1);\r\n const normalizedViewportSize = Math.max(viewportSize, 0);\r\n const maxScrollTop = Math.max(totalCount * normalizedItemSize - normalizedViewportSize, 0);\r\n const clampedIndex = clampNumber(index, 0, Math.max(totalCount - 1, 0));\r\n const itemStart = clampedIndex * normalizedItemSize;\r\n const itemEnd = itemStart + normalizedItemSize;\r\n\r\n switch (alignment) {\r\n case 'start':\r\n return clampNumber(itemStart, 0, maxScrollTop);\r\n case 'center':\r\n return clampNumber(itemStart - (normalizedViewportSize - normalizedItemSize) / 2, 0, maxScrollTop);\r\n case 'end':\r\n return clampNumber(itemEnd - normalizedViewportSize, 0, maxScrollTop);\r\n case 'nearest':\r\n case 'auto':\r\n default:\r\n if (itemStart < currentScrollTop) {\r\n return clampNumber(itemStart, 0, maxScrollTop);\r\n }\r\n\r\n if (itemEnd > currentScrollTop + normalizedViewportSize) {\r\n return clampNumber(itemEnd - normalizedViewportSize, 0, maxScrollTop);\r\n }\r\n\r\n return clampNumber(currentScrollTop, 0, maxScrollTop);\r\n }\r\n}\r\n","import {\r\n Directive,\r\n DestroyRef,\r\n ElementRef,\r\n computed,\r\n inject,\r\n input,\r\n signal,\r\n} from '@angular/core';\r\n\r\nimport {\r\n FrVirtualScrollAlignment,\r\n calculateScrollOffsetForIndex,\r\n calculateVirtualRange,\r\n} from './virtual-scroll.engine';\r\n\r\n/** Viewport controller for virtual scrolling. */\r\n@Directive({\r\n selector: '[frVirtualViewport], frame-virtual-viewport',\r\n exportAs: 'frVirtualViewport',\r\n host: {\r\n class: 'frame-virtual-scroll__viewport',\r\n '(scroll)': 'handleScroll()',\r\n '[style.block-size]': 'height()',\r\n },\r\n})\r\nexport class FrVirtualViewport {\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\r\n private readonly scrollTop = signal(0);\r\n private readonly totalCount = signal(0);\r\n private readonly viewportSize = signal(0);\r\n private resizeObserver: ResizeObserver | null = null;\r\n\r\n readonly itemSize = input.required<number>();\r\n readonly overscan = input(4);\r\n readonly height = input<string | null>(null);\r\n\r\n readonly range = computed(() =>\r\n calculateVirtualRange({\r\n itemSize: this.itemSize(),\r\n overscan: this.overscan(),\r\n scrollTop: this.scrollTop(),\r\n totalCount: this.totalCount(),\r\n viewportSize: this.viewportSize(),\r\n }),\r\n );\r\n\r\n readonly before = computed(() => this.range().before);\r\n readonly after = computed(() => this.range().after);\r\n readonly startIndex = computed(() => this.range().start);\r\n readonly endIndex = computed(() => this.range().end);\r\n readonly renderedCount = computed(() => this.range().end - this.range().start);\r\n readonly totalSize = computed(() => this.totalCount() * Math.max(this.itemSize(), 1));\r\n\r\n constructor() {\r\n queueMicrotask(() => {\r\n this.measure();\r\n this.attachResizeObserver();\r\n });\r\n\r\n this.destroyRef.onDestroy(() => {\r\n this.resizeObserver?.disconnect();\r\n });\r\n }\r\n\r\n setTotalCount(count: number): void {\r\n this.totalCount.set(Math.max(Math.trunc(count), 0));\r\n this.measure();\r\n }\r\n\r\n measure(): void {\r\n const element = this.elementRef.nativeElement;\r\n this.viewportSize.set(element.clientHeight);\r\n this.scrollTop.set(element.scrollTop);\r\n }\r\n\r\n scrollToIndex(index: number, alignment: FrVirtualScrollAlignment = 'auto'): void {\r\n const element = this.elementRef.nativeElement;\r\n // Virtual scrolling assumes fixed item heights, so index math can stay O(1).\r\n const nextScrollTop = calculateScrollOffsetForIndex(\r\n index,\r\n alignment,\r\n this.itemSize(),\r\n element.clientHeight,\r\n this.totalCount(),\r\n element.scrollTop,\r\n );\r\n\r\n element.scrollTop = nextScrollTop;\r\n this.scrollTop.set(nextScrollTop);\r\n }\r\n\r\n protected handleScroll(): void {\r\n this.scrollTop.set(this.elementRef.nativeElement.scrollTop);\r\n }\r\n\r\n private attachResizeObserver(): void {\r\n const element = this.elementRef.nativeElement;\r\n\r\n if (typeof ResizeObserver === 'undefined') {\r\n return;\r\n }\r\n\r\n this.resizeObserver = new ResizeObserver(() => {\r\n this.measure();\r\n });\r\n this.resizeObserver.observe(element);\r\n }\r\n}\r\n\r\n","import { Directive, computed, inject } from '@angular/core';\r\n\r\nimport { FrVirtualViewport } from './virtual-scroll.viewport';\r\n\r\n/** Measured content wrapper for virtual scrolling. */\r\n@Directive({\r\n selector: '[frVirtualContent], frame-virtual-content',\r\n host: {\r\n class: 'frame-virtual-scroll__content',\r\n '[style.padding-top.px]': 'before()',\r\n '[style.padding-bottom.px]': 'after()',\r\n },\r\n})\r\nexport class FrVirtualContent {\r\n private readonly viewport = inject(FrVirtualViewport);\r\n\r\n protected readonly before = computed(() => this.viewport.before());\r\n protected readonly after = computed(() => this.viewport.after());\r\n}\r\n\r\n","import {\r\n Directive,\r\n DoCheck,\r\n EmbeddedViewRef,\r\n TemplateRef,\r\n ViewContainerRef,\r\n computed,\r\n inject,\r\n input,\r\n} from '@angular/core';\r\n\r\nimport { FrVirtualViewport } from './virtual-scroll.viewport';\r\n\r\nexport interface FrVirtualForContext<T> {\r\n $implicit: T;\r\n count: number;\r\n even: boolean;\r\n first: boolean;\r\n index: number;\r\n last: boolean;\r\n odd: boolean;\r\n}\r\n\r\nexport type FrVirtualTrackBy<T> = (index: number, item: T) => unknown;\r\n\r\n/** Structural directive for rendering virtualized ranges. */\r\n@Directive({\r\n selector: '[frVirtualFor][frVirtualForOf]',\r\n})\r\nexport class FrVirtualFor<T> implements DoCheck {\r\n private readonly templateRef = inject<TemplateRef<FrVirtualForContext<T>>>(TemplateRef);\r\n private readonly viewContainerRef = inject(ViewContainerRef);\r\n private readonly viewport = inject(FrVirtualViewport);\r\n private readonly views: EmbeddedViewRef<FrVirtualForContext<T>>[] = [];\r\n\r\n readonly frVirtualForOf = input.required<readonly T[]>();\r\n readonly frVirtualForTrackBy = input<FrVirtualTrackBy<T> | null>(null);\r\n private lastRenderKey = '';\r\n\r\n private readonly slice = computed(() => {\r\n const items = this.frVirtualForOf();\r\n const start = this.viewport.startIndex();\r\n const end = this.viewport.endIndex();\r\n\r\n return {\r\n items,\r\n start,\r\n visible: items.slice(start, end),\r\n };\r\n });\r\n\r\n ngDoCheck(): void {\r\n const items = this.frVirtualForOf();\r\n const renderKey = [\r\n items,\r\n items.length,\r\n this.viewport.startIndex(),\r\n this.viewport.endIndex(),\r\n this.frVirtualForTrackBy(),\r\n ].map(String).join('|');\r\n\r\n this.viewport.setTotalCount(items.length);\r\n\r\n if (renderKey === this.lastRenderKey) {\r\n return;\r\n }\r\n\r\n this.lastRenderKey = renderKey;\r\n this.render();\r\n }\r\n\r\n static ngTemplateContextGuard<T>(\r\n _directive: FrVirtualFor<T>,\r\n _context: unknown,\r\n ): _context is FrVirtualForContext<T> {\r\n return true;\r\n }\r\n\r\n private render(): void {\r\n const { items, start, visible } = this.slice();\r\n const trackBy = this.frVirtualForTrackBy();\r\n\r\n while (this.views.length > visible.length) {\r\n this.viewContainerRef.remove(this.views.length - 1);\r\n this.views.pop();\r\n }\r\n\r\n for (let offset = 0; offset < visible.length; offset += 1) {\r\n const item = visible[offset]!;\r\n const index = start + offset;\r\n const view = this.views[offset] ?? this.createView(offset, item, index, items.length);\r\n const context = view.context;\r\n const identity = trackBy?.(index, item) ?? item;\r\n\r\n if ((view as EmbeddedViewRef<FrVirtualForContext<T>> & { __frameVirtualIdentity?: unknown }).__frameVirtualIdentity !== identity) {\r\n (view as EmbeddedViewRef<FrVirtualForContext<T>> & { __frameVirtualIdentity?: unknown }).__frameVirtualIdentity =\r\n identity;\r\n }\r\n\r\n context.$implicit = item;\r\n context.count = items.length;\r\n context.index = index;\r\n context.first = index === 0;\r\n context.last = index === items.length - 1;\r\n context.even = index % 2 === 0;\r\n context.odd = !context.even;\r\n view.detectChanges();\r\n }\r\n }\r\n\r\n private createView(\r\n offset: number,\r\n item: T,\r\n index: number,\r\n count: number,\r\n ): EmbeddedViewRef<FrVirtualForContext<T>> {\r\n const view = this.viewContainerRef.createEmbeddedView(\r\n this.templateRef,\r\n {\r\n $implicit: item,\r\n count,\r\n even: index % 2 === 0,\r\n first: index === 0,\r\n index,\r\n last: index === count - 1,\r\n odd: index % 2 !== 0,\r\n },\r\n offset,\r\n );\r\n\r\n this.views[offset] = view;\r\n return view;\r\n }\r\n}\r\n\r\n","import { Directive } from '@angular/core';\r\n\r\n/** List wrapper for virtualized items. */\r\n@Directive({\r\n selector: '[frVirtualList], frame-virtual-list',\r\n host: {\r\n class: 'frame-virtual-scroll__list',\r\n },\r\n})\r\nexport class FrVirtualList {}\r\n\r\n/** Panel wrapper for virtualized content. */\r\n@Directive({\r\n selector: '[frVirtualPanel], frame-virtual-panel',\r\n host: {\r\n class: 'frame-virtual-scroll__panel',\r\n },\r\n})\r\nexport class FrVirtualPanel {}\r\n\r\n/** Item wrapper for virtualized rows. */\r\n@Directive({\r\n selector: '[frVirtualItem], frame-virtual-item',\r\n host: {\r\n class: 'frame-virtual-scroll__item',\r\n },\r\n})\r\nexport class FrVirtualItem {}\r\n\r\n/** Meta slot for virtual item. */\r\n@Directive({\r\n selector: '[frVirtualItemMeta], frame-virtual-item-meta',\r\n host: {\r\n class: 'frame-virtual-scroll__item-meta',\r\n },\r\n})\r\nexport class FrVirtualItemMeta {}\r\n\r\n","import { NgModule } from '@angular/core';\nimport {\n FrVirtualContent,\n FrVirtualFor,\n FrVirtualItem,\n FrVirtualItemMeta,\n FrVirtualList,\n FrVirtualPanel,\n FrVirtualViewport,\n} from './src/virtual-scroll';\n\n@NgModule({\n imports: [\n FrVirtualContent,\n FrVirtualFor,\n FrVirtualItem,\n FrVirtualItemMeta,\n FrVirtualList,\n FrVirtualPanel,\n FrVirtualViewport,\n ],\n exports: [\n FrVirtualContent,\n FrVirtualFor,\n FrVirtualItem,\n FrVirtualItemMeta,\n FrVirtualList,\n FrVirtualPanel,\n FrVirtualViewport,\n ],\n})\nexport class FrVirtualScrollModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}