@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.
- package/confirm-popover/src/styles/confirm-popover.css +20 -0
- package/drag-drop/src/styles/_vars.css +28 -0
- package/drag-drop/src/styles/drag-drop.css +132 -0
- package/fesm2022/frame-ui-ng-components-accordion.mjs +26 -21
- package/fesm2022/frame-ui-ng-components-accordion.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-alert.mjs +4 -0
- package/fesm2022/frame-ui-ng-components-alert.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-avatar.mjs +7 -0
- package/fesm2022/frame-ui-ng-components-avatar.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-badge.mjs +4 -0
- package/fesm2022/frame-ui-ng-components-badge.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-breadcrumb.mjs +13 -6
- package/fesm2022/frame-ui-ng-components-breadcrumb.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-button-group.mjs +1 -0
- package/fesm2022/frame-ui-ng-components-button-group.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-button.mjs +5 -0
- package/fesm2022/frame-ui-ng-components-button.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-calendar.mjs +4 -0
- package/fesm2022/frame-ui-ng-components-calendar.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-card.mjs +15 -15
- package/fesm2022/frame-ui-ng-components-card.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-carousel.mjs +33 -16
- package/fesm2022/frame-ui-ng-components-carousel.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-checkbox.mjs +7 -9
- package/fesm2022/frame-ui-ng-components-checkbox.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-collapsible.mjs +24 -23
- package/fesm2022/frame-ui-ng-components-collapsible.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-combobox.mjs +66 -18
- package/fesm2022/frame-ui-ng-components-combobox.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-command.mjs +47 -16
- package/fesm2022/frame-ui-ng-components-command.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-confirm-modal.mjs +3 -0
- package/fesm2022/frame-ui-ng-components-confirm-modal.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-confirm-popover.mjs +423 -0
- package/fesm2022/frame-ui-ng-components-confirm-popover.mjs.map +1 -0
- package/fesm2022/frame-ui-ng-components-context-menu.mjs +71 -45
- package/fesm2022/frame-ui-ng-components-context-menu.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-date-picker.mjs +3 -0
- package/fesm2022/frame-ui-ng-components-date-picker.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-drag-drop.mjs +293 -0
- package/fesm2022/frame-ui-ng-components-drag-drop.mjs.map +1 -0
- package/fesm2022/frame-ui-ng-components-dropdown-menu.mjs +73 -36
- package/fesm2022/frame-ui-ng-components-dropdown-menu.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-empty.mjs +6 -0
- package/fesm2022/frame-ui-ng-components-empty.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-field.mjs +21 -12
- package/fesm2022/frame-ui-ng-components-field.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-forms.mjs +1 -0
- package/fesm2022/frame-ui-ng-components-forms.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-hover-card.mjs +49 -43
- package/fesm2022/frame-ui-ng-components-hover-card.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-input-otp.mjs +5 -0
- package/fesm2022/frame-ui-ng-components-input-otp.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-input.mjs +13 -0
- package/fesm2022/frame-ui-ng-components-input.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-item.mjs +10 -0
- package/fesm2022/frame-ui-ng-components-item.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-menubar.mjs +15 -0
- package/fesm2022/frame-ui-ng-components-menubar.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-modal.mjs +128 -114
- package/fesm2022/frame-ui-ng-components-modal.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-navigation-menu.mjs +14 -0
- package/fesm2022/frame-ui-ng-components-navigation-menu.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-pagination.mjs +8 -0
- package/fesm2022/frame-ui-ng-components-pagination.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-popover.mjs +63 -51
- package/fesm2022/frame-ui-ng-components-popover.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-progress.mjs +2 -0
- package/fesm2022/frame-ui-ng-components-progress.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-radio-group.mjs +5 -0
- package/fesm2022/frame-ui-ng-components-radio-group.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-resizable.mjs +6 -0
- package/fesm2022/frame-ui-ng-components-resizable.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-select.mjs +62 -14
- package/fesm2022/frame-ui-ng-components-select.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-separator.mjs +1 -0
- package/fesm2022/frame-ui-ng-components-separator.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-sheet.mjs +99 -88
- package/fesm2022/frame-ui-ng-components-sheet.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-sidebar.mjs +27 -12
- package/fesm2022/frame-ui-ng-components-sidebar.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-skeleton.mjs +1 -0
- package/fesm2022/frame-ui-ng-components-skeleton.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-slider.mjs +29 -16
- package/fesm2022/frame-ui-ng-components-slider.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-spinner.mjs +1 -0
- package/fesm2022/frame-ui-ng-components-spinner.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-switch.mjs +6 -0
- package/fesm2022/frame-ui-ng-components-switch.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-table.mjs +76 -50
- package/fesm2022/frame-ui-ng-components-table.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-tabs.mjs +4 -0
- package/fesm2022/frame-ui-ng-components-tabs.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-textarea.mjs +1 -0
- package/fesm2022/frame-ui-ng-components-textarea.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-toast.mjs +2 -0
- package/fesm2022/frame-ui-ng-components-toast.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-toggle.mjs +23 -16
- package/fesm2022/frame-ui-ng-components-toggle.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-tooltip.mjs +30 -25
- package/fesm2022/frame-ui-ng-components-tooltip.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components-virtual-scroll.mjs +26 -8
- package/fesm2022/frame-ui-ng-components-virtual-scroll.mjs.map +1 -1
- package/fesm2022/frame-ui-ng-components.mjs +1387 -552
- package/fesm2022/frame-ui-ng-components.mjs.map +1 -1
- package/package.json +10 -2
- package/popover/src/styles/popover.css +106 -101
- package/src/styles/components.css +6 -4
- package/styles/components.css +6 -4
- package/styles.css +6 -4
- package/types/frame-ui-ng-components-accordion.d.ts +11 -4
- package/types/frame-ui-ng-components-alert.d.ts +4 -0
- package/types/frame-ui-ng-components-avatar.d.ts +7 -0
- package/types/frame-ui-ng-components-badge.d.ts +4 -0
- package/types/frame-ui-ng-components-breadcrumb.d.ts +7 -0
- package/types/frame-ui-ng-components-button-group.d.ts +1 -0
- package/types/frame-ui-ng-components-button.d.ts +5 -0
- package/types/frame-ui-ng-components-calendar.d.ts +1 -0
- package/types/frame-ui-ng-components-card.d.ts +8 -3
- package/types/frame-ui-ng-components-carousel.d.ts +11 -2
- package/types/frame-ui-ng-components-checkbox.d.ts +3 -2
- package/types/frame-ui-ng-components-collapsible.d.ts +9 -4
- package/types/frame-ui-ng-components-combobox.d.ts +32 -3
- package/types/frame-ui-ng-components-command.d.ts +26 -4
- package/types/frame-ui-ng-components-confirm-modal.d.ts +2 -0
- package/types/frame-ui-ng-components-confirm-popover.d.ts +87 -0
- package/types/frame-ui-ng-components-context-menu.d.ts +29 -10
- package/types/frame-ui-ng-components-date-picker.d.ts +1 -0
- package/types/frame-ui-ng-components-drag-drop.d.ts +103 -0
- package/types/frame-ui-ng-components-dropdown-menu.d.ts +32 -9
- package/types/frame-ui-ng-components-empty.d.ts +6 -0
- package/types/frame-ui-ng-components-field.d.ts +9 -0
- package/types/frame-ui-ng-components-forms.d.ts +1 -0
- package/types/frame-ui-ng-components-hover-card.d.ts +8 -2
- package/types/frame-ui-ng-components-input-otp.d.ts +4 -0
- package/types/frame-ui-ng-components-input.d.ts +13 -0
- package/types/frame-ui-ng-components-item.d.ts +10 -0
- package/types/frame-ui-ng-components-menubar.d.ts +15 -0
- package/types/frame-ui-ng-components-modal.d.ts +12 -0
- package/types/frame-ui-ng-components-navigation-menu.d.ts +14 -0
- package/types/frame-ui-ng-components-pagination.d.ts +8 -0
- package/types/frame-ui-ng-components-popover.d.ts +14 -2
- package/types/frame-ui-ng-components-progress.d.ts +2 -0
- package/types/frame-ui-ng-components-radio-group.d.ts +5 -0
- package/types/frame-ui-ng-components-resizable.d.ts +3 -0
- package/types/frame-ui-ng-components-select.d.ts +23 -2
- package/types/frame-ui-ng-components-separator.d.ts +1 -0
- package/types/frame-ui-ng-components-sheet.d.ts +11 -0
- package/types/frame-ui-ng-components-sidebar.d.ts +21 -0
- package/types/frame-ui-ng-components-skeleton.d.ts +1 -0
- package/types/frame-ui-ng-components-slider.d.ts +5 -2
- package/types/frame-ui-ng-components-spinner.d.ts +1 -0
- package/types/frame-ui-ng-components-switch.d.ts +6 -0
- package/types/frame-ui-ng-components-table.d.ts +26 -0
- package/types/frame-ui-ng-components-tabs.d.ts +4 -0
- package/types/frame-ui-ng-components-textarea.d.ts +1 -0
- package/types/frame-ui-ng-components-toast.d.ts +2 -0
- package/types/frame-ui-ng-components-toggle.d.ts +8 -2
- package/types/frame-ui-ng-components-tooltip.d.ts +6 -2
- package/types/frame-ui-ng-components-virtual-scroll.d.ts +11 -2
- 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,
|
|
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
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
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 =
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
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
|
-
}],
|
|
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,
|
|
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
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
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
|
-
}],
|
|
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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"}
|