@ngneers/controls 0.0.1-pre6 → 0.0.1-pre7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/ngneers-controls-accordion.mjs +10 -10
- package/fesm2022/ngneers-controls-accordion.mjs.map +1 -1
- package/fesm2022/ngneers-controls-api-ng.mjs +12 -9
- package/fesm2022/ngneers-controls-api-ng.mjs.map +1 -1
- package/fesm2022/ngneers-controls-avatar.mjs +6 -6
- package/fesm2022/ngneers-controls-avatar.mjs.map +1 -1
- package/fesm2022/ngneers-controls-base.mjs +9 -9
- package/fesm2022/ngneers-controls-base.mjs.map +1 -1
- package/fesm2022/ngneers-controls-breadcrumb.mjs +7 -7
- package/fesm2022/ngneers-controls-breadcrumb.mjs.map +1 -1
- package/fesm2022/ngneers-controls-button-group.mjs +3 -3
- package/fesm2022/ngneers-controls-button-group.mjs.map +1 -1
- package/fesm2022/ngneers-controls-button.mjs +6 -6
- package/fesm2022/ngneers-controls-button.mjs.map +1 -1
- package/fesm2022/{ngneers-controls-calendar-time-Bzlv9Vkn.mjs → ngneers-controls-calendar-time-CKAqRgOP.mjs} +4 -4
- package/fesm2022/{ngneers-controls-calendar-time-Bzlv9Vkn.mjs.map → ngneers-controls-calendar-time-CKAqRgOP.mjs.map} +1 -1
- package/fesm2022/ngneers-controls-calendar.mjs +11 -11
- package/fesm2022/ngneers-controls-calendar.mjs.map +1 -1
- package/fesm2022/ngneers-controls-checkbox.mjs +4 -4
- package/fesm2022/ngneers-controls-checkbox.mjs.map +1 -1
- package/fesm2022/ngneers-controls-chip.mjs +4 -4
- package/fesm2022/ngneers-controls-chip.mjs.map +1 -1
- package/fesm2022/ngneers-controls-default-icons.mjs +61 -0
- package/fesm2022/ngneers-controls-default-icons.mjs.map +1 -0
- package/fesm2022/ngneers-controls-defer.mjs +3 -3
- package/fesm2022/ngneers-controls-defer.mjs.map +1 -1
- package/fesm2022/ngneers-controls-dialog.mjs +10 -10
- package/fesm2022/ngneers-controls-dialog.mjs.map +1 -1
- package/fesm2022/ngneers-controls-directives.mjs +21 -21
- package/fesm2022/ngneers-controls-directives.mjs.map +1 -1
- package/fesm2022/ngneers-controls-drawer.mjs +7 -7
- package/fesm2022/ngneers-controls-drawer.mjs.map +1 -1
- package/fesm2022/ngneers-controls-edit-inplace.mjs +7 -7
- package/fesm2022/ngneers-controls-edit-inplace.mjs.map +1 -1
- package/fesm2022/ngneers-controls-filter.mjs +4 -4
- package/fesm2022/ngneers-controls-filter.mjs.map +1 -1
- package/fesm2022/ngneers-controls-i18n.mjs +3 -3
- package/fesm2022/ngneers-controls-i18n.mjs.map +1 -1
- package/fesm2022/ngneers-controls-icon.mjs +108 -44
- package/fesm2022/ngneers-controls-icon.mjs.map +1 -1
- package/fesm2022/ngneers-controls-inplace.mjs +6 -6
- package/fesm2022/ngneers-controls-inplace.mjs.map +1 -1
- package/fesm2022/ngneers-controls-input-field.mjs +5 -5
- package/fesm2022/ngneers-controls-input-field.mjs.map +1 -1
- package/fesm2022/ngneers-controls-input-mask.mjs +3 -3
- package/fesm2022/ngneers-controls-input-mask.mjs.map +1 -1
- package/fesm2022/ngneers-controls-input.mjs +3 -3
- package/fesm2022/ngneers-controls-input.mjs.map +1 -1
- package/fesm2022/ngneers-controls-item-view.mjs +6 -6
- package/fesm2022/ngneers-controls-item-view.mjs.map +1 -1
- package/fesm2022/ngneers-controls-list-box.mjs +6 -6
- package/fesm2022/ngneers-controls-list-box.mjs.map +1 -1
- package/fesm2022/ngneers-controls-menu.mjs +10 -10
- package/fesm2022/ngneers-controls-menu.mjs.map +1 -1
- package/fesm2022/ngneers-controls-message.mjs +3 -3
- package/fesm2022/ngneers-controls-message.mjs.map +1 -1
- package/fesm2022/ngneers-controls-paginator.mjs +4 -4
- package/fesm2022/ngneers-controls-paginator.mjs.map +1 -1
- package/fesm2022/ngneers-controls-popover.mjs +11 -6
- package/fesm2022/ngneers-controls-popover.mjs.map +1 -1
- package/fesm2022/ngneers-controls-progress.mjs +3 -3
- package/fesm2022/ngneers-controls-progress.mjs.map +1 -1
- package/fesm2022/ngneers-controls-scroll-shadow.mjs +54 -0
- package/fesm2022/ngneers-controls-scroll-shadow.mjs.map +1 -0
- package/fesm2022/ngneers-controls-scroller.mjs +9 -9
- package/fesm2022/ngneers-controls-scroller.mjs.map +1 -1
- package/fesm2022/ngneers-controls-select-button.mjs +4 -4
- package/fesm2022/ngneers-controls-select-button.mjs.map +1 -1
- package/fesm2022/ngneers-controls-select.mjs +8 -7
- package/fesm2022/ngneers-controls-select.mjs.map +1 -1
- package/fesm2022/ngneers-controls-slider.mjs +3 -3
- package/fesm2022/ngneers-controls-slider.mjs.map +1 -1
- package/fesm2022/ngneers-controls-spinner.mjs +3 -3
- package/fesm2022/ngneers-controls-spinner.mjs.map +1 -1
- package/fesm2022/ngneers-controls-splitter.mjs +10 -10
- package/fesm2022/ngneers-controls-splitter.mjs.map +1 -1
- package/fesm2022/ngneers-controls-switch.mjs +3 -3
- package/fesm2022/ngneers-controls-switch.mjs.map +1 -1
- package/fesm2022/ngneers-controls-table.mjs +227 -293
- package/fesm2022/ngneers-controls-table.mjs.map +1 -1
- package/fesm2022/ngneers-controls-tabs.mjs +10 -10
- package/fesm2022/ngneers-controls-tabs.mjs.map +1 -1
- package/fesm2022/ngneers-controls-tag.mjs +3 -3
- package/fesm2022/ngneers-controls-tag.mjs.map +1 -1
- package/fesm2022/ngneers-controls-toast.mjs +10 -10
- package/fesm2022/ngneers-controls-toast.mjs.map +1 -1
- package/fesm2022/ngneers-controls-toggle-button.mjs +4 -4
- package/fesm2022/ngneers-controls-toggle-button.mjs.map +1 -1
- package/fesm2022/ngneers-controls-tooltip.mjs +44 -8
- package/fesm2022/ngneers-controls-tooltip.mjs.map +1 -1
- package/fesm2022/ngneers-controls-utils-ng.mjs +3 -3
- package/fesm2022/ngneers-controls-utils-ng.mjs.map +1 -1
- package/fesm2022/ngneers-controls-utils.mjs +1 -1
- package/fesm2022/ngneers-controls-utils.mjs.map +1 -1
- package/package.json +29 -11
- package/types/ngneers-controls-accordion.d.ts +6 -4
- package/types/ngneers-controls-api-ng.d.ts +5 -0
- package/types/ngneers-controls-api.d.ts +2 -2
- package/types/ngneers-controls-breadcrumb.d.ts +5 -3
- package/types/ngneers-controls-checkbox.d.ts +5 -3
- package/types/ngneers-controls-chip.d.ts +3 -1
- package/types/ngneers-controls-default-icons.d.ts +5 -0
- package/types/ngneers-controls-drawer.d.ts +3 -1
- package/types/ngneers-controls-filter.d.ts +1 -1
- package/types/ngneers-controls-icon.d.ts +23 -40
- package/types/ngneers-controls-input-field.d.ts +3 -1
- package/types/ngneers-controls-item-view.d.ts +4 -2
- package/types/ngneers-controls-menu.d.ts +3 -1
- package/types/ngneers-controls-message.d.ts +3 -1
- package/types/ngneers-controls-popover.d.ts +1 -0
- package/types/ngneers-controls-scroll-shadow.d.ts +16 -0
- package/types/ngneers-controls-select.d.ts +5 -10
- package/types/ngneers-controls-table.d.ts +29 -41
- package/types/ngneers-controls-tabs.d.ts +4 -2
- package/types/ngneers-controls-tag.d.ts +3 -1
- package/types/ngneers-controls-toast.d.ts +4 -2
- package/types/ngneers-controls-toggle-button.d.ts +5 -3
- package/types/ngneers-controls-tooltip.d.ts +7 -1
- package/fesm2022/ngneers-controls-icon-calendar-z5xA9wTT.mjs +0 -4
- package/fesm2022/ngneers-controls-icon-calendar-z5xA9wTT.mjs.map +0 -1
- package/fesm2022/ngneers-controls-icon-check-DdAQ9k-T.mjs +0 -4
- package/fesm2022/ngneers-controls-icon-check-DdAQ9k-T.mjs.map +0 -1
- package/fesm2022/ngneers-controls-icon-chevron_down-HO-z-xOr.mjs +0 -4
- package/fesm2022/ngneers-controls-icon-chevron_down-HO-z-xOr.mjs.map +0 -1
- package/fesm2022/ngneers-controls-icon-chevron_left-CC5psi16.mjs +0 -4
- package/fesm2022/ngneers-controls-icon-chevron_left-CC5psi16.mjs.map +0 -1
- package/fesm2022/ngneers-controls-icon-chevron_right-BRxlzx4G.mjs +0 -4
- package/fesm2022/ngneers-controls-icon-chevron_right-BRxlzx4G.mjs.map +0 -1
- package/fesm2022/ngneers-controls-icon-chevron_up-cqhPO7g2.mjs +0 -4
- package/fesm2022/ngneers-controls-icon-chevron_up-cqhPO7g2.mjs.map +0 -1
- package/fesm2022/ngneers-controls-icon-ellipsis-DXIGA1sk.mjs +0 -4
- package/fesm2022/ngneers-controls-icon-ellipsis-DXIGA1sk.mjs.map +0 -1
- package/fesm2022/ngneers-controls-icon-filter-oU7E6Xgr.mjs +0 -4
- package/fesm2022/ngneers-controls-icon-filter-oU7E6Xgr.mjs.map +0 -1
- package/fesm2022/ngneers-controls-icon-filter_solid-CqIKuR4N.mjs +0 -4
- package/fesm2022/ngneers-controls-icon-filter_solid-CqIKuR4N.mjs.map +0 -1
- package/fesm2022/ngneers-controls-icon-magnifying_glass-T4Hzbkig.mjs +0 -4
- package/fesm2022/ngneers-controls-icon-magnifying_glass-T4Hzbkig.mjs.map +0 -1
- package/fesm2022/ngneers-controls-icon-minus-oGDEFO4E.mjs +0 -4
- package/fesm2022/ngneers-controls-icon-minus-oGDEFO4E.mjs.map +0 -1
- package/fesm2022/ngneers-controls-icon-sort-CRD4tafz.mjs +0 -4
- package/fesm2022/ngneers-controls-icon-sort-CRD4tafz.mjs.map +0 -1
- package/fesm2022/ngneers-controls-icon-sort_down-DiFB1P6R.mjs +0 -4
- package/fesm2022/ngneers-controls-icon-sort_down-DiFB1P6R.mjs.map +0 -1
- package/fesm2022/ngneers-controls-icon-sort_up-Bq_q3hIi.mjs +0 -4
- package/fesm2022/ngneers-controls-icon-sort_up-Bq_q3hIi.mjs.map +0 -1
- package/fesm2022/ngneers-controls-icon-xmark-BZKZORiu.mjs +0 -4
- package/fesm2022/ngneers-controls-icon-xmark-BZKZORiu.mjs.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { output, model, input, booleanAttribute, contentChild, viewChild, computed, signal, inject, Injector, untracked, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
2
|
+
import { output, model, input, booleanAttribute, contentChild, viewChild, computed, signal, inject, Injector, ChangeDetectorRef, untracked, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
3
3
|
import { toPopoverCloseBy, autoPositionElement } from '@ngneers/controls/api/ng';
|
|
4
4
|
import { NgnBase, NgnPt, provideSelf } from '@ngneers/controls/base';
|
|
5
5
|
import { NgnDefer } from '@ngneers/controls/defer';
|
|
@@ -53,6 +53,7 @@ class NgnPopover extends NgnBase {
|
|
|
53
53
|
...this.options(),
|
|
54
54
|
}), ...(ngDevMode ? [{ debugName: "appliedOptions" }] : /* istanbul ignore next */ []));
|
|
55
55
|
_injector = inject(Injector);
|
|
56
|
+
_cdr = inject(ChangeDetectorRef);
|
|
56
57
|
_popoverRef = viewChild.required('popover');
|
|
57
58
|
_popover = computed(() => this._popoverRef().nativeElement, ...(ngDevMode ? [{ debugName: "_popover" }] : /* istanbul ignore next */ []));
|
|
58
59
|
_autoPos = computedWithPrevious(prev => {
|
|
@@ -92,8 +93,12 @@ class NgnPopover extends NgnBase {
|
|
|
92
93
|
return;
|
|
93
94
|
}
|
|
94
95
|
this._triggeredByInput = false;
|
|
95
|
-
this.
|
|
96
|
-
this.
|
|
96
|
+
this.isFullyClosed.set(false);
|
|
97
|
+
this._cdr.detectChanges();
|
|
98
|
+
requestAnimationFrame(() => {
|
|
99
|
+
this._autoPos()?.start();
|
|
100
|
+
this._popover().togglePopover(true);
|
|
101
|
+
});
|
|
97
102
|
});
|
|
98
103
|
}
|
|
99
104
|
/**
|
|
@@ -151,10 +156,10 @@ class NgnPopover extends NgnBase {
|
|
|
151
156
|
this.isFullyClosed.set(false);
|
|
152
157
|
}
|
|
153
158
|
}
|
|
154
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
155
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.
|
|
159
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.10", ngImport: i0, type: NgnPopover, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
160
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.10", type: NgnPopover, isStandalone: true, selector: "ngn-popover", inputs: { open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null }, anchor: { classPropertyName: "anchor", publicName: "anchor", isSignal: true, isRequired: true, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, hasShrinkableContent: { classPropertyName: "hasShrinkableContent", publicName: "hasShrinkableContent", isSignal: true, isRequired: false, transformFunction: null }, closeBy: { classPropertyName: "closeBy", publicName: "closeBy", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { closed: "closed", closing: "closing", open: "openChange" }, host: { listeners: { "click": "$event.stopPropagation()" } }, providers: [provideSelf(NgnPopover)], queries: [{ propertyName: "lazyContent", first: true, predicate: ["lazy"], descendants: true, isSignal: true }], viewQueries: [{ propertyName: "_content", first: true, predicate: ["content"], descendants: true, isSignal: true }, { propertyName: "_popoverRef", first: true, predicate: ["popover"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'root'\"\r\n #popover\r\n [attr.popover]=\"closeByPopover()\"\r\n (toggle)=\"onToggle($event)\"\r\n [style.min-height]=\"\r\n hasShrinkableContent()\r\n ? (this.appliedOptions().sizeConstraints?.minHeight ?? null)\r\n : 'fit-content'\r\n \"\r\n>\r\n <div\r\n #content\r\n [ptInt]=\"this\"\r\n [ptClass]=\"{\r\n content: true,\r\n 'content-closing': !this.open() && !this.isFullyClosed(),\r\n }\"\r\n [style.min-height]=\"hasShrinkableContent() ? null : 'fit-content'\"\r\n >\r\n <ngn-defer\r\n [lazyContent]=\"lazyContent()\"\r\n [open]=\"open() || !isFullyClosed()\"\r\n [cache]=\"appliedOptions().cache\"\r\n >\r\n <ng-content></ng-content>\r\n </ngn-defer>\r\n </div>\r\n</div>\r\n", dependencies: [{ kind: "directive", type: NgnPt, selector: "[ptInt]", inputs: ["ptInt", "ptClass"] }, { kind: "component", type: NgnDefer, selector: "ngn-defer", inputs: ["lazyContent", "lazyContentContext", "open", "lazy", "cache", "hiddenOnClosed"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
156
161
|
}
|
|
157
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
162
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.10", ngImport: i0, type: NgnPopover, decorators: [{
|
|
158
163
|
type: Component,
|
|
159
164
|
args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'ngn-popover', imports: [NgnPt, NgnDefer], providers: [provideSelf(NgnPopover)], host: {
|
|
160
165
|
'(click)': '$event.stopPropagation()',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngneers-controls-popover.mjs","sources":["../../src/popover/popover.ts","../../src/popover/popover.html","../../src/popover/ngneers-controls-popover.ts"],"sourcesContent":["import {\r\n booleanAttribute,\r\n Component,\r\n computed,\r\n contentChild,\r\n ElementRef,\r\n inject,\r\n Injector,\r\n input,\r\n model,\r\n output,\r\n signal,\r\n TemplateRef,\r\n untracked,\r\n viewChild,\r\n ChangeDetectionStrategy,\r\n} from '@angular/core';\r\nimport {\r\n type PopoverCloseBy,\r\n toPopoverCloseBy,\r\n autoPositionElement,\r\n type AutoPositioningHandle,\r\n type Openable,\r\n type Anchor,\r\n} from '@ngneers/controls/api/ng';\r\nimport { NgnBase, provideSelf, NgnPt } from '@ngneers/controls/base';\r\nimport { NgnDefer } from '@ngneers/controls/defer';\r\nimport { computedWithPrevious, explicitAfterRenderEffect } from '@ngneers/controls/utils-ng';\r\nimport { popoverControlTemplate } from '@ngneers/controls-themes/templates/popover';\r\n\r\nimport type { PopoverOptions } from './types';\r\n\r\n/**\r\n * @category control\r\n */\r\n@Component({\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n selector: 'ngn-popover',\r\n templateUrl: './popover.html',\r\n imports: [NgnPt, NgnDefer],\r\n providers: [provideSelf(NgnPopover)],\r\n host: {\r\n '(click)': '$event.stopPropagation()',\r\n },\r\n})\r\nexport class NgnPopover extends NgnBase<'popover'> implements Openable {\r\n protected readonly theme = this.injectThemeTemplate(popoverControlTemplate);\r\n\r\n /**\r\n * Emits when the popover has fully closed.\r\n */\r\n public readonly closed = output();\r\n /**\r\n * Emits when the popover is closed.\r\n */\r\n public readonly closing = output();\r\n /**\r\n * Shows or hides the popover.\r\n *\r\n * You probably want to react to openChange events from outside to update your variable accordingly.\r\n */\r\n public readonly open = model<boolean>(false);\r\n /**\r\n * The element to which the popover is anchored.\r\n */\r\n public readonly anchor = input.required<Anchor>();\r\n /**\r\n * The popover options.\r\n */\r\n public readonly options = input<PopoverOptions>();\r\n /**\r\n * Set to true for scrollable/shrink-able content\r\n */\r\n public readonly hasShrinkableContent = input(false, { transform: booleanAttribute });\r\n /**\r\n * How the drawer closes depending on user interaction.\r\n * @default 'any'\r\n */\r\n public readonly closeBy = input<PopoverCloseBy>('any');\r\n\r\n protected readonly lazyContent = contentChild<TemplateRef<unknown>>('lazy');\r\n protected readonly _content = viewChild.required<ElementRef<HTMLElement>>('content');\r\n protected readonly closeByPopover = computed(() => toPopoverCloseBy(this.closeBy()));\r\n protected readonly isFullyClosed = signal(true);\r\n\r\n private _skipEmitCloseEvent = false;\r\n private _triggeredByInput = false;\r\n\r\n protected readonly appliedOptions = computed(() => ({\r\n cache: false,\r\n ...this.options(),\r\n }));\r\n\r\n private readonly _injector = inject(Injector);\r\n private readonly _popoverRef = viewChild.required<ElementRef<HTMLElement>>('popover');\r\n private readonly _popover = computed(() => this._popoverRef().nativeElement);\r\n private readonly _autoPos = computedWithPrevious<AutoPositioningHandle | undefined>(prev => {\r\n prev?.stop();\r\n const popoverEl = this._popover();\r\n if (!popoverEl) {\r\n return undefined;\r\n }\r\n return autoPositionElement(this.anchor(), popoverEl, {\r\n injector: this._injector,\r\n stopped: true,\r\n sizeConstraints: this.appliedOptions()?.sizeConstraints,\r\n placement: this.appliedOptions()?.placement,\r\n offset: this.appliedOptions()?.padding,\r\n hasShrinkableContent: this.hasShrinkableContent(),\r\n });\r\n });\r\n\r\n constructor() {\r\n super();\r\n\r\n explicitAfterRenderEffect([this.open], ([open]) => {\r\n if (!open) {\r\n this._triggeredByInput = true;\r\n this.hide();\r\n }\r\n if (open) {\r\n this._triggeredByInput = true;\r\n this.show();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Opens the drawer. Alternatively, you can also set the `open` input to `true`.\r\n */\r\n public show() {\r\n untracked(() => {\r\n if (this.open() && !this._triggeredByInput) {\r\n return;\r\n }\r\n this._triggeredByInput = false;\r\n this._autoPos()?.start();\r\n this._popover().togglePopover(true);\r\n });\r\n }\r\n\r\n /**\r\n * Closes the drawer. Alternatively, you can also set the `open` input to `false`.\r\n */\r\n public hide(emitCloseEvent = true) {\r\n untracked(() => {\r\n if (!this.open() && !this._triggeredByInput) {\r\n return;\r\n }\r\n this._triggeredByInput = false;\r\n this._skipEmitCloseEvent = !emitCloseEvent;\r\n this._autoPos()?.stop();\r\n this._popover().togglePopover(false);\r\n });\r\n }\r\n\r\n /**\r\n * Toggles the drawer open or closed. Alternatively, you can also set the `open` input accordingly.\r\n */\r\n public toggle() {\r\n if (untracked(this.open)) {\r\n this.hide();\r\n } else {\r\n this.show();\r\n }\r\n }\r\n\r\n protected onToggle(event: Event) {\r\n const evt = event as ToggleEvent;\r\n if (evt.newState === 'closed') {\r\n this.open.set(false);\r\n\r\n if (this._skipEmitCloseEvent) {\r\n this._skipEmitCloseEvent = false;\r\n } else {\r\n this.closing.emit();\r\n }\r\n this._autoPos()?.stop();\r\n\r\n requestAnimationFrame(() => {\r\n const allAnimationsDone = Promise.all(\r\n this._content()\r\n .nativeElement.getAnimations()\r\n .map(x => x.finished)\r\n );\r\n allAnimationsDone\r\n .then(() => {\r\n this.isFullyClosed.set(true);\r\n this.closed.emit();\r\n })\r\n .catch(() => {\r\n // ignore cancelled animation\r\n });\r\n });\r\n } else {\r\n this.open.set(true);\r\n this.isFullyClosed.set(false);\r\n }\r\n }\r\n}\r\n","<div\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'root'\"\r\n #popover\r\n [attr.popover]=\"closeByPopover()\"\r\n (toggle)=\"onToggle($event)\"\r\n [style.min-height]=\"\r\n hasShrinkableContent()\r\n ? (this.appliedOptions().sizeConstraints?.minHeight ?? null)\r\n : 'fit-content'\r\n \"\r\n>\r\n <div\r\n #content\r\n [ptInt]=\"this\"\r\n [ptClass]=\"{\r\n content: true,\r\n 'content-closing': !this.open() && !this.isFullyClosed(),\r\n }\"\r\n [style.min-height]=\"hasShrinkableContent() ? null : 'fit-content'\"\r\n >\r\n <ngn-defer\r\n [lazyContent]=\"lazyContent()\"\r\n [open]=\"open() || !isFullyClosed()\"\r\n [cache]=\"appliedOptions().cache\"\r\n >\r\n <ng-content></ng-content>\r\n </ngn-defer>\r\n </div>\r\n</div>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ngneers-controls-popover.mjs","sources":["../../src/popover/popover.ts","../../src/popover/popover.html","../../src/popover/ngneers-controls-popover.ts"],"sourcesContent":["import {\r\n booleanAttribute,\r\n ChangeDetectorRef,\r\n Component,\r\n computed,\r\n contentChild,\r\n ElementRef,\r\n inject,\r\n Injector,\r\n input,\r\n model,\r\n output,\r\n signal,\r\n TemplateRef,\r\n untracked,\r\n viewChild,\r\n ChangeDetectionStrategy,\r\n} from '@angular/core';\r\nimport {\r\n type PopoverCloseBy,\r\n toPopoverCloseBy,\r\n autoPositionElement,\r\n type AutoPositioningHandle,\r\n type Openable,\r\n type Anchor,\r\n} from '@ngneers/controls/api/ng';\r\nimport { NgnBase, provideSelf, NgnPt } from '@ngneers/controls/base';\r\nimport { NgnDefer } from '@ngneers/controls/defer';\r\nimport { computedWithPrevious, explicitAfterRenderEffect } from '@ngneers/controls/utils-ng';\r\nimport { popoverControlTemplate } from '@ngneers/controls-themes/templates/popover';\r\n\r\nimport type { PopoverOptions } from './types';\r\n\r\n/**\r\n * @category control\r\n */\r\n@Component({\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n selector: 'ngn-popover',\r\n templateUrl: './popover.html',\r\n imports: [NgnPt, NgnDefer],\r\n providers: [provideSelf(NgnPopover)],\r\n host: {\r\n '(click)': '$event.stopPropagation()',\r\n },\r\n})\r\nexport class NgnPopover extends NgnBase<'popover'> implements Openable {\r\n protected readonly theme = this.injectThemeTemplate(popoverControlTemplate);\r\n\r\n /**\r\n * Emits when the popover has fully closed.\r\n */\r\n public readonly closed = output();\r\n /**\r\n * Emits when the popover is closed.\r\n */\r\n public readonly closing = output();\r\n /**\r\n * Shows or hides the popover.\r\n *\r\n * You probably want to react to openChange events from outside to update your variable accordingly.\r\n */\r\n public readonly open = model<boolean>(false);\r\n /**\r\n * The element to which the popover is anchored.\r\n */\r\n public readonly anchor = input.required<Anchor>();\r\n /**\r\n * The popover options.\r\n */\r\n public readonly options = input<PopoverOptions>();\r\n /**\r\n * Set to true for scrollable/shrink-able content\r\n */\r\n public readonly hasShrinkableContent = input(false, { transform: booleanAttribute });\r\n /**\r\n * How the drawer closes depending on user interaction.\r\n * @default 'any'\r\n */\r\n public readonly closeBy = input<PopoverCloseBy>('any');\r\n\r\n protected readonly lazyContent = contentChild<TemplateRef<unknown>>('lazy');\r\n protected readonly _content = viewChild.required<ElementRef<HTMLElement>>('content');\r\n protected readonly closeByPopover = computed(() => toPopoverCloseBy(this.closeBy()));\r\n protected readonly isFullyClosed = signal(true);\r\n\r\n private _skipEmitCloseEvent = false;\r\n private _triggeredByInput = false;\r\n\r\n protected readonly appliedOptions = computed(() => ({\r\n cache: false,\r\n ...this.options(),\r\n }));\r\n\r\n private readonly _injector = inject(Injector);\r\n private readonly _cdr = inject(ChangeDetectorRef);\r\n private readonly _popoverRef = viewChild.required<ElementRef<HTMLElement>>('popover');\r\n private readonly _popover = computed(() => this._popoverRef().nativeElement);\r\n private readonly _autoPos = computedWithPrevious<AutoPositioningHandle | undefined>(prev => {\r\n prev?.stop();\r\n const popoverEl = this._popover();\r\n if (!popoverEl) {\r\n return undefined;\r\n }\r\n return autoPositionElement(this.anchor(), popoverEl, {\r\n injector: this._injector,\r\n stopped: true,\r\n sizeConstraints: this.appliedOptions()?.sizeConstraints,\r\n placement: this.appliedOptions()?.placement,\r\n offset: this.appliedOptions()?.padding,\r\n hasShrinkableContent: this.hasShrinkableContent(),\r\n });\r\n });\r\n\r\n constructor() {\r\n super();\r\n\r\n explicitAfterRenderEffect([this.open], ([open]) => {\r\n if (!open) {\r\n this._triggeredByInput = true;\r\n this.hide();\r\n }\r\n if (open) {\r\n this._triggeredByInput = true;\r\n this.show();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Opens the drawer. Alternatively, you can also set the `open` input to `true`.\r\n */\r\n public show() {\r\n untracked(() => {\r\n if (this.open() && !this._triggeredByInput) {\r\n return;\r\n }\r\n this._triggeredByInput = false;\r\n this.isFullyClosed.set(false);\r\n this._cdr.detectChanges();\r\n requestAnimationFrame(() => {\r\n this._autoPos()?.start();\r\n this._popover().togglePopover(true);\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Closes the drawer. Alternatively, you can also set the `open` input to `false`.\r\n */\r\n public hide(emitCloseEvent = true) {\r\n untracked(() => {\r\n if (!this.open() && !this._triggeredByInput) {\r\n return;\r\n }\r\n this._triggeredByInput = false;\r\n this._skipEmitCloseEvent = !emitCloseEvent;\r\n this._autoPos()?.stop();\r\n this._popover().togglePopover(false);\r\n });\r\n }\r\n\r\n /**\r\n * Toggles the drawer open or closed. Alternatively, you can also set the `open` input accordingly.\r\n */\r\n public toggle() {\r\n if (untracked(this.open)) {\r\n this.hide();\r\n } else {\r\n this.show();\r\n }\r\n }\r\n\r\n protected onToggle(event: Event) {\r\n const evt = event as ToggleEvent;\r\n if (evt.newState === 'closed') {\r\n this.open.set(false);\r\n\r\n if (this._skipEmitCloseEvent) {\r\n this._skipEmitCloseEvent = false;\r\n } else {\r\n this.closing.emit();\r\n }\r\n this._autoPos()?.stop();\r\n\r\n requestAnimationFrame(() => {\r\n const allAnimationsDone = Promise.all(\r\n this._content()\r\n .nativeElement.getAnimations()\r\n .map(x => x.finished)\r\n );\r\n allAnimationsDone\r\n .then(() => {\r\n this.isFullyClosed.set(true);\r\n this.closed.emit();\r\n })\r\n .catch(() => {\r\n // ignore cancelled animation\r\n });\r\n });\r\n } else {\r\n this.open.set(true);\r\n this.isFullyClosed.set(false);\r\n }\r\n }\r\n}\r\n","<div\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'root'\"\r\n #popover\r\n [attr.popover]=\"closeByPopover()\"\r\n (toggle)=\"onToggle($event)\"\r\n [style.min-height]=\"\r\n hasShrinkableContent()\r\n ? (this.appliedOptions().sizeConstraints?.minHeight ?? null)\r\n : 'fit-content'\r\n \"\r\n>\r\n <div\r\n #content\r\n [ptInt]=\"this\"\r\n [ptClass]=\"{\r\n content: true,\r\n 'content-closing': !this.open() && !this.isFullyClosed(),\r\n }\"\r\n [style.min-height]=\"hasShrinkableContent() ? null : 'fit-content'\"\r\n >\r\n <ngn-defer\r\n [lazyContent]=\"lazyContent()\"\r\n [open]=\"open() || !isFullyClosed()\"\r\n [cache]=\"appliedOptions().cache\"\r\n >\r\n <ng-content></ng-content>\r\n </ngn-defer>\r\n </div>\r\n</div>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;AAiCA;;AAEG;AAWG,MAAO,UAAW,SAAQ,OAAkB,CAAA;AAC7B,IAAA,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,sBAAsB,CAAC;AAE3E;;AAEG;IACa,MAAM,GAAG,MAAM,EAAE;AACjC;;AAEG;IACa,OAAO,GAAG,MAAM,EAAE;AAClC;;;;AAIG;AACa,IAAA,IAAI,GAAG,KAAK,CAAU,KAAK,2EAAC;AAC5C;;AAEG;AACa,IAAA,MAAM,GAAG,KAAK,CAAC,QAAQ,4EAAU;AACjD;;AAEG;IACa,OAAO,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,SAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAkB;AACjD;;AAEG;IACa,oBAAoB,GAAG,KAAK,CAAC,KAAK,4FAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AACpF;;;AAGG;AACa,IAAA,OAAO,GAAG,KAAK,CAAiB,KAAK,8EAAC;AAEnC,IAAA,WAAW,GAAG,YAAY,CAAuB,MAAM,kFAAC;AACxD,IAAA,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAA0B,SAAS,CAAC;AACjE,IAAA,cAAc,GAAG,QAAQ,CAAC,MAAM,gBAAgB,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,qFAAC;AACjE,IAAA,aAAa,GAAG,MAAM,CAAC,IAAI,oFAAC;IAEvC,mBAAmB,GAAG,KAAK;IAC3B,iBAAiB,GAAG,KAAK;AAEd,IAAA,cAAc,GAAG,QAAQ,CAAC,OAAO;AAClD,QAAA,KAAK,EAAE,KAAK;QACZ,GAAG,IAAI,CAAC,OAAO,EAAE;AAClB,KAAA,CAAC,qFAAC;AAEc,IAAA,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC;AAC5B,IAAA,IAAI,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAChC,IAAA,WAAW,GAAG,SAAS,CAAC,QAAQ,CAA0B,SAAS,CAAC;AACpE,IAAA,QAAQ,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,aAAa,+EAAC;AAC3D,IAAA,QAAQ,GAAG,oBAAoB,CAAoC,IAAI,IAAG;QACzF,IAAI,EAAE,IAAI,EAAE;AACZ,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE;QACjC,IAAI,CAAC,SAAS,EAAE;AACd,YAAA,OAAO,SAAS;QAClB;QACA,OAAO,mBAAmB,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE;YACnD,QAAQ,EAAE,IAAI,CAAC,SAAS;AACxB,YAAA,OAAO,EAAE,IAAI;AACb,YAAA,eAAe,EAAE,IAAI,CAAC,cAAc,EAAE,EAAE,eAAe;AACvD,YAAA,SAAS,EAAE,IAAI,CAAC,cAAc,EAAE,EAAE,SAAS;AAC3C,YAAA,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,EAAE,OAAO;AACtC,YAAA,oBAAoB,EAAE,IAAI,CAAC,oBAAoB,EAAE;AAClD,SAAA,CAAC;AACJ,IAAA,CAAC,CAAC;AAEF,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,EAAE;AAEP,QAAA,yBAAyB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAI;YAChD,IAAI,CAAC,IAAI,EAAE;AACT,gBAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI;gBAC7B,IAAI,CAAC,IAAI,EAAE;YACb;YACA,IAAI,IAAI,EAAE;AACR,gBAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI;gBAC7B,IAAI,CAAC,IAAI,EAAE;YACb;AACF,QAAA,CAAC,CAAC;IACJ;AAEA;;AAEG;IACI,IAAI,GAAA;QACT,SAAS,CAAC,MAAK;YACb,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE;gBAC1C;YACF;AACA,YAAA,IAAI,CAAC,iBAAiB,GAAG,KAAK;AAC9B,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;AAC7B,YAAA,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;YACzB,qBAAqB,CAAC,MAAK;AACzB,gBAAA,IAAI,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE;gBACxB,IAAI,CAAC,QAAQ,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC;AACrC,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;IACJ;AAEA;;AAEG;IACI,IAAI,CAAC,cAAc,GAAG,IAAI,EAAA;QAC/B,SAAS,CAAC,MAAK;YACb,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE;gBAC3C;YACF;AACA,YAAA,IAAI,CAAC,iBAAiB,GAAG,KAAK;AAC9B,YAAA,IAAI,CAAC,mBAAmB,GAAG,CAAC,cAAc;AAC1C,YAAA,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE;YACvB,IAAI,CAAC,QAAQ,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC;AACtC,QAAA,CAAC,CAAC;IACJ;AAEA;;AAEG;IACI,MAAM,GAAA;AACX,QAAA,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACxB,IAAI,CAAC,IAAI,EAAE;QACb;aAAO;YACL,IAAI,CAAC,IAAI,EAAE;QACb;IACF;AAEU,IAAA,QAAQ,CAAC,KAAY,EAAA;QAC7B,MAAM,GAAG,GAAG,KAAoB;AAChC,QAAA,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,EAAE;AAC7B,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;AAEpB,YAAA,IAAI,IAAI,CAAC,mBAAmB,EAAE;AAC5B,gBAAA,IAAI,CAAC,mBAAmB,GAAG,KAAK;YAClC;iBAAO;AACL,gBAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;YACrB;AACA,YAAA,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE;YAEvB,qBAAqB,CAAC,MAAK;gBACzB,MAAM,iBAAiB,GAAG,OAAO,CAAC,GAAG,CACnC,IAAI,CAAC,QAAQ;qBACV,aAAa,CAAC,aAAa;qBAC3B,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CACxB;gBACD;qBACG,IAAI,CAAC,MAAK;AACT,oBAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;AAC5B,oBAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;AACpB,gBAAA,CAAC;qBACA,KAAK,CAAC,MAAK;;AAEZ,gBAAA,CAAC,CAAC;AACN,YAAA,CAAC,CAAC;QACJ;aAAO;AACL,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;AACnB,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;QAC/B;IACF;wGA9JW,UAAU,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAV,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,UAAU,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,oBAAA,EAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,UAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,YAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,OAAA,EAAA,0BAAA,EAAA,EAAA,EAAA,SAAA,EALV,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,aAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,MAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,UAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,SAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,aAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,SAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECzCtC,qyBA8BA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDUY,KAAK,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,QAAQ,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,gBAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAMd,UAAU,EAAA,UAAA,EAAA,CAAA;kBAVtB,SAAS;AACS,YAAA,IAAA,EAAA,CAAA,EAAA,eAAA,EAAA,uBAAuB,CAAC,MAAM,EAAA,QAAA,EACrC,aAAa,WAEd,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAA,SAAA,EACf,CAAC,WAAW,CAAA,UAAA,CAAY,CAAC,EAAA,IAAA,EAC9B;AACJ,wBAAA,SAAS,EAAE,0BAA0B;AACtC,qBAAA,EAAA,QAAA,EAAA,qyBAAA,EAAA;4tBAqCmE,MAAM,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CACA,SAAS,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CAcR,SAAS,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AEhGtF;;AAEG;;;;"}
|
|
@@ -60,10 +60,10 @@ class NgnProgress extends NgnBase {
|
|
|
60
60
|
constructor() {
|
|
61
61
|
super();
|
|
62
62
|
}
|
|
63
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
64
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.
|
|
63
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.10", ngImport: i0, type: NgnProgress, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
64
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.10", type: NgnProgress, isStandalone: true, selector: "ngn-progress", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, indeterminate: { classPropertyName: "indeterminate", publicName: "indeterminate", isSignal: true, isRequired: false, transformFunction: null }, circular: { classPropertyName: "circular", publicName: "circular", isSignal: true, isRequired: false, transformFunction: null }, radius: { classPropertyName: "radius", publicName: "radius", isSignal: true, isRequired: false, transformFunction: null }, thickness: { classPropertyName: "thickness", publicName: "thickness", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "progressbar" }, properties: { "attr.aria-valuemin": "0", "attr.aria-valuemax": "100", "attr.aria-valuenow": "indeterminate() ? null : safeValue()", "style.--progress.%": "indeterminate() ? null : safeValue()" } }, providers: [provideSelf(NgnProgress)], usesInheritance: true, ngImport: i0, template: "@if (circular()) {\r\n <svg\r\n [attr.width]=\"svgSize()\"\r\n [attr.height]=\"svgSize()\"\r\n [attr.viewBox]=\"'0 0 ' + svgSize() + ' ' + svgSize()\"\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'svg'\"\r\n >\r\n <circle\r\n [attr.cx]=\"svgCenter()\"\r\n [attr.cy]=\"svgCenter()\"\r\n [attr.r]=\"safeRadius()\"\r\n [attr.stroke-width]=\"safeThickness()\"\r\n fill=\"none\"\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'track'\"\r\n />\r\n <circle\r\n [attr.cx]=\"svgCenter()\"\r\n [attr.cy]=\"svgCenter()\"\r\n [attr.r]=\"safeRadius()\"\r\n [attr.stroke-width]=\"safeThickness()\"\r\n fill=\"none\"\r\n [attr.stroke-dasharray]=\"strokeDasharray()\"\r\n [attr.stroke-dashoffset]=\"strokeDashoffset()\"\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'fill'\"\r\n />\r\n </svg>\r\n} @else {\r\n <div [ptInt]=\"this\" [ptClass]=\"'track'\" [style.height.px]=\"safeThickness()\">\r\n <div [ptInt]=\"this\" [ptClass]=\"'fill'\"></div>\r\n @if (indeterminate()) {\r\n <div [ptInt]=\"this\" [ptClass]=\"'fill2'\"></div>\r\n }\r\n </div>\r\n}\r\n", dependencies: [{ kind: "directive", type: NgnPt, selector: "[ptInt]", inputs: ["ptInt", "ptClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
65
65
|
}
|
|
66
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
66
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.10", ngImport: i0, type: NgnProgress, decorators: [{
|
|
67
67
|
type: Component,
|
|
68
68
|
args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'ngn-progress', imports: [NgnPt], providers: [provideSelf(NgnProgress)], host: {
|
|
69
69
|
role: 'progressbar',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngneers-controls-progress.mjs","sources":["../../src/progress/progress.ts","../../src/progress/progress.html","../../src/progress/ngneers-controls-progress.ts"],"sourcesContent":["import {\r\n Component,\r\n input,\r\n ChangeDetectionStrategy,\r\n computed,\r\n booleanAttribute,\r\n} from '@angular/core';\r\nimport { NgnBase, NgnPt, provideSelf } from '@ngneers/controls/base';\r\nimport { progressControlTemplate } from '@ngneers/controls-themes/templates/progress';\r\n\r\nconst TAU = Math.PI * 2;\r\n\r\n/**\r\n * @category control\r\n */\r\n@Component({\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n selector: 'ngn-progress',\r\n templateUrl: './progress.html',\r\n imports: [NgnPt],\r\n providers: [provideSelf(NgnProgress)],\r\n host: {\r\n role: 'progressbar',\r\n '[attr.aria-valuemin]': '0',\r\n '[attr.aria-valuemax]': '100',\r\n '[attr.aria-valuenow]': 'indeterminate() ? null : safeValue()',\r\n '[style.--progress.%]': 'indeterminate() ? null : safeValue()',\r\n },\r\n})\r\nexport class NgnProgress extends NgnBase<'progress'> {\r\n protected readonly theme = this.injectThemeTemplate(progressControlTemplate, {\r\n root: true,\r\n indeterminate: () => this.indeterminate(),\r\n circular: () => this.circular(),\r\n });\r\n\r\n /**\r\n * The current progress value (0-100).\r\n */\r\n public readonly value = input<number>(0);\r\n /**\r\n * Whether the progress indicator is indeterminate.\r\n */\r\n public readonly indeterminate = input(false, { transform: booleanAttribute });\r\n /**\r\n * Whether the progress indicator is circular.\r\n */\r\n public readonly circular = input(false, { transform: booleanAttribute });\r\n\r\n /**\r\n * Radius of the circular progress indicator (in px).\r\n */\r\n public readonly radius = input<number>(40);\r\n\r\n /**\r\n * Thickness of the circular progress indicator stroke (in px).\r\n */\r\n public readonly thickness = input<number>(8);\r\n\r\n protected readonly safeValue = computed(() => Math.min(Math.max(this.value(), 0), 100));\r\n\r\n protected readonly safeRadius = computed(() => Math.max(this.radius(), 0));\r\n protected readonly safeThickness = computed(() => Math.max(this.thickness(), 1));\r\n\r\n protected readonly svgSize = computed(() => {\r\n // Full size of the SVG in px.\r\n return this.safeRadius() * 2 + this.safeThickness();\r\n });\r\n\r\n protected readonly svgCenter = computed(() => this.svgSize() / 2);\r\n\r\n protected readonly circumference = computed(() => TAU * this.safeRadius());\r\n\r\n protected readonly strokeDasharray = computed(() => {\r\n const circumference = this.circumference();\r\n // Arc length for indeterminate mode.\r\n if (this.indeterminate()) {\r\n return `${circumference * 0.28} ${circumference}`;\r\n }\r\n return `${circumference}`;\r\n });\r\n\r\n protected readonly strokeDashoffset = computed(() => {\r\n const circumference = this.circumference();\r\n if (this.indeterminate()) {\r\n return `${circumference * 0.72}`;\r\n }\r\n return `${circumference * (1 - this.safeValue() / 100)}`;\r\n });\r\n\r\n constructor() {\r\n super();\r\n }\r\n}\r\n","@if (circular()) {\r\n <svg\r\n [attr.width]=\"svgSize()\"\r\n [attr.height]=\"svgSize()\"\r\n [attr.viewBox]=\"'0 0 ' + svgSize() + ' ' + svgSize()\"\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'svg'\"\r\n >\r\n <circle\r\n [attr.cx]=\"svgCenter()\"\r\n [attr.cy]=\"svgCenter()\"\r\n [attr.r]=\"safeRadius()\"\r\n [attr.stroke-width]=\"safeThickness()\"\r\n fill=\"none\"\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'track'\"\r\n />\r\n <circle\r\n [attr.cx]=\"svgCenter()\"\r\n [attr.cy]=\"svgCenter()\"\r\n [attr.r]=\"safeRadius()\"\r\n [attr.stroke-width]=\"safeThickness()\"\r\n fill=\"none\"\r\n [attr.stroke-dasharray]=\"strokeDasharray()\"\r\n [attr.stroke-dashoffset]=\"strokeDashoffset()\"\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'fill'\"\r\n />\r\n </svg>\r\n} @else {\r\n <div [ptInt]=\"this\" [ptClass]=\"'track'\" [style.height.px]=\"safeThickness()\">\r\n <div [ptInt]=\"this\" [ptClass]=\"'fill'\"></div>\r\n @if (indeterminate()) {\r\n <div [ptInt]=\"this\" [ptClass]=\"'fill2'\"></div>\r\n }\r\n </div>\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;AAUA,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC;AAEvB;;AAEG;AAeG,MAAO,WAAY,SAAQ,OAAmB,CAAA;AAC/B,IAAA,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,uBAAuB,EAAE;AAC3E,QAAA,IAAI,EAAE,IAAI;AACV,QAAA,aAAa,EAAE,MAAM,IAAI,CAAC,aAAa,EAAE;AACzC,QAAA,QAAQ,EAAE,MAAM,IAAI,CAAC,QAAQ,EAAE;AAChC,KAAA,CAAC;AAEF;;AAEG;AACa,IAAA,KAAK,GAAG,KAAK,CAAS,CAAC,4EAAC;AACxC;;AAEG;IACa,aAAa,GAAG,KAAK,CAAC,KAAK,qFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AAC7E;;AAEG;IACa,QAAQ,GAAG,KAAK,CAAC,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;AAExE;;AAEG;AACa,IAAA,MAAM,GAAG,KAAK,CAAS,EAAE,6EAAC;AAE1C;;AAEG;AACa,IAAA,SAAS,GAAG,KAAK,CAAS,CAAC,gFAAC;IAEzB,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,WAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AAEpE,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,iFAAC;AACvD,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,oFAAC;AAE7D,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAK;;QAEzC,OAAO,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,aAAa,EAAE;AACrD,IAAA,CAAC,8EAAC;AAEiB,IAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,gFAAC;AAE9C,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE,oFAAC;AAEvD,IAAA,eAAe,GAAG,QAAQ,CAAC,MAAK;AACjD,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,EAAE;;AAE1C,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE;AACxB,YAAA,OAAO,GAAG,aAAa,GAAG,IAAI,CAAA,CAAA,EAAI,aAAa,EAAE;QACnD;QACA,OAAO,CAAA,EAAG,aAAa,CAAA,CAAE;AAC3B,IAAA,CAAC,sFAAC;AAEiB,IAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAK;AAClD,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,EAAE;AAC1C,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE;AACxB,YAAA,OAAO,CAAA,EAAG,aAAa,GAAG,IAAI,EAAE;QAClC;AACA,QAAA,OAAO,CAAA,EAAG,aAAa,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,GAAG,CAAC,EAAE;AAC1D,IAAA,CAAC,uFAAC;AAEF,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,EAAE;IACT;
|
|
1
|
+
{"version":3,"file":"ngneers-controls-progress.mjs","sources":["../../src/progress/progress.ts","../../src/progress/progress.html","../../src/progress/ngneers-controls-progress.ts"],"sourcesContent":["import {\r\n Component,\r\n input,\r\n ChangeDetectionStrategy,\r\n computed,\r\n booleanAttribute,\r\n} from '@angular/core';\r\nimport { NgnBase, NgnPt, provideSelf } from '@ngneers/controls/base';\r\nimport { progressControlTemplate } from '@ngneers/controls-themes/templates/progress';\r\n\r\nconst TAU = Math.PI * 2;\r\n\r\n/**\r\n * @category control\r\n */\r\n@Component({\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n selector: 'ngn-progress',\r\n templateUrl: './progress.html',\r\n imports: [NgnPt],\r\n providers: [provideSelf(NgnProgress)],\r\n host: {\r\n role: 'progressbar',\r\n '[attr.aria-valuemin]': '0',\r\n '[attr.aria-valuemax]': '100',\r\n '[attr.aria-valuenow]': 'indeterminate() ? null : safeValue()',\r\n '[style.--progress.%]': 'indeterminate() ? null : safeValue()',\r\n },\r\n})\r\nexport class NgnProgress extends NgnBase<'progress'> {\r\n protected readonly theme = this.injectThemeTemplate(progressControlTemplate, {\r\n root: true,\r\n indeterminate: () => this.indeterminate(),\r\n circular: () => this.circular(),\r\n });\r\n\r\n /**\r\n * The current progress value (0-100).\r\n */\r\n public readonly value = input<number>(0);\r\n /**\r\n * Whether the progress indicator is indeterminate.\r\n */\r\n public readonly indeterminate = input(false, { transform: booleanAttribute });\r\n /**\r\n * Whether the progress indicator is circular.\r\n */\r\n public readonly circular = input(false, { transform: booleanAttribute });\r\n\r\n /**\r\n * Radius of the circular progress indicator (in px).\r\n */\r\n public readonly radius = input<number>(40);\r\n\r\n /**\r\n * Thickness of the circular progress indicator stroke (in px).\r\n */\r\n public readonly thickness = input<number>(8);\r\n\r\n protected readonly safeValue = computed(() => Math.min(Math.max(this.value(), 0), 100));\r\n\r\n protected readonly safeRadius = computed(() => Math.max(this.radius(), 0));\r\n protected readonly safeThickness = computed(() => Math.max(this.thickness(), 1));\r\n\r\n protected readonly svgSize = computed(() => {\r\n // Full size of the SVG in px.\r\n return this.safeRadius() * 2 + this.safeThickness();\r\n });\r\n\r\n protected readonly svgCenter = computed(() => this.svgSize() / 2);\r\n\r\n protected readonly circumference = computed(() => TAU * this.safeRadius());\r\n\r\n protected readonly strokeDasharray = computed(() => {\r\n const circumference = this.circumference();\r\n // Arc length for indeterminate mode.\r\n if (this.indeterminate()) {\r\n return `${circumference * 0.28} ${circumference}`;\r\n }\r\n return `${circumference}`;\r\n });\r\n\r\n protected readonly strokeDashoffset = computed(() => {\r\n const circumference = this.circumference();\r\n if (this.indeterminate()) {\r\n return `${circumference * 0.72}`;\r\n }\r\n return `${circumference * (1 - this.safeValue() / 100)}`;\r\n });\r\n\r\n constructor() {\r\n super();\r\n }\r\n}\r\n","@if (circular()) {\r\n <svg\r\n [attr.width]=\"svgSize()\"\r\n [attr.height]=\"svgSize()\"\r\n [attr.viewBox]=\"'0 0 ' + svgSize() + ' ' + svgSize()\"\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'svg'\"\r\n >\r\n <circle\r\n [attr.cx]=\"svgCenter()\"\r\n [attr.cy]=\"svgCenter()\"\r\n [attr.r]=\"safeRadius()\"\r\n [attr.stroke-width]=\"safeThickness()\"\r\n fill=\"none\"\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'track'\"\r\n />\r\n <circle\r\n [attr.cx]=\"svgCenter()\"\r\n [attr.cy]=\"svgCenter()\"\r\n [attr.r]=\"safeRadius()\"\r\n [attr.stroke-width]=\"safeThickness()\"\r\n fill=\"none\"\r\n [attr.stroke-dasharray]=\"strokeDasharray()\"\r\n [attr.stroke-dashoffset]=\"strokeDashoffset()\"\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'fill'\"\r\n />\r\n </svg>\r\n} @else {\r\n <div [ptInt]=\"this\" [ptClass]=\"'track'\" [style.height.px]=\"safeThickness()\">\r\n <div [ptInt]=\"this\" [ptClass]=\"'fill'\"></div>\r\n @if (indeterminate()) {\r\n <div [ptInt]=\"this\" [ptClass]=\"'fill2'\"></div>\r\n }\r\n </div>\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { inject, ElementRef, Injector, input, afterNextRender, Directive } from '@angular/core';
|
|
3
|
+
import { scrollShadowDirectiveTemplate } from '@ngneers/controls-themes/templates/api';
|
|
4
|
+
import { injectThemeTemplate, abortSignalOnDestroy } from '@ngneers/controls/api/ng';
|
|
5
|
+
import { toggleClass } from '@ngneers/controls/utils';
|
|
6
|
+
|
|
7
|
+
class NgnScrollShadow {
|
|
8
|
+
theme = injectThemeTemplate(scrollShadowDirectiveTemplate);
|
|
9
|
+
_el = inject(ElementRef);
|
|
10
|
+
_injector = inject(Injector);
|
|
11
|
+
ngnScrollShadow = input('horizontal', ...(ngDevMode ? [{ debugName: "ngnScrollShadow" }] : /* istanbul ignore next */ []));
|
|
12
|
+
scrollShadowTarget = input(undefined, ...(ngDevMode ? [{ debugName: "scrollShadowTarget" }] : /* istanbul ignore next */ []));
|
|
13
|
+
constructor() {
|
|
14
|
+
afterNextRender(() => {
|
|
15
|
+
const scrollEl = this._el.nativeElement;
|
|
16
|
+
const abort = abortSignalOnDestroy({ injector: this._injector });
|
|
17
|
+
const update = () => {
|
|
18
|
+
const target = this.scrollShadowTarget() ?? scrollEl;
|
|
19
|
+
const dir = this.ngnScrollShadow();
|
|
20
|
+
if (dir === 'horizontal' || dir === 'both') {
|
|
21
|
+
const sl = scrollEl.scrollLeft;
|
|
22
|
+
const maxH = scrollEl.scrollWidth - scrollEl.clientWidth;
|
|
23
|
+
toggleClass(target, this.theme.class('scrolled-start'), sl > 0);
|
|
24
|
+
toggleClass(target, this.theme.class('scrolled-end'), maxH > 0 && sl < maxH - 1);
|
|
25
|
+
}
|
|
26
|
+
if (dir === 'vertical' || dir === 'both') {
|
|
27
|
+
const st = scrollEl.scrollTop;
|
|
28
|
+
const maxV = scrollEl.scrollHeight - scrollEl.clientHeight;
|
|
29
|
+
toggleClass(target, this.theme.class('scrolled-top'), st > 0);
|
|
30
|
+
toggleClass(target, this.theme.class('scrolled-bottom'), maxV > 0 && st < maxV - 1);
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
const ro = new ResizeObserver(update);
|
|
34
|
+
ro.observe(scrollEl);
|
|
35
|
+
abort.addEventListener('abort', () => ro.disconnect());
|
|
36
|
+
scrollEl.addEventListener('scroll', update, { passive: true, signal: abort });
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.10", ngImport: i0, type: NgnScrollShadow, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
40
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.10", type: NgnScrollShadow, isStandalone: true, selector: "[ngnScrollShadow]", inputs: { ngnScrollShadow: { classPropertyName: "ngnScrollShadow", publicName: "ngnScrollShadow", isSignal: true, isRequired: false, transformFunction: null }, scrollShadowTarget: { classPropertyName: "scrollShadowTarget", publicName: "scrollShadowTarget", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 });
|
|
41
|
+
}
|
|
42
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.10", ngImport: i0, type: NgnScrollShadow, decorators: [{
|
|
43
|
+
type: Directive,
|
|
44
|
+
args: [{
|
|
45
|
+
selector: '[ngnScrollShadow]',
|
|
46
|
+
}]
|
|
47
|
+
}], ctorParameters: () => [], propDecorators: { ngnScrollShadow: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnScrollShadow", required: false }] }], scrollShadowTarget: [{ type: i0.Input, args: [{ isSignal: true, alias: "scrollShadowTarget", required: false }] }] } });
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Generated bundle index. Do not edit.
|
|
51
|
+
*/
|
|
52
|
+
|
|
53
|
+
export { NgnScrollShadow };
|
|
54
|
+
//# sourceMappingURL=ngneers-controls-scroll-shadow.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ngneers-controls-scroll-shadow.mjs","sources":["../../src/scroll-shadow/scroll-shadow.ts","../../src/scroll-shadow/ngneers-controls-scroll-shadow.ts"],"sourcesContent":["import { afterNextRender, Directive, ElementRef, inject, Injector, input } from '@angular/core';\r\nimport { scrollShadowDirectiveTemplate } from '@ngneers/controls-themes/templates/api';\r\n\r\nimport { abortSignalOnDestroy, injectThemeTemplate } from '@ngneers/controls/api/ng';\r\nimport { toggleClass } from '@ngneers/controls/utils';\r\n\r\n@Directive({\r\n selector: '[ngnScrollShadow]',\r\n})\r\nexport class NgnScrollShadow {\r\n protected readonly theme = injectThemeTemplate(scrollShadowDirectiveTemplate);\r\n private readonly _el = inject<ElementRef<HTMLElement>>(ElementRef);\r\n private readonly _injector = inject(Injector);\r\n\r\n public readonly ngnScrollShadow = input<'horizontal' | 'vertical' | 'both'>('horizontal');\r\n\r\n public readonly scrollShadowTarget = input<HTMLElement | undefined>(undefined);\r\n\r\n constructor() {\r\n afterNextRender(() => {\r\n const scrollEl = this._el.nativeElement;\r\n const abort = abortSignalOnDestroy({ injector: this._injector });\r\n\r\n const update = () => {\r\n const target = this.scrollShadowTarget() ?? scrollEl;\r\n const dir = this.ngnScrollShadow();\r\n\r\n if (dir === 'horizontal' || dir === 'both') {\r\n const sl = scrollEl.scrollLeft;\r\n const maxH = scrollEl.scrollWidth - scrollEl.clientWidth;\r\n toggleClass(target, this.theme.class('scrolled-start'), sl > 0);\r\n toggleClass(target, this.theme.class('scrolled-end'), maxH > 0 && sl < maxH - 1);\r\n }\r\n\r\n if (dir === 'vertical' || dir === 'both') {\r\n const st = scrollEl.scrollTop;\r\n const maxV = scrollEl.scrollHeight - scrollEl.clientHeight;\r\n toggleClass(target, this.theme.class('scrolled-top'), st > 0);\r\n toggleClass(target, this.theme.class('scrolled-bottom'), maxV > 0 && st < maxV - 1);\r\n }\r\n };\r\n\r\n const ro = new ResizeObserver(update);\r\n ro.observe(scrollEl);\r\n abort.addEventListener('abort', () => ro.disconnect());\r\n scrollEl.addEventListener('scroll', update, { passive: true, signal: abort });\r\n });\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -21,10 +21,10 @@ class ScrollerTemplates extends NgnBase {
|
|
|
21
21
|
* Can be used with the {@link NgnTemplate} directive for type safe ng-templates.
|
|
22
22
|
*/
|
|
23
23
|
templateTypes = templateTypesFn();
|
|
24
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
25
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "21.2.
|
|
24
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.10", ngImport: i0, type: ScrollerTemplates, deps: null, target: i0.ɵɵFactoryTarget.Directive });
|
|
25
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "21.2.10", type: ScrollerTemplates, isStandalone: true, inputs: { templateItem: { classPropertyName: "templateItem", publicName: "templateItem", isSignal: true, isRequired: false, transformFunction: null } }, queries: [{ propertyName: "_userItemTemplate", first: true, predicate: ["item"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0 });
|
|
26
26
|
}
|
|
27
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
27
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.10", ngImport: i0, type: ScrollerTemplates, decorators: [{
|
|
28
28
|
type: Directive
|
|
29
29
|
}], propDecorators: { templateItem: [{ type: i0.Input, args: [{ isSignal: true, alias: "templateItem", required: false }] }], _userItemTemplate: [{ type: i0.ContentChild, args: ['item', { isSignal: true }] }] } });
|
|
30
30
|
|
|
@@ -214,10 +214,10 @@ class NgnScroller extends ScrollerTemplates {
|
|
|
214
214
|
}
|
|
215
215
|
return item.index;
|
|
216
216
|
}
|
|
217
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
218
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.
|
|
217
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.10", ngImport: i0, type: NgnScroller, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
218
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.10", type: NgnScroller, isStandalone: true, selector: "ngn-scroller, [ngn-scroller]", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: true, transformFunction: null }, fieldId: { classPropertyName: "fieldId", publicName: "fieldId", isSignal: true, isRequired: false, transformFunction: null }, virtual: { classPropertyName: "virtual", publicName: "virtual", isSignal: true, isRequired: false, transformFunction: null }, itemHeight: { classPropertyName: "itemHeight", publicName: "itemHeight", isSignal: true, isRequired: false, transformFunction: null }, virtualPadding: { classPropertyName: "virtualPadding", publicName: "virtualPadding", isSignal: true, isRequired: false, transformFunction: null }, focusable: { classPropertyName: "focusable", publicName: "focusable", isSignal: true, isRequired: false, transformFunction: null }, fieldSticky: { classPropertyName: "fieldSticky", publicName: "fieldSticky", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "tabIndex": "focusable() ? 0 : -1", "style.--ngn-scroller-item-height.px": "itemHeight() ?? \"auto\"", "style.--ngn-scroller-padding-top.px": "paddingTop()", "style.--ngn-scroller-padding-bottom.px": "paddingBottom()" } }, providers: [provideSelf(NgnScroller)], usesInheritance: true, hostDirectives: [{ directive: i1.NgnScrollAmount, inputs: ["scrollContainer", "scrollContainer"] }], ngImport: i0, template: "@if (latestStickyItem(); as latestStickyItem) {\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n itemTemplate();\r\n context: { $implicit: latestStickyItem.item, index: latestStickyItem.index }\r\n \"\r\n ></ng-container>\r\n}\r\n\r\n@for (item of visibleItems(); track track(item)) {\r\n <ng-container\r\n *ngTemplateOutlet=\"itemTemplate(); context: { $implicit: item.item, index: item.index }\"\r\n ></ng-container>\r\n}\r\n", dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
219
219
|
}
|
|
220
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
220
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.10", ngImport: i0, type: NgnScroller, decorators: [{
|
|
221
221
|
type: Component,
|
|
222
222
|
args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'ngn-scroller, [ngn-scroller]', imports: [NgTemplateOutlet], providers: [provideSelf(NgnScroller)], hostDirectives: [{ directive: NgnScrollAmount, inputs: ['scrollContainer'] }], host: {
|
|
223
223
|
'[tabIndex]': 'focusable() ? 0 : -1',
|
|
@@ -266,10 +266,10 @@ class NgnScrollerItem {
|
|
|
266
266
|
prevItemClass = itemClass;
|
|
267
267
|
});
|
|
268
268
|
}
|
|
269
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
270
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.
|
|
269
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.10", ngImport: i0, type: NgnScrollerItem, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
270
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.10", type: NgnScrollerItem, isStandalone: true, selector: "[ngnScrollerItem]", inputs: { ngnScrollerItem: { classPropertyName: "ngnScrollerItem", publicName: "ngnScrollerItem", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0 });
|
|
271
271
|
}
|
|
272
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
272
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.10", ngImport: i0, type: NgnScrollerItem, decorators: [{
|
|
273
273
|
type: Directive,
|
|
274
274
|
args: [{ selector: '[ngnScrollerItem]' }]
|
|
275
275
|
}], ctorParameters: () => [], propDecorators: { ngnScrollerItem: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngnScrollerItem", required: true }] }] } });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngneers-controls-scroller.mjs","sources":["../../src/scroller/scroller-templates.ts","../../src/scroller/scroller.ts","../../src/scroller/scroller.html","../../src/scroller/scroller-item.ts","../../src/scroller/ngneers-controls-scroller.ts"],"sourcesContent":["import { computed, contentChild, Directive, input, TemplateRef } from '@angular/core';\r\nimport { templateTypesFn } from '@ngneers/controls/api/ng';\r\nimport { NgnBase } from '@ngneers/controls/base';\r\n\r\n@Directive()\r\nexport abstract class ScrollerTemplates<T> extends NgnBase<'scroller'> {\r\n /**\r\n * The template to be used for rendering each item in the scroller.\r\n * Can also be set using the `item` content child.\r\n */\r\n public readonly templateItem = input<TemplateRef<typeof this.templateTypes.item> | null>(null);\r\n private readonly _userItemTemplate =\r\n contentChild<TemplateRef<typeof this.templateTypes.item>>('item');\r\n protected readonly itemTemplate = computed(() => this._userItemTemplate() ?? this.templateItem());\r\n\r\n /**\r\n * Template types for the scroller.\r\n * Can be used with the {@link NgnTemplate} directive for type safe ng-templates.\r\n */\r\n public readonly templateTypes = templateTypesFn<{\r\n item: {\r\n $implicit: T;\r\n index: number;\r\n };\r\n }>();\r\n}\r\n","import { NgTemplateOutlet } from '@angular/common';\r\nimport {\r\n booleanAttribute,\r\n Component,\r\n computed,\r\n effect,\r\n ElementRef,\r\n inject,\r\n input,\r\n untracked,\r\n ChangeDetectionStrategy,\r\n} from '@angular/core';\r\nimport { elementSizeSignal } from '@ngneers/controls/api/ng';\r\nimport { provideSelf } from '@ngneers/controls/base';\r\nimport { NgnScrollAmount } from '@ngneers/controls/directives';\r\nimport { type AllKeysOfUnion, getScrollTop, NgnError } from '@ngneers/controls/utils';\r\nimport { scrollerControlTemplate } from '@ngneers/controls-themes/templates/scroller';\r\n\r\nimport { ScrollerTemplates } from './scroller-templates';\r\n\r\n/**\r\n * @category control\r\n */\r\n@Component({\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n selector: 'ngn-scroller, [ngn-scroller]',\r\n templateUrl: './scroller.html',\r\n imports: [NgTemplateOutlet],\r\n providers: [provideSelf(NgnScroller)],\r\n hostDirectives: [{ directive: NgnScrollAmount, inputs: ['scrollContainer'] }],\r\n host: {\r\n '[tabIndex]': 'focusable() ? 0 : -1',\r\n '[style.--ngn-scroller-item-height.px]': 'itemHeight() ?? \"auto\"',\r\n '[style.--ngn-scroller-padding-top.px]': 'paddingTop()',\r\n '[style.--ngn-scroller-padding-bottom.px]': 'paddingBottom()',\r\n },\r\n})\r\nexport class NgnScroller<T> extends ScrollerTemplates<T> {\r\n protected readonly theme = this.injectThemeTemplate(scrollerControlTemplate, {\r\n root: true,\r\n virtual: () => !!this.virtual(),\r\n });\r\n private readonly _el = inject<ElementRef<HTMLElement>>(ElementRef);\r\n private readonly _scrollAmount = inject(NgnScrollAmount);\r\n\r\n /**\r\n * The items to be displayed in the scroller.\r\n * This is a required input and should be an array of items of type {@link T}.\r\n */\r\n public readonly items = input.required<readonly T[]>();\r\n /**\r\n * The field of the item that uniquely identifies it.\r\n */\r\n public readonly fieldId = input<keyof T>();\r\n /**\r\n * Whether the scroller should use virtual scrolling.\r\n * When set to true, the scroller will only render the items that are currently visible\r\n * on the screen, improving performance for large lists.\r\n *\r\n * When virtual scrolling is enabled, {@link itemHeight} must be set to a non-zero value.\r\n * @default `false`\r\n */\r\n public readonly virtual = input<boolean | undefined>(false);\r\n /**\r\n * When {@link virtual} scrolling is enabled, this input is required to define the height of each item in pixels.\r\n */\r\n public readonly itemHeight = input<number | undefined>(undefined);\r\n /**\r\n * When {@link virtual} scrolling is enabled, this input defines the number of items to be rendered above and below the visible area.\r\n * This can help to reduce flickering when scrolling.\r\n * @default `2`\r\n */\r\n public readonly virtualPadding = input<number>(2);\r\n /**\r\n * Determines whether the scroller should have a tab index and be focusable.\r\n * @default `false`\r\n */\r\n public readonly focusable = input(false, { transform: booleanAttribute });\r\n /**\r\n * Determines whether an item is sticky or not.\r\n * If set, the scroller will stick the items with a truthy value for the specified field to the top of the scroller.\r\n */\r\n public readonly fieldSticky = input<AllKeysOfUnion<T> | null>(null);\r\n\r\n /**\r\n * Viewport size — tracks the scroll ancestor's dimensions so that virtual\r\n * scrolling works when an outer element handles overflow (e.g. table wrapper).\r\n */\r\n private readonly _viewportSize = elementSizeSignal(\r\n computed(() => this._scrollAmount.scrollTarget())\r\n );\r\n\r\n private readonly _itemHeightPx = computed(() => this.itemHeight() ?? 0);\r\n\r\n /**\r\n * Vertical offset between the scroll container's top and the scroller element.\r\n * Non-zero when a parent (e.g. table wrapper) owns the scroll and the scroller\r\n * is positioned below other content (e.g. a sticky header row).\r\n */\r\n private readonly _scrollOffset = computed(() => {\r\n const target = this._scrollAmount.scrollTarget();\r\n if (target === this._el.nativeElement) return 0;\r\n return this._el.nativeElement.offsetTop;\r\n });\r\n\r\n private readonly _visibleItemCount = computed(() => {\r\n if (!this.virtual() || this._itemHeightPx() === 0) {\r\n return 0;\r\n }\r\n return Math.ceil(\r\n this._viewportSize().height / this._itemHeightPx() + this.virtualPadding() * 2\r\n );\r\n });\r\n private readonly _scrollTop = computed(() => {\r\n const raw = this._scrollAmount.scrollTop();\r\n return Math.max(0, raw - this._scrollOffset());\r\n });\r\n /**\r\n * The index of the first item that is rendered in the (virtual) scroller.\r\n */\r\n public readonly itemStartIndex = computed(() => {\r\n if (!this.virtual() || this._itemHeightPx() === 0) {\r\n return 0;\r\n }\r\n return Math.max(0, Math.ceil(this._scrollTop() / this._itemHeightPx()) - this.virtualPadding());\r\n });\r\n private readonly _itemEndIndex = computed(() =>\r\n this.virtual()\r\n ? Math.min(this.items().length, this.itemStartIndex() + this._visibleItemCount())\r\n : 0\r\n );\r\n\r\n protected readonly paddingTop = computed(() => {\r\n if (!this.virtual()) {\r\n return 0;\r\n }\r\n return (this.itemStartIndex() - (this.latestStickyItem() ? 1 : 0)) * this._itemHeightPx();\r\n });\r\n\r\n protected readonly paddingBottom = computed(() => {\r\n if (!this.virtual()) {\r\n return 0;\r\n }\r\n return (this.items().length - this._itemEndIndex()) * this._itemHeightPx();\r\n });\r\n\r\n protected readonly visibleItems = computed(() => {\r\n if (!this.virtual()) {\r\n return this.items().map((item, index) => ({ item, index }));\r\n }\r\n return this.items()\r\n .slice(this.itemStartIndex(), this._itemEndIndex())\r\n .map((item, index) => {\r\n return {\r\n item,\r\n index: this.itemStartIndex() + index,\r\n };\r\n });\r\n });\r\n\r\n /**\r\n * Returns the last sticky item that is not rendered regularly in the list.\r\n * Required because sticky items might need to be rendered longer than they would.\r\n * Only applicable when virtual scrolling is enabled.\r\n */\r\n protected readonly latestStickyItem = computed(() => {\r\n if (!this.virtual()) {\r\n return null;\r\n }\r\n const stickyField = this.fieldSticky();\r\n if (!stickyField) {\r\n return null;\r\n }\r\n const unrenderedItemsAtTop = this.items()\r\n .slice(0, this.itemStartIndex())\r\n .map((item, index) => ({\r\n item,\r\n index,\r\n }));\r\n const stickyItems = unrenderedItemsAtTop.filter(item => item.item[stickyField]);\r\n return stickyItems[stickyItems.length - 1] ?? null;\r\n });\r\n\r\n constructor() {\r\n super();\r\n effect(() => {\r\n if (this.virtual() && !this.itemHeight()) {\r\n throw new NgnError('scroller', 'itemHeight must be set when virtual is true');\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Scrolls the item with the given index into view.\r\n * @param index The index of the item to scroll to.\r\n */\r\n public scrollToIndex(index: number, position: ScrollLogicalPosition = 'nearest') {\r\n untracked(() => {\r\n const scrollEl = this._scrollAmount.scrollTarget();\r\n const offset = this._scrollOffset();\r\n\r\n const getItemSize = () => {\r\n if (this.virtual()) {\r\n const itemHeight = this._itemHeightPx();\r\n const itemTop = index * itemHeight + offset;\r\n return { itemHeight, itemTop };\r\n } else {\r\n let itemElement = this._el.nativeElement.children[index] as HTMLElement | null;\r\n while (!itemElement?.clientHeight && itemElement?.children.length) {\r\n itemElement = itemElement?.children[0] as HTMLElement | null;\r\n }\r\n if (itemElement) {\r\n const itemTop = itemElement.offsetTop;\r\n const itemHeight = itemElement.clientHeight;\r\n return { itemTop, itemHeight };\r\n }\r\n return null;\r\n }\r\n };\r\n const size = getItemSize();\r\n if (!size) {\r\n return;\r\n }\r\n const { itemTop, itemHeight } = size;\r\n scrollEl.scrollTo({\r\n top: getScrollTop(itemTop, itemHeight, scrollEl.clientHeight, scrollEl.scrollTop, position),\r\n });\r\n });\r\n }\r\n\r\n protected track(item: { item: T; index: number }): unknown {\r\n const fieldId = this.fieldId();\r\n if (fieldId) {\r\n return item.item[fieldId];\r\n }\r\n return item.index;\r\n }\r\n}\r\n","@if (latestStickyItem(); as latestStickyItem) {\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n itemTemplate();\r\n context: { $implicit: latestStickyItem.item, index: latestStickyItem.index }\r\n \"\r\n ></ng-container>\r\n}\r\n\r\n@for (item of visibleItems(); track track(item)) {\r\n <ng-container\r\n *ngTemplateOutlet=\"itemTemplate(); context: { $implicit: item.item, index: item.index }\"\r\n ></ng-container>\r\n}\r\n","import {\r\n type AfterViewInit,\r\n Directive,\r\n effect,\r\n ElementRef,\r\n inject,\r\n input,\r\n signal,\r\n} from '@angular/core';\r\nimport { getNearestNgnInstance } from '@ngneers/controls/base';\r\nimport { NgnError, toggleClass } from '@ngneers/controls/utils';\r\n\r\nimport { NgnScroller } from './scroller';\r\n\r\n@Directive({ selector: '[ngnScrollerItem]' })\r\nexport class NgnScrollerItem implements AfterViewInit {\r\n private readonly _el = inject(ElementRef<HTMLElement>);\r\n public readonly ngnScrollerItem = input.required<object>();\r\n private readonly _scroller = signal<NgnScroller<unknown> | null>(null);\r\n\r\n public ngAfterViewInit() {\r\n if (!this._el.nativeElement.isConnected) {\r\n return;\r\n }\r\n const parentInstance = getNearestNgnInstance(this._el.nativeElement, NgnScroller);\r\n if (!parentInstance) {\r\n throw new NgnError(\r\n 'scroller',\r\n 'ngnScrollerItem must be used within an NgnScroller component'\r\n );\r\n }\r\n this._scroller.set(parentInstance);\r\n }\r\n\r\n constructor() {\r\n let prevItemClass = '';\r\n let prevStickyClass = '';\r\n effect(() => {\r\n const item = this.ngnScrollerItem() as Record<string, unknown> | null;\r\n const scroller = this._scroller();\r\n if (!item || !scroller) {\r\n return;\r\n }\r\n const stickyField = scroller.fieldSticky() as unknown as string | null;\r\n const isSticky = !!stickyField && stickyField in item ? !!item[stickyField] : false;\r\n\r\n const stickyClass = scroller['theme'].class('item-sticky');\r\n if (prevStickyClass && prevStickyClass !== stickyClass) {\r\n toggleClass(this._el.nativeElement, prevStickyClass, false);\r\n }\r\n toggleClass(this._el.nativeElement, stickyClass, isSticky);\r\n prevStickyClass = stickyClass;\r\n\r\n const itemClass = scroller['theme'].class('item');\r\n if (prevItemClass && prevItemClass !== itemClass) {\r\n toggleClass(this._el.nativeElement, prevItemClass, false);\r\n }\r\n toggleClass(this._el.nativeElement, itemClass, true);\r\n prevItemClass = itemClass;\r\n });\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ngneers-controls-scroller.mjs","sources":["../../src/scroller/scroller-templates.ts","../../src/scroller/scroller.ts","../../src/scroller/scroller.html","../../src/scroller/scroller-item.ts","../../src/scroller/ngneers-controls-scroller.ts"],"sourcesContent":["import { computed, contentChild, Directive, input, TemplateRef } from '@angular/core';\r\nimport { templateTypesFn } from '@ngneers/controls/api/ng';\r\nimport { NgnBase } from '@ngneers/controls/base';\r\n\r\n@Directive()\r\nexport abstract class ScrollerTemplates<T> extends NgnBase<'scroller'> {\r\n /**\r\n * The template to be used for rendering each item in the scroller.\r\n * Can also be set using the `item` content child.\r\n */\r\n public readonly templateItem = input<TemplateRef<typeof this.templateTypes.item> | null>(null);\r\n private readonly _userItemTemplate =\r\n contentChild<TemplateRef<typeof this.templateTypes.item>>('item');\r\n protected readonly itemTemplate = computed(() => this._userItemTemplate() ?? this.templateItem());\r\n\r\n /**\r\n * Template types for the scroller.\r\n * Can be used with the {@link NgnTemplate} directive for type safe ng-templates.\r\n */\r\n public readonly templateTypes = templateTypesFn<{\r\n item: {\r\n $implicit: T;\r\n index: number;\r\n };\r\n }>();\r\n}\r\n","import { NgTemplateOutlet } from '@angular/common';\r\nimport {\r\n booleanAttribute,\r\n Component,\r\n computed,\r\n effect,\r\n ElementRef,\r\n inject,\r\n input,\r\n untracked,\r\n ChangeDetectionStrategy,\r\n} from '@angular/core';\r\nimport { elementSizeSignal } from '@ngneers/controls/api/ng';\r\nimport { provideSelf } from '@ngneers/controls/base';\r\nimport { NgnScrollAmount } from '@ngneers/controls/directives';\r\nimport { type AllKeysOfUnion, getScrollTop, NgnError } from '@ngneers/controls/utils';\r\nimport { scrollerControlTemplate } from '@ngneers/controls-themes/templates/scroller';\r\n\r\nimport { ScrollerTemplates } from './scroller-templates';\r\n\r\n/**\r\n * @category control\r\n */\r\n@Component({\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n selector: 'ngn-scroller, [ngn-scroller]',\r\n templateUrl: './scroller.html',\r\n imports: [NgTemplateOutlet],\r\n providers: [provideSelf(NgnScroller)],\r\n hostDirectives: [{ directive: NgnScrollAmount, inputs: ['scrollContainer'] }],\r\n host: {\r\n '[tabIndex]': 'focusable() ? 0 : -1',\r\n '[style.--ngn-scroller-item-height.px]': 'itemHeight() ?? \"auto\"',\r\n '[style.--ngn-scroller-padding-top.px]': 'paddingTop()',\r\n '[style.--ngn-scroller-padding-bottom.px]': 'paddingBottom()',\r\n },\r\n})\r\nexport class NgnScroller<T> extends ScrollerTemplates<T> {\r\n protected readonly theme = this.injectThemeTemplate(scrollerControlTemplate, {\r\n root: true,\r\n virtual: () => !!this.virtual(),\r\n });\r\n private readonly _el = inject<ElementRef<HTMLElement>>(ElementRef);\r\n private readonly _scrollAmount = inject(NgnScrollAmount);\r\n\r\n /**\r\n * The items to be displayed in the scroller.\r\n * This is a required input and should be an array of items of type {@link T}.\r\n */\r\n public readonly items = input.required<readonly T[]>();\r\n /**\r\n * The field of the item that uniquely identifies it.\r\n */\r\n public readonly fieldId = input<keyof T>();\r\n /**\r\n * Whether the scroller should use virtual scrolling.\r\n * When set to true, the scroller will only render the items that are currently visible\r\n * on the screen, improving performance for large lists.\r\n *\r\n * When virtual scrolling is enabled, {@link itemHeight} must be set to a non-zero value.\r\n * @default `false`\r\n */\r\n public readonly virtual = input<boolean | undefined>(false);\r\n /**\r\n * When {@link virtual} scrolling is enabled, this input is required to define the height of each item in pixels.\r\n */\r\n public readonly itemHeight = input<number | undefined>(undefined);\r\n /**\r\n * When {@link virtual} scrolling is enabled, this input defines the number of items to be rendered above and below the visible area.\r\n * This can help to reduce flickering when scrolling.\r\n * @default `2`\r\n */\r\n public readonly virtualPadding = input<number>(2);\r\n /**\r\n * Determines whether the scroller should have a tab index and be focusable.\r\n * @default `false`\r\n */\r\n public readonly focusable = input(false, { transform: booleanAttribute });\r\n /**\r\n * Determines whether an item is sticky or not.\r\n * If set, the scroller will stick the items with a truthy value for the specified field to the top of the scroller.\r\n */\r\n public readonly fieldSticky = input<AllKeysOfUnion<T> | null>(null);\r\n\r\n /**\r\n * Viewport size — tracks the scroll ancestor's dimensions so that virtual\r\n * scrolling works when an outer element handles overflow (e.g. table wrapper).\r\n */\r\n private readonly _viewportSize = elementSizeSignal(\r\n computed(() => this._scrollAmount.scrollTarget())\r\n );\r\n\r\n private readonly _itemHeightPx = computed(() => this.itemHeight() ?? 0);\r\n\r\n /**\r\n * Vertical offset between the scroll container's top and the scroller element.\r\n * Non-zero when a parent (e.g. table wrapper) owns the scroll and the scroller\r\n * is positioned below other content (e.g. a sticky header row).\r\n */\r\n private readonly _scrollOffset = computed(() => {\r\n const target = this._scrollAmount.scrollTarget();\r\n if (target === this._el.nativeElement) return 0;\r\n return this._el.nativeElement.offsetTop;\r\n });\r\n\r\n private readonly _visibleItemCount = computed(() => {\r\n if (!this.virtual() || this._itemHeightPx() === 0) {\r\n return 0;\r\n }\r\n return Math.ceil(\r\n this._viewportSize().height / this._itemHeightPx() + this.virtualPadding() * 2\r\n );\r\n });\r\n private readonly _scrollTop = computed(() => {\r\n const raw = this._scrollAmount.scrollTop();\r\n return Math.max(0, raw - this._scrollOffset());\r\n });\r\n /**\r\n * The index of the first item that is rendered in the (virtual) scroller.\r\n */\r\n public readonly itemStartIndex = computed(() => {\r\n if (!this.virtual() || this._itemHeightPx() === 0) {\r\n return 0;\r\n }\r\n return Math.max(0, Math.ceil(this._scrollTop() / this._itemHeightPx()) - this.virtualPadding());\r\n });\r\n private readonly _itemEndIndex = computed(() =>\r\n this.virtual()\r\n ? Math.min(this.items().length, this.itemStartIndex() + this._visibleItemCount())\r\n : 0\r\n );\r\n\r\n protected readonly paddingTop = computed(() => {\r\n if (!this.virtual()) {\r\n return 0;\r\n }\r\n return (this.itemStartIndex() - (this.latestStickyItem() ? 1 : 0)) * this._itemHeightPx();\r\n });\r\n\r\n protected readonly paddingBottom = computed(() => {\r\n if (!this.virtual()) {\r\n return 0;\r\n }\r\n return (this.items().length - this._itemEndIndex()) * this._itemHeightPx();\r\n });\r\n\r\n protected readonly visibleItems = computed(() => {\r\n if (!this.virtual()) {\r\n return this.items().map((item, index) => ({ item, index }));\r\n }\r\n return this.items()\r\n .slice(this.itemStartIndex(), this._itemEndIndex())\r\n .map((item, index) => {\r\n return {\r\n item,\r\n index: this.itemStartIndex() + index,\r\n };\r\n });\r\n });\r\n\r\n /**\r\n * Returns the last sticky item that is not rendered regularly in the list.\r\n * Required because sticky items might need to be rendered longer than they would.\r\n * Only applicable when virtual scrolling is enabled.\r\n */\r\n protected readonly latestStickyItem = computed(() => {\r\n if (!this.virtual()) {\r\n return null;\r\n }\r\n const stickyField = this.fieldSticky();\r\n if (!stickyField) {\r\n return null;\r\n }\r\n const unrenderedItemsAtTop = this.items()\r\n .slice(0, this.itemStartIndex())\r\n .map((item, index) => ({\r\n item,\r\n index,\r\n }));\r\n const stickyItems = unrenderedItemsAtTop.filter(item => item.item[stickyField]);\r\n return stickyItems[stickyItems.length - 1] ?? null;\r\n });\r\n\r\n constructor() {\r\n super();\r\n effect(() => {\r\n if (this.virtual() && !this.itemHeight()) {\r\n throw new NgnError('scroller', 'itemHeight must be set when virtual is true');\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Scrolls the item with the given index into view.\r\n * @param index The index of the item to scroll to.\r\n */\r\n public scrollToIndex(index: number, position: ScrollLogicalPosition = 'nearest') {\r\n untracked(() => {\r\n const scrollEl = this._scrollAmount.scrollTarget();\r\n const offset = this._scrollOffset();\r\n\r\n const getItemSize = () => {\r\n if (this.virtual()) {\r\n const itemHeight = this._itemHeightPx();\r\n const itemTop = index * itemHeight + offset;\r\n return { itemHeight, itemTop };\r\n } else {\r\n let itemElement = this._el.nativeElement.children[index] as HTMLElement | null;\r\n while (!itemElement?.clientHeight && itemElement?.children.length) {\r\n itemElement = itemElement?.children[0] as HTMLElement | null;\r\n }\r\n if (itemElement) {\r\n const itemTop = itemElement.offsetTop;\r\n const itemHeight = itemElement.clientHeight;\r\n return { itemTop, itemHeight };\r\n }\r\n return null;\r\n }\r\n };\r\n const size = getItemSize();\r\n if (!size) {\r\n return;\r\n }\r\n const { itemTop, itemHeight } = size;\r\n scrollEl.scrollTo({\r\n top: getScrollTop(itemTop, itemHeight, scrollEl.clientHeight, scrollEl.scrollTop, position),\r\n });\r\n });\r\n }\r\n\r\n protected track(item: { item: T; index: number }): unknown {\r\n const fieldId = this.fieldId();\r\n if (fieldId) {\r\n return item.item[fieldId];\r\n }\r\n return item.index;\r\n }\r\n}\r\n","@if (latestStickyItem(); as latestStickyItem) {\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n itemTemplate();\r\n context: { $implicit: latestStickyItem.item, index: latestStickyItem.index }\r\n \"\r\n ></ng-container>\r\n}\r\n\r\n@for (item of visibleItems(); track track(item)) {\r\n <ng-container\r\n *ngTemplateOutlet=\"itemTemplate(); context: { $implicit: item.item, index: item.index }\"\r\n ></ng-container>\r\n}\r\n","import {\r\n type AfterViewInit,\r\n Directive,\r\n effect,\r\n ElementRef,\r\n inject,\r\n input,\r\n signal,\r\n} from '@angular/core';\r\nimport { getNearestNgnInstance } from '@ngneers/controls/base';\r\nimport { NgnError, toggleClass } from '@ngneers/controls/utils';\r\n\r\nimport { NgnScroller } from './scroller';\r\n\r\n@Directive({ selector: '[ngnScrollerItem]' })\r\nexport class NgnScrollerItem implements AfterViewInit {\r\n private readonly _el = inject(ElementRef<HTMLElement>);\r\n public readonly ngnScrollerItem = input.required<object>();\r\n private readonly _scroller = signal<NgnScroller<unknown> | null>(null);\r\n\r\n public ngAfterViewInit() {\r\n if (!this._el.nativeElement.isConnected) {\r\n return;\r\n }\r\n const parentInstance = getNearestNgnInstance(this._el.nativeElement, NgnScroller);\r\n if (!parentInstance) {\r\n throw new NgnError(\r\n 'scroller',\r\n 'ngnScrollerItem must be used within an NgnScroller component'\r\n );\r\n }\r\n this._scroller.set(parentInstance);\r\n }\r\n\r\n constructor() {\r\n let prevItemClass = '';\r\n let prevStickyClass = '';\r\n effect(() => {\r\n const item = this.ngnScrollerItem() as Record<string, unknown> | null;\r\n const scroller = this._scroller();\r\n if (!item || !scroller) {\r\n return;\r\n }\r\n const stickyField = scroller.fieldSticky() as unknown as string | null;\r\n const isSticky = !!stickyField && stickyField in item ? !!item[stickyField] : false;\r\n\r\n const stickyClass = scroller['theme'].class('item-sticky');\r\n if (prevStickyClass && prevStickyClass !== stickyClass) {\r\n toggleClass(this._el.nativeElement, prevStickyClass, false);\r\n }\r\n toggleClass(this._el.nativeElement, stickyClass, isSticky);\r\n prevStickyClass = stickyClass;\r\n\r\n const itemClass = scroller['theme'].class('item');\r\n if (prevItemClass && prevItemClass !== itemClass) {\r\n toggleClass(this._el.nativeElement, prevItemClass, false);\r\n }\r\n toggleClass(this._el.nativeElement, itemClass, true);\r\n prevItemClass = itemClass;\r\n });\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -39,12 +39,12 @@ class NgnSelectButton extends ValueControlBase {
|
|
|
39
39
|
}
|
|
40
40
|
this.value.set(value);
|
|
41
41
|
}
|
|
42
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.
|
|
43
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.
|
|
42
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.10", ngImport: i0, type: NgnSelectButton, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
43
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.10", type: NgnSelectButton, isStandalone: true, selector: "ngn-select-button", inputs: { orientation: { classPropertyName: "orientation", publicName: "orientation", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: true, transformFunction: null }, allowUnselect: { classPropertyName: "allowUnselect", publicName: "allowUnselect", isSignal: true, isRequired: false, transformFunction: null } }, providers: [provideSelf(NgnSelectButton)], usesInheritance: true, ngImport: i0, template: "<ngn-button-group\r\n [orientation]=\"orientation()\"\r\n [attr.aria-label]=\"label()\"\r\n [attr.aria-labelledby]=\"labelledBy()\"\r\n>\r\n @for (item of options(); track item.value) {\r\n <ngn-toggle-button\r\n [label]=\"maybeCallback(item.label)\"\r\n [icon]=\"item.icon\"\r\n [fixedWidth]=\"true\"\r\n (valueChange)=\"valueChange(item.value)\"\r\n [value]=\"value() === item.value\"\r\n [readonly]=\"readonly() || (value() === item.value && !allowUnselect())\"\r\n [attr.data-testid]=\"item.testId\"\r\n [disabled]=\"disabled()\"\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'button'\"\r\n />\r\n }\r\n</ngn-button-group>\r\n", dependencies: [{ kind: "directive", type: NgnPt, selector: "[ptInt]", inputs: ["ptInt", "ptClass"] }, { kind: "component", type: NgnButtonGroup, selector: "ngn-button-group", inputs: ["orientation"] }, { kind: "component", type: NgnToggleButton, selector: "ngn-toggle-button", inputs: ["labelOn", "labelOff", "icon", "iconOn", "iconOff", "fixedWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
44
44
|
}
|
|
45
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.
|
|
45
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.10", ngImport: i0, type: NgnSelectButton, decorators: [{
|
|
46
46
|
type: Component,
|
|
47
|
-
args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'ngn-select-button', imports: [NgnPt, NgnButtonGroup, NgnToggleButton], providers: [provideSelf(NgnSelectButton)], template: "<ngn-button-group
|
|
47
|
+
args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'ngn-select-button', imports: [NgnPt, NgnButtonGroup, NgnToggleButton], providers: [provideSelf(NgnSelectButton)], template: "<ngn-button-group\r\n [orientation]=\"orientation()\"\r\n [attr.aria-label]=\"label()\"\r\n [attr.aria-labelledby]=\"labelledBy()\"\r\n>\r\n @for (item of options(); track item.value) {\r\n <ngn-toggle-button\r\n [label]=\"maybeCallback(item.label)\"\r\n [icon]=\"item.icon\"\r\n [fixedWidth]=\"true\"\r\n (valueChange)=\"valueChange(item.value)\"\r\n [value]=\"value() === item.value\"\r\n [readonly]=\"readonly() || (value() === item.value && !allowUnselect())\"\r\n [attr.data-testid]=\"item.testId\"\r\n [disabled]=\"disabled()\"\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'button'\"\r\n />\r\n }\r\n</ngn-button-group>\r\n" }]
|
|
48
48
|
}], propDecorators: { orientation: [{ type: i0.Input, args: [{ isSignal: true, alias: "orientation", required: false }] }], options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: true }] }], allowUnselect: [{ type: i0.Input, args: [{ isSignal: true, alias: "allowUnselect", required: false }] }] } });
|
|
49
49
|
|
|
50
50
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngneers-controls-select-button.mjs","sources":["../../src/select-button/select-button.ts","../../src/select-button/select-button.html","../../src/select-button/ngneers-controls-select-button.ts"],"sourcesContent":["import { Component, ChangeDetectionStrategy, input } from '@angular/core';\r\nimport { NgnPt, provideSelf, ValueControlBase } from '@ngneers/controls/base';\r\nimport { NgnButtonGroup } from '@ngneers/controls/button-group';\r\nimport { NgnToggleButton } from '@ngneers/controls/toggle-button';\r\nimport { maybeCallback } from '@ngneers/controls/utils';\r\nimport { selectButtonControlTemplate } from '@ngneers/controls-themes/templates/select-button';\r\n\r\nimport type { NgnActionItemFlat, NgnItem } from '@ngneers/controls/api';\r\n\r\n/**\r\n * @category control\r\n */\r\n@Component({\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n selector: 'ngn-select-button',\r\n templateUrl: './select-button.html',\r\n imports: [NgnPt, NgnButtonGroup, NgnToggleButton],\r\n providers: [provideSelf(NgnSelectButton)],\r\n})\r\nexport class NgnSelectButton<V> extends ValueControlBase<'selectButton', V> {\r\n protected readonly theme = this.injectThemeTemplate(selectButtonControlTemplate, {\r\n root: true,\r\n invalid: () => this.invalid(),\r\n });\r\n\r\n /**\r\n * Defines the orientation of the select buttons.\r\n * - 'auto' - The orientation is determined based on the available space.\r\n * - 'horizontal' - The buttons are arranged horizontally. (Default for `auto` if enough space)\r\n * - 'vertical' - The buttons are arranged vertically.\r\n * @default 'auto'\r\n */\r\n public readonly orientation = input<'auto' | 'horizontal' | 'vertical'>('auto');\r\n /**\r\n * Defines the options for the select button.\r\n */\r\n public readonly options = input.required<readonly NgnActionItemFlat<NgnItem<unknown, V>>[]>();\r\n /**\r\n * When `true`, allows unselecting the currently selected option by clicking on it again.\r\n * If `false`, clicking on the selected option will not change the selection.\r\n * @default false\r\n */\r\n public readonly allowUnselect = input<boolean>(false);\r\n\r\n protected readonly maybeCallback = maybeCallback;\r\n\r\n protected valueChange(value: V) {\r\n if (this.value() === value && !this.allowUnselect()) {\r\n return;\r\n }\r\n this.value.set(value);\r\n }\r\n}\r\n","<ngn-button-group
|
|
1
|
+
{"version":3,"file":"ngneers-controls-select-button.mjs","sources":["../../src/select-button/select-button.ts","../../src/select-button/select-button.html","../../src/select-button/ngneers-controls-select-button.ts"],"sourcesContent":["import { Component, ChangeDetectionStrategy, input } from '@angular/core';\r\nimport { NgnPt, provideSelf, ValueControlBase } from '@ngneers/controls/base';\r\nimport { NgnButtonGroup } from '@ngneers/controls/button-group';\r\nimport { NgnToggleButton } from '@ngneers/controls/toggle-button';\r\nimport { maybeCallback } from '@ngneers/controls/utils';\r\nimport { selectButtonControlTemplate } from '@ngneers/controls-themes/templates/select-button';\r\n\r\nimport type { NgnActionItemFlat, NgnItem } from '@ngneers/controls/api';\r\n\r\n/**\r\n * @category control\r\n */\r\n@Component({\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n selector: 'ngn-select-button',\r\n templateUrl: './select-button.html',\r\n imports: [NgnPt, NgnButtonGroup, NgnToggleButton],\r\n providers: [provideSelf(NgnSelectButton)],\r\n})\r\nexport class NgnSelectButton<V> extends ValueControlBase<'selectButton', V> {\r\n protected readonly theme = this.injectThemeTemplate(selectButtonControlTemplate, {\r\n root: true,\r\n invalid: () => this.invalid(),\r\n });\r\n\r\n /**\r\n * Defines the orientation of the select buttons.\r\n * - 'auto' - The orientation is determined based on the available space.\r\n * - 'horizontal' - The buttons are arranged horizontally. (Default for `auto` if enough space)\r\n * - 'vertical' - The buttons are arranged vertically.\r\n * @default 'auto'\r\n */\r\n public readonly orientation = input<'auto' | 'horizontal' | 'vertical'>('auto');\r\n /**\r\n * Defines the options for the select button.\r\n */\r\n public readonly options = input.required<readonly NgnActionItemFlat<NgnItem<unknown, V>>[]>();\r\n /**\r\n * When `true`, allows unselecting the currently selected option by clicking on it again.\r\n * If `false`, clicking on the selected option will not change the selection.\r\n * @default false\r\n */\r\n public readonly allowUnselect = input<boolean>(false);\r\n\r\n protected readonly maybeCallback = maybeCallback;\r\n\r\n protected valueChange(value: V) {\r\n if (this.value() === value && !this.allowUnselect()) {\r\n return;\r\n }\r\n this.value.set(value);\r\n }\r\n}\r\n","<ngn-button-group\r\n [orientation]=\"orientation()\"\r\n [attr.aria-label]=\"label()\"\r\n [attr.aria-labelledby]=\"labelledBy()\"\r\n>\r\n @for (item of options(); track item.value) {\r\n <ngn-toggle-button\r\n [label]=\"maybeCallback(item.label)\"\r\n [icon]=\"item.icon\"\r\n [fixedWidth]=\"true\"\r\n (valueChange)=\"valueChange(item.value)\"\r\n [value]=\"value() === item.value\"\r\n [readonly]=\"readonly() || (value() === item.value && !allowUnselect())\"\r\n [attr.data-testid]=\"item.testId\"\r\n [disabled]=\"disabled()\"\r\n [ptInt]=\"this\"\r\n [ptClass]=\"'button'\"\r\n />\r\n }\r\n</ngn-button-group>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;AASA;;AAEG;AAQG,MAAO,eAAmB,SAAQ,gBAAmC,CAAA;AACtD,IAAA,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,2BAA2B,EAAE;AAC/E,QAAA,IAAI,EAAE,IAAI;AACV,QAAA,OAAO,EAAE,MAAM,IAAI,CAAC,OAAO,EAAE;AAC9B,KAAA,CAAC;AAEF;;;;;;AAMG;AACa,IAAA,WAAW,GAAG,KAAK,CAAqC,MAAM,kFAAC;AAC/E;;AAEG;AACa,IAAA,OAAO,GAAG,KAAK,CAAC,QAAQ,6EAAqD;AAC7F;;;;AAIG;AACa,IAAA,aAAa,GAAG,KAAK,CAAU,KAAK,oFAAC;IAElC,aAAa,GAAG,aAAa;AAEtC,IAAA,WAAW,CAAC,KAAQ,EAAA;AAC5B,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE;YACnD;QACF;AACA,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;IACvB;wGAhCW,eAAe,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAf,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,SAAA,EAFf,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECjB3C,4qBAoBA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDJY,KAAK,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,cAAc,sFAAE,eAAe,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,SAAA,EAAA,YAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAGrC,eAAe,EAAA,UAAA,EAAA,CAAA;kBAP3B,SAAS;AACS,YAAA,IAAA,EAAA,CAAA,EAAA,eAAA,EAAA,uBAAuB,CAAC,MAAM,EAAA,QAAA,EACrC,mBAAmB,EAAA,OAAA,EAEpB,CAAC,KAAK,EAAE,cAAc,EAAE,eAAe,CAAC,EAAA,SAAA,EACtC,CAAC,WAAW,iBAAiB,CAAC,EAAA,QAAA,EAAA,4qBAAA,EAAA;;;AEjB3C;;AAEG;;;;"}
|