@pecb-ui/components 1.1.2 → 1.2.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.
- package/README.md +556 -556
- package/fesm2022/pecb-ui-components.mjs +3826 -1945
- package/fesm2022/pecb-ui-components.mjs.map +1 -1
- package/index.d.ts +3937 -3
- package/package.json +6 -8
- package/esm2022/lib/components/button/button.component.mjs +0 -171
- package/esm2022/lib/components/card/card.component.mjs +0 -182
- package/esm2022/lib/components/checkbox/checkbox.component.mjs +0 -126
- package/esm2022/lib/components/datepicker/datepicker.component.mjs +0 -349
- package/esm2022/lib/components/dropdown/dropdown.component.mjs +0 -329
- package/esm2022/lib/components/input/input.component.mjs +0 -321
- package/esm2022/lib/components/pagination/pagination.component.mjs +0 -197
- package/esm2022/lib/components/radio/radio.component.mjs +0 -147
- package/esm2022/lib/components/right-modal/right-modal.component.mjs +0 -234
- package/esm2022/lib/components/sidebar/sidebar.component.mjs +0 -155
- package/esm2022/lib/components/status/status.component.mjs +0 -50
- package/esm2022/lib/components/tab/tab.component.mjs +0 -151
- package/esm2022/lib/components/table/table.component.mjs +0 -503
- package/esm2022/lib/components/toggle/toggle.component.mjs +0 -126
- package/esm2022/lib/pecb-components.module.mjs +0 -118
- package/esm2022/lib/services/loading.service.mjs +0 -182
- package/esm2022/lib/services/notification.service.mjs +0 -144
- package/esm2022/lib/services/theme.service.mjs +0 -232
- package/esm2022/lib/shared/interfaces/component.interfaces.mjs +0 -2
- package/esm2022/lib/shared/types/common.types.mjs +0 -6
- package/esm2022/lib/shared/utils/accessibility.utils.mjs +0 -223
- package/esm2022/lib/shared/utils/dom.utils.mjs +0 -240
- package/esm2022/lib/shared/utils/error.utils.mjs +0 -277
- package/esm2022/lib/shared/utils/string.utils.mjs +0 -204
- package/esm2022/pecb-ui-components.mjs +0 -5
- package/esm2022/public-api.mjs +0 -53
- package/lib/components/button/button.component.d.ts +0 -130
- package/lib/components/card/card.component.d.ts +0 -140
- package/lib/components/checkbox/checkbox.component.d.ts +0 -74
- package/lib/components/datepicker/datepicker.component.d.ts +0 -155
- package/lib/components/dropdown/dropdown.component.d.ts +0 -144
- package/lib/components/input/input.component.d.ts +0 -215
- package/lib/components/pagination/pagination.component.d.ts +0 -53
- package/lib/components/radio/radio.component.d.ts +0 -93
- package/lib/components/right-modal/right-modal.component.d.ts +0 -137
- package/lib/components/sidebar/sidebar.component.d.ts +0 -97
- package/lib/components/status/status.component.d.ts +0 -19
- package/lib/components/tab/tab.component.d.ts +0 -102
- package/lib/components/table/table.component.d.ts +0 -403
- package/lib/components/toggle/toggle.component.d.ts +0 -74
- package/lib/pecb-components.module.d.ts +0 -37
- package/lib/services/loading.service.d.ts +0 -129
- package/lib/services/notification.service.d.ts +0 -136
- package/lib/services/theme.service.d.ts +0 -142
- package/lib/shared/interfaces/component.interfaces.d.ts +0 -283
- package/lib/shared/types/common.types.d.ts +0 -86
- package/lib/shared/utils/accessibility.utils.d.ts +0 -167
- package/lib/shared/utils/dom.utils.d.ts +0 -108
- package/lib/shared/utils/error.utils.d.ts +0 -191
- package/lib/shared/utils/string.utils.d.ts +0 -144
- package/public-api.d.ts +0 -24
|
@@ -1,197 +0,0 @@
|
|
|
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==
|
|
@@ -1,147 +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 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
|