@odx/angular 12.19.0 → 12.19.2
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/CHANGELOG.md +12 -0
- package/components/accordion/lib/components/accordion-item/accordion-item.component.d.ts +4 -2
- package/components/spinbox/lib/spinbox.component.d.ts +10 -8
- package/esm2022/components/accordion/lib/components/accordion-item/accordion-item.component.mjs +9 -6
- package/esm2022/components/spinbox/lib/spinbox.component.mjs +61 -25
- package/fesm2022/odx-angular-components-accordion.mjs +8 -5
- package/fesm2022/odx-angular-components-accordion.mjs.map +1 -1
- package/fesm2022/odx-angular-components-spinbox.mjs +60 -24
- package/fesm2022/odx-angular-components-spinbox.mjs.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# @odx/angular
|
|
2
2
|
|
|
3
|
+
## 12.19.2
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- a6bc7d1: Fixed spinbox autorepeat and unchanged emits issues
|
|
8
|
+
|
|
9
|
+
## 12.19.1
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- 8b75baa: Fix: `onTransitionEnd` output emits only when the accordion item itself finishes expanding or collapsing
|
|
14
|
+
|
|
3
15
|
## 12.19.0
|
|
4
16
|
|
|
5
17
|
### Minor Changes
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ElementRef } from '@angular/core';
|
|
1
2
|
import { ExpandableItemDirective } from '@odx/angular/cdk/expandable';
|
|
2
3
|
import * as i0 from "@angular/core";
|
|
3
4
|
import * as i1 from "@odx/angular/cdk/expandable";
|
|
@@ -12,7 +13,8 @@ import * as i1 from "@odx/angular/cdk/expandable";
|
|
|
12
13
|
export declare class AccordionItemComponent {
|
|
13
14
|
private readonly disabledController;
|
|
14
15
|
protected readonly expandableItem: ExpandableItemDirective;
|
|
15
|
-
readonly
|
|
16
|
+
protected readonly expandableBlock: import("@angular/core").Signal<ElementRef<any> | undefined>;
|
|
17
|
+
readonly element: ElementRef<HTMLElement>;
|
|
16
18
|
/**
|
|
17
19
|
* The title for the accordion item. This is an `InputSignal`.
|
|
18
20
|
* @default null
|
|
@@ -51,7 +53,7 @@ export declare class AccordionItemComponent {
|
|
|
51
53
|
* @returns {string} The slot ID.
|
|
52
54
|
*/
|
|
53
55
|
get slotId(): string;
|
|
54
|
-
protected onTransitionEnd(): void;
|
|
56
|
+
protected onTransitionEnd({ target, propertyName }: TransitionEvent): void;
|
|
55
57
|
static ɵfac: i0.ɵɵFactoryDeclaration<AccordionItemComponent, never>;
|
|
56
58
|
static ɵcmp: i0.ɵɵComponentDeclaration<AccordionItemComponent, "odx-accordion-item", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; }, { "expandedChange": "expandedChange"; }, never, ["odx-accordion-item-title", "*"], true, [{ directive: typeof i1.ExpandableItemDirective; inputs: { "expanded": "expanded"; "id": "id"; }; outputs: {}; }]>;
|
|
57
59
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AfterViewInit, ElementRef } from '@angular/core';
|
|
1
|
+
import { AfterViewInit, ElementRef, OnDestroy } from '@angular/core';
|
|
2
2
|
import { CustomFormControl } from '@odx/angular/cdk/custom-form-control';
|
|
3
3
|
import * as i0 from "@angular/core";
|
|
4
4
|
/**
|
|
@@ -8,8 +8,9 @@ import * as i0 from "@angular/core";
|
|
|
8
8
|
*
|
|
9
9
|
* @see {CustomFormControl}
|
|
10
10
|
*/
|
|
11
|
-
export declare class SpinboxComponent extends CustomFormControl<number> implements AfterViewInit {
|
|
12
|
-
private
|
|
11
|
+
export declare class SpinboxComponent extends CustomFormControl<number> implements AfterViewInit, OnDestroy {
|
|
12
|
+
private destroyIncrementListener;
|
|
13
|
+
private destroyDecrementListener;
|
|
13
14
|
private get inputElement();
|
|
14
15
|
protected decrementButton: ElementRef<HTMLButtonElement>;
|
|
15
16
|
protected incrementButton: ElementRef<HTMLButtonElement>;
|
|
@@ -18,14 +19,14 @@ export declare class SpinboxComponent extends CustomFormControl<number> implemen
|
|
|
18
19
|
* The maximum allowable value for the spinbox.
|
|
19
20
|
*
|
|
20
21
|
* @type {number}
|
|
21
|
-
* @default
|
|
22
|
+
* @default Number.POSITIVE_INFINITY
|
|
22
23
|
*/
|
|
23
24
|
max: number;
|
|
24
25
|
/**
|
|
25
26
|
* The minimum allowable value for the spinbox.
|
|
26
27
|
*
|
|
27
28
|
* @type {number}
|
|
28
|
-
* @default
|
|
29
|
+
* @default Number.NEGATIVE_INFINITY
|
|
29
30
|
*/
|
|
30
31
|
min: number;
|
|
31
32
|
/**
|
|
@@ -37,10 +38,11 @@ export declare class SpinboxComponent extends CustomFormControl<number> implemen
|
|
|
37
38
|
step: number;
|
|
38
39
|
constructor();
|
|
39
40
|
ngAfterViewInit(): void;
|
|
41
|
+
ngOnDestroy(): void;
|
|
42
|
+
updateValue(value: number): void;
|
|
40
43
|
protected maxSteps({ code }: KeyboardEvent): void;
|
|
41
|
-
protected
|
|
42
|
-
|
|
43
|
-
private registerPressHold;
|
|
44
|
+
protected checkAndUpdate(): void;
|
|
45
|
+
private pressAndHold;
|
|
44
46
|
static ɵfac: i0.ɵɵFactoryDeclaration<SpinboxComponent, never>;
|
|
45
47
|
static ɵcmp: i0.ɵɵComponentDeclaration<SpinboxComponent, "odx-spinbox", never, { "max": { "alias": "max"; "required": false; }; "min": { "alias": "min"; "required": false; }; "step": { "alias": "step"; "required": false; }; }, {}, never, never, true, never>;
|
|
46
48
|
static ngAcceptInputType_max: unknown;
|
package/esm2022/components/accordion/lib/components/accordion-item/accordion-item.component.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { __decorate } from "tslib";
|
|
2
|
-
import { ChangeDetectionStrategy, Component, ViewEncapsulation, inject, input, output } from '@angular/core';
|
|
2
|
+
import { ChangeDetectionStrategy, Component, ViewEncapsulation, inject, input, output, viewChild } from '@angular/core';
|
|
3
3
|
import { CoreModule, DisabledController } from '@odx/angular';
|
|
4
4
|
import { A11yModule } from '@odx/angular/cdk/a11y';
|
|
5
5
|
import { ExpandableItemDirective } from '@odx/angular/cdk/expandable';
|
|
@@ -21,6 +21,7 @@ let AccordionItemComponent = class AccordionItemComponent {
|
|
|
21
21
|
constructor() {
|
|
22
22
|
this.disabledController = DisabledController.inject();
|
|
23
23
|
this.expandableItem = inject(ExpandableItemDirective, { self: true });
|
|
24
|
+
this.expandableBlock = viewChild('expandableBlock');
|
|
24
25
|
this.element = injectElement();
|
|
25
26
|
/**
|
|
26
27
|
* The title for the accordion item. This is an `InputSignal`.
|
|
@@ -69,11 +70,13 @@ let AccordionItemComponent = class AccordionItemComponent {
|
|
|
69
70
|
get slotId() {
|
|
70
71
|
return `${this.expandableItem.id}-slot`;
|
|
71
72
|
}
|
|
72
|
-
onTransitionEnd() {
|
|
73
|
-
this.
|
|
73
|
+
onTransitionEnd({ target, propertyName }) {
|
|
74
|
+
if (target === this.expandableBlock()?.nativeElement && propertyName === 'grid-template-rows') {
|
|
75
|
+
this.expandedChange.emit(this.expandableItem.expanded);
|
|
76
|
+
}
|
|
74
77
|
}
|
|
75
78
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AccordionItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
76
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: AccordionItemComponent, isStandalone: true, selector: "odx-accordion-item", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { expandedChange: "expandedChange" }, host: { properties: { "class.is-disabled": "isDisabled", "class.odx-accordion-item--expanded": "isExpanded", "attr.id": "expandableItem.id", "attr.title": "null" } }, providers: [DisabledController.connect()], hostDirectives: [{ directive: i1.ExpandableItemDirective, inputs: ["expanded", "expanded", "id", "id"] }], ngImport: i0, template: "<div\n #button\n role=\"button\"\n class=\"odx-accordion-item__panel\"\n [attr.id]=\"titleId\"\n [attr.aria-expanded]=\"isExpanded\"\n [attr.aria-controls]=\"slotId\"\n (odxCdkInteractive)=\"expandableItem.toggle()\"\n>\n @if (title()) {\n <div>{{ title() }}</div>\n } @else {\n <ng-content select=\"odx-accordion-item-title\" />\n }\n\n <odx-icon class=\"odx-accordion-item__icon\" name=\"chevron-down\" iconSet=\"core\" />\n</div>\n\n@defer (on viewport(button)) {\n <div class=\"odx-accordion-item__slot\" [attr.id]=\"slotId\" [attr.aria-labelledby]=\"titleId\" (transitionend)=\"onTransitionEnd()\">\n <div class=\"odx-accordion-item__slot-content\">\n <ng-content />\n </div>\n </div>\n}\n", dependencies: [{ kind: "ngmodule", type: A11yModule }, { kind: "directive", type: i2.InteractiveDirective, selector: "[odxCdkInteractive]", outputs: ["odxCdkInteractive"] }, { kind: "ngmodule", type: CoreModule }, { kind: "component", type: IconComponent, selector: "odx-icon", inputs: ["inline", "size", "name", "iconSet", "identifier"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
79
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: AccordionItemComponent, isStandalone: true, selector: "odx-accordion-item", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { expandedChange: "expandedChange" }, host: { properties: { "class.is-disabled": "isDisabled", "class.odx-accordion-item--expanded": "isExpanded", "attr.id": "expandableItem.id", "attr.title": "null" } }, providers: [DisabledController.connect()], viewQueries: [{ propertyName: "expandableBlock", first: true, predicate: ["expandableBlock"], descendants: true, isSignal: true }], hostDirectives: [{ directive: i1.ExpandableItemDirective, inputs: ["expanded", "expanded", "id", "id"] }], ngImport: i0, template: "<div\n #button\n role=\"button\"\n class=\"odx-accordion-item__panel\"\n [attr.id]=\"titleId\"\n [attr.aria-expanded]=\"isExpanded\"\n [attr.aria-controls]=\"slotId\"\n (odxCdkInteractive)=\"expandableItem.toggle()\"\n>\n @if (title()) {\n <div>{{ title() }}</div>\n } @else {\n <ng-content select=\"odx-accordion-item-title\" />\n }\n\n <odx-icon class=\"odx-accordion-item__icon\" name=\"chevron-down\" iconSet=\"core\" />\n</div>\n\n@defer (on viewport(button)) {\n <div #expandableBlock class=\"odx-accordion-item__slot\" [attr.id]=\"slotId\" [attr.aria-labelledby]=\"titleId\" (transitionend)=\"onTransitionEnd($event)\">\n <div class=\"odx-accordion-item__slot-content\">\n <ng-content />\n </div>\n </div>\n}\n", dependencies: [{ kind: "ngmodule", type: A11yModule }, { kind: "directive", type: i2.InteractiveDirective, selector: "[odxCdkInteractive]", outputs: ["odxCdkInteractive"] }, { kind: "ngmodule", type: CoreModule }, { kind: "component", type: IconComponent, selector: "odx-icon", inputs: ["inline", "size", "name", "iconSet", "identifier"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
77
80
|
};
|
|
78
81
|
AccordionItemComponent = __decorate([
|
|
79
82
|
CSSComponent('accordion-item')
|
|
@@ -86,6 +89,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
86
89
|
'[class.odx-accordion-item--expanded]': 'isExpanded',
|
|
87
90
|
'[attr.id]': 'expandableItem.id',
|
|
88
91
|
'[attr.title]': 'null',
|
|
89
|
-
}, template: "<div\n #button\n role=\"button\"\n class=\"odx-accordion-item__panel\"\n [attr.id]=\"titleId\"\n [attr.aria-expanded]=\"isExpanded\"\n [attr.aria-controls]=\"slotId\"\n (odxCdkInteractive)=\"expandableItem.toggle()\"\n>\n @if (title()) {\n <div>{{ title() }}</div>\n } @else {\n <ng-content select=\"odx-accordion-item-title\" />\n }\n\n <odx-icon class=\"odx-accordion-item__icon\" name=\"chevron-down\" iconSet=\"core\" />\n</div>\n\n@defer (on viewport(button)) {\n <div class=\"odx-accordion-item__slot\" [attr.id]=\"slotId\" [attr.aria-labelledby]=\"titleId\" (transitionend)=\"onTransitionEnd()\">\n <div class=\"odx-accordion-item__slot-content\">\n <ng-content />\n </div>\n </div>\n}\n" }]
|
|
92
|
+
}, template: "<div\n #button\n role=\"button\"\n class=\"odx-accordion-item__panel\"\n [attr.id]=\"titleId\"\n [attr.aria-expanded]=\"isExpanded\"\n [attr.aria-controls]=\"slotId\"\n (odxCdkInteractive)=\"expandableItem.toggle()\"\n>\n @if (title()) {\n <div>{{ title() }}</div>\n } @else {\n <ng-content select=\"odx-accordion-item-title\" />\n }\n\n <odx-icon class=\"odx-accordion-item__icon\" name=\"chevron-down\" iconSet=\"core\" />\n</div>\n\n@defer (on viewport(button)) {\n <div #expandableBlock class=\"odx-accordion-item__slot\" [attr.id]=\"slotId\" [attr.aria-labelledby]=\"titleId\" (transitionend)=\"onTransitionEnd($event)\">\n <div class=\"odx-accordion-item__slot-content\">\n <ng-content />\n </div>\n </div>\n}\n" }]
|
|
90
93
|
}] });
|
|
91
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
94
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjb3JkaW9uLWl0ZW0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyL2NvbXBvbmVudHMvYWNjb3JkaW9uL3NyYy9saWIvY29tcG9uZW50cy9hY2NvcmRpb24taXRlbS9hY2NvcmRpb24taXRlbS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvY29tcG9uZW50cy9hY2NvcmRpb24vc3JjL2xpYi9jb21wb25lbnRzL2FjY29yZGlvbi1pdGVtL2FjY29yZGlvbi1pdGVtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFjLGlCQUFpQixFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNwSSxPQUFPLEVBQUUsVUFBVSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzlELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7OztBQUVuRDs7Ozs7OztHQU9HO0FBa0JJLElBQU0sc0JBQXNCLEdBQTVCLE1BQU0sc0JBQXNCO0lBQTVCO1FBQ1ksdUJBQWtCLEdBQUcsa0JBQWtCLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDL0MsbUJBQWMsR0FBRyxNQUFNLENBQUMsdUJBQXVCLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNqRSxvQkFBZSxHQUFHLFNBQVMsQ0FBYSxpQkFBaUIsQ0FBQyxDQUFDO1FBQzlELFlBQU8sR0FBRyxhQUFhLEVBQUUsQ0FBQztRQUUxQzs7O1dBR0c7UUFDSSxVQUFLLEdBQUcsS0FBSyxDQUFnQixJQUFJLENBQUMsQ0FBQztRQUUxQzs7Ozs7V0FLRztRQUNJLG1CQUFjLEdBQUcsTUFBTSxFQUFXLENBQUM7S0E2QzNDO0lBM0NDOzs7O09BSUc7SUFDSCxJQUFXLFVBQVU7UUFDbkIsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLFFBQVEsQ0FBQztJQUM3QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILElBQVcsVUFBVTtRQUNuQixPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQztJQUMxRCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxJQUFXLE9BQU87UUFDaEIsT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxRQUFRLENBQUM7SUFDM0MsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsSUFBVyxNQUFNO1FBQ2YsT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxPQUFPLENBQUM7SUFDMUMsQ0FBQztJQUVTLGVBQWUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQW1CO1FBQ2pFLElBQUksTUFBTSxLQUFLLElBQUksQ0FBQyxlQUFlLEVBQUUsRUFBRSxhQUFhLElBQUksWUFBWSxLQUFLLG9CQUFvQixFQUFFLENBQUM7WUFDOUYsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN6RCxDQUFDO0lBQ0gsQ0FBQzsrR0E5RFUsc0JBQXNCO21HQUF0QixzQkFBc0IsMlpBVHRCLENBQUMsa0JBQWtCLENBQUMsT0FBTyxFQUFFLENBQUMseVFDeEIzQyw2dUJBeUJBLDJDREZZLFVBQVUscUpBQUUsVUFBVSwrQkFBRSxhQUFhOztBQVVwQyxzQkFBc0I7SUFqQmxDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQztHQWlCbEIsc0JBQXNCLENBK0RsQzs7NEZBL0RZLHNCQUFzQjtrQkFoQmxDLFNBQVM7K0JBQ0Usb0JBQW9CLGNBRWxCLElBQUksbUJBQ0MsdUJBQXVCLENBQUMsTUFBTSxpQkFDaEMsaUJBQWlCLENBQUMsSUFBSSxXQUM1QixDQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUUsYUFBYSxDQUFDLGFBQ3JDLENBQUMsa0JBQWtCLENBQUMsT0FBTyxFQUFFLENBQUMsa0JBQ3pCLENBQUMsRUFBRSxTQUFTLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxFQUFFLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsUUFDOUU7d0JBQ0oscUJBQXFCLEVBQUUsWUFBWTt3QkFDbkMsc0NBQXNDLEVBQUUsWUFBWTt3QkFDcEQsV0FBVyxFQUFFLG1CQUFtQjt3QkFDaEMsY0FBYyxFQUFFLE1BQU07cUJBQ3ZCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRWxlbWVudFJlZiwgVmlld0VuY2Fwc3VsYXRpb24sIGluamVjdCwgaW5wdXQsIG91dHB1dCwgdmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb3JlTW9kdWxlLCBEaXNhYmxlZENvbnRyb2xsZXIgfSBmcm9tICdAb2R4L2FuZ3VsYXInO1xuaW1wb3J0IHsgQTExeU1vZHVsZSB9IGZyb20gJ0BvZHgvYW5ndWxhci9jZGsvYTExeSc7XG5pbXBvcnQgeyBFeHBhbmRhYmxlSXRlbURpcmVjdGl2ZSB9IGZyb20gJ0BvZHgvYW5ndWxhci9jZGsvZXhwYW5kYWJsZSc7XG5pbXBvcnQgeyBJY29uQ29tcG9uZW50IH0gZnJvbSAnQG9keC9hbmd1bGFyL2NvbXBvbmVudHMvaWNvbic7XG5pbXBvcnQgeyBDU1NDb21wb25lbnQgfSBmcm9tICdAb2R4L2FuZ3VsYXIvaW50ZXJuYWwnO1xuaW1wb3J0IHsgaW5qZWN0RWxlbWVudCB9IGZyb20gJ0BvZHgvYW5ndWxhci91dGlscyc7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiBpdGVtIGluIGFuIGFjY29yZGlvbiBjb21wb25lbnQuXG4gKiBIYXMgaG9zdCBkaXJlY3RpdmUgRXhwYW5kYWJsZUl0ZW1EaXJlY3RpdmVcbiAqXG4gKiBAc2VlIHtFeHBhbmRhYmxlSXRlbURpcmVjdGl2ZX1cbiAqXG4gKiBZb3UgY2FuIGNvbnRyb2wgdGhlIGFjY29yZGlvbiBpdGVtJ3MgZXhwYW5zaW9uIHN0YXRlIHRocm91Z2ggdGhlIEV4cGFuZGFibGVJdGVtRGlyZWN0aXZlIG1ldGhvZHMuXG4gKi9cbkBDU1NDb21wb25lbnQoJ2FjY29yZGlvbi1pdGVtJylcbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ29keC1hY2NvcmRpb24taXRlbScsXG4gIHRlbXBsYXRlVXJsOiAnLi9hY2NvcmRpb24taXRlbS5jb21wb25lbnQuaHRtbCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBpbXBvcnRzOiBbQTExeU1vZHVsZSwgQ29yZU1vZHVsZSwgSWNvbkNvbXBvbmVudF0sXG4gIHByb3ZpZGVyczogW0Rpc2FibGVkQ29udHJvbGxlci5jb25uZWN0KCldLFxuICBob3N0RGlyZWN0aXZlczogW3sgZGlyZWN0aXZlOiBFeHBhbmRhYmxlSXRlbURpcmVjdGl2ZSwgaW5wdXRzOiBbJ2V4cGFuZGVkJywgJ2lkJ10gfV0sXG4gIGhvc3Q6IHtcbiAgICAnW2NsYXNzLmlzLWRpc2FibGVkXSc6ICdpc0Rpc2FibGVkJyxcbiAgICAnW2NsYXNzLm9keC1hY2NvcmRpb24taXRlbS0tZXhwYW5kZWRdJzogJ2lzRXhwYW5kZWQnLFxuICAgICdbYXR0ci5pZF0nOiAnZXhwYW5kYWJsZUl0ZW0uaWQnLFxuICAgICdbYXR0ci50aXRsZV0nOiAnbnVsbCcsXG4gIH0sXG59KVxuZXhwb3J0IGNsYXNzIEFjY29yZGlvbkl0ZW1Db21wb25lbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IGRpc2FibGVkQ29udHJvbGxlciA9IERpc2FibGVkQ29udHJvbGxlci5pbmplY3QoKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGV4cGFuZGFibGVJdGVtID0gaW5qZWN0KEV4cGFuZGFibGVJdGVtRGlyZWN0aXZlLCB7IHNlbGY6IHRydWUgfSk7XG4gIHByb3RlY3RlZCByZWFkb25seSBleHBhbmRhYmxlQmxvY2sgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZj4oJ2V4cGFuZGFibGVCbG9jaycpO1xuICBwdWJsaWMgcmVhZG9ubHkgZWxlbWVudCA9IGluamVjdEVsZW1lbnQoKTtcblxuICAvKipcbiAgICogVGhlIHRpdGxlIGZvciB0aGUgYWNjb3JkaW9uIGl0ZW0uIFRoaXMgaXMgYW4gYElucHV0U2lnbmFsYC5cbiAgICogQGRlZmF1bHQgbnVsbFxuICAgKi9cbiAgcHVibGljIHRpdGxlID0gaW5wdXQ8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG5cbiAgLyoqXG4gICAqIEVtaXRzIHdoZW4gdGhlIGV4cGFuZGVkIHN0YXRlIG9mIHRoZSBhY2NvcmRpb24gaXRlbSBjaGFuZ2VzLlxuICAgKiBUaGlzIGlzIGFuIGBPdXRwdXRFbWl0dGVyUmVmYC5cbiAgICpcbiAgICogVGhlIGVtaXR0ZWQgdmFsdWUgaXMgdGhlIG5ldyBleHBhbmRlZCBzdGF0ZS5cbiAgICovXG4gIHB1YmxpYyBleHBhbmRlZENoYW5nZSA9IG91dHB1dDxib29sZWFuPigpO1xuXG4gIC8qKlxuICAgKiBHZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBhY2NvcmRpb24gaXRlbSBpcyBkaXNhYmxlZC5cbiAgICpcbiAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIGFjY29yZGlvbiBpdGVtIGlzIGRpc2FibGVkLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzRGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5kaXNhYmxlZENvbnRyb2xsZXI/LmRpc2FibGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGFjY29yZGlvbiBpdGVtIGlzIGV4cGFuZGVkLlxuICAgKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgYWNjb3JkaW9uIGl0ZW0gaXMgZXhwYW5kZWQsIGZhbHNlIG90aGVyd2lzZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgaXNFeHBhbmRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuaXNEaXNhYmxlZCAmJiB0aGlzLmV4cGFuZGFibGVJdGVtLmV4cGFuZGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIElEIG9mIHRoZSB0aXRsZSBlbGVtZW50IGZvciBhY2Nlc3NpYmlsaXR5IHB1cnBvc2VzLlxuICAgKiBUaGUgSUQgaXMgZ2VuZXJhdGVkIGJ5IGFwcGVuZGluZyBcIi10aXRsZVwiIHRvIHRoZSBJRCBvZiB0aGUgZXhwYW5kYWJsZSBpdGVtLlxuICAgKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgSUQgb2YgdGhlIHRpdGxlIGVsZW1lbnQuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHRpdGxlSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5leHBhbmRhYmxlSXRlbS5pZH0tdGl0bGVgO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHNsb3QgSUQgZm9yIHRoZSBhY2NvcmRpb24gaXRlbS5cbiAgICogVGhlIHNsb3QgSUQgaXMgZ2VuZXJhdGVkIGJ5IGFwcGVuZGluZyBcIi1zbG90XCIgdG8gdGhlIElEIG9mIHRoZSBleHBhbmRhYmxlIGl0ZW0uXG4gICAqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBzbG90IElELlxuICAgKi9cbiAgcHVibGljIGdldCBzbG90SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5leHBhbmRhYmxlSXRlbS5pZH0tc2xvdGA7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25UcmFuc2l0aW9uRW5kKHsgdGFyZ2V0LCBwcm9wZXJ0eU5hbWUgfTogVHJhbnNpdGlvbkV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRhcmdldCA9PT0gdGhpcy5leHBhbmRhYmxlQmxvY2soKT8ubmF0aXZlRWxlbWVudCAmJiBwcm9wZXJ0eU5hbWUgPT09ICdncmlkLXRlbXBsYXRlLXJvd3MnKSB7XG4gICAgICB0aGlzLmV4cGFuZGVkQ2hhbmdlLmVtaXQodGhpcy5leHBhbmRhYmxlSXRlbS5leHBhbmRlZCk7XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2XG4gICNidXR0b25cbiAgcm9sZT1cImJ1dHRvblwiXG4gIGNsYXNzPVwib2R4LWFjY29yZGlvbi1pdGVtX19wYW5lbFwiXG4gIFthdHRyLmlkXT1cInRpdGxlSWRcIlxuICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImlzRXhwYW5kZWRcIlxuICBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cInNsb3RJZFwiXG4gIChvZHhDZGtJbnRlcmFjdGl2ZSk9XCJleHBhbmRhYmxlSXRlbS50b2dnbGUoKVwiXG4+XG4gIEBpZiAodGl0bGUoKSkge1xuICAgIDxkaXY+e3sgdGl0bGUoKSB9fTwvZGl2PlxuICB9IEBlbHNlIHtcbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJvZHgtYWNjb3JkaW9uLWl0ZW0tdGl0bGVcIiAvPlxuICB9XG5cbiAgPG9keC1pY29uIGNsYXNzPVwib2R4LWFjY29yZGlvbi1pdGVtX19pY29uXCIgbmFtZT1cImNoZXZyb24tZG93blwiIGljb25TZXQ9XCJjb3JlXCIgLz5cbjwvZGl2PlxuXG5AZGVmZXIgKG9uIHZpZXdwb3J0KGJ1dHRvbikpIHtcbiAgPGRpdiAjZXhwYW5kYWJsZUJsb2NrIGNsYXNzPVwib2R4LWFjY29yZGlvbi1pdGVtX19zbG90XCIgW2F0dHIuaWRdPVwic2xvdElkXCIgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cInRpdGxlSWRcIiAodHJhbnNpdGlvbmVuZCk9XCJvblRyYW5zaXRpb25FbmQoJGV2ZW50KVwiPlxuICAgIDxkaXYgY2xhc3M9XCJvZHgtYWNjb3JkaW9uLWl0ZW1fX3Nsb3QtY29udGVudFwiPlxuICAgICAgPG5nLWNvbnRlbnQgLz5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG59XG4iXX0=
|
|
@@ -4,9 +4,7 @@ import { detectControllerChanges, DisabledController, ReadonlyController } from
|
|
|
4
4
|
import { ControlDirective, CustomFormControl } from '@odx/angular/cdk/custom-form-control';
|
|
5
5
|
import { IconComponent } from '@odx/angular/components/icon';
|
|
6
6
|
import { CSSComponent } from '@odx/angular/internal';
|
|
7
|
-
import {
|
|
8
|
-
import { injectElement, untilDestroyed } from '@odx/angular/utils';
|
|
9
|
-
import { filter, NEVER, startWith, switchMap, tap, timer } from 'rxjs';
|
|
7
|
+
import { injectElement } from '@odx/angular/utils';
|
|
10
8
|
import * as i0 from "@angular/core";
|
|
11
9
|
/**
|
|
12
10
|
* SpinboxComponent is a custom form control for numeric input which allows users to increment and decrement
|
|
@@ -21,22 +19,21 @@ let SpinboxComponent = class SpinboxComponent extends CustomFormControl {
|
|
|
21
19
|
}
|
|
22
20
|
constructor() {
|
|
23
21
|
super(0);
|
|
24
|
-
this.takeUntilDestroyed = untilDestroyed();
|
|
25
22
|
this.element = injectElement();
|
|
26
23
|
/**
|
|
27
24
|
* The maximum allowable value for the spinbox.
|
|
28
25
|
*
|
|
29
26
|
* @type {number}
|
|
30
|
-
* @default
|
|
27
|
+
* @default Number.POSITIVE_INFINITY
|
|
31
28
|
*/
|
|
32
|
-
this.max =
|
|
29
|
+
this.max = Number.POSITIVE_INFINITY;
|
|
33
30
|
/**
|
|
34
31
|
* The minimum allowable value for the spinbox.
|
|
35
32
|
*
|
|
36
33
|
* @type {number}
|
|
37
|
-
* @default
|
|
34
|
+
* @default Number.NEGATIVE_INFINITY
|
|
38
35
|
*/
|
|
39
|
-
this.min =
|
|
36
|
+
this.min = Number.NEGATIVE_INFINITY;
|
|
40
37
|
/**
|
|
41
38
|
* The value increment or decrement step for the spinbox.
|
|
42
39
|
*
|
|
@@ -47,15 +44,25 @@ let SpinboxComponent = class SpinboxComponent extends CustomFormControl {
|
|
|
47
44
|
detectControllerChanges(this).subscribe();
|
|
48
45
|
}
|
|
49
46
|
ngAfterViewInit() {
|
|
50
|
-
this.
|
|
47
|
+
this.destroyDecrementListener = this.pressAndHold(this.decrementButton.nativeElement, () => {
|
|
51
48
|
this.inputElement?.stepDown();
|
|
52
|
-
this.
|
|
49
|
+
this.updateValue(numberAttribute(this.inputElement.value));
|
|
53
50
|
});
|
|
54
|
-
this.
|
|
51
|
+
this.destroyIncrementListener = this.pressAndHold(this.incrementButton.nativeElement, () => {
|
|
55
52
|
this.inputElement?.stepUp();
|
|
56
|
-
this.
|
|
53
|
+
this.updateValue(numberAttribute(this.inputElement.value));
|
|
57
54
|
});
|
|
58
55
|
}
|
|
56
|
+
ngOnDestroy() {
|
|
57
|
+
super.ngOnDestroy();
|
|
58
|
+
this.destroyDecrementListener?.();
|
|
59
|
+
this.destroyIncrementListener?.();
|
|
60
|
+
}
|
|
61
|
+
updateValue(value) {
|
|
62
|
+
if (this.value === value)
|
|
63
|
+
return;
|
|
64
|
+
super.updateValue(value);
|
|
65
|
+
}
|
|
59
66
|
maxSteps({ code }) {
|
|
60
67
|
if (code === 'End' && this.min !== -Infinity) {
|
|
61
68
|
this.updateValue(this.min);
|
|
@@ -64,21 +71,50 @@ let SpinboxComponent = class SpinboxComponent extends CustomFormControl {
|
|
|
64
71
|
this.updateValue(this.max);
|
|
65
72
|
}
|
|
66
73
|
}
|
|
67
|
-
|
|
74
|
+
checkAndUpdate() {
|
|
68
75
|
const value = numberAttribute(this.inputElement.value);
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
this.updateValue(numberAttribute(this.inputElement.value));
|
|
76
|
+
const clampedValue = Math.min(this.max, Math.max(this.min, value));
|
|
77
|
+
this.inputElement.value = clampedValue.toString();
|
|
78
|
+
this.updateValue(clampedValue);
|
|
73
79
|
}
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
80
|
+
pressAndHold(element, handler, interval = 200) {
|
|
81
|
+
let timerId;
|
|
82
|
+
const clearTimer = () => {
|
|
83
|
+
clearInterval(timerId);
|
|
84
|
+
timerId = undefined;
|
|
85
|
+
};
|
|
86
|
+
const start = () => {
|
|
87
|
+
handler();
|
|
88
|
+
timerId = window.setInterval(handler, interval);
|
|
89
|
+
};
|
|
90
|
+
const handleKeyDown = (event) => {
|
|
91
|
+
if ((event.code === 'Space' || event.code === 'Enter') && timerId === undefined) {
|
|
92
|
+
if (event.code === 'Space') {
|
|
93
|
+
event.preventDefault(); // blocks scrolling
|
|
94
|
+
}
|
|
95
|
+
start();
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
const handleKeyUp = (event) => {
|
|
99
|
+
if (event.code === 'Space' || event.code === 'Enter') {
|
|
100
|
+
clearTimer();
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
element.addEventListener('mousedown', start);
|
|
104
|
+
element.addEventListener('mouseup', clearTimer);
|
|
105
|
+
element.addEventListener('mouseout', clearTimer);
|
|
106
|
+
element.addEventListener('keydown', handleKeyDown);
|
|
107
|
+
element.addEventListener('keyup', handleKeyUp);
|
|
108
|
+
return () => {
|
|
109
|
+
element.removeEventListener('mousedown', start);
|
|
110
|
+
element.removeEventListener('mouseup', clearTimer);
|
|
111
|
+
element.removeEventListener('mouseout', clearTimer);
|
|
112
|
+
element.removeEventListener('keydown', handleKeyDown);
|
|
113
|
+
element.removeEventListener('keyup', handleKeyUp);
|
|
114
|
+
};
|
|
79
115
|
}
|
|
80
116
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SpinboxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
81
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "18.2.13", type: SpinboxComponent, isStandalone: true, selector: "odx-spinbox", inputs: { max: ["max", "max", numberAttribute], min: ["min", "min", numberAttribute], step: ["step", "step", numberAttribute] }, providers: [DisabledController.connect(), ReadonlyController.connect()], viewQueries: [{ propertyName: "decrementButton", first: true, predicate: ["decrementButton"], descendants: true }, { propertyName: "incrementButton", first: true, predicate: ["incrementButton"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<button [disabled]=\"isDisabled || isReadonly\" type=\"button\" class=\"odx-spinbox__action\" #decrementButton><odx-icon name=\"minus\" /></button>\n<input\n odxControl\n class=\"odx-spinbox__input\"\n [disabled]=\"isDisabled\"\n [readonly]=\"isReadonly\"\n type=\"number\"\n [value]=\"value\"\n [min]=\"min\"\n [max]=\"max\"\n [step]=\"step\"\n (keydown)=\"maxSteps($event)\"\n (change)=\"
|
|
117
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "18.2.13", type: SpinboxComponent, isStandalone: true, selector: "odx-spinbox", inputs: { max: ["max", "max", numberAttribute], min: ["min", "min", numberAttribute], step: ["step", "step", numberAttribute] }, providers: [DisabledController.connect(), ReadonlyController.connect()], viewQueries: [{ propertyName: "decrementButton", first: true, predicate: ["decrementButton"], descendants: true }, { propertyName: "incrementButton", first: true, predicate: ["incrementButton"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<button [disabled]=\"isDisabled || isReadonly\" type=\"button\" class=\"odx-spinbox__action\" #decrementButton><odx-icon name=\"minus\" /></button>\n<input\n odxControl\n class=\"odx-spinbox__input\"\n [disabled]=\"isDisabled\"\n [readonly]=\"isReadonly\"\n type=\"number\"\n [value]=\"value\"\n [min]=\"min\"\n [max]=\"max\"\n [step]=\"step\"\n (keydown)=\"maxSteps($event)\"\n (change)=\"checkAndUpdate()\"\n (blur)=\"checkAndUpdate()\"\n/>\n<button [disabled]=\"isDisabled || isReadonly\" type=\"button\" class=\"odx-spinbox__action\" #incrementButton><odx-icon name=\"plus\" /></button>\n", dependencies: [{ kind: "directive", type: ControlDirective, selector: "[odxControl]", exportAs: ["odxControl"] }, { kind: "component", type: IconComponent, selector: "odx-icon", inputs: ["inline", "size", "name", "iconSet", "identifier"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
82
118
|
};
|
|
83
119
|
SpinboxComponent = __decorate([
|
|
84
120
|
CSSComponent('spinbox'),
|
|
@@ -87,7 +123,7 @@ SpinboxComponent = __decorate([
|
|
|
87
123
|
export { SpinboxComponent };
|
|
88
124
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SpinboxComponent, decorators: [{
|
|
89
125
|
type: Component,
|
|
90
|
-
args: [{ standalone: true, selector: 'odx-spinbox', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [ControlDirective, IconComponent], providers: [DisabledController.connect(), ReadonlyController.connect()], template: "<button [disabled]=\"isDisabled || isReadonly\" type=\"button\" class=\"odx-spinbox__action\" #decrementButton><odx-icon name=\"minus\" /></button>\n<input\n odxControl\n class=\"odx-spinbox__input\"\n [disabled]=\"isDisabled\"\n [readonly]=\"isReadonly\"\n type=\"number\"\n [value]=\"value\"\n [min]=\"min\"\n [max]=\"max\"\n [step]=\"step\"\n (keydown)=\"maxSteps($event)\"\n (change)=\"
|
|
126
|
+
args: [{ standalone: true, selector: 'odx-spinbox', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [ControlDirective, IconComponent], providers: [DisabledController.connect(), ReadonlyController.connect()], template: "<button [disabled]=\"isDisabled || isReadonly\" type=\"button\" class=\"odx-spinbox__action\" #decrementButton><odx-icon name=\"minus\" /></button>\n<input\n odxControl\n class=\"odx-spinbox__input\"\n [disabled]=\"isDisabled\"\n [readonly]=\"isReadonly\"\n type=\"number\"\n [value]=\"value\"\n [min]=\"min\"\n [max]=\"max\"\n [step]=\"step\"\n (keydown)=\"maxSteps($event)\"\n (change)=\"checkAndUpdate()\"\n (blur)=\"checkAndUpdate()\"\n/>\n<button [disabled]=\"isDisabled || isReadonly\" type=\"button\" class=\"odx-spinbox__action\" #incrementButton><odx-icon name=\"plus\" /></button>\n" }]
|
|
91
127
|
}], ctorParameters: () => [], propDecorators: { decrementButton: [{
|
|
92
128
|
type: ViewChild,
|
|
93
129
|
args: ['decrementButton']
|
|
@@ -104,4 +140,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
104
140
|
type: Input,
|
|
105
141
|
args: [{ transform: numberAttribute }]
|
|
106
142
|
}] } });
|
|
107
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BpbmJveC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvY29tcG9uZW50cy9zcGluYm94L3NyYy9saWIvc3BpbmJveC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvY29tcG9uZW50cy9zcGluYm94L3NyYy9saWIvc3BpbmJveC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFpQix1QkFBdUIsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3BKLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMvRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUMzRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFjLFNBQVMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQzs7QUFFbkY7Ozs7OztHQU1HO0FBV0ksSUFBTSxnQkFBZ0IsR0FBdEIsTUFBTSxnQkFBaUIsU0FBUSxpQkFBeUI7SUFHN0QsSUFBWSxZQUFZO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsYUFBaUMsQ0FBQztJ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QUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQ25ILElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUMxQixDQUFDO0lBQ0osQ0FBQzsrR0FyRlUsZ0JBQWdCO21HQUFoQixnQkFBZ0IsNkVBcUJQLGVBQWUsdUJBU2YsZUFBZSwwQkFTZixlQUFlLGdCQXpDeEIsQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsRUFBRSxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQywwUUN4QnpFLHlsQkFnQkEsNENET1ksZ0JBQWdCLG1GQUFFLGFBQWE7O0FBRzlCLGdCQUFnQjtJQVY1QixZQUFZLENBQUMsU0FBUyxDQUFDOztHQVVYLGdCQUFnQixDQXNGNUI7OzRGQXRGWSxnQkFBZ0I7a0JBVDVCLFNBQVM7aUNBQ0ksSUFBSSxZQUNOLGFBQWEsbUJBRU4sdUJBQXVCLENBQUMsTUFBTSxpQkFDaEMsaUJBQWlCLENBQUMsSUFBSSxXQUM1QixDQUFDLGdCQUFnQixFQUFFLGFBQWEsQ0FBQyxhQUMvQixDQUFDLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxFQUFFLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxDQUFDO3dEQVU3RCxlQUFlO3NCQUR4QixTQUFTO3VCQUFDLGlCQUFpQjtnQkFJbEIsZUFBZTtzQkFEeEIsU0FBUzt1QkFBQyxpQkFBaUI7Z0JBWXJCLEdBQUc7c0JBRFQsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUU7Z0JBVTlCLEdBQUc7c0JBRFQsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUU7Z0JBVTlCLElBQUk7c0JBRFYsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBJbnB1dCwgbnVtYmVyQXR0cmlidXRlLCBWaWV3Q2hpbGQsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBkZXRlY3RDb250cm9sbGVyQ2hhbmdlcywgRGlzYWJsZWRDb250cm9sbGVyLCBSZWFkb25seUNvbnRyb2xsZXIgfSBmcm9tICdAb2R4L2FuZ3VsYXInO1xuaW1wb3J0IHsgQ29udHJvbERpcmVjdGl2ZSwgQ3VzdG9tRm9ybUNvbnRyb2wgfSBmcm9tICdAb2R4L2FuZ3VsYXIvY2RrL2N1c3RvbS1mb3JtLWNvbnRyb2wnO1xuaW1wb3J0IHsgSWNvbkNvbXBvbmVudCB9IGZyb20gJ0BvZHgvYW5ndWxhci9jb21wb25lbnRzL2ljb24nO1xuaW1wb3J0IHsgQ1NTQ29tcG9uZW50IH0gZnJvbSAnQG9keC9hbmd1bGFyL2ludGVybmFsJztcbmltcG9ydCB7IGZyb21FdmVudHMgfSBmcm9tICdAb2R4L2FuZ3VsYXIvcnhqcyc7XG5pbXBvcnQgeyBpbmplY3RFbGVtZW50LCB1bnRpbERlc3Ryb3llZCB9IGZyb20gJ0BvZHgvYW5ndWxhci91dGlscyc7XG5pbXBvcnQgeyBmaWx0ZXIsIE5FVkVSLCBPYnNlcnZhYmxlLCBzdGFydFdpdGgsIHN3aXRjaE1hcCwgdGFwLCB0aW1lciB9IGZyb20gJ3J4anMnO1xuXG4vKipcbiAqIFNwaW5ib3hDb21wb25lbnQgaXMgYSBjdXN0b20gZm9ybSBjb250cm9sIGZvciBudW1lcmljIGlucHV0IHdoaWNoIGFsbG93cyB1c2VycyB0byBpbmNyZW1lbnQgYW5kIGRlY3JlbWVudFxuICogdGhlIHZhbHVlIHVzaW5nIGNvcnJlc3BvbmRpbmcgYnV0dG9ucy4gSXQgc3VwcG9ydHMga2V5Ym9hcmQgbmF2aWdhdGlvbiBhbmQgYXV0b21hdGljIGJvdW5kYXJ5IGNoZWNrcyBmb3IgdGhlIHZhbHVlcy5cbiAqICBFeHRlbmRzIEN1c3RvbUZvcm1Db250cm9sIHRvIHByb3ZpZGUgYWRkaXRpb25hbCBiZWhhdmlvci5cbiAqXG4gKiBAc2VlIHtDdXN0b21Gb3JtQ29udHJvbH1cbiAqL1xuQENTU0NvbXBvbmVudCgnc3BpbmJveCcpXG5AQ29tcG9uZW50KHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgc2VsZWN0b3I6ICdvZHgtc3BpbmJveCcsXG4gIHRlbXBsYXRlVXJsOiAnc3BpbmJveC5jb21wb25lbnQuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBpbXBvcnRzOiBbQ29udHJvbERpcmVjdGl2ZSwgSWNvbkNvbXBvbmVudF0sXG4gIHByb3ZpZGVyczogW0Rpc2FibGVkQ29udHJvbGxlci5jb25uZWN0KCksIFJlYWRvbmx5Q29udHJvbGxlci5jb25uZWN0KCldLFxufSlcbmV4cG9ydCBjbGFzcyBTcGluYm94Q29tcG9uZW50IGV4dGVuZHMgQ3VzdG9tRm9ybUNvbnRyb2w8bnVtYmVyPiBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQge1xuICBwcml2YXRlIHJlYWRvbmx5IHRha2VVbnRpbERlc3Ryb3llZCA9IHVudGlsRGVzdHJveWVkKCk7XG5cbiAgcHJpdmF0ZSBnZXQgaW5wdXRFbGVtZW50KCk6IEhUTUxJbnB1dEVsZW1lbnQge1xuICAgIHJldHVybiB0aGlzLmNvbnRyb2w/LmVsZW1lbnQubmF0aXZlRWxlbWVudCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICB9XG5cbiAgQFZpZXdDaGlsZCgnZGVjcmVtZW50QnV0dG9uJylcbiAgcHJvdGVjdGVkIGRlY3JlbWVudEJ1dHRvbiE6IEVsZW1lbnRSZWY8SFRNTEJ1dHRvbkVsZW1lbnQ+O1xuXG4gIEBWaWV3Q2hpbGQoJ2luY3JlbWVudEJ1dHRvbicpXG4gIHByb3RlY3RlZCBpbmNyZW1lbnRCdXR0b24hOiBFbGVtZW50UmVmPEhUTUxCdXR0b25FbGVtZW50PjtcblxuICBwdWJsaWMgcmVhZG9ubHkgZWxlbWVudCA9IGluamVjdEVsZW1lbnQoKTtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gYWxsb3dhYmxlIHZhbHVlIGZvciB0aGUgc3BpbmJveC5cbiAgICpcbiAgICogQHR5cGUge251bWJlcn1cbiAgICogQGRlZmF1bHQgSW5maW5pdHlcbiAgICovXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogbnVtYmVyQXR0cmlidXRlIH0pXG4gIHB1YmxpYyBtYXggPSBJbmZpbml0eTtcblxuICAvKipcbiAgICogVGhlIG1pbmltdW0gYWxsb3dhYmxlIHZhbHVlIGZvciB0aGUgc3BpbmJveC5cbiAgICpcbiAgICogQHR5cGUge251bWJlcn1cbiAgICogQGRlZmF1bHQgLUluZmluaXR5XG4gICAqL1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZSB9KVxuICBwdWJsaWMgbWluID0gLUluZmluaXR5O1xuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgaW5jcmVtZW50IG9yIGRlY3JlbWVudCBzdGVwIGZvciB0aGUgc3BpbmJveC5cbiAgICpcbiAgICogQHR5cGUge251bWJlcn1cbiAgICogQGRlZmF1bHQgMVxuICAgKi9cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBudW1iZXJBdHRyaWJ1dGUgfSlcbiAgcHVibGljIHN0ZXAgPSAxO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKDApO1xuICAgIGRldGVjdENvbnRyb2xsZXJDaGFuZ2VzKHRoaXMpLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lzdGVyUHJlc3NIb2xkKHRoaXMuZGVjcmVtZW50QnV0dG9uKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5pbnB1dEVsZW1lbnQ/LnN0ZXBEb3duKCk7XG4gICAgICB0aGlzLm9uSW5wdXRDaGFuZ2UoKTtcbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyUHJlc3NIb2xkKHRoaXMuaW5jcmVtZW50QnV0dG9uKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5pbnB1dEVsZW1lbnQ/LnN0ZXBVcCgpO1xuICAgICAgdGhpcy5vbklucHV0Q2hhbmdlKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbWF4U3RlcHMoeyBjb2RlIH06IEtleWJvYXJkRXZlbnQpIHtcbiAgICBpZiAoY29kZSA9PT0gJ0VuZCcgJiYgdGhpcy5taW4gIT09IC1JbmZpbml0eSkge1xuICAgICAgdGhpcy51cGRhdGVWYWx1ZSh0aGlzLm1pbik7XG4gICAgfSBlbHNlIGlmIChjb2RlID09PSAnSG9tZScgJiYgdGhpcy5tYXggIT09IEluZmluaXR5KSB7XG4gICAgICB0aGlzLnVwZGF0ZVZhbHVlKHRoaXMubWF4KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgY2hlY2tWYWx1ZSgpOiB2b2lkIHtcbiAgICBjb25zdCB2YWx1ZSA9IG51bWJlckF0dHJpYnV0ZSh0aGlzLmlucHV0RWxlbWVudC52YWx1ZSk7XG4gICAgdGhpcy51cGRhdGVWYWx1ZSh2YWx1ZSA8IHRoaXMubWluID8gdGhpcy5taW4gOiB2YWx1ZSA+IHRoaXMubWF4ID8gdGhpcy5tYXggOiB2YWx1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25JbnB1dENoYW5nZSgpOiB2b2lkIHtcbiAgICB0aGlzLnVwZGF0ZVZhbHVlKG51bWJlckF0dHJpYnV0ZSh0aGlzLmlucHV0RWxlbWVudC52YWx1ZSkpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3RlclByZXNzSG9sZCh0YXJnZXQ6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+KTogT2JzZXJ2YWJsZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIGZyb21FdmVudHModGFyZ2V0Lm5hdGl2ZUVsZW1lbnQsICdrZXlkb3duJywgJ21vdXNlZG93bicsICdtb3VzZXVwJywgJ2tleXVwJykucGlwZShcbiAgICAgIGZpbHRlcigoZXZlbnQpID0+IGV2ZW50Py50eXBlICE9PSAna2V5ZG93bicgfHwgWydTcGFjZScsICdFbnRlciddLmluY2x1ZGVzKChldmVudCBhcyBLZXlib2FyZEV2ZW50KS5jb2RlKSksXG4gICAgICB0YXAoKGV2ZW50KSA9PiB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgfSksXG4gICAgICBzd2l0Y2hNYXAoKHsgdHlwZSB9KSA9PiAoWydtb3VzZXVwJywgJ2tleXVwJ10uaW5jbHVkZXModHlwZSkgPyBORVZFUiA6IHRpbWVyKDUwMCwgMTAwKS5waXBlKHN0YXJ0V2l0aCh1bmRlZmluZWQpKSkpLFxuICAgICAgdGhpcy50YWtlVW50aWxEZXN0cm95ZWQoKSxcbiAgICApO1xuICB9XG59XG4iLCI8YnV0dG9uIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVkIHx8IGlzUmVhZG9ubHlcIiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJvZHgtc3BpbmJveF9fYWN0aW9uXCIgI2RlY3JlbWVudEJ1dHRvbj48b2R4LWljb24gbmFtZT1cIm1pbnVzXCIgLz48L2J1dHRvbj5cbjxpbnB1dFxuICBvZHhDb250cm9sXG4gIGNsYXNzPVwib2R4LXNwaW5ib3hfX2lucHV0XCJcbiAgW2Rpc2FibGVkXT1cImlzRGlzYWJsZWRcIlxuICBbcmVhZG9ubHldPVwiaXNSZWFkb25seVwiXG4gIHR5cGU9XCJudW1iZXJcIlxuICBbdmFsdWVdPVwidmFsdWVcIlxuICBbbWluXT1cIm1pblwiXG4gIFttYXhdPVwibWF4XCJcbiAgW3N0ZXBdPVwic3RlcFwiXG4gIChrZXlkb3duKT1cIm1heFN0ZXBzKCRldmVudClcIlxuICAoY2hhbmdlKT1cIm9uSW5wdXRDaGFuZ2UoKVwiXG4gIChibHVyKT1cImNoZWNrVmFsdWUoKVwiXG4vPlxuPGJ1dHRvbiBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlZCB8fCBpc1JlYWRvbmx5XCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwib2R4LXNwaW5ib3hfX2FjdGlvblwiICNpbmNyZW1lbnRCdXR0b24+PG9keC1pY29uIG5hbWU9XCJwbHVzXCIgLz48L2J1dHRvbj5cbiJdfQ==
|
|
143
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BpbmJveC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvY29tcG9uZW50cy9zcGluYm94L3NyYy9saWIvc3BpbmJveC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXIvY29tcG9uZW50cy9zcGluYm94L3NyYy9saWIvc3BpbmJveC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFpQix1QkFBdUIsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQWEsU0FBUyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9KLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMvRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUMzRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7QUFFbkQ7Ozs7OztHQU1HO0FBV0ksSUFBTSxnQkFBZ0IsR0FBdEIsTUFBTSxnQkFBaUIsU0FBUSxpQkFBeUI7SUFHN0QsSUFBWSxZQUFZO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsYUFBaUMsQ0FBQztJQUNqRSxDQUFDO0lBcUNEO1FBQ0UsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBOUJLLFlBQU8sR0FBRyxhQUFhLEVBQUUsQ0FBQztRQUUxQzs7Ozs7V0FLRztRQUVJLFFBQUcsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUM7UUFFdEM7Ozs7O1dBS0c7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QUFTLEVBQUUsYUFBYSxDQUFDLENBQUM7WUFDdEQsT0FBTyxDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQztRQUNwRCxDQUFDLENBQUM7SUFDSixDQUFDOytHQTdIVSxnQkFBZ0I7bUdBQWhCLGdCQUFnQiw2RUFxQlAsZUFBZSx1QkFTZixlQUFlLDBCQVNmLGVBQWUsZ0JBekN4QixDQUFDLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxFQUFFLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxDQUFDLDBRQ3RCekUsOGxCQWdCQSw0Q0RLWSxnQkFBZ0IsbUZBQUUsYUFBYTs7QUFHOUIsZ0JBQWdCO0lBVjVCLFlBQVksQ0FBQyxTQUFTLENBQUM7O0dBVVgsZ0JBQWdCLENBOEg1Qjs7NEZBOUhZLGdCQUFnQjtrQkFUNUIsU0FBUztpQ0FDSSxJQUFJLFlBQ04sYUFBYSxtQkFFTix1QkFBdUIsQ0FBQyxNQUFNLGlCQUNoQyxpQkFBaUIsQ0FBQyxJQUFJLFdBQzVCLENBQUMsZ0JBQWdCLEVBQUUsYUFBYSxDQUFDLGFBQy9CLENBQUMsa0JBQWtCLENBQUMsT0FBTyxFQUFFLEVBQUUsa0JBQWtCLENBQUMsT0FBTyxFQUFFLENBQUM7d0RBVTdELGVBQWU7c0JBRHhCLFNBQVM7dUJBQUMsaUJBQWlCO2dCQUlsQixlQUFlO3NCQUR4QixTQUFTO3VCQUFDLGlCQUFpQjtnQkFZckIsR0FBRztzQkFEVCxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRTtnQkFVOUIsR0FBRztzQkFEVCxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRTtnQkFVOUIsSUFBSTtzQkFEVixLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIElucHV0LCBudW1iZXJBdHRyaWJ1dGUsIE9uRGVzdHJveSwgVmlld0NoaWxkLCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZGV0ZWN0Q29udHJvbGxlckNoYW5nZXMsIERpc2FibGVkQ29udHJvbGxlciwgUmVhZG9ubHlDb250cm9sbGVyIH0gZnJvbSAnQG9keC9hbmd1bGFyJztcbmltcG9ydCB7IENvbnRyb2xEaXJlY3RpdmUsIEN1c3RvbUZvcm1Db250cm9sIH0gZnJvbSAnQG9keC9hbmd1bGFyL2Nkay9jdXN0b20tZm9ybS1jb250cm9sJztcbmltcG9ydCB7IEljb25Db21wb25lbnQgfSBmcm9tICdAb2R4L2FuZ3VsYXIvY29tcG9uZW50cy9pY29uJztcbmltcG9ydCB7IENTU0NvbXBvbmVudCB9IGZyb20gJ0BvZHgvYW5ndWxhci9pbnRlcm5hbCc7XG5pbXBvcnQgeyBpbmplY3RFbGVtZW50IH0gZnJvbSAnQG9keC9hbmd1bGFyL3V0aWxzJztcblxuLyoqXG4gKiBTcGluYm94Q29tcG9uZW50IGlzIGEgY3VzdG9tIGZvcm0gY29udHJvbCBmb3IgbnVtZXJpYyBpbnB1dCB3aGljaCBhbGxvd3MgdXNlcnMgdG8gaW5jcmVtZW50IGFuZCBkZWNyZW1lbnRcbiAqIHRoZSB2YWx1ZSB1c2luZyBjb3JyZXNwb25kaW5nIGJ1dHRvbnMuIEl0IHN1cHBvcnRzIGtleWJvYXJkIG5hdmlnYXRpb24gYW5kIGF1dG9tYXRpYyBib3VuZGFyeSBjaGVja3MgZm9yIHRoZSB2YWx1ZXMuXG4gKiAgRXh0ZW5kcyBDdXN0b21Gb3JtQ29udHJvbCB0byBwcm92aWRlIGFkZGl0aW9uYWwgYmVoYXZpb3IuXG4gKlxuICogQHNlZSB7Q3VzdG9tRm9ybUNvbnRyb2x9XG4gKi9cbkBDU1NDb21wb25lbnQoJ3NwaW5ib3gnKVxuQENvbXBvbmVudCh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHNlbGVjdG9yOiAnb2R4LXNwaW5ib3gnLFxuICB0ZW1wbGF0ZVVybDogJ3NwaW5ib3guY29tcG9uZW50Lmh0bWwnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgaW1wb3J0czogW0NvbnRyb2xEaXJlY3RpdmUsIEljb25Db21wb25lbnRdLFxuICBwcm92aWRlcnM6IFtEaXNhYmxlZENvbnRyb2xsZXIuY29ubmVjdCgpLCBSZWFkb25seUNvbnRyb2xsZXIuY29ubmVjdCgpXSxcbn0pXG5leHBvcnQgY2xhc3MgU3BpbmJveENvbXBvbmVudCBleHRlbmRzIEN1c3RvbUZvcm1Db250cm9sPG51bWJlcj4gaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIGRlc3Ryb3lJbmNyZW1lbnRMaXN0ZW5lciE6ICgpID0+IHZvaWQ7XG4gIHByaXZhdGUgZGVzdHJveURlY3JlbWVudExpc3RlbmVyITogKCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBnZXQgaW5wdXRFbGVtZW50KCk6IEhUTUxJbnB1dEVsZW1lbnQge1xuICAgIHJldHVybiB0aGlzLmNvbnRyb2w/LmVsZW1lbnQubmF0aXZlRWxlbWVudCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICB9XG5cbiAgQFZpZXdDaGlsZCgnZGVjcmVtZW50QnV0dG9uJylcbiAgcHJvdGVjdGVkIGRlY3JlbWVudEJ1dHRvbiE6IEVsZW1lbnRSZWY8SFRNTEJ1dHRvbkVsZW1lbnQ+O1xuXG4gIEBWaWV3Q2hpbGQoJ2luY3JlbWVudEJ1dHRvbicpXG4gIHByb3RlY3RlZCBpbmNyZW1lbnRCdXR0b24hOiBFbGVtZW50UmVmPEhUTUxCdXR0b25FbGVtZW50PjtcblxuICBwdWJsaWMgcmVhZG9ubHkgZWxlbWVudCA9IGluamVjdEVsZW1lbnQoKTtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gYWxsb3dhYmxlIHZhbHVlIGZvciB0aGUgc3BpbmJveC5cbiAgICpcbiAgICogQHR5cGUge251bWJlcn1cbiAgICogQGRlZmF1bHQgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZXG4gICAqL1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZSB9KVxuICBwdWJsaWMgbWF4ID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuXG4gIC8qKlxuICAgKiBUaGUgbWluaW11bSBhbGxvd2FibGUgdmFsdWUgZm9yIHRoZSBzcGluYm94LlxuICAgKlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKiBAZGVmYXVsdCBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFlcbiAgICovXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogbnVtYmVyQXR0cmlidXRlIH0pXG4gIHB1YmxpYyBtaW4gPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7XG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSBpbmNyZW1lbnQgb3IgZGVjcmVtZW50IHN0ZXAgZm9yIHRoZSBzcGluYm94LlxuICAgKlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKiBAZGVmYXVsdCAxXG4gICAqL1xuICBASW5wdXQoeyB0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZSB9KVxuICBwdWJsaWMgc3RlcCA9IDE7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoMCk7XG4gICAgZGV0ZWN0Q29udHJvbGxlckNoYW5nZXModGhpcykuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveURlY3JlbWVudExpc3RlbmVyID0gdGhpcy5wcmVzc0FuZEhvbGQodGhpcy5kZWNyZW1lbnRCdXR0b24ubmF0aXZlRWxlbWVudCwgKCkgPT4ge1xuICAgICAgdGhpcy5pbnB1dEVsZW1lbnQ/LnN0ZXBEb3duKCk7XG4gICAgICB0aGlzLnVwZGF0ZVZhbHVlKG51bWJlckF0dHJpYnV0ZSh0aGlzLmlucHV0RWxlbWVudC52YWx1ZSkpO1xuICAgIH0pO1xuICAgIHRoaXMuZGVzdHJveUluY3JlbWVudExpc3RlbmVyID0gdGhpcy5wcmVzc0FuZEhvbGQodGhpcy5pbmNyZW1lbnRCdXR0b24ubmF0aXZlRWxlbWVudCwgKCkgPT4ge1xuICAgICAgdGhpcy5pbnB1dEVsZW1lbnQ/LnN0ZXBVcCgpO1xuICAgICAgdGhpcy51cGRhdGVWYWx1ZShudW1iZXJBdHRyaWJ1dGUodGhpcy5pbnB1dEVsZW1lbnQudmFsdWUpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuICAgIHRoaXMuZGVzdHJveURlY3JlbWVudExpc3RlbmVyPy4oKTtcbiAgICB0aGlzLmRlc3Ryb3lJbmNyZW1lbnRMaXN0ZW5lcj8uKCk7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgdXBkYXRlVmFsdWUodmFsdWU6IG51bWJlcikge1xuICAgIGlmICh0aGlzLnZhbHVlID09PSB2YWx1ZSkgcmV0dXJuO1xuICAgIHN1cGVyLnVwZGF0ZVZhbHVlKHZhbHVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBtYXhTdGVwcyh7IGNvZGUgfTogS2V5Ym9hcmRFdmVudCkge1xuICAgIGlmIChjb2RlID09PSAnRW5kJyAmJiB0aGlzLm1pbiAhPT0gLUluZmluaXR5KSB7XG4gICAgICB0aGlzLnVwZGF0ZVZhbHVlKHRoaXMubWluKTtcbiAgICB9IGVsc2UgaWYgKGNvZGUgPT09ICdIb21lJyAmJiB0aGlzLm1heCAhPT0gSW5maW5pdHkpIHtcbiAgICAgIHRoaXMudXBkYXRlVmFsdWUodGhpcy5tYXgpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBjaGVja0FuZFVwZGF0ZSgpOiB2b2lkIHtcbiAgICBjb25zdCB2YWx1ZSA9IG51bWJlckF0dHJpYnV0ZSh0aGlzLmlucHV0RWxlbWVudC52YWx1ZSk7XG4gICAgY29uc3QgY2xhbXBlZFZhbHVlID0gTWF0aC5taW4odGhpcy5tYXgsIE1hdGgubWF4KHRoaXMubWluLCB2YWx1ZSkpO1xuICAgIHRoaXMuaW5wdXRFbGVtZW50LnZhbHVlID0gY2xhbXBlZFZhbHVlLnRvU3RyaW5nKCk7XG4gICAgdGhpcy51cGRhdGVWYWx1ZShjbGFtcGVkVmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBwcmVzc0FuZEhvbGQoZWxlbWVudDogSFRNTEVsZW1lbnQsIGhhbmRsZXI6ICgpID0+IHZvaWQsIGludGVydmFsID0gMjAwKTogKCkgPT4gdm9pZCB7XG4gICAgbGV0IHRpbWVySWQ6IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGNsZWFyVGltZXIgPSAoKSA9PiB7XG4gICAgICBjbGVhckludGVydmFsKHRpbWVySWQpO1xuICAgICAgdGltZXJJZCA9IHVuZGVmaW5lZDtcbiAgICB9O1xuXG4gICAgY29uc3Qgc3RhcnQgPSAoKSA9PiB7XG4gICAgICBoYW5kbGVyKCk7XG4gICAgICB0aW1lcklkID0gd2luZG93LnNldEludGVydmFsKGhhbmRsZXIsIGludGVydmFsKTtcbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlS2V5RG93biA9IChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgaWYgKChldmVudC5jb2RlID09PSAnU3BhY2UnIHx8IGV2ZW50LmNvZGUgPT09ICdFbnRlcicpICYmIHRpbWVySWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoZXZlbnQuY29kZSA9PT0gJ1NwYWNlJykge1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IC8vIGJsb2NrcyBzY3JvbGxpbmdcbiAgICAgICAgfVxuICAgICAgICBzdGFydCgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVLZXlVcCA9IChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgaWYgKGV2ZW50LmNvZGUgPT09ICdTcGFjZScgfHwgZXZlbnQuY29kZSA9PT0gJ0VudGVyJykge1xuICAgICAgICBjbGVhclRpbWVyKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgc3RhcnQpO1xuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIGNsZWFyVGltZXIpO1xuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdXQnLCBjbGVhclRpbWVyKTtcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBoYW5kbGVLZXlEb3duKTtcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgaGFuZGxlS2V5VXApO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgc3RhcnQpO1xuICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgY2xlYXJUaW1lcik7XG4gICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlb3V0JywgY2xlYXJUaW1lcik7XG4gICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBoYW5kbGVLZXlEb3duKTtcbiAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5dXAnLCBoYW5kbGVLZXlVcCk7XG4gICAgfTtcbiAgfVxufVxuIiwiPGJ1dHRvbiBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlZCB8fCBpc1JlYWRvbmx5XCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwib2R4LXNwaW5ib3hfX2FjdGlvblwiICNkZWNyZW1lbnRCdXR0b24+PG9keC1pY29uIG5hbWU9XCJtaW51c1wiIC8+PC9idXR0b24+XG48aW5wdXRcbiAgb2R4Q29udHJvbFxuICBjbGFzcz1cIm9keC1zcGluYm94X19pbnB1dFwiXG4gIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVkXCJcbiAgW3JlYWRvbmx5XT1cImlzUmVhZG9ubHlcIlxuICB0eXBlPVwibnVtYmVyXCJcbiAgW3ZhbHVlXT1cInZhbHVlXCJcbiAgW21pbl09XCJtaW5cIlxuICBbbWF4XT1cIm1heFwiXG4gIFtzdGVwXT1cInN0ZXBcIlxuICAoa2V5ZG93bik9XCJtYXhTdGVwcygkZXZlbnQpXCJcbiAgKGNoYW5nZSk9XCJjaGVja0FuZFVwZGF0ZSgpXCJcbiAgKGJsdXIpPVwiY2hlY2tBbmRVcGRhdGUoKVwiXG4vPlxuPGJ1dHRvbiBbZGlzYWJsZWRdPVwiaXNEaXNhYmxlZCB8fCBpc1JlYWRvbmx5XCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwib2R4LXNwaW5ib3hfX2FjdGlvblwiICNpbmNyZW1lbnRCdXR0b24+PG9keC1pY29uIG5hbWU9XCJwbHVzXCIgLz48L2J1dHRvbj5cbiJdfQ==
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { __decorate } from 'tslib';
|
|
2
2
|
import * as i0 from '@angular/core';
|
|
3
|
-
import { Component, ChangeDetectionStrategy, ViewEncapsulation, inject, input, output, Directive, NgModule } from '@angular/core';
|
|
3
|
+
import { Component, ChangeDetectionStrategy, ViewEncapsulation, inject, viewChild, input, output, Directive, NgModule } from '@angular/core';
|
|
4
4
|
import * as i1 from '@odx/angular/cdk/expandable';
|
|
5
5
|
import { ExpandableContainerDirective, ExpandableItemDirective } from '@odx/angular/cdk/expandable';
|
|
6
6
|
import { CSSComponent } from '@odx/angular/internal';
|
|
@@ -45,6 +45,7 @@ let AccordionItemComponent = class AccordionItemComponent {
|
|
|
45
45
|
constructor() {
|
|
46
46
|
this.disabledController = DisabledController.inject();
|
|
47
47
|
this.expandableItem = inject(ExpandableItemDirective, { self: true });
|
|
48
|
+
this.expandableBlock = viewChild('expandableBlock');
|
|
48
49
|
this.element = injectElement();
|
|
49
50
|
/**
|
|
50
51
|
* The title for the accordion item. This is an `InputSignal`.
|
|
@@ -93,11 +94,13 @@ let AccordionItemComponent = class AccordionItemComponent {
|
|
|
93
94
|
get slotId() {
|
|
94
95
|
return `${this.expandableItem.id}-slot`;
|
|
95
96
|
}
|
|
96
|
-
onTransitionEnd() {
|
|
97
|
-
this.
|
|
97
|
+
onTransitionEnd({ target, propertyName }) {
|
|
98
|
+
if (target === this.expandableBlock()?.nativeElement && propertyName === 'grid-template-rows') {
|
|
99
|
+
this.expandedChange.emit(this.expandableItem.expanded);
|
|
100
|
+
}
|
|
98
101
|
}
|
|
99
102
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AccordionItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
100
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: AccordionItemComponent, isStandalone: true, selector: "odx-accordion-item", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { expandedChange: "expandedChange" }, host: { properties: { "class.is-disabled": "isDisabled", "class.odx-accordion-item--expanded": "isExpanded", "attr.id": "expandableItem.id", "attr.title": "null" } }, providers: [DisabledController.connect()], hostDirectives: [{ directive: i1.ExpandableItemDirective, inputs: ["expanded", "expanded", "id", "id"] }], ngImport: i0, template: "<div\n #button\n role=\"button\"\n class=\"odx-accordion-item__panel\"\n [attr.id]=\"titleId\"\n [attr.aria-expanded]=\"isExpanded\"\n [attr.aria-controls]=\"slotId\"\n (odxCdkInteractive)=\"expandableItem.toggle()\"\n>\n @if (title()) {\n <div>{{ title() }}</div>\n } @else {\n <ng-content select=\"odx-accordion-item-title\" />\n }\n\n <odx-icon class=\"odx-accordion-item__icon\" name=\"chevron-down\" iconSet=\"core\" />\n</div>\n\n@defer (on viewport(button)) {\n <div class=\"odx-accordion-item__slot\" [attr.id]=\"slotId\" [attr.aria-labelledby]=\"titleId\" (transitionend)=\"onTransitionEnd()\">\n <div class=\"odx-accordion-item__slot-content\">\n <ng-content />\n </div>\n </div>\n}\n", dependencies: [{ kind: "ngmodule", type: A11yModule }, { kind: "directive", type: i2.InteractiveDirective, selector: "[odxCdkInteractive]", outputs: ["odxCdkInteractive"] }, { kind: "ngmodule", type: CoreModule }, { kind: "component", type: IconComponent, selector: "odx-icon", inputs: ["inline", "size", "name", "iconSet", "identifier"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
103
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: AccordionItemComponent, isStandalone: true, selector: "odx-accordion-item", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { expandedChange: "expandedChange" }, host: { properties: { "class.is-disabled": "isDisabled", "class.odx-accordion-item--expanded": "isExpanded", "attr.id": "expandableItem.id", "attr.title": "null" } }, providers: [DisabledController.connect()], viewQueries: [{ propertyName: "expandableBlock", first: true, predicate: ["expandableBlock"], descendants: true, isSignal: true }], hostDirectives: [{ directive: i1.ExpandableItemDirective, inputs: ["expanded", "expanded", "id", "id"] }], ngImport: i0, template: "<div\n #button\n role=\"button\"\n class=\"odx-accordion-item__panel\"\n [attr.id]=\"titleId\"\n [attr.aria-expanded]=\"isExpanded\"\n [attr.aria-controls]=\"slotId\"\n (odxCdkInteractive)=\"expandableItem.toggle()\"\n>\n @if (title()) {\n <div>{{ title() }}</div>\n } @else {\n <ng-content select=\"odx-accordion-item-title\" />\n }\n\n <odx-icon class=\"odx-accordion-item__icon\" name=\"chevron-down\" iconSet=\"core\" />\n</div>\n\n@defer (on viewport(button)) {\n <div #expandableBlock class=\"odx-accordion-item__slot\" [attr.id]=\"slotId\" [attr.aria-labelledby]=\"titleId\" (transitionend)=\"onTransitionEnd($event)\">\n <div class=\"odx-accordion-item__slot-content\">\n <ng-content />\n </div>\n </div>\n}\n", dependencies: [{ kind: "ngmodule", type: A11yModule }, { kind: "directive", type: i2.InteractiveDirective, selector: "[odxCdkInteractive]", outputs: ["odxCdkInteractive"] }, { kind: "ngmodule", type: CoreModule }, { kind: "component", type: IconComponent, selector: "odx-icon", inputs: ["inline", "size", "name", "iconSet", "identifier"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
101
104
|
};
|
|
102
105
|
AccordionItemComponent = __decorate([
|
|
103
106
|
CSSComponent('accordion-item')
|
|
@@ -109,7 +112,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
109
112
|
'[class.odx-accordion-item--expanded]': 'isExpanded',
|
|
110
113
|
'[attr.id]': 'expandableItem.id',
|
|
111
114
|
'[attr.title]': 'null',
|
|
112
|
-
}, template: "<div\n #button\n role=\"button\"\n class=\"odx-accordion-item__panel\"\n [attr.id]=\"titleId\"\n [attr.aria-expanded]=\"isExpanded\"\n [attr.aria-controls]=\"slotId\"\n (odxCdkInteractive)=\"expandableItem.toggle()\"\n>\n @if (title()) {\n <div>{{ title() }}</div>\n } @else {\n <ng-content select=\"odx-accordion-item-title\" />\n }\n\n <odx-icon class=\"odx-accordion-item__icon\" name=\"chevron-down\" iconSet=\"core\" />\n</div>\n\n@defer (on viewport(button)) {\n <div class=\"odx-accordion-item__slot\" [attr.id]=\"slotId\" [attr.aria-labelledby]=\"titleId\" (transitionend)=\"onTransitionEnd()\">\n <div class=\"odx-accordion-item__slot-content\">\n <ng-content />\n </div>\n </div>\n}\n" }]
|
|
115
|
+
}, template: "<div\n #button\n role=\"button\"\n class=\"odx-accordion-item__panel\"\n [attr.id]=\"titleId\"\n [attr.aria-expanded]=\"isExpanded\"\n [attr.aria-controls]=\"slotId\"\n (odxCdkInteractive)=\"expandableItem.toggle()\"\n>\n @if (title()) {\n <div>{{ title() }}</div>\n } @else {\n <ng-content select=\"odx-accordion-item-title\" />\n }\n\n <odx-icon class=\"odx-accordion-item__icon\" name=\"chevron-down\" iconSet=\"core\" />\n</div>\n\n@defer (on viewport(button)) {\n <div #expandableBlock class=\"odx-accordion-item__slot\" [attr.id]=\"slotId\" [attr.aria-labelledby]=\"titleId\" (transitionend)=\"onTransitionEnd($event)\">\n <div class=\"odx-accordion-item__slot-content\">\n <ng-content />\n </div>\n </div>\n}\n" }]
|
|
113
116
|
}] });
|
|
114
117
|
|
|
115
118
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"odx-angular-components-accordion.mjs","sources":["../../../../libs/angular/components/accordion/src/lib/accordion.component.ts","../../../../libs/angular/components/accordion/src/lib/accordion.component.html","../../../../libs/angular/components/accordion/src/lib/components/accordion-item/accordion-item.component.ts","../../../../libs/angular/components/accordion/src/lib/components/accordion-item/accordion-item.component.html","../../../../libs/angular/components/accordion/src/lib/directives/accordion-item-title.ts","../../../../libs/angular/components/accordion/src/lib/accordion.module.ts","../../../../libs/angular/components/accordion/src/odx-angular-components-accordion.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core';\nimport { ExpandableContainerDirective } from '@odx/angular/cdk/expandable';\nimport { CSSComponent } from '@odx/angular/internal';\nimport { injectElement } from '@odx/angular/utils';\n\n/**\n * Represents an accordion component.\n * Has host directive ExpandableContainerDirective\n *\n * @see {ExpandableContainerDirective}\n *\n * You can manage the expansion state of the accordion items by using the `ExpandableContainerDirective` methods.\n */\n@CSSComponent('accordion')\n@Component({\n selector: 'odx-accordion',\n templateUrl: './accordion.component.html',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n hostDirectives: [{ directive: ExpandableContainerDirective, inputs: ['multiple'] }],\n})\nexport class AccordionComponent {\n public readonly element = injectElement();\n}\n","<ng-content select=\"odx-accordion-item\" />\n","import { ChangeDetectionStrategy, Component, ViewEncapsulation, inject, input, output } from '@angular/core';\nimport { CoreModule, DisabledController } from '@odx/angular';\nimport { A11yModule } from '@odx/angular/cdk/a11y';\nimport { ExpandableItemDirective } from '@odx/angular/cdk/expandable';\nimport { IconComponent } from '@odx/angular/components/icon';\nimport { CSSComponent } from '@odx/angular/internal';\nimport { injectElement } from '@odx/angular/utils';\n\n/**\n * Represents an item in an accordion component.\n * Has host directive ExpandableItemDirective\n *\n * @see {ExpandableItemDirective}\n *\n * You can control the accordion item's expansion state through the ExpandableItemDirective methods.\n */\n@CSSComponent('accordion-item')\n@Component({\n selector: 'odx-accordion-item',\n templateUrl: './accordion-item.component.html',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [A11yModule, CoreModule, IconComponent],\n providers: [DisabledController.connect()],\n hostDirectives: [{ directive: ExpandableItemDirective, inputs: ['expanded', 'id'] }],\n host: {\n '[class.is-disabled]': 'isDisabled',\n '[class.odx-accordion-item--expanded]': 'isExpanded',\n '[attr.id]': 'expandableItem.id',\n '[attr.title]': 'null',\n },\n})\nexport class AccordionItemComponent {\n private readonly disabledController = DisabledController.inject();\n protected readonly expandableItem = inject(ExpandableItemDirective, { self: true });\n public readonly element = injectElement();\n\n /**\n * The title for the accordion item. This is an `InputSignal`.\n * @default null\n */\n public title = input<string | null>(null);\n\n /**\n * Emits when the expanded state of the accordion item changes.\n * This is an `OutputEmitterRef`.\n *\n * The emitted value is the new expanded state.\n */\n public expandedChange = output<boolean>();\n\n /**\n * Gets a value indicating whether the accordion item is disabled.\n *\n * @returns {boolean} True if the accordion item is disabled, false otherwise.\n */\n public get isDisabled(): boolean {\n return !!this.disabledController?.disabled;\n }\n\n /**\n * Gets a value indicating whether the accordion item is expanded.\n *\n * @returns {boolean} True if the accordion item is expanded, false otherwise.\n */\n public get isExpanded(): boolean {\n return !this.isDisabled && this.expandableItem.expanded;\n }\n\n /**\n * Gets the ID of the title element for accessibility purposes.\n * The ID is generated by appending \"-title\" to the ID of the expandable item.\n *\n * @returns {string} The ID of the title element.\n */\n public get titleId(): string {\n return `${this.expandableItem.id}-title`;\n }\n\n /**\n * Gets the slot ID for the accordion item.\n * The slot ID is generated by appending \"-slot\" to the ID of the expandable item.\n *\n * @returns {string} The slot ID.\n */\n public get slotId(): string {\n return `${this.expandableItem.id}-slot`;\n }\n\n protected onTransitionEnd(): void {\n this.expandedChange.emit(this.expandableItem.expanded);\n }\n}\n","<div\n #button\n role=\"button\"\n class=\"odx-accordion-item__panel\"\n [attr.id]=\"titleId\"\n [attr.aria-expanded]=\"isExpanded\"\n [attr.aria-controls]=\"slotId\"\n (odxCdkInteractive)=\"expandableItem.toggle()\"\n>\n @if (title()) {\n <div>{{ title() }}</div>\n } @else {\n <ng-content select=\"odx-accordion-item-title\" />\n }\n\n <odx-icon class=\"odx-accordion-item__icon\" name=\"chevron-down\" iconSet=\"core\" />\n</div>\n\n@defer (on viewport(button)) {\n <div class=\"odx-accordion-item__slot\" [attr.id]=\"slotId\" [attr.aria-labelledby]=\"titleId\" (transitionend)=\"onTransitionEnd()\">\n <div class=\"odx-accordion-item__slot-content\">\n <ng-content />\n </div>\n </div>\n}\n","import { Directive } from '@angular/core';\n\n/**\n * Directive for the title of an accordion item.\n */\n@Directive({\n standalone: true,\n selector: 'odx-accordion-item-title',\n})\nexport class AccordionItemTitleDirective {}\n","import { NgModule } from '@angular/core';\nimport { CoreModule } from '@odx/angular';\nimport { AccordionComponent } from './accordion.component';\nimport { AccordionItemComponent } from './components';\nimport { AccordionItemTitleDirective } from './directives';\n\nconst modules = [AccordionComponent, AccordionItemComponent, AccordionItemTitleDirective];\n\n@NgModule({\n imports: modules,\n exports: [CoreModule, ...modules],\n})\nexport class AccordionModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"odx-angular-components-accordion.mjs","sources":["../../../../libs/angular/components/accordion/src/lib/accordion.component.ts","../../../../libs/angular/components/accordion/src/lib/accordion.component.html","../../../../libs/angular/components/accordion/src/lib/components/accordion-item/accordion-item.component.ts","../../../../libs/angular/components/accordion/src/lib/components/accordion-item/accordion-item.component.html","../../../../libs/angular/components/accordion/src/lib/directives/accordion-item-title.ts","../../../../libs/angular/components/accordion/src/lib/accordion.module.ts","../../../../libs/angular/components/accordion/src/odx-angular-components-accordion.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core';\nimport { ExpandableContainerDirective } from '@odx/angular/cdk/expandable';\nimport { CSSComponent } from '@odx/angular/internal';\nimport { injectElement } from '@odx/angular/utils';\n\n/**\n * Represents an accordion component.\n * Has host directive ExpandableContainerDirective\n *\n * @see {ExpandableContainerDirective}\n *\n * You can manage the expansion state of the accordion items by using the `ExpandableContainerDirective` methods.\n */\n@CSSComponent('accordion')\n@Component({\n selector: 'odx-accordion',\n templateUrl: './accordion.component.html',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n hostDirectives: [{ directive: ExpandableContainerDirective, inputs: ['multiple'] }],\n})\nexport class AccordionComponent {\n public readonly element = injectElement();\n}\n","<ng-content select=\"odx-accordion-item\" />\n","import { ChangeDetectionStrategy, Component, ElementRef, ViewEncapsulation, inject, input, output, viewChild } from '@angular/core';\nimport { CoreModule, DisabledController } from '@odx/angular';\nimport { A11yModule } from '@odx/angular/cdk/a11y';\nimport { ExpandableItemDirective } from '@odx/angular/cdk/expandable';\nimport { IconComponent } from '@odx/angular/components/icon';\nimport { CSSComponent } from '@odx/angular/internal';\nimport { injectElement } from '@odx/angular/utils';\n\n/**\n * Represents an item in an accordion component.\n * Has host directive ExpandableItemDirective\n *\n * @see {ExpandableItemDirective}\n *\n * You can control the accordion item's expansion state through the ExpandableItemDirective methods.\n */\n@CSSComponent('accordion-item')\n@Component({\n selector: 'odx-accordion-item',\n templateUrl: './accordion-item.component.html',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [A11yModule, CoreModule, IconComponent],\n providers: [DisabledController.connect()],\n hostDirectives: [{ directive: ExpandableItemDirective, inputs: ['expanded', 'id'] }],\n host: {\n '[class.is-disabled]': 'isDisabled',\n '[class.odx-accordion-item--expanded]': 'isExpanded',\n '[attr.id]': 'expandableItem.id',\n '[attr.title]': 'null',\n },\n})\nexport class AccordionItemComponent {\n private readonly disabledController = DisabledController.inject();\n protected readonly expandableItem = inject(ExpandableItemDirective, { self: true });\n protected readonly expandableBlock = viewChild<ElementRef>('expandableBlock');\n public readonly element = injectElement();\n\n /**\n * The title for the accordion item. This is an `InputSignal`.\n * @default null\n */\n public title = input<string | null>(null);\n\n /**\n * Emits when the expanded state of the accordion item changes.\n * This is an `OutputEmitterRef`.\n *\n * The emitted value is the new expanded state.\n */\n public expandedChange = output<boolean>();\n\n /**\n * Gets a value indicating whether the accordion item is disabled.\n *\n * @returns {boolean} True if the accordion item is disabled, false otherwise.\n */\n public get isDisabled(): boolean {\n return !!this.disabledController?.disabled;\n }\n\n /**\n * Gets a value indicating whether the accordion item is expanded.\n *\n * @returns {boolean} True if the accordion item is expanded, false otherwise.\n */\n public get isExpanded(): boolean {\n return !this.isDisabled && this.expandableItem.expanded;\n }\n\n /**\n * Gets the ID of the title element for accessibility purposes.\n * The ID is generated by appending \"-title\" to the ID of the expandable item.\n *\n * @returns {string} The ID of the title element.\n */\n public get titleId(): string {\n return `${this.expandableItem.id}-title`;\n }\n\n /**\n * Gets the slot ID for the accordion item.\n * The slot ID is generated by appending \"-slot\" to the ID of the expandable item.\n *\n * @returns {string} The slot ID.\n */\n public get slotId(): string {\n return `${this.expandableItem.id}-slot`;\n }\n\n protected onTransitionEnd({ target, propertyName }: TransitionEvent): void {\n if (target === this.expandableBlock()?.nativeElement && propertyName === 'grid-template-rows') {\n this.expandedChange.emit(this.expandableItem.expanded);\n }\n }\n}\n","<div\n #button\n role=\"button\"\n class=\"odx-accordion-item__panel\"\n [attr.id]=\"titleId\"\n [attr.aria-expanded]=\"isExpanded\"\n [attr.aria-controls]=\"slotId\"\n (odxCdkInteractive)=\"expandableItem.toggle()\"\n>\n @if (title()) {\n <div>{{ title() }}</div>\n } @else {\n <ng-content select=\"odx-accordion-item-title\" />\n }\n\n <odx-icon class=\"odx-accordion-item__icon\" name=\"chevron-down\" iconSet=\"core\" />\n</div>\n\n@defer (on viewport(button)) {\n <div #expandableBlock class=\"odx-accordion-item__slot\" [attr.id]=\"slotId\" [attr.aria-labelledby]=\"titleId\" (transitionend)=\"onTransitionEnd($event)\">\n <div class=\"odx-accordion-item__slot-content\">\n <ng-content />\n </div>\n </div>\n}\n","import { Directive } from '@angular/core';\n\n/**\n * Directive for the title of an accordion item.\n */\n@Directive({\n standalone: true,\n selector: 'odx-accordion-item-title',\n})\nexport class AccordionItemTitleDirective {}\n","import { NgModule } from '@angular/core';\nimport { CoreModule } from '@odx/angular';\nimport { AccordionComponent } from './accordion.component';\nimport { AccordionItemComponent } from './components';\nimport { AccordionItemTitleDirective } from './directives';\n\nconst modules = [AccordionComponent, AccordionItemComponent, AccordionItemTitleDirective];\n\n@NgModule({\n imports: modules,\n exports: [CoreModule, ...modules],\n})\nexport class AccordionModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;;;AAKA;;;;;;;AAOG;AAUU,IAAA,kBAAkB,GAAxB,MAAM,kBAAkB,CAAA;AAAxB,IAAA,WAAA,GAAA;QACW,IAAO,CAAA,OAAA,GAAG,aAAa,EAAE,CAAC;AAC3C,KAAA;+GAFY,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;AAAlB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,kBAAkB,6KCtB/B,gDACA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA,EAAA;;ADqBa,kBAAkB,GAAA,UAAA,CAAA;IAT9B,YAAY,CAAC,WAAW,CAAC;AASb,CAAA,EAAA,kBAAkB,CAE9B,CAAA;4FAFY,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAR9B,SAAS;+BACE,eAAe,EAAA,UAAA,EAEb,IAAI,EACC,eAAA,EAAA,uBAAuB,CAAC,MAAM,EAAA,aAAA,EAChC,iBAAiB,CAAC,IAAI,EAAA,cAAA,EACrB,CAAC,EAAE,SAAS,EAAE,4BAA4B,EAAE,MAAM,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,EAAA,QAAA,EAAA,gDAAA,EAAA,CAAA;;;AEZrF;;;;;;;AAOG;AAkBU,IAAA,sBAAsB,GAA5B,MAAM,sBAAsB,CAAA;AAA5B,IAAA,WAAA,GAAA;AACY,QAAA,IAAA,CAAA,kBAAkB,GAAG,kBAAkB,CAAC,MAAM,EAAE,CAAC;QAC/C,IAAc,CAAA,cAAA,GAAG,MAAM,CAAC,uBAAuB,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;AACjE,QAAA,IAAA,CAAA,eAAe,GAAG,SAAS,CAAa,iBAAiB,CAAC,CAAC;QAC9D,IAAO,CAAA,OAAA,GAAG,aAAa,EAAE,CAAC;AAE1C;;;AAGG;AACI,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAgB,IAAI,CAAC,CAAC;AAE1C;;;;;AAKG;QACI,IAAc,CAAA,cAAA,GAAG,MAAM,EAAW,CAAC;AA6C3C,KAAA;AA3CC;;;;AAIG;AACH,IAAA,IAAW,UAAU,GAAA;AACnB,QAAA,OAAO,CAAC,CAAC,IAAI,CAAC,kBAAkB,EAAE,QAAQ,CAAC;KAC5C;AAED;;;;AAIG;AACH,IAAA,IAAW,UAAU,GAAA;QACnB,OAAO,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC;KACzD;AAED;;;;;AAKG;AACH,IAAA,IAAW,OAAO,GAAA;AAChB,QAAA,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,EAAE,QAAQ,CAAC;KAC1C;AAED;;;;;AAKG;AACH,IAAA,IAAW,MAAM,GAAA;AACf,QAAA,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;KACzC;AAES,IAAA,eAAe,CAAC,EAAE,MAAM,EAAE,YAAY,EAAmB,EAAA;AACjE,QAAA,IAAI,MAAM,KAAK,IAAI,CAAC,eAAe,EAAE,EAAE,aAAa,IAAI,YAAY,KAAK,oBAAoB,EAAE;YAC7F,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;SACxD;KACF;+GA9DU,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;AAAtB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,sBAAsB,EATtB,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,mBAAA,EAAA,YAAA,EAAA,oCAAA,EAAA,YAAA,EAAA,SAAA,EAAA,mBAAA,EAAA,YAAA,EAAA,MAAA,EAAA,EAAA,EAAA,SAAA,EAAA,CAAC,kBAAkB,CAAC,OAAO,EAAE,CAAC,ECxB3C,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,cAAA,EAAA,CAAA,EAAA,SAAA,EAAA,EAAA,CAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,UAAA,EAAA,IAAA,EAAA,IAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,6uBAyBA,EDFY,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,UAAU,EAAE,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,OAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,UAAU,+BAAE,aAAa,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,MAAA,EAAA,MAAA,EAAA,SAAA,EAAA,YAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA,EAAA;;AAUpC,sBAAsB,GAAA,UAAA,CAAA;IAjBlC,YAAY,CAAC,gBAAgB,CAAC;AAiBlB,CAAA,EAAA,sBAAsB,CA+DlC,CAAA;4FA/DY,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAhBlC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,oBAAoB,cAElB,IAAI,EAAA,eAAA,EACC,uBAAuB,CAAC,MAAM,iBAChC,iBAAiB,CAAC,IAAI,EAAA,OAAA,EAC5B,CAAC,UAAU,EAAE,UAAU,EAAE,aAAa,CAAC,EACrC,SAAA,EAAA,CAAC,kBAAkB,CAAC,OAAO,EAAE,CAAC,kBACzB,CAAC,EAAE,SAAS,EAAE,uBAAuB,EAAE,MAAM,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE,CAAC,EAC9E,IAAA,EAAA;AACJ,wBAAA,qBAAqB,EAAE,YAAY;AACnC,wBAAA,sCAAsC,EAAE,YAAY;AACpD,wBAAA,WAAW,EAAE,mBAAmB;AAChC,wBAAA,cAAc,EAAE,MAAM;AACvB,qBAAA,EAAA,QAAA,EAAA,6uBAAA,EAAA,CAAA;;;AE7BH;;AAEG;MAKU,2BAA2B,CAAA;+GAA3B,2BAA2B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;mGAA3B,2BAA2B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA,EAAA;;4FAA3B,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBAJvC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,QAAQ,EAAE,0BAA0B;AACrC,iBAAA,CAAA;;;ACFD,MAAM,OAAO,GAAG,CAAC,kBAAkB,EAAE,sBAAsB,EAAE,2BAA2B,CAAC,CAAC;MAM7E,eAAe,CAAA;+GAAf,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA,EAAA;AAAf,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,eAAe,EANX,OAAA,EAAA,CAAA,kBAAkB,EAAE,sBAAsB,EAAE,2BAA2B,CAI5E,EAAA,OAAA,EAAA,CAAA,UAAU,EAJL,kBAAkB,EAAE,sBAAsB,EAAE,2BAA2B,CAAA,EAAA,CAAA,CAAA,EAAA;gHAM3E,eAAe,EAAA,OAAA,EAAA,CANS,sBAAsB,EAI/C,UAAU,CAAA,EAAA,CAAA,CAAA,EAAA;;4FAET,eAAe,EAAA,UAAA,EAAA,CAAA;kBAJ3B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE,OAAO;AAChB,oBAAA,OAAO,EAAE,CAAC,UAAU,EAAE,GAAG,OAAO,CAAC;AAClC,iBAAA,CAAA;;;ACXD;;AAEG;;;;"}
|
|
@@ -5,9 +5,7 @@ import { detectControllerChanges, DisabledController, ReadonlyController } from
|
|
|
5
5
|
import { CustomFormControl, ControlDirective } from '@odx/angular/cdk/custom-form-control';
|
|
6
6
|
import { IconComponent } from '@odx/angular/components/icon';
|
|
7
7
|
import { CSSComponent } from '@odx/angular/internal';
|
|
8
|
-
import {
|
|
9
|
-
import { untilDestroyed, injectElement } from '@odx/angular/utils';
|
|
10
|
-
import { filter, tap, switchMap, NEVER, timer, startWith } from 'rxjs';
|
|
8
|
+
import { injectElement } from '@odx/angular/utils';
|
|
11
9
|
|
|
12
10
|
/**
|
|
13
11
|
* SpinboxComponent is a custom form control for numeric input which allows users to increment and decrement
|
|
@@ -22,22 +20,21 @@ let SpinboxComponent = class SpinboxComponent extends CustomFormControl {
|
|
|
22
20
|
}
|
|
23
21
|
constructor() {
|
|
24
22
|
super(0);
|
|
25
|
-
this.takeUntilDestroyed = untilDestroyed();
|
|
26
23
|
this.element = injectElement();
|
|
27
24
|
/**
|
|
28
25
|
* The maximum allowable value for the spinbox.
|
|
29
26
|
*
|
|
30
27
|
* @type {number}
|
|
31
|
-
* @default
|
|
28
|
+
* @default Number.POSITIVE_INFINITY
|
|
32
29
|
*/
|
|
33
|
-
this.max =
|
|
30
|
+
this.max = Number.POSITIVE_INFINITY;
|
|
34
31
|
/**
|
|
35
32
|
* The minimum allowable value for the spinbox.
|
|
36
33
|
*
|
|
37
34
|
* @type {number}
|
|
38
|
-
* @default
|
|
35
|
+
* @default Number.NEGATIVE_INFINITY
|
|
39
36
|
*/
|
|
40
|
-
this.min =
|
|
37
|
+
this.min = Number.NEGATIVE_INFINITY;
|
|
41
38
|
/**
|
|
42
39
|
* The value increment or decrement step for the spinbox.
|
|
43
40
|
*
|
|
@@ -48,15 +45,25 @@ let SpinboxComponent = class SpinboxComponent extends CustomFormControl {
|
|
|
48
45
|
detectControllerChanges(this).subscribe();
|
|
49
46
|
}
|
|
50
47
|
ngAfterViewInit() {
|
|
51
|
-
this.
|
|
48
|
+
this.destroyDecrementListener = this.pressAndHold(this.decrementButton.nativeElement, () => {
|
|
52
49
|
this.inputElement?.stepDown();
|
|
53
|
-
this.
|
|
50
|
+
this.updateValue(numberAttribute(this.inputElement.value));
|
|
54
51
|
});
|
|
55
|
-
this.
|
|
52
|
+
this.destroyIncrementListener = this.pressAndHold(this.incrementButton.nativeElement, () => {
|
|
56
53
|
this.inputElement?.stepUp();
|
|
57
|
-
this.
|
|
54
|
+
this.updateValue(numberAttribute(this.inputElement.value));
|
|
58
55
|
});
|
|
59
56
|
}
|
|
57
|
+
ngOnDestroy() {
|
|
58
|
+
super.ngOnDestroy();
|
|
59
|
+
this.destroyDecrementListener?.();
|
|
60
|
+
this.destroyIncrementListener?.();
|
|
61
|
+
}
|
|
62
|
+
updateValue(value) {
|
|
63
|
+
if (this.value === value)
|
|
64
|
+
return;
|
|
65
|
+
super.updateValue(value);
|
|
66
|
+
}
|
|
60
67
|
maxSteps({ code }) {
|
|
61
68
|
if (code === 'End' && this.min !== -Infinity) {
|
|
62
69
|
this.updateValue(this.min);
|
|
@@ -65,21 +72,50 @@ let SpinboxComponent = class SpinboxComponent extends CustomFormControl {
|
|
|
65
72
|
this.updateValue(this.max);
|
|
66
73
|
}
|
|
67
74
|
}
|
|
68
|
-
|
|
75
|
+
checkAndUpdate() {
|
|
69
76
|
const value = numberAttribute(this.inputElement.value);
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
this.updateValue(numberAttribute(this.inputElement.value));
|
|
77
|
+
const clampedValue = Math.min(this.max, Math.max(this.min, value));
|
|
78
|
+
this.inputElement.value = clampedValue.toString();
|
|
79
|
+
this.updateValue(clampedValue);
|
|
74
80
|
}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
81
|
+
pressAndHold(element, handler, interval = 200) {
|
|
82
|
+
let timerId;
|
|
83
|
+
const clearTimer = () => {
|
|
84
|
+
clearInterval(timerId);
|
|
85
|
+
timerId = undefined;
|
|
86
|
+
};
|
|
87
|
+
const start = () => {
|
|
88
|
+
handler();
|
|
89
|
+
timerId = window.setInterval(handler, interval);
|
|
90
|
+
};
|
|
91
|
+
const handleKeyDown = (event) => {
|
|
92
|
+
if ((event.code === 'Space' || event.code === 'Enter') && timerId === undefined) {
|
|
93
|
+
if (event.code === 'Space') {
|
|
94
|
+
event.preventDefault(); // blocks scrolling
|
|
95
|
+
}
|
|
96
|
+
start();
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
const handleKeyUp = (event) => {
|
|
100
|
+
if (event.code === 'Space' || event.code === 'Enter') {
|
|
101
|
+
clearTimer();
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
element.addEventListener('mousedown', start);
|
|
105
|
+
element.addEventListener('mouseup', clearTimer);
|
|
106
|
+
element.addEventListener('mouseout', clearTimer);
|
|
107
|
+
element.addEventListener('keydown', handleKeyDown);
|
|
108
|
+
element.addEventListener('keyup', handleKeyUp);
|
|
109
|
+
return () => {
|
|
110
|
+
element.removeEventListener('mousedown', start);
|
|
111
|
+
element.removeEventListener('mouseup', clearTimer);
|
|
112
|
+
element.removeEventListener('mouseout', clearTimer);
|
|
113
|
+
element.removeEventListener('keydown', handleKeyDown);
|
|
114
|
+
element.removeEventListener('keyup', handleKeyUp);
|
|
115
|
+
};
|
|
80
116
|
}
|
|
81
117
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SpinboxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
82
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "18.2.13", type: SpinboxComponent, isStandalone: true, selector: "odx-spinbox", inputs: { max: ["max", "max", numberAttribute], min: ["min", "min", numberAttribute], step: ["step", "step", numberAttribute] }, providers: [DisabledController.connect(), ReadonlyController.connect()], viewQueries: [{ propertyName: "decrementButton", first: true, predicate: ["decrementButton"], descendants: true }, { propertyName: "incrementButton", first: true, predicate: ["incrementButton"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<button [disabled]=\"isDisabled || isReadonly\" type=\"button\" class=\"odx-spinbox__action\" #decrementButton><odx-icon name=\"minus\" /></button>\n<input\n odxControl\n class=\"odx-spinbox__input\"\n [disabled]=\"isDisabled\"\n [readonly]=\"isReadonly\"\n type=\"number\"\n [value]=\"value\"\n [min]=\"min\"\n [max]=\"max\"\n [step]=\"step\"\n (keydown)=\"maxSteps($event)\"\n (change)=\"
|
|
118
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "18.2.13", type: SpinboxComponent, isStandalone: true, selector: "odx-spinbox", inputs: { max: ["max", "max", numberAttribute], min: ["min", "min", numberAttribute], step: ["step", "step", numberAttribute] }, providers: [DisabledController.connect(), ReadonlyController.connect()], viewQueries: [{ propertyName: "decrementButton", first: true, predicate: ["decrementButton"], descendants: true }, { propertyName: "incrementButton", first: true, predicate: ["incrementButton"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<button [disabled]=\"isDisabled || isReadonly\" type=\"button\" class=\"odx-spinbox__action\" #decrementButton><odx-icon name=\"minus\" /></button>\n<input\n odxControl\n class=\"odx-spinbox__input\"\n [disabled]=\"isDisabled\"\n [readonly]=\"isReadonly\"\n type=\"number\"\n [value]=\"value\"\n [min]=\"min\"\n [max]=\"max\"\n [step]=\"step\"\n (keydown)=\"maxSteps($event)\"\n (change)=\"checkAndUpdate()\"\n (blur)=\"checkAndUpdate()\"\n/>\n<button [disabled]=\"isDisabled || isReadonly\" type=\"button\" class=\"odx-spinbox__action\" #incrementButton><odx-icon name=\"plus\" /></button>\n", dependencies: [{ kind: "directive", type: ControlDirective, selector: "[odxControl]", exportAs: ["odxControl"] }, { kind: "component", type: IconComponent, selector: "odx-icon", inputs: ["inline", "size", "name", "iconSet", "identifier"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
83
119
|
};
|
|
84
120
|
SpinboxComponent = __decorate([
|
|
85
121
|
CSSComponent('spinbox'),
|
|
@@ -87,7 +123,7 @@ SpinboxComponent = __decorate([
|
|
|
87
123
|
], SpinboxComponent);
|
|
88
124
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SpinboxComponent, decorators: [{
|
|
89
125
|
type: Component,
|
|
90
|
-
args: [{ standalone: true, selector: 'odx-spinbox', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [ControlDirective, IconComponent], providers: [DisabledController.connect(), ReadonlyController.connect()], template: "<button [disabled]=\"isDisabled || isReadonly\" type=\"button\" class=\"odx-spinbox__action\" #decrementButton><odx-icon name=\"minus\" /></button>\n<input\n odxControl\n class=\"odx-spinbox__input\"\n [disabled]=\"isDisabled\"\n [readonly]=\"isReadonly\"\n type=\"number\"\n [value]=\"value\"\n [min]=\"min\"\n [max]=\"max\"\n [step]=\"step\"\n (keydown)=\"maxSteps($event)\"\n (change)=\"
|
|
126
|
+
args: [{ standalone: true, selector: 'odx-spinbox', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [ControlDirective, IconComponent], providers: [DisabledController.connect(), ReadonlyController.connect()], template: "<button [disabled]=\"isDisabled || isReadonly\" type=\"button\" class=\"odx-spinbox__action\" #decrementButton><odx-icon name=\"minus\" /></button>\n<input\n odxControl\n class=\"odx-spinbox__input\"\n [disabled]=\"isDisabled\"\n [readonly]=\"isReadonly\"\n type=\"number\"\n [value]=\"value\"\n [min]=\"min\"\n [max]=\"max\"\n [step]=\"step\"\n (keydown)=\"maxSteps($event)\"\n (change)=\"checkAndUpdate()\"\n (blur)=\"checkAndUpdate()\"\n/>\n<button [disabled]=\"isDisabled || isReadonly\" type=\"button\" class=\"odx-spinbox__action\" #incrementButton><odx-icon name=\"plus\" /></button>\n" }]
|
|
91
127
|
}], ctorParameters: () => [], propDecorators: { decrementButton: [{
|
|
92
128
|
type: ViewChild,
|
|
93
129
|
args: ['decrementButton']
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"odx-angular-components-spinbox.mjs","sources":["../../../../libs/angular/components/spinbox/src/lib/spinbox.component.ts","../../../../libs/angular/components/spinbox/src/lib/spinbox.component.html","../../../../libs/angular/components/spinbox/src/odx-angular-components-spinbox.ts"],"sourcesContent":["import { AfterViewInit, ChangeDetectionStrategy, Component, ElementRef, Input, numberAttribute, ViewChild, ViewEncapsulation } from '@angular/core';\nimport { detectControllerChanges, DisabledController, ReadonlyController } from '@odx/angular';\nimport { ControlDirective, CustomFormControl } from '@odx/angular/cdk/custom-form-control';\nimport { IconComponent } from '@odx/angular/components/icon';\nimport { CSSComponent } from '@odx/angular/internal';\nimport { fromEvents } from '@odx/angular/rxjs';\nimport { injectElement, untilDestroyed } from '@odx/angular/utils';\nimport { filter, NEVER, Observable, startWith, switchMap, tap, timer } from 'rxjs';\n\n/**\n * SpinboxComponent is a custom form control for numeric input which allows users to increment and decrement\n * the value using corresponding buttons. It supports keyboard navigation and automatic boundary checks for the values.\n * Extends CustomFormControl to provide additional behavior.\n *\n * @see {CustomFormControl}\n */\n@CSSComponent('spinbox')\n@Component({\n standalone: true,\n selector: 'odx-spinbox',\n templateUrl: 'spinbox.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [ControlDirective, IconComponent],\n providers: [DisabledController.connect(), ReadonlyController.connect()],\n})\nexport class SpinboxComponent extends CustomFormControl<number> implements AfterViewInit {\n private readonly takeUntilDestroyed = untilDestroyed();\n\n private get inputElement(): HTMLInputElement {\n return this.control?.element.nativeElement as HTMLInputElement;\n }\n\n @ViewChild('decrementButton')\n protected decrementButton!: ElementRef<HTMLButtonElement>;\n\n @ViewChild('incrementButton')\n protected incrementButton!: ElementRef<HTMLButtonElement>;\n\n public readonly element = injectElement();\n\n /**\n * The maximum allowable value for the spinbox.\n *\n * @type {number}\n * @default Infinity\n */\n @Input({ transform: numberAttribute })\n public max = Infinity;\n\n /**\n * The minimum allowable value for the spinbox.\n *\n * @type {number}\n * @default -Infinity\n */\n @Input({ transform: numberAttribute })\n public min = -Infinity;\n\n /**\n * The value increment or decrement step for the spinbox.\n *\n * @type {number}\n * @default 1\n */\n @Input({ transform: numberAttribute })\n public step = 1;\n\n constructor() {\n super(0);\n detectControllerChanges(this).subscribe();\n }\n\n public ngAfterViewInit(): void {\n this.registerPressHold(this.decrementButton).subscribe(() => {\n this.inputElement?.stepDown();\n this.onInputChange();\n });\n this.registerPressHold(this.incrementButton).subscribe(() => {\n this.inputElement?.stepUp();\n this.onInputChange();\n });\n }\n\n protected maxSteps({ code }: KeyboardEvent) {\n if (code === 'End' && this.min !== -Infinity) {\n this.updateValue(this.min);\n } else if (code === 'Home' && this.max !== Infinity) {\n this.updateValue(this.max);\n }\n }\n\n protected checkValue(): void {\n const value = numberAttribute(this.inputElement.value);\n this.updateValue(value < this.min ? this.min : value > this.max ? this.max : value);\n }\n\n protected onInputChange(): void {\n this.updateValue(numberAttribute(this.inputElement.value));\n }\n\n private registerPressHold(target: ElementRef<HTMLElement>): Observable<unknown> {\n return fromEvents(target.nativeElement, 'keydown', 'mousedown', 'mouseup', 'keyup').pipe(\n filter((event) => event?.type !== 'keydown' || ['Space', 'Enter'].includes((event as KeyboardEvent).code)),\n tap((event) => {\n event.preventDefault();\n event.stopPropagation();\n }),\n switchMap(({ type }) => (['mouseup', 'keyup'].includes(type) ? NEVER : timer(500, 100).pipe(startWith(undefined)))),\n this.takeUntilDestroyed(),\n );\n }\n}\n","<button [disabled]=\"isDisabled || isReadonly\" type=\"button\" class=\"odx-spinbox__action\" #decrementButton><odx-icon name=\"minus\" /></button>\n<input\n odxControl\n class=\"odx-spinbox__input\"\n [disabled]=\"isDisabled\"\n [readonly]=\"isReadonly\"\n type=\"number\"\n [value]=\"value\"\n [min]=\"min\"\n [max]=\"max\"\n [step]=\"step\"\n (keydown)=\"maxSteps($event)\"\n (change)=\"onInputChange()\"\n (blur)=\"checkValue()\"\n/>\n<button [disabled]=\"isDisabled || isReadonly\" type=\"button\" class=\"odx-spinbox__action\" #incrementButton><odx-icon name=\"plus\" /></button>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"odx-angular-components-spinbox.mjs","sources":["../../../../libs/angular/components/spinbox/src/lib/spinbox.component.ts","../../../../libs/angular/components/spinbox/src/lib/spinbox.component.html","../../../../libs/angular/components/spinbox/src/odx-angular-components-spinbox.ts"],"sourcesContent":["import { AfterViewInit, ChangeDetectionStrategy, Component, ElementRef, Input, numberAttribute, OnDestroy, ViewChild, ViewEncapsulation } from '@angular/core';\nimport { detectControllerChanges, DisabledController, ReadonlyController } from '@odx/angular';\nimport { ControlDirective, CustomFormControl } from '@odx/angular/cdk/custom-form-control';\nimport { IconComponent } from '@odx/angular/components/icon';\nimport { CSSComponent } from '@odx/angular/internal';\nimport { injectElement } from '@odx/angular/utils';\n\n/**\n * SpinboxComponent is a custom form control for numeric input which allows users to increment and decrement\n * the value using corresponding buttons. It supports keyboard navigation and automatic boundary checks for the values.\n * Extends CustomFormControl to provide additional behavior.\n *\n * @see {CustomFormControl}\n */\n@CSSComponent('spinbox')\n@Component({\n standalone: true,\n selector: 'odx-spinbox',\n templateUrl: 'spinbox.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [ControlDirective, IconComponent],\n providers: [DisabledController.connect(), ReadonlyController.connect()],\n})\nexport class SpinboxComponent extends CustomFormControl<number> implements AfterViewInit, OnDestroy {\n private destroyIncrementListener!: () => void;\n private destroyDecrementListener!: () => void;\n private get inputElement(): HTMLInputElement {\n return this.control?.element.nativeElement as HTMLInputElement;\n }\n\n @ViewChild('decrementButton')\n protected decrementButton!: ElementRef<HTMLButtonElement>;\n\n @ViewChild('incrementButton')\n protected incrementButton!: ElementRef<HTMLButtonElement>;\n\n public readonly element = injectElement();\n\n /**\n * The maximum allowable value for the spinbox.\n *\n * @type {number}\n * @default Number.POSITIVE_INFINITY\n */\n @Input({ transform: numberAttribute })\n public max = Number.POSITIVE_INFINITY;\n\n /**\n * The minimum allowable value for the spinbox.\n *\n * @type {number}\n * @default Number.NEGATIVE_INFINITY\n */\n @Input({ transform: numberAttribute })\n public min = Number.NEGATIVE_INFINITY;\n\n /**\n * The value increment or decrement step for the spinbox.\n *\n * @type {number}\n * @default 1\n */\n @Input({ transform: numberAttribute })\n public step = 1;\n\n constructor() {\n super(0);\n detectControllerChanges(this).subscribe();\n }\n\n public ngAfterViewInit(): void {\n this.destroyDecrementListener = this.pressAndHold(this.decrementButton.nativeElement, () => {\n this.inputElement?.stepDown();\n this.updateValue(numberAttribute(this.inputElement.value));\n });\n this.destroyIncrementListener = this.pressAndHold(this.incrementButton.nativeElement, () => {\n this.inputElement?.stepUp();\n this.updateValue(numberAttribute(this.inputElement.value));\n });\n }\n\n public override ngOnDestroy(): void {\n super.ngOnDestroy();\n this.destroyDecrementListener?.();\n this.destroyIncrementListener?.();\n }\n\n public override updateValue(value: number) {\n if (this.value === value) return;\n super.updateValue(value);\n }\n\n protected maxSteps({ code }: KeyboardEvent) {\n if (code === 'End' && this.min !== -Infinity) {\n this.updateValue(this.min);\n } else if (code === 'Home' && this.max !== Infinity) {\n this.updateValue(this.max);\n }\n }\n\n protected checkAndUpdate(): void {\n const value = numberAttribute(this.inputElement.value);\n const clampedValue = Math.min(this.max, Math.max(this.min, value));\n this.inputElement.value = clampedValue.toString();\n this.updateValue(clampedValue);\n }\n\n private pressAndHold(element: HTMLElement, handler: () => void, interval = 200): () => void {\n let timerId: number | undefined;\n\n const clearTimer = () => {\n clearInterval(timerId);\n timerId = undefined;\n };\n\n const start = () => {\n handler();\n timerId = window.setInterval(handler, interval);\n };\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if ((event.code === 'Space' || event.code === 'Enter') && timerId === undefined) {\n if (event.code === 'Space') {\n event.preventDefault(); // blocks scrolling\n }\n start();\n }\n };\n\n const handleKeyUp = (event: KeyboardEvent) => {\n if (event.code === 'Space' || event.code === 'Enter') {\n clearTimer();\n }\n };\n\n element.addEventListener('mousedown', start);\n element.addEventListener('mouseup', clearTimer);\n element.addEventListener('mouseout', clearTimer);\n element.addEventListener('keydown', handleKeyDown);\n element.addEventListener('keyup', handleKeyUp);\n\n return () => {\n element.removeEventListener('mousedown', start);\n element.removeEventListener('mouseup', clearTimer);\n element.removeEventListener('mouseout', clearTimer);\n element.removeEventListener('keydown', handleKeyDown);\n element.removeEventListener('keyup', handleKeyUp);\n };\n }\n}\n","<button [disabled]=\"isDisabled || isReadonly\" type=\"button\" class=\"odx-spinbox__action\" #decrementButton><odx-icon name=\"minus\" /></button>\n<input\n odxControl\n class=\"odx-spinbox__input\"\n [disabled]=\"isDisabled\"\n [readonly]=\"isReadonly\"\n type=\"number\"\n [value]=\"value\"\n [min]=\"min\"\n [max]=\"max\"\n [step]=\"step\"\n (keydown)=\"maxSteps($event)\"\n (change)=\"checkAndUpdate()\"\n (blur)=\"checkAndUpdate()\"\n/>\n<button [disabled]=\"isDisabled || isReadonly\" type=\"button\" class=\"odx-spinbox__action\" #incrementButton><odx-icon name=\"plus\" /></button>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|