@pecb-ui/components 1.1.2 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/README.md +556 -556
  2. package/fesm2022/pecb-ui-components.mjs +998 -1907
  3. package/fesm2022/pecb-ui-components.mjs.map +1 -1
  4. package/index.d.ts +2439 -3
  5. package/package.json +6 -8
  6. package/esm2022/lib/components/button/button.component.mjs +0 -171
  7. package/esm2022/lib/components/card/card.component.mjs +0 -182
  8. package/esm2022/lib/components/checkbox/checkbox.component.mjs +0 -126
  9. package/esm2022/lib/components/datepicker/datepicker.component.mjs +0 -349
  10. package/esm2022/lib/components/dropdown/dropdown.component.mjs +0 -329
  11. package/esm2022/lib/components/input/input.component.mjs +0 -321
  12. package/esm2022/lib/components/pagination/pagination.component.mjs +0 -197
  13. package/esm2022/lib/components/radio/radio.component.mjs +0 -147
  14. package/esm2022/lib/components/right-modal/right-modal.component.mjs +0 -234
  15. package/esm2022/lib/components/sidebar/sidebar.component.mjs +0 -155
  16. package/esm2022/lib/components/status/status.component.mjs +0 -50
  17. package/esm2022/lib/components/tab/tab.component.mjs +0 -151
  18. package/esm2022/lib/components/table/table.component.mjs +0 -503
  19. package/esm2022/lib/components/toggle/toggle.component.mjs +0 -126
  20. package/esm2022/lib/pecb-components.module.mjs +0 -118
  21. package/esm2022/lib/services/loading.service.mjs +0 -182
  22. package/esm2022/lib/services/notification.service.mjs +0 -144
  23. package/esm2022/lib/services/theme.service.mjs +0 -232
  24. package/esm2022/lib/shared/interfaces/component.interfaces.mjs +0 -2
  25. package/esm2022/lib/shared/types/common.types.mjs +0 -6
  26. package/esm2022/lib/shared/utils/accessibility.utils.mjs +0 -223
  27. package/esm2022/lib/shared/utils/dom.utils.mjs +0 -240
  28. package/esm2022/lib/shared/utils/error.utils.mjs +0 -277
  29. package/esm2022/lib/shared/utils/string.utils.mjs +0 -204
  30. package/esm2022/pecb-ui-components.mjs +0 -5
  31. package/esm2022/public-api.mjs +0 -53
  32. package/lib/components/button/button.component.d.ts +0 -130
  33. package/lib/components/card/card.component.d.ts +0 -140
  34. package/lib/components/checkbox/checkbox.component.d.ts +0 -74
  35. package/lib/components/datepicker/datepicker.component.d.ts +0 -155
  36. package/lib/components/dropdown/dropdown.component.d.ts +0 -144
  37. package/lib/components/input/input.component.d.ts +0 -215
  38. package/lib/components/pagination/pagination.component.d.ts +0 -53
  39. package/lib/components/radio/radio.component.d.ts +0 -93
  40. package/lib/components/right-modal/right-modal.component.d.ts +0 -137
  41. package/lib/components/sidebar/sidebar.component.d.ts +0 -97
  42. package/lib/components/status/status.component.d.ts +0 -19
  43. package/lib/components/tab/tab.component.d.ts +0 -102
  44. package/lib/components/table/table.component.d.ts +0 -403
  45. package/lib/components/toggle/toggle.component.d.ts +0 -74
  46. package/lib/pecb-components.module.d.ts +0 -37
  47. package/lib/services/loading.service.d.ts +0 -129
  48. package/lib/services/notification.service.d.ts +0 -136
  49. package/lib/services/theme.service.d.ts +0 -142
  50. package/lib/shared/interfaces/component.interfaces.d.ts +0 -283
  51. package/lib/shared/types/common.types.d.ts +0 -86
  52. package/lib/shared/utils/accessibility.utils.d.ts +0 -167
  53. package/lib/shared/utils/dom.utils.d.ts +0 -108
  54. package/lib/shared/utils/error.utils.d.ts +0 -191
  55. package/lib/shared/utils/string.utils.d.ts +0 -144
  56. package/public-api.d.ts +0 -24
@@ -1,126 +0,0 @@
1
- import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, forwardRef } from '@angular/core';
2
- import { CommonModule } from '@angular/common';
3
- import { NG_VALUE_ACCESSOR } from '@angular/forms';
4
- import { generateUniqueId } from '../../shared/utils/dom.utils';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "@angular/common";
7
- /**
8
- * A professional checkbox component with label and description support.
9
- * Fully accessible with WCAG 2.1 AA compliance and reactive forms support.
10
- *
11
- * @example
12
- * ```html
13
- * <pecb-checkbox
14
- * label="Accept terms"
15
- * description="I agree to the terms and conditions"
16
- * [(ngModel)]="accepted"
17
- * ></pecb-checkbox>
18
- * ```
19
- *
20
- * @publicApi
21
- */
22
- export class CheckboxComponent {
23
- constructor(cdr) {
24
- this.cdr = cdr;
25
- /**
26
- * Unique ID for the checkbox element
27
- */
28
- this.id = generateUniqueId('checkbox');
29
- /**
30
- * Position of the label relative to the checkbox control.
31
- * 'right' (default): [checkbox] Title Description
32
- * 'left': Title Description [checkbox]
33
- */
34
- this.labelPosition = 'right';
35
- /**
36
- * Whether the checkbox is disabled
37
- */
38
- this.disabled = false;
39
- /**
40
- * Event emitted when checked state changes
41
- */
42
- this.checkedChange = new EventEmitter();
43
- // Internal state
44
- this.checked = false;
45
- // ControlValueAccessor
46
- this.onChange = () => { };
47
- this.onTouched = () => { };
48
- }
49
- /**
50
- * Get CSS classes for the checkbox wrapper
51
- */
52
- get wrapperClasses() {
53
- return [
54
- 'pecb-checkbox',
55
- this.disabled ? 'pecb-checkbox--disabled' : '',
56
- this.checked ? 'pecb-checkbox--checked' : '',
57
- this.labelPosition === 'left' ? 'pecb-checkbox--label-left' : ''
58
- ].filter(Boolean);
59
- }
60
- /**
61
- * Handle checkbox change
62
- */
63
- onCheckboxChange(event) {
64
- if (this.disabled)
65
- return;
66
- const checked = event.target.checked;
67
- this.checked = checked;
68
- this.onChange(this.checked);
69
- this.checkedChange.emit(this.checked);
70
- this.cdr.markForCheck();
71
- }
72
- /**
73
- * Handle blur event
74
- */
75
- onBlur() {
76
- this.onTouched();
77
- }
78
- // ControlValueAccessor implementation
79
- writeValue(value) {
80
- this.checked = !!value;
81
- this.cdr.markForCheck();
82
- }
83
- registerOnChange(fn) {
84
- this.onChange = fn;
85
- }
86
- registerOnTouched(fn) {
87
- this.onTouched = fn;
88
- }
89
- setDisabledState(isDisabled) {
90
- this.disabled = isDisabled;
91
- this.cdr.markForCheck();
92
- }
93
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CheckboxComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
94
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: CheckboxComponent, isStandalone: true, selector: "pecb-checkbox", inputs: { id: "id", name: "name", label: "label", description: "description", labelPosition: "labelPosition", disabled: "disabled" }, outputs: { checkedChange: "checkedChange" }, providers: [
95
- {
96
- provide: NG_VALUE_ACCESSOR,
97
- useExisting: forwardRef(() => CheckboxComponent),
98
- multi: true
99
- }
100
- ], ngImport: i0, template: "<div [class]=\"wrapperClasses.join(' ')\">\r\n <label [attr.for]=\"id\" class=\"pecb-checkbox__label\">\r\n <input\r\n [id]=\"id\"\r\n type=\"checkbox\"\r\n class=\"pecb-checkbox__input\"\r\n [name]=\"name\"\r\n [checked]=\"checked\"\r\n [disabled]=\"disabled\"\r\n [attr.aria-label]=\"label\"\r\n [attr.aria-describedby]=\"description ? id + '-description' : null\"\r\n (change)=\"onCheckboxChange($event)\"\r\n (blur)=\"onBlur()\"\r\n />\r\n <span *ngIf=\"labelPosition === 'left' && (label || description)\" class=\"pecb-checkbox__content\">\r\n <span *ngIf=\"label\" class=\"pecb-checkbox__text\">{{ label }}</span>\r\n <span *ngIf=\"description\" [id]=\"id + '-description'\" class=\"pecb-checkbox__description\">{{ description }}</span>\r\n </span>\r\n <span class=\"pecb-checkbox__control\">\r\n <svg class=\"pecb-checkbox__icon\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </span>\r\n <span *ngIf=\"labelPosition === 'right' && (label || description)\" class=\"pecb-checkbox__content\">\r\n <span *ngIf=\"label\" class=\"pecb-checkbox__text\">{{ label }}</span>\r\n <span *ngIf=\"description\" [id]=\"id + '-description'\" class=\"pecb-checkbox__description\">{{ description }}</span>\r\n </span>\r\n </label>\r\n</div>\r\n", styles: [".pecb-checkbox{position:relative;display:inline-block}.pecb-checkbox__label{display:flex;align-items:flex-start;cursor:pointer;-webkit-user-select:none;user-select:none;gap:12px}.pecb-checkbox__input{position:absolute;opacity:0;width:0;height:0;margin:0;padding:0;pointer-events:none}.pecb-checkbox__control{position:relative;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;width:20px;height:20px;margin-top:2px;border:2px solid #c2c2c2;border-radius:4px;background-color:#fff;transition-property:border-color,background-color;transition-duration:.25s ease-in-out;transition-timing-function:ease-in-out}.pecb-checkbox__icon{color:#fff;opacity:0;transform:scale(0);transition-property:opacity,transform;transition-duration:.25s ease-in-out;transition-timing-function:ease-in-out}.pecb-checkbox__content{display:flex;flex-direction:column;gap:6px;flex:1}.pecb-checkbox__text{font-family:Plus Jakarta Sans,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-size:14px;font-weight:500;color:#313131;line-height:1.5}.pecb-checkbox__description{font-family:Plus Jakarta Sans,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-size:12px;font-weight:400;color:#919191;line-height:1.5}.pecb-checkbox:not(.pecb-checkbox--disabled) .pecb-checkbox__label:hover .pecb-checkbox__control{border-color:#212427}.pecb-checkbox__input:focus-visible+.pecb-checkbox__control{outline:2px solid #212427;outline-offset:2px}.pecb-checkbox--checked .pecb-checkbox__control{border-color:#212427;background-color:#212427}.pecb-checkbox--checked .pecb-checkbox__icon{opacity:1;transform:scale(1)}.pecb-checkbox--disabled .pecb-checkbox__label{cursor:not-allowed}.pecb-checkbox--disabled .pecb-checkbox__control{border-color:#ececec;background-color:#f4f4f4}.pecb-checkbox--disabled.pecb-checkbox--checked .pecb-checkbox__control{background-color:#c2c2c2;border-color:#c2c2c2}.pecb-checkbox--disabled .pecb-checkbox__text{color:#c2c2c2}.pecb-checkbox--disabled .pecb-checkbox__description{color:#ececec}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
101
- }
102
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CheckboxComponent, decorators: [{
103
- type: Component,
104
- args: [{ selector: 'pecb-checkbox', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, providers: [
105
- {
106
- provide: NG_VALUE_ACCESSOR,
107
- useExisting: forwardRef(() => CheckboxComponent),
108
- multi: true
109
- }
110
- ], template: "<div [class]=\"wrapperClasses.join(' ')\">\r\n <label [attr.for]=\"id\" class=\"pecb-checkbox__label\">\r\n <input\r\n [id]=\"id\"\r\n type=\"checkbox\"\r\n class=\"pecb-checkbox__input\"\r\n [name]=\"name\"\r\n [checked]=\"checked\"\r\n [disabled]=\"disabled\"\r\n [attr.aria-label]=\"label\"\r\n [attr.aria-describedby]=\"description ? id + '-description' : null\"\r\n (change)=\"onCheckboxChange($event)\"\r\n (blur)=\"onBlur()\"\r\n />\r\n <span *ngIf=\"labelPosition === 'left' && (label || description)\" class=\"pecb-checkbox__content\">\r\n <span *ngIf=\"label\" class=\"pecb-checkbox__text\">{{ label }}</span>\r\n <span *ngIf=\"description\" [id]=\"id + '-description'\" class=\"pecb-checkbox__description\">{{ description }}</span>\r\n </span>\r\n <span class=\"pecb-checkbox__control\">\r\n <svg class=\"pecb-checkbox__icon\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\r\n <path d=\"M10 3L4.5 8.5L2 6\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </span>\r\n <span *ngIf=\"labelPosition === 'right' && (label || description)\" class=\"pecb-checkbox__content\">\r\n <span *ngIf=\"label\" class=\"pecb-checkbox__text\">{{ label }}</span>\r\n <span *ngIf=\"description\" [id]=\"id + '-description'\" class=\"pecb-checkbox__description\">{{ description }}</span>\r\n </span>\r\n </label>\r\n</div>\r\n", styles: [".pecb-checkbox{position:relative;display:inline-block}.pecb-checkbox__label{display:flex;align-items:flex-start;cursor:pointer;-webkit-user-select:none;user-select:none;gap:12px}.pecb-checkbox__input{position:absolute;opacity:0;width:0;height:0;margin:0;padding:0;pointer-events:none}.pecb-checkbox__control{position:relative;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;width:20px;height:20px;margin-top:2px;border:2px solid #c2c2c2;border-radius:4px;background-color:#fff;transition-property:border-color,background-color;transition-duration:.25s ease-in-out;transition-timing-function:ease-in-out}.pecb-checkbox__icon{color:#fff;opacity:0;transform:scale(0);transition-property:opacity,transform;transition-duration:.25s ease-in-out;transition-timing-function:ease-in-out}.pecb-checkbox__content{display:flex;flex-direction:column;gap:6px;flex:1}.pecb-checkbox__text{font-family:Plus Jakarta Sans,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-size:14px;font-weight:500;color:#313131;line-height:1.5}.pecb-checkbox__description{font-family:Plus Jakarta Sans,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-size:12px;font-weight:400;color:#919191;line-height:1.5}.pecb-checkbox:not(.pecb-checkbox--disabled) .pecb-checkbox__label:hover .pecb-checkbox__control{border-color:#212427}.pecb-checkbox__input:focus-visible+.pecb-checkbox__control{outline:2px solid #212427;outline-offset:2px}.pecb-checkbox--checked .pecb-checkbox__control{border-color:#212427;background-color:#212427}.pecb-checkbox--checked .pecb-checkbox__icon{opacity:1;transform:scale(1)}.pecb-checkbox--disabled .pecb-checkbox__label{cursor:not-allowed}.pecb-checkbox--disabled .pecb-checkbox__control{border-color:#ececec;background-color:#f4f4f4}.pecb-checkbox--disabled.pecb-checkbox--checked .pecb-checkbox__control{background-color:#c2c2c2;border-color:#c2c2c2}.pecb-checkbox--disabled .pecb-checkbox__text{color:#c2c2c2}.pecb-checkbox--disabled .pecb-checkbox__description{color:#ececec}\n"] }]
111
- }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { id: [{
112
- type: Input
113
- }], name: [{
114
- type: Input
115
- }], label: [{
116
- type: Input
117
- }], description: [{
118
- type: Input
119
- }], labelPosition: [{
120
- type: Input
121
- }], disabled: [{
122
- type: Input
123
- }], checkedChange: [{
124
- type: Output
125
- }] } });
126
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWktY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvY2hlY2tib3gvY2hlY2tib3guY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWktY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvY2hlY2tib3gvY2hlY2tib3guY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWix1QkFBdUIsRUFDdkIsVUFBVSxFQUVYLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sOEJBQThCLENBQUM7OztBQUloRTs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQWdCSCxNQUFNLE9BQU8saUJBQWlCO0lBNkM1QixZQUFvQixHQUFzQjtRQUF0QixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQTVDMUM7O1dBRUc7UUFDTSxPQUFFLEdBQVcsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFpQm5EOzs7O1dBSUc7UUFDTSxrQkFBYSxHQUEwQixPQUFPLENBQUM7UUFFeEQ7O1dBRUc7UUFDTSxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBRTFCOztXQUVHO1FBQ08sa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBRXRELGlCQUFpQjtRQUNqQixZQUFPLEdBQUcsS0FBSyxDQUFDO1FBRWhCLHVCQUF1QjtRQUNmLGFBQVEsR0FBNkIsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDO1FBQzlDLGNBQVMsR0FBZSxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUM7SUFFSSxDQUFDO0lBRTlDOztPQUVHO0lBQ0gsSUFBSSxjQUFjO1FBQ2hCLE9BQU87WUFDTCxlQUFlO1lBQ2YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMseUJBQXlCLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDOUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDNUMsSUFBSSxDQUFDLGFBQWEsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLDJCQUEyQixDQUFDLENBQUMsQ0FBQyxFQUFFO1NBQ2pFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3BCLENBQUM7SUFFRDs7T0FFRztJQUNILGdCQUFnQixDQUFDLEtBQVk7UUFDM0IsSUFBSSxJQUFJLENBQUMsUUFBUTtZQUFFLE9BQU87UUFFMUIsTUFBTSxPQUFPLEdBQUksS0FBSyxDQUFDLE1BQTJCLENBQUMsT0FBTyxDQUFDO1FBQzNELElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzVCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU07UUFDSixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUVELHNDQUFzQztJQUN0QyxVQUFVLENBQUMsS0FBYztRQUN2QixJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsRUFBNEI7UUFDM0MsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVELGlCQUFpQixDQUFDLEVBQWM7UUFDOUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVELGdCQUFnQixDQUFDLFVBQW1CO1FBQ2xDLElBQUksQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDO1FBQzNCLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDMUIsQ0FBQzsrR0FoR1UsaUJBQWlCO21HQUFqQixpQkFBaUIsK09BUmpCO1lBQ1Q7Z0JBQ0UsT0FBTyxFQUFFLGlCQUFpQjtnQkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQztnQkFDaEQsS0FBSyxFQUFFLElBQUk7YUFDWjtTQUNGLDBCQzNDSCx3K0NBNkJBLHVpRURJWSxZQUFZOzs0RkFZWCxpQkFBaUI7a0JBZjdCLFNBQVM7K0JBQ0UsZUFBZSxjQUNiLElBQUksV0FDUCxDQUFDLFlBQVksQ0FBQyxtQkFHTix1QkFBdUIsQ0FBQyxNQUFNLGFBQ3BDO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLGtCQUFrQixDQUFDOzRCQUNoRCxLQUFLLEVBQUUsSUFBSTt5QkFDWjtxQkFDRjtzRkFNUSxFQUFFO3NCQUFWLEtBQUs7Z0JBS0csSUFBSTtzQkFBWixLQUFLO2dCQUtHLEtBQUs7c0JBQWIsS0FBSztnQkFLRyxXQUFXO3NCQUFuQixLQUFLO2dCQU9HLGFBQWE7c0JBQXJCLEtBQUs7Z0JBS0csUUFBUTtzQkFBaEIsS0FBSztnQkFLSSxhQUFhO3NCQUF0QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgSW5wdXQsXHJcbiAgT3V0cHV0LFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcclxuICBmb3J3YXJkUmVmLFxyXG4gIENoYW5nZURldGVjdG9yUmVmXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgZ2VuZXJhdGVVbmlxdWVJZCB9IGZyb20gJy4uLy4uL3NoYXJlZC91dGlscy9kb20udXRpbHMnO1xyXG5cclxuZXhwb3J0IHR5cGUgQ2hlY2tib3hMYWJlbFBvc2l0aW9uID0gJ3JpZ2h0JyB8ICdsZWZ0JztcclxuXHJcbi8qKlxyXG4gKiBBIHByb2Zlc3Npb25hbCBjaGVja2JveCBjb21wb25lbnQgd2l0aCBsYWJlbCBhbmQgZGVzY3JpcHRpb24gc3VwcG9ydC5cclxuICogRnVsbHkgYWNjZXNzaWJsZSB3aXRoIFdDQUcgMi4xIEFBIGNvbXBsaWFuY2UgYW5kIHJlYWN0aXZlIGZvcm1zIHN1cHBvcnQuXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYGh0bWxcclxuICogPHBlY2ItY2hlY2tib3hcclxuICogICBsYWJlbD1cIkFjY2VwdCB0ZXJtc1wiXHJcbiAqICAgZGVzY3JpcHRpb249XCJJIGFncmVlIHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9uc1wiXHJcbiAqICAgWyhuZ01vZGVsKV09XCJhY2NlcHRlZFwiXHJcbiAqID48L3BlY2ItY2hlY2tib3g+XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAcHVibGljQXBpXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3BlY2ItY2hlY2tib3gnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2NoZWNrYm94LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9jaGVja2JveC5jb21wb25lbnQuc2NzcyddLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAge1xyXG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQ2hlY2tib3hDb21wb25lbnQpLFxyXG4gICAgICBtdWx0aTogdHJ1ZVxyXG4gICAgfVxyXG4gIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIENoZWNrYm94Q29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xyXG4gIC8qKlxyXG4gICAqIFVuaXF1ZSBJRCBmb3IgdGhlIGNoZWNrYm94IGVsZW1lbnRcclxuICAgKi9cclxuICBASW5wdXQoKSBpZDogc3RyaW5nID0gZ2VuZXJhdGVVbmlxdWVJZCgnY2hlY2tib3gnKTtcclxuXHJcbiAgLyoqXHJcbiAgICogTmFtZSBhdHRyaWJ1dGUgZm9yIHRoZSBjaGVja2JveFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIG5hbWU/OiBzdHJpbmc7XHJcblxyXG4gIC8qKlxyXG4gICAqIExhYmVsIHRleHQgdG8gZGlzcGxheVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGxhYmVsPzogc3RyaW5nO1xyXG5cclxuICAvKipcclxuICAgKiBEZXNjcmlwdGlvbiB0ZXh0IHRvIGRpc3BsYXkgYmVsb3cgbGFiZWxcclxuICAgKi9cclxuICBASW5wdXQoKSBkZXNjcmlwdGlvbj86IHN0cmluZztcclxuXHJcbiAgLyoqXHJcbiAgICogUG9zaXRpb24gb2YgdGhlIGxhYmVsIHJlbGF0aXZlIHRvIHRoZSBjaGVja2JveCBjb250cm9sLlxyXG4gICAqICdyaWdodCcgKGRlZmF1bHQpOiBbY2hlY2tib3hdIFRpdGxlIERlc2NyaXB0aW9uXHJcbiAgICogJ2xlZnQnOiBUaXRsZSBEZXNjcmlwdGlvbiBbY2hlY2tib3hdXHJcbiAgICovXHJcbiAgQElucHV0KCkgbGFiZWxQb3NpdGlvbjogQ2hlY2tib3hMYWJlbFBvc2l0aW9uID0gJ3JpZ2h0JztcclxuXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciB0aGUgY2hlY2tib3ggaXMgZGlzYWJsZWRcclxuICAgKi9cclxuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xyXG5cclxuICAvKipcclxuICAgKiBFdmVudCBlbWl0dGVkIHdoZW4gY2hlY2tlZCBzdGF0ZSBjaGFuZ2VzXHJcbiAgICovXHJcbiAgQE91dHB1dCgpIGNoZWNrZWRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XHJcblxyXG4gIC8vIEludGVybmFsIHN0YXRlXHJcbiAgY2hlY2tlZCA9IGZhbHNlO1xyXG5cclxuICAvLyBDb250cm9sVmFsdWVBY2Nlc3NvclxyXG4gIHByaXZhdGUgb25DaGFuZ2U6ICh2YWx1ZTogYm9vbGVhbikgPT4gdm9pZCA9ICgpID0+IHt9O1xyXG4gIHByaXZhdGUgb25Ub3VjaGVkOiAoKSA9PiB2b2lkID0gKCkgPT4ge307XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZikge31cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IENTUyBjbGFzc2VzIGZvciB0aGUgY2hlY2tib3ggd3JhcHBlclxyXG4gICAqL1xyXG4gIGdldCB3cmFwcGVyQ2xhc3NlcygpOiBzdHJpbmdbXSB7XHJcbiAgICByZXR1cm4gW1xyXG4gICAgICAncGVjYi1jaGVja2JveCcsXHJcbiAgICAgIHRoaXMuZGlzYWJsZWQgPyAncGVjYi1jaGVja2JveC0tZGlzYWJsZWQnIDogJycsXHJcbiAgICAgIHRoaXMuY2hlY2tlZCA/ICdwZWNiLWNoZWNrYm94LS1jaGVja2VkJyA6ICcnLFxyXG4gICAgICB0aGlzLmxhYmVsUG9zaXRpb24gPT09ICdsZWZ0JyA/ICdwZWNiLWNoZWNrYm94LS1sYWJlbC1sZWZ0JyA6ICcnXHJcbiAgICBdLmZpbHRlcihCb29sZWFuKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZSBjaGVja2JveCBjaGFuZ2VcclxuICAgKi9cclxuICBvbkNoZWNrYm94Q2hhbmdlKGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBjaGVja2VkID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS5jaGVja2VkO1xyXG4gICAgdGhpcy5jaGVja2VkID0gY2hlY2tlZDtcclxuICAgIHRoaXMub25DaGFuZ2UodGhpcy5jaGVja2VkKTtcclxuICAgIHRoaXMuY2hlY2tlZENoYW5nZS5lbWl0KHRoaXMuY2hlY2tlZCk7XHJcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZSBibHVyIGV2ZW50XHJcbiAgICovXHJcbiAgb25CbHVyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5vblRvdWNoZWQoKTtcclxuICB9XHJcblxyXG4gIC8vIENvbnRyb2xWYWx1ZUFjY2Vzc29yIGltcGxlbWVudGF0aW9uXHJcbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5jaGVja2VkID0gISF2YWx1ZTtcclxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKHZhbHVlOiBib29sZWFuKSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XHJcbiAgfVxyXG5cclxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xyXG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcclxuICB9XHJcblxyXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XHJcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBbY2xhc3NdPVwid3JhcHBlckNsYXNzZXMuam9pbignICcpXCI+XHJcbiAgPGxhYmVsIFthdHRyLmZvcl09XCJpZFwiIGNsYXNzPVwicGVjYi1jaGVja2JveF9fbGFiZWxcIj5cclxuICAgIDxpbnB1dFxyXG4gICAgICBbaWRdPVwiaWRcIlxyXG4gICAgICB0eXBlPVwiY2hlY2tib3hcIlxyXG4gICAgICBjbGFzcz1cInBlY2ItY2hlY2tib3hfX2lucHV0XCJcclxuICAgICAgW25hbWVdPVwibmFtZVwiXHJcbiAgICAgIFtjaGVja2VkXT1cImNoZWNrZWRcIlxyXG4gICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImxhYmVsXCJcclxuICAgICAgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCJkZXNjcmlwdGlvbiA/IGlkICsgJy1kZXNjcmlwdGlvbicgOiBudWxsXCJcclxuICAgICAgKGNoYW5nZSk9XCJvbkNoZWNrYm94Q2hhbmdlKCRldmVudClcIlxyXG4gICAgICAoYmx1cik9XCJvbkJsdXIoKVwiXHJcbiAgICAvPlxyXG4gICAgPHNwYW4gKm5nSWY9XCJsYWJlbFBvc2l0aW9uID09PSAnbGVmdCcgJiYgKGxhYmVsIHx8IGRlc2NyaXB0aW9uKVwiIGNsYXNzPVwicGVjYi1jaGVja2JveF9fY29udGVudFwiPlxyXG4gICAgICA8c3BhbiAqbmdJZj1cImxhYmVsXCIgY2xhc3M9XCJwZWNiLWNoZWNrYm94X190ZXh0XCI+e3sgbGFiZWwgfX08L3NwYW4+XHJcbiAgICAgIDxzcGFuICpuZ0lmPVwiZGVzY3JpcHRpb25cIiBbaWRdPVwiaWQgKyAnLWRlc2NyaXB0aW9uJ1wiIGNsYXNzPVwicGVjYi1jaGVja2JveF9fZGVzY3JpcHRpb25cIj57eyBkZXNjcmlwdGlvbiB9fTwvc3Bhbj5cclxuICAgIDwvc3Bhbj5cclxuICAgIDxzcGFuIGNsYXNzPVwicGVjYi1jaGVja2JveF9fY29udHJvbFwiPlxyXG4gICAgICA8c3ZnIGNsYXNzPVwicGVjYi1jaGVja2JveF9faWNvblwiIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgIDxwYXRoIGQ9XCJNMTAgM0w0LjUgOC41TDIgNlwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbiAgICAgIDwvc3ZnPlxyXG4gICAgPC9zcGFuPlxyXG4gICAgPHNwYW4gKm5nSWY9XCJsYWJlbFBvc2l0aW9uID09PSAncmlnaHQnICYmIChsYWJlbCB8fCBkZXNjcmlwdGlvbilcIiBjbGFzcz1cInBlY2ItY2hlY2tib3hfX2NvbnRlbnRcIj5cclxuICAgICAgPHNwYW4gKm5nSWY9XCJsYWJlbFwiIGNsYXNzPVwicGVjYi1jaGVja2JveF9fdGV4dFwiPnt7IGxhYmVsIH19PC9zcGFuPlxyXG4gICAgICA8c3BhbiAqbmdJZj1cImRlc2NyaXB0aW9uXCIgW2lkXT1cImlkICsgJy1kZXNjcmlwdGlvbidcIiBjbGFzcz1cInBlY2ItY2hlY2tib3hfX2Rlc2NyaXB0aW9uXCI+e3sgZGVzY3JpcHRpb24gfX08L3NwYW4+XHJcbiAgICA8L3NwYW4+XHJcbiAgPC9sYWJlbD5cclxuPC9kaXY+XHJcbiJdfQ==
@@ -1,349 +0,0 @@
1
- import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, HostListener, ViewChild, forwardRef } from '@angular/core';
2
- import { CommonModule } from '@angular/common';
3
- import { NG_VALUE_ACCESSOR } from '@angular/forms';
4
- import { generateUniqueId } from '../../shared/utils/dom.utils';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "@angular/common";
7
- /**
8
- * A professional datepicker component with calendar dropdown.
9
- * Fully accessible with WCAG 2.1 AA compliance and reactive forms support.
10
- *
11
- * @example
12
- * ```html
13
- * <pecb-datepicker
14
- * label="Date"
15
- * placeholder="Choose Date"
16
- * [(ngModel)]="selectedDate"
17
- * ></pecb-datepicker>
18
- *
19
- * <!-- With custom configuration -->
20
- * <pecb-datepicker
21
- * label="Birth Date"
22
- * [required]="true"
23
- * size="lg"
24
- * (dateChange)="handleDateChange($event)"
25
- * ></pecb-datepicker>
26
- * ```
27
- *
28
- * @publicApi
29
- */
30
- export class DatepickerComponent {
31
- constructor(elementRef, cdr) {
32
- this.elementRef = elementRef;
33
- this.cdr = cdr;
34
- /**
35
- * Unique ID for the datepicker element
36
- */
37
- this.id = generateUniqueId('datepicker');
38
- /**
39
- * Placeholder text for the input
40
- */
41
- this.placeholder = 'Choose Date';
42
- /**
43
- * The size of the datepicker
44
- */
45
- this.size = 'md';
46
- /**
47
- * Whether the field is required
48
- */
49
- this.required = false;
50
- /**
51
- * Whether the datepicker is disabled
52
- */
53
- this.disabled = false;
54
- /**
55
- * Date format for display (default: MM/DD/YYYY)
56
- */
57
- this.dateFormat = 'MM/DD/YYYY';
58
- /**
59
- * Event emitted when date is selected
60
- */
61
- this.dateChange = new EventEmitter();
62
- /**
63
- * Event emitted when calendar is opened
64
- */
65
- this.opened = new EventEmitter();
66
- /**
67
- * Event emitted when calendar is closed
68
- */
69
- this.closed = new EventEmitter();
70
- // Internal state
71
- this.selectedDate = null;
72
- this.isCalendarOpen = false;
73
- this.currentMonth = new Date();
74
- this.calendarDays = [];
75
- this.weekDays = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'];
76
- this.monthNames = [
77
- 'January', 'February', 'March', 'April', 'May', 'June',
78
- 'July', 'August', 'September', 'October', 'November', 'December'
79
- ];
80
- // ControlValueAccessor
81
- this.onChange = () => { };
82
- this.onTouched = () => { };
83
- this.generateCalendar();
84
- }
85
- /**
86
- * Get CSS classes for the datepicker wrapper
87
- */
88
- get wrapperClasses() {
89
- return [
90
- 'pecb-datepicker',
91
- `pecb-datepicker--${this.size}`,
92
- this.disabled ? 'pecb-datepicker--disabled' : '',
93
- this.isCalendarOpen ? 'pecb-datepicker--open' : '',
94
- this.selectedDate ? 'pecb-datepicker--has-value' : ''
95
- ].filter(Boolean);
96
- }
97
- /**
98
- * Get formatted display value
99
- */
100
- get displayValue() {
101
- if (!this.selectedDate)
102
- return '';
103
- return this.formatDate(this.selectedDate);
104
- }
105
- /**
106
- * Get current month and year display
107
- */
108
- get monthYearDisplay() {
109
- return `${this.monthNames[this.currentMonth.getMonth()]} ${this.currentMonth.getFullYear()}`;
110
- }
111
- /**
112
- * Toggle calendar dropdown
113
- */
114
- toggleCalendar() {
115
- if (this.disabled)
116
- return;
117
- this.isCalendarOpen = !this.isCalendarOpen;
118
- if (this.isCalendarOpen) {
119
- this.opened.emit();
120
- // Set current month to selected date's month or current month
121
- if (this.selectedDate) {
122
- this.currentMonth = new Date(this.selectedDate.getFullYear(), this.selectedDate.getMonth(), 1);
123
- }
124
- this.generateCalendar();
125
- }
126
- else {
127
- this.closed.emit();
128
- }
129
- this.cdr.markForCheck();
130
- }
131
- /**
132
- * Close calendar
133
- */
134
- closeCalendar() {
135
- if (this.isCalendarOpen) {
136
- this.isCalendarOpen = false;
137
- this.closed.emit();
138
- this.cdr.markForCheck();
139
- }
140
- }
141
- /**
142
- * Navigate to previous month
143
- */
144
- previousMonth() {
145
- this.currentMonth = new Date(this.currentMonth.getFullYear(), this.currentMonth.getMonth() - 1, 1);
146
- this.generateCalendar();
147
- this.cdr.markForCheck();
148
- }
149
- /**
150
- * Navigate to next month
151
- */
152
- nextMonth() {
153
- this.currentMonth = new Date(this.currentMonth.getFullYear(), this.currentMonth.getMonth() + 1, 1);
154
- this.generateCalendar();
155
- this.cdr.markForCheck();
156
- }
157
- /**
158
- * Select a date
159
- */
160
- selectDate(day) {
161
- if (this.disabled)
162
- return;
163
- if (!day.isCurrentMonth)
164
- return;
165
- if (this.minDate && day.date < this.minDate)
166
- return;
167
- if (this.maxDate && day.date > this.maxDate)
168
- return;
169
- this.selectedDate = day.date;
170
- this.onChange(this.selectedDate);
171
- this.onTouched();
172
- this.dateChange.emit(this.selectedDate);
173
- this.generateCalendar();
174
- this.closeCalendar();
175
- }
176
- /**
177
- * Generate calendar days
178
- */
179
- generateCalendar() {
180
- const year = this.currentMonth.getFullYear();
181
- const month = this.currentMonth.getMonth();
182
- // First day of the month
183
- const firstDay = new Date(year, month, 1);
184
- const startingDayOfWeek = firstDay.getDay();
185
- // Last day of the month
186
- const lastDay = new Date(year, month + 1, 0);
187
- const daysInMonth = lastDay.getDate();
188
- // Previous month
189
- const prevMonth = new Date(year, month, 0);
190
- const daysInPrevMonth = prevMonth.getDate();
191
- const days = [];
192
- const today = new Date();
193
- today.setHours(0, 0, 0, 0);
194
- // Previous month days
195
- for (let i = startingDayOfWeek - 1; i >= 0; i--) {
196
- const date = new Date(year, month - 1, daysInPrevMonth - i);
197
- days.push({
198
- date,
199
- day: daysInPrevMonth - i,
200
- isCurrentMonth: false,
201
- isSelected: false,
202
- isToday: false
203
- });
204
- }
205
- // Current month days
206
- for (let day = 1; day <= daysInMonth; day++) {
207
- const date = new Date(year, month, day);
208
- date.setHours(0, 0, 0, 0);
209
- const isSelected = this.selectedDate ?
210
- date.getTime() === new Date(this.selectedDate).setHours(0, 0, 0, 0) :
211
- false;
212
- const isToday = date.getTime() === today.getTime();
213
- days.push({
214
- date,
215
- day,
216
- isCurrentMonth: true,
217
- isSelected,
218
- isToday
219
- });
220
- }
221
- // Next month days
222
- const remainingDays = 42 - days.length; // 6 rows * 7 days
223
- for (let day = 1; day <= remainingDays; day++) {
224
- const date = new Date(year, month + 1, day);
225
- days.push({
226
- date,
227
- day,
228
- isCurrentMonth: false,
229
- isSelected: false,
230
- isToday: false
231
- });
232
- }
233
- this.calendarDays = days;
234
- }
235
- /**
236
- * Format date for display
237
- */
238
- formatDate(date) {
239
- const month = String(date.getMonth() + 1).padStart(2, '0');
240
- const day = String(date.getDate()).padStart(2, '0');
241
- const year = date.getFullYear();
242
- return this.dateFormat
243
- .replace('MM', month)
244
- .replace('DD', day)
245
- .replace('YYYY', String(year));
246
- }
247
- /**
248
- * Listen for clicks outside to close calendar
249
- */
250
- onDocumentClick(event) {
251
- if (!this.elementRef.nativeElement.contains(event.target)) {
252
- this.closeCalendar();
253
- }
254
- }
255
- /**
256
- * Handle keyboard navigation
257
- */
258
- onKeyDown(event) {
259
- if (event.key === 'Enter' || event.key === ' ') {
260
- event.preventDefault();
261
- this.toggleCalendar();
262
- }
263
- else if (event.key === 'Escape') {
264
- this.closeCalendar();
265
- }
266
- }
267
- /**
268
- * Clear selected date
269
- */
270
- clearDate(event) {
271
- event.stopPropagation();
272
- if (this.disabled)
273
- return;
274
- this.selectedDate = null;
275
- this.onChange(null);
276
- this.onTouched();
277
- this.dateChange.emit(null);
278
- this.generateCalendar();
279
- this.cdr.markForCheck();
280
- }
281
- // ControlValueAccessor implementation
282
- writeValue(value) {
283
- this.selectedDate = value;
284
- if (value) {
285
- this.currentMonth = new Date(value.getFullYear(), value.getMonth(), 1);
286
- }
287
- this.generateCalendar();
288
- this.cdr.markForCheck();
289
- }
290
- registerOnChange(fn) {
291
- this.onChange = fn;
292
- }
293
- registerOnTouched(fn) {
294
- this.onTouched = fn;
295
- }
296
- setDisabledState(isDisabled) {
297
- this.disabled = isDisabled;
298
- this.cdr.markForCheck();
299
- }
300
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DatepickerComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
301
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: DatepickerComponent, isStandalone: true, selector: "pecb-datepicker", inputs: { id: "id", label: "label", placeholder: "placeholder", size: "size", required: "required", disabled: "disabled", dateFormat: "dateFormat", minDate: "minDate", maxDate: "maxDate" }, outputs: { dateChange: "dateChange", opened: "opened", closed: "closed" }, host: { listeners: { "document:click": "onDocumentClick($event)" } }, providers: [
302
- {
303
- provide: NG_VALUE_ACCESSOR,
304
- useExisting: forwardRef(() => DatepickerComponent),
305
- multi: true
306
- }
307
- ], viewQueries: [{ propertyName: "inputElement", first: true, predicate: ["inputElement"], descendants: true }], ngImport: i0, template: "<div [class]=\"wrapperClasses.join(' ')\">\r\n <!-- Input Field -->\r\n <div class=\"pecb-datepicker__input-wrapper\">\r\n <!-- Input -->\r\n <input\r\n #inputElement\r\n [id]=\"id\"\r\n type=\"text\"\r\n class=\"pecb-datepicker__input\"\r\n [value]=\"displayValue\"\r\n [disabled]=\"disabled\"\r\n [attr.aria-label]=\"label || placeholder\"\r\n [attr.aria-required]=\"required\"\r\n readonly\r\n (click)=\"toggleCalendar()\"\r\n (keydown)=\"onKeyDown($event)\"\r\n />\r\n\r\n <!-- Floating Label -->\r\n <label\r\n *ngIf=\"label\"\r\n [attr.for]=\"id\"\r\n class=\"pecb-datepicker__label\"\r\n >\r\n {{ label }}<span *ngIf=\"required\" class=\"pecb-datepicker__required\">*</span>\r\n </label>\r\n\r\n <!-- Clear Button (shown when has value) -->\r\n <button\r\n *ngIf=\"selectedDate && !disabled\"\r\n type=\"button\"\r\n class=\"pecb-datepicker__icon pecb-datepicker__icon--clear\"\r\n [attr.aria-label]=\"'Clear date'\"\r\n (click)=\"clearDate($event)\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M8 0C3.6 0 0 3.6 0 8C0 12.4 3.6 16 8 16C12.4 16 16 12.4 16 8C16 3.6 12.4 0 8 0ZM11.5 10.1L10.1 11.5L8 9.4L5.9 11.5L4.5 10.1L6.6 8L4.5 5.9L5.9 4.5L8 6.6L10.1 4.5L11.5 5.9L9.4 8L11.5 10.1Z\"/>\r\n </svg>\r\n </button>\r\n\r\n <!-- Right Icon (Calendar) -->\r\n <button\r\n type=\"button\"\r\n class=\"pecb-datepicker__icon pecb-datepicker__icon--right\"\r\n [disabled]=\"disabled\"\r\n [attr.aria-label]=\"'Open calendar'\"\r\n (click)=\"toggleCalendar()\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M11 2V1H10V2H6V1H5V2H2V15H14V2H11ZM13 14H3V6H13V14ZM13 5H3V3H5V4H6V3H10V4H11V3H13V5Z\"/>\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n <!-- Calendar Dropdown -->\r\n <div\r\n *ngIf=\"isCalendarOpen\"\r\n class=\"pecb-datepicker__calendar\"\r\n role=\"dialog\"\r\n aria-modal=\"false\"\r\n [attr.aria-label]=\"'Choose date'\"\r\n >\r\n <!-- Calendar Header -->\r\n <div class=\"pecb-datepicker__calendar-header\">\r\n <button\r\n type=\"button\"\r\n class=\"pecb-datepicker__nav-button\"\r\n aria-label=\"Previous month\"\r\n (click)=\"previousMonth()\"\r\n >\r\n \u00AB\r\n </button>\r\n\r\n <span class=\"pecb-datepicker__month-year\">{{ monthYearDisplay }}</span>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"pecb-datepicker__nav-button\"\r\n aria-label=\"Next month\"\r\n (click)=\"nextMonth()\"\r\n >\r\n \u00BB\r\n </button>\r\n </div>\r\n\r\n <!-- Calendar Grid -->\r\n <div class=\"pecb-datepicker__calendar-body\">\r\n <!-- Week Days -->\r\n <div class=\"pecb-datepicker__weekdays\">\r\n <div\r\n *ngFor=\"let day of weekDays\"\r\n class=\"pecb-datepicker__weekday\"\r\n >\r\n {{ day }}\r\n </div>\r\n </div>\r\n\r\n <!-- Days Grid -->\r\n <div class=\"pecb-datepicker__days\">\r\n <button\r\n *ngFor=\"let day of calendarDays\"\r\n type=\"button\"\r\n class=\"pecb-datepicker__day\"\r\n [class.pecb-datepicker__day--other-month]=\"!day.isCurrentMonth\"\r\n [class.pecb-datepicker__day--selected]=\"day.isSelected\"\r\n [class.pecb-datepicker__day--today]=\"day.isToday\"\r\n [attr.aria-label]=\"day.date.toDateString()\"\r\n [attr.aria-selected]=\"day.isSelected\"\r\n (click)=\"selectDate(day)\"\r\n >\r\n {{ day.day }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".pecb-datepicker{position:relative;display:flex;flex-direction:column;font-family:Plus Jakarta Sans,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;width:100%}.pecb-datepicker__input-wrapper{position:relative;display:flex;align-items:center}.pecb-datepicker__label{position:absolute;left:12px;top:50%;transform:translateY(-50%);font-size:14px;font-weight:400;color:#919191;background-color:transparent;padding:0 4px;pointer-events:none;z-index:1;transition:top .2s cubic-bezier(.4,0,.2,1),transform .2s cubic-bezier(.4,0,.2,1),font-size .2s cubic-bezier(.4,0,.2,1),color .2s cubic-bezier(.4,0,.2,1),background-color .2s cubic-bezier(.4,0,.2,1),font-weight .2s cubic-bezier(.4,0,.2,1)}.pecb-datepicker__required{color:#dc3545;margin-left:2px}.pecb-datepicker__input:focus~.pecb-datepicker__label,.pecb-datepicker--open .pecb-datepicker__label,.pecb-datepicker--has-value .pecb-datepicker__label{top:0;transform:translateY(-50%) scale(1);font-size:12px;color:#a11e29;background-color:#fff;font-weight:500}.pecb-datepicker--disabled .pecb-datepicker__label{color:#919191}.pecb-datepicker--disabled .pecb-datepicker__input:focus~.pecb-datepicker__label,.pecb-datepicker--disabled.pecb-datepicker--open .pecb-datepicker__label,.pecb-datepicker--disabled.pecb-datepicker--has-value .pecb-datepicker__label{background-color:#ececec}.pecb-datepicker__input{flex:1;width:100%;font-family:Plus Jakarta Sans,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-weight:400;color:#313131;background-color:#fff;border:1px solid #c2c2c2;border-radius:8px;outline:none;cursor:pointer;transition-property:border-color,box-shadow;transition-duration:.25s ease-in-out;transition-timing-function:ease-in-out}.pecb-datepicker__input::placeholder{color:#919191}.pecb-datepicker__input:hover:not(:disabled){border-color:#919191}.pecb-datepicker__input:focus{border-color:#a11e29;box-shadow:0 0 0 3px #a11e291a}.pecb-datepicker__input:disabled{background-color:#ececec;color:#919191;cursor:not-allowed;border-color:#c2c2c2}.pecb-datepicker__icon{position:absolute;display:inline-flex;align-items:center;justify-content:center;color:#616161;background:none;border:none;cursor:pointer;padding:0;transition-property:color,opacity,transform;transition-duration:.25s ease-in-out;transition-timing-function:ease-in-out}.pecb-datepicker__icon--right{right:12px}.pecb-datepicker__icon--clear{right:36px;color:#919191;opacity:0;transform:scale(.8);pointer-events:none}.pecb-datepicker__icon--clear:hover{color:#dc3545}.pecb-datepicker__icon:hover:not(:disabled){color:#313131}.pecb-datepicker__icon:disabled{color:#919191;cursor:not-allowed}.pecb-datepicker__icon svg{flex-shrink:0}.pecb-datepicker--has-value .pecb-datepicker__icon--clear{opacity:1;transform:scale(1);pointer-events:auto}.pecb-datepicker--sm .pecb-datepicker__input{padding:8px 48px 8px 12px;font-size:12px;height:32px}.pecb-datepicker--sm .pecb-datepicker__label{left:12px;font-size:12px}.pecb-datepicker--sm .pecb-datepicker__input:focus~.pecb-datepicker__label,.pecb-datepicker--sm.pecb-datepicker--open .pecb-datepicker__label,.pecb-datepicker--sm.pecb-datepicker--has-value .pecb-datepicker__label{font-size:10px}.pecb-datepicker--sm .pecb-datepicker__icon--right{right:8px}.pecb-datepicker--sm .pecb-datepicker__icon--right svg{width:14px;height:14px}.pecb-datepicker--sm .pecb-datepicker__icon--clear{right:28px}.pecb-datepicker--sm .pecb-datepicker__icon--clear svg{width:14px;height:14px}.pecb-datepicker--sm.pecb-datepicker--has-value .pecb-datepicker__input{padding-right:68px}.pecb-datepicker--md .pecb-datepicker__input{padding:12px 48px 12px 12px;font-size:14px;height:40px}.pecb-datepicker--md .pecb-datepicker__label{left:12px;font-size:14px}.pecb-datepicker--md .pecb-datepicker__input:focus~.pecb-datepicker__label,.pecb-datepicker--md.pecb-datepicker--open .pecb-datepicker__label,.pecb-datepicker--md.pecb-datepicker--has-value .pecb-datepicker__label{font-size:12px}.pecb-datepicker--md .pecb-datepicker__icon--right{right:12px}.pecb-datepicker--md .pecb-datepicker__icon--right svg{width:16px;height:16px}.pecb-datepicker--md .pecb-datepicker__icon--clear{right:36px}.pecb-datepicker--md .pecb-datepicker__icon--clear svg{width:16px;height:16px}.pecb-datepicker--md.pecb-datepicker--has-value .pecb-datepicker__input{padding-right:72px}.pecb-datepicker--lg .pecb-datepicker__input{padding:16px 64px 16px 16px;font-size:16px;height:48px}.pecb-datepicker--lg .pecb-datepicker__label{left:16px;font-size:16px}.pecb-datepicker--lg .pecb-datepicker__input:focus~.pecb-datepicker__label,.pecb-datepicker--lg.pecb-datepicker--open .pecb-datepicker__label,.pecb-datepicker--lg.pecb-datepicker--has-value .pecb-datepicker__label{font-size:13px}.pecb-datepicker--lg .pecb-datepicker__icon--right{right:16px}.pecb-datepicker--lg .pecb-datepicker__icon--right svg{width:18px;height:18px}.pecb-datepicker--lg .pecb-datepicker__icon--clear{right:44px}.pecb-datepicker--lg .pecb-datepicker__icon--clear svg{width:18px;height:18px}.pecb-datepicker--lg.pecb-datepicker--has-value .pecb-datepicker__input{padding-right:92px}.pecb-datepicker__calendar{position:absolute;top:calc(100% + 4px);left:0;z-index:1000;background-color:#fff;border:1px solid #c2c2c2;border-radius:12px;box-shadow:0 10px 15px -3px #0000001a,0 4px 6px -2px #0000000d;padding:16px;min-width:280px}.pecb-datepicker__calendar-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px;padding-bottom:12px;border-bottom:1px solid #ececec}.pecb-datepicker__month-year{font-size:14px;font-weight:500;color:#313131}.pecb-datepicker__nav-button{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;background-color:transparent;border:none;border-radius:8px;color:#616161;font-size:18px;font-weight:700;cursor:pointer;transition-property:background-color,color;transition-duration:.25s ease-in-out;transition-timing-function:ease-in-out}.pecb-datepicker__nav-button:hover{background-color:#ececec;color:#313131}.pecb-datepicker__nav-button:focus-visible{outline:2px solid #a11e29;outline-offset:2px}.pecb-datepicker__calendar-body{display:flex;flex-direction:column}.pecb-datepicker__weekdays{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;margin-bottom:8px}.pecb-datepicker__weekday{display:flex;align-items:center;justify-content:center;padding:6px;font-size:12px;font-weight:500;color:#616161;text-align:center}.pecb-datepicker__days{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}.pecb-datepicker__day{display:flex;align-items:center;justify-content:center;width:36px;height:36px;padding:0;background-color:transparent;border:none;border-radius:8px;font-size:14px;font-weight:400;color:#313131;cursor:pointer;transition-property:background-color,color;transition-duration:.25s ease-in-out;transition-timing-function:ease-in-out}.pecb-datepicker__day:hover:not(.pecb-datepicker__day--other-month):not(.pecb-datepicker__day--selected){background-color:#ececec}.pecb-datepicker__day:focus-visible{outline:2px solid #a11e29;outline-offset:2px}.pecb-datepicker__day--other-month{color:#919191;cursor:default}.pecb-datepicker__day--other-month:hover{background-color:transparent}.pecb-datepicker__day--selected{background-color:#313131;color:#fff;font-weight:500}.pecb-datepicker__day--selected:hover{background-color:#313131}.pecb-datepicker__day--today:not(.pecb-datepicker__day--selected){background-color:#fff;color:#a11e29;font-weight:500}.pecb-datepicker--disabled{opacity:.6;pointer-events:none}.pecb-datepicker--open .pecb-datepicker__input{border-color:#a11e29;box-shadow:0 0 0 3px #a11e291a}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
308
- }
309
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DatepickerComponent, decorators: [{
310
- type: Component,
311
- args: [{ selector: 'pecb-datepicker', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, providers: [
312
- {
313
- provide: NG_VALUE_ACCESSOR,
314
- useExisting: forwardRef(() => DatepickerComponent),
315
- multi: true
316
- }
317
- ], template: "<div [class]=\"wrapperClasses.join(' ')\">\r\n <!-- Input Field -->\r\n <div class=\"pecb-datepicker__input-wrapper\">\r\n <!-- Input -->\r\n <input\r\n #inputElement\r\n [id]=\"id\"\r\n type=\"text\"\r\n class=\"pecb-datepicker__input\"\r\n [value]=\"displayValue\"\r\n [disabled]=\"disabled\"\r\n [attr.aria-label]=\"label || placeholder\"\r\n [attr.aria-required]=\"required\"\r\n readonly\r\n (click)=\"toggleCalendar()\"\r\n (keydown)=\"onKeyDown($event)\"\r\n />\r\n\r\n <!-- Floating Label -->\r\n <label\r\n *ngIf=\"label\"\r\n [attr.for]=\"id\"\r\n class=\"pecb-datepicker__label\"\r\n >\r\n {{ label }}<span *ngIf=\"required\" class=\"pecb-datepicker__required\">*</span>\r\n </label>\r\n\r\n <!-- Clear Button (shown when has value) -->\r\n <button\r\n *ngIf=\"selectedDate && !disabled\"\r\n type=\"button\"\r\n class=\"pecb-datepicker__icon pecb-datepicker__icon--clear\"\r\n [attr.aria-label]=\"'Clear date'\"\r\n (click)=\"clearDate($event)\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M8 0C3.6 0 0 3.6 0 8C0 12.4 3.6 16 8 16C12.4 16 16 12.4 16 8C16 3.6 12.4 0 8 0ZM11.5 10.1L10.1 11.5L8 9.4L5.9 11.5L4.5 10.1L6.6 8L4.5 5.9L5.9 4.5L8 6.6L10.1 4.5L11.5 5.9L9.4 8L11.5 10.1Z\"/>\r\n </svg>\r\n </button>\r\n\r\n <!-- Right Icon (Calendar) -->\r\n <button\r\n type=\"button\"\r\n class=\"pecb-datepicker__icon pecb-datepicker__icon--right\"\r\n [disabled]=\"disabled\"\r\n [attr.aria-label]=\"'Open calendar'\"\r\n (click)=\"toggleCalendar()\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M11 2V1H10V2H6V1H5V2H2V15H14V2H11ZM13 14H3V6H13V14ZM13 5H3V3H5V4H6V3H10V4H11V3H13V5Z\"/>\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n <!-- Calendar Dropdown -->\r\n <div\r\n *ngIf=\"isCalendarOpen\"\r\n class=\"pecb-datepicker__calendar\"\r\n role=\"dialog\"\r\n aria-modal=\"false\"\r\n [attr.aria-label]=\"'Choose date'\"\r\n >\r\n <!-- Calendar Header -->\r\n <div class=\"pecb-datepicker__calendar-header\">\r\n <button\r\n type=\"button\"\r\n class=\"pecb-datepicker__nav-button\"\r\n aria-label=\"Previous month\"\r\n (click)=\"previousMonth()\"\r\n >\r\n \u00AB\r\n </button>\r\n\r\n <span class=\"pecb-datepicker__month-year\">{{ monthYearDisplay }}</span>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"pecb-datepicker__nav-button\"\r\n aria-label=\"Next month\"\r\n (click)=\"nextMonth()\"\r\n >\r\n \u00BB\r\n </button>\r\n </div>\r\n\r\n <!-- Calendar Grid -->\r\n <div class=\"pecb-datepicker__calendar-body\">\r\n <!-- Week Days -->\r\n <div class=\"pecb-datepicker__weekdays\">\r\n <div\r\n *ngFor=\"let day of weekDays\"\r\n class=\"pecb-datepicker__weekday\"\r\n >\r\n {{ day }}\r\n </div>\r\n </div>\r\n\r\n <!-- Days Grid -->\r\n <div class=\"pecb-datepicker__days\">\r\n <button\r\n *ngFor=\"let day of calendarDays\"\r\n type=\"button\"\r\n class=\"pecb-datepicker__day\"\r\n [class.pecb-datepicker__day--other-month]=\"!day.isCurrentMonth\"\r\n [class.pecb-datepicker__day--selected]=\"day.isSelected\"\r\n [class.pecb-datepicker__day--today]=\"day.isToday\"\r\n [attr.aria-label]=\"day.date.toDateString()\"\r\n [attr.aria-selected]=\"day.isSelected\"\r\n (click)=\"selectDate(day)\"\r\n >\r\n {{ day.day }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".pecb-datepicker{position:relative;display:flex;flex-direction:column;font-family:Plus Jakarta Sans,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;width:100%}.pecb-datepicker__input-wrapper{position:relative;display:flex;align-items:center}.pecb-datepicker__label{position:absolute;left:12px;top:50%;transform:translateY(-50%);font-size:14px;font-weight:400;color:#919191;background-color:transparent;padding:0 4px;pointer-events:none;z-index:1;transition:top .2s cubic-bezier(.4,0,.2,1),transform .2s cubic-bezier(.4,0,.2,1),font-size .2s cubic-bezier(.4,0,.2,1),color .2s cubic-bezier(.4,0,.2,1),background-color .2s cubic-bezier(.4,0,.2,1),font-weight .2s cubic-bezier(.4,0,.2,1)}.pecb-datepicker__required{color:#dc3545;margin-left:2px}.pecb-datepicker__input:focus~.pecb-datepicker__label,.pecb-datepicker--open .pecb-datepicker__label,.pecb-datepicker--has-value .pecb-datepicker__label{top:0;transform:translateY(-50%) scale(1);font-size:12px;color:#a11e29;background-color:#fff;font-weight:500}.pecb-datepicker--disabled .pecb-datepicker__label{color:#919191}.pecb-datepicker--disabled .pecb-datepicker__input:focus~.pecb-datepicker__label,.pecb-datepicker--disabled.pecb-datepicker--open .pecb-datepicker__label,.pecb-datepicker--disabled.pecb-datepicker--has-value .pecb-datepicker__label{background-color:#ececec}.pecb-datepicker__input{flex:1;width:100%;font-family:Plus Jakarta Sans,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-weight:400;color:#313131;background-color:#fff;border:1px solid #c2c2c2;border-radius:8px;outline:none;cursor:pointer;transition-property:border-color,box-shadow;transition-duration:.25s ease-in-out;transition-timing-function:ease-in-out}.pecb-datepicker__input::placeholder{color:#919191}.pecb-datepicker__input:hover:not(:disabled){border-color:#919191}.pecb-datepicker__input:focus{border-color:#a11e29;box-shadow:0 0 0 3px #a11e291a}.pecb-datepicker__input:disabled{background-color:#ececec;color:#919191;cursor:not-allowed;border-color:#c2c2c2}.pecb-datepicker__icon{position:absolute;display:inline-flex;align-items:center;justify-content:center;color:#616161;background:none;border:none;cursor:pointer;padding:0;transition-property:color,opacity,transform;transition-duration:.25s ease-in-out;transition-timing-function:ease-in-out}.pecb-datepicker__icon--right{right:12px}.pecb-datepicker__icon--clear{right:36px;color:#919191;opacity:0;transform:scale(.8);pointer-events:none}.pecb-datepicker__icon--clear:hover{color:#dc3545}.pecb-datepicker__icon:hover:not(:disabled){color:#313131}.pecb-datepicker__icon:disabled{color:#919191;cursor:not-allowed}.pecb-datepicker__icon svg{flex-shrink:0}.pecb-datepicker--has-value .pecb-datepicker__icon--clear{opacity:1;transform:scale(1);pointer-events:auto}.pecb-datepicker--sm .pecb-datepicker__input{padding:8px 48px 8px 12px;font-size:12px;height:32px}.pecb-datepicker--sm .pecb-datepicker__label{left:12px;font-size:12px}.pecb-datepicker--sm .pecb-datepicker__input:focus~.pecb-datepicker__label,.pecb-datepicker--sm.pecb-datepicker--open .pecb-datepicker__label,.pecb-datepicker--sm.pecb-datepicker--has-value .pecb-datepicker__label{font-size:10px}.pecb-datepicker--sm .pecb-datepicker__icon--right{right:8px}.pecb-datepicker--sm .pecb-datepicker__icon--right svg{width:14px;height:14px}.pecb-datepicker--sm .pecb-datepicker__icon--clear{right:28px}.pecb-datepicker--sm .pecb-datepicker__icon--clear svg{width:14px;height:14px}.pecb-datepicker--sm.pecb-datepicker--has-value .pecb-datepicker__input{padding-right:68px}.pecb-datepicker--md .pecb-datepicker__input{padding:12px 48px 12px 12px;font-size:14px;height:40px}.pecb-datepicker--md .pecb-datepicker__label{left:12px;font-size:14px}.pecb-datepicker--md .pecb-datepicker__input:focus~.pecb-datepicker__label,.pecb-datepicker--md.pecb-datepicker--open .pecb-datepicker__label,.pecb-datepicker--md.pecb-datepicker--has-value .pecb-datepicker__label{font-size:12px}.pecb-datepicker--md .pecb-datepicker__icon--right{right:12px}.pecb-datepicker--md .pecb-datepicker__icon--right svg{width:16px;height:16px}.pecb-datepicker--md .pecb-datepicker__icon--clear{right:36px}.pecb-datepicker--md .pecb-datepicker__icon--clear svg{width:16px;height:16px}.pecb-datepicker--md.pecb-datepicker--has-value .pecb-datepicker__input{padding-right:72px}.pecb-datepicker--lg .pecb-datepicker__input{padding:16px 64px 16px 16px;font-size:16px;height:48px}.pecb-datepicker--lg .pecb-datepicker__label{left:16px;font-size:16px}.pecb-datepicker--lg .pecb-datepicker__input:focus~.pecb-datepicker__label,.pecb-datepicker--lg.pecb-datepicker--open .pecb-datepicker__label,.pecb-datepicker--lg.pecb-datepicker--has-value .pecb-datepicker__label{font-size:13px}.pecb-datepicker--lg .pecb-datepicker__icon--right{right:16px}.pecb-datepicker--lg .pecb-datepicker__icon--right svg{width:18px;height:18px}.pecb-datepicker--lg .pecb-datepicker__icon--clear{right:44px}.pecb-datepicker--lg .pecb-datepicker__icon--clear svg{width:18px;height:18px}.pecb-datepicker--lg.pecb-datepicker--has-value .pecb-datepicker__input{padding-right:92px}.pecb-datepicker__calendar{position:absolute;top:calc(100% + 4px);left:0;z-index:1000;background-color:#fff;border:1px solid #c2c2c2;border-radius:12px;box-shadow:0 10px 15px -3px #0000001a,0 4px 6px -2px #0000000d;padding:16px;min-width:280px}.pecb-datepicker__calendar-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px;padding-bottom:12px;border-bottom:1px solid #ececec}.pecb-datepicker__month-year{font-size:14px;font-weight:500;color:#313131}.pecb-datepicker__nav-button{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;background-color:transparent;border:none;border-radius:8px;color:#616161;font-size:18px;font-weight:700;cursor:pointer;transition-property:background-color,color;transition-duration:.25s ease-in-out;transition-timing-function:ease-in-out}.pecb-datepicker__nav-button:hover{background-color:#ececec;color:#313131}.pecb-datepicker__nav-button:focus-visible{outline:2px solid #a11e29;outline-offset:2px}.pecb-datepicker__calendar-body{display:flex;flex-direction:column}.pecb-datepicker__weekdays{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;margin-bottom:8px}.pecb-datepicker__weekday{display:flex;align-items:center;justify-content:center;padding:6px;font-size:12px;font-weight:500;color:#616161;text-align:center}.pecb-datepicker__days{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}.pecb-datepicker__day{display:flex;align-items:center;justify-content:center;width:36px;height:36px;padding:0;background-color:transparent;border:none;border-radius:8px;font-size:14px;font-weight:400;color:#313131;cursor:pointer;transition-property:background-color,color;transition-duration:.25s ease-in-out;transition-timing-function:ease-in-out}.pecb-datepicker__day:hover:not(.pecb-datepicker__day--other-month):not(.pecb-datepicker__day--selected){background-color:#ececec}.pecb-datepicker__day:focus-visible{outline:2px solid #a11e29;outline-offset:2px}.pecb-datepicker__day--other-month{color:#919191;cursor:default}.pecb-datepicker__day--other-month:hover{background-color:transparent}.pecb-datepicker__day--selected{background-color:#313131;color:#fff;font-weight:500}.pecb-datepicker__day--selected:hover{background-color:#313131}.pecb-datepicker__day--today:not(.pecb-datepicker__day--selected){background-color:#fff;color:#a11e29;font-weight:500}.pecb-datepicker--disabled{opacity:.6;pointer-events:none}.pecb-datepicker--open .pecb-datepicker__input{border-color:#a11e29;box-shadow:0 0 0 3px #a11e291a}\n"] }]
318
- }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }], propDecorators: { inputElement: [{
319
- type: ViewChild,
320
- args: ['inputElement']
321
- }], id: [{
322
- type: Input
323
- }], label: [{
324
- type: Input
325
- }], placeholder: [{
326
- type: Input
327
- }], size: [{
328
- type: Input
329
- }], required: [{
330
- type: Input
331
- }], disabled: [{
332
- type: Input
333
- }], dateFormat: [{
334
- type: Input
335
- }], minDate: [{
336
- type: Input
337
- }], maxDate: [{
338
- type: Input
339
- }], dateChange: [{
340
- type: Output
341
- }], opened: [{
342
- type: Output
343
- }], closed: [{
344
- type: Output
345
- }], onDocumentClick: [{
346
- type: HostListener,
347
- args: ['document:click', ['$event']]
348
- }] } });
349
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS1jb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9kYXRlcGlja2VyL2RhdGVwaWNrZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWktY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvZGF0ZXBpY2tlci9kYXRlcGlja2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBQ1osdUJBQXVCLEVBQ3ZCLFlBQVksRUFFWixTQUFTLEVBQ1QsVUFBVSxFQUVYLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sOEJBQThCLENBQUM7OztBQVloRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQWdCSCxNQUFNLE9BQU8sbUJBQW1CO0lBOEU5QixZQUNVLFVBQXNCLEVBQ3RCLEdBQXNCO1FBRHRCLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUE3RWhDOztXQUVHO1FBQ00sT0FBRSxHQUFXLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxDQUFDO1FBT3JEOztXQUVHO1FBQ00sZ0JBQVcsR0FBRyxhQUFhLENBQUM7UUFFckM7O1dBRUc7UUFDTSxTQUFJLEdBQW1CLElBQUksQ0FBQztRQUVyQzs7V0FFRztRQUNNLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFFMUI7O1dBRUc7UUFDTSxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBRTFCOztXQUVHO1FB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QUFHLEVBQUUsb0JBQW9CLENBQUM7NEJBQ2xELEtBQUssRUFBRSxJQUFJO3lCQUNaO3FCQUNGOytHQUcwQixZQUFZO3NCQUF0QyxTQUFTO3VCQUFDLGNBQWM7Z0JBS2hCLEVBQUU7c0JBQVYsS0FBSztnQkFLRyxLQUFLO3NCQUFiLEtBQUs7Z0JBS0csV0FBVztzQkFBbkIsS0FBSztnQkFLRyxJQUFJO3NCQUFaLEtBQUs7Z0JBS0csUUFBUTtzQkFBaEIsS0FBSztnQkFLRyxRQUFRO3NCQUFoQixLQUFLO2dCQUtHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBS0csT0FBTztzQkFBZixLQUFLO2dCQUtHLE9BQU87c0JBQWYsS0FBSztnQkFLSSxVQUFVO3NCQUFuQixNQUFNO2dCQUtHLE1BQU07c0JBQWYsTUFBTTtnQkFLRyxNQUFNO3NCQUFmLE1BQU07Z0JBd05QLGVBQWU7c0JBRGQsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIElucHV0LFxyXG4gIE91dHB1dCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXHJcbiAgSG9zdExpc3RlbmVyLFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgVmlld0NoaWxkLFxyXG4gIGZvcndhcmRSZWYsXHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWZcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBnZW5lcmF0ZVVuaXF1ZUlkIH0gZnJvbSAnLi4vLi4vc2hhcmVkL3V0aWxzL2RvbS51dGlscyc7XHJcblxyXG5leHBvcnQgdHlwZSBEYXRlcGlja2VyU2l6ZSA9ICdzbScgfCAnbWQnIHwgJ2xnJztcclxuXHJcbmludGVyZmFjZSBDYWxlbmRhckRheSB7XHJcbiAgZGF0ZTogRGF0ZTtcclxuICBkYXk6IG51bWJlcjtcclxuICBpc0N1cnJlbnRNb250aDogYm9vbGVhbjtcclxuICBpc1NlbGVjdGVkOiBib29sZWFuO1xyXG4gIGlzVG9kYXk6IGJvb2xlYW47XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBIHByb2Zlc3Npb25hbCBkYXRlcGlja2VyIGNvbXBvbmVudCB3aXRoIGNhbGVuZGFyIGRyb3Bkb3duLlxyXG4gKiBGdWxseSBhY2Nlc3NpYmxlIHdpdGggV0NBRyAyLjEgQUEgY29tcGxpYW5jZSBhbmQgcmVhY3RpdmUgZm9ybXMgc3VwcG9ydC5cclxuICpcclxuICogQGV4YW1wbGVcclxuICogYGBgaHRtbFxyXG4gKiA8cGVjYi1kYXRlcGlja2VyXHJcbiAqICAgbGFiZWw9XCJEYXRlXCJcclxuICogICBwbGFjZWhvbGRlcj1cIkNob29zZSBEYXRlXCJcclxuICogICBbKG5nTW9kZWwpXT1cInNlbGVjdGVkRGF0ZVwiXHJcbiAqID48L3BlY2ItZGF0ZXBpY2tlcj5cclxuICpcclxuICogPCEtLSBXaXRoIGN1c3RvbSBjb25maWd1cmF0aW9uIC0tPlxyXG4gKiA8cGVjYi1kYXRlcGlja2VyXHJcbiAqICAgbGFiZWw9XCJCaXJ0aCBEYXRlXCJcclxuICogICBbcmVxdWlyZWRdPVwidHJ1ZVwiXHJcbiAqICAgc2l6ZT1cImxnXCJcclxuICogICAoZGF0ZUNoYW5nZSk9XCJoYW5kbGVEYXRlQ2hhbmdlKCRldmVudClcIlxyXG4gKiA+PC9wZWNiLWRhdGVwaWNrZXI+XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAcHVibGljQXBpXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3BlY2ItZGF0ZXBpY2tlcicsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcclxuICB0ZW1wbGF0ZVVybDogJy4vZGF0ZXBpY2tlci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vZGF0ZXBpY2tlci5jb21wb25lbnQuc2NzcyddLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAge1xyXG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRGF0ZXBpY2tlckNvbXBvbmVudCksXHJcbiAgICAgIG11bHRpOiB0cnVlXHJcbiAgICB9XHJcbiAgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRGF0ZXBpY2tlckNvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcclxuICBAVmlld0NoaWxkKCdpbnB1dEVsZW1lbnQnKSBpbnB1dEVsZW1lbnQ/OiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xyXG5cclxuICAvKipcclxuICAgKiBVbmlxdWUgSUQgZm9yIHRoZSBkYXRlcGlja2VyIGVsZW1lbnRcclxuICAgKi9cclxuICBASW5wdXQoKSBpZDogc3RyaW5nID0gZ2VuZXJhdGVVbmlxdWVJZCgnZGF0ZXBpY2tlcicpO1xyXG5cclxuICAvKipcclxuICAgKiBMYWJlbCB0ZXh0IHRvIGRpc3BsYXkgYWJvdmUgdGhlIGlucHV0XHJcbiAgICovXHJcbiAgQElucHV0KCkgbGFiZWw/OiBzdHJpbmc7XHJcblxyXG4gIC8qKlxyXG4gICAqIFBsYWNlaG9sZGVyIHRleHQgZm9yIHRoZSBpbnB1dFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyID0gJ0Nob29zZSBEYXRlJztcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIHNpemUgb2YgdGhlIGRhdGVwaWNrZXJcclxuICAgKi9cclxuICBASW5wdXQoKSBzaXplOiBEYXRlcGlja2VyU2l6ZSA9ICdtZCc7XHJcblxyXG4gIC8qKlxyXG4gICAqIFdoZXRoZXIgdGhlIGZpZWxkIGlzIHJlcXVpcmVkXHJcbiAgICovXHJcbiAgQElucHV0KCkgcmVxdWlyZWQgPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciB0aGUgZGF0ZXBpY2tlciBpcyBkaXNhYmxlZFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIERhdGUgZm9ybWF0IGZvciBkaXNwbGF5IChkZWZhdWx0OiBNTS9ERC9ZWVlZKVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGRhdGVGb3JtYXQgPSAnTU0vREQvWVlZWSc7XHJcblxyXG4gIC8qKlxyXG4gICAqIE1pbmltdW0gc2VsZWN0YWJsZSBkYXRlXHJcbiAgICovXHJcbiAgQElucHV0KCkgbWluRGF0ZT86IERhdGU7XHJcblxyXG4gIC8qKlxyXG4gICAqIE1heGltdW0gc2VsZWN0YWJsZSBkYXRlXHJcbiAgICovXHJcbiAgQElucHV0KCkgbWF4RGF0ZT86IERhdGU7XHJcblxyXG4gIC8qKlxyXG4gICAqIEV2ZW50IGVtaXR0ZWQgd2hlbiBkYXRlIGlzIHNlbGVjdGVkXHJcbiAgICovXHJcbiAgQE91dHB1dCgpIGRhdGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPERhdGUgfCBudWxsPigpO1xyXG5cclxuICAvKipcclxuICAgKiBFdmVudCBlbWl0dGVkIHdoZW4gY2FsZW5kYXIgaXMgb3BlbmVkXHJcbiAgICovXHJcbiAgQE91dHB1dCgpIG9wZW5lZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgLyoqXHJcbiAgICogRXZlbnQgZW1pdHRlZCB3aGVuIGNhbGVuZGFyIGlzIGNsb3NlZFxyXG4gICAqL1xyXG4gIEBPdXRwdXQoKSBjbG9zZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcblxyXG4gIC8vIEludGVybmFsIHN0YXRlXHJcbiAgc2VsZWN0ZWREYXRlOiBEYXRlIHwgbnVsbCA9IG51bGw7XHJcbiAgaXNDYWxlbmRhck9wZW4gPSBmYWxzZTtcclxuICBjdXJyZW50TW9udGg6IERhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gIGNhbGVuZGFyRGF5czogQ2FsZW5kYXJEYXlbXSA9IFtdO1xyXG4gIHdlZWtEYXlzID0gWydTdScsICdNbycsICdUdScsICdXZScsICdUaCcsICdGcicsICdTYSddO1xyXG4gIG1vbnRoTmFtZXMgPSBbXHJcbiAgICAnSmFudWFyeScsICdGZWJydWFyeScsICdNYXJjaCcsICdBcHJpbCcsICdNYXknLCAnSnVuZScsXHJcbiAgICAnSnVseScsICdBdWd1c3QnLCAnU2VwdGVtYmVyJywgJ09jdG9iZXInLCAnTm92ZW1iZXInLCAnRGVjZW1iZXInXHJcbiAgXTtcclxuXHJcbiAgLy8gQ29udHJvbFZhbHVlQWNjZXNzb3JcclxuICBwcml2YXRlIG9uQ2hhbmdlOiAodmFsdWU6IERhdGUgfCBudWxsKSA9PiB2b2lkID0gKCkgPT4ge307XHJcbiAgcHJpdmF0ZSBvblRvdWNoZWQ6ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXHJcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWZcclxuICApIHtcclxuICAgIHRoaXMuZ2VuZXJhdGVDYWxlbmRhcigpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IENTUyBjbGFzc2VzIGZvciB0aGUgZGF0ZXBpY2tlciB3cmFwcGVyXHJcbiAgICovXHJcbiAgZ2V0IHdyYXBwZXJDbGFzc2VzKCk6IHN0cmluZ1tdIHtcclxuICAgIHJldHVybiBbXHJcbiAgICAgICdwZWNiLWRhdGVwaWNrZXInLFxyXG4gICAgICBgcGVjYi1kYXRlcGlja2VyLS0ke3RoaXMuc2l6ZX1gLFxyXG4gICAgICB0aGlzLmRpc2FibGVkID8gJ3BlY2ItZGF0ZXBpY2tlci0tZGlzYWJsZWQnIDogJycsXHJcbiAgICAgIHRoaXMuaXNDYWxlbmRhck9wZW4gPyAncGVjYi1kYXRlcGlja2VyLS1vcGVuJyA6ICcnLFxyXG4gICAgICB0aGlzLnNlbGVjdGVkRGF0ZSA/ICdwZWNiLWRhdGVwaWNrZXItLWhhcy12YWx1ZScgOiAnJ1xyXG4gICAgXS5maWx0ZXIoQm9vbGVhbik7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgZm9ybWF0dGVkIGRpc3BsYXkgdmFsdWVcclxuICAgKi9cclxuICBnZXQgZGlzcGxheVZhbHVlKCk6IHN0cmluZyB7XHJcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWREYXRlKSByZXR1cm4gJyc7XHJcbiAgICByZXR1cm4gdGhpcy5mb3JtYXREYXRlKHRoaXMuc2VsZWN0ZWREYXRlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBjdXJyZW50IG1vbnRoIGFuZCB5ZWFyIGRpc3BsYXlcclxuICAgKi9cclxuICBnZXQgbW9udGhZZWFyRGlzcGxheSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGAke3RoaXMubW9udGhOYW1lc1t0aGlzLmN1cnJlbnRNb250aC5nZXRNb250aCgpXX0gJHt0aGlzLmN1cnJlbnRNb250aC5nZXRGdWxsWWVhcigpfWA7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUb2dnbGUgY2FsZW5kYXIgZHJvcGRvd25cclxuICAgKi9cclxuICB0b2dnbGVDYWxlbmRhcigpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmRpc2FibGVkKSByZXR1cm47XHJcblxyXG4gICAgdGhpcy5pc0NhbGVuZGFyT3BlbiA9ICF0aGlzLmlzQ2FsZW5kYXJPcGVuO1xyXG5cclxuICAgIGlmICh0aGlzLmlzQ2FsZW5kYXJPcGVuKSB7XHJcbiAgICAgIHRoaXMub3BlbmVkLmVtaXQoKTtcclxuICAgICAgLy8gU2V0IGN1cnJlbnQgbW9udGggdG8gc2VsZWN0ZWQgZGF0ZSdzIG1vbnRoIG9yIGN1cnJlbnQgbW9udGhcclxuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWREYXRlKSB7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50TW9udGggPSBuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZS5nZXRGdWxsWWVhcigpLCB0aGlzLnNlbGVjdGVkRGF0ZS5nZXRNb250aCgpLCAxKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXIoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY2xvc2VkLmVtaXQoKTtcclxuICAgIH1cclxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xvc2UgY2FsZW5kYXJcclxuICAgKi9cclxuICBjbG9zZUNhbGVuZGFyKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuaXNDYWxlbmRhck9wZW4pIHtcclxuICAgICAgdGhpcy5pc0NhbGVuZGFyT3BlbiA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmNsb3NlZC5lbWl0KCk7XHJcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTmF2aWdhdGUgdG8gcHJldmlvdXMgbW9udGhcclxuICAgKi9cclxuICBwcmV2aW91c01vbnRoKCk6IHZvaWQge1xyXG4gICAgdGhpcy5jdXJyZW50TW9udGggPSBuZXcgRGF0ZShcclxuICAgICAgdGhpcy5jdXJyZW50TW9udGguZ2V0RnVsbFllYXIoKSxcclxuICAgICAgdGhpcy5jdXJyZW50TW9udGguZ2V0TW9udGgoKSAtIDEsXHJcbiAgICAgIDFcclxuICAgICk7XHJcbiAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXIoKTtcclxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTmF2aWdhdGUgdG8gbmV4dCBtb250aFxyXG4gICAqL1xyXG4gIG5leHRNb250aCgpOiB2b2lkIHtcclxuICAgIHRoaXMuY3VycmVudE1vbnRoID0gbmV3IERhdGUoXHJcbiAgICAgIHRoaXMuY3VycmVudE1vbnRoLmdldEZ1bGxZZWFyKCksXHJcbiAgICAgIHRoaXMuY3VycmVudE1vbnRoLmdldE1vbnRoKCkgKyAxLFxyXG4gICAgICAxXHJcbiAgICApO1xyXG4gICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFyKCk7XHJcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNlbGVjdCBhIGRhdGVcclxuICAgKi9cclxuICBzZWxlY3REYXRlKGRheTogQ2FsZW5kYXJEYXkpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmRpc2FibGVkKSByZXR1cm47XHJcbiAgICBpZiAoIWRheS5pc0N1cnJlbnRNb250aCkgcmV0dXJuO1xyXG4gICAgaWYgKHRoaXMubWluRGF0ZSAmJiBkYXkuZGF0ZSA8IHRoaXMubWluRGF0ZSkgcmV0dXJuO1xyXG4gICAgaWYgKHRoaXMubWF4RGF0ZSAmJiBkYXkuZGF0ZSA+IHRoaXMubWF4RGF0ZSkgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gZGF5LmRhdGU7XHJcbiAgICB0aGlzLm9uQ2hhbmdlKHRoaXMuc2VsZWN0ZWREYXRlKTtcclxuICAgIHRoaXMub25Ub3VjaGVkKCk7XHJcbiAgICB0aGlzLmRhdGVDaGFuZ2UuZW1pdCh0aGlzLnNlbGVjdGVkRGF0ZSk7XHJcbiAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXIoKTtcclxuICAgIHRoaXMuY2xvc2VDYWxlbmRhcigpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2VuZXJhdGUgY2FsZW5kYXIgZGF5c1xyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2VuZXJhdGVDYWxlbmRhcigpOiB2b2lkIHtcclxuICAgIGNvbnN0IHllYXIgPSB0aGlzLmN1cnJlbnRNb250aC5nZXRGdWxsWWVhcigpO1xyXG4gICAgY29uc3QgbW9udGggPSB0aGlzLmN1cnJlbnRNb250aC5nZXRNb250aCgpO1xyXG5cclxuICAgIC8vIEZpcnN0IGRheSBvZiB0aGUgbW9udGhcclxuICAgIGNvbnN0IGZpcnN0RGF5ID0gbmV3IERhdGUoeWVhciwgbW9udGgsIDEpO1xyXG4gICAgY29uc3Qgc3RhcnRpbmdEYXlPZldlZWsgPSBmaXJzdERheS5nZXREYXkoKTtcclxuXHJcbiAgICAvLyBMYXN0IGRheSBvZiB0aGUgbW9udGhcclxuICAgIGNvbnN0IGxhc3REYXkgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCArIDEsIDApO1xyXG4gICAgY29uc3QgZGF5c0luTW9udGggPSBsYXN0RGF5LmdldERhdGUoKTtcclxuXHJcbiAgICAvLyBQcmV2aW91cyBtb250aFxyXG4gICAgY29uc3QgcHJldk1vbnRoID0gbmV3IERhdGUoeWVhciwgbW9udGgsIDApO1xyXG4gICAgY29uc3QgZGF5c0luUHJldk1vbnRoID0gcHJldk1vbnRoLmdldERhdGUoKTtcclxuXHJcbiAgICBjb25zdCBkYXlzOiBDYWxlbmRhckRheVtdID0gW107XHJcbiAgICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKCk7XHJcbiAgICB0b2RheS5zZXRIb3VycygwLCAwLCAwLCAwKTtcclxuXHJcbiAgICAvLyBQcmV2aW91cyBtb250aCBkYXlzXHJcbiAgICBmb3IgKGxldCBpID0gc3RhcnRpbmdEYXlPZldlZWsgLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoeWVhciwgbW9udGggLSAxLCBkYXlzSW5QcmV2TW9udGggLSBpKTtcclxuICAgICAgZGF5cy5wdXNoKHtcclxuICAgICAgICBkYXRlLFxyXG4gICAgICAgIGRheTogZGF5c0luUHJldk1vbnRoIC0gaSxcclxuICAgICAgICBpc0N1cnJlbnRNb250aDogZmFsc2UsXHJcbiAgICAgICAgaXNTZWxlY3RlZDogZmFsc2UsXHJcbiAgICAgICAgaXNUb2RheTogZmFsc2VcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ3VycmVudCBtb250aCBkYXlzXHJcbiAgICBmb3IgKGxldCBkYXkgPSAxOyBkYXkgPD0gZGF5c0luTW9udGg7IGRheSsrKSB7XHJcbiAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgZGF5KTtcclxuICAgICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcclxuXHJcbiAgICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGVkRGF0ZSA/XHJcbiAgICAgICAgZGF0ZS5nZXRUaW1lKCkgPT09IG5ldyBEYXRlKHRoaXMuc2VsZWN0ZWREYXRlKS5zZXRIb3VycygwLCAwLCAwLCAwKSA6XHJcbiAgICAgICAgZmFsc2U7XHJcblxyXG4gICAgICBjb25zdCBpc1RvZGF5ID0gZGF0ZS5nZXRUaW1lKCkgPT09IHRvZGF5LmdldFRpbWUoKTtcclxuXHJcbiAgICAgIGRheXMucHVzaCh7XHJcbiAgICAgICAgZGF0ZSxcclxuICAgICAgICBkYXksXHJcbiAgICAgICAgaXNDdXJyZW50TW9udGg6IHRydWUsXHJcbiAgICAgICAgaXNTZWxlY3RlZCxcclxuICAgICAgICBpc1RvZGF5XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIE5leHQgbW9udGggZGF5c1xyXG4gICAgY29uc3QgcmVtYWluaW5nRGF5cyA9IDQyIC0gZGF5cy5sZW5ndGg7IC8vIDYgcm93cyAqIDcgZGF5c1xyXG4gICAgZm9yIChsZXQgZGF5ID0gMTsgZGF5IDw9IHJlbWFpbmluZ0RheXM7IGRheSsrKSB7XHJcbiAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCArIDEsIGRheSk7XHJcbiAgICAgIGRheXMucHVzaCh7XHJcbiAgICAgICAgZGF0ZSxcclxuICAgICAgICBkYXksXHJcbiAgICAgICAgaXNDdXJyZW50TW9udGg6IGZhbHNlLFxyXG4gICAgICAgIGlzU2VsZWN0ZWQ6IGZhbHNlLFxyXG4gICAgICAgIGlzVG9kYXk6IGZhbHNlXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY2FsZW5kYXJEYXlzID0gZGF5cztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZvcm1hdCBkYXRlIGZvciBkaXNwbGF5XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBmb3JtYXREYXRlKGRhdGU6IERhdGUpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgbW9udGggPSBTdHJpbmcoZGF0ZS5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoMiwgJzAnKTtcclxuICAgIGNvbnN0IGRheSA9IFN0cmluZyhkYXRlLmdldERhdGUoKSkucGFkU3RhcnQoMiwgJzAnKTtcclxuICAgIGNvbnN0IHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuZGF0ZUZvcm1hdFxyXG4gICAgICAucmVwbGFjZSgnTU0nLCBtb250aClcclxuICAgICAgLnJlcGxhY2UoJ0REJywgZGF5KVxyXG4gICAgICAucmVwbGFjZSgnWVlZWScsIFN0cmluZyh5ZWFyKSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBMaXN0ZW4gZm9yIGNsaWNrcyBvdXRzaWRlIHRvIGNsb3NlIGNhbGVuZGFyXHJcbiAgICovXHJcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snLCBbJyRldmVudCddKVxyXG4gIG9uRG9jdW1lbnRDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpKSB7XHJcbiAgICAgIHRoaXMuY2xvc2VDYWxlbmRhcigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlIGtleWJvYXJkIG5hdmlnYXRpb25cclxuICAgKi9cclxuICBvbktleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicgfHwgZXZlbnQua2V5ID09PSAnICcpIHtcclxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgdGhpcy50b2dnbGVDYWxlbmRhcigpO1xyXG4gICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdFc2NhcGUnKSB7XHJcbiAgICAgIHRoaXMuY2xvc2VDYWxlbmRhcigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xlYXIgc2VsZWN0ZWQgZGF0ZVxyXG4gICAqL1xyXG4gIGNsZWFyRGF0ZShldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gbnVsbDtcclxuICAgIHRoaXMub25DaGFuZ2UobnVsbCk7XHJcbiAgICB0aGlzLm9uVG91Y2hlZCgpO1xyXG4gICAgdGhpcy5kYXRlQ2hhbmdlLmVtaXQobnVsbCk7XHJcbiAgICB0aGlzLmdlbmVyYXRlQ2FsZW5kYXIoKTtcclxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgLy8gQ29udHJvbFZhbHVlQWNjZXNzb3IgaW1wbGVtZW50YXRpb25cclxuICB3cml0ZVZhbHVlKHZhbHVlOiBEYXRlIHwgbnVsbCk6IHZvaWQge1xyXG4gICAgdGhpcy5zZWxlY3RlZERhdGUgPSB2YWx1ZTtcclxuICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICB0aGlzLmN1cnJlbnRNb250aCA9IG5ldyBEYXRlKHZhbHVlLmdldEZ1bGxZZWFyKCksIHZhbHVlLmdldE1vbnRoKCksIDEpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5nZW5lcmF0ZUNhbGVuZGFyKCk7XHJcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICh2YWx1ZTogRGF0ZSB8IG51bGwpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xyXG4gIH1cclxuXHJcbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcclxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IFtjbGFzc109XCJ3cmFwcGVyQ2xhc3Nlcy5qb2luKCcgJylcIj5cclxuICA8IS0tIElucHV0IEZpZWxkIC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJwZWNiLWRhdGVwaWNrZXJfX2lucHV0LXdyYXBwZXJcIj5cclxuICAgIDwhLS0gSW5wdXQgLS0+XHJcbiAgICA8aW5wdXRcclxuICAgICAgI2lucHV0RWxlbWVudFxyXG4gICAgICBbaWRdPVwiaWRcIlxyXG4gICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgIGNsYXNzPVwicGVjYi1kYXRlcGlja2VyX19pbnB1dFwiXHJcbiAgICAgIFt2YWx1ZV09XCJkaXNwbGF5VmFsdWVcIlxyXG4gICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImxhYmVsIHx8IHBsYWNlaG9sZGVyXCJcclxuICAgICAgW2F0dHIuYXJpYS1yZXF1aXJlZF09XCJyZXF1aXJlZFwiXHJcbiAgICAgIHJlYWRvbmx5XHJcbiAgICAgIChjbGljayk9XCJ0b2dnbGVDYWxlbmRhcigpXCJcclxuICAgICAgKGtleWRvd24pPVwib25LZXlEb3duKCRldmVudClcIlxyXG4gICAgLz5cclxuXHJcbiAgICA8IS0tIEZsb2F0aW5nIExhYmVsIC0tPlxyXG4gICAgPGxhYmVsXHJcbiAgICAgICpuZ0lmPVwibGFiZWxcIlxyXG4gICAgICBbYXR0ci5mb3JdPVwiaWRcIlxyXG4gICAgICBjbGFzcz1cInBlY2ItZGF0ZXBpY2tlcl9fbGFiZWxcIlxyXG4gICAgPlxyXG4gICAgICB7eyBsYWJlbCB9fTxzcGFuICpuZ0lmPVwicmVxdWlyZWRcIiBjbGFzcz1cInBlY2ItZGF0ZXBpY2tlcl9fcmVxdWlyZWRcIj4qPC9zcGFuPlxyXG4gICAgPC9sYWJlbD5cclxuXHJcbiAgICA8IS0tIENsZWFyIEJ1dHRvbiAoc2hvd24gd2hlbiBoYXMgdmFsdWUpIC0tPlxyXG4gICAgPGJ1dHRvblxyXG4gICAgICAqbmdJZj1cInNlbGVjdGVkRGF0ZSAmJiAhZGlzYWJsZWRcIlxyXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgY2xhc3M9XCJwZWNiLWRhdGVwaWNrZXJfX2ljb24gcGVjYi1kYXRlcGlja2VyX19pY29uLS1jbGVhclwiXHJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0NsZWFyIGRhdGUnXCJcclxuICAgICAgKGNsaWNrKT1cImNsZWFyRGF0ZSgkZXZlbnQpXCJcclxuICAgID5cclxuICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiPlxyXG4gICAgICAgIDxwYXRoIGQ9XCJNOCAwQzMuNiAwIDAgMy42IDAgOEMwIDEyLjQgMy42IDE2IDggMTZDMTIuNCAxNiAxNiAxMi40IDE2IDhDMTYgMy42IDEyLjQgMCA4IDBaTTExLjUgMTAuMUwxMC4xIDExLjVMOCA5LjRMNS45IDExLjVMNC41IDEwLjFMNi42IDhMNC41IDUuOUw1LjkgNC41TDggNi42TDEwLjEgNC41TDExLjUgNS45TDkuNCA4TDExLjUgMTAuMVpcIi8+XHJcbiAgICAgIDwvc3ZnPlxyXG4gICAgPC9idXR0b24+XHJcblxyXG4gICAgPCEtLSBSaWdodCBJY29uIChDYWxlbmRhcikgLS0+XHJcbiAgICA8YnV0dG9uXHJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICBjbGFzcz1cInBlY2ItZGF0ZXBpY2tlcl9faWNvbiBwZWNiLWRhdGVwaWNrZXJfX2ljb24tLXJpZ2h0XCJcclxuICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcclxuICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInT3BlbiBjYWxlbmRhcidcIlxyXG4gICAgICAoY2xpY2spPVwidG9nZ2xlQ2FsZW5kYXIoKVwiXHJcbiAgICA+XHJcbiAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIj5cclxuICAgICAgICA8cGF0aCBkPVwiTTExIDJWMUgxMFYySDZWMUg1VjJIMlYxNUgxNFYySDExWk0xMyAxNEgzVjZIMTNWMTRaTTEzIDVIM1YzSDVWNEg2VjNIMTBWNEgxMVYzSDEzVjVaXCIvPlxyXG4gICAgICA8L3N2Zz5cclxuICAgIDwvYnV0dG9uPlxyXG4gIDwvZGl2PlxyXG5cclxuICA8IS0tIENhbGVuZGFyIERyb3Bkb3duIC0tPlxyXG4gIDxkaXZcclxuICAgICpuZ0lmPVwiaXNDYWxlbmRhck9wZW5cIlxyXG4gICAgY2xhc3M9XCJwZWNiLWRhdGVwaWNrZXJfX2NhbGVuZGFyXCJcclxuICAgIHJvbGU9XCJkaWFsb2dcIlxyXG4gICAgYXJpYS1tb2RhbD1cImZhbHNlXCJcclxuICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0Nob29zZSBkYXRlJ1wiXHJcbiAgPlxyXG4gICAgPCEtLSBDYWxlbmRhciBIZWFkZXIgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwicGVjYi1kYXRlcGlja2VyX19jYWxlbmRhci1oZWFkZXJcIj5cclxuICAgICAgPGJ1dHRvblxyXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgIGNsYXNzPVwicGVjYi1kYXRlcGlja2VyX19uYXYtYnV0dG9uXCJcclxuICAgICAgICBhcmlhLWxhYmVsPVwiUHJldmlvdXMgbW9udGhcIlxyXG4gICAgICAgIChjbGljayk9XCJwcmV2aW91c01vbnRoKClcIlxyXG4gICAgICA+XHJcbiAgICAgICAgwqtcclxuICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICA8c3BhbiBjbGFzcz1cInBlY2ItZGF0ZXBpY2tlcl9fbW9udGgteWVhclwiPnt7IG1vbnRoWWVhckRpc3BsYXkgfX08L3NwYW4+XHJcblxyXG4gICAgICA8YnV0dG9uXHJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgY2xhc3M9XCJwZWNiLWRhdGVwaWNrZXJfX25hdi1idXR0b25cIlxyXG4gICAgICAgIGFyaWEtbGFiZWw9XCJOZXh0IG1vbnRoXCJcclxuICAgICAgICAoY2xpY2spPVwibmV4dE1vbnRoKClcIlxyXG4gICAgICA+XHJcbiAgICAgICAgwrtcclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIENhbGVuZGFyIEdyaWQgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwicGVjYi1kYXRlcGlja2VyX19jYWxlbmRhci1ib2R5XCI+XHJcbiAgICAgIDwhLS0gV2VlayBEYXlzIC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicGVjYi1kYXRlcGlja2VyX193ZWVrZGF5c1wiPlxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgICpuZ0Zvcj1cImxldCBkYXkgb2Ygd2Vla0RheXNcIlxyXG4gICAgICAgICAgY2xhc3M9XCJwZWNiLWRhdGVwaWNrZXJfX3dlZWtkYXlcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIHt7IGRheSB9fVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDwhLS0gRGF5cyBHcmlkIC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicGVjYi1kYXRlcGlja2VyX19kYXlzXCI+XHJcbiAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgKm5nRm9yPVwibGV0IGRheSBvZiBjYWxlbmRhckRheXNcIlxyXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICBjbGFzcz1cInBlY2ItZGF0ZXBpY2tlcl9fZGF5XCJcclxuICAgICAgICAgIFtjbGFzcy5wZWNiLWRhdGVwaWNrZXJfX2RheS0tb3RoZXItbW9udGhdPVwiIWRheS5pc0N1cnJlbnRNb250aFwiXHJcbiAgICAgICAgICBbY2xhc3MucGVjYi1kYXRlcGlja2VyX19kYXktLXNlbGVjdGVkXT1cImRheS5pc1NlbGVjdGVkXCJcclxuICAgICAgICAgIFtjbGFzcy5wZWNiLWRhdGVwaWNrZXJfX2RheS0tdG9kYXldPVwiZGF5LmlzVG9kYXlcIlxyXG4gICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJkYXkuZGF0ZS50b0RhdGVTdHJpbmcoKVwiXHJcbiAgICAgICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cImRheS5pc1NlbGVjdGVkXCJcclxuICAgICAgICAgIChjbGljayk9XCJzZWxlY3REYXRlKGRheSlcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIHt7IGRheS5kYXkgfX1cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==