@pecb-ui/components 1.1.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.
Files changed (56) hide show
  1. package/README.md +556 -0
  2. package/esm2022/lib/components/button/button.component.mjs +171 -0
  3. package/esm2022/lib/components/card/card.component.mjs +182 -0
  4. package/esm2022/lib/components/checkbox/checkbox.component.mjs +126 -0
  5. package/esm2022/lib/components/datepicker/datepicker.component.mjs +349 -0
  6. package/esm2022/lib/components/dropdown/dropdown.component.mjs +329 -0
  7. package/esm2022/lib/components/input/input.component.mjs +321 -0
  8. package/esm2022/lib/components/pagination/pagination.component.mjs +197 -0
  9. package/esm2022/lib/components/radio/radio.component.mjs +147 -0
  10. package/esm2022/lib/components/right-modal/right-modal.component.mjs +234 -0
  11. package/esm2022/lib/components/sidebar/sidebar.component.mjs +155 -0
  12. package/esm2022/lib/components/status/status.component.mjs +50 -0
  13. package/esm2022/lib/components/tab/tab.component.mjs +151 -0
  14. package/esm2022/lib/components/table/table.component.mjs +503 -0
  15. package/esm2022/lib/components/toggle/toggle.component.mjs +126 -0
  16. package/esm2022/lib/pecb-components.module.mjs +118 -0
  17. package/esm2022/lib/services/loading.service.mjs +182 -0
  18. package/esm2022/lib/services/notification.service.mjs +144 -0
  19. package/esm2022/lib/services/theme.service.mjs +232 -0
  20. package/esm2022/lib/shared/interfaces/component.interfaces.mjs +2 -0
  21. package/esm2022/lib/shared/types/common.types.mjs +6 -0
  22. package/esm2022/lib/shared/utils/accessibility.utils.mjs +223 -0
  23. package/esm2022/lib/shared/utils/dom.utils.mjs +240 -0
  24. package/esm2022/lib/shared/utils/error.utils.mjs +277 -0
  25. package/esm2022/lib/shared/utils/string.utils.mjs +204 -0
  26. package/esm2022/pecb-ui-components.mjs +5 -0
  27. package/esm2022/public-api.mjs +53 -0
  28. package/fesm2022/pecb-ui-components.mjs +4587 -0
  29. package/fesm2022/pecb-ui-components.mjs.map +1 -0
  30. package/index.d.ts +5 -0
  31. package/lib/components/button/button.component.d.ts +130 -0
  32. package/lib/components/card/card.component.d.ts +140 -0
  33. package/lib/components/checkbox/checkbox.component.d.ts +74 -0
  34. package/lib/components/datepicker/datepicker.component.d.ts +155 -0
  35. package/lib/components/dropdown/dropdown.component.d.ts +144 -0
  36. package/lib/components/input/input.component.d.ts +215 -0
  37. package/lib/components/pagination/pagination.component.d.ts +53 -0
  38. package/lib/components/radio/radio.component.d.ts +93 -0
  39. package/lib/components/right-modal/right-modal.component.d.ts +137 -0
  40. package/lib/components/sidebar/sidebar.component.d.ts +97 -0
  41. package/lib/components/status/status.component.d.ts +19 -0
  42. package/lib/components/tab/tab.component.d.ts +102 -0
  43. package/lib/components/table/table.component.d.ts +403 -0
  44. package/lib/components/toggle/toggle.component.d.ts +74 -0
  45. package/lib/pecb-components.module.d.ts +37 -0
  46. package/lib/services/loading.service.d.ts +129 -0
  47. package/lib/services/notification.service.d.ts +136 -0
  48. package/lib/services/theme.service.d.ts +142 -0
  49. package/lib/shared/interfaces/component.interfaces.d.ts +283 -0
  50. package/lib/shared/types/common.types.d.ts +86 -0
  51. package/lib/shared/utils/accessibility.utils.d.ts +167 -0
  52. package/lib/shared/utils/dom.utils.d.ts +108 -0
  53. package/lib/shared/utils/error.utils.d.ts +191 -0
  54. package/lib/shared/utils/string.utils.d.ts +144 -0
  55. package/package.json +61 -0
  56. package/public-api.d.ts +24 -0
@@ -0,0 +1,197 @@
1
+ import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, HostListener } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@angular/common";
5
+ export class PaginationComponent {
6
+ constructor(elementRef) {
7
+ this.elementRef = elementRef;
8
+ this.totalItems = 0;
9
+ this.pageSize = 10;
10
+ this.currentPage = 1;
11
+ this.pageSizeOptions = [10, 25, 50, 75];
12
+ this.size = 'md';
13
+ this.variant = 'full';
14
+ this.showPageSizeSelector = true;
15
+ this.showItemsInfo = true;
16
+ this.maxVisiblePages = 3;
17
+ this.disabled = false;
18
+ this.ariaLabel = 'Pagination';
19
+ this.pageChange = new EventEmitter();
20
+ this.pageSizeChange = new EventEmitter();
21
+ this.totalPages = 0;
22
+ this.visiblePages = [];
23
+ this.isDropdownOpen = false;
24
+ }
25
+ onDocumentClick(event) {
26
+ if (this.isDropdownOpen && !this.elementRef.nativeElement.contains(event.target)) {
27
+ this.isDropdownOpen = false;
28
+ }
29
+ }
30
+ ngOnChanges(changes) {
31
+ if (changes['totalItems'] || changes['pageSize'] || changes['currentPage']) {
32
+ this.calculateTotalPages();
33
+ this.updateVisiblePages();
34
+ }
35
+ }
36
+ get containerClasses() {
37
+ return [
38
+ 'pecb-pagination',
39
+ `pecb-pagination--${this.size}`,
40
+ `pecb-pagination--${this.variant}`,
41
+ this.disabled ? 'pecb-pagination--disabled' : ''
42
+ ].filter(Boolean);
43
+ }
44
+ get showPages() {
45
+ return this.variant === 'full' || this.variant === 'compact';
46
+ }
47
+ get showPageSize() {
48
+ return this.variant === 'full' && this.showPageSizeSelector;
49
+ }
50
+ get itemsInfoText() {
51
+ if (this.variant === 'minimal' || this.variant === 'centered') {
52
+ return `Showing ${this.startIndex}-${this.endIndex} of ${this.totalItems}`;
53
+ }
54
+ return `${this.startIndex}-${this.endIndex} of ${this.totalItems} items`;
55
+ }
56
+ get startIndex() {
57
+ if (this.totalItems === 0)
58
+ return 0;
59
+ return (this.currentPage - 1) * this.pageSize + 1;
60
+ }
61
+ get endIndex() {
62
+ return Math.min(this.currentPage * this.pageSize, this.totalItems);
63
+ }
64
+ get canGoPrevious() {
65
+ return this.currentPage > 1 && !this.disabled;
66
+ }
67
+ get canGoNext() {
68
+ return this.currentPage < this.totalPages && !this.disabled;
69
+ }
70
+ calculateTotalPages() {
71
+ this.totalPages = Math.ceil(this.totalItems / this.pageSize);
72
+ if (this.currentPage > this.totalPages && this.totalPages > 0) {
73
+ this.goToPage(this.totalPages);
74
+ }
75
+ }
76
+ updateVisiblePages() {
77
+ const pages = [];
78
+ if (this.totalPages <= this.maxVisiblePages + 2) {
79
+ for (let i = 1; i <= this.totalPages; i++) {
80
+ pages.push(i);
81
+ }
82
+ }
83
+ else {
84
+ pages.push(1);
85
+ if (this.currentPage <= this.maxVisiblePages) {
86
+ for (let i = 2; i <= this.maxVisiblePages + 1; i++) {
87
+ pages.push(i);
88
+ }
89
+ pages.push('...');
90
+ pages.push(this.totalPages);
91
+ }
92
+ else if (this.currentPage >= this.totalPages - this.maxVisiblePages + 1) {
93
+ pages.push('...');
94
+ for (let i = this.totalPages - this.maxVisiblePages; i <= this.totalPages; i++) {
95
+ pages.push(i);
96
+ }
97
+ }
98
+ else {
99
+ pages.push('...');
100
+ for (let i = this.currentPage - 1; i <= this.currentPage + 1; i++) {
101
+ pages.push(i);
102
+ }
103
+ pages.push('...');
104
+ pages.push(this.totalPages);
105
+ }
106
+ }
107
+ this.visiblePages = pages;
108
+ }
109
+ goToPage(page) {
110
+ if (this.disabled || page < 1 || page > this.totalPages || page === this.currentPage) {
111
+ return;
112
+ }
113
+ this.currentPage = page;
114
+ this.updateVisiblePages();
115
+ this.emitPageChange();
116
+ }
117
+ goToPrevious() {
118
+ if (this.canGoPrevious) {
119
+ this.goToPage(this.currentPage - 1);
120
+ }
121
+ }
122
+ goToNext() {
123
+ if (this.canGoNext) {
124
+ this.goToPage(this.currentPage + 1);
125
+ }
126
+ }
127
+ onPageSizeChange(newSize) {
128
+ if (this.disabled)
129
+ return;
130
+ this.pageSize = newSize;
131
+ this.currentPage = 1;
132
+ this.calculateTotalPages();
133
+ this.updateVisiblePages();
134
+ this.isDropdownOpen = false;
135
+ this.pageSizeChange.emit(newSize);
136
+ this.emitPageChange();
137
+ }
138
+ toggleDropdown() {
139
+ if (!this.disabled) {
140
+ this.isDropdownOpen = !this.isDropdownOpen;
141
+ }
142
+ }
143
+ closeDropdown() {
144
+ this.isDropdownOpen = false;
145
+ }
146
+ emitPageChange() {
147
+ this.pageChange.emit({
148
+ page: this.currentPage,
149
+ pageSize: this.pageSize,
150
+ startIndex: this.startIndex,
151
+ endIndex: this.endIndex
152
+ });
153
+ }
154
+ isNumber(value) {
155
+ return typeof value === 'number';
156
+ }
157
+ trackByPage(index, page) {
158
+ return typeof page === 'number' ? page : `ellipsis-${index}`;
159
+ }
160
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PaginationComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
161
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: PaginationComponent, isStandalone: true, selector: "pecb-pagination", inputs: { totalItems: "totalItems", pageSize: "pageSize", currentPage: "currentPage", pageSizeOptions: "pageSizeOptions", size: "size", variant: "variant", showPageSizeSelector: "showPageSizeSelector", showItemsInfo: "showItemsInfo", maxVisiblePages: "maxVisiblePages", disabled: "disabled", ariaLabel: ["aria-label", "ariaLabel"] }, outputs: { pageChange: "pageChange", pageSizeChange: "pageSizeChange" }, host: { listeners: { "document:click": "onDocumentClick($event)" } }, usesOnChanges: true, ngImport: i0, template: "<nav\r\n [class]=\"containerClasses.join(' ')\"\r\n [attr.aria-label]=\"ariaLabel\"\r\n role=\"navigation\"\r\n>\r\n <!-- V4: Centered variant - prev button on left -->\r\n <button\r\n *ngIf=\"variant === 'centered'\"\r\n type=\"button\"\r\n class=\"pecb-pagination__nav-button pecb-pagination__nav-button--prev pecb-pagination__nav-button--bordered\"\r\n [disabled]=\"!canGoPrevious\"\r\n [attr.aria-label]=\"'Go to previous page'\"\r\n (click)=\"goToPrevious()\"\r\n >\r\n <svg\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 16 16\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M10 12L6 8L10 4\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"1.5\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n\r\n <!-- Info section (V1, V2, V3, V4) -->\r\n <div class=\"pecb-pagination__info\" *ngIf=\"showItemsInfo || showPageSize\">\r\n <span *ngIf=\"showItemsInfo\" class=\"pecb-pagination__items-text\">\r\n {{ itemsInfoText }}\r\n </span>\r\n\r\n <!-- Page size dropdown (V1 only) -->\r\n <div *ngIf=\"showPageSize\" class=\"pecb-pagination__page-size\">\r\n <span class=\"pecb-pagination__page-size-label\">Items per page:</span>\r\n <div class=\"pecb-pagination__dropdown\">\r\n <button\r\n type=\"button\"\r\n class=\"pecb-pagination__dropdown-trigger\"\r\n [class.pecb-pagination__dropdown-trigger--open]=\"isDropdownOpen\"\r\n [disabled]=\"disabled\"\r\n [attr.aria-expanded]=\"isDropdownOpen\"\r\n aria-haspopup=\"listbox\"\r\n (click)=\"toggleDropdown()\"\r\n >\r\n <span>{{ pageSize }}</span>\r\n <svg\r\n class=\"pecb-pagination__dropdown-icon\"\r\n [class.pecb-pagination__dropdown-icon--open]=\"isDropdownOpen\"\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 16 16\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M4 6L8 10L12 6\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"1.5\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n <ul\r\n *ngIf=\"isDropdownOpen\"\r\n class=\"pecb-pagination__dropdown-menu\"\r\n role=\"listbox\"\r\n [attr.aria-label]=\"'Select items per page'\"\r\n >\r\n <li\r\n *ngFor=\"let option of pageSizeOptions\"\r\n class=\"pecb-pagination__dropdown-item\"\r\n [class.pecb-pagination__dropdown-item--selected]=\"option === pageSize\"\r\n role=\"option\"\r\n [attr.aria-selected]=\"option === pageSize\"\r\n (click)=\"onPageSizeChange(option)\"\r\n >\r\n {{ option }}\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Controls section -->\r\n <div class=\"pecb-pagination__controls\">\r\n <!-- Previous button (V1, V2, V3) -->\r\n <button\r\n *ngIf=\"variant !== 'centered'\"\r\n type=\"button\"\r\n class=\"pecb-pagination__nav-button pecb-pagination__nav-button--prev\"\r\n [class.pecb-pagination__nav-button--bordered]=\"variant === 'minimal'\"\r\n [disabled]=\"!canGoPrevious\"\r\n [attr.aria-label]=\"'Go to previous page'\"\r\n (click)=\"goToPrevious()\"\r\n >\r\n <svg\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 16 16\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M10 12L6 8L10 4\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"1.5\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n\r\n <!-- Page numbers (V1, V2) -->\r\n <div *ngIf=\"showPages\" class=\"pecb-pagination__pages\" role=\"group\" aria-label=\"Page navigation\">\r\n <ng-container *ngFor=\"let page of visiblePages; trackBy: trackByPage\">\r\n <button\r\n *ngIf=\"isNumber(page)\"\r\n type=\"button\"\r\n class=\"pecb-pagination__page-button\"\r\n [class.pecb-pagination__page-button--active]=\"page === currentPage\"\r\n [disabled]=\"disabled\"\r\n [attr.aria-label]=\"'Page ' + page\"\r\n [attr.aria-current]=\"page === currentPage ? 'page' : null\"\r\n (click)=\"goToPage(+page)\"\r\n >\r\n {{ page }}\r\n </button>\r\n <span\r\n *ngIf=\"!isNumber(page)\"\r\n class=\"pecb-pagination__ellipsis\"\r\n aria-hidden=\"true\"\r\n >\r\n {{ page }}\r\n </span>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- Next button (V1, V2, V3) -->\r\n <button\r\n *ngIf=\"variant !== 'centered'\"\r\n type=\"button\"\r\n class=\"pecb-pagination__nav-button pecb-pagination__nav-button--next\"\r\n [class.pecb-pagination__nav-button--bordered]=\"variant === 'minimal'\"\r\n [disabled]=\"!canGoNext\"\r\n [attr.aria-label]=\"'Go to next page'\"\r\n (click)=\"goToNext()\"\r\n >\r\n <svg\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 16 16\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M6 4L10 8L6 12\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"1.5\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n <!-- V4: Centered variant - next button on right -->\r\n <button\r\n *ngIf=\"variant === 'centered'\"\r\n type=\"button\"\r\n class=\"pecb-pagination__nav-button pecb-pagination__nav-button--next pecb-pagination__nav-button--bordered\"\r\n [disabled]=\"!canGoNext\"\r\n [attr.aria-label]=\"'Go to next page'\"\r\n (click)=\"goToNext()\"\r\n >\r\n <svg\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 16 16\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M6 4L10 8L6 12\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"1.5\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n</nav>\r\n", styles: [".pecb-pagination{display:flex;align-items:center;justify-content:space-between;gap:24px;font-family:Plus Jakarta Sans,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;width:100%}.pecb-pagination--sm .pecb-pagination__items-text,.pecb-pagination--sm .pecb-pagination__page-size-label{font-size:12px}.pecb-pagination--sm .pecb-pagination__dropdown-trigger{height:28px;padding:0 8px;font-size:12px}.pecb-pagination--sm .pecb-pagination__nav-button,.pecb-pagination--sm .pecb-pagination__page-button{width:28px;height:28px;font-size:12px}.pecb-pagination--sm .pecb-pagination__ellipsis{width:28px;height:28px}.pecb-pagination--md .pecb-pagination__items-text,.pecb-pagination--md .pecb-pagination__page-size-label{font-size:14px}.pecb-pagination--md .pecb-pagination__dropdown-trigger{height:32px;padding:0 12px;font-size:14px}.pecb-pagination--md .pecb-pagination__nav-button,.pecb-pagination--md .pecb-pagination__page-button{width:32px;height:32px;font-size:14px}.pecb-pagination--md .pecb-pagination__ellipsis{width:32px;height:32px}.pecb-pagination--lg .pecb-pagination__items-text,.pecb-pagination--lg .pecb-pagination__page-size-label{font-size:16px}.pecb-pagination--lg .pecb-pagination__dropdown-trigger{height:40px;padding:0 16px;font-size:16px}.pecb-pagination--lg .pecb-pagination__nav-button,.pecb-pagination--lg .pecb-pagination__page-button{width:40px;height:40px;font-size:16px}.pecb-pagination--lg .pecb-pagination__ellipsis{width:40px;height:40px}.pecb-pagination--full,.pecb-pagination--compact{justify-content:space-between}.pecb-pagination--compact .pecb-pagination__info{gap:0}.pecb-pagination--minimal{justify-content:space-between}.pecb-pagination--minimal .pecb-pagination__controls{gap:8px}.pecb-pagination--centered{justify-content:space-between}.pecb-pagination--centered .pecb-pagination__info{flex:1;justify-content:center}.pecb-pagination--centered .pecb-pagination__controls{display:none}.pecb-pagination--disabled{opacity:.5;pointer-events:none}.pecb-pagination__info{display:flex;align-items:center;gap:24px}.pecb-pagination__items-text{color:#616161;font-weight:400;white-space:nowrap}.pecb-pagination__page-size{display:flex;align-items:center;gap:8px}.pecb-pagination__page-size-label{color:#616161;font-weight:400;white-space:nowrap}.pecb-pagination__dropdown{position:relative}.pecb-pagination__dropdown-trigger{display:flex;align-items:center;justify-content:space-between;gap:8px;min-width:64px;background-color:#fff;border:1px solid #ececec;border-radius:12px;color:#313131;font-family:Plus Jakarta Sans,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-weight:400;cursor:pointer;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.pecb-pagination__dropdown-trigger:hover:not(:disabled){border-color:#919191}.pecb-pagination__dropdown-trigger:focus{outline:none;border-color:#212427;box-shadow:0 0 0 2px #2124271a}.pecb-pagination__dropdown-trigger:disabled{cursor:not-allowed;opacity:.5}.pecb-pagination__dropdown-trigger--open{border-color:#212427}.pecb-pagination__dropdown-icon{color:#616161;transition:transform .15s ease-in-out;flex-shrink:0}.pecb-pagination__dropdown-icon--open{transform:rotate(180deg)}.pecb-pagination__dropdown-menu{position:absolute;top:calc(100% + 4px);left:0;z-index:1000;min-width:100%;margin:0;padding:8px 0;list-style:none;background-color:#fff;border:1px solid #ececec;border-radius:8px;box-shadow:0 10px 15px -3px #0000001a,0 4px 6px -2px #0000000d}.pecb-pagination__dropdown-item{padding:8px 12px;color:#313131;font-size:14px;font-weight:400;cursor:pointer;transition:background-color .15s ease-in-out,color .15s ease-in-out}.pecb-pagination__dropdown-item:hover{background-color:#f4f4f4}.pecb-pagination__dropdown-item--selected{color:#212427;font-weight:500}.pecb-pagination__controls{display:flex;align-items:center;gap:6px}.pecb-pagination__nav-button{display:flex;align-items:center;justify-content:center;background-color:transparent;border:none;border-radius:8px;color:#919191;cursor:pointer;transition:background-color .15s ease-in-out,color .15s ease-in-out,border-color .15s ease-in-out}.pecb-pagination__nav-button:hover:not(:disabled){background-color:#f4f4f4;color:#313131}.pecb-pagination__nav-button:focus{outline:none;box-shadow:0 0 0 2px #21242733}.pecb-pagination__nav-button:disabled{color:#c2c2c2;cursor:not-allowed}.pecb-pagination__nav-button svg{width:16px;height:16px}.pecb-pagination__nav-button--bordered{background-color:#fff;border:1px solid #ececec;border-radius:8px}.pecb-pagination__nav-button--bordered:hover:not(:disabled){background-color:#fff;border-color:#c2c2c2;color:#212427}.pecb-pagination__nav-button--bordered:hover:not(:disabled) svg path{stroke:#212427}.pecb-pagination__nav-button--bordered:disabled{background-color:#fafafa;border-color:#ececec}.pecb-pagination__pages{display:flex;align-items:center;gap:6px}.pecb-pagination__page-button{display:flex;align-items:center;justify-content:center;background-color:transparent;border:none;border-radius:8px;color:#616161;font-family:Plus Jakarta Sans,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-weight:400;cursor:pointer;transition:background-color .15s ease-in-out,color .15s ease-in-out}.pecb-pagination__page-button:hover:not(:disabled):not(.pecb-pagination__page-button--active){background-color:#f4f4f4;color:#313131}.pecb-pagination__page-button:focus{outline:none;box-shadow:0 0 0 2px #21242733}.pecb-pagination__page-button:disabled{cursor:not-allowed;opacity:.5}.pecb-pagination__page-button--active{background-color:#212427;color:#fff;font-weight:500}.pecb-pagination__page-button--active:hover{background-color:#151719}.pecb-pagination__ellipsis{display:flex;align-items:center;justify-content:center;color:#919191;font-size:14px}\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 }); }
162
+ }
163
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PaginationComponent, decorators: [{
164
+ type: Component,
165
+ args: [{ selector: 'pecb-pagination', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<nav\r\n [class]=\"containerClasses.join(' ')\"\r\n [attr.aria-label]=\"ariaLabel\"\r\n role=\"navigation\"\r\n>\r\n <!-- V4: Centered variant - prev button on left -->\r\n <button\r\n *ngIf=\"variant === 'centered'\"\r\n type=\"button\"\r\n class=\"pecb-pagination__nav-button pecb-pagination__nav-button--prev pecb-pagination__nav-button--bordered\"\r\n [disabled]=\"!canGoPrevious\"\r\n [attr.aria-label]=\"'Go to previous page'\"\r\n (click)=\"goToPrevious()\"\r\n >\r\n <svg\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 16 16\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M10 12L6 8L10 4\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"1.5\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n\r\n <!-- Info section (V1, V2, V3, V4) -->\r\n <div class=\"pecb-pagination__info\" *ngIf=\"showItemsInfo || showPageSize\">\r\n <span *ngIf=\"showItemsInfo\" class=\"pecb-pagination__items-text\">\r\n {{ itemsInfoText }}\r\n </span>\r\n\r\n <!-- Page size dropdown (V1 only) -->\r\n <div *ngIf=\"showPageSize\" class=\"pecb-pagination__page-size\">\r\n <span class=\"pecb-pagination__page-size-label\">Items per page:</span>\r\n <div class=\"pecb-pagination__dropdown\">\r\n <button\r\n type=\"button\"\r\n class=\"pecb-pagination__dropdown-trigger\"\r\n [class.pecb-pagination__dropdown-trigger--open]=\"isDropdownOpen\"\r\n [disabled]=\"disabled\"\r\n [attr.aria-expanded]=\"isDropdownOpen\"\r\n aria-haspopup=\"listbox\"\r\n (click)=\"toggleDropdown()\"\r\n >\r\n <span>{{ pageSize }}</span>\r\n <svg\r\n class=\"pecb-pagination__dropdown-icon\"\r\n [class.pecb-pagination__dropdown-icon--open]=\"isDropdownOpen\"\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 16 16\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M4 6L8 10L12 6\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"1.5\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n <ul\r\n *ngIf=\"isDropdownOpen\"\r\n class=\"pecb-pagination__dropdown-menu\"\r\n role=\"listbox\"\r\n [attr.aria-label]=\"'Select items per page'\"\r\n >\r\n <li\r\n *ngFor=\"let option of pageSizeOptions\"\r\n class=\"pecb-pagination__dropdown-item\"\r\n [class.pecb-pagination__dropdown-item--selected]=\"option === pageSize\"\r\n role=\"option\"\r\n [attr.aria-selected]=\"option === pageSize\"\r\n (click)=\"onPageSizeChange(option)\"\r\n >\r\n {{ option }}\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Controls section -->\r\n <div class=\"pecb-pagination__controls\">\r\n <!-- Previous button (V1, V2, V3) -->\r\n <button\r\n *ngIf=\"variant !== 'centered'\"\r\n type=\"button\"\r\n class=\"pecb-pagination__nav-button pecb-pagination__nav-button--prev\"\r\n [class.pecb-pagination__nav-button--bordered]=\"variant === 'minimal'\"\r\n [disabled]=\"!canGoPrevious\"\r\n [attr.aria-label]=\"'Go to previous page'\"\r\n (click)=\"goToPrevious()\"\r\n >\r\n <svg\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 16 16\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M10 12L6 8L10 4\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"1.5\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n\r\n <!-- Page numbers (V1, V2) -->\r\n <div *ngIf=\"showPages\" class=\"pecb-pagination__pages\" role=\"group\" aria-label=\"Page navigation\">\r\n <ng-container *ngFor=\"let page of visiblePages; trackBy: trackByPage\">\r\n <button\r\n *ngIf=\"isNumber(page)\"\r\n type=\"button\"\r\n class=\"pecb-pagination__page-button\"\r\n [class.pecb-pagination__page-button--active]=\"page === currentPage\"\r\n [disabled]=\"disabled\"\r\n [attr.aria-label]=\"'Page ' + page\"\r\n [attr.aria-current]=\"page === currentPage ? 'page' : null\"\r\n (click)=\"goToPage(+page)\"\r\n >\r\n {{ page }}\r\n </button>\r\n <span\r\n *ngIf=\"!isNumber(page)\"\r\n class=\"pecb-pagination__ellipsis\"\r\n aria-hidden=\"true\"\r\n >\r\n {{ page }}\r\n </span>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- Next button (V1, V2, V3) -->\r\n <button\r\n *ngIf=\"variant !== 'centered'\"\r\n type=\"button\"\r\n class=\"pecb-pagination__nav-button pecb-pagination__nav-button--next\"\r\n [class.pecb-pagination__nav-button--bordered]=\"variant === 'minimal'\"\r\n [disabled]=\"!canGoNext\"\r\n [attr.aria-label]=\"'Go to next page'\"\r\n (click)=\"goToNext()\"\r\n >\r\n <svg\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 16 16\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M6 4L10 8L6 12\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"1.5\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n <!-- V4: Centered variant - next button on right -->\r\n <button\r\n *ngIf=\"variant === 'centered'\"\r\n type=\"button\"\r\n class=\"pecb-pagination__nav-button pecb-pagination__nav-button--next pecb-pagination__nav-button--bordered\"\r\n [disabled]=\"!canGoNext\"\r\n [attr.aria-label]=\"'Go to next page'\"\r\n (click)=\"goToNext()\"\r\n >\r\n <svg\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 16 16\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M6 4L10 8L6 12\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"1.5\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n</nav>\r\n", styles: [".pecb-pagination{display:flex;align-items:center;justify-content:space-between;gap:24px;font-family:Plus Jakarta Sans,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;width:100%}.pecb-pagination--sm .pecb-pagination__items-text,.pecb-pagination--sm .pecb-pagination__page-size-label{font-size:12px}.pecb-pagination--sm .pecb-pagination__dropdown-trigger{height:28px;padding:0 8px;font-size:12px}.pecb-pagination--sm .pecb-pagination__nav-button,.pecb-pagination--sm .pecb-pagination__page-button{width:28px;height:28px;font-size:12px}.pecb-pagination--sm .pecb-pagination__ellipsis{width:28px;height:28px}.pecb-pagination--md .pecb-pagination__items-text,.pecb-pagination--md .pecb-pagination__page-size-label{font-size:14px}.pecb-pagination--md .pecb-pagination__dropdown-trigger{height:32px;padding:0 12px;font-size:14px}.pecb-pagination--md .pecb-pagination__nav-button,.pecb-pagination--md .pecb-pagination__page-button{width:32px;height:32px;font-size:14px}.pecb-pagination--md .pecb-pagination__ellipsis{width:32px;height:32px}.pecb-pagination--lg .pecb-pagination__items-text,.pecb-pagination--lg .pecb-pagination__page-size-label{font-size:16px}.pecb-pagination--lg .pecb-pagination__dropdown-trigger{height:40px;padding:0 16px;font-size:16px}.pecb-pagination--lg .pecb-pagination__nav-button,.pecb-pagination--lg .pecb-pagination__page-button{width:40px;height:40px;font-size:16px}.pecb-pagination--lg .pecb-pagination__ellipsis{width:40px;height:40px}.pecb-pagination--full,.pecb-pagination--compact{justify-content:space-between}.pecb-pagination--compact .pecb-pagination__info{gap:0}.pecb-pagination--minimal{justify-content:space-between}.pecb-pagination--minimal .pecb-pagination__controls{gap:8px}.pecb-pagination--centered{justify-content:space-between}.pecb-pagination--centered .pecb-pagination__info{flex:1;justify-content:center}.pecb-pagination--centered .pecb-pagination__controls{display:none}.pecb-pagination--disabled{opacity:.5;pointer-events:none}.pecb-pagination__info{display:flex;align-items:center;gap:24px}.pecb-pagination__items-text{color:#616161;font-weight:400;white-space:nowrap}.pecb-pagination__page-size{display:flex;align-items:center;gap:8px}.pecb-pagination__page-size-label{color:#616161;font-weight:400;white-space:nowrap}.pecb-pagination__dropdown{position:relative}.pecb-pagination__dropdown-trigger{display:flex;align-items:center;justify-content:space-between;gap:8px;min-width:64px;background-color:#fff;border:1px solid #ececec;border-radius:12px;color:#313131;font-family:Plus Jakarta Sans,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-weight:400;cursor:pointer;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.pecb-pagination__dropdown-trigger:hover:not(:disabled){border-color:#919191}.pecb-pagination__dropdown-trigger:focus{outline:none;border-color:#212427;box-shadow:0 0 0 2px #2124271a}.pecb-pagination__dropdown-trigger:disabled{cursor:not-allowed;opacity:.5}.pecb-pagination__dropdown-trigger--open{border-color:#212427}.pecb-pagination__dropdown-icon{color:#616161;transition:transform .15s ease-in-out;flex-shrink:0}.pecb-pagination__dropdown-icon--open{transform:rotate(180deg)}.pecb-pagination__dropdown-menu{position:absolute;top:calc(100% + 4px);left:0;z-index:1000;min-width:100%;margin:0;padding:8px 0;list-style:none;background-color:#fff;border:1px solid #ececec;border-radius:8px;box-shadow:0 10px 15px -3px #0000001a,0 4px 6px -2px #0000000d}.pecb-pagination__dropdown-item{padding:8px 12px;color:#313131;font-size:14px;font-weight:400;cursor:pointer;transition:background-color .15s ease-in-out,color .15s ease-in-out}.pecb-pagination__dropdown-item:hover{background-color:#f4f4f4}.pecb-pagination__dropdown-item--selected{color:#212427;font-weight:500}.pecb-pagination__controls{display:flex;align-items:center;gap:6px}.pecb-pagination__nav-button{display:flex;align-items:center;justify-content:center;background-color:transparent;border:none;border-radius:8px;color:#919191;cursor:pointer;transition:background-color .15s ease-in-out,color .15s ease-in-out,border-color .15s ease-in-out}.pecb-pagination__nav-button:hover:not(:disabled){background-color:#f4f4f4;color:#313131}.pecb-pagination__nav-button:focus{outline:none;box-shadow:0 0 0 2px #21242733}.pecb-pagination__nav-button:disabled{color:#c2c2c2;cursor:not-allowed}.pecb-pagination__nav-button svg{width:16px;height:16px}.pecb-pagination__nav-button--bordered{background-color:#fff;border:1px solid #ececec;border-radius:8px}.pecb-pagination__nav-button--bordered:hover:not(:disabled){background-color:#fff;border-color:#c2c2c2;color:#212427}.pecb-pagination__nav-button--bordered:hover:not(:disabled) svg path{stroke:#212427}.pecb-pagination__nav-button--bordered:disabled{background-color:#fafafa;border-color:#ececec}.pecb-pagination__pages{display:flex;align-items:center;gap:6px}.pecb-pagination__page-button{display:flex;align-items:center;justify-content:center;background-color:transparent;border:none;border-radius:8px;color:#616161;font-family:Plus Jakarta Sans,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-weight:400;cursor:pointer;transition:background-color .15s ease-in-out,color .15s ease-in-out}.pecb-pagination__page-button:hover:not(:disabled):not(.pecb-pagination__page-button--active){background-color:#f4f4f4;color:#313131}.pecb-pagination__page-button:focus{outline:none;box-shadow:0 0 0 2px #21242733}.pecb-pagination__page-button:disabled{cursor:not-allowed;opacity:.5}.pecb-pagination__page-button--active{background-color:#212427;color:#fff;font-weight:500}.pecb-pagination__page-button--active:hover{background-color:#151719}.pecb-pagination__ellipsis{display:flex;align-items:center;justify-content:center;color:#919191;font-size:14px}\n"] }]
166
+ }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { totalItems: [{
167
+ type: Input
168
+ }], pageSize: [{
169
+ type: Input
170
+ }], currentPage: [{
171
+ type: Input
172
+ }], pageSizeOptions: [{
173
+ type: Input
174
+ }], size: [{
175
+ type: Input
176
+ }], variant: [{
177
+ type: Input
178
+ }], showPageSizeSelector: [{
179
+ type: Input
180
+ }], showItemsInfo: [{
181
+ type: Input
182
+ }], maxVisiblePages: [{
183
+ type: Input
184
+ }], disabled: [{
185
+ type: Input
186
+ }], ariaLabel: [{
187
+ type: Input,
188
+ args: ['aria-label']
189
+ }], pageChange: [{
190
+ type: Output
191
+ }], pageSizeChange: [{
192
+ type: Output
193
+ }], onDocumentClick: [{
194
+ type: HostListener,
195
+ args: ['document:click', ['$event']]
196
+ }] } });
197
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnaW5hdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS1jb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9wYWdpbmF0aW9uL3BhZ2luYXRpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWktY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvcGFnaW5hdGlvbi9wYWdpbmF0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBQ1osdUJBQXVCLEVBR3ZCLFlBQVksRUFFYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7OztBQW9CL0MsTUFBTSxPQUFPLG1CQUFtQjtJQXFCOUIsWUFBb0IsVUFBc0I7UUFBdEIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQXBCakMsZUFBVSxHQUFHLENBQUMsQ0FBQztRQUNmLGFBQVEsR0FBRyxFQUFFLENBQUM7UUFDZCxnQkFBVyxHQUFHLENBQUMsQ0FBQztRQUNoQixvQkFBZSxHQUFhLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDN0MsU0FBSSxHQUFtQixJQUFJLENBQUM7UUFDNUIsWUFBTyxHQUFzQixNQUFNLENBQUM7UUFDcEMseUJBQW9CLEdBQUcsSUFBSSxDQUFDO1FBQzVCLGtCQUFhLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLG9CQUFlLEdBQUcsQ0FBQyxDQUFDO1FBQ3BCLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFFTCxjQUFTLEdBQUcsWUFBWSxDQUFDO1FBRXBDLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBbUIsQ0FBQztRQUNqRCxtQkFBYyxHQUFHLElBQUksWUFBWSxFQUFV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QUFDLEtBQWEsRUFBRSxJQUFxQjtRQUM5QyxPQUFPLE9BQU8sSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxZQUFZLEtBQUssRUFBRSxDQUFDO0lBQy9ELENBQUM7K0dBbExVLG1CQUFtQjttR0FBbkIsbUJBQW1CLDZqQkMvQmhDLCsrTUFzTUEsdXNMRDVLWSxZQUFZOzs0RkFLWCxtQkFBbUI7a0JBUi9CLFNBQVM7K0JBQ0UsaUJBQWlCLGNBQ2YsSUFBSSxXQUNQLENBQUMsWUFBWSxDQUFDLG1CQUdOLHVCQUF1QixDQUFDLE1BQU07K0VBR3RDLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRWUsU0FBUztzQkFBN0IsS0FBSzt1QkFBQyxZQUFZO2dCQUVULFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkFTUCxlQUFlO3NCQURkLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBJbnB1dCxcclxuICBPdXRwdXQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gIE9uQ2hhbmdlcyxcclxuICBTaW1wbGVDaGFuZ2VzLFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBFbGVtZW50UmVmXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcblxyXG5leHBvcnQgdHlwZSBQYWdpbmF0aW9uU2l6ZSA9ICdzbScgfCAnbWQnIHwgJ2xnJztcclxuZXhwb3J0IHR5cGUgUGFnaW5hdGlvblZhcmlhbnQgPSAnZnVsbCcgfCAnY29tcGFjdCcgfCAnbWluaW1hbCcgfCAnY2VudGVyZWQnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBQYWdlQ2hhbmdlRXZlbnQge1xyXG4gIHBhZ2U6IG51bWJlcjtcclxuICBwYWdlU2l6ZTogbnVtYmVyO1xyXG4gIHN0YXJ0SW5kZXg6IG51bWJlcjtcclxuICBlbmRJbmRleDogbnVtYmVyO1xyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3BlY2ItcGFnaW5hdGlvbicsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcclxuICB0ZW1wbGF0ZVVybDogJy4vcGFnaW5hdGlvbi5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vcGFnaW5hdGlvbi5jb21wb25lbnQuc2NzcyddLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBQYWdpbmF0aW9uQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcclxuICBASW5wdXQoKSB0b3RhbEl0ZW1zID0gMDtcclxuICBASW5wdXQoKSBwYWdlU2l6ZSA9IDEwO1xyXG4gIEBJbnB1dCgpIGN1cnJlbnRQYWdlID0gMTtcclxuICBASW5wdXQoKSBwYWdlU2l6ZU9wdGlvbnM6IG51bWJlcltdID0gWzEwLCAyNSwgNTAsIDc1XTtcclxuICBASW5wdXQoKSBzaXplOiBQYWdpbmF0aW9uU2l6ZSA9ICdtZCc7XHJcbiAgQElucHV0KCkgdmFyaWFudDogUGFnaW5hdGlvblZhcmlhbnQgPSAnZnVsbCc7XHJcbiAgQElucHV0KCkgc2hvd1BhZ2VTaXplU2VsZWN0b3IgPSB0cnVlO1xyXG4gIEBJbnB1dCgpIHNob3dJdGVtc0luZm8gPSB0cnVlO1xyXG4gIEBJbnB1dCgpIG1heFZpc2libGVQYWdlcyA9IDM7XHJcbiAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KCdhcmlhLWxhYmVsJykgYXJpYUxhYmVsID0gJ1BhZ2luYXRpb24nO1xyXG5cclxuICBAT3V0cHV0KCkgcGFnZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8UGFnZUNoYW5nZUV2ZW50PigpO1xyXG4gIEBPdXRwdXQoKSBwYWdlU2l6ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xyXG5cclxuICB0b3RhbFBhZ2VzID0gMDtcclxuICB2aXNpYmxlUGFnZXM6IChudW1iZXIgfCBzdHJpbmcpW10gPSBbXTtcclxuICBpc0Ryb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYpIHt9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcclxuICBvbkRvY3VtZW50Q2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmlzRHJvcGRvd25PcGVuICYmICF0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpKSB7XHJcbiAgICAgIHRoaXMuaXNEcm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGlmIChjaGFuZ2VzWyd0b3RhbEl0ZW1zJ10gfHwgY2hhbmdlc1sncGFnZVNpemUnXSB8fCBjaGFuZ2VzWydjdXJyZW50UGFnZSddKSB7XHJcbiAgICAgIHRoaXMuY2FsY3VsYXRlVG90YWxQYWdlcygpO1xyXG4gICAgICB0aGlzLnVwZGF0ZVZpc2libGVQYWdlcygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGNvbnRhaW5lckNsYXNzZXMoKTogc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuIFtcclxuICAgICAgJ3BlY2ItcGFnaW5hdGlvbicsXHJcbiAgICAgIGBwZWNiLXBhZ2luYXRpb24tLSR7dGhpcy5zaXplfWAsXHJcbiAgICAgIGBwZWNiLXBhZ2luYXRpb24tLSR7dGhpcy52YXJpYW50fWAsXHJcbiAgICAgIHRoaXMuZGlzYWJsZWQgPyAncGVjYi1wYWdpbmF0aW9uLS1kaXNhYmxlZCcgOiAnJ1xyXG4gICAgXS5maWx0ZXIoQm9vbGVhbik7XHJcbiAgfVxyXG5cclxuICBnZXQgc2hvd1BhZ2VzKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMudmFyaWFudCA9PT0gJ2Z1bGwnIHx8IHRoaXMudmFyaWFudCA9PT0gJ2NvbXBhY3QnO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNob3dQYWdlU2l6ZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnZhcmlhbnQgPT09ICdmdWxsJyAmJiB0aGlzLnNob3dQYWdlU2l6ZVNlbGVjdG9yO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGl0ZW1zSW5mb1RleHQoKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLnZhcmlhbnQgPT09ICdtaW5pbWFsJyB8fCB0aGlzLnZhcmlhbnQgPT09ICdjZW50ZXJlZCcpIHtcclxuICAgICAgcmV0dXJuIGBTaG93aW5nICR7dGhpcy5zdGFydEluZGV4fS0ke3RoaXMuZW5kSW5kZXh9IG9mICR7dGhpcy50b3RhbEl0ZW1zfWA7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYCR7dGhpcy5zdGFydEluZGV4fS0ke3RoaXMuZW5kSW5kZXh9IG9mICR7dGhpcy50b3RhbEl0ZW1zfSBpdGVtc2A7XHJcbiAgfVxyXG5cclxuICBnZXQgc3RhcnRJbmRleCgpOiBudW1iZXIge1xyXG4gICAgaWYgKHRoaXMudG90YWxJdGVtcyA9PT0gMCkgcmV0dXJuIDA7XHJcbiAgICByZXR1cm4gKHRoaXMuY3VycmVudFBhZ2UgLSAxKSAqIHRoaXMucGFnZVNpemUgKyAxO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGVuZEluZGV4KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gTWF0aC5taW4odGhpcy5jdXJyZW50UGFnZSAqIHRoaXMucGFnZVNpemUsIHRoaXMudG90YWxJdGVtcyk7XHJcbiAgfVxyXG5cclxuICBnZXQgY2FuR29QcmV2aW91cygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmN1cnJlbnRQYWdlID4gMSAmJiAhdGhpcy5kaXNhYmxlZDtcclxuICB9XHJcblxyXG4gIGdldCBjYW5Hb05leHQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50UGFnZSA8IHRoaXMudG90YWxQYWdlcyAmJiAhdGhpcy5kaXNhYmxlZDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2FsY3VsYXRlVG90YWxQYWdlcygpOiB2b2lkIHtcclxuICAgIHRoaXMudG90YWxQYWdlcyA9IE1hdGguY2VpbCh0aGlzLnRvdGFsSXRlbXMgLyB0aGlzLnBhZ2VTaXplKTtcclxuICAgIGlmICh0aGlzLmN1cnJlbnRQYWdlID4gdGhpcy50b3RhbFBhZ2VzICYmIHRoaXMudG90YWxQYWdlcyA+IDApIHtcclxuICAgICAgdGhpcy5nb1RvUGFnZSh0aGlzLnRvdGFsUGFnZXMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVWaXNpYmxlUGFnZXMoKTogdm9pZCB7XHJcbiAgICBjb25zdCBwYWdlczogKG51bWJlciB8IHN0cmluZylbXSA9IFtdO1xyXG5cclxuICAgIGlmICh0aGlzLnRvdGFsUGFnZXMgPD0gdGhpcy5tYXhWaXNpYmxlUGFnZXMgKyAyKSB7XHJcbiAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IHRoaXMudG90YWxQYWdlczsgaSsrKSB7XHJcbiAgICAgICAgcGFnZXMucHVzaChpKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcGFnZXMucHVzaCgxKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLmN1cnJlbnRQYWdlIDw9IHRoaXMubWF4VmlzaWJsZVBhZ2VzKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDI7IGkgPD0gdGhpcy5tYXhWaXNpYmxlUGFnZXMgKyAxOyBpKyspIHtcclxuICAgICAgICAgIHBhZ2VzLnB1c2goaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHBhZ2VzLnB1c2goJy4uLicpO1xyXG4gICAgICAgIHBhZ2VzLnB1c2godGhpcy50b3RhbFBhZ2VzKTtcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLmN1cnJlbnRQYWdlID49IHRoaXMudG90YWxQYWdlcyAtIHRoaXMubWF4VmlzaWJsZVBhZ2VzICsgMSkge1xyXG4gICAgICAgIHBhZ2VzLnB1c2goJy4uLicpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSB0aGlzLnRvdGFsUGFnZXMgLSB0aGlzLm1heFZpc2libGVQYWdlczsgaSA8PSB0aGlzLnRvdGFsUGFnZXM7IGkrKykge1xyXG4gICAgICAgICAgcGFnZXMucHVzaChpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcGFnZXMucHVzaCgnLi4uJyk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuY3VycmVudFBhZ2UgLSAxOyBpIDw9IHRoaXMuY3VycmVudFBhZ2UgKyAxOyBpKyspIHtcclxuICAgICAgICAgIHBhZ2VzLnB1c2goaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHBhZ2VzLnB1c2goJy4uLicpO1xyXG4gICAgICAgIHBhZ2VzLnB1c2godGhpcy50b3RhbFBhZ2VzKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudmlzaWJsZVBhZ2VzID0gcGFnZXM7XHJcbiAgfVxyXG5cclxuICBnb1RvUGFnZShwYWdlOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHBhZ2UgPCAxIHx8IHBhZ2UgPiB0aGlzLnRvdGFsUGFnZXMgfHwgcGFnZSA9PT0gdGhpcy5jdXJyZW50UGFnZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jdXJyZW50UGFnZSA9IHBhZ2U7XHJcbiAgICB0aGlzLnVwZGF0ZVZpc2libGVQYWdlcygpO1xyXG4gICAgdGhpcy5lbWl0UGFnZUNoYW5nZSgpO1xyXG4gIH1cclxuXHJcbiAgZ29Ub1ByZXZpb3VzKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuY2FuR29QcmV2aW91cykge1xyXG4gICAgICB0aGlzLmdvVG9QYWdlKHRoaXMuY3VycmVudFBhZ2UgLSAxKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdvVG9OZXh0KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuY2FuR29OZXh0KSB7XHJcbiAgICAgIHRoaXMuZ29Ub1BhZ2UodGhpcy5jdXJyZW50UGFnZSArIDEpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25QYWdlU2l6ZUNoYW5nZShuZXdTaXplOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmRpc2FibGVkKSByZXR1cm47XHJcblxyXG4gICAgdGhpcy5wYWdlU2l6ZSA9IG5ld1NpemU7XHJcbiAgICB0aGlzLmN1cnJlbnRQYWdlID0gMTtcclxuICAgIHRoaXMuY2FsY3VsYXRlVG90YWxQYWdlcygpO1xyXG4gICAgdGhpcy51cGRhdGVWaXNpYmxlUGFnZXMoKTtcclxuICAgIHRoaXMuaXNEcm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICAgIHRoaXMucGFnZVNpemVDaGFuZ2UuZW1pdChuZXdTaXplKTtcclxuICAgIHRoaXMuZW1pdFBhZ2VDaGFuZ2UoKTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZURyb3Bkb3duKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7XHJcbiAgICAgIHRoaXMuaXNEcm9wZG93bk9wZW4gPSAhdGhpcy5pc0Ryb3Bkb3duT3BlbjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNsb3NlRHJvcGRvd24oKTogdm9pZCB7XHJcbiAgICB0aGlzLmlzRHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGVtaXRQYWdlQ2hhbmdlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5wYWdlQ2hhbmdlLmVtaXQoe1xyXG4gICAgICBwYWdlOiB0aGlzLmN1cnJlbnRQYWdlLFxyXG4gICAgICBwYWdlU2l6ZTogdGhpcy5wYWdlU2l6ZSxcclxuICAgICAgc3RhcnRJbmRleDogdGhpcy5zdGFydEluZGV4LFxyXG4gICAgICBlbmRJbmRleDogdGhpcy5lbmRJbmRleFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBpc051bWJlcih2YWx1ZTogbnVtYmVyIHwgc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJztcclxuICB9XHJcblxyXG4gIHRyYWNrQnlQYWdlKGluZGV4OiBudW1iZXIsIHBhZ2U6IG51bWJlciB8IHN0cmluZyk6IG51bWJlciB8IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdHlwZW9mIHBhZ2UgPT09ICdudW1iZXInID8gcGFnZSA6IGBlbGxpcHNpcy0ke2luZGV4fWA7XHJcbiAgfVxyXG59IiwiPG5hdlxyXG4gIFtjbGFzc109XCJjb250YWluZXJDbGFzc2VzLmpvaW4oJyAnKVwiXHJcbiAgW2F0dHIuYXJpYS1sYWJlbF09XCJhcmlhTGFiZWxcIlxyXG4gIHJvbGU9XCJuYXZpZ2F0aW9uXCJcclxuPlxyXG4gIDwhLS0gVjQ6IENlbnRlcmVkIHZhcmlhbnQgLSBwcmV2IGJ1dHRvbiBvbiBsZWZ0IC0tPlxyXG4gIDxidXR0b25cclxuICAgICpuZ0lmPVwidmFyaWFudCA9PT0gJ2NlbnRlcmVkJ1wiXHJcbiAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgIGNsYXNzPVwicGVjYi1wYWdpbmF0aW9uX19uYXYtYnV0dG9uIHBlY2ItcGFnaW5hdGlvbl9fbmF2LWJ1dHRvbi0tcHJldiBwZWNiLXBhZ2luYXRpb25fX25hdi1idXR0b24tLWJvcmRlcmVkXCJcclxuICAgIFtkaXNhYmxlZF09XCIhY2FuR29QcmV2aW91c1wiXHJcbiAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidHbyB0byBwcmV2aW91cyBwYWdlJ1wiXHJcbiAgICAoY2xpY2spPVwiZ29Ub1ByZXZpb3VzKClcIlxyXG4gID5cclxuICAgIDxzdmdcclxuICAgICAgd2lkdGg9XCIxNlwiXHJcbiAgICAgIGhlaWdodD1cIjE2XCJcclxuICAgICAgdmlld0JveD1cIjAgMCAxNiAxNlwiXHJcbiAgICAgIGZpbGw9XCJub25lXCJcclxuICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXHJcbiAgICA+XHJcbiAgICAgIDxwYXRoXHJcbiAgICAgICAgZD1cIk0xMCAxMkw2IDhMMTAgNFwiXHJcbiAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcclxuICAgICAgICBzdHJva2Utd2lkdGg9XCIxLjVcIlxyXG4gICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcclxuICAgICAgLz5cclxuICAgIDwvc3ZnPlxyXG4gIDwvYnV0dG9uPlxyXG5cclxuICA8IS0tIEluZm8gc2VjdGlvbiAoVjEsIFYyLCBWMywgVjQpIC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJwZWNiLXBhZ2luYXRpb25fX2luZm9cIiAqbmdJZj1cInNob3dJdGVtc0luZm8gfHwgc2hvd1BhZ2VTaXplXCI+XHJcbiAgICA8c3BhbiAqbmdJZj1cInNob3dJdGVtc0luZm9cIiBjbGFzcz1cInBlY2ItcGFnaW5hdGlvbl9faXRlbXMtdGV4dFwiPlxyXG4gICAgICB7eyBpdGVtc0luZm9UZXh0IH19XHJcbiAgICA8L3NwYW4+XHJcblxyXG4gICAgPCEtLSBQYWdlIHNpemUgZHJvcGRvd24gKFYxIG9ubHkpIC0tPlxyXG4gICAgPGRpdiAqbmdJZj1cInNob3dQYWdlU2l6ZVwiIGNsYXNzPVwicGVjYi1wYWdpbmF0aW9uX19wYWdlLXNpemVcIj5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJwZWNiLXBhZ2luYXRpb25fX3BhZ2Utc2l6ZS1sYWJlbFwiPkl0ZW1zIHBlciBwYWdlOjwvc3Bhbj5cclxuICAgICAgPGRpdiBjbGFzcz1cInBlY2ItcGFnaW5hdGlvbl9fZHJvcGRvd25cIj5cclxuICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgIGNsYXNzPVwicGVjYi1wYWdpbmF0aW9uX19kcm9wZG93bi10cmlnZ2VyXCJcclxuICAgICAgICAgIFtjbGFzcy5wZWNiLXBhZ2luYXRpb25fX2Ryb3Bkb3duLXRyaWdnZXItLW9wZW5dPVwiaXNEcm9wZG93bk9wZW5cIlxyXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcclxuICAgICAgICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwiaXNEcm9wZG93bk9wZW5cIlxyXG4gICAgICAgICAgYXJpYS1oYXNwb3B1cD1cImxpc3Rib3hcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZURyb3Bkb3duKClcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxzcGFuPnt7IHBhZ2VTaXplIH19PC9zcGFuPlxyXG4gICAgICAgICAgPHN2Z1xyXG4gICAgICAgICAgICBjbGFzcz1cInBlY2ItcGFnaW5hdGlvbl9fZHJvcGRvd24taWNvblwiXHJcbiAgICAgICAgICAgIFtjbGFzcy5wZWNiLXBhZ2luYXRpb25fX2Ryb3Bkb3duLWljb24tLW9wZW5dPVwiaXNEcm9wZG93bk9wZW5cIlxyXG4gICAgICAgICAgICB3aWR0aD1cIjE2XCJcclxuICAgICAgICAgICAgaGVpZ2h0PVwiMTZcIlxyXG4gICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDE2IDE2XCJcclxuICAgICAgICAgICAgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICBkPVwiTTQgNkw4IDEwTDEyIDZcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXHJcbiAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMS41XCJcclxuICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8dWxcclxuICAgICAgICAgICpuZ0lmPVwiaXNEcm9wZG93bk9wZW5cIlxyXG4gICAgICAgICAgY2xhc3M9XCJwZWNiLXBhZ2luYXRpb25fX2Ryb3Bkb3duLW1lbnVcIlxyXG4gICAgICAgICAgcm9sZT1cImxpc3Rib3hcIlxyXG4gICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInU2VsZWN0IGl0ZW1zIHBlciBwYWdlJ1wiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPGxpXHJcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgcGFnZVNpemVPcHRpb25zXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJwZWNiLXBhZ2luYXRpb25fX2Ryb3Bkb3duLWl0ZW1cIlxyXG4gICAgICAgICAgICBbY2xhc3MucGVjYi1wYWdpbmF0aW9uX19kcm9wZG93bi1pdGVtLS1zZWxlY3RlZF09XCJvcHRpb24gPT09IHBhZ2VTaXplXCJcclxuICAgICAgICAgICAgcm9sZT1cIm9wdGlvblwiXHJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwib3B0aW9uID09PSBwYWdlU2l6ZVwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJvblBhZ2VTaXplQ2hhbmdlKG9wdGlvbilcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICB7eyBvcHRpb24gfX1cclxuICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgPC91bD5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPCEtLSBDb250cm9scyBzZWN0aW9uIC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJwZWNiLXBhZ2luYXRpb25fX2NvbnRyb2xzXCI+XHJcbiAgICA8IS0tIFByZXZpb3VzIGJ1dHRvbiAoVjEsIFYyLCBWMykgLS0+XHJcbiAgICA8YnV0dG9uXHJcbiAgICAgICpuZ0lmPVwidmFyaWFudCAhPT0gJ2NlbnRlcmVkJ1wiXHJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICBjbGFzcz1cInBlY2ItcGFnaW5hdGlvbl9fbmF2LWJ1dHRvbiBwZWNiLXBhZ2luYXRpb25fX25hdi1idXR0b24tLXByZXZcIlxyXG4gICAgICBbY2xhc3MucGVjYi1wYWdpbmF0aW9uX19uYXYtYnV0dG9uLS1ib3JkZXJlZF09XCJ2YXJpYW50ID09PSAnbWluaW1hbCdcIlxyXG4gICAgICBbZGlzYWJsZWRdPVwiIWNhbkdvUHJldmlvdXNcIlxyXG4gICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidHbyB0byBwcmV2aW91cyBwYWdlJ1wiXHJcbiAgICAgIChjbGljayk9XCJnb1RvUHJldmlvdXMoKVwiXHJcbiAgICA+XHJcbiAgICAgIDxzdmdcclxuICAgICAgICB3aWR0aD1cIjE2XCJcclxuICAgICAgICBoZWlnaHQ9XCIxNlwiXHJcbiAgICAgICAgdmlld0JveD1cIjAgMCAxNiAxNlwiXHJcbiAgICAgICAgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPHBhdGhcclxuICAgICAgICAgIGQ9XCJNMTAgMTJMNiA4TDEwIDRcIlxyXG4gICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcclxuICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjEuNVwiXHJcbiAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcclxuICAgICAgICAvPlxyXG4gICAgICA8L3N2Zz5cclxuICAgIDwvYnV0dG9uPlxyXG5cclxuICAgIDwhLS0gUGFnZSBudW1iZXJzIChWMSwgVjIpIC0tPlxyXG4gICAgPGRpdiAqbmdJZj1cInNob3dQYWdlc1wiIGNsYXNzPVwicGVjYi1wYWdpbmF0aW9uX19wYWdlc1wiIHJvbGU9XCJncm91cFwiIGFyaWEtbGFiZWw9XCJQYWdlIG5hdmlnYXRpb25cIj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcGFnZSBvZiB2aXNpYmxlUGFnZXM7IHRyYWNrQnk6IHRyYWNrQnlQYWdlXCI+XHJcbiAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgKm5nSWY9XCJpc051bWJlcihwYWdlKVwiXHJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgIGNsYXNzPVwicGVjYi1wYWdpbmF0aW9uX19wYWdlLWJ1dHRvblwiXHJcbiAgICAgICAgICBbY2xhc3MucGVjYi1wYWdpbmF0aW9uX19wYWdlLWJ1dHRvbi0tYWN0aXZlXT1cInBhZ2UgPT09IGN1cnJlbnRQYWdlXCJcclxuICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXHJcbiAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidQYWdlICcgKyBwYWdlXCJcclxuICAgICAgICAgIFthdHRyLmFyaWEtY3VycmVudF09XCJwYWdlID09PSBjdXJyZW50UGFnZSA/ICdwYWdlJyA6IG51bGxcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cImdvVG9QYWdlKCtwYWdlKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAge3sgcGFnZSB9fVxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAqbmdJZj1cIiFpc051bWJlcihwYWdlKVwiXHJcbiAgICAgICAgICBjbGFzcz1cInBlY2ItcGFnaW5hdGlvbl9fZWxsaXBzaXNcIlxyXG4gICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICB7eyBwYWdlIH19XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gTmV4dCBidXR0b24gKFYxLCBWMiwgVjMpIC0tPlxyXG4gICAgPGJ1dHRvblxyXG4gICAgICAqbmdJZj1cInZhcmlhbnQgIT09ICdjZW50ZXJlZCdcIlxyXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgY2xhc3M9XCJwZWNiLXBhZ2luYXRpb25fX25hdi1idXR0b24gcGVjYi1wYWdpbmF0aW9uX19uYXYtYnV0dG9uLS1uZXh0XCJcclxuICAgICAgW2NsYXNzLnBlY2ItcGFnaW5hdGlvbl9fbmF2LWJ1dHRvbi0tYm9yZGVyZWRdPVwidmFyaWFudCA9PT0gJ21pbmltYWwnXCJcclxuICAgICAgW2Rpc2FibGVkXT1cIiFjYW5Hb05leHRcIlxyXG4gICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidHbyB0byBuZXh0IHBhZ2UnXCJcclxuICAgICAgKGNsaWNrKT1cImdvVG9OZXh0KClcIlxyXG4gICAgPlxyXG4gICAgICA8c3ZnXHJcbiAgICAgICAgd2lkdGg9XCIxNlwiXHJcbiAgICAgICAgaGVpZ2h0PVwiMTZcIlxyXG4gICAgICAgIHZpZXdCb3g9XCIwIDAgMTYgMTZcIlxyXG4gICAgICAgIGZpbGw9XCJub25lXCJcclxuICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxwYXRoXHJcbiAgICAgICAgICBkPVwiTTYgNEwxMCA4TDYgMTJcIlxyXG4gICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcclxuICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjEuNVwiXHJcbiAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcclxuICAgICAgICAvPlxyXG4gICAgICA8L3N2Zz5cclxuICAgIDwvYnV0dG9uPlxyXG4gIDwvZGl2PlxyXG5cclxuICA8IS0tIFY0OiBDZW50ZXJlZCB2YXJpYW50IC0gbmV4dCBidXR0b24gb24gcmlnaHQgLS0+XHJcbiAgPGJ1dHRvblxyXG4gICAgKm5nSWY9XCJ2YXJpYW50ID09PSAnY2VudGVyZWQnXCJcclxuICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgY2xhc3M9XCJwZWNiLXBhZ2luYXRpb25fX25hdi1idXR0b24gcGVjYi1wYWdpbmF0aW9uX19uYXYtYnV0dG9uLS1uZXh0IHBlY2ItcGFnaW5hdGlvbl9fbmF2LWJ1dHRvbi0tYm9yZGVyZWRcIlxyXG4gICAgW2Rpc2FibGVkXT1cIiFjYW5Hb05leHRcIlxyXG4gICAgW2F0dHIuYXJpYS1sYWJlbF09XCInR28gdG8gbmV4dCBwYWdlJ1wiXHJcbiAgICAoY2xpY2spPVwiZ29Ub05leHQoKVwiXHJcbiAgPlxyXG4gICAgPHN2Z1xyXG4gICAgICB3aWR0aD1cIjE2XCJcclxuICAgICAgaGVpZ2h0PVwiMTZcIlxyXG4gICAgICB2aWV3Qm94PVwiMCAwIDE2IDE2XCJcclxuICAgICAgZmlsbD1cIm5vbmVcIlxyXG4gICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcclxuICAgID5cclxuICAgICAgPHBhdGhcclxuICAgICAgICBkPVwiTTYgNEwxMCA4TDYgMTJcIlxyXG4gICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXHJcbiAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMS41XCJcclxuICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXHJcbiAgICAgIC8+XHJcbiAgICA8L3N2Zz5cclxuICA8L2J1dHRvbj5cclxuPC9uYXY+XHJcbiJdfQ==
@@ -0,0 +1,147 @@
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 radio button 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
+ * <!-- Default variant with inner dot -->
14
+ * <pecb-radio
15
+ * label="Option 1"
16
+ * description="This is a description"
17
+ * [(ngModel)]="selectedValue"
18
+ * value="option1"
19
+ * ></pecb-radio>
20
+ *
21
+ * <!-- Filled variant -->
22
+ * <pecb-radio
23
+ * label="Option 1"
24
+ * variant="filled"
25
+ * [(ngModel)]="selectedValue"
26
+ * value="option1"
27
+ * ></pecb-radio>
28
+ * ```
29
+ *
30
+ * @publicApi
31
+ */
32
+ export class RadioComponent {
33
+ constructor(cdr) {
34
+ this.cdr = cdr;
35
+ /**
36
+ * Unique ID for the radio element
37
+ */
38
+ this.id = generateUniqueId('radio');
39
+ /**
40
+ * Visual variant of the radio button
41
+ */
42
+ this.variant = 'dot';
43
+ /**
44
+ * Position of the label relative to the radio control.
45
+ * 'right' (default): [radio] Title Description
46
+ * 'left': Title Description [radio]
47
+ */
48
+ this.labelPosition = 'right';
49
+ /**
50
+ * Whether the radio is disabled
51
+ */
52
+ this.disabled = false;
53
+ /**
54
+ * Event emitted when selection changes
55
+ */
56
+ this.selectionChange = new EventEmitter();
57
+ // Internal state
58
+ this.checked = false;
59
+ // ControlValueAccessor
60
+ this.onChange = () => { };
61
+ this.onTouched = () => { };
62
+ }
63
+ /**
64
+ * Get CSS classes for the radio wrapper
65
+ */
66
+ get wrapperClasses() {
67
+ return [
68
+ 'pecb-radio',
69
+ `pecb-radio--${this.variant}`,
70
+ this.disabled ? 'pecb-radio--disabled' : '',
71
+ this.checked ? 'pecb-radio--checked' : '',
72
+ this.labelPosition === 'left' ? 'pecb-radio--label-left' : ''
73
+ ].filter(Boolean);
74
+ }
75
+ /**
76
+ * Handle radio selection
77
+ */
78
+ onRadioChange(event) {
79
+ if (this.disabled)
80
+ return;
81
+ const checked = event.target.checked;
82
+ if (checked) {
83
+ this.checked = true;
84
+ this.onChange(this.value);
85
+ this.selectionChange.emit(this.value);
86
+ this.cdr.markForCheck();
87
+ }
88
+ }
89
+ /**
90
+ * Handle blur event
91
+ */
92
+ onBlur() {
93
+ this.onTouched();
94
+ }
95
+ // ControlValueAccessor implementation
96
+ writeValue(value) {
97
+ this.checked = value === this.value;
98
+ this.cdr.markForCheck();
99
+ }
100
+ registerOnChange(fn) {
101
+ this.onChange = fn;
102
+ }
103
+ registerOnTouched(fn) {
104
+ this.onTouched = fn;
105
+ }
106
+ setDisabledState(isDisabled) {
107
+ this.disabled = isDisabled;
108
+ this.cdr.markForCheck();
109
+ }
110
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: RadioComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
111
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: RadioComponent, isStandalone: true, selector: "pecb-radio", inputs: { id: "id", name: "name", value: "value", variant: "variant", label: "label", description: "description", labelPosition: "labelPosition", disabled: "disabled" }, outputs: { selectionChange: "selectionChange" }, providers: [
112
+ {
113
+ provide: NG_VALUE_ACCESSOR,
114
+ useExisting: forwardRef(() => RadioComponent),
115
+ multi: true
116
+ }
117
+ ], ngImport: i0, template: "<div [class]=\"wrapperClasses.join(' ')\">\r\n <label [attr.for]=\"id\" class=\"pecb-radio__label\">\r\n <input\r\n [id]=\"id\"\r\n type=\"radio\"\r\n class=\"pecb-radio__input\"\r\n [name]=\"name\"\r\n [value]=\"value\"\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)=\"onRadioChange($event)\"\r\n (blur)=\"onBlur()\"\r\n />\r\n <span *ngIf=\"labelPosition === 'left' && (label || description)\" class=\"pecb-radio__content\">\r\n <span *ngIf=\"label\" class=\"pecb-radio__text\">{{ label }}</span>\r\n <span *ngIf=\"description\" [id]=\"id + '-description'\" class=\"pecb-radio__description\">{{ description }}</span>\r\n </span>\r\n <span class=\"pecb-radio__control\"></span>\r\n <span *ngIf=\"labelPosition === 'right' && (label || description)\" class=\"pecb-radio__content\">\r\n <span *ngIf=\"label\" class=\"pecb-radio__text\">{{ label }}</span>\r\n <span *ngIf=\"description\" [id]=\"id + '-description'\" class=\"pecb-radio__description\">{{ description }}</span>\r\n </span>\r\n </label>\r\n</div>\r\n", styles: [".pecb-radio{position:relative;display:inline-block}.pecb-radio__label{display:flex;align-items:flex-start;cursor:pointer;-webkit-user-select:none;user-select:none;gap:12px}.pecb-radio__input{position:absolute;opacity:0;width:0;height:0;margin:0;padding:0;pointer-events:none}.pecb-radio__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:50%;background-color:#fff;transition-property:border-color,background-color;transition-duration:.25s ease-in-out;transition-timing-function:ease-in-out}.pecb-radio__control:after{content:\"\";position:absolute;width:10px;height:10px;border-radius:50%;background-color:#a11e29;opacity:0;transform:scale(0);transition-property:opacity,transform;transition-duration:.25s ease-in-out;transition-timing-function:ease-in-out}.pecb-radio__content{display:flex;flex-direction:column;gap:6px;flex:1}.pecb-radio__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-radio__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-radio:not(.pecb-radio--disabled) .pecb-radio__label:hover .pecb-radio__control{border-color:#a11e29}.pecb-radio__input:focus-visible+.pecb-radio__control{outline:2px solid #a11e29;outline-offset:2px}.pecb-radio--checked .pecb-radio__control{border-color:#a11e29}.pecb-radio--checked .pecb-radio__control:after{opacity:1;transform:scale(1)}.pecb-radio--filled .pecb-radio__control:after{content:\"\";position:absolute;left:50%;top:50%;width:4px;height:8px;border:solid transparent;border-width:0 2px 2px 0;transform:translate(-50%,-60%) rotate(45deg) scale(0);border-radius:0;background-color:transparent;transition-property:opacity,transform;transition-duration:.25s ease-in-out;transition-timing-function:ease-in-out}.pecb-radio--filled.pecb-radio--checked .pecb-radio__control{background-color:#212427;border-color:#212427}.pecb-radio--filled.pecb-radio--checked .pecb-radio__control:after{border-color:#fff;opacity:1;transform:translate(-50%,-60%) rotate(45deg) scale(1)}.pecb-radio--filled.pecb-radio--disabled.pecb-radio--checked .pecb-radio__control{background-color:#c2c2c2;border-color:#c2c2c2}.pecb-radio--filled.pecb-radio--disabled.pecb-radio--checked .pecb-radio__control:after{border-color:#fff}.pecb-radio--disabled .pecb-radio__label{cursor:not-allowed}.pecb-radio--disabled .pecb-radio__control{border-color:#ececec;background-color:#f4f4f4}.pecb-radio--disabled .pecb-radio__control:after{background-color:#c2c2c2}.pecb-radio--disabled .pecb-radio__text{color:#c2c2c2}.pecb-radio--disabled .pecb-radio__description{color:#ececec}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
118
+ }
119
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: RadioComponent, decorators: [{
120
+ type: Component,
121
+ args: [{ selector: 'pecb-radio', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, providers: [
122
+ {
123
+ provide: NG_VALUE_ACCESSOR,
124
+ useExisting: forwardRef(() => RadioComponent),
125
+ multi: true
126
+ }
127
+ ], template: "<div [class]=\"wrapperClasses.join(' ')\">\r\n <label [attr.for]=\"id\" class=\"pecb-radio__label\">\r\n <input\r\n [id]=\"id\"\r\n type=\"radio\"\r\n class=\"pecb-radio__input\"\r\n [name]=\"name\"\r\n [value]=\"value\"\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)=\"onRadioChange($event)\"\r\n (blur)=\"onBlur()\"\r\n />\r\n <span *ngIf=\"labelPosition === 'left' && (label || description)\" class=\"pecb-radio__content\">\r\n <span *ngIf=\"label\" class=\"pecb-radio__text\">{{ label }}</span>\r\n <span *ngIf=\"description\" [id]=\"id + '-description'\" class=\"pecb-radio__description\">{{ description }}</span>\r\n </span>\r\n <span class=\"pecb-radio__control\"></span>\r\n <span *ngIf=\"labelPosition === 'right' && (label || description)\" class=\"pecb-radio__content\">\r\n <span *ngIf=\"label\" class=\"pecb-radio__text\">{{ label }}</span>\r\n <span *ngIf=\"description\" [id]=\"id + '-description'\" class=\"pecb-radio__description\">{{ description }}</span>\r\n </span>\r\n </label>\r\n</div>\r\n", styles: [".pecb-radio{position:relative;display:inline-block}.pecb-radio__label{display:flex;align-items:flex-start;cursor:pointer;-webkit-user-select:none;user-select:none;gap:12px}.pecb-radio__input{position:absolute;opacity:0;width:0;height:0;margin:0;padding:0;pointer-events:none}.pecb-radio__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:50%;background-color:#fff;transition-property:border-color,background-color;transition-duration:.25s ease-in-out;transition-timing-function:ease-in-out}.pecb-radio__control:after{content:\"\";position:absolute;width:10px;height:10px;border-radius:50%;background-color:#a11e29;opacity:0;transform:scale(0);transition-property:opacity,transform;transition-duration:.25s ease-in-out;transition-timing-function:ease-in-out}.pecb-radio__content{display:flex;flex-direction:column;gap:6px;flex:1}.pecb-radio__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-radio__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-radio:not(.pecb-radio--disabled) .pecb-radio__label:hover .pecb-radio__control{border-color:#a11e29}.pecb-radio__input:focus-visible+.pecb-radio__control{outline:2px solid #a11e29;outline-offset:2px}.pecb-radio--checked .pecb-radio__control{border-color:#a11e29}.pecb-radio--checked .pecb-radio__control:after{opacity:1;transform:scale(1)}.pecb-radio--filled .pecb-radio__control:after{content:\"\";position:absolute;left:50%;top:50%;width:4px;height:8px;border:solid transparent;border-width:0 2px 2px 0;transform:translate(-50%,-60%) rotate(45deg) scale(0);border-radius:0;background-color:transparent;transition-property:opacity,transform;transition-duration:.25s ease-in-out;transition-timing-function:ease-in-out}.pecb-radio--filled.pecb-radio--checked .pecb-radio__control{background-color:#212427;border-color:#212427}.pecb-radio--filled.pecb-radio--checked .pecb-radio__control:after{border-color:#fff;opacity:1;transform:translate(-50%,-60%) rotate(45deg) scale(1)}.pecb-radio--filled.pecb-radio--disabled.pecb-radio--checked .pecb-radio__control{background-color:#c2c2c2;border-color:#c2c2c2}.pecb-radio--filled.pecb-radio--disabled.pecb-radio--checked .pecb-radio__control:after{border-color:#fff}.pecb-radio--disabled .pecb-radio__label{cursor:not-allowed}.pecb-radio--disabled .pecb-radio__control{border-color:#ececec;background-color:#f4f4f4}.pecb-radio--disabled .pecb-radio__control:after{background-color:#c2c2c2}.pecb-radio--disabled .pecb-radio__text{color:#c2c2c2}.pecb-radio--disabled .pecb-radio__description{color:#ececec}\n"] }]
128
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { id: [{
129
+ type: Input
130
+ }], name: [{
131
+ type: Input
132
+ }], value: [{
133
+ type: Input
134
+ }], variant: [{
135
+ type: Input
136
+ }], label: [{
137
+ type: Input
138
+ }], description: [{
139
+ type: Input
140
+ }], labelPosition: [{
141
+ type: Input
142
+ }], disabled: [{
143
+ type: Input
144
+ }], selectionChange: [{
145
+ type: Output
146
+ }] } });
147
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFkaW8uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWktY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvcmFkaW8vcmFkaW8uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWktY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvcmFkaW8vcmFkaW8uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWix1QkFBdUIsRUFDdkIsVUFBVSxFQUVYLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sOEJBQThCLENBQUM7OztBQUtoRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0JHO0FBZ0JILE1BQU0sT0FBTyxjQUFjO0lBdUR6QixZQUFvQixHQUFzQjtRQUF0QixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQXREMUM7O1dBRUc7UUFDTSxPQUFFLEdBQVcsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFZaEQ7O1dBRUc7UUFDTSxZQUFPLEdBQWlCLEtBQUssQ0FBQztRQVl2Qzs7OztXQUlHO1FBQ00sa0JBQWEsR0FBdUIsT0FBTyxDQUFDO1FBRXJEOztXQUVHO1FBQ00sYUFBUSxHQUFHLEtBQUssQ0FBQztRQUUxQjs7V0FFRztRQUNPLG9CQUFlLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQUV4RCxpQkFBaUI7UUFDakIsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUVoQix1QkFBdUI7UUFDZixhQUFRLEdBQTZCLEdBQUcsRUFBRSxHQUFF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ICBDb21wb25lbnQsXHJcbiAgSW5wdXQsXHJcbiAgT3V0cHV0LFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcclxuICBmb3J3YXJkUmVmLFxyXG4gIENoYW5nZURldGVjdG9yUmVmXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgZ2VuZXJhdGVVbmlxdWVJZCB9IGZyb20gJy4uLy4uL3NoYXJlZC91dGlscy9kb20udXRpbHMnO1xyXG5cclxuZXhwb3J0IHR5cGUgUmFkaW9WYXJpYW50ID0gJ2RvdCcgfCAnZmlsbGVkJztcclxuZXhwb3J0IHR5cGUgUmFkaW9MYWJlbFBvc2l0aW9uID0gJ3JpZ2h0JyB8ICdsZWZ0JztcclxuXHJcbi8qKlxyXG4gKiBBIHByb2Zlc3Npb25hbCByYWRpbyBidXR0b24gY29tcG9uZW50IHdpdGggbGFiZWwgYW5kIGRlc2NyaXB0aW9uIHN1cHBvcnQuXHJcbiAqIEZ1bGx5IGFjY2Vzc2libGUgd2l0aCBXQ0FHIDIuMSBBQSBjb21wbGlhbmNlIGFuZCByZWFjdGl2ZSBmb3JtcyBzdXBwb3J0LlxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGBodG1sXHJcbiAqIDwhLS0gRGVmYXVsdCB2YXJpYW50IHdpdGggaW5uZXIgZG90IC0tPlxyXG4gKiA8cGVjYi1yYWRpb1xyXG4gKiAgIGxhYmVsPVwiT3B0aW9uIDFcIlxyXG4gKiAgIGRlc2NyaXB0aW9uPVwiVGhpcyBpcyBhIGRlc2NyaXB0aW9uXCJcclxuICogICBbKG5nTW9kZWwpXT1cInNlbGVjdGVkVmFsdWVcIlxyXG4gKiAgIHZhbHVlPVwib3B0aW9uMVwiXHJcbiAqID48L3BlY2ItcmFkaW8+XHJcbiAqXHJcbiAqIDwhLS0gRmlsbGVkIHZhcmlhbnQgLS0+XHJcbiAqIDxwZWNiLXJhZGlvXHJcbiAqICAgbGFiZWw9XCJPcHRpb24gMVwiXHJcbiAqICAgdmFyaWFudD1cImZpbGxlZFwiXHJcbiAqICAgWyhuZ01vZGVsKV09XCJzZWxlY3RlZFZhbHVlXCJcclxuICogICB2YWx1ZT1cIm9wdGlvbjFcIlxyXG4gKiA+PC9wZWNiLXJhZGlvPlxyXG4gKiBgYGBcclxuICpcclxuICogQHB1YmxpY0FwaVxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdwZWNiLXJhZGlvJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9yYWRpby5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vcmFkaW8uY29tcG9uZW50LnNjc3MnXSxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxuICBwcm92aWRlcnM6IFtcclxuICAgIHtcclxuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFJhZGlvQ29tcG9uZW50KSxcclxuICAgICAgbXVsdGk6IHRydWVcclxuICAgIH1cclxuICBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBSYWRpb0NvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcclxuICAvKipcclxuICAgKiBVbmlxdWUgSUQgZm9yIHRoZSByYWRpbyBlbGVtZW50XHJcbiAgICovXHJcbiAgQElucHV0KCkgaWQ6IHN0cmluZyA9IGdlbmVyYXRlVW5pcXVlSWQoJ3JhZGlvJyk7XHJcblxyXG4gIC8qKlxyXG4gICAqIE5hbWUgYXR0cmlidXRlIGZvciB0aGUgcmFkaW8gZ3JvdXBcclxuICAgKi9cclxuICBASW5wdXQoKSBuYW1lPzogc3RyaW5nO1xyXG5cclxuICAvKipcclxuICAgKiBWYWx1ZSBvZiB0aGlzIHJhZGlvIGJ1dHRvblxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHZhbHVlOiB1bmtub3duO1xyXG5cclxuICAvKipcclxuICAgKiBWaXN1YWwgdmFyaWFudCBvZiB0aGUgcmFkaW8gYnV0dG9uXHJcbiAgICovXHJcbiAgQElucHV0KCkgdmFyaWFudDogUmFkaW9WYXJpYW50ID0gJ2RvdCc7XHJcblxyXG4gIC8qKlxyXG4gICAqIExhYmVsIHRleHQgdG8gZGlzcGxheVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGxhYmVsPzogc3RyaW5nO1xyXG5cclxuICAvKipcclxuICAgKiBEZXNjcmlwdGlvbiB0ZXh0IHRvIGRpc3BsYXkgYmVsb3cgbGFiZWxcclxuICAgKi9cclxuICBASW5wdXQoKSBkZXNjcmlwdGlvbj86IHN0cmluZztcclxuXHJcbiAgLyoqXHJcbiAgICogUG9zaXRpb24gb2YgdGhlIGxhYmVsIHJlbGF0aXZlIHRvIHRoZSByYWRpbyBjb250cm9sLlxyXG4gICAqICdyaWdodCcgKGRlZmF1bHQpOiBbcmFkaW9dIFRpdGxlIERlc2NyaXB0aW9uXHJcbiAgICogJ2xlZnQnOiBUaXRsZSBEZXNjcmlwdGlvbiBbcmFkaW9dXHJcbiAgICovXHJcbiAgQElucHV0KCkgbGFiZWxQb3NpdGlvbjogUmFkaW9MYWJlbFBvc2l0aW9uID0gJ3JpZ2h0JztcclxuXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciB0aGUgcmFkaW8gaXMgZGlzYWJsZWRcclxuICAgKi9cclxuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xyXG5cclxuICAvKipcclxuICAgKiBFdmVudCBlbWl0dGVkIHdoZW4gc2VsZWN0aW9uIGNoYW5nZXNcclxuICAgKi9cclxuICBAT3V0cHV0KCkgc2VsZWN0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjx1bmtub3duPigpO1xyXG5cclxuICAvLyBJbnRlcm5hbCBzdGF0ZVxyXG4gIGNoZWNrZWQgPSBmYWxzZTtcclxuXHJcbiAgLy8gQ29udHJvbFZhbHVlQWNjZXNzb3JcclxuICBwcml2YXRlIG9uQ2hhbmdlOiAodmFsdWU6IHVua25vd24pID0+IHZvaWQgPSAoKSA9PiB7fTtcclxuICBwcml2YXRlIG9uVG91Y2hlZDogKCkgPT4gdm9pZCA9ICgpID0+IHt9O1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBDU1MgY2xhc3NlcyBmb3IgdGhlIHJhZGlvIHdyYXBwZXJcclxuICAgKi9cclxuICBnZXQgd3JhcHBlckNsYXNzZXMoKTogc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuIFtcclxuICAgICAgJ3BlY2ItcmFkaW8nLFxyXG4gICAgICBgcGVjYi1yYWRpby0tJHt0aGlzLnZhcmlhbnR9YCxcclxuICAgICAgdGhpcy5kaXNhYmxlZCA/ICdwZWNiLXJhZGlvLS1kaXNhYmxlZCcgOiAnJyxcclxuICAgICAgdGhpcy5jaGVja2VkID8gJ3BlY2ItcmFkaW8tLWNoZWNrZWQnIDogJycsXHJcbiAgICAgIHRoaXMubGFiZWxQb3NpdGlvbiA9PT0gJ2xlZnQnID8gJ3BlY2ItcmFkaW8tLWxhYmVsLWxlZnQnIDogJydcclxuICAgIF0uZmlsdGVyKEJvb2xlYW4pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlIHJhZGlvIHNlbGVjdGlvblxyXG4gICAqL1xyXG4gIG9uUmFkaW9DaGFuZ2UoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGNoZWNrZWQgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLmNoZWNrZWQ7XHJcbiAgICBpZiAoY2hlY2tlZCkge1xyXG4gICAgICB0aGlzLmNoZWNrZWQgPSB0cnVlO1xyXG4gICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudmFsdWUpO1xyXG4gICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KHRoaXMudmFsdWUpO1xyXG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZSBibHVyIGV2ZW50XHJcbiAgICovXHJcbiAgb25CbHVyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5vblRvdWNoZWQoKTtcclxuICB9XHJcblxyXG4gIC8vIENvbnRyb2xWYWx1ZUFjY2Vzc29yIGltcGxlbWVudGF0aW9uXHJcbiAgd3JpdGVWYWx1ZSh2YWx1ZTogdW5rbm93bik6IHZvaWQge1xyXG4gICAgdGhpcy5jaGVja2VkID0gdmFsdWUgPT09IHRoaXMudmFsdWU7XHJcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICh2YWx1ZTogdW5rbm93bikgPT4gdm9pZCk6IHZvaWQge1xyXG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XHJcbiAgfVxyXG5cclxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xyXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgW2NsYXNzXT1cIndyYXBwZXJDbGFzc2VzLmpvaW4oJyAnKVwiPlxyXG4gIDxsYWJlbCBbYXR0ci5mb3JdPVwiaWRcIiBjbGFzcz1cInBlY2ItcmFkaW9fX2xhYmVsXCI+XHJcbiAgICA8aW5wdXRcclxuICAgICAgW2lkXT1cImlkXCJcclxuICAgICAgdHlwZT1cInJhZGlvXCJcclxuICAgICAgY2xhc3M9XCJwZWNiLXJhZGlvX19pbnB1dFwiXHJcbiAgICAgIFtuYW1lXT1cIm5hbWVcIlxyXG4gICAgICBbdmFsdWVdPVwidmFsdWVcIlxyXG4gICAgICBbY2hlY2tlZF09XCJjaGVja2VkXCJcclxuICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcclxuICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJsYWJlbFwiXHJcbiAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwiZGVzY3JpcHRpb24gPyBpZCArICctZGVzY3JpcHRpb24nIDogbnVsbFwiXHJcbiAgICAgIChjaGFuZ2UpPVwib25SYWRpb0NoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgKGJsdXIpPVwib25CbHVyKClcIlxyXG4gICAgLz5cclxuICAgIDxzcGFuICpuZ0lmPVwibGFiZWxQb3NpdGlvbiA9PT0gJ2xlZnQnICYmIChsYWJlbCB8fCBkZXNjcmlwdGlvbilcIiBjbGFzcz1cInBlY2ItcmFkaW9fX2NvbnRlbnRcIj5cclxuICAgICAgPHNwYW4gKm5nSWY9XCJsYWJlbFwiIGNsYXNzPVwicGVjYi1yYWRpb19fdGV4dFwiPnt7IGxhYmVsIH19PC9zcGFuPlxyXG4gICAgICA8c3BhbiAqbmdJZj1cImRlc2NyaXB0aW9uXCIgW2lkXT1cImlkICsgJy1kZXNjcmlwdGlvbidcIiBjbGFzcz1cInBlY2ItcmFkaW9fX2Rlc2NyaXB0aW9uXCI+e3sgZGVzY3JpcHRpb24gfX08L3NwYW4+XHJcbiAgICA8L3NwYW4+XHJcbiAgICA8c3BhbiBjbGFzcz1cInBlY2ItcmFkaW9fX2NvbnRyb2xcIj48L3NwYW4+XHJcbiAgICA8c3BhbiAqbmdJZj1cImxhYmVsUG9zaXRpb24gPT09ICdyaWdodCcgJiYgKGxhYmVsIHx8IGRlc2NyaXB0aW9uKVwiIGNsYXNzPVwicGVjYi1yYWRpb19fY29udGVudFwiPlxyXG4gICAgICA8c3BhbiAqbmdJZj1cImxhYmVsXCIgY2xhc3M9XCJwZWNiLXJhZGlvX190ZXh0XCI+e3sgbGFiZWwgfX08L3NwYW4+XHJcbiAgICAgIDxzcGFuICpuZ0lmPVwiZGVzY3JpcHRpb25cIiBbaWRdPVwiaWQgKyAnLWRlc2NyaXB0aW9uJ1wiIGNsYXNzPVwicGVjYi1yYWRpb19fZGVzY3JpcHRpb25cIj57eyBkZXNjcmlwdGlvbiB9fTwvc3Bhbj5cclxuICAgIDwvc3Bhbj5cclxuICA8L2xhYmVsPlxyXG48L2Rpdj5cclxuIl19