@pecb-ui/components 1.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/README.md +556 -0
  2. package/esm2022/lib/components/button/button.component.mjs +171 -0
  3. package/esm2022/lib/components/card/card.component.mjs +182 -0
  4. package/esm2022/lib/components/checkbox/checkbox.component.mjs +126 -0
  5. package/esm2022/lib/components/datepicker/datepicker.component.mjs +349 -0
  6. package/esm2022/lib/components/dropdown/dropdown.component.mjs +329 -0
  7. package/esm2022/lib/components/input/input.component.mjs +321 -0
  8. package/esm2022/lib/components/pagination/pagination.component.mjs +197 -0
  9. package/esm2022/lib/components/radio/radio.component.mjs +147 -0
  10. package/esm2022/lib/components/right-modal/right-modal.component.mjs +234 -0
  11. package/esm2022/lib/components/sidebar/sidebar.component.mjs +155 -0
  12. package/esm2022/lib/components/status/status.component.mjs +50 -0
  13. package/esm2022/lib/components/tab/tab.component.mjs +151 -0
  14. package/esm2022/lib/components/table/table.component.mjs +503 -0
  15. package/esm2022/lib/components/toggle/toggle.component.mjs +126 -0
  16. package/esm2022/lib/pecb-components.module.mjs +118 -0
  17. package/esm2022/lib/services/loading.service.mjs +182 -0
  18. package/esm2022/lib/services/notification.service.mjs +144 -0
  19. package/esm2022/lib/services/theme.service.mjs +232 -0
  20. package/esm2022/lib/shared/interfaces/component.interfaces.mjs +2 -0
  21. package/esm2022/lib/shared/types/common.types.mjs +6 -0
  22. package/esm2022/lib/shared/utils/accessibility.utils.mjs +223 -0
  23. package/esm2022/lib/shared/utils/dom.utils.mjs +240 -0
  24. package/esm2022/lib/shared/utils/error.utils.mjs +277 -0
  25. package/esm2022/lib/shared/utils/string.utils.mjs +204 -0
  26. package/esm2022/pecb-ui-components.mjs +5 -0
  27. package/esm2022/public-api.mjs +53 -0
  28. package/fesm2022/pecb-ui-components.mjs +4587 -0
  29. package/fesm2022/pecb-ui-components.mjs.map +1 -0
  30. package/index.d.ts +5 -0
  31. package/lib/components/button/button.component.d.ts +130 -0
  32. package/lib/components/card/card.component.d.ts +140 -0
  33. package/lib/components/checkbox/checkbox.component.d.ts +74 -0
  34. package/lib/components/datepicker/datepicker.component.d.ts +155 -0
  35. package/lib/components/dropdown/dropdown.component.d.ts +144 -0
  36. package/lib/components/input/input.component.d.ts +215 -0
  37. package/lib/components/pagination/pagination.component.d.ts +53 -0
  38. package/lib/components/radio/radio.component.d.ts +93 -0
  39. package/lib/components/right-modal/right-modal.component.d.ts +137 -0
  40. package/lib/components/sidebar/sidebar.component.d.ts +97 -0
  41. package/lib/components/status/status.component.d.ts +19 -0
  42. package/lib/components/tab/tab.component.d.ts +102 -0
  43. package/lib/components/table/table.component.d.ts +403 -0
  44. package/lib/components/toggle/toggle.component.d.ts +74 -0
  45. package/lib/pecb-components.module.d.ts +37 -0
  46. package/lib/services/loading.service.d.ts +129 -0
  47. package/lib/services/notification.service.d.ts +136 -0
  48. package/lib/services/theme.service.d.ts +142 -0
  49. package/lib/shared/interfaces/component.interfaces.d.ts +283 -0
  50. package/lib/shared/types/common.types.d.ts +86 -0
  51. package/lib/shared/utils/accessibility.utils.d.ts +167 -0
  52. package/lib/shared/utils/dom.utils.d.ts +108 -0
  53. package/lib/shared/utils/error.utils.d.ts +191 -0
  54. package/lib/shared/utils/string.utils.d.ts +144 -0
  55. package/package.json +61 -0
  56. package/public-api.d.ts +24 -0
@@ -0,0 +1,234 @@
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
@@ -0,0 +1,155 @@
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lkZWJhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS1jb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9zaWRlYmFyL3NpZGViYXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWktY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvc2lkZWJhci9zaWRlYmFyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBQ1osdUJBQXVCLEVBQ3hCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7OztBQW1CL0M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCRztBQVNILE1BQU0sT0FBTyxnQkFBZ0I7SUFDM0IsWUFBb0IsU0FBdUI7UUFBdkIsY0FBUyxHQUFULFNBQVMsQ0FBYztRQUUzQzs7V0FFRztRQUNNLGFBQVEsR0FBcUIsRUFBRSxDQUFDO1FBRXpDOztXQUVHO1FBQ00sZUFBVSxHQUFHLElBQUksQ0FBQztRQU8zQjs7V0FFRztRQUNNLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFFNUI7O1dBRUc7UUFDTSxjQUFTLEdBQUcsS0FBSyxDQUFDO1FBRTNCOztXQUVHO1FBQ08sY0FBUyxHQUFHLElBQUksWUFBWSxFQUFtQixDQUFDO1FBRTFEOztXQUVHO1FBQ08sbUJBQWMsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO0lBbkNULENBQUM7SUFxQy9DOztPQUVHO0lBQ0gsV0FBVyxDQUFDLElBQXFCLEVBQUUsS0FBWTtRQUM3QyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdkIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRXhCLG9DQUFvQztRQUNwQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUM5QyxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FDN0IsQ0FBQztRQUVGLElBQUksVUFBVSxFQUFFLENBQUM7WUFDZixxQ0FBcUM7WUFDckMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQzlCLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxFQUFFO29CQUNsQyxJQUFJLFdBQVcsS0FBSyxJQUFJLElBQUksV0FBVyxDQUFDLFFBQVEsRUFBRSxDQUFDO3dCQUNqRCxXQUFXLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztvQkFDL0IsQ0FBQztnQkFDSCxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUM5QyxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUNqQyxDQUFDO1FBRUQsNERBQTREO1FBQzVELElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRDs7T0FFRztJQUNILGNBQWM7UUFDWixJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUNqQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVEOztPQUVHO0lBQ0gsV0FBVyxDQUFDLElBQVk7UUFDdEIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRDs7T0FFRztJQUNILGNBQWMsQ0FBQyxNQUFjLEVBQUUsT0FBdUI7UUFDcEQsT0FBTyxPQUFPLENBQUMsRUFBRSxDQUFDO0lBQ3BCLENBQUM7SUFFRDs7T0FFRztJQUNILFdBQVcsQ0FBQyxNQUFjLEVBQUUsSUFBcUI7UUFDL0MsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7T0FFRztJQUNILGNBQWMsQ0FBQyxJQUFxQixFQUFFLE9BQU8sR0FBRyxLQUFLLEVBQUUsUUFBUSxHQUFHLEtBQUs7UUFDckUsTUFBTSxPQUFPLEdBQUc7WUFDZCxPQUFPLENBQUMsQ0FBQyxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxvQkFBb0I7U0FDekQsQ0FBQztRQUVGLElBQUksUUFBUSxFQUFFLENBQUM7WUFDYixPQUFPLENBQUMsSUFBSSxDQUFDLCtCQUErQixDQUFDLENBQUM7UUFDaEQsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2hCLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDLENBQUMsNEJBQTRCLENBQUMsQ0FBQztRQUN6RixDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzlDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDYixPQUFPLENBQUMsSUFBSSxDQUFDLGtDQUFrQyxDQUFDLENBQUM7Z0JBQ2pELElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUNsQixPQUFPLENBQUMsSUFBSSxDQUFDLDhCQUE4QixDQUFDLENBQUM7Z0JBQy9DLENBQUM7WUFDSCxDQUFDO2lCQUFNLElBQUksT0FBTyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ2hDLG1DQUFtQztnQkFDbkMsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ2xCLE9BQU8sQ0FBQyxJQUFJLENBQUMsOEJBQThCLENBQUMsQ0FBQztnQkFDL0MsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQzsrR0FqSVUsZ0JBQWdCO21HQUFoQixnQkFBZ0IseVJDeEQ3QiwyakpBb0dBLG0zTURqRFksWUFBWTs7NEZBS1gsZ0JBQWdCO2tCQVI1QixTQUFTOytCQUNFLGNBQWMsY0FDWixJQUFJLFdBQ1AsQ0FBQyxZQUFZLENBQUMsbUJBR04sdUJBQXVCLENBQUMsTUFBTTtpRkFRdEMsUUFBUTtzQkFBaEIsS0FBSztnQkFLRyxVQUFVO3NCQUFsQixLQUFLO2dCQUtHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBS0csVUFBVTtzQkFBbEIsS0FBSztnQkFLRyxTQUFTO3NCQUFqQixLQUFLO2dCQUtJLFNBQVM7c0JBQWxCLE1BQU07Z0JBS0csY0FBYztzQkFBdkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIElucHV0LFxyXG4gIE91dHB1dCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3lcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgRG9tU2FuaXRpemVyLCBTYWZlSHRtbCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTaWRlYmFyTWVudUl0ZW0ge1xyXG4gIGlkOiBzdHJpbmc7XHJcbiAgbGFiZWw6IHN0cmluZztcclxuICBpY29uPzogc3RyaW5nO1xyXG4gIHJvdXRlPzogc3RyaW5nO1xyXG4gIGFjdGl2ZT86IGJvb2xlYW47XHJcbiAgY2hpbGRyZW4/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
@@ -0,0 +1,50 @@
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==