@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.
Files changed (56) hide show
  1. package/README.md +556 -556
  2. package/fesm2022/pecb-ui-components.mjs +3826 -1945
  3. package/fesm2022/pecb-ui-components.mjs.map +1 -1
  4. package/index.d.ts +3937 -3
  5. package/package.json +6 -8
  6. package/esm2022/lib/components/button/button.component.mjs +0 -171
  7. package/esm2022/lib/components/card/card.component.mjs +0 -182
  8. package/esm2022/lib/components/checkbox/checkbox.component.mjs +0 -126
  9. package/esm2022/lib/components/datepicker/datepicker.component.mjs +0 -349
  10. package/esm2022/lib/components/dropdown/dropdown.component.mjs +0 -329
  11. package/esm2022/lib/components/input/input.component.mjs +0 -321
  12. package/esm2022/lib/components/pagination/pagination.component.mjs +0 -197
  13. package/esm2022/lib/components/radio/radio.component.mjs +0 -147
  14. package/esm2022/lib/components/right-modal/right-modal.component.mjs +0 -234
  15. package/esm2022/lib/components/sidebar/sidebar.component.mjs +0 -155
  16. package/esm2022/lib/components/status/status.component.mjs +0 -50
  17. package/esm2022/lib/components/tab/tab.component.mjs +0 -151
  18. package/esm2022/lib/components/table/table.component.mjs +0 -503
  19. package/esm2022/lib/components/toggle/toggle.component.mjs +0 -126
  20. package/esm2022/lib/pecb-components.module.mjs +0 -118
  21. package/esm2022/lib/services/loading.service.mjs +0 -182
  22. package/esm2022/lib/services/notification.service.mjs +0 -144
  23. package/esm2022/lib/services/theme.service.mjs +0 -232
  24. package/esm2022/lib/shared/interfaces/component.interfaces.mjs +0 -2
  25. package/esm2022/lib/shared/types/common.types.mjs +0 -6
  26. package/esm2022/lib/shared/utils/accessibility.utils.mjs +0 -223
  27. package/esm2022/lib/shared/utils/dom.utils.mjs +0 -240
  28. package/esm2022/lib/shared/utils/error.utils.mjs +0 -277
  29. package/esm2022/lib/shared/utils/string.utils.mjs +0 -204
  30. package/esm2022/pecb-ui-components.mjs +0 -5
  31. package/esm2022/public-api.mjs +0 -53
  32. package/lib/components/button/button.component.d.ts +0 -130
  33. package/lib/components/card/card.component.d.ts +0 -140
  34. package/lib/components/checkbox/checkbox.component.d.ts +0 -74
  35. package/lib/components/datepicker/datepicker.component.d.ts +0 -155
  36. package/lib/components/dropdown/dropdown.component.d.ts +0 -144
  37. package/lib/components/input/input.component.d.ts +0 -215
  38. package/lib/components/pagination/pagination.component.d.ts +0 -53
  39. package/lib/components/radio/radio.component.d.ts +0 -93
  40. package/lib/components/right-modal/right-modal.component.d.ts +0 -137
  41. package/lib/components/sidebar/sidebar.component.d.ts +0 -97
  42. package/lib/components/status/status.component.d.ts +0 -19
  43. package/lib/components/tab/tab.component.d.ts +0 -102
  44. package/lib/components/table/table.component.d.ts +0 -403
  45. package/lib/components/toggle/toggle.component.d.ts +0 -74
  46. package/lib/pecb-components.module.d.ts +0 -37
  47. package/lib/services/loading.service.d.ts +0 -129
  48. package/lib/services/notification.service.d.ts +0 -136
  49. package/lib/services/theme.service.d.ts +0 -142
  50. package/lib/shared/interfaces/component.interfaces.d.ts +0 -283
  51. package/lib/shared/types/common.types.d.ts +0 -86
  52. package/lib/shared/utils/accessibility.utils.d.ts +0 -167
  53. package/lib/shared/utils/dom.utils.d.ts +0 -108
  54. package/lib/shared/utils/error.utils.d.ts +0 -191
  55. package/lib/shared/utils/string.utils.d.ts +0 -144
  56. package/public-api.d.ts +0 -24
@@ -1,234 +0,0 @@
1
- import { Component, Directive, Input, Output, EventEmitter, ChangeDetectionStrategy, ViewChild } from '@angular/core';
2
- import { CommonModule } from '@angular/common';
3
- import { generateUniqueId, trapFocus, disableBodyScroll } from '../../shared/utils/dom.utils';
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "@angular/common";
6
- /**
7
- * A right-side sliding modal/drawer component.
8
- * Slides in from the right edge of the screen with backdrop overlay.
9
- * Fully accessible with WCAG 2.1 AA compliance.
10
- *
11
- * @example
12
- * ```html
13
- * <pecb-right-modal
14
- * [isOpen]="isModalOpen"
15
- * (closed)="onModalClose()"
16
- * ariaLabel="Exam Details"
17
- * >
18
- * <div pecbRightModalHeader>
19
- * <h2>Exam Details</h2>
20
- * </div>
21
- * <div pecbRightModalContent>
22
- * <p>Modal content goes here</p>
23
- * </div>
24
- * <div pecbRightModalFooter>
25
- * <button>Action</button>
26
- * </div>
27
- * </pecb-right-modal>
28
- * ```
29
- *
30
- * @publicApi
31
- */
32
- export class RightModalComponent {
33
- constructor() {
34
- /**
35
- * Unique ID for the modal element
36
- */
37
- this.id = generateUniqueId('right-modal');
38
- /**
39
- * Whether the modal is open
40
- */
41
- this.isOpen = false;
42
- /**
43
- * Size of the modal panel
44
- */
45
- this.size = 'md';
46
- /**
47
- * Whether clicking the backdrop closes the modal
48
- */
49
- this.closeOnBackdropClick = true;
50
- /**
51
- * Whether pressing Escape closes the modal
52
- */
53
- this.closeOnEscape = true;
54
- /**
55
- * Whether to show the close button
56
- */
57
- this.showCloseButton = true;
58
- /**
59
- * Emitted when the modal is closed
60
- */
61
- this.closed = new EventEmitter();
62
- /**
63
- * Emitted when the modal is opened
64
- */
65
- this.opened = new EventEmitter();
66
- this.cleanupFocusTrap = null;
67
- this.cleanupBodyScroll = null;
68
- this.previousActiveElement = null;
69
- }
70
- ngOnInit() {
71
- if (this.isOpen) {
72
- this.onOpen();
73
- }
74
- }
75
- ngAfterViewInit() {
76
- if (this.isOpen && this.modalPanel) {
77
- this.setupFocusTrap();
78
- }
79
- }
80
- ngOnDestroy() {
81
- this.cleanup();
82
- }
83
- /**
84
- * Get CSS classes for the modal container
85
- */
86
- get modalClasses() {
87
- return [
88
- 'pecb-right-modal',
89
- this.isOpen ? 'pecb-right-modal--open' : ''
90
- ].filter(Boolean);
91
- }
92
- /**
93
- * Get CSS classes for the modal panel
94
- */
95
- get panelClasses() {
96
- return [
97
- 'pecb-right-modal__panel',
98
- `pecb-right-modal__panel--${this.size}`
99
- ];
100
- }
101
- /**
102
- * Handle backdrop click
103
- */
104
- onBackdropClick(event) {
105
- if (this.closeOnBackdropClick && event.target === event.currentTarget) {
106
- this.close();
107
- }
108
- }
109
- /**
110
- * Handle keyboard events
111
- */
112
- onKeydown(event) {
113
- if (this.closeOnEscape && event.key === 'Escape') {
114
- event.preventDefault();
115
- this.close();
116
- }
117
- }
118
- /**
119
- * Close the modal
120
- */
121
- close() {
122
- this.cleanup();
123
- this.closed.emit();
124
- }
125
- /**
126
- * Called when modal opens
127
- */
128
- onOpen() {
129
- this.previousActiveElement = document.activeElement;
130
- this.cleanupBodyScroll = disableBodyScroll();
131
- this.opened.emit();
132
- }
133
- /**
134
- * Setup focus trap after view is ready
135
- */
136
- setupFocusTrap() {
137
- if (this.modalPanel?.nativeElement) {
138
- this.cleanupFocusTrap = trapFocus(this.modalPanel.nativeElement);
139
- }
140
- }
141
- /**
142
- * Cleanup resources
143
- */
144
- cleanup() {
145
- if (this.cleanupFocusTrap) {
146
- this.cleanupFocusTrap();
147
- this.cleanupFocusTrap = null;
148
- }
149
- if (this.cleanupBodyScroll) {
150
- this.cleanupBodyScroll();
151
- this.cleanupBodyScroll = null;
152
- }
153
- if (this.previousActiveElement instanceof HTMLElement) {
154
- this.previousActiveElement.focus();
155
- }
156
- }
157
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: RightModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
158
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: RightModalComponent, isStandalone: true, selector: "pecb-right-modal", inputs: { id: "id", isOpen: "isOpen", size: "size", closeOnBackdropClick: "closeOnBackdropClick", closeOnEscape: "closeOnEscape", showCloseButton: "showCloseButton", ariaLabel: "ariaLabel", ariaLabelledBy: "ariaLabelledBy", ariaDescribedBy: "ariaDescribedBy" }, outputs: { closed: "closed", opened: "opened" }, viewQueries: [{ propertyName: "modalPanel", first: true, predicate: ["modalPanel"], descendants: true }], ngImport: i0, template: "<div\r\n *ngIf=\"isOpen\"\r\n [id]=\"id\"\r\n [class]=\"modalClasses.join(' ')\"\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n [attr.aria-label]=\"ariaLabel\"\r\n [attr.aria-labelledby]=\"ariaLabelledBy\"\r\n [attr.aria-describedby]=\"ariaDescribedBy\"\r\n (click)=\"onBackdropClick($event)\"\r\n (keydown)=\"onKeydown($event)\"\r\n>\r\n <div\r\n #modalPanel\r\n [class]=\"panelClasses.join(' ')\"\r\n tabindex=\"-1\"\r\n >\r\n <button\r\n *ngIf=\"showCloseButton\"\r\n type=\"button\"\r\n class=\"pecb-right-modal__close-btn\"\r\n aria-label=\"Close modal\"\r\n (click)=\"close()\"\r\n >\r\n <svg\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n aria-hidden=\"true\"\r\n >\r\n <path\r\n d=\"M18 6L6 18M6 6L18 18\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n\r\n <ng-content select=\"[pecbRightModalHeader]\"></ng-content>\r\n <ng-content select=\"[pecbRightModalContent]\"></ng-content>\r\n <ng-content></ng-content>\r\n <ng-content select=\"[pecbRightModalFooter]\"></ng-content>\r\n </div>\r\n</div>\r\n", styles: [".pecb-right-modal{position:fixed;inset:0;z-index:1050;display:flex;justify-content:flex-end;background-color:#00000080;animation:fadeIn .15s ease-in-out forwards}.pecb-right-modal--open .pecb-right-modal__panel{animation:slideInRight .25s ease-in-out forwards}.pecb-right-modal__panel{position:relative;display:inline-flex;min-width:516.23px;max-width:90vw;height:100%;padding:24px;flex-direction:column;align-items:flex-start;gap:16px;border-radius:24px 0 0 24px;background:#fff;box-shadow:0 5px 16px -4px #10182826;overflow-y:auto}.pecb-right-modal__panel::-webkit-scrollbar{width:8px;height:8px}.pecb-right-modal__panel::-webkit-scrollbar-track{background:#ececec}.pecb-right-modal__panel::-webkit-scrollbar-thumb{background:#c2c2c2;border-radius:12px}.pecb-right-modal__panel::-webkit-scrollbar-thumb:hover{background:#a9a9a9}.pecb-right-modal__panel--sm{min-width:400px}.pecb-right-modal__panel--md{min-width:516.23px}.pecb-right-modal__panel--lg{min-width:700px}.pecb-right-modal__close-btn{padding:0;border:none;background:none;cursor:pointer;font:inherit;color:inherit;position:absolute;top:24px;right:24px;display:flex;align-items:center;justify-content:center;width:24px;height:24px;color:#616161;border-radius:6px;transition-property:color,background-color;transition-duration:.25s ease-in-out;transition-timing-function:ease-in-out}.pecb-right-modal__close-btn:focus{outline:none}.pecb-right-modal__close-btn:focus-visible{outline:2px solid #a11e29;outline-offset:2px}.pecb-right-modal__close-btn:hover{color:#313131;background-color:#ececec}.pecb-right-modal__close-btn svg{width:20px;height:20px}.pecb-right-modal__header{width:100%;padding-right:32px}.pecb-right-modal__content{flex:1;width:100%;overflow-y:auto}.pecb-right-modal__content::-webkit-scrollbar{width:8px;height:8px}.pecb-right-modal__content::-webkit-scrollbar-track{background:#ececec}.pecb-right-modal__content::-webkit-scrollbar-thumb{background:#c2c2c2;border-radius:12px}.pecb-right-modal__content::-webkit-scrollbar-thumb:hover{background:#a9a9a9}.pecb-right-modal__footer{width:100%;margin-top:auto}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes slideInRight{0%{transform:translate(100%)}to{transform:translate(0)}}@media (prefers-reduced-motion: reduce){.pecb-right-modal,.pecb-right-modal__panel{animation:none}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
159
- }
160
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: RightModalComponent, decorators: [{
161
- type: Component,
162
- args: [{ selector: 'pecb-right-modal', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\r\n *ngIf=\"isOpen\"\r\n [id]=\"id\"\r\n [class]=\"modalClasses.join(' ')\"\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n [attr.aria-label]=\"ariaLabel\"\r\n [attr.aria-labelledby]=\"ariaLabelledBy\"\r\n [attr.aria-describedby]=\"ariaDescribedBy\"\r\n (click)=\"onBackdropClick($event)\"\r\n (keydown)=\"onKeydown($event)\"\r\n>\r\n <div\r\n #modalPanel\r\n [class]=\"panelClasses.join(' ')\"\r\n tabindex=\"-1\"\r\n >\r\n <button\r\n *ngIf=\"showCloseButton\"\r\n type=\"button\"\r\n class=\"pecb-right-modal__close-btn\"\r\n aria-label=\"Close modal\"\r\n (click)=\"close()\"\r\n >\r\n <svg\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n aria-hidden=\"true\"\r\n >\r\n <path\r\n d=\"M18 6L6 18M6 6L18 18\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n </button>\r\n\r\n <ng-content select=\"[pecbRightModalHeader]\"></ng-content>\r\n <ng-content select=\"[pecbRightModalContent]\"></ng-content>\r\n <ng-content></ng-content>\r\n <ng-content select=\"[pecbRightModalFooter]\"></ng-content>\r\n </div>\r\n</div>\r\n", styles: [".pecb-right-modal{position:fixed;inset:0;z-index:1050;display:flex;justify-content:flex-end;background-color:#00000080;animation:fadeIn .15s ease-in-out forwards}.pecb-right-modal--open .pecb-right-modal__panel{animation:slideInRight .25s ease-in-out forwards}.pecb-right-modal__panel{position:relative;display:inline-flex;min-width:516.23px;max-width:90vw;height:100%;padding:24px;flex-direction:column;align-items:flex-start;gap:16px;border-radius:24px 0 0 24px;background:#fff;box-shadow:0 5px 16px -4px #10182826;overflow-y:auto}.pecb-right-modal__panel::-webkit-scrollbar{width:8px;height:8px}.pecb-right-modal__panel::-webkit-scrollbar-track{background:#ececec}.pecb-right-modal__panel::-webkit-scrollbar-thumb{background:#c2c2c2;border-radius:12px}.pecb-right-modal__panel::-webkit-scrollbar-thumb:hover{background:#a9a9a9}.pecb-right-modal__panel--sm{min-width:400px}.pecb-right-modal__panel--md{min-width:516.23px}.pecb-right-modal__panel--lg{min-width:700px}.pecb-right-modal__close-btn{padding:0;border:none;background:none;cursor:pointer;font:inherit;color:inherit;position:absolute;top:24px;right:24px;display:flex;align-items:center;justify-content:center;width:24px;height:24px;color:#616161;border-radius:6px;transition-property:color,background-color;transition-duration:.25s ease-in-out;transition-timing-function:ease-in-out}.pecb-right-modal__close-btn:focus{outline:none}.pecb-right-modal__close-btn:focus-visible{outline:2px solid #a11e29;outline-offset:2px}.pecb-right-modal__close-btn:hover{color:#313131;background-color:#ececec}.pecb-right-modal__close-btn svg{width:20px;height:20px}.pecb-right-modal__header{width:100%;padding-right:32px}.pecb-right-modal__content{flex:1;width:100%;overflow-y:auto}.pecb-right-modal__content::-webkit-scrollbar{width:8px;height:8px}.pecb-right-modal__content::-webkit-scrollbar-track{background:#ececec}.pecb-right-modal__content::-webkit-scrollbar-thumb{background:#c2c2c2;border-radius:12px}.pecb-right-modal__content::-webkit-scrollbar-thumb:hover{background:#a9a9a9}.pecb-right-modal__footer{width:100%;margin-top:auto}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes slideInRight{0%{transform:translate(100%)}to{transform:translate(0)}}@media (prefers-reduced-motion: reduce){.pecb-right-modal,.pecb-right-modal__panel{animation:none}}\n"] }]
163
- }], propDecorators: { id: [{
164
- type: Input
165
- }], isOpen: [{
166
- type: Input
167
- }], size: [{
168
- type: Input
169
- }], closeOnBackdropClick: [{
170
- type: Input
171
- }], closeOnEscape: [{
172
- type: Input
173
- }], showCloseButton: [{
174
- type: Input
175
- }], ariaLabel: [{
176
- type: Input
177
- }], ariaLabelledBy: [{
178
- type: Input
179
- }], ariaDescribedBy: [{
180
- type: Input
181
- }], closed: [{
182
- type: Output
183
- }], opened: [{
184
- type: Output
185
- }], modalPanel: [{
186
- type: ViewChild,
187
- args: ['modalPanel']
188
- }] } });
189
- /**
190
- * Header directive for right modal
191
- */
192
- export class RightModalHeaderDirective {
193
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: RightModalHeaderDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
194
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: RightModalHeaderDirective, isStandalone: true, selector: "[pecbRightModalHeader]", host: { classAttribute: "pecb-right-modal__header" }, ngImport: i0 }); }
195
- }
196
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: RightModalHeaderDirective, decorators: [{
197
- type: Directive,
198
- args: [{
199
- selector: '[pecbRightModalHeader]',
200
- standalone: true,
201
- host: { class: 'pecb-right-modal__header' }
202
- }]
203
- }] });
204
- /**
205
- * Content directive for right modal
206
- */
207
- export class RightModalContentDirective {
208
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: RightModalContentDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
209
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: RightModalContentDirective, isStandalone: true, selector: "[pecbRightModalContent]", host: { classAttribute: "pecb-right-modal__content" }, ngImport: i0 }); }
210
- }
211
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: RightModalContentDirective, decorators: [{
212
- type: Directive,
213
- args: [{
214
- selector: '[pecbRightModalContent]',
215
- standalone: true,
216
- host: { class: 'pecb-right-modal__content' }
217
- }]
218
- }] });
219
- /**
220
- * Footer directive for right modal
221
- */
222
- export class RightModalFooterDirective {
223
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: RightModalFooterDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
224
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: RightModalFooterDirective, isStandalone: true, selector: "[pecbRightModalFooter]", host: { classAttribute: "pecb-right-modal__footer" }, ngImport: i0 }); }
225
- }
226
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: RightModalFooterDirective, decorators: [{
227
- type: Directive,
228
- args: [{
229
- selector: '[pecbRightModalFooter]',
230
- standalone: true,
231
- host: { class: 'pecb-right-modal__footer' }
232
- }]
233
- }] });
234
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmlnaHQtbW9kYWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWktY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvcmlnaHQtbW9kYWwvcmlnaHQtbW9kYWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWktY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvcmlnaHQtbW9kYWwvcmlnaHQtbW9kYWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBR1osdUJBQXVCLEVBRXZCLFNBQVMsRUFFVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDOzs7QUFJOUY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F5Qkc7QUFTSCxNQUFNLE9BQU8sbUJBQW1CO0lBUmhDO1FBU0U7O1dBRUc7UUFDTSxPQUFFLEdBQVcsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFdEQ7O1dBRUc7UUFDTSxXQUFNLEdBQUcsS0FBSyxDQUFDO1FBRXhCOztXQUVHO1FBQ00sU0FBSSxHQUFtQixJQUFJLENBQUM7UUFFckM7O1dBRUc7UUFDTSx5QkFBb0IsR0FBRyxJQUFJLENBQUM7UUFFckM7O1dBRUc7UUFDTSxrQkFBYSxHQUFHLElBQUksQ0FBQztRQUU5Qjs7V0FFRztRQUNNLG9CQUFlLEdBQUcsSUFBSSxDQUFDO1FBbUJoQzs7V0FFRztRQUNPLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBRTVDOztXQUVHO1FBQ08sV0FBTSxHQUFHLElBQUks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QUFFLHdCQUF3QjtvQkFDbEMsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSwwQkFBMEIsRUFBRTtpQkFDNUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBEaXJlY3RpdmUsXHJcbiAgSW5wdXQsXHJcbiAgT3V0cHV0LFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBPbkluaXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgVmlld0NoaWxkLFxyXG4gIEFmdGVyVmlld0luaXRcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgZ2VuZXJhdGVVbmlxdWVJZCwgdHJhcEZvY3VzLCBkaXNhYmxlQm9keVNjcm9sbCB9IGZyb20gJy4uLy4uL3NoYXJlZC91dGlscy9kb20udXRpbHMnO1xyXG5cclxuZXhwb3J0IHR5cGUgUmlnaHRNb2RhbFNpemUgPSAnc20nIHwgJ21kJyB8ICdsZyc7XHJcblxyXG4vKipcclxuICogQSByaWdodC1zaWRlIHNsaWRpbmcgbW9kYWwvZHJhd2VyIGNvbXBvbmVudC5cclxuICogU2xpZGVzIGluIGZyb20gdGhlIHJpZ2h0IGVkZ2Ugb2YgdGhlIHNjcmVlbiB3aXRoIGJhY2tkcm9wIG92ZXJsYXkuXHJcbiAqIEZ1bGx5IGFjY2Vzc2libGUgd2l0aCBXQ0FHIDIuMSBBQSBjb21wbGlhbmNlLlxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGBodG1sXHJcbiAqIDxwZWNiLXJpZ2h0LW1vZGFsXHJcbiAqICAgW2lzT3Blbl09XCJpc01vZGFsT3BlblwiXHJcbiAqICAgKGNsb3NlZCk9XCJvbk1vZGFsQ2xvc2UoKVwiXHJcbiAqICAgYXJpYUxhYmVsPVwiRXhhbSBEZXRhaWxzXCJcclxuICogPlxyXG4gKiAgIDxkaXYgcGVjYlJpZ2h0TW9kYWxIZWFkZXI+XHJcbiAqICAgICA8aDI+RXhhbSBEZXRhaWxzPC9oMj5cclxuICogICA8L2Rpdj5cclxuICogICA8ZGl2IHBlY2JSaWdodE1vZGFsQ29udGVudD5cclxuICogICAgIDxwPk1vZGFsIGNvbnRlbnQgZ29lcyBoZXJlPC9wPlxyXG4gKiAgIDwvZGl2PlxyXG4gKiAgIDxkaXYgcGVjYlJpZ2h0TW9kYWxGb290ZXI+XHJcbiAqICAgICA8YnV0dG9uPkFjdGlvbjwvYnV0dG9uPlxyXG4gKiAgIDwvZGl2PlxyXG4gKiA8L3BlY2ItcmlnaHQtbW9kYWw+XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiBAcHVibGljQXBpXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3BlY2ItcmlnaHQtbW9kYWwnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3JpZ2h0LW1vZGFsLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9yaWdodC1tb2RhbC5jb21wb25lbnQuc2NzcyddLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBSaWdodE1vZGFsQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIEFmdGVyVmlld0luaXQge1xyXG4gIC8qKlxyXG4gICAqIFVuaXF1ZSBJRCBmb3IgdGhlIG1vZGFsIGVsZW1lbnRcclxuICAgKi9cclxuICBASW5wdXQoKSBpZDogc3RyaW5nID0gZ2VuZXJhdGVVbmlxdWVJZCgncmlnaHQtbW9kYWwnKTtcclxuXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciB0aGUgbW9kYWwgaXMgb3BlblxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGlzT3BlbiA9IGZhbHNlO1xyXG5cclxuICAvKipcclxuICAgKiBTaXplIG9mIHRoZSBtb2RhbCBwYW5lbFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHNpemU6IFJpZ2h0TW9kYWxTaXplID0gJ21kJztcclxuXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciBjbGlja2luZyB0aGUgYmFja2Ryb3AgY2xvc2VzIHRoZSBtb2RhbFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGNsb3NlT25CYWNrZHJvcENsaWNrID0gdHJ1ZTtcclxuXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciBwcmVzc2luZyBFc2NhcGUgY2xvc2VzIHRoZSBtb2RhbFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGNsb3NlT25Fc2NhcGUgPSB0cnVlO1xyXG5cclxuICAvKipcclxuICAgKiBXaGV0aGVyIHRvIHNob3cgdGhlIGNsb3NlIGJ1dHRvblxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHNob3dDbG9zZUJ1dHRvbiA9IHRydWU7XHJcblxyXG4gIC8vIC0tLSBBUklBIEFjY2Vzc2liaWxpdHkgUHJvcGVydGllcyAtLS1cclxuXHJcbiAgLyoqXHJcbiAgICogQWNjZXNzaWJsZSBsYWJlbCBmb3IgdGhlIG1vZGFsXHJcbiAgICovXHJcbiAgQElucHV0KCkgYXJpYUxhYmVsPzogc3RyaW5nO1xyXG5cclxuICAvKipcclxuICAgKiBJRCBvZiBlbGVtZW50IHRoYXQgbGFiZWxzIHRoaXMgbW9kYWxcclxuICAgKi9cclxuICBASW5wdXQoKSBhcmlhTGFiZWxsZWRCeT86IHN0cmluZztcclxuXHJcbiAgLyoqXHJcbiAgICogSUQgb2YgZWxlbWVudCB0aGF0IGRlc2NyaWJlcyB0aGlzIG1vZGFsXHJcbiAgICovXHJcbiAgQElucHV0KCkgYXJpYURlc2NyaWJlZEJ5Pzogc3RyaW5nO1xyXG5cclxuICAvKipcclxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIG1vZGFsIGlzIGNsb3NlZFxyXG4gICAqL1xyXG4gIEBPdXRwdXQoKSBjbG9zZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgbW9kYWwgaXMgb3BlbmVkXHJcbiAgICovXHJcbiAgQE91dHB1dCgpIG9wZW5lZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgQFZpZXdDaGlsZCgnbW9kYWxQYW5lbCcpIG1vZGFsUGFuZWwhOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcclxuXHJcbiAgcHJpdmF0ZSBjbGVhbnVwRm9jdXNUcmFwOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIGNsZWFudXBCb2R5U2Nyb2xsOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcclxuICBwcml2YXRlIHByZXZpb3VzQWN0aXZlRWxlbWVudDogRWxlbWVudCB8IG51bGwgPSBudWxsO1xyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmlzT3Blbikge1xyXG4gICAgICB0aGlzLm9uT3BlbigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuaXNPcGVuICYmIHRoaXMubW9kYWxQYW5lbCkge1xyXG4gICAgICB0aGlzLnNldHVwRm9jdXNUcmFwKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuY2xlYW51cCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IENTUyBjbGFzc2VzIGZvciB0aGUgbW9kYWwgY29udGFpbmVyXHJcbiAgICovXHJcbiAgZ2V0IG1vZGFsQ2xhc3NlcygpOiBzdHJpbmdbXSB7XHJcbiAgICByZXR1cm4gW1xyXG4gICAgICAncGVjYi1yaWdodC1tb2RhbCcsXHJcbiAgICAgIHRoaXMuaXNPcGVuID8gJ3BlY2ItcmlnaHQtbW9kYWwtLW9wZW4nIDogJydcclxuICAgIF0uZmlsdGVyKEJvb2xlYW4pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IENTUyBjbGFzc2VzIGZvciB0aGUgbW9kYWwgcGFuZWxcclxuICAgKi9cclxuICBnZXQgcGFuZWxDbGFzc2VzKCk6IHN0cmluZ1tdIHtcclxuICAgIHJldHVybiBbXHJcbiAgICAgICdwZWNiLXJpZ2h0LW1vZGFsX19wYW5lbCcsXHJcbiAgICAgIGBwZWNiLXJpZ2h0LW1vZGFsX19wYW5lbC0tJHt0aGlzLnNpemV9YFxyXG4gICAgXTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZSBiYWNrZHJvcCBjbGlja1xyXG4gICAqL1xyXG4gIG9uQmFja2Ryb3BDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuY2xvc2VPbkJhY2tkcm9wQ2xpY2sgJiYgZXZlbnQudGFyZ2V0ID09PSBldmVudC5jdXJyZW50VGFyZ2V0KSB7XHJcbiAgICAgIHRoaXMuY2xvc2UoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZSBrZXlib2FyZCBldmVudHNcclxuICAgKi9cclxuICBvbktleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmNsb3NlT25Fc2NhcGUgJiYgZXZlbnQua2V5ID09PSAnRXNjYXBlJykge1xyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbG9zZSB0aGUgbW9kYWxcclxuICAgKi9cclxuICBjbG9zZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuY2xlYW51cCgpO1xyXG4gICAgdGhpcy5jbG9zZWQuZW1pdCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2FsbGVkIHdoZW4gbW9kYWwgb3BlbnNcclxuICAgKi9cclxuICBwcml2YXRlIG9uT3BlbigpOiB2b2lkIHtcclxuICAgIHRoaXMucHJldmlvdXNBY3RpdmVFbGVtZW50ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcclxuICAgIHRoaXMuY2xlYW51cEJvZHlTY3JvbGwgPSBkaXNhYmxlQm9keVNjcm9sbCgpO1xyXG4gICAgdGhpcy5vcGVuZWQuZW1pdCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0dXAgZm9jdXMgdHJhcCBhZnRlciB2aWV3IGlzIHJlYWR5XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzZXR1cEZvY3VzVHJhcCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLm1vZGFsUGFuZWw/Lm5hdGl2ZUVsZW1lbnQpIHtcclxuICAgICAgdGhpcy5jbGVhbnVwRm9jdXNUcmFwID0gdHJhcEZvY3VzKHRoaXMubW9kYWxQYW5lbC5uYXRpdmVFbGVtZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsZWFudXAgcmVzb3VyY2VzXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjbGVhbnVwKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuY2xlYW51cEZvY3VzVHJhcCkge1xyXG4gICAgICB0aGlzLmNsZWFudXBGb2N1c1RyYXAoKTtcclxuICAgICAgdGhpcy5jbGVhbnVwRm9jdXNUcmFwID0gbnVsbDtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmNsZWFudXBCb2R5U2Nyb2xsKSB7XHJcbiAgICAgIHRoaXMuY2xlYW51cEJvZHlTY3JvbGwoKTtcclxuICAgICAgdGhpcy5jbGVhbnVwQm9keVNjcm9sbCA9IG51bGw7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5wcmV2aW91c0FjdGl2ZUVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xyXG4gICAgICB0aGlzLnByZXZpb3VzQWN0aXZlRWxlbWVudC5mb2N1cygpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEhlYWRlciBkaXJlY3RpdmUgZm9yIHJpZ2h0IG1vZGFsXHJcbiAqL1xyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ1twZWNiUmlnaHRNb2RhbEhlYWRlcl0nLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaG9zdDogeyBjbGFzczogJ3BlY2ItcmlnaHQtbW9kYWxfX2hlYWRlcicgfVxyXG59KVxyXG5leHBvcnQgY2xhc3MgUmlnaHRNb2RhbEhlYWRlckRpcmVjdGl2ZSB7fVxyXG5cclxuLyoqXHJcbiAqIENvbnRlbnQgZGlyZWN0aXZlIGZvciByaWdodCBtb2RhbFxyXG4gKi9cclxuQERpcmVjdGl2ZSh7XHJcbiAgc2VsZWN0b3I6ICdbcGVjYlJpZ2h0TW9kYWxDb250ZW50XScsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBob3N0OiB7IGNsYXNzOiAncGVjYi1yaWdodC1tb2RhbF9fY29udGVudCcgfVxyXG59KVxyXG5leHBvcnQgY2xhc3MgUmlnaHRNb2RhbENvbnRlbnREaXJlY3RpdmUge31cclxuXHJcbi8qKlxyXG4gKiBGb290ZXIgZGlyZWN0aXZlIGZvciByaWdodCBtb2RhbFxyXG4gKi9cclxuQERpcmVjdGl2ZSh7XHJcbiAgc2VsZWN0b3I6ICdbcGVjYlJpZ2h0TW9kYWxGb290ZXJdJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGhvc3Q6IHsgY2xhc3M6ICdwZWNiLXJpZ2h0LW1vZGFsX19mb290ZXInIH1cclxufSlcclxuZXhwb3J0IGNsYXNzIFJpZ2h0TW9kYWxGb290ZXJEaXJlY3RpdmUge30iLCI8ZGl2XHJcbiAgKm5nSWY9XCJpc09wZW5cIlxyXG4gIFtpZF09XCJpZFwiXHJcbiAgW2NsYXNzXT1cIm1vZGFsQ2xhc3Nlcy5qb2luKCcgJylcIlxyXG4gIHJvbGU9XCJkaWFsb2dcIlxyXG4gIGFyaWEtbW9kYWw9XCJ0cnVlXCJcclxuICBbYXR0ci5hcmlhLWxhYmVsXT1cImFyaWFMYWJlbFwiXHJcbiAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cImFyaWFMYWJlbGxlZEJ5XCJcclxuICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cImFyaWFEZXNjcmliZWRCeVwiXHJcbiAgKGNsaWNrKT1cIm9uQmFja2Ryb3BDbGljaygkZXZlbnQpXCJcclxuICAoa2V5ZG93bik9XCJvbktleWRvd24oJGV2ZW50KVwiXHJcbj5cclxuICA8ZGl2XHJcbiAgICAjbW9kYWxQYW5lbFxyXG4gICAgW2NsYXNzXT1cInBhbmVsQ2xhc3Nlcy5qb2luKCcgJylcIlxyXG4gICAgdGFiaW5kZXg9XCItMVwiXHJcbiAgPlxyXG4gICAgPGJ1dHRvblxyXG4gICAgICAqbmdJZj1cInNob3dDbG9zZUJ1dHRvblwiXHJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICBjbGFzcz1cInBlY2ItcmlnaHQtbW9kYWxfX2Nsb3NlLWJ0blwiXHJcbiAgICAgIGFyaWEtbGFiZWw9XCJDbG9zZSBtb2RhbFwiXHJcbiAgICAgIChjbGljayk9XCJjbG9zZSgpXCJcclxuICAgID5cclxuICAgICAgPHN2Z1xyXG4gICAgICAgIHdpZHRoPVwiMjRcIlxyXG4gICAgICAgIGhlaWdodD1cIjI0XCJcclxuICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcclxuICAgICAgICBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXHJcbiAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxwYXRoXHJcbiAgICAgICAgICBkPVwiTTE4IDZMNiAxOE02IDZMMTggMThcIlxyXG4gICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcclxuICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXHJcbiAgICAgICAgLz5cclxuICAgICAgPC9zdmc+XHJcbiAgICA8L2J1dHRvbj5cclxuXHJcbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbcGVjYlJpZ2h0TW9kYWxIZWFkZXJdXCI+PC9uZy1jb250ZW50PlxyXG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW3BlY2JSaWdodE1vZGFsQ29udGVudF1cIj48L25nLWNvbnRlbnQ+XHJcbiAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XHJcbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbcGVjYlJpZ2h0TW9kYWxGb290ZXJdXCI+PC9uZy1jb250ZW50PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuIl19
@@ -1,155 +0,0 @@
1
- import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy } from '@angular/core';
2
- import { CommonModule } from '@angular/common';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "@angular/platform-browser";
5
- import * as i2 from "@angular/common";
6
- /**
7
- * A professional sidebar navigation component with collapsible sections and nested items.
8
- * Perfect for application navigation with hierarchical menu structures.
9
- *
10
- * @example
11
- * ```html
12
- * <!-- Basic sidebar -->
13
- * <pecb-sidebar
14
- * [sections]="menuSections"
15
- * (itemClick)="onMenuItemClick($event)"
16
- * ></pecb-sidebar>
17
- *
18
- * <!-- With logo header -->
19
- * <pecb-sidebar
20
- * [sections]="menuSections"
21
- * [showHeader]="true"
22
- * [sidebarLogo]="logoSvg"
23
- * ></pecb-sidebar>
24
- * ```
25
- *
26
- * @publicApi
27
- */
28
- export class SidebarComponent {
29
- constructor(sanitizer) {
30
- this.sanitizer = sanitizer;
31
- /**
32
- * Array of sidebar sections with menu items
33
- */
34
- this.sections = [];
35
- /**
36
- * Whether to show the header section
37
- */
38
- this.showHeader = true;
39
- /**
40
- * Whether to show the footer section
41
- */
42
- this.showFooter = false;
43
- /**
44
- * Whether the sidebar is collapsed
45
- */
46
- this.collapsed = false;
47
- /**
48
- * Event emitted when a menu item is clicked
49
- */
50
- this.itemClick = new EventEmitter();
51
- /**
52
- * Event emitted when the sidebar collapse state changes
53
- */
54
- this.collapseChange = new EventEmitter();
55
- }
56
- /**
57
- * Handle menu item click
58
- */
59
- onItemClick(item, event) {
60
- event.preventDefault();
61
- event.stopPropagation();
62
- // Check if this is a top-level item
63
- const isTopLevel = this.sections.some(section => section.items.includes(item));
64
- if (isTopLevel) {
65
- // Collapse all other top-level items
66
- this.sections.forEach(section => {
67
- section.items.forEach(sectionItem => {
68
- if (sectionItem !== item && sectionItem.expanded) {
69
- sectionItem.expanded = false;
70
- }
71
- });
72
- });
73
- }
74
- if (item.children && item.children.length > 0) {
75
- item.expanded = !item.expanded;
76
- }
77
- // Always emit the click event, even for items with children
78
- this.itemClick.emit(item);
79
- }
80
- /**
81
- * Toggle sidebar collapse state
82
- */
83
- toggleCollapse() {
84
- this.collapsed = !this.collapsed;
85
- this.collapseChange.emit(this.collapsed);
86
- }
87
- /**
88
- * Sanitize icon SVG HTML to prevent Angular from stripping SVG elements
89
- */
90
- getSafeIcon(icon) {
91
- return this.sanitizer.bypassSecurityTrustHtml(icon);
92
- }
93
- /**
94
- * TrackBy for sections
95
- */
96
- trackBySection(_index, section) {
97
- return section.id;
98
- }
99
- /**
100
- * TrackBy for menu items
101
- */
102
- trackByItem(_index, item) {
103
- return item.id;
104
- }
105
- /**
106
- * Get CSS classes for a menu item
107
- */
108
- getItemClasses(item, isChild = false, isNested = false) {
109
- const classes = [
110
- isChild ? 'pecb-sidebar__subitem' : 'pecb-sidebar__item'
111
- ];
112
- if (isNested) {
113
- classes.push('pecb-sidebar__subitem--nested');
114
- }
115
- if (item.active) {
116
- classes.push(isChild ? 'pecb-sidebar__subitem--active' : 'pecb-sidebar__item--active');
117
- }
118
- if (item.children && item.children.length > 0) {
119
- if (!isChild) {
120
- classes.push('pecb-sidebar__item--has-children');
121
- if (item.expanded) {
122
- classes.push('pecb-sidebar__item--expanded');
123
- }
124
- }
125
- else if (isChild && !isNested) {
126
- // Second-level items with children
127
- if (item.expanded) {
128
- classes.push('pecb-sidebar__item--expanded');
129
- }
130
- }
131
- }
132
- return classes;
133
- }
134
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SidebarComponent, deps: [{ token: i1.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component }); }
135
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: SidebarComponent, isStandalone: true, selector: "pecb-sidebar", inputs: { sections: "sections", showHeader: "showHeader", sidebarLogo: "sidebarLogo", showFooter: "showFooter", collapsed: "collapsed" }, outputs: { itemClick: "itemClick", collapseChange: "collapseChange" }, ngImport: i0, template: "<aside class=\"pecb-sidebar\" [class.pecb-sidebar--collapsed]=\"collapsed\">\r\n <!-- Collapse Toggle Button -->\r\n <button\r\n class=\"pecb-sidebar__toggle\"\r\n [class.pecb-sidebar__toggle--collapsed]=\"collapsed\"\r\n (click)=\"toggleCollapse()\"\r\n [attr.aria-label]=\"collapsed ? 'Expand sidebar' : 'Collapse sidebar'\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M10 12L6 8L10 4\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </button>\r\n\r\n <!-- Header Section -->\r\n <div *ngIf=\"showHeader\" class=\"pecb-sidebar__header\">\r\n <ng-content select=\"[sidebar-header]\"></ng-content>\r\n <div *ngIf=\"sidebarLogo\" class=\"pecb-sidebar__header-content\">\r\n <span class=\"pecb-sidebar__logo\" [innerHTML]=\"getSafeIcon(sidebarLogo)\"></span>\r\n </div>\r\n </div>\r\n\r\n <!-- Navigation Sections -->\r\n <nav class=\"pecb-sidebar__nav\">\r\n <div *ngFor=\"let section of sections; trackBy: trackBySection\" class=\"pecb-sidebar__section\">\r\n <!-- Section Title -->\r\n <div *ngIf=\"section.title\" class=\"pecb-sidebar__section-title\">\r\n {{ section.title }}\r\n </div>\r\n\r\n <!-- Menu Items -->\r\n <ul class=\"pecb-sidebar__menu\">\r\n <li *ngFor=\"let item of section.items; trackBy: trackByItem\">\r\n <!-- Parent Item -->\r\n <a\r\n [class]=\"getItemClasses(item).join(' ')\"\r\n [attr.href]=\"item.route || '#'\"\r\n (click)=\"onItemClick(item, $event)\"\r\n >\r\n <span *ngIf=\"item.icon\" class=\"pecb-sidebar__icon\" [innerHTML]=\"getSafeIcon(item.icon)\"></span>\r\n <span class=\"pecb-sidebar__label\">{{ item.label }}</span>\r\n </a>\r\n\r\n <!-- Child Items -->\r\n <ul\r\n *ngIf=\"item.children && item.children.length > 0 && !collapsed\"\r\n class=\"pecb-sidebar__submenu\"\r\n [class.pecb-sidebar__submenu--open]=\"item.expanded\"\r\n >\r\n <li *ngFor=\"let child of item.children; trackBy: trackByItem\">\r\n <a\r\n [class]=\"getItemClasses(child, true, false).join(' ')\"\r\n [attr.href]=\"child.route || '#'\"\r\n (click)=\"onItemClick(child, $event)\"\r\n >\r\n <span *ngIf=\"child.icon\" class=\"pecb-sidebar__icon\" [innerHTML]=\"getSafeIcon(child.icon)\"></span>\r\n <span class=\"pecb-sidebar__label\">{{ child.label }}</span>\r\n <span\r\n *ngIf=\"child.children && child.children.length > 0\"\r\n class=\"pecb-sidebar__arrow\"\r\n [class.pecb-sidebar__arrow--expanded]=\"child.expanded\"\r\n >\r\n <!-- Minus icon (expanded) -->\r\n <svg *ngIf=\"child.expanded\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 8h8\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\r\n </svg>\r\n <!-- Plus icon (collapsed) -->\r\n <svg *ngIf=\"!child.expanded\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M8 4v8M4 8h8\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\r\n </svg>\r\n </span>\r\n </a>\r\n\r\n <!-- Nested Child Items (Third Level) -->\r\n <ul\r\n *ngIf=\"child.children && child.children.length > 0\"\r\n class=\"pecb-sidebar__submenu\"\r\n [class.pecb-sidebar__submenu--open]=\"child.expanded\"\r\n >\r\n <li *ngFor=\"let nestedChild of child.children; trackBy: trackByItem\">\r\n <a\r\n [class]=\"getItemClasses(nestedChild, true, true).join(' ')\"\r\n [attr.href]=\"nestedChild.route || '#'\"\r\n (click)=\"onItemClick(nestedChild, $event)\"\r\n >\r\n <span class=\"pecb-sidebar__label\">{{ nestedChild.label }}</span>\r\n </a>\r\n </li>\r\n </ul>\r\n </li>\r\n </ul>\r\n </li>\r\n </ul>\r\n </div>\r\n </nav>\r\n\r\n <!-- Footer Section -->\r\n <div *ngIf=\"showFooter\" class=\"pecb-sidebar__footer\">\r\n <ng-content select=\"[sidebar-footer]\"></ng-content>\r\n </div>\r\n</aside>\r\n", styles: [".pecb-sidebar{display:flex;flex-direction:column;width:260px;height:100vh;background-color:#fff;border-right:1px solid #f7f5f5;font-family:Plus Jakarta Sans,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;position:relative;transition:width .4s cubic-bezier(.4,0,.2,1)}.pecb-sidebar__header{padding:20px 18px 12px;flex-shrink:0;display:flex;align-items:center;justify-content:space-between;transition:padding .4s cubic-bezier(.4,0,.2,1)}.pecb-sidebar__header-content{display:flex;align-items:center;gap:8px;transition:justify-content .4s cubic-bezier(.4,0,.2,1)}.pecb-sidebar__logo{display:flex;align-items:center;height:32px;overflow:hidden;transition:opacity .4s cubic-bezier(.4,0,.2,1)}.pecb-sidebar__logo ::ng-deep svg{height:100%;width:auto}.pecb-sidebar__toggle{padding:0;border:none;background:none;cursor:pointer;font:inherit;color:inherit;display:flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:50%;border:1px solid #ececec;color:#919191;background-color:#fff;position:absolute;top:24px;right:-14px;z-index:10;transition:color .4s cubic-bezier(.4,0,.2,1),background-color .4s cubic-bezier(.4,0,.2,1),transform .4s cubic-bezier(.4,0,.2,1)}.pecb-sidebar__toggle:focus{outline:none}.pecb-sidebar__toggle:hover{color:#313131;background-color:#f4f4f4}.pecb-sidebar__toggle svg{width:14px;height:14px}.pecb-sidebar__toggle--collapsed{transform:rotate(180deg)}.pecb-sidebar__nav{flex:1;overflow-y:auto;overflow-x:hidden;padding:8px 18px;transition:padding .4s cubic-bezier(.4,0,.2,1)}.pecb-sidebar__nav::-webkit-scrollbar{width:4px}.pecb-sidebar__nav::-webkit-scrollbar-track{background-color:transparent}.pecb-sidebar__nav::-webkit-scrollbar-thumb{background-color:#ececec;border-radius:2px}.pecb-sidebar__nav::-webkit-scrollbar-thumb:hover{background-color:#c2c2c2}.pecb-sidebar__section{margin-bottom:8px}.pecb-sidebar__section:last-child{margin-bottom:0}.pecb-sidebar__section-title{padding:12px 0;font-size:11px;font-weight:500;color:#c2c2c2;text-transform:uppercase;letter-spacing:.5px;white-space:nowrap;overflow:hidden;opacity:1;max-height:40px;transition:opacity .2s cubic-bezier(.4,0,.2,1),max-height .4s cubic-bezier(.4,0,.2,1),padding .4s cubic-bezier(.4,0,.2,1)}.pecb-sidebar__menu{list-style:none;margin:0;padding:0}.pecb-sidebar__menu>li{margin-bottom:4px}.pecb-sidebar__item{display:flex;align-items:center;box-sizing:border-box;width:100%;padding:10px 12px;font-size:14px;font-weight:400;color:#616161;text-decoration:none;cursor:pointer;border:none;background:none;border-radius:8px;transition:background-color .4s cubic-bezier(.4,0,.2,1),color .4s cubic-bezier(.4,0,.2,1),padding .4s cubic-bezier(.4,0,.2,1)}.pecb-sidebar__item:hover{background-color:#f4f4f4}.pecb-sidebar__item--active{background-color:#212427;color:#fff;font-weight:500}.pecb-sidebar__item--active .pecb-sidebar__icon{color:#fff}.pecb-sidebar__item--active:hover{background-color:#212427;color:#fff}.pecb-sidebar__item--has-children{position:relative}.pecb-sidebar__subitem{display:flex;align-items:center;box-sizing:border-box;width:100%;padding:7px 8px 7px 30px;font-size:13px;font-weight:400;color:#919191;text-decoration:none;cursor:pointer;border:none;background:none;position:relative;border-radius:4px}.pecb-sidebar__subitem:before{content:\"\";position:absolute;left:10px;top:50%;transform:translateY(-50%);width:6px;height:6px;border-radius:50%;border:1.5px solid #c2c2c2;background-color:transparent}.pecb-sidebar__subitem:hover{color:#313131}.pecb-sidebar__subitem--active{color:#313131;font-weight:500}.pecb-sidebar__subitem--active:before{background-color:#212427;border-color:#212427}.pecb-sidebar__subitem.pecb-sidebar__item--expanded:before{background-color:#212427;border-color:#212427}.pecb-sidebar__subitem--nested{padding-left:34px;color:#c2c2c2;font-size:13px}.pecb-sidebar__subitem--nested:before{display:none}.pecb-sidebar__subitem--nested.pecb-sidebar__subitem--active{color:#313131;font-weight:500}.pecb-sidebar__icon{display:flex;align-items:center;justify-content:center;width:20px;height:20px;margin-right:10px;color:#919191;flex-shrink:0;transition:margin .4s cubic-bezier(.4,0,.2,1)}.pecb-sidebar__icon ::ng-deep svg{width:100%;height:100%}.pecb-sidebar__label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;opacity:1;transition:opacity .2s cubic-bezier(.4,0,.2,1)}.pecb-sidebar__arrow{display:flex;align-items:center;justify-content:center;margin-left:auto;color:#c2c2c2;flex-shrink:0}.pecb-sidebar__arrow svg{display:block;width:14px;height:14px}.pecb-sidebar__submenu{list-style:none;box-sizing:border-box;margin:4px 0 0;padding:0 4px;position:relative;background-color:#f4f4f4;border-radius:8px;overflow:hidden;max-height:0;opacity:0;transition:max-height .5s cubic-bezier(.4,0,.2,1),opacity .4s cubic-bezier(.4,0,.2,1),padding .5s cubic-bezier(.4,0,.2,1)}.pecb-sidebar__submenu>li{margin:0}.pecb-sidebar__submenu--open{max-height:600px;opacity:1;padding:8px 4px}.pecb-sidebar__submenu .pecb-sidebar__submenu{position:relative;background-color:transparent;border-radius:0;margin:0;padding:0;max-height:0;opacity:0;overflow:hidden;transition:none}.pecb-sidebar__submenu .pecb-sidebar__submenu:before{content:\"\";position:absolute;left:13px;top:0;bottom:0;width:1.5px;background-color:#ececec}.pecb-sidebar__submenu .pecb-sidebar__submenu--open{max-height:300px;opacity:1;padding:2px 0}.pecb-sidebar__footer{padding:16px 12px;flex-shrink:0;opacity:1;transition:opacity .2s cubic-bezier(.4,0,.2,1)}.pecb-sidebar--collapsed{width:64px}.pecb-sidebar--collapsed .pecb-sidebar__header{flex-direction:column;align-items:center;padding:16px 8px 12px;gap:8px}.pecb-sidebar--collapsed .pecb-sidebar__header-content{justify-content:center}.pecb-sidebar--collapsed .pecb-sidebar__logo{opacity:0;width:0;overflow:hidden;pointer-events:none}.pecb-sidebar--collapsed .pecb-sidebar__toggle{right:-14px}.pecb-sidebar--collapsed .pecb-sidebar__nav{padding:8px}.pecb-sidebar--collapsed .pecb-sidebar__section-title{opacity:0;max-height:0;padding:0;overflow:hidden}.pecb-sidebar--collapsed .pecb-sidebar__item{justify-content:center;padding:10px 8px}.pecb-sidebar--collapsed .pecb-sidebar__submenu{display:none}.pecb-sidebar--collapsed .pecb-sidebar__icon{margin-right:0}.pecb-sidebar--collapsed .pecb-sidebar__label{opacity:0;width:0;overflow:hidden;pointer-events:none}.pecb-sidebar--collapsed .pecb-sidebar__footer{opacity:0;pointer-events:none;max-height:0;overflow:hidden;padding:0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
136
- }
137
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SidebarComponent, decorators: [{
138
- type: Component,
139
- args: [{ selector: 'pecb-sidebar', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<aside class=\"pecb-sidebar\" [class.pecb-sidebar--collapsed]=\"collapsed\">\r\n <!-- Collapse Toggle Button -->\r\n <button\r\n class=\"pecb-sidebar__toggle\"\r\n [class.pecb-sidebar__toggle--collapsed]=\"collapsed\"\r\n (click)=\"toggleCollapse()\"\r\n [attr.aria-label]=\"collapsed ? 'Expand sidebar' : 'Collapse sidebar'\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M10 12L6 8L10 4\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </button>\r\n\r\n <!-- Header Section -->\r\n <div *ngIf=\"showHeader\" class=\"pecb-sidebar__header\">\r\n <ng-content select=\"[sidebar-header]\"></ng-content>\r\n <div *ngIf=\"sidebarLogo\" class=\"pecb-sidebar__header-content\">\r\n <span class=\"pecb-sidebar__logo\" [innerHTML]=\"getSafeIcon(sidebarLogo)\"></span>\r\n </div>\r\n </div>\r\n\r\n <!-- Navigation Sections -->\r\n <nav class=\"pecb-sidebar__nav\">\r\n <div *ngFor=\"let section of sections; trackBy: trackBySection\" class=\"pecb-sidebar__section\">\r\n <!-- Section Title -->\r\n <div *ngIf=\"section.title\" class=\"pecb-sidebar__section-title\">\r\n {{ section.title }}\r\n </div>\r\n\r\n <!-- Menu Items -->\r\n <ul class=\"pecb-sidebar__menu\">\r\n <li *ngFor=\"let item of section.items; trackBy: trackByItem\">\r\n <!-- Parent Item -->\r\n <a\r\n [class]=\"getItemClasses(item).join(' ')\"\r\n [attr.href]=\"item.route || '#'\"\r\n (click)=\"onItemClick(item, $event)\"\r\n >\r\n <span *ngIf=\"item.icon\" class=\"pecb-sidebar__icon\" [innerHTML]=\"getSafeIcon(item.icon)\"></span>\r\n <span class=\"pecb-sidebar__label\">{{ item.label }}</span>\r\n </a>\r\n\r\n <!-- Child Items -->\r\n <ul\r\n *ngIf=\"item.children && item.children.length > 0 && !collapsed\"\r\n class=\"pecb-sidebar__submenu\"\r\n [class.pecb-sidebar__submenu--open]=\"item.expanded\"\r\n >\r\n <li *ngFor=\"let child of item.children; trackBy: trackByItem\">\r\n <a\r\n [class]=\"getItemClasses(child, true, false).join(' ')\"\r\n [attr.href]=\"child.route || '#'\"\r\n (click)=\"onItemClick(child, $event)\"\r\n >\r\n <span *ngIf=\"child.icon\" class=\"pecb-sidebar__icon\" [innerHTML]=\"getSafeIcon(child.icon)\"></span>\r\n <span class=\"pecb-sidebar__label\">{{ child.label }}</span>\r\n <span\r\n *ngIf=\"child.children && child.children.length > 0\"\r\n class=\"pecb-sidebar__arrow\"\r\n [class.pecb-sidebar__arrow--expanded]=\"child.expanded\"\r\n >\r\n <!-- Minus icon (expanded) -->\r\n <svg *ngIf=\"child.expanded\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M4 8h8\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\r\n </svg>\r\n <!-- Plus icon (collapsed) -->\r\n <svg *ngIf=\"!child.expanded\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\r\n <path d=\"M8 4v8M4 8h8\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\r\n </svg>\r\n </span>\r\n </a>\r\n\r\n <!-- Nested Child Items (Third Level) -->\r\n <ul\r\n *ngIf=\"child.children && child.children.length > 0\"\r\n class=\"pecb-sidebar__submenu\"\r\n [class.pecb-sidebar__submenu--open]=\"child.expanded\"\r\n >\r\n <li *ngFor=\"let nestedChild of child.children; trackBy: trackByItem\">\r\n <a\r\n [class]=\"getItemClasses(nestedChild, true, true).join(' ')\"\r\n [attr.href]=\"nestedChild.route || '#'\"\r\n (click)=\"onItemClick(nestedChild, $event)\"\r\n >\r\n <span class=\"pecb-sidebar__label\">{{ nestedChild.label }}</span>\r\n </a>\r\n </li>\r\n </ul>\r\n </li>\r\n </ul>\r\n </li>\r\n </ul>\r\n </div>\r\n </nav>\r\n\r\n <!-- Footer Section -->\r\n <div *ngIf=\"showFooter\" class=\"pecb-sidebar__footer\">\r\n <ng-content select=\"[sidebar-footer]\"></ng-content>\r\n </div>\r\n</aside>\r\n", styles: [".pecb-sidebar{display:flex;flex-direction:column;width:260px;height:100vh;background-color:#fff;border-right:1px solid #f7f5f5;font-family:Plus Jakarta Sans,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;position:relative;transition:width .4s cubic-bezier(.4,0,.2,1)}.pecb-sidebar__header{padding:20px 18px 12px;flex-shrink:0;display:flex;align-items:center;justify-content:space-between;transition:padding .4s cubic-bezier(.4,0,.2,1)}.pecb-sidebar__header-content{display:flex;align-items:center;gap:8px;transition:justify-content .4s cubic-bezier(.4,0,.2,1)}.pecb-sidebar__logo{display:flex;align-items:center;height:32px;overflow:hidden;transition:opacity .4s cubic-bezier(.4,0,.2,1)}.pecb-sidebar__logo ::ng-deep svg{height:100%;width:auto}.pecb-sidebar__toggle{padding:0;border:none;background:none;cursor:pointer;font:inherit;color:inherit;display:flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:50%;border:1px solid #ececec;color:#919191;background-color:#fff;position:absolute;top:24px;right:-14px;z-index:10;transition:color .4s cubic-bezier(.4,0,.2,1),background-color .4s cubic-bezier(.4,0,.2,1),transform .4s cubic-bezier(.4,0,.2,1)}.pecb-sidebar__toggle:focus{outline:none}.pecb-sidebar__toggle:hover{color:#313131;background-color:#f4f4f4}.pecb-sidebar__toggle svg{width:14px;height:14px}.pecb-sidebar__toggle--collapsed{transform:rotate(180deg)}.pecb-sidebar__nav{flex:1;overflow-y:auto;overflow-x:hidden;padding:8px 18px;transition:padding .4s cubic-bezier(.4,0,.2,1)}.pecb-sidebar__nav::-webkit-scrollbar{width:4px}.pecb-sidebar__nav::-webkit-scrollbar-track{background-color:transparent}.pecb-sidebar__nav::-webkit-scrollbar-thumb{background-color:#ececec;border-radius:2px}.pecb-sidebar__nav::-webkit-scrollbar-thumb:hover{background-color:#c2c2c2}.pecb-sidebar__section{margin-bottom:8px}.pecb-sidebar__section:last-child{margin-bottom:0}.pecb-sidebar__section-title{padding:12px 0;font-size:11px;font-weight:500;color:#c2c2c2;text-transform:uppercase;letter-spacing:.5px;white-space:nowrap;overflow:hidden;opacity:1;max-height:40px;transition:opacity .2s cubic-bezier(.4,0,.2,1),max-height .4s cubic-bezier(.4,0,.2,1),padding .4s cubic-bezier(.4,0,.2,1)}.pecb-sidebar__menu{list-style:none;margin:0;padding:0}.pecb-sidebar__menu>li{margin-bottom:4px}.pecb-sidebar__item{display:flex;align-items:center;box-sizing:border-box;width:100%;padding:10px 12px;font-size:14px;font-weight:400;color:#616161;text-decoration:none;cursor:pointer;border:none;background:none;border-radius:8px;transition:background-color .4s cubic-bezier(.4,0,.2,1),color .4s cubic-bezier(.4,0,.2,1),padding .4s cubic-bezier(.4,0,.2,1)}.pecb-sidebar__item:hover{background-color:#f4f4f4}.pecb-sidebar__item--active{background-color:#212427;color:#fff;font-weight:500}.pecb-sidebar__item--active .pecb-sidebar__icon{color:#fff}.pecb-sidebar__item--active:hover{background-color:#212427;color:#fff}.pecb-sidebar__item--has-children{position:relative}.pecb-sidebar__subitem{display:flex;align-items:center;box-sizing:border-box;width:100%;padding:7px 8px 7px 30px;font-size:13px;font-weight:400;color:#919191;text-decoration:none;cursor:pointer;border:none;background:none;position:relative;border-radius:4px}.pecb-sidebar__subitem:before{content:\"\";position:absolute;left:10px;top:50%;transform:translateY(-50%);width:6px;height:6px;border-radius:50%;border:1.5px solid #c2c2c2;background-color:transparent}.pecb-sidebar__subitem:hover{color:#313131}.pecb-sidebar__subitem--active{color:#313131;font-weight:500}.pecb-sidebar__subitem--active:before{background-color:#212427;border-color:#212427}.pecb-sidebar__subitem.pecb-sidebar__item--expanded:before{background-color:#212427;border-color:#212427}.pecb-sidebar__subitem--nested{padding-left:34px;color:#c2c2c2;font-size:13px}.pecb-sidebar__subitem--nested:before{display:none}.pecb-sidebar__subitem--nested.pecb-sidebar__subitem--active{color:#313131;font-weight:500}.pecb-sidebar__icon{display:flex;align-items:center;justify-content:center;width:20px;height:20px;margin-right:10px;color:#919191;flex-shrink:0;transition:margin .4s cubic-bezier(.4,0,.2,1)}.pecb-sidebar__icon ::ng-deep svg{width:100%;height:100%}.pecb-sidebar__label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;opacity:1;transition:opacity .2s cubic-bezier(.4,0,.2,1)}.pecb-sidebar__arrow{display:flex;align-items:center;justify-content:center;margin-left:auto;color:#c2c2c2;flex-shrink:0}.pecb-sidebar__arrow svg{display:block;width:14px;height:14px}.pecb-sidebar__submenu{list-style:none;box-sizing:border-box;margin:4px 0 0;padding:0 4px;position:relative;background-color:#f4f4f4;border-radius:8px;overflow:hidden;max-height:0;opacity:0;transition:max-height .5s cubic-bezier(.4,0,.2,1),opacity .4s cubic-bezier(.4,0,.2,1),padding .5s cubic-bezier(.4,0,.2,1)}.pecb-sidebar__submenu>li{margin:0}.pecb-sidebar__submenu--open{max-height:600px;opacity:1;padding:8px 4px}.pecb-sidebar__submenu .pecb-sidebar__submenu{position:relative;background-color:transparent;border-radius:0;margin:0;padding:0;max-height:0;opacity:0;overflow:hidden;transition:none}.pecb-sidebar__submenu .pecb-sidebar__submenu:before{content:\"\";position:absolute;left:13px;top:0;bottom:0;width:1.5px;background-color:#ececec}.pecb-sidebar__submenu .pecb-sidebar__submenu--open{max-height:300px;opacity:1;padding:2px 0}.pecb-sidebar__footer{padding:16px 12px;flex-shrink:0;opacity:1;transition:opacity .2s cubic-bezier(.4,0,.2,1)}.pecb-sidebar--collapsed{width:64px}.pecb-sidebar--collapsed .pecb-sidebar__header{flex-direction:column;align-items:center;padding:16px 8px 12px;gap:8px}.pecb-sidebar--collapsed .pecb-sidebar__header-content{justify-content:center}.pecb-sidebar--collapsed .pecb-sidebar__logo{opacity:0;width:0;overflow:hidden;pointer-events:none}.pecb-sidebar--collapsed .pecb-sidebar__toggle{right:-14px}.pecb-sidebar--collapsed .pecb-sidebar__nav{padding:8px}.pecb-sidebar--collapsed .pecb-sidebar__section-title{opacity:0;max-height:0;padding:0;overflow:hidden}.pecb-sidebar--collapsed .pecb-sidebar__item{justify-content:center;padding:10px 8px}.pecb-sidebar--collapsed .pecb-sidebar__submenu{display:none}.pecb-sidebar--collapsed .pecb-sidebar__icon{margin-right:0}.pecb-sidebar--collapsed .pecb-sidebar__label{opacity:0;width:0;overflow:hidden;pointer-events:none}.pecb-sidebar--collapsed .pecb-sidebar__footer{opacity:0;pointer-events:none;max-height:0;overflow:hidden;padding:0}\n"] }]
140
- }], ctorParameters: () => [{ type: i1.DomSanitizer }], propDecorators: { sections: [{
141
- type: Input
142
- }], showHeader: [{
143
- type: Input
144
- }], sidebarLogo: [{
145
- type: Input
146
- }], showFooter: [{
147
- type: Input
148
- }], collapsed: [{
149
- type: Input
150
- }], itemClick: [{
151
- type: Output
152
- }], collapseChange: [{
153
- type: Output
154
- }] } });
155
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lkZWJhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS1jb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9zaWRlYmFyL3NpZGViYXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWktY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvc2lkZWJhci9zaWRlYmFyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBQ1osdUJBQXVCLEVBQ3hCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7OztBQW1CL0M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCRztBQVNILE1BQU0sT0FBTyxnQkFBZ0I7SUFDM0IsWUFBb0IsU0FBdUI7UUFBdkIsY0FBUyxHQUFULFNBQVMsQ0FBYztRQUUzQzs7V0FFRztRQUNNLGFBQVEsR0FBcUIsRUFBRSxDQUFDO1FBRXpDOztXQUVHO1FBQ00sZUFBVSxHQUFHLElBQUksQ0FBQztRQU8zQjs7V0FFRztRQUNNLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFFNUI7O1dBRUc7UUFDTSxjQUFTLEdBQUcsS0FBSyxDQUFDO1FBRTNCOztXQUVHO1FBQ08sY0FBUyxHQUFHLElBQUksWUFBWSxFQUFtQixDQUFDO1FBRTFEOztXQUVHO1FBQ08sbUJBQWMsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO0lBbkNULENBQUM7SUFxQy9DOztPQUVHO0lBQ0gsV0FBVyxDQUFDLElBQXFCLEVBQUUsS0FBWTtRQUM3QyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdkIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRXhCLG9DQUFvQztRQUNwQyxNQUFNLFVBQVUsR0FB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UUFDSCxDQUFDO1FBRUQsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQzsrR0FqSVUsZ0JBQWdCO21HQUFoQixnQkFBZ0IseVJDeEQ3QiwyakpBb0dBLG0zTURqRFksWUFBWTs7NEZBS1gsZ0JBQWdCO2tCQVI1QixTQUFTOytCQUNFLGNBQWMsY0FDWixJQUFJLFdBQ1AsQ0FBQyxZQUFZLENBQUMsbUJBR04sdUJBQXVCLENBQUMsTUFBTTtpRkFRdEMsUUFBUTtzQkFBaEIsS0FBSztnQkFLRyxVQUFVO3NCQUFsQixLQUFLO2dCQUtHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBS0csVUFBVTtzQkFBbEIsS0FBSztnQkFLRyxTQUFTO3NCQUFqQixLQUFLO2dCQUtJLFNBQVM7c0JBQWxCLE1BQU07Z0JBS0csY0FBYztzQkFBdkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIElucHV0LFxyXG4gIE91dHB1dCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3lcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgRG9tU2FuaXRpemVyLCBTYWZlSHRtbCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTaWRlYmFyTWVudUl0ZW0ge1xyXG4gIGlkOiBzdHJpbmc7XHJcbiAgbGFiZWw6IHN0cmluZztcclxuICBpY29uPzogc3RyaW5nO1xyXG4gIHJvdXRlPzogc3RyaW5nO1xyXG4gIGFjdGl2ZT86IGJvb2xlYW47XHJcbiAgY2hpbGRyZW4/OiBTaWRlYmFyTWVudUl0ZW1bXTtcclxuICBleHBhbmRlZD86IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2lkZWJhclNlY3Rpb24ge1xyXG4gIGlkOiBzdHJpbmc7XHJcbiAgdGl0bGU/OiBzdHJpbmc7XHJcbiAgaXRlbXM6IFNpZGViYXJNZW51SXRlbVtdO1xyXG59XHJcblxyXG4vKipcclxuICogQSBwcm9mZXNzaW9uYWwgc2lkZWJhciBuYXZpZ2F0aW9uIGNvbXBvbmVudCB3aXRoIGNvbGxhcHNpYmxlIHNlY3Rpb25zIGFuZCBuZXN0ZWQgaXRlbXMuXHJcbiAqIFBlcmZlY3QgZm9yIGFwcGxpY2F0aW9uIG5hdmlnYXRpb24gd2l0aCBoaWVyYXJjaGljYWwgbWVudSBzdHJ1Y3R1cmVzLlxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGBodG1sXHJcbiAqIDwhLS0gQmFzaWMgc2lkZWJhciAtLT5cclxuICogPHBlY2Itc2lkZWJhclxyXG4gKiAgIFtzZWN0aW9uc109XCJtZW51U2VjdGlvbnNcIlxyXG4gKiAgIChpdGVtQ2xpY2spPVwib25NZW51SXRlbUNsaWNrKCRldmVudClcIlxyXG4gKiA+PC9wZWNiLXNpZGViYXI+XHJcbiAqXHJcbiAqIDwhLS0gV2l0aCBsb2dvIGhlYWRlciAtLT5cclxuICogPHBlY2Itc2lkZWJhclxyXG4gKiAgIFtzZWN0aW9uc109XCJtZW51U2VjdGlvbnNcIlxyXG4gKiAgIFtzaG93SGVhZGVyXT1cInRydWVcIlxyXG4gKiAgIFtzaWRlYmFyTG9nb109XCJsb2dvU3ZnXCJcclxuICogPjwvcGVjYi1zaWRlYmFyPlxyXG4gKiBgYGBcclxuICpcclxuICogQHB1YmxpY0FwaVxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdwZWNiLXNpZGViYXInLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3NpZGViYXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3NpZGViYXIuY29tcG9uZW50LnNjc3MnXSxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxyXG59KVxyXG5leHBvcnQgY2xhc3MgU2lkZWJhckNvbXBvbmVudCB7XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBzYW5pdGl6ZXI6IERvbVNhbml0aXplcikge31cclxuXHJcbiAgLyoqXHJcbiAgICogQXJyYXkgb2Ygc2lkZWJhciBzZWN0aW9ucyB3aXRoIG1lbnUgaXRlbXNcclxuICAgKi9cclxuICBASW5wdXQoKSBzZWN0aW9uczogU2lkZWJhclNlY3Rpb25bXSA9IFtdO1xyXG5cclxuICAvKipcclxuICAgKiBXaGV0aGVyIHRvIHNob3cgdGhlIGhlYWRlciBzZWN0aW9uXHJcbiAgICovXHJcbiAgQElucHV0KCkgc2hvd0hlYWRlciA9IHRydWU7XHJcblxyXG4gIC8qKlxyXG4gICAqIFNpZGViYXIgbG9nbyBhcyBhbiBTVkcgc3RyaW5nLiBSZW5kZXJlZCBpbiB0aGUgaGVhZGVyIGFyZWEuXHJcbiAgICovXHJcbiAgQElucHV0KCkgc2lkZWJhckxvZ28/OiBzdHJpbmc7XHJcblxyXG4gIC8qKlxyXG4gICAqIFdoZXRoZXIgdG8gc2hvdyB0aGUgZm9vdGVyIHNlY3Rpb25cclxuICAgKi9cclxuICBASW5wdXQoKSBzaG93Rm9vdGVyID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIFdoZXRoZXIgdGhlIHNpZGViYXIgaXMgY29sbGFwc2VkXHJcbiAgICovXHJcbiAgQElucHV0KCkgY29sbGFwc2VkID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIEV2ZW50IGVtaXR0ZWQgd2hlbiBhIG1lbnUgaXRlbSBpcyBjbGlja2VkXHJcbiAgICovXHJcbiAgQE91dHB1dCgpIGl0ZW1DbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8U2lkZWJhck1lbnVJdGVtPigpO1xyXG5cclxuICAvKipcclxuICAgKiBFdmVudCBlbWl0dGVkIHdoZW4gdGhlIHNpZGViYXIgY29sbGFwc2Ugc3RhdGUgY2hhbmdlc1xyXG4gICAqL1xyXG4gIEBPdXRwdXQoKSBjb2xsYXBzZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlIG1lbnUgaXRlbSBjbGlja1xyXG4gICAqL1xyXG4gIG9uSXRlbUNsaWNrKGl0ZW06IFNpZGViYXJNZW51SXRlbSwgZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIHRvcC1sZXZlbCBpdGVtXHJcbiAgICBjb25zdCBpc1RvcExldmVsID0gdGhpcy5zZWN0aW9ucy5zb21lKHNlY3Rpb24gPT5cclxuICAgICAgc2VjdGlvbi5pdGVtcy5pbmNsdWRlcyhpdGVtKVxyXG4gICAgKTtcclxuXHJcbiAgICBpZiAoaXNUb3BMZXZlbCkge1xyXG4gICAgICAvLyBDb2xsYXBzZSBhbGwgb3RoZXIgdG9wLWxldmVsIGl0ZW1zXHJcbiAgICAgIHRoaXMuc2VjdGlvbnMuZm9yRWFjaChzZWN0aW9uID0+IHtcclxuICAgICAgICBzZWN0aW9uLml0ZW1zLmZvckVhY2goc2VjdGlvbkl0ZW0gPT4ge1xyXG4gICAgICAgICAgaWYgKHNlY3Rpb25JdGVtICE9PSBpdGVtICYmIHNlY3Rpb25JdGVtLmV4cGFuZGVkKSB7XHJcbiAgICAgICAgICAgIHNlY3Rpb25JdGVtLmV4cGFuZGVkID0gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChpdGVtLmNoaWxkcmVuICYmIGl0ZW0uY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xyXG4gICAgICBpdGVtLmV4cGFuZGVkID0gIWl0ZW0uZXhwYW5kZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQWx3YXlzIGVtaXQgdGhlIGNsaWNrIGV2ZW50LCBldmVuIGZvciBpdGVtcyB3aXRoIGNoaWxkcmVuXHJcbiAgICB0aGlzLml0ZW1DbGljay5lbWl0KGl0ZW0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVG9nZ2xlIHNpZGViYXIgY29sbGFwc2Ugc3RhdGVcclxuICAgKi9cclxuICB0b2dnbGVDb2xsYXBzZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuY29sbGFwc2VkID0gIXRoaXMuY29sbGFwc2VkO1xyXG4gICAgdGhpcy5jb2xsYXBzZUNoYW5nZS5lbWl0KHRoaXMuY29sbGFwc2VkKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNhbml0aXplIGljb24gU1ZHIEhUTUwgdG8gcHJldmVudCBBbmd1bGFyIGZyb20gc3RyaXBwaW5nIFNWRyBlbGVtZW50c1xyXG4gICAqL1xyXG4gIGdldFNhZmVJY29uKGljb246IHN0cmluZyk6IFNhZmVIdG1sIHtcclxuICAgIHJldHVybiB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbChpY29uKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRyYWNrQnkgZm9yIHNlY3Rpb25zXHJcbiAgICovXHJcbiAgdHJhY2tCeVNlY3Rpb24oX2luZGV4OiBudW1iZXIsIHNlY3Rpb246IFNpZGViYXJTZWN0aW9uKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBzZWN0aW9uLmlkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVHJhY2tCeSBmb3IgbWVudSBpdGVtc1xyXG4gICAqL1xyXG4gIHRyYWNrQnlJdGVtKF9pbmRleDogbnVtYmVyLCBpdGVtOiBTaWRlYmFyTWVudUl0ZW0pOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGl0ZW0uaWQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgQ1NTIGNsYXNzZXMgZm9yIGEgbWVudSBpdGVtXHJcbiAgICovXHJcbiAgZ2V0SXRlbUNsYXNzZXMoaXRlbTogU2lkZWJhck1lbnVJdGVtLCBpc0NoaWxkID0gZmFsc2UsIGlzTmVzdGVkID0gZmFsc2UpOiBzdHJpbmdbXSB7XHJcbiAgICBjb25zdCBjbGFzc2VzID0gW1xyXG4gICAgICBpc0NoaWxkID8gJ3BlY2Itc2lkZWJhcl9fc3ViaXRlbScgOiAncGVjYi1zaWRlYmFyX19pdGVtJ1xyXG4gICAgXTtcclxuXHJcbiAgICBpZiAoaXNOZXN0ZWQpIHtcclxuICAgICAgY2xhc3Nlcy5wdXNoKCdwZWNiLXNpZGViYXJfX3N1Yml0ZW0tLW5lc3RlZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChpdGVtLmFjdGl2ZSkge1xyXG4gICAgICBjbGFzc2VzLnB1c2goaXNDaGlsZCA/ICdwZWNiLXNpZGViYXJfX3N1Yml0ZW0tLWFjdGl2ZScgOiAncGVjYi1zaWRlYmFyX19pdGVtLS1hY3RpdmUnKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoaXRlbS5jaGlsZHJlbiAmJiBpdGVtLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcclxuICAgICAgaWYgKCFpc0NoaWxkKSB7XHJcbiAgICAgICAgY2xhc3Nlcy5wdXNoKCdwZWNiLXNpZGViYXJfX2l0ZW0tLWhhcy1jaGlsZHJlbicpO1xyXG4gICAgICAgIGlmIChpdGVtLmV4cGFuZGVkKSB7XHJcbiAgICAgICAgICBjbGFzc2VzLnB1c2goJ3BlY2Itc2lkZWJhcl9faXRlbS0tZXhwYW5kZWQnKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAoaXNDaGlsZCAmJiAhaXNOZXN0ZWQpIHtcclxuICAgICAgICAvLyBTZWNvbmQtbGV2ZWwgaXRlbXMgd2l0aCBjaGlsZHJlblxyXG4gICAgICAgIGlmIChpdGVtLmV4cGFuZGVkKSB7XHJcbiAgICAgICAgICBjbGFzc2VzLnB1c2goJ3BlY2Itc2lkZWJhcl9faXRlbS0tZXhwYW5kZWQnKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY2xhc3NlcztcclxuICB9XHJcbn1cclxuIiwiPGFzaWRlIGNsYXNzPVwicGVjYi1zaWRlYmFyXCIgW2NsYXNzLnBlY2Itc2lkZWJhci0tY29sbGFwc2VkXT1cImNvbGxhcHNlZFwiPlxyXG4gIDwhLS0gQ29sbGFwc2UgVG9nZ2xlIEJ1dHRvbiAtLT5cclxuICA8YnV0dG9uXHJcbiAgICBjbGFzcz1cInBlY2Itc2lkZWJhcl9fdG9nZ2xlXCJcclxuICAgIFtjbGFzcy5wZWNiLXNpZGViYXJfX3RvZ2dsZS0tY29sbGFwc2VkXT1cImNvbGxhcHNlZFwiXHJcbiAgICAoY2xpY2spPVwidG9nZ2xlQ29sbGFwc2UoKVwiXHJcbiAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImNvbGxhcHNlZCA/ICdFeHBhbmQgc2lkZWJhcicgOiAnQ29sbGFwc2Ugc2lkZWJhcidcIlxyXG4gID5cclxuICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgIDxwYXRoIGQ9XCJNMTAgMTJMNiA4TDEwIDRcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XHJcbiAgICA8L3N2Zz5cclxuICA8L2J1dHRvbj5cclxuXHJcbiAgPCEtLSBIZWFkZXIgU2VjdGlvbiAtLT5cclxuICA8ZGl2ICpuZ0lmPVwic2hvd0hlYWRlclwiIGNsYXNzPVwicGVjYi1zaWRlYmFyX19oZWFkZXJcIj5cclxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltzaWRlYmFyLWhlYWRlcl1cIj48L25nLWNvbnRlbnQ+XHJcbiAgICA8ZGl2ICpuZ0lmPVwic2lkZWJhckxvZ29cIiBjbGFzcz1cInBlY2Itc2lkZWJhcl9faGVhZGVyLWNvbnRlbnRcIj5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJwZWNiLXNpZGViYXJfX2xvZ29cIiBbaW5uZXJIVE1MXT1cImdldFNhZmVJY29uKHNpZGViYXJMb2dvKVwiPjwvc3Bhbj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8IS0tIE5hdmlnYXRpb24gU2VjdGlvbnMgLS0+XHJcbiAgPG5hdiBjbGFzcz1cInBlY2Itc2lkZWJhcl9fbmF2XCI+XHJcbiAgICA8ZGl2ICpuZ0Zvcj1cImxldCBzZWN0aW9uIG9mIHNlY3Rpb25zOyB0cmFja0J5OiB0cmFja0J5U2VjdGlvblwiIGNsYXNzPVwicGVjYi1zaWRlYmFyX19zZWN0aW9uXCI+XHJcbiAgICAgIDwhLS0gU2VjdGlvbiBUaXRsZSAtLT5cclxuICAgICAgPGRpdiAqbmdJZj1cInNlY3Rpb24udGl0bGVcIiBjbGFzcz1cInBlY2Itc2lkZWJhcl9fc2VjdGlvbi10aXRsZVwiPlxyXG4gICAgICAgIHt7IHNlY3Rpb24udGl0bGUgfX1cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8IS0tIE1lbnUgSXRlbXMgLS0+XHJcbiAgICAgIDx1bCBjbGFzcz1cInBlY2Itc2lkZWJhcl9fbWVudVwiPlxyXG4gICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgaXRlbSBvZiBzZWN0aW9uLml0ZW1zOyB0cmFja0J5OiB0cmFja0J5SXRlbVwiPlxyXG4gICAgICAgICAgPCEtLSBQYXJlbnQgSXRlbSAtLT5cclxuICAgICAgICAgIDxhXHJcbiAgICAgICAgICAgIFtjbGFzc109XCJnZXRJdGVtQ2xhc3NlcyhpdGVtKS5qb2luKCcgJylcIlxyXG4gICAgICAgICAgICBbYXR0ci5ocmVmXT1cIml0ZW0ucm91dGUgfHwgJyMnXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uSXRlbUNsaWNrKGl0ZW0sICRldmVudClcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cIml0ZW0uaWNvblwiIGNsYXNzPVwicGVjYi1zaWRlYmFyX19pY29uXCIgW2lubmVySFRNTF09XCJnZXRTYWZlSWNvbihpdGVtLmljb24pXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBlY2Itc2lkZWJhcl9fbGFiZWxcIj57eyBpdGVtLmxhYmVsIH19PC9zcGFuPlxyXG4gICAgICAgICAgPC9hPlxyXG5cclxuICAgICAgICAgIDwhLS0gQ2hpbGQgSXRlbXMgLS0+XHJcbiAgICAgICAgICA8dWxcclxuICAgICAgICAgICAgKm5nSWY9XCJpdGVtLmNoaWxkcmVuICYmIGl0ZW0uY2hpbGRyZW4ubGVuZ3RoID4gMCAmJiAhY29sbGFwc2VkXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJwZWNiLXNpZGViYXJfX3N1Ym1lbnVcIlxyXG4gICAgICAgICAgICBbY2xhc3MucGVjYi1zaWRlYmFyX19zdWJtZW51LS1vcGVuXT1cIml0ZW0uZXhwYW5kZWRcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8bGkgKm5nRm9yPVwibGV0IGNoaWxkIG9mIGl0ZW0uY2hpbGRyZW47IHRyYWNrQnk6IHRyYWNrQnlJdGVtXCI+XHJcbiAgICAgICAgICAgICAgPGFcclxuICAgICAgICAgICAgICAgIFtjbGFzc109XCJnZXRJdGVtQ2xhc3NlcyhjaGlsZCwgdHJ1ZSwgZmFsc2UpLmpvaW4oJyAnKVwiXHJcbiAgICAgICAgICAgICAgICBbYXR0ci5ocmVmXT1cImNoaWxkLnJvdXRlIHx8ICcjJ1wiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25JdGVtQ2xpY2soY2hpbGQsICRldmVudClcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiY2hpbGQuaWNvblwiIGNsYXNzPVwicGVjYi1zaWRlYmFyX19pY29uXCIgW2lubmVySFRNTF09XCJnZXRTYWZlSWNvbihjaGlsZC5pY29uKVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGVjYi1zaWRlYmFyX19sYWJlbFwiPnt7IGNoaWxkLmxhYmVsIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjaGlsZC5jaGlsZHJlbiAmJiBjaGlsZC5jaGlsZHJlbi5sZW5ndGggPiAwXCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwZWNiLXNpZGViYXJfX2Fycm93XCJcclxuICAgICAgICAgICAgICAgICAgW2NsYXNzLnBlY2Itc2lkZWJhcl9fYXJyb3ctLWV4cGFuZGVkXT1cImNoaWxkLmV4cGFuZGVkXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPCEtLSBNaW51cyBpY29uIChleHBhbmRlZCkgLS0+XHJcbiAgICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJjaGlsZC5leHBhbmRlZFwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNCA4aDhcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIxLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIvPlxyXG4gICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgPCEtLSBQbHVzIGljb24gKGNvbGxhcHNlZCkgLS0+XHJcbiAgICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCIhY2hpbGQuZXhwYW5kZWRcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTggNHY4TTQgOGg4XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiLz5cclxuICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9hPlxyXG5cclxuICAgICAgICAgICAgICA8IS0tIE5lc3RlZCBDaGlsZCBJdGVtcyAoVGhpcmQgTGV2ZWwpIC0tPlxyXG4gICAgICAgICAgICAgIDx1bFxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJjaGlsZC5jaGlsZHJlbiAmJiBjaGlsZC5jaGlsZHJlbi5sZW5ndGggPiAwXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwicGVjYi1zaWRlYmFyX19zdWJtZW51XCJcclxuICAgICAgICAgICAgICAgIFtjbGFzcy5wZWNiLXNpZGViYXJfX3N1Ym1lbnUtLW9wZW5dPVwiY2hpbGQuZXhwYW5kZWRcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgbmVzdGVkQ2hpbGQgb2YgY2hpbGQuY2hpbGRyZW47IHRyYWNrQnk6IHRyYWNrQnlJdGVtXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxhXHJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImdldEl0ZW1DbGFzc2VzKG5lc3RlZENoaWxkLCB0cnVlLCB0cnVlKS5qb2luKCcgJylcIlxyXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmhyZWZdPVwibmVzdGVkQ2hpbGQucm91dGUgfHwgJyMnXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25JdGVtQ2xpY2sobmVzdGVkQ2hpbGQsICRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwZWNiLXNpZGViYXJfX2xhYmVsXCI+e3sgbmVzdGVkQ2hpbGQubGFiZWwgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgPC91bD5cclxuICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgPC9saT5cclxuICAgICAgPC91bD5cclxuICAgIDwvZGl2PlxyXG4gIDwvbmF2PlxyXG5cclxuICA8IS0tIEZvb3RlciBTZWN0aW9uIC0tPlxyXG4gIDxkaXYgKm5nSWY9XCJzaG93Rm9vdGVyXCIgY2xhc3M9XCJwZWNiLXNpZGViYXJfX2Zvb3RlclwiPlxyXG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW3NpZGViYXItZm9vdGVyXVwiPjwvbmctY29udGVudD5cclxuICA8L2Rpdj5cclxuPC9hc2lkZT5cclxuIl19
@@ -1,50 +0,0 @@
1
- import { Component, Input, ChangeDetectionStrategy } 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 StatusComponent {
6
- constructor() {
7
- this._id = `status-${Math.random().toString(36).substring(2, 9)}`;
8
- this.type = 'neutral';
9
- this.variant = 'filled';
10
- this.size = 'md';
11
- }
12
- get id() {
13
- return this._id;
14
- }
15
- get statusClasses() {
16
- const classes = [
17
- 'pecb-status',
18
- `pecb-status--${this.size}`
19
- ];
20
- // Only add type and variant classes if not using custom variant
21
- if (this.variant !== 'custom') {
22
- classes.push(`pecb-status--${this.type}`);
23
- classes.push(`pecb-status--${this.variant}`);
24
- }
25
- // Add custom class if provided
26
- if (this.customClass) {
27
- classes.push(...this.customClass.split(' ').filter(c => c.trim()));
28
- }
29
- return classes;
30
- }
31
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: StatusComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
32
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: StatusComponent, isStandalone: true, selector: "pecb-status", inputs: { type: "type", variant: "variant", size: "size", ariaLabel: "ariaLabel", text: "text", customClass: "customClass" }, ngImport: i0, template: "<span\r\n [id]=\"id\"\r\n [ngClass]=\"statusClasses\"\r\n [attr.aria-label]=\"ariaLabel\"\r\n role=\"status\"\r\n>\r\n <ng-content></ng-content>{{ text }}\r\n</span>\r\n", styles: [".pecb-status{display:inline-flex;align-items:center;justify-content:center;font-family:Plus Jakarta Sans,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-weight:500;border-radius:9999px;white-space:nowrap;transition:all .15s ease-in-out;box-sizing:border-box}.pecb-status--outline{border-radius:8px}.pecb-status--sm{padding:2px 8px;font-size:12px;line-height:1.4}.pecb-status--md{padding:4px 12px;font-size:12px;line-height:1.5}.pecb-status--lg{padding:6px 16px;font-size:14px;line-height:1.5}.pecb-status--warning.pecb-status--accent{background-color:#fff4e5;color:#fd7e14}.pecb-status--action.pecb-status--accent{background-color:#e6f0fa;color:#007bff}.pecb-status--success.pecb-status--accent{background-color:#e6f4ea;color:green}.pecb-status--error.pecb-status--accent{background-color:#fdecea;color:#dc3545}.pecb-status--different.pecb-status--accent{background-color:#eee8ff;color:#8e6df0}.pecb-status--disabled.pecb-status--accent{background-color:#f4f4f4;color:#919191}.pecb-status--neutral.pecb-status--accent{background-color:#ececec;color:#313131}.pecb-status--warning.pecb-status--filled{background-color:#fd7e14;color:#fff}.pecb-status--action.pecb-status--filled{background-color:#5eacff;color:#fff}.pecb-status--success.pecb-status--filled{background-color:green;color:#fff}.pecb-status--error.pecb-status--filled{background-color:#dc3545;color:#fff}.pecb-status--different.pecb-status--filled{background-color:#8e6df0;color:#fff}.pecb-status--disabled.pecb-status--filled{background-color:#919191;color:#fff}.pecb-status--neutral.pecb-status--filled{background-color:#313131;color:#fff}.pecb-status--warning.pecb-status--outline{background-color:#fff;color:#fd7e14;border:1px solid #c2c2c2}.pecb-status--action.pecb-status--outline{background-color:#fff;color:#007bff;border:1px solid #c2c2c2}.pecb-status--success.pecb-status--outline{background-color:#fff;color:green;border:1px solid #c2c2c2}.pecb-status--error.pecb-status--outline{background-color:#fff;color:#dc3545;border:1px solid #c2c2c2}.pecb-status--different.pecb-status--outline{background-color:#fff;color:#8e6df0;border:1px solid #c2c2c2}.pecb-status--disabled.pecb-status--outline{background-color:#fff;color:#919191;border:1px solid #c2c2c2}.pecb-status--neutral.pecb-status--outline{background-color:#fff;color:#313131;border:1px solid #c2c2c2}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
33
- }
34
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: StatusComponent, decorators: [{
35
- type: Component,
36
- args: [{ selector: 'pecb-status', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<span\r\n [id]=\"id\"\r\n [ngClass]=\"statusClasses\"\r\n [attr.aria-label]=\"ariaLabel\"\r\n role=\"status\"\r\n>\r\n <ng-content></ng-content>{{ text }}\r\n</span>\r\n", styles: [".pecb-status{display:inline-flex;align-items:center;justify-content:center;font-family:Plus Jakarta Sans,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-weight:500;border-radius:9999px;white-space:nowrap;transition:all .15s ease-in-out;box-sizing:border-box}.pecb-status--outline{border-radius:8px}.pecb-status--sm{padding:2px 8px;font-size:12px;line-height:1.4}.pecb-status--md{padding:4px 12px;font-size:12px;line-height:1.5}.pecb-status--lg{padding:6px 16px;font-size:14px;line-height:1.5}.pecb-status--warning.pecb-status--accent{background-color:#fff4e5;color:#fd7e14}.pecb-status--action.pecb-status--accent{background-color:#e6f0fa;color:#007bff}.pecb-status--success.pecb-status--accent{background-color:#e6f4ea;color:green}.pecb-status--error.pecb-status--accent{background-color:#fdecea;color:#dc3545}.pecb-status--different.pecb-status--accent{background-color:#eee8ff;color:#8e6df0}.pecb-status--disabled.pecb-status--accent{background-color:#f4f4f4;color:#919191}.pecb-status--neutral.pecb-status--accent{background-color:#ececec;color:#313131}.pecb-status--warning.pecb-status--filled{background-color:#fd7e14;color:#fff}.pecb-status--action.pecb-status--filled{background-color:#5eacff;color:#fff}.pecb-status--success.pecb-status--filled{background-color:green;color:#fff}.pecb-status--error.pecb-status--filled{background-color:#dc3545;color:#fff}.pecb-status--different.pecb-status--filled{background-color:#8e6df0;color:#fff}.pecb-status--disabled.pecb-status--filled{background-color:#919191;color:#fff}.pecb-status--neutral.pecb-status--filled{background-color:#313131;color:#fff}.pecb-status--warning.pecb-status--outline{background-color:#fff;color:#fd7e14;border:1px solid #c2c2c2}.pecb-status--action.pecb-status--outline{background-color:#fff;color:#007bff;border:1px solid #c2c2c2}.pecb-status--success.pecb-status--outline{background-color:#fff;color:green;border:1px solid #c2c2c2}.pecb-status--error.pecb-status--outline{background-color:#fff;color:#dc3545;border:1px solid #c2c2c2}.pecb-status--different.pecb-status--outline{background-color:#fff;color:#8e6df0;border:1px solid #c2c2c2}.pecb-status--disabled.pecb-status--outline{background-color:#fff;color:#919191;border:1px solid #c2c2c2}.pecb-status--neutral.pecb-status--outline{background-color:#fff;color:#313131;border:1px solid #c2c2c2}\n"] }]
37
- }], propDecorators: { type: [{
38
- type: Input
39
- }], variant: [{
40
- type: Input
41
- }], size: [{
42
- type: Input
43
- }], ariaLabel: [{
44
- type: Input
45
- }], text: [{
46
- type: Input
47
- }], customClass: [{
48
- type: Input
49
- }] } });
50
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdHVzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3VpLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL3N0YXR1cy9zdGF0dXMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWktY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvc3RhdHVzL3N0YXR1cy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7OztBQWMvQyxNQUFNLE9BQU8sZUFBZTtJQVI1QjtRQVNVLFFBQUcsR0FBRyxVQUFVLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO1FBRTVELFNBQUksR0FBZSxTQUFTLENBQUM7UUFDN0IsWUFBTyxHQUFrQixRQUFRLENBQUM7UUFDbEMsU0FBSSxHQUFlLElBQUksQ0FBQztLQWdDbEM7SUF2QkMsSUFBSSxFQUFFO1FBQ0osT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDO0lBQ2xCLENBQUM7SUFFRCxJQUFJLGFBQWE7UUFDZixNQUFNLE9BQU8sR0FBRztZQUNkLGFBQWE7WUFDYixnQkFBZ0IsSUFBSSxDQUFDLElBQUksRUFBRTtTQUM1QixDQUFDO1FBRUYsZ0VBQWdFO1FBQ2hFLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUM5QixPQUFPLENBQUMsSUFBSSxDQUFDLGdCQUFnQixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUMxQyxPQUFPLENBQUMsSUFBSSxDQUFDLGdCQUFnQixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUMvQyxDQUFDO1FBRUQsK0JBQStCO1FBQy9CLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3JCLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLENBQUM7UUFFRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDOytHQXBDVSxlQUFlO21HQUFmLGVBQWUscU1DZjVCLGdMQVFBLG0yRURFWSxZQUFZOzs0RkFLWCxlQUFlO2tCQVIzQixTQUFTOytCQUNFLGFBQWEsY0FDWCxJQUFJLFdBQ1AsQ0FBQyxZQUFZLENBQUMsbUJBR04sdUJBQXVCLENBQUMsTUFBTTs4QkFLdEMsSUFBSTtzQkFBWixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFHRyxJQUFJO3NCQUFaLEtBQUs7Z0JBR0csV0FBVztzQkFBbkIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcblxyXG5leHBvcnQgdHlwZSBTdGF0dXNUeXBlID0gJ3dhcm5pbmcnIHwgJ2FjdGlvbicgfCAnc3VjY2VzcycgfCAnZXJyb3InIHwgJ2RpZmZlcmVudCcgfCAnZGlzYWJsZWQnIHwgJ25ldXRyYWwnO1xyXG5leHBvcnQgdHlwZSBTdGF0dXNWYXJpYW50ID0gJ2FjY2VudCcgfCAnZmlsbGVkJyB8ICdvdXRsaW5lJyB8ICdjdXN0b20nO1xyXG5leHBvcnQgdHlwZSBTdGF0dXNTaXplID0gJ3NtJyB8ICdtZCcgfCAnbGcnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdwZWNiLXN0YXR1cycsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcclxuICB0ZW1wbGF0ZVVybDogJy4vc3RhdHVzLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9zdGF0dXMuY29tcG9uZW50LnNjc3MnXSxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxyXG59KVxyXG5leHBvcnQgY2xhc3MgU3RhdHVzQ29tcG9uZW50IHtcclxuICBwcml2YXRlIF9pZCA9IGBzdGF0dXMtJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMiwgOSl9YDtcclxuXHJcbiAgQElucHV0KCkgdHlwZTogU3RhdHVzVHlwZSA9ICduZXV0cmFsJztcclxuICBASW5wdXQoKSB2YXJpYW50OiBTdGF0dXNWYXJpYW50ID0gJ2ZpbGxlZCc7XHJcbiAgQElucHV0KCkgc2l6ZTogU3RhdHVzU2l6ZSA9ICdtZCc7XHJcbiAgQElucHV0KCkgYXJpYUxhYmVsPzogc3RyaW5nO1xyXG5cclxuICAvKiogVGV4dCBjb250ZW50IHRvIGRpc3BsYXkgKGFsdGVybmF0aXZlIHRvIG5nLWNvbnRlbnQsIHVzZWZ1bCBmb3IgZHluYW1pYyBjb21wb25lbnRzKSAqL1xyXG4gIEBJbnB1dCgpIHRleHQ/OiBzdHJpbmc7XHJcblxyXG4gIC8qKiBDdXN0b20gQ1NTIGNsYXNzKGVzKSB0byBhZGQgdG8gdGhlIHN0YXR1cyBlbGVtZW50ICovXHJcbiAgQElucHV0KCkgY3VzdG9tQ2xhc3M/OiBzdHJpbmc7XHJcblxyXG4gIGdldCBpZCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lkO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHN0YXR1c0NsYXNzZXMoKTogc3RyaW5nW10ge1xyXG4gICAgY29uc3QgY2xhc3NlcyA9IFtcclxuICAgICAgJ3BlY2Itc3RhdHVzJyxcclxuICAgICAgYHBlY2Itc3RhdHVzLS0ke3RoaXMuc2l6ZX1gXHJcbiAgICBdO1xyXG5cclxuICAgIC8vIE9ubHkgYWRkIHR5cGUgYW5kIHZhcmlhbnQgY2xhc3NlcyBpZiBub3QgdXNpbmcgY3VzdG9tIHZhcmlhbnRcclxuICAgIGlmICh0aGlzLnZhcmlhbnQgIT09ICdjdXN0b20nKSB7XHJcbiAgICAgIGNsYXNzZXMucHVzaChgcGVjYi1zdGF0dXMtLSR7dGhpcy50eXBlfWApO1xyXG4gICAgICBjbGFzc2VzLnB1c2goYHBlY2Itc3RhdHVzLS0ke3RoaXMudmFyaWFudH1gKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBBZGQgY3VzdG9tIGNsYXNzIGlmIHByb3ZpZGVkXHJcbiAgICBpZiAodGhpcy5jdXN0b21DbGFzcykge1xyXG4gICAgICBjbGFzc2VzLnB1c2goLi4udGhpcy5jdXN0b21DbGFzcy5zcGxpdCgnICcpLmZpbHRlcihjID0+IGMudHJpbSgpKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNsYXNzZXM7XHJcbiAgfVxyXG59XHJcbiIsIjxzcGFuXHJcbiAgW2lkXT1cImlkXCJcclxuICBbbmdDbGFzc109XCJzdGF0dXNDbGFzc2VzXCJcclxuICBbYXR0ci5hcmlhLWxhYmVsXT1cImFyaWFMYWJlbFwiXHJcbiAgcm9sZT1cInN0YXR1c1wiXHJcbj5cclxuICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+e3sgdGV4dCB9fVxyXG48L3NwYW4+XHJcbiJdfQ==