@dso-design-system/ui 0.0.1 → 0.1.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 (65) hide show
  1. package/esm2022/lib/alert/alert.component.mjs +54 -0
  2. package/esm2022/lib/badge/badge.component.mjs +22 -0
  3. package/esm2022/lib/breadcrumb/breadcrumb.component.mjs +29 -0
  4. package/esm2022/lib/checkbox/checkbox.component.mjs +82 -0
  5. package/esm2022/lib/datepicker/datepicker.component.mjs +161 -0
  6. package/esm2022/lib/dialog/dialog.component.mjs +25 -0
  7. package/esm2022/lib/directives/truncate.directive.mjs +71 -0
  8. package/esm2022/lib/dropdown-list/dropdown-list.component.mjs +89 -0
  9. package/esm2022/lib/file-upload-items/file-upload-items.component.mjs +65 -0
  10. package/esm2022/lib/file-upload-multiple/file-upload-multiple.component.mjs +232 -0
  11. package/esm2022/lib/file-upload-multiple/upload-item.model.mjs +2 -0
  12. package/esm2022/lib/file-upload-multiple/upload-simulator.service.mjs +76 -0
  13. package/esm2022/lib/file-upload-single/file-upload-single.component.mjs +100 -0
  14. package/esm2022/lib/input-text/input-text.component.mjs +93 -0
  15. package/esm2022/lib/pagination/pagination.component.mjs +115 -0
  16. package/esm2022/lib/progress-bar/progress-bar.component.mjs +25 -0
  17. package/esm2022/lib/radio/radio.component.mjs +41 -0
  18. package/esm2022/lib/select-dropdown/select-dropdown.component.mjs +228 -0
  19. package/esm2022/lib/service/toast.service.mjs +20 -0
  20. package/esm2022/lib/side-navigation-bar/side-navigation-bar.component.mjs +113 -0
  21. package/esm2022/lib/spinner/spinner.component.mjs +60 -0
  22. package/esm2022/lib/table/table.component.mjs +136 -0
  23. package/esm2022/lib/tabs/tab.component.mjs +20 -0
  24. package/esm2022/lib/tabs/tabs.component.mjs +40 -0
  25. package/esm2022/lib/tag/tag.component.mjs +27 -0
  26. package/esm2022/lib/text-area/text-area.component.mjs +74 -0
  27. package/esm2022/lib/toast/toast.component.mjs +36 -0
  28. package/esm2022/lib/tooltip/tooltip.component.mjs +38 -0
  29. package/esm2022/lib/tooltip/tooltip.directive.mjs +105 -0
  30. package/esm2022/lib/top-navigation-bar/top-navigation-bar.component.mjs +24 -0
  31. package/esm2022/public-api.mjs +27 -2
  32. package/fesm2022/dso-design-system-ui.mjs +2056 -3
  33. package/fesm2022/dso-design-system-ui.mjs.map +1 -1
  34. package/lib/alert/alert.component.d.ts +20 -0
  35. package/lib/badge/badge.component.d.ts +8 -0
  36. package/lib/breadcrumb/breadcrumb.component.d.ts +15 -0
  37. package/lib/checkbox/checkbox.component.d.ts +42 -0
  38. package/lib/datepicker/datepicker.component.d.ts +48 -0
  39. package/lib/dialog/dialog.component.d.ts +10 -0
  40. package/lib/directives/truncate.directive.d.ts +23 -0
  41. package/lib/dropdown-list/dropdown-list.component.d.ts +33 -0
  42. package/lib/file-upload-items/file-upload-items.component.d.ts +27 -0
  43. package/lib/file-upload-multiple/file-upload-multiple.component.d.ts +44 -0
  44. package/lib/file-upload-multiple/upload-item.model.d.ts +7 -0
  45. package/lib/file-upload-multiple/upload-simulator.service.d.ts +34 -0
  46. package/lib/file-upload-single/file-upload-single.component.d.ts +28 -0
  47. package/lib/input-text/input-text.component.d.ts +24 -0
  48. package/lib/pagination/pagination.component.d.ts +31 -0
  49. package/lib/progress-bar/progress-bar.component.d.ts +11 -0
  50. package/lib/radio/radio.component.d.ts +14 -0
  51. package/lib/select-dropdown/select-dropdown.component.d.ts +78 -0
  52. package/lib/service/toast.service.d.ts +16 -0
  53. package/lib/side-navigation-bar/side-navigation-bar.component.d.ts +74 -0
  54. package/lib/spinner/spinner.component.d.ts +23 -0
  55. package/lib/table/table.component.d.ts +43 -0
  56. package/lib/tabs/tab.component.d.ts +9 -0
  57. package/lib/tabs/tabs.component.d.ts +15 -0
  58. package/lib/tag/tag.component.d.ts +10 -0
  59. package/lib/text-area/text-area.component.d.ts +21 -0
  60. package/lib/toast/toast.component.d.ts +13 -0
  61. package/lib/tooltip/tooltip.component.d.ts +15 -0
  62. package/lib/tooltip/tooltip.directive.d.ts +19 -0
  63. package/lib/top-navigation-bar/top-navigation-bar.component.d.ts +16 -0
  64. package/package.json +13 -7
  65. package/public-api.d.ts +25 -0
@@ -0,0 +1,54 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { Component, Input } from '@angular/core';
3
+ import { ButtonComponent } from '../button/button.component';
4
+ import { IconComponent } from '../icon/icon.component';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/common";
7
+ export class AlertComponent {
8
+ type = 'info';
9
+ message = '';
10
+ showActions = false;
11
+ isDismissable = true;
12
+ actions = [];
13
+ isVisible = true;
14
+ isHiding = false;
15
+ close() {
16
+ this.isHiding = true;
17
+ // Wait for fadeOut animation to finish before removing the alert
18
+ setTimeout(() => {
19
+ this.isVisible = false;
20
+ }, 300); // match duration in CSS
21
+ }
22
+ // Pick the icon name based on alert type
23
+ get iconName() {
24
+ switch (this.type) {
25
+ case 'success': return 'icon-slanted-check';
26
+ case 'error': return 'icon-left-align';
27
+ case 'warning': return 'icon-van';
28
+ default: return 'icon-notification';
29
+ }
30
+ }
31
+ /** Handle when a button inside the alert is clicked */
32
+ handleAction(action) {
33
+ if (action.onClick) {
34
+ action.onClick();
35
+ }
36
+ }
37
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AlertComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
38
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: AlertComponent, isStandalone: true, selector: "dso-alert", inputs: { type: "type", message: "message", showActions: "showActions", isDismissable: "isDismissable", actions: "actions" }, ngImport: i0, template: "\r\n<div\r\n*ngIf=\"isVisible\"\r\nclass=\"alert\"\r\n[ngClass]=\"[type, isHiding ? 'hide' : '']\"> \r\n <div class=\"positioning\">\r\n <dso-icon [iconName]=\"iconName\" [size]=\"'medium'\"></dso-icon>\r\n </div>\r\n <span [innerHTML]=\"message\"></span>\r\n\r\n <div class=\"positioning\" *ngIf=\"actions && actions.length > 0 || isDismissable\">\r\n <div class=\"button-wrapper\">\r\n <dso-button\r\n *ngFor=\"let action of actions\"\r\n [btnLabel]=\"action.btnLabel\"\r\n [btnType]=\"action.btnType || 'contrast'\" \r\n [btnSize]=\"action.btnSize || 'mdBtn'\"\r\n [btnIconName]=\"action.btnIconName ?? null\"\r\n [isDisabled]=\"action.isDisabled || false\"\r\n (click)=\"handleAction(action)\">\r\n </dso-button>\r\n </div>\r\n <button (click)=\"close()\" *ngIf=\"isDismissable\" class=\"close-btn\">&times;</button>\r\n </div>\r\n \r\n</div>", styles: ["@charset \"UTF-8\";@keyframes fadeIn{0%{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:translateY(0)}}@keyframes fadeOut{0%{opacity:1}to{opacity:0}}.alert{padding:12px 16px;border-radius:5px;gap:16px;display:flex;align-items:stretch;font-size:16px;animation:fadeIn .4s ease-in}.alert.hide{animation:fadeOut .4s ease-out forwards}.success{background-color:#77c98a;color:#fff}.error{background-color:#dc3545;color:#fff}.info{background-color:#17a2b8;color:#fff}.warning{background-color:#ffc107;color:#000}.close-btn{width:24px;height:24px;padding:0;margin:0;display:flex;align-items:center;justify-content:center;background:none;border:none;font-size:24px;line-height:1;color:inherit;cursor:pointer}.close-btn:hover{opacity:.7}.content-wrapper{display:flex;align-items:center;flex:1;gap:12px}.positioning{display:flex;align-items:flex-start;align-self:stretch}span{flex-grow:1;line-height:1.4;max-height:7em;overflow-y:auto}.button-wrapper{display:flex;flex-direction:column;gap:8px;padding-right:8px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ButtonComponent, selector: "dso-button", inputs: ["btnLabel", "btnType", "btnSize", "btnIconName", "isDisabled", "isActive"], outputs: ["onClick"] }, { kind: "component", type: IconComponent, selector: "dso-icon", inputs: ["iconName", "size"] }] });
39
+ }
40
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AlertComponent, decorators: [{
41
+ type: Component,
42
+ args: [{ selector: 'dso-alert', standalone: true, imports: [CommonModule, ButtonComponent, IconComponent], template: "\r\n<div\r\n*ngIf=\"isVisible\"\r\nclass=\"alert\"\r\n[ngClass]=\"[type, isHiding ? 'hide' : '']\"> \r\n <div class=\"positioning\">\r\n <dso-icon [iconName]=\"iconName\" [size]=\"'medium'\"></dso-icon>\r\n </div>\r\n <span [innerHTML]=\"message\"></span>\r\n\r\n <div class=\"positioning\" *ngIf=\"actions && actions.length > 0 || isDismissable\">\r\n <div class=\"button-wrapper\">\r\n <dso-button\r\n *ngFor=\"let action of actions\"\r\n [btnLabel]=\"action.btnLabel\"\r\n [btnType]=\"action.btnType || 'contrast'\" \r\n [btnSize]=\"action.btnSize || 'mdBtn'\"\r\n [btnIconName]=\"action.btnIconName ?? null\"\r\n [isDisabled]=\"action.isDisabled || false\"\r\n (click)=\"handleAction(action)\">\r\n </dso-button>\r\n </div>\r\n <button (click)=\"close()\" *ngIf=\"isDismissable\" class=\"close-btn\">&times;</button>\r\n </div>\r\n \r\n</div>", styles: ["@charset \"UTF-8\";@keyframes fadeIn{0%{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:translateY(0)}}@keyframes fadeOut{0%{opacity:1}to{opacity:0}}.alert{padding:12px 16px;border-radius:5px;gap:16px;display:flex;align-items:stretch;font-size:16px;animation:fadeIn .4s ease-in}.alert.hide{animation:fadeOut .4s ease-out forwards}.success{background-color:#77c98a;color:#fff}.error{background-color:#dc3545;color:#fff}.info{background-color:#17a2b8;color:#fff}.warning{background-color:#ffc107;color:#000}.close-btn{width:24px;height:24px;padding:0;margin:0;display:flex;align-items:center;justify-content:center;background:none;border:none;font-size:24px;line-height:1;color:inherit;cursor:pointer}.close-btn:hover{opacity:.7}.content-wrapper{display:flex;align-items:center;flex:1;gap:12px}.positioning{display:flex;align-items:flex-start;align-self:stretch}span{flex-grow:1;line-height:1.4;max-height:7em;overflow-y:auto}.button-wrapper{display:flex;flex-direction:column;gap:8px;padding-right:8px}\n"] }]
43
+ }], propDecorators: { type: [{
44
+ type: Input
45
+ }], message: [{
46
+ type: Input
47
+ }], showActions: [{
48
+ type: Input
49
+ }], isDismissable: [{
50
+ type: Input
51
+ }], actions: [{
52
+ type: Input
53
+ }] } });
54
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxlcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWkvc3JjL2xpYi9hbGVydC9hbGVydC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS9zcmMvbGliL2FsZXJ0L2FsZXJ0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBQUUsZUFBZSxFQUFnQixNQUFNLDRCQUE0QixDQUFDO0FBQzNFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7O0FBZXZELE1BQU0sT0FBTyxjQUFjO0lBQ2hCLElBQUksR0FBNkMsTUFBTSxDQUFDO0lBQ3hELE9BQU8sR0FBRyxFQUFFLENBQUM7SUFDYixXQUFXLEdBQUcsS0FBSyxDQUFDO0lBQ3BCLGFBQWEsR0FBRyxJQUFJLENBQUM7SUFDckIsT0FBTyxHQUFrQixFQUFFLENBQUM7SUFHckMsU0FBUyxHQUFHLElBQUksQ0FBQztJQUNqQixRQUFRLEdBQUcsS0FBSyxDQUFDO0lBRWpCLEtBQUs7UUFDSCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUNyQixpRUFBaUU7UUFDakUsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLHdCQUF3QjtJQUNuQyxDQUFDO0lBRUMseUNBQXlDO0lBQzNDLElBQUksUUFBUTtRQUNWLFFBQVEsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2xCLEtBQUssU0FBUyxDQUFDLENBQUMsT0FBTyxvQkFBb0IsQ0FBQztZQUM1QyxLQUFLLE9BQU8sQ0FBQyxDQUFDLE9BQU8saUJBQWlCLENBQUM7WUFDdkMsS0FBSyxTQUFTLENBQUMsQ0FBQyxPQUFPLFVBQVUsQ0FBQztZQUNsQyxPQUFPLENBQUMsQ0FBQyxPQUFPLG1CQUFtQixDQUFDO1FBQ3RDLENBQUM7SUFDSCxDQUFDO0lBRUMsdURBQXVEO0lBQ3pELFlBQVksQ0FBQyxNQUFtQjtRQUM5QixJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNuQixNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDbkIsQ0FBQztJQUNILENBQUM7d0dBbENVLGNBQWM7NEZBQWQsY0FBYyxtTUNsQjNCLDg5QkF5Qk0sZ2pDRFpPLFlBQVksOFZBQUUsZUFBZSxrS0FBRSxhQUFhOzs0RkFLNUMsY0FBYztrQkFSMUIsU0FBUzsrQkFDRSxXQUFXLGNBQ1QsSUFBSSxXQUNQLENBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxhQUFhLENBQUU7OEJBTWhELElBQUk7c0JBQVosS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQnV0dG9uQ29tcG9uZW50LCBCdXR0b25Db25maWcgfSBmcm9tICcuLi9idXR0b24vYnV0dG9uLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEljb25Db21wb25lbnQgfSBmcm9tICcuLi9pY29uL2ljb24uY29tcG9uZW50JztcclxuXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEFsZXJ0QWN0aW9uIGV4dGVuZHMgQnV0dG9uQ29uZmlnIHtcclxuICBvbkNsaWNrPzogKCkgPT4gdm9pZDtcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdkc28tYWxlcnQnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogWyBDb21tb25Nb2R1bGUsIEJ1dHRvbkNvbXBvbmVudCwgSWNvbkNvbXBvbmVudCBdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9hbGVydC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL2FsZXJ0LmNvbXBvbmVudC5zY3NzJ1xyXG59KVxyXG5cclxuZXhwb3J0IGNsYXNzIEFsZXJ0Q29tcG9uZW50IHtcclxuICBASW5wdXQoKSB0eXBlOiAnc3VjY2VzcycgfCAnZXJyb3InIHwgJ2luZm8nIHwgJ3dhcm5pbmcnID0gJ2luZm8nO1xyXG4gIEBJbnB1dCgpIG1lc3NhZ2UgPSAnJztcclxuICBASW5wdXQoKSBzaG93QWN0aW9ucyA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGlzRGlzbWlzc2FibGUgPSB0cnVlO1xyXG4gIEBJbnB1dCgpIGFjdGlvbnM6IEFsZXJ0QWN0aW9uW10gPSBbXTtcclxuXHJcblxyXG4gIGlzVmlzaWJsZSA9IHRydWU7XHJcbiAgaXNIaWRpbmcgPSBmYWxzZTtcclxuXHJcbiAgY2xvc2UoKSB7XHJcbiAgICB0aGlzLmlzSGlkaW5nID0gdHJ1ZTtcclxuICAgIC8vIFdhaXQgZm9yIGZhZGVPdXQgYW5pbWF0aW9uIHRvIGZpbmlzaCBiZWZvcmUgcmVtb3ZpbmcgdGhlIGFsZXJ0XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5pc1Zpc2libGUgPSBmYWxzZTtcclxuICAgIH0sIDMwMCk7IC8vIG1hdGNoIGR1cmF0aW9uIGluIENTU1xyXG4gIH1cclxuXHJcbiAgICAvLyBQaWNrIHRoZSBpY29uIG5hbWUgYmFzZWQgb24gYWxlcnQgdHlwZVxyXG4gIGdldCBpY29uTmFtZSgpOiBzdHJpbmcge1xyXG4gICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcclxuICAgICAgY2FzZSAnc3VjY2Vzcyc6IHJldHVybiAnaWNvbi1zbGFudGVkLWNoZWNrJztcclxuICAgICAgY2FzZSAnZXJyb3InOiByZXR1cm4gJ2ljb24tbGVmdC1hbGlnbic7XHJcbiAgICAgIGNhc2UgJ3dhcm5pbmcnOiByZXR1cm4gJ2ljb24tdmFuJztcclxuICAgICAgZGVmYXVsdDogcmV0dXJuICdpY29uLW5vdGlmaWNhdGlvbic7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAgIC8qKiBIYW5kbGUgd2hlbiBhIGJ1dHRvbiBpbnNpZGUgdGhlIGFsZXJ0IGlzIGNsaWNrZWQgKi9cclxuICBoYW5kbGVBY3Rpb24oYWN0aW9uOiBBbGVydEFjdGlvbikge1xyXG4gICAgaWYgKGFjdGlvbi5vbkNsaWNrKSB7XHJcbiAgICAgIGFjdGlvbi5vbkNsaWNrKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxufSIsIlxyXG48ZGl2XHJcbipuZ0lmPVwiaXNWaXNpYmxlXCJcclxuY2xhc3M9XCJhbGVydFwiXHJcbltuZ0NsYXNzXT1cIlt0eXBlLCBpc0hpZGluZyA/ICdoaWRlJyA6ICcnXVwiPiAgXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInBvc2l0aW9uaW5nXCI+XHJcbiAgICAgICAgPGRzby1pY29uIFtpY29uTmFtZV09XCJpY29uTmFtZVwiIFtzaXplXT1cIidtZWRpdW0nXCI+PC9kc28taWNvbj5cclxuICAgIDwvZGl2PlxyXG4gICAgPHNwYW4gW2lubmVySFRNTF09XCJtZXNzYWdlXCI+PC9zcGFuPlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJwb3NpdGlvbmluZ1wiICpuZ0lmPVwiYWN0aW9ucyAmJiBhY3Rpb25zLmxlbmd0aCA+IDAgfHwgaXNEaXNtaXNzYWJsZVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJidXR0b24td3JhcHBlclwiPlxyXG4gICAgICAgIDxkc28tYnV0dG9uXHJcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBhY3Rpb24gb2YgYWN0aW9uc1wiXHJcbiAgICAgICAgICAgIFtidG5MYWJlbF09XCJhY3Rpb24uYnRuTGFiZWxcIlxyXG4gICAgICAgICAgICBbYnRuVHlwZV09XCJhY3Rpb24uYnRuVHlwZSB8fCAnY29udHJhc3QnXCIgXHJcbiAgICAgICAgICAgIFtidG5TaXplXT1cImFjdGlvbi5idG5TaXplIHx8ICdtZEJ0bidcIlxyXG4gICAgICAgICAgICBbYnRuSWNvbk5hbWVdPVwiYWN0aW9uLmJ0bkljb25OYW1lID8/IG51bGxcIlxyXG4gICAgICAgICAgICBbaXNEaXNhYmxlZF09XCJhY3Rpb24uaXNEaXNhYmxlZCB8fCBmYWxzZVwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVBY3Rpb24oYWN0aW9uKVwiPlxyXG4gICAgICAgIDwvZHNvLWJ1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8YnV0dG9uIChjbGljayk9XCJjbG9zZSgpXCIgKm5nSWY9XCJpc0Rpc21pc3NhYmxlXCIgY2xhc3M9XCJjbG9zZS1idG5cIj4mdGltZXM7PC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuICAgIFxyXG48L2Rpdj4iXX0=
@@ -0,0 +1,22 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { Component, Input } from '@angular/core';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@angular/common";
5
+ export class BadgeComponent {
6
+ label = null;
7
+ color = 'primary';
8
+ get isDot() {
9
+ return this.label === null || this.label === '' || this.label === undefined;
10
+ }
11
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BadgeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
12
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: BadgeComponent, isStandalone: true, selector: "dso-badge", inputs: { label: "label", color: "color" }, ngImport: i0, template: "<span class=\"badge\" [ngClass]=\"[color, isDot ? 'dot' : '']\">\r\n <ng-container *ngIf=\"!isDot\">{{ label }}</ng-container>\r\n</span>", styles: [".badge{display:inline-flex;align-items:center;justify-content:center;padding:.25rem .5rem;border-radius:1rem;font-size:.75rem;font-weight:600;text-transform:uppercase;color:#fff;line-height:1;min-width:1.25rem}.primary{background-color:#007bff}.success{background-color:#28a745}.warning{background-color:#ffc107;color:#000}.danger{background-color:#dc3545}.badge.dot{padding:0;width:.5rem;height:.5rem;min-width:0;border-radius:50%}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
13
+ }
14
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BadgeComponent, decorators: [{
15
+ type: Component,
16
+ args: [{ selector: 'dso-badge', standalone: true, imports: [CommonModule], template: "<span class=\"badge\" [ngClass]=\"[color, isDot ? 'dot' : '']\">\r\n <ng-container *ngIf=\"!isDot\">{{ label }}</ng-container>\r\n</span>", styles: [".badge{display:inline-flex;align-items:center;justify-content:center;padding:.25rem .5rem;border-radius:1rem;font-size:.75rem;font-weight:600;text-transform:uppercase;color:#fff;line-height:1;min-width:1.25rem}.primary{background-color:#007bff}.success{background-color:#28a745}.warning{background-color:#ffc107;color:#000}.danger{background-color:#dc3545}.badge.dot{padding:0;width:.5rem;height:.5rem;min-width:0;border-radius:50%}\n"] }]
17
+ }], propDecorators: { label: [{
18
+ type: Input
19
+ }], color: [{
20
+ type: Input
21
+ }] } });
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFkZ2UuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWkvc3JjL2xpYi9iYWRnZS9iYWRnZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS9zcmMvbGliL2JhZGdlL2JhZGdlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQzs7O0FBVWpELE1BQU0sT0FBTyxjQUFjO0lBRWhCLEtBQUssR0FBMkIsSUFBSSxDQUFDO0lBQ3JDLEtBQUssR0FBaUQsU0FBUyxDQUFDO0lBRXpFLElBQUksS0FBSztRQUNQLE9BQU8sSUFBSSxDQUFDLEtBQUssS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxFQUFFLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxTQUFTLENBQUM7SUFDOUUsQ0FBQzt3R0FQVSxjQUFjOzRGQUFkLGNBQWMsaUhDWDNCLDRJQUVPLDJlRE1LLFlBQVk7OzRGQUdYLGNBQWM7a0JBUjFCLFNBQVM7K0JBQ0UsV0FBVyxjQUNULElBQUksV0FHUCxDQUFDLFlBQVksQ0FBQzs4QkFLZCxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdkc28tYmFkZ2UnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2JhZGdlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9iYWRnZS5jb21wb25lbnQuc2NzcyddLFxyXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdXHJcblxyXG59KVxyXG5leHBvcnQgY2xhc3MgQmFkZ2VDb21wb25lbnQge1xyXG4gIFxyXG4gIEBJbnB1dCgpIGxhYmVsOiBzdHJpbmcgfCBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICBASW5wdXQoKSBjb2xvcjogJ3ByaW1hcnknIHwgJ3N1Y2Nlc3MnIHwgJ3dhcm5pbmcnIHwgJ2RhbmdlcicgPSAncHJpbWFyeSc7XHJcblxyXG4gIGdldCBpc0RvdCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmxhYmVsID09PSBudWxsIHx8IHRoaXMubGFiZWwgPT09ICcnIHx8IHRoaXMubGFiZWwgPT09IHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG59XHJcbiIsIjxzcGFuIGNsYXNzPVwiYmFkZ2VcIiBbbmdDbGFzc109XCJbY29sb3IsIGlzRG90ID8gJ2RvdCcgOiAnJ11cIj5cclxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzRG90XCI+e3sgbGFiZWwgfX08L25nLWNvbnRhaW5lcj5cclxuPC9zcGFuPiJdfQ==
@@ -0,0 +1,29 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
3
+ import { RouterLink } from '@angular/router';
4
+ import { ButtonComponent } from '../button/button.component';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/common";
7
+ export class BreadcrumbComponent {
8
+ items = [];
9
+ itemSelected = new EventEmitter();
10
+ // Default separator → you can allow this to be set via @Input() later
11
+ separator = '/';
12
+ onItemClicked(item) {
13
+ this.itemSelected.emit(item);
14
+ console.log('breadcrumb emitted -> ', item);
15
+ }
16
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BreadcrumbComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
17
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: BreadcrumbComponent, isStandalone: true, selector: "dso-breadcrumb", inputs: { items: "items", separator: "separator" }, outputs: { itemSelected: "itemSelected" }, ngImport: i0, template: "<nav aria-label=\"Breadcrumb\" class=\"breadcrumb\">\r\n <ol>\r\n <li *ngFor=\"let item of items; let last = last\" class=\"crumb\">\r\n\r\n <!-- Normal breadcrumb link -->\r\n <ng-container *ngIf=\"!last && item.url; else lastItem\">\r\n\r\n <dso-button\r\n btnType=\"text\"\r\n btnSize=\"smBtn\"\r\n [btnLabel]=\"item.label\"\r\n [isDisabled]=\"false\"\r\n (onClick)=\"onItemClicked(item)\"\r\n [routerLink]=\"item.url\">\r\n </dso-button>\r\n\r\n </ng-container>\r\n\r\n <!-- Last breadcrumb item (non-clickable) -->\r\n <ng-template #lastItem>\r\n <span class=\"current\" aria-current=\"page\">\r\n {{ item.label }}\r\n </span>\r\n </ng-template>\r\n\r\n <!-- Separator -->\r\n <span class=\"separator\" *ngIf=\"!last\">{{ separator }}</span>\r\n\r\n </li>\r\n </ol>\r\n <!-- <dso-button btnType=\"text\" btnLabel=\"Go Home\" [routerLink]=\"['/page1']\"></dso-button> -->\r\n\r\n</nav>\r\n\r\n\r\n", styles: [".breadcrumb{font-size:14px;color:var(--ui-text-muted, #666)}.breadcrumb ol{list-style:none;padding:0;margin:0;display:flex;align-items:center;flex-wrap:wrap}.breadcrumb .crumb{display:flex;align-items:center}.breadcrumb .crumb a{color:var(--ui-primary, #4a5cff);text-decoration:none;font-weight:500}.breadcrumb .crumb a:hover{text-decoration:underline}.breadcrumb .crumb .current{color:var(--ui-text, #222);font-weight:600;padding:0 8px}.breadcrumb .crumb .separator{margin:0 8px;color:var(--ui-text-muted, #999);font-size:12px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: ButtonComponent, selector: "dso-button", inputs: ["btnLabel", "btnType", "btnSize", "btnIconName", "isDisabled", "isActive"], outputs: ["onClick"] }] });
18
+ }
19
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BreadcrumbComponent, decorators: [{
20
+ type: Component,
21
+ args: [{ selector: 'dso-breadcrumb', standalone: true, imports: [CommonModule, RouterLink, ButtonComponent], template: "<nav aria-label=\"Breadcrumb\" class=\"breadcrumb\">\r\n <ol>\r\n <li *ngFor=\"let item of items; let last = last\" class=\"crumb\">\r\n\r\n <!-- Normal breadcrumb link -->\r\n <ng-container *ngIf=\"!last && item.url; else lastItem\">\r\n\r\n <dso-button\r\n btnType=\"text\"\r\n btnSize=\"smBtn\"\r\n [btnLabel]=\"item.label\"\r\n [isDisabled]=\"false\"\r\n (onClick)=\"onItemClicked(item)\"\r\n [routerLink]=\"item.url\">\r\n </dso-button>\r\n\r\n </ng-container>\r\n\r\n <!-- Last breadcrumb item (non-clickable) -->\r\n <ng-template #lastItem>\r\n <span class=\"current\" aria-current=\"page\">\r\n {{ item.label }}\r\n </span>\r\n </ng-template>\r\n\r\n <!-- Separator -->\r\n <span class=\"separator\" *ngIf=\"!last\">{{ separator }}</span>\r\n\r\n </li>\r\n </ol>\r\n <!-- <dso-button btnType=\"text\" btnLabel=\"Go Home\" [routerLink]=\"['/page1']\"></dso-button> -->\r\n\r\n</nav>\r\n\r\n\r\n", styles: [".breadcrumb{font-size:14px;color:var(--ui-text-muted, #666)}.breadcrumb ol{list-style:none;padding:0;margin:0;display:flex;align-items:center;flex-wrap:wrap}.breadcrumb .crumb{display:flex;align-items:center}.breadcrumb .crumb a{color:var(--ui-primary, #4a5cff);text-decoration:none;font-weight:500}.breadcrumb .crumb a:hover{text-decoration:underline}.breadcrumb .crumb .current{color:var(--ui-text, #222);font-weight:600;padding:0 8px}.breadcrumb .crumb .separator{margin:0 8px;color:var(--ui-text-muted, #999);font-size:12px}\n"] }]
22
+ }], propDecorators: { items: [{
23
+ type: Input
24
+ }], itemSelected: [{
25
+ type: Output
26
+ }], separator: [{
27
+ type: Input
28
+ }] } });
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJlYWRjcnVtYi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS9zcmMvbGliL2JyZWFkY3J1bWIvYnJlYWRjcnVtYi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS9zcmMvbGliL2JyZWFkY3J1bWIvYnJlYWRjcnVtYi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2RSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDRCQUE0QixDQUFDOzs7QUFlN0QsTUFBTSxPQUFPLG1CQUFtQjtJQUNyQixLQUFLLEdBQXFCLEVBQUUsQ0FBQztJQUM1QixZQUFZLEdBQUcsSUFBSSxZQUFZLEVBQWtCLENBQUM7SUFFNUQsc0VBQXNFO0lBQzdELFNBQVMsR0FBVyxHQUFHLENBQUM7SUFFakMsYUFBYSxDQUFDLElBQW9CO1FBQ2hDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdCLE9BQU8sQ0FBQyxHQUFHLENBQUMsd0JBQXdCLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDOUMsQ0FBQzt3R0FWVSxtQkFBbUI7NEZBQW5CLG1CQUFtQix5S0NsQmhDLG1oQ0FtQ0EsMmtCRG5CYSxZQUFZLGdRQUFFLFVBQVUsb09BQUUsZUFBZTs7NEZBRXpDLG1CQUFtQjtrQkFQL0IsU0FBUzsrQkFDRSxnQkFBZ0IsY0FHZCxJQUFJLFdBQ1AsQ0FBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLGVBQWUsQ0FBRTs4QkFHN0MsS0FBSztzQkFBYixLQUFLO2dCQUNJLFlBQVk7c0JBQXJCLE1BQU07Z0JBR0UsU0FBUztzQkFBakIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFJvdXRlckxpbmsgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBCdXR0b25Db21wb25lbnQgfSBmcm9tICcuLi9idXR0b24vYnV0dG9uLmNvbXBvbmVudCc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEJyZWFkY3J1bWJJdGVtIHtcclxuICBsYWJlbDogc3RyaW5nO1xyXG4gIHVybD86IHN0cmluZztcclxuICBpY29uPzogc3RyaW5nO1xyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2Rzby1icmVhZGNydW1iJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vYnJlYWRjcnVtYi5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vYnJlYWRjcnVtYi5jb21wb25lbnQuc2NzcyddLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogWyBDb21tb25Nb2R1bGUsIFJvdXRlckxpbmssIEJ1dHRvbkNvbXBvbmVudCBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBCcmVhZGNydW1iQ29tcG9uZW50IHtcclxuICBASW5wdXQoKSBpdGVtczogQnJlYWRjcnVtYkl0ZW1bXSA9IFtdO1xyXG4gIEBPdXRwdXQoKSBpdGVtU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEJyZWFkY3J1bWJJdGVtPigpO1xyXG5cclxuICAvLyBEZWZhdWx0IHNlcGFyYXRvciDihpIgeW91IGNhbiBhbGxvdyB0aGlzIHRvIGJlIHNldCB2aWEgQElucHV0KCkgbGF0ZXJcclxuICBASW5wdXQoKSBzZXBhcmF0b3I6IHN0cmluZyA9ICcvJztcclxuXHJcbiAgb25JdGVtQ2xpY2tlZChpdGVtOiBCcmVhZGNydW1iSXRlbSkge1xyXG4gICAgdGhpcy5pdGVtU2VsZWN0ZWQuZW1pdChpdGVtKTtcclxuICAgIGNvbnNvbGUubG9nKCdicmVhZGNydW1iIGVtaXR0ZWQgLT4gJywgaXRlbSk7XHJcbiAgfVxyXG59XHJcbiIsIjxuYXYgYXJpYS1sYWJlbD1cIkJyZWFkY3J1bWJcIiBjbGFzcz1cImJyZWFkY3J1bWJcIj5cclxuICA8b2w+XHJcbiAgICA8bGkgKm5nRm9yPVwibGV0IGl0ZW0gb2YgaXRlbXM7IGxldCBsYXN0ID0gbGFzdFwiIGNsYXNzPVwiY3J1bWJcIj5cclxuXHJcbiAgICAgIDwhLS0gTm9ybWFsIGJyZWFkY3J1bWIgbGluayAtLT5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsYXN0ICYmIGl0ZW0udXJsOyBlbHNlIGxhc3RJdGVtXCI+XHJcblxyXG4gICAgICAgIDxkc28tYnV0dG9uXHJcbiAgICAgICAgICBidG5UeXBlPVwidGV4dFwiXHJcbiAgICAgICAgICBidG5TaXplPVwic21CdG5cIlxyXG4gICAgICAgICAgW2J0bkxhYmVsXT1cIml0ZW0ubGFiZWxcIlxyXG4gICAgICAgICAgW2lzRGlzYWJsZWRdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgKG9uQ2xpY2spPVwib25JdGVtQ2xpY2tlZChpdGVtKVwiXHJcbiAgICAgICAgICBbcm91dGVyTGlua109XCJpdGVtLnVybFwiPlxyXG4gICAgICAgIDwvZHNvLWJ1dHRvbj5cclxuXHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgPCEtLSBMYXN0IGJyZWFkY3J1bWIgaXRlbSAobm9uLWNsaWNrYWJsZSkgLS0+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSAjbGFzdEl0ZW0+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjdXJyZW50XCIgYXJpYS1jdXJyZW50PVwicGFnZVwiPlxyXG4gICAgICAgICAge3sgaXRlbS5sYWJlbCB9fVxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgIDwhLS0gU2VwYXJhdG9yIC0tPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cInNlcGFyYXRvclwiICpuZ0lmPVwiIWxhc3RcIj57eyBzZXBhcmF0b3IgfX08L3NwYW4+XHJcblxyXG4gICAgPC9saT5cclxuICA8L29sPlxyXG4gIDwhLS0gPGRzby1idXR0b24gYnRuVHlwZT1cInRleHRcIiBidG5MYWJlbD1cIkdvIEhvbWVcIiBbcm91dGVyTGlua109XCJbJy9wYWdlMSddXCI+PC9kc28tYnV0dG9uPiAtLT5cclxuXHJcbjwvbmF2PlxyXG5cclxuXHJcbiJdfQ==
@@ -0,0 +1,82 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
3
+ import { IconComponent } from '../icon/icon.component';
4
+ import { FormsModule } from '@angular/forms';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/common";
7
+ import * as i2 from "@angular/forms";
8
+ /**
9
+ * Reusable Checkbox Component
10
+ *
11
+ * Features:
12
+ * - Optional label
13
+ * - Configurable size, error state, and disabled state
14
+ * - Emits changes to parent component
15
+ * - Supports custom icons
16
+ */
17
+ export class CheckboxComponent {
18
+ /** Text label displayed next to the checkbox */
19
+ label;
20
+ /** Whether the checkbox is checked */
21
+ isChecked = true;
22
+ /** Whether the checkbox is disabled */
23
+ disabled = false;
24
+ /** Size of the checkbox: small, medium, or large */
25
+ size = 'medium';
26
+ /** Error state for styling purposes */
27
+ error = false;
28
+ /** Whether the checkbox is required */
29
+ required = false;
30
+ /** Error message to display when error is true */
31
+ errorMessage = '';
32
+ /** Icon name for the checkbox (default is a checkmark) */
33
+ iconName = 'icon-slanted-check';
34
+ /** Emits the updated checked state whenever the checkbox is toggled */
35
+ change = new EventEmitter();
36
+ /**
37
+ * Toggles the checked state of the checkbox
38
+ * and emits the new value to the parent component
39
+ */
40
+ toggleCheckbox() {
41
+ if (!this.disabled) {
42
+ this.isChecked = !this.isChecked;
43
+ this.change.emit(this.isChecked);
44
+ }
45
+ }
46
+ /**
47
+ * Maps the checkbox size to icon size
48
+ */
49
+ getIconSize() {
50
+ switch (this.size) {
51
+ case 'large': return 'large';
52
+ case 'medium': return 'medium';
53
+ case 'small': return 'small';
54
+ default: return 'medium'; // fallback to medium
55
+ }
56
+ }
57
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CheckboxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
58
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: CheckboxComponent, isStandalone: true, selector: "dso-checkbox", inputs: { label: "label", isChecked: "isChecked", disabled: "disabled", size: "size", error: "error", required: "required", errorMessage: "errorMessage", iconName: "iconName" }, outputs: { change: "change" }, ngImport: i0, template: "<!--\r\n Checkbox Component Template\r\n --------------------------\r\n Features:\r\n - Clickable wrapper to toggle checkbox (disabled-safe)\r\n - Custom checkbox with icon\r\n - Label support\r\n - Error state styling\r\n - Size-based styling: small, medium, large\r\n-->\r\n\r\n<div \r\n class=\"checkbox-wrapper\"\r\n (click)=\"!disabled && toggleCheckbox()\"\r\n [ngClass]=\"{\r\n 'small': size === 'small', \r\n 'medium': size === 'medium', \r\n 'large': size === 'large',\r\n 'disabled': disabled\r\n }\">\r\n\r\n <!-- Hidden native checkbox for accessibility and form integration -->\r\n <input\r\n class=\"checkbox-input\"\r\n type=\"checkbox\"\r\n [ngModel]=\"isChecked\"\r\n [disabled]=\"disabled\"/>\r\n\r\n <!-- Custom checkbox UI -->\r\n <span \r\n class=\"custom-checkbox\" \r\n [class.checked]=\"isChecked\" \r\n [class.error]=\"error\">\r\n \r\n <!-- Display check icon only when checked -->\r\n <dso-icon \r\n *ngIf=\"isChecked\" \r\n [iconName]=\"iconName\" \r\n [size]=\"getIconSize()\">\r\n </dso-icon>\r\n\r\n </span> \r\n\r\n <!-- Optional label -->\r\n <span class=\"checkbox-label\">\r\n {{ label }}\r\n </span>\r\n\r\n</div>\r\n", styles: [".checkbox-wrapper{display:inline-flex;align-items:center;gap:8px;cursor:pointer;vertical-align:middle}.checkbox-wrapper.error .custom-checkbox{border-color:red}.checkbox-wrapper.disabled{cursor:not-allowed}.checkbox-wrapper.disabled .custom-checkbox{pointer-events:none;background-color:#f0f0f0;border-color:#d0d0d0}.checkbox-wrapper.disabled .custom-checkbox.checked{background-color:#00f;border-color:#00f;opacity:.3}.checkbox-input{width:1px;height:1px;margin:-1px;border:0;padding:0;clip:rect(0 0 0 0);clip-path:inset(100%);overflow:hidden;white-space:nowrap}.custom-checkbox{display:inline-flex;justify-content:center;border:1px solid #ccc;border-radius:4px;cursor:pointer;width:24px;height:24px}.custom-checkbox.checked{border-color:#00f;background-color:#00f;color:#fff}.checkbox-wrapper:not(.disabled):hover .custom-checkbox{background-color:#eeeff9;border-color:#0000ffc0;cursor:pointer}.checkbox-wrapper:not(.disabled):hover .custom-checkbox.checked{background-color:#0000ffa9;border-color:#0000ffc0}.custom-checkbox.small .checkbox-custom{width:12px;height:12px}.custom-checkbox.medium .checkbox-custom{width:16px;height:16px}.custom-checkbox.large .checkbox-custom{width:24px;height:24px}.checkbox-label{font-size:14px;font-weight:400}.error-message{color:red;font-size:12px;margin-top:4px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: IconComponent, selector: "dso-icon", inputs: ["iconName", "size"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
59
+ }
60
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CheckboxComponent, decorators: [{
61
+ type: Component,
62
+ args: [{ selector: 'dso-checkbox', standalone: true, imports: [CommonModule, IconComponent, FormsModule], template: "<!--\r\n Checkbox Component Template\r\n --------------------------\r\n Features:\r\n - Clickable wrapper to toggle checkbox (disabled-safe)\r\n - Custom checkbox with icon\r\n - Label support\r\n - Error state styling\r\n - Size-based styling: small, medium, large\r\n-->\r\n\r\n<div \r\n class=\"checkbox-wrapper\"\r\n (click)=\"!disabled && toggleCheckbox()\"\r\n [ngClass]=\"{\r\n 'small': size === 'small', \r\n 'medium': size === 'medium', \r\n 'large': size === 'large',\r\n 'disabled': disabled\r\n }\">\r\n\r\n <!-- Hidden native checkbox for accessibility and form integration -->\r\n <input\r\n class=\"checkbox-input\"\r\n type=\"checkbox\"\r\n [ngModel]=\"isChecked\"\r\n [disabled]=\"disabled\"/>\r\n\r\n <!-- Custom checkbox UI -->\r\n <span \r\n class=\"custom-checkbox\" \r\n [class.checked]=\"isChecked\" \r\n [class.error]=\"error\">\r\n \r\n <!-- Display check icon only when checked -->\r\n <dso-icon \r\n *ngIf=\"isChecked\" \r\n [iconName]=\"iconName\" \r\n [size]=\"getIconSize()\">\r\n </dso-icon>\r\n\r\n </span> \r\n\r\n <!-- Optional label -->\r\n <span class=\"checkbox-label\">\r\n {{ label }}\r\n </span>\r\n\r\n</div>\r\n", styles: [".checkbox-wrapper{display:inline-flex;align-items:center;gap:8px;cursor:pointer;vertical-align:middle}.checkbox-wrapper.error .custom-checkbox{border-color:red}.checkbox-wrapper.disabled{cursor:not-allowed}.checkbox-wrapper.disabled .custom-checkbox{pointer-events:none;background-color:#f0f0f0;border-color:#d0d0d0}.checkbox-wrapper.disabled .custom-checkbox.checked{background-color:#00f;border-color:#00f;opacity:.3}.checkbox-input{width:1px;height:1px;margin:-1px;border:0;padding:0;clip:rect(0 0 0 0);clip-path:inset(100%);overflow:hidden;white-space:nowrap}.custom-checkbox{display:inline-flex;justify-content:center;border:1px solid #ccc;border-radius:4px;cursor:pointer;width:24px;height:24px}.custom-checkbox.checked{border-color:#00f;background-color:#00f;color:#fff}.checkbox-wrapper:not(.disabled):hover .custom-checkbox{background-color:#eeeff9;border-color:#0000ffc0;cursor:pointer}.checkbox-wrapper:not(.disabled):hover .custom-checkbox.checked{background-color:#0000ffa9;border-color:#0000ffc0}.custom-checkbox.small .checkbox-custom{width:12px;height:12px}.custom-checkbox.medium .checkbox-custom{width:16px;height:16px}.custom-checkbox.large .checkbox-custom{width:24px;height:24px}.checkbox-label{font-size:14px;font-weight:400}.error-message{color:red;font-size:12px;margin-top:4px}\n"] }]
63
+ }], propDecorators: { label: [{
64
+ type: Input
65
+ }], isChecked: [{
66
+ type: Input
67
+ }], disabled: [{
68
+ type: Input
69
+ }], size: [{
70
+ type: Input
71
+ }], error: [{
72
+ type: Input
73
+ }], required: [{
74
+ type: Input
75
+ }], errorMessage: [{
76
+ type: Input
77
+ }], iconName: [{
78
+ type: Input
79
+ }], change: [{
80
+ type: Output
81
+ }] } });
82
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWkvc3JjL2xpYi9jaGVja2JveC9jaGVja2JveC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS9zcmMvbGliL2NoZWNrYm94L2NoZWNrYm94LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7QUFFN0M7Ozs7Ozs7O0dBUUc7QUFRSCxNQUFNLE9BQU8saUJBQWlCO0lBRTVCLGdEQUFnRDtJQUN2QyxLQUFLLENBQVU7SUFFeEIsc0NBQXNDO0lBQzdCLFNBQVMsR0FBWSxJQUFJLENBQUM7SUFFbkMsdUNBQXVDO0lBQzlCLFFBQVEsR0FBWSxLQUFLLENBQUM7SUFFbkMsb0RBQW9EO0lBQzNDLElBQUksR0FBaUMsUUFBUSxDQUFDO0lBRXZELHVDQUF1QztJQUM5QixLQUFLLEdBQVksS0FBSyxDQUFDO0lBRWhDLHVDQUF1QztJQUM5QixRQUFRLEdBQVksS0FBSyxDQUFDO0lBRW5DLGtEQUFrRDtJQUN6QyxZQUFZLEdBQVcsRUFBRSxDQUFDO0lBRW5DLDBEQUEwRDtJQUNqRCxRQUFRLEdBQVcsb0JBQW9CLENBQUM7SUFFakQsdUVBQXVFO0lBQzdELE1BQU0sR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO0lBRS9DOzs7T0FHRztJQUNILGNBQWM7UUFDWixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQ2pDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNuQyxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsV0FBVztRQUNULFFBQVEsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2xCLEtBQUssT0FBTyxDQUFDLENBQUMsT0FBTyxPQUFPLENBQUM7WUFDN0IsS0FBSyxRQUFRLENBQUMsQ0FBQyxPQUFPLFFBQVEsQ0FBQztZQUMvQixLQUFLLE9BQU8sQ0FBQyxDQUFDLE9BQU8sT0FBTyxDQUFDO1lBQzdCLE9BQU8sQ0FBQyxDQUFDLE9BQU8sUUFBUSxDQUFDLENBQUMscUJBQXFCO1FBQ2pELENBQUM7SUFDSCxDQUFDO3dHQWxEVSxpQkFBaUI7NEZBQWpCLGlCQUFpQix5UkNyQjlCLDB0Q0FpREEsaTFDRGhDWSxZQUFZLGlPQUFFLGFBQWEsa0ZBQUUsV0FBVzs7NEZBSXZDLGlCQUFpQjtrQkFQN0IsU0FBUzsrQkFDRSxjQUFjLGNBQ1osSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLGFBQWEsRUFBRSxXQUFXLENBQUM7OEJBTzFDLEtBQUs7c0JBQWIsS0FBSztnQkFHRyxTQUFTO3NCQUFqQixLQUFLO2dCQUdHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBR0csSUFBSTtzQkFBWixLQUFLO2dCQUdHLEtBQUs7c0JBQWIsS0FBSztnQkFHRyxRQUFRO3NCQUFoQixLQUFLO2dCQUdHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBR0csUUFBUTtzQkFBaEIsS0FBSztnQkFHSSxNQUFNO3NCQUFmLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBJY29uQ29tcG9uZW50IH0gZnJvbSAnLi4vaWNvbi9pY29uLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5cclxuLyoqXHJcbiAqIFJldXNhYmxlIENoZWNrYm94IENvbXBvbmVudFxyXG4gKiBcclxuICogRmVhdHVyZXM6XHJcbiAqIC0gT3B0aW9uYWwgbGFiZWxcclxuICogLSBDb25maWd1cmFibGUgc2l6ZSwgZXJyb3Igc3RhdGUsIGFuZCBkaXNhYmxlZCBzdGF0ZVxyXG4gKiAtIEVtaXRzIGNoYW5nZXMgdG8gcGFyZW50IGNvbXBvbmVudFxyXG4gKiAtIFN1cHBvcnRzIGN1c3RvbSBpY29uc1xyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdkc28tY2hlY2tib3gnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgSWNvbkNvbXBvbmVudCwgRm9ybXNNb2R1bGVdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9jaGVja2JveC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vY2hlY2tib3guY29tcG9uZW50LnNjc3MnXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIENoZWNrYm94Q29tcG9uZW50IHtcclxuXHJcbiAgLyoqIFRleHQgbGFiZWwgZGlzcGxheWVkIG5leHQgdG8gdGhlIGNoZWNrYm94ICovXHJcbiAgQElucHV0KCkgbGFiZWw/OiBzdHJpbmc7XHJcblxyXG4gIC8qKiBXaGV0aGVyIHRoZSBjaGVja2JveCBpcyBjaGVja2VkICovXHJcbiAgQElucHV0KCkgaXNDaGVja2VkOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgLyoqIFdoZXRoZXIgdGhlIGNoZWNrYm94IGlzIGRpc2FibGVkICovXHJcbiAgQElucHV0KCkgZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqIFNpemUgb2YgdGhlIGNoZWNrYm94OiBzbWFsbCwgbWVkaXVtLCBvciBsYXJnZSAqL1xyXG4gIEBJbnB1dCgpIHNpemU6ICdzbWFsbCcgfCAnbWVkaXVtJyB8ICdsYXJnZScgPSAnbWVkaXVtJztcclxuXHJcbiAgLyoqIEVycm9yIHN0YXRlIGZvciBzdHlsaW5nIHB1cnBvc2VzICovXHJcbiAgQElucHV0KCkgZXJyb3I6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqIFdoZXRoZXIgdGhlIGNoZWNrYm94IGlzIHJlcXVpcmVkICovXHJcbiAgQElucHV0KCkgcmVxdWlyZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqIEVycm9yIG1lc3NhZ2UgdG8gZGlzcGxheSB3aGVuIGVycm9yIGlzIHRydWUgKi9cclxuICBASW5wdXQoKSBlcnJvck1lc3NhZ2U6IHN0cmluZyA9ICcnO1xyXG5cclxuICAvKiogSWNvbiBuYW1lIGZvciB0aGUgY2hlY2tib3ggKGRlZmF1bHQgaXMgYSBjaGVja21hcmspICovXHJcbiAgQElucHV0KCkgaWNvbk5hbWU6IHN0cmluZyA9ICdpY29uLXNsYW50ZWQtY2hlY2snO1xyXG5cclxuICAvKiogRW1pdHMgdGhlIHVwZGF0ZWQgY2hlY2tlZCBzdGF0ZSB3aGVuZXZlciB0aGUgY2hlY2tib3ggaXMgdG9nZ2xlZCAqL1xyXG4gIEBPdXRwdXQoKSBjaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIFRvZ2dsZXMgdGhlIGNoZWNrZWQgc3RhdGUgb2YgdGhlIGNoZWNrYm94XHJcbiAgICogYW5kIGVtaXRzIHRoZSBuZXcgdmFsdWUgdG8gdGhlIHBhcmVudCBjb21wb25lbnRcclxuICAgKi9cclxuICB0b2dnbGVDaGVja2JveCgpIHtcclxuICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xyXG4gICAgICB0aGlzLmlzQ2hlY2tlZCA9ICF0aGlzLmlzQ2hlY2tlZDtcclxuICAgICAgdGhpcy5jaGFuZ2UuZW1pdCh0aGlzLmlzQ2hlY2tlZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNYXBzIHRoZSBjaGVja2JveCBzaXplIHRvIGljb24gc2l6ZVxyXG4gICAqL1xyXG4gIGdldEljb25TaXplKCk6ICdzbWFsbCcgfCAnbWVkaXVtJyB8ICdsYXJnZScge1xyXG4gICAgc3dpdGNoICh0aGlzLnNpemUpIHtcclxuICAgICAgY2FzZSAnbGFyZ2UnOiByZXR1cm4gJ2xhcmdlJztcclxuICAgICAgY2FzZSAnbWVkaXVtJzogcmV0dXJuICdtZWRpdW0nO1xyXG4gICAgICBjYXNlICdzbWFsbCc6IHJldHVybiAnc21hbGwnO1xyXG4gICAgICBkZWZhdWx0OiByZXR1cm4gJ21lZGl1bSc7IC8vIGZhbGxiYWNrIHRvIG1lZGl1bVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCI8IS0tXHJcbiAgQ2hlY2tib3ggQ29tcG9uZW50IFRlbXBsYXRlXHJcbiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICBGZWF0dXJlczpcclxuICAtIENsaWNrYWJsZSB3cmFwcGVyIHRvIHRvZ2dsZSBjaGVja2JveCAoZGlzYWJsZWQtc2FmZSlcclxuICAtIEN1c3RvbSBjaGVja2JveCB3aXRoIGljb25cclxuICAtIExhYmVsIHN1cHBvcnRcclxuICAtIEVycm9yIHN0YXRlIHN0eWxpbmdcclxuICAtIFNpemUtYmFzZWQgc3R5bGluZzogc21hbGwsIG1lZGl1bSwgbGFyZ2VcclxuLS0+XHJcblxyXG48ZGl2IFxyXG4gIGNsYXNzPVwiY2hlY2tib3gtd3JhcHBlclwiXHJcbiAgKGNsaWNrKT1cIiFkaXNhYmxlZCAmJiB0b2dnbGVDaGVja2JveCgpXCJcclxuICBbbmdDbGFzc109XCJ7XHJcbiAgICAnc21hbGwnOiBzaXplID09PSAnc21hbGwnLCBcclxuICAgICdtZWRpdW0nOiBzaXplID09PSAnbWVkaXVtJywgXHJcbiAgICAnbGFyZ2UnOiBzaXplID09PSAnbGFyZ2UnLFxyXG4gICAgJ2Rpc2FibGVkJzogZGlzYWJsZWRcclxuICB9XCI+XHJcblxyXG4gIDwhLS0gSGlkZGVuIG5hdGl2ZSBjaGVja2JveCBmb3IgYWNjZXNzaWJpbGl0eSBhbmQgZm9ybSBpbnRlZ3JhdGlvbiAtLT5cclxuICA8aW5wdXRcclxuICAgIGNsYXNzPVwiY2hlY2tib3gtaW5wdXRcIlxyXG4gICAgdHlwZT1cImNoZWNrYm94XCJcclxuICAgIFtuZ01vZGVsXT1cImlzQ2hlY2tlZFwiXHJcbiAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIi8+XHJcblxyXG4gIDwhLS0gQ3VzdG9tIGNoZWNrYm94IFVJIC0tPlxyXG4gIDxzcGFuIFxyXG4gICAgY2xhc3M9XCJjdXN0b20tY2hlY2tib3hcIiBcclxuICAgIFtjbGFzcy5jaGVja2VkXT1cImlzQ2hlY2tlZFwiIFxyXG4gICAgW2NsYXNzLmVycm9yXT1cImVycm9yXCI+XHJcbiAgICBcclxuICAgIDwhLS0gRGlzcGxheSBjaGVjayBpY29uIG9ubHkgd2hlbiBjaGVja2VkIC0tPlxyXG4gICAgPGRzby1pY29uIFxyXG4gICAgICAqbmdJZj1cImlzQ2hlY2tlZFwiIFxyXG4gICAgICBbaWNvbk5hbWVdPVwiaWNvbk5hbWVcIiBcclxuICAgICAgW3NpemVdPVwiZ2V0SWNvblNpemUoKVwiPlxyXG4gICAgPC9kc28taWNvbj5cclxuXHJcbiAgPC9zcGFuPiAgICAgXHJcblxyXG4gIDwhLS0gT3B0aW9uYWwgbGFiZWwgLS0+XHJcbiAgPHNwYW4gY2xhc3M9XCJjaGVja2JveC1sYWJlbFwiPlxyXG4gICAge3sgbGFiZWwgfX1cclxuICA8L3NwYW4+XHJcblxyXG48L2Rpdj5cclxuIl19
@@ -0,0 +1,161 @@
1
+ import { CommonModule, DatePipe } from '@angular/common';
2
+ import { Component, ViewChild, HostListener, Input } from '@angular/core';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@angular/common";
5
+ export class DatepickerComponent {
6
+ /** Label displayed above the input */
7
+ inputTextLabel = 'Datepicker Title';
8
+ /** Disable the datepicker input */
9
+ isDisabled = false;
10
+ /** Currently selected date */
11
+ selectedDate = null;
12
+ /** Whether the calendar popup is visible */
13
+ calendarVisible = false;
14
+ /** Current month displayed in the calendar */
15
+ currentMonth = new Date();
16
+ /** View mode: day, month, or year */
17
+ viewMode = 'day';
18
+ /** Minimum and maximum year range */
19
+ minYear = 1990;
20
+ maxYear = 2099;
21
+ /** Month names for display */
22
+ months = [
23
+ 'January', 'February', 'March', 'April', 'May', 'June',
24
+ 'July', 'August', 'September', 'October', 'November', 'December'
25
+ ];
26
+ yearListRef;
27
+ calendarWrapper;
28
+ // --------------------------
29
+ // Calendar Visibility & Toggle
30
+ // --------------------------
31
+ /** Toggle the calendar popup */
32
+ toggleCalendar() {
33
+ this.calendarVisible = !this.calendarVisible;
34
+ this.viewMode = 'day';
35
+ }
36
+ /** Close calendar if clicking outside */
37
+ handleClickOutside(event) {
38
+ if (!this.calendarWrapper)
39
+ return;
40
+ const target = event.target;
41
+ if (this.calendarVisible && !this.calendarWrapper.nativeElement.contains(target)) {
42
+ this.calendarVisible = false;
43
+ }
44
+ }
45
+ // --------------------------
46
+ // View Switching
47
+ // --------------------------
48
+ switchToMonthView() {
49
+ this.viewMode = 'month';
50
+ }
51
+ switchToYearView() {
52
+ this.viewMode = 'year';
53
+ setTimeout(() => this.scrollToCurrentYear(), 50);
54
+ }
55
+ // --------------------------
56
+ // Navigation (Month / Year)
57
+ // --------------------------
58
+ changeMonth(direction) {
59
+ this.currentMonth = new Date(this.currentMonth.getFullYear(), this.currentMonth.getMonth() + direction, 1);
60
+ }
61
+ changeYear(direction) {
62
+ const newYear = this.currentMonth.getFullYear() + direction;
63
+ if (newYear >= this.minYear && newYear <= this.maxYear) {
64
+ this.currentMonth = new Date(newYear, this.currentMonth.getMonth(), 1);
65
+ setTimeout(() => this.scrollToCurrentYear(), 0);
66
+ }
67
+ }
68
+ // --------------------------
69
+ // Helpers
70
+ // --------------------------
71
+ /** Returns array of days in the current month, with leading nulls for empty grid cells */
72
+ getDaysInMonth() {
73
+ const month = this.currentMonth.getMonth();
74
+ const year = this.currentMonth.getFullYear();
75
+ const firstDay = new Date(year, month, 1).getDay();
76
+ const daysInMonth = new Date(year, month + 1, 0).getDate();
77
+ const daysArray = Array.from({ length: daysInMonth }, (_, i) => i + 1);
78
+ return Array(firstDay).fill(null).concat(daysArray);
79
+ }
80
+ /** Returns array of years in the defined range */
81
+ getYearsRange() {
82
+ const years = [];
83
+ for (let y = this.minYear; y <= this.maxYear; y++)
84
+ years.push(y);
85
+ return years;
86
+ }
87
+ /** Scroll the year list to show the current year */
88
+ scrollToCurrentYear() {
89
+ if (!this.yearListRef)
90
+ return;
91
+ const container = this.yearListRef.nativeElement;
92
+ const currentYear = this.currentMonth.getFullYear();
93
+ const yearIndex = currentYear - this.minYear;
94
+ const columns = 4; // 4 columns grid layout
95
+ const rowIndex = Math.floor(yearIndex / columns);
96
+ const yearCell = container.querySelector('.year-cell');
97
+ if (!yearCell)
98
+ return;
99
+ const scrollTop = rowIndex * yearCell.offsetHeight;
100
+ container.scrollTop = scrollTop;
101
+ }
102
+ // --------------------------
103
+ // Selection Handlers
104
+ // --------------------------
105
+ selectDate(day) {
106
+ if (day === null)
107
+ return;
108
+ this.selectedDate = new Date(this.currentMonth.getFullYear(), this.currentMonth.getMonth(), day);
109
+ this.calendarVisible = false;
110
+ }
111
+ selectMonth(monthIndex) {
112
+ this.currentMonth = new Date(this.currentMonth.getFullYear(), monthIndex, 1);
113
+ this.viewMode = 'day';
114
+ }
115
+ selectYear(year) {
116
+ this.currentMonth = new Date(year, this.currentMonth.getMonth(), 1);
117
+ this.viewMode = 'month';
118
+ }
119
+ /** Check if a day is currently selected */
120
+ isSelected(day) {
121
+ if (!this.selectedDate || day === null)
122
+ return false;
123
+ return (this.selectedDate.getDate() === day &&
124
+ this.selectedDate.getMonth() === this.currentMonth.getMonth() &&
125
+ this.selectedDate.getFullYear() === this.currentMonth.getFullYear());
126
+ }
127
+ // --------------------------
128
+ // Footer Actions
129
+ // --------------------------
130
+ /** Set today’s date */
131
+ setToday() {
132
+ const today = new Date();
133
+ this.selectedDate = today;
134
+ this.currentMonth = new Date(today.getFullYear(), today.getMonth(), 1);
135
+ this.calendarVisible = false;
136
+ }
137
+ /** Clear the selected date */
138
+ clearDate() {
139
+ this.selectedDate = null;
140
+ }
141
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DatepickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
142
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: DatepickerComponent, isStandalone: true, selector: "dso-datepicker", inputs: { inputTextLabel: "inputTextLabel", isDisabled: "isDisabled" }, host: { listeners: { "document:click": "handleClickOutside($event)" } }, viewQueries: [{ propertyName: "yearListRef", first: true, predicate: ["yearList"], descendants: true }, { propertyName: "calendarWrapper", first: true, predicate: ["calendarWrapper"], descendants: true }], ngImport: i0, template: "<div class=\"datepicker-wrapper\" #calendarWrapper>\r\n \r\n <!-- Label above the input -->\r\n <div *ngIf=\"inputTextLabel\" class=\"datepicker-label\">{{ inputTextLabel }}</div>\r\n\r\n <!-- Input field (readonly) -->\r\n <input\r\n type=\"text\"\r\n class=\"datepicker-input\"\r\n [value]=\"selectedDate ? (selectedDate | date:'MMM d, y') : ''\"\r\n placeholder=\"Select a date\"\r\n readonly\r\n (click)=\"toggleCalendar()\"\r\n [disabled]=\"isDisabled\"\r\n [class.disabled]=\"isDisabled\"\r\n />\r\n\r\n <!-- Calendar popup -->\r\n <div class=\"calendar\" *ngIf=\"calendarVisible\">\r\n\r\n <!-- Header -->\r\n <div class=\"calendar-header\">\r\n <div class=\"header-row\">\r\n\r\n <!-- Year & Month Navigation Buttons -->\r\n <button *ngIf=\"viewMode === 'day' || viewMode === 'month'\" \r\n (click)=\"changeYear(-1)\" class=\"nav-btn\">\u00AB</button>\r\n <button *ngIf=\"viewMode === 'day'\" \r\n (click)=\"changeMonth(-1)\" class=\"nav-btn\">\u2039</button>\r\n\r\n <!-- Calendar Title (Month / Year display) -->\r\n <span class=\"calendar-title\">\r\n\r\n <!-- Day view: show Month + Year -->\r\n <ng-container *ngIf=\"viewMode === 'day'\">\r\n <span class=\"month-label\" (click)=\"switchToMonthView()\">\r\n {{ currentMonth | date:'MMMM' }}\r\n </span>\r\n <span class=\"year-label\" (click)=\"switchToYearView()\">\r\n {{ currentMonth | date:'yyyy' }}\r\n </span>\r\n </ng-container>\r\n\r\n <!-- Month view: show Year -->\r\n <ng-container *ngIf=\"viewMode === 'month'\">\r\n <span class=\"year-label\" (click)=\"switchToYearView()\">\r\n {{ currentMonth | date:'yyyy' }}\r\n </span>\r\n </ng-container>\r\n\r\n <!-- Year view: show Year only -->\r\n <ng-container *ngIf=\"viewMode === 'year'\">\r\n {{ currentMonth | date:'yyyy' }}\r\n </ng-container>\r\n\r\n </span>\r\n\r\n <!-- Forward navigation buttons -->\r\n <button *ngIf=\"viewMode === 'day'\" (click)=\"changeMonth(1)\" class=\"nav-btn\">\u203A</button>\r\n <button *ngIf=\"viewMode === 'day' || viewMode === 'month'\" \r\n (click)=\"changeYear(1)\" class=\"nav-btn\">\u00BB</button>\r\n\r\n </div>\r\n </div>\r\n\r\n <!-- ----------------------\r\n DAY VIEW\r\n ---------------------- -->\r\n <div *ngIf=\"viewMode === 'day'\">\r\n\r\n <!-- Weekday Labels -->\r\n <div class=\"calendar-weekdays\">\r\n <div *ngFor=\"let day of ['S','M','T','W','T','F','S']\">{{ day }}</div>\r\n </div>\r\n\r\n <!-- Days Grid -->\r\n <div class=\"calendar-grid days-grid\">\r\n <div\r\n *ngFor=\"let day of getDaysInMonth()\"\r\n [class.empty]=\"day === null\"\r\n [class.selected]=\"isSelected(day)\"\r\n (click)=\"selectDate(day)\"\r\n >\r\n {{ day }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- ----------------------\r\n MONTH VIEW\r\n ---------------------- -->\r\n <div *ngIf=\"viewMode === 'month'\" class=\"calendar-grid months-grid\">\r\n <div *ngFor=\"let m of months; let i = index\" \r\n (click)=\"selectMonth(i)\" \r\n class=\"month-cell\">\r\n {{ m }}\r\n </div>\r\n </div>\r\n\r\n <!-- ----------------------\r\n YEAR VIEW\r\n ---------------------- -->\r\n <div *ngIf=\"viewMode === 'year'\" \r\n class=\"calendar-grid years-grid scrollable\" \r\n #yearList>\r\n <div\r\n *ngFor=\"let y of getYearsRange()\"\r\n (click)=\"selectYear(y)\"\r\n class=\"year-cell\"\r\n [class.current-year]=\"y === currentMonth.getFullYear()\"\r\n >\r\n {{ y }}\r\n </div>\r\n </div>\r\n\r\n <!-- ----------------------\r\n Footer Buttons\r\n ---------------------- -->\r\n <div class=\"calendar-footer\">\r\n <button class=\"footer-btn clear-btn\" (click)=\"clearDate()\">Clear</button>\r\n <button class=\"footer-btn today-btn\" (click)=\"setToday()\">Today</button>\r\n </div>\r\n\r\n </div>\r\n</div>\r\n", styles: [".datepicker-wrapper{position:relative;display:flex;flex-direction:column;gap:8px}.datepicker-input{padding:10px;font-size:15px;width:190px;border:1px solid #ccc;border-radius:4px;cursor:pointer;background-color:#fff}.datepicker-input:hover{border:1px solid #071d35}.datepicker-input.disabled{background-color:#f5f5f5;border-color:#ccc;cursor:not-allowed}.datepicker-input.disabled .selected-option{pointer-events:none;color:#aaa}.calendar{position:absolute;top:0;left:100px;width:280px;background:#fff;border:1px solid #ddd;border-radius:8px;box-shadow:0 4px 10px #0000001a;padding:10px;z-index:100;animation:fadeIn .2s ease-in-out}.calendar-header{margin-bottom:8px}.header-row{display:flex;justify-content:center;align-items:center;gap:4px}.nav-btn{background:none;border:none;font-size:16px;cursor:pointer;padding:4px 6px;color:#333;border-radius:4px;transition:background-color .2s}.nav-btn:hover{background-color:#f0f0f0}.calendar-title{font-weight:600;font-size:16px;min-width:90px;text-align:center;display:flex;flex:1;gap:4px;align-items:center;justify-content:center}.month-label,.year-label{cursor:pointer;transition:color .2s}.month-label:hover,.year-label:hover{color:#007bff}.calendar-weekdays{display:grid;grid-template-columns:repeat(7,1fr);text-align:center;font-weight:600;font-size:13px;margin-bottom:4px;color:#666}.calendar-grid{display:grid;gap:4px;text-align:center;min-height:200px}.days-grid{grid-template-columns:repeat(7,1fr)}.months-grid{grid-template-columns:repeat(3,1fr)}.years-grid{grid-template-columns:repeat(4,1fr)}.scrollable{max-height:160px;overflow-y:auto;padding-right:5px}.scrollable::-webkit-scrollbar{width:6px}.scrollable::-webkit-scrollbar-thumb{background-color:#ccc;border-radius:3px}.scrollable::-webkit-scrollbar-thumb:hover{background-color:#999}.calendar-grid div{padding:8px 0;border-radius:4px;cursor:pointer;transition:background-color .2s}.calendar-grid div:hover{background-color:#f0f0f0}.selected{background-color:#007bff;color:#fff!important}.current-year{background-color:#007bff1a;font-weight:700}.empty{visibility:hidden}.calendar-footer{display:flex;justify-content:space-between;margin-top:8px;border-top:1px solid #eee;padding-top:8px}.footer-btn{flex:1;padding:6px 0;font-size:14px;border-radius:4px;cursor:pointer;transition:background .2s;border:none}.clear-btn{background-color:#f8f9fa;color:#333;margin-right:5px}.clear-btn:hover{background-color:#e9ecef}.today-btn{background-color:#007bff;color:#fff}.today-btn:hover{background-color:#0069d9}@keyframes fadeIn{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1.DatePipe, name: "date" }] });
143
+ }
144
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DatepickerComponent, decorators: [{
145
+ type: Component,
146
+ args: [{ selector: 'dso-datepicker', standalone: true, imports: [CommonModule, DatePipe], template: "<div class=\"datepicker-wrapper\" #calendarWrapper>\r\n \r\n <!-- Label above the input -->\r\n <div *ngIf=\"inputTextLabel\" class=\"datepicker-label\">{{ inputTextLabel }}</div>\r\n\r\n <!-- Input field (readonly) -->\r\n <input\r\n type=\"text\"\r\n class=\"datepicker-input\"\r\n [value]=\"selectedDate ? (selectedDate | date:'MMM d, y') : ''\"\r\n placeholder=\"Select a date\"\r\n readonly\r\n (click)=\"toggleCalendar()\"\r\n [disabled]=\"isDisabled\"\r\n [class.disabled]=\"isDisabled\"\r\n />\r\n\r\n <!-- Calendar popup -->\r\n <div class=\"calendar\" *ngIf=\"calendarVisible\">\r\n\r\n <!-- Header -->\r\n <div class=\"calendar-header\">\r\n <div class=\"header-row\">\r\n\r\n <!-- Year & Month Navigation Buttons -->\r\n <button *ngIf=\"viewMode === 'day' || viewMode === 'month'\" \r\n (click)=\"changeYear(-1)\" class=\"nav-btn\">\u00AB</button>\r\n <button *ngIf=\"viewMode === 'day'\" \r\n (click)=\"changeMonth(-1)\" class=\"nav-btn\">\u2039</button>\r\n\r\n <!-- Calendar Title (Month / Year display) -->\r\n <span class=\"calendar-title\">\r\n\r\n <!-- Day view: show Month + Year -->\r\n <ng-container *ngIf=\"viewMode === 'day'\">\r\n <span class=\"month-label\" (click)=\"switchToMonthView()\">\r\n {{ currentMonth | date:'MMMM' }}\r\n </span>\r\n <span class=\"year-label\" (click)=\"switchToYearView()\">\r\n {{ currentMonth | date:'yyyy' }}\r\n </span>\r\n </ng-container>\r\n\r\n <!-- Month view: show Year -->\r\n <ng-container *ngIf=\"viewMode === 'month'\">\r\n <span class=\"year-label\" (click)=\"switchToYearView()\">\r\n {{ currentMonth | date:'yyyy' }}\r\n </span>\r\n </ng-container>\r\n\r\n <!-- Year view: show Year only -->\r\n <ng-container *ngIf=\"viewMode === 'year'\">\r\n {{ currentMonth | date:'yyyy' }}\r\n </ng-container>\r\n\r\n </span>\r\n\r\n <!-- Forward navigation buttons -->\r\n <button *ngIf=\"viewMode === 'day'\" (click)=\"changeMonth(1)\" class=\"nav-btn\">\u203A</button>\r\n <button *ngIf=\"viewMode === 'day' || viewMode === 'month'\" \r\n (click)=\"changeYear(1)\" class=\"nav-btn\">\u00BB</button>\r\n\r\n </div>\r\n </div>\r\n\r\n <!-- ----------------------\r\n DAY VIEW\r\n ---------------------- -->\r\n <div *ngIf=\"viewMode === 'day'\">\r\n\r\n <!-- Weekday Labels -->\r\n <div class=\"calendar-weekdays\">\r\n <div *ngFor=\"let day of ['S','M','T','W','T','F','S']\">{{ day }}</div>\r\n </div>\r\n\r\n <!-- Days Grid -->\r\n <div class=\"calendar-grid days-grid\">\r\n <div\r\n *ngFor=\"let day of getDaysInMonth()\"\r\n [class.empty]=\"day === null\"\r\n [class.selected]=\"isSelected(day)\"\r\n (click)=\"selectDate(day)\"\r\n >\r\n {{ day }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- ----------------------\r\n MONTH VIEW\r\n ---------------------- -->\r\n <div *ngIf=\"viewMode === 'month'\" class=\"calendar-grid months-grid\">\r\n <div *ngFor=\"let m of months; let i = index\" \r\n (click)=\"selectMonth(i)\" \r\n class=\"month-cell\">\r\n {{ m }}\r\n </div>\r\n </div>\r\n\r\n <!-- ----------------------\r\n YEAR VIEW\r\n ---------------------- -->\r\n <div *ngIf=\"viewMode === 'year'\" \r\n class=\"calendar-grid years-grid scrollable\" \r\n #yearList>\r\n <div\r\n *ngFor=\"let y of getYearsRange()\"\r\n (click)=\"selectYear(y)\"\r\n class=\"year-cell\"\r\n [class.current-year]=\"y === currentMonth.getFullYear()\"\r\n >\r\n {{ y }}\r\n </div>\r\n </div>\r\n\r\n <!-- ----------------------\r\n Footer Buttons\r\n ---------------------- -->\r\n <div class=\"calendar-footer\">\r\n <button class=\"footer-btn clear-btn\" (click)=\"clearDate()\">Clear</button>\r\n <button class=\"footer-btn today-btn\" (click)=\"setToday()\">Today</button>\r\n </div>\r\n\r\n </div>\r\n</div>\r\n", styles: [".datepicker-wrapper{position:relative;display:flex;flex-direction:column;gap:8px}.datepicker-input{padding:10px;font-size:15px;width:190px;border:1px solid #ccc;border-radius:4px;cursor:pointer;background-color:#fff}.datepicker-input:hover{border:1px solid #071d35}.datepicker-input.disabled{background-color:#f5f5f5;border-color:#ccc;cursor:not-allowed}.datepicker-input.disabled .selected-option{pointer-events:none;color:#aaa}.calendar{position:absolute;top:0;left:100px;width:280px;background:#fff;border:1px solid #ddd;border-radius:8px;box-shadow:0 4px 10px #0000001a;padding:10px;z-index:100;animation:fadeIn .2s ease-in-out}.calendar-header{margin-bottom:8px}.header-row{display:flex;justify-content:center;align-items:center;gap:4px}.nav-btn{background:none;border:none;font-size:16px;cursor:pointer;padding:4px 6px;color:#333;border-radius:4px;transition:background-color .2s}.nav-btn:hover{background-color:#f0f0f0}.calendar-title{font-weight:600;font-size:16px;min-width:90px;text-align:center;display:flex;flex:1;gap:4px;align-items:center;justify-content:center}.month-label,.year-label{cursor:pointer;transition:color .2s}.month-label:hover,.year-label:hover{color:#007bff}.calendar-weekdays{display:grid;grid-template-columns:repeat(7,1fr);text-align:center;font-weight:600;font-size:13px;margin-bottom:4px;color:#666}.calendar-grid{display:grid;gap:4px;text-align:center;min-height:200px}.days-grid{grid-template-columns:repeat(7,1fr)}.months-grid{grid-template-columns:repeat(3,1fr)}.years-grid{grid-template-columns:repeat(4,1fr)}.scrollable{max-height:160px;overflow-y:auto;padding-right:5px}.scrollable::-webkit-scrollbar{width:6px}.scrollable::-webkit-scrollbar-thumb{background-color:#ccc;border-radius:3px}.scrollable::-webkit-scrollbar-thumb:hover{background-color:#999}.calendar-grid div{padding:8px 0;border-radius:4px;cursor:pointer;transition:background-color .2s}.calendar-grid div:hover{background-color:#f0f0f0}.selected{background-color:#007bff;color:#fff!important}.current-year{background-color:#007bff1a;font-weight:700}.empty{visibility:hidden}.calendar-footer{display:flex;justify-content:space-between;margin-top:8px;border-top:1px solid #eee;padding-top:8px}.footer-btn{flex:1;padding:6px 0;font-size:14px;border-radius:4px;cursor:pointer;transition:background .2s;border:none}.clear-btn{background-color:#f8f9fa;color:#333;margin-right:5px}.clear-btn:hover{background-color:#e9ecef}.today-btn{background-color:#007bff;color:#fff}.today-btn:hover{background-color:#0069d9}@keyframes fadeIn{0%{opacity:0;transform:scale(.95)}to{opacity:1;transform:scale(1)}}\n"] }]
147
+ }], propDecorators: { inputTextLabel: [{
148
+ type: Input
149
+ }], isDisabled: [{
150
+ type: Input
151
+ }], yearListRef: [{
152
+ type: ViewChild,
153
+ args: ['yearList']
154
+ }], calendarWrapper: [{
155
+ type: ViewChild,
156
+ args: ['calendarWrapper', { static: false }]
157
+ }], handleClickOutside: [{
158
+ type: HostListener,
159
+ args: ['document:click', ['$event']]
160
+ }] } });
161
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS9zcmMvbGliL2RhdGVwaWNrZXIvZGF0ZXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS9zcmMvbGliL2RhdGVwaWNrZXIvZGF0ZXBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxTQUFTLEVBQWMsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7OztBQVN0RixNQUFNLE9BQU8sbUJBQW1CO0lBRTlCLHNDQUFzQztJQUM3QixjQUFjLEdBQVcsa0JBQWtCLENBQUM7SUFFckQsbUNBQW1DO0lBQzFCLFVBQVUsR0FBWSxLQUFLLENBQUM7SUFFckMsOEJBQThCO0lBQzlCLFlBQVksR0FBZ0IsSUFBSSxDQUFDO0lBRWpDLDRDQUE0QztJQUM1QyxlQUFlLEdBQVksS0FBSyxDQUFDO0lBRWpDLDhDQUE4QztJQUM5QyxZQUFZLEdBQVMsSUFBSSxJQUFJLEVBQUUsQ0FBQztJQUVoQyxxQ0FBcUM7SUFDckMsUUFBUSxHQUE2QixLQUFLLENBQUM7SUFFM0MscUNBQXFDO0lBQ3JDLE9BQU8sR0FBRyxJQUFJLENBQUM7SUFDZixPQUFPLEdBQUcsSUFBSSxDQUFDO0lBRWYsOEJBQThCO0lBQzlCLE1BQU0sR0FBRztRQUNQLFNBQVMsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTTtRQUN0RCxNQUFNLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFVBQVU7S0FDakUsQ0FBQztJQUVxQixXQUFXLENBQThCO0lBQ2YsZUFBZSxDQUE4QjtJQUU5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QUMxQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsRUFBRSxLQUFLLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdkUsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7SUFDL0IsQ0FBQztJQUVELDhCQUE4QjtJQUM5QixTQUFTO1FBQ1AsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7SUFDM0IsQ0FBQzt3R0ExS1UsbUJBQW1COzRGQUFuQixtQkFBbUIseWFDVmhDLHF2SUE2SEEsZ21GRHJIWSxZQUFZOzs0RkFFWCxtQkFBbUI7a0JBUC9CLFNBQVM7K0JBQ0UsZ0JBQWdCLGNBQ2QsSUFBSSxXQUdQLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQzs4QkFLeEIsY0FBYztzQkFBdEIsS0FBSztnQkFHRyxVQUFVO3NCQUFsQixLQUFLO2dCQXdCaUIsV0FBVztzQkFBakMsU0FBUzt1QkFBQyxVQUFVO2dCQUM0QixlQUFlO3NCQUEvRCxTQUFTO3VCQUFDLGlCQUFpQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFjL0Msa0JBQWtCO3NCQURqQixZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlLCBEYXRlUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgVmlld0NoaWxkLCBIb3N0TGlzdGVuZXIsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2Rzby1kYXRlcGlja2VyJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9kYXRlcGlja2VyLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9kYXRlcGlja2VyLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRGF0ZVBpcGVdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEYXRlcGlja2VyQ29tcG9uZW50IHtcclxuXHJcbiAgLyoqIExhYmVsIGRpc3BsYXllZCBhYm92ZSB0aGUgaW5wdXQgKi9cclxuICBASW5wdXQoKSBpbnB1dFRleHRMYWJlbDogc3RyaW5nID0gJ0RhdGVwaWNrZXIgVGl0bGUnO1xyXG5cclxuICAvKiogRGlzYWJsZSB0aGUgZGF0ZXBpY2tlciBpbnB1dCAqL1xyXG4gIEBJbnB1dCgpIGlzRGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqIEN1cnJlbnRseSBzZWxlY3RlZCBkYXRlICovXHJcbiAgc2VsZWN0ZWREYXRlOiBEYXRlIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIC8qKiBXaGV0aGVyIHRoZSBjYWxlbmRhciBwb3B1cCBpcyB2aXNpYmxlICovXHJcbiAgY2FsZW5kYXJWaXNpYmxlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKiBDdXJyZW50IG1vbnRoIGRpc3BsYXllZCBpbiB0aGUgY2FsZW5kYXIgKi9cclxuICBjdXJyZW50TW9udGg6IERhdGUgPSBuZXcgRGF0ZSgpO1xyXG5cclxuICAvKiogVmlldyBtb2RlOiBkYXksIG1vbnRoLCBvciB5ZWFyICovXHJcbiAgdmlld01vZGU6ICdkYXknIHwgJ21vbnRoJyB8ICd5ZWFyJyA9ICdkYXknO1xyXG5cclxuICAvKiogTWluaW11bSBhbmQgbWF4aW11bSB5ZWFyIHJhbmdlICovXHJcbiAgbWluWWVhciA9IDE5OTA7XHJcbiAgbWF4WWVhciA9IDIwOTk7XHJcblxyXG4gIC8qKiBNb250aCBuYW1lcyBmb3IgZGlzcGxheSAqL1xyXG4gIG1vbnRocyA9IFtcclxuICAgICdKYW51YXJ5JywgJ0ZlYnJ1YXJ5JywgJ01hcmNoJywgJ0FwcmlsJywgJ01heScsICdKdW5lJyxcclxuICAgICdKdWx5JywgJ0F1Z3VzdCcsICdTZXB0ZW1iZXInLCAnT2N0b2JlcicsICdOb3ZlbWJlcicsICdEZWNlbWJlcidcclxuICBdO1xyXG5cclxuICBAVmlld0NoaWxkKCd5ZWFyTGlzdCcpIHllYXJMaXN0UmVmITogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XHJcbiAgQFZpZXdDaGlsZCgnY2FsZW5kYXJXcmFwcGVyJywgeyBzdGF0aWM6IGZhbHNlIH0pIGNhbGVuZGFyV3JhcHBlciE6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xyXG5cclxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gIC8vIENhbGVuZGFyIFZpc2liaWxpdHkgJiBUb2dnbGVcclxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICAvKiogVG9nZ2xlIHRoZSBjYWxlbmRhciBwb3B1cCAqL1xyXG4gIHRvZ2dsZUNhbGVuZGFyKCkge1xyXG4gICAgdGhpcy5jYWxlbmRhclZpc2libGUgPSAhdGhpcy5jYWxlbmRhclZpc2libGU7XHJcbiAgICB0aGlzLnZpZXdNb2RlID0gJ2RheSc7XHJcbiAgfVxyXG5cclxuICAvKiogQ2xvc2UgY2FsZW5kYXIgaWYgY2xpY2tpbmcgb3V0c2lkZSAqL1xyXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcclxuICBoYW5kbGVDbGlja091dHNpZGUoZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICBpZiAoIXRoaXMuY2FsZW5kYXJXcmFwcGVyKSByZXR1cm47XHJcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICBpZiAodGhpcy5jYWxlbmRhclZpc2libGUgJiYgIXRoaXMuY2FsZW5kYXJXcmFwcGVyLm5hdGl2ZUVsZW1lbnQuY29udGFpbnModGFyZ2V0KSkge1xyXG4gICAgICB0aGlzLmNhbGVuZGFyVmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAvLyBWaWV3IFN3aXRjaGluZ1xyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gIHN3aXRjaFRvTW9udGhWaWV3KCkge1xyXG4gICAgdGhpcy52aWV3TW9kZSA9ICdtb250aCc7XHJcbiAgfVxyXG5cclxuICBzd2l0Y2hUb1llYXJWaWV3KCkge1xyXG4gICAgdGhpcy52aWV3TW9kZSA9ICd5ZWFyJztcclxuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zY3JvbGxUb0N1cnJlbnRZZWFyKCksIDUwKTtcclxuICB9XHJcblxyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgLy8gTmF2aWdhdGlvbiAoTW9udGggLyBZZWFyKVxyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gIGNoYW5nZU1vbnRoKGRpcmVjdGlvbjogbnVtYmVyKSB7XHJcbiAgICB0aGlzLmN1cnJlbnRNb250aCA9IG5ldyBEYXRlKFxyXG4gICAgICB0aGlzLmN1cnJlbnRNb250aC5nZXRGdWxsWWVhcigpLFxyXG4gICAgICB0aGlzLmN1cnJlbnRNb250aC5nZXRNb250aCgpICsgZGlyZWN0aW9uLFxyXG4gICAgICAxXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgY2hhbmdlWWVhcihkaXJlY3Rpb246IG51bWJlcikge1xyXG4gICAgY29uc3QgbmV3WWVhciA9IHRoaXMuY3VycmVudE1vbnRoLmdldEZ1bGxZZWFyKCkgKyBkaXJlY3Rpb247XHJcbiAgICBpZiAobmV3WWVhciA+PSB0aGlzLm1pblllYXIgJiYgbmV3WWVhciA8PSB0aGlzLm1heFllYXIpIHtcclxuICAgICAgdGhpcy5jdXJyZW50TW9udGggPSBuZXcgRGF0ZShuZXdZZWFyLCB0aGlzLmN1cnJlbnRNb250aC5nZXRNb250aCgpLCAxKTtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnNjcm9sbFRvQ3VycmVudFllYXIoKSwgMCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gIC8vIEhlbHBlcnNcclxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICAvKiogUmV0dXJucyBhcnJheSBvZiBkYXlzIGluIHRoZSBjdXJyZW50IG1vbnRoLCB3aXRoIGxlYWRpbmcgbnVsbHMgZm9yIGVtcHR5IGdyaWQgY2VsbHMgKi9cclxuICBnZXREYXlzSW5Nb250aCgpOiAobnVtYmVyIHwgbnVsbClbXSB7XHJcbiAgICBjb25zdCBtb250aCA9IHRoaXMuY3VycmVudE1vbnRoLmdldE1vbnRoKCk7XHJcbiAgICBjb25zdCB5ZWFyID0gdGhpcy5jdXJyZW50TW9udGguZ2V0RnVsbFllYXIoKTtcclxuICAgIGNvbnN0IGZpcnN0RGF5ID0gbmV3IERhdGUoeWVhciwgbW9udGgsIDEpLmdldERheSgpO1xyXG4gICAgY29uc3QgZGF5c0luTW9udGggPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCArIDEsIDApLmdldERhdGUoKTtcclxuXHJcbiAgICBjb25zdCBkYXlzQXJyYXkgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiBkYXlzSW5Nb250aCB9LCAoXywgaSkgPT4gaSArIDEpO1xyXG4gICAgcmV0dXJuIEFycmF5KGZpcnN0RGF5KS5maWxsKG51bGwpLmNvbmNhdChkYXlzQXJyYXkpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFJldHVybnMgYXJyYXkgb2YgeWVhcnMgaW4gdGhlIGRlZmluZWQgcmFuZ2UgKi9cclxuICBnZXRZZWFyc1JhbmdlKCk6IG51bWJlcltdIHtcclxuICAgIGNvbnN0IHllYXJzOiBudW1iZXJbXSA9IFtdO1xyXG4gICAgZm9yIChsZXQgeSA9IHRoaXMubWluWWVhcjsgeSA8PSB0aGlzLm1heFllYXI7IHkrKykgeWVhcnMucHVzaCh5KTtcclxuICAgIHJldHVybiB5ZWFycztcclxuICB9XHJcblxyXG4gIC8qKiBTY3JvbGwgdGhlIHllYXIgbGlzdCB0byBzaG93IHRoZSBjdXJyZW50IHllYXIgKi9cclxuICBzY3JvbGxUb0N1cnJlbnRZZWFyKCkge1xyXG4gICAgaWYgKCF0aGlzLnllYXJMaXN0UmVmKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy55ZWFyTGlzdFJlZi5uYXRpdmVFbGVtZW50O1xyXG4gICAgY29uc3QgY3VycmVudFllYXIgPSB0aGlzLmN1cnJlbnRNb250aC5nZXRGdWxsWWVhcigpO1xyXG4gICAgY29uc3QgeWVhckluZGV4ID0gY3VycmVudFllYXIgLSB0aGlzLm1pblllYXI7XHJcbiAgICBjb25zdCBjb2x1bW5zID0gNDsgLy8gNCBjb2x1bW5zIGdyaWQgbGF5b3V0XHJcbiAgICBjb25zdCByb3dJbmRleCA9IE1hdGguZmxvb3IoeWVhckluZGV4IC8gY29sdW1ucyk7XHJcblxyXG4gICAgY29uc3QgeWVhckNlbGwgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcignLnllYXItY2VsbCcpIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgaWYgKCF5ZWFyQ2VsbCkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHNjcm9sbFRvcCA9IHJvd0luZGV4ICogeWVhckNlbGwub2Zmc2V0SGVpZ2h0O1xyXG4gICAgY29udGFpbmVyLnNjcm9sbFRvcCA9IHNjcm9sbFRvcDtcclxuICB9XHJcblxyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgLy8gU2VsZWN0aW9uIEhhbmRsZXJzXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgc2VsZWN0RGF0ZShkYXk6IG51bWJlciB8IG51bGwpIHtcclxuICAgIGlmIChkYXkgPT09IG51bGwpIHJldHVybjtcclxuICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gbmV3IERhdGUodGhpcy5jdXJyZW50TW9udGguZ2V0RnVsbFllYXIoKSwgdGhpcy5jdXJyZW50TW9udGguZ2V0TW9udGgoKSwgZGF5KTtcclxuICAgIHRoaXMuY2FsZW5kYXJWaXNpYmxlID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBzZWxlY3RNb250aChtb250aEluZGV4OiBudW1iZXIpIHtcclxuICAgIHRoaXMuY3VycmVudE1vbnRoID0gbmV3IERhdGUodGhpcy5jdXJyZW50TW9udGguZ2V0RnVsbFllYXIoKSwgbW9udGhJbmRleCwgMSk7XHJcbiAgICB0aGlzLnZpZXdNb2RlID0gJ2RheSc7XHJcbiAgfVxyXG5cclxuICBzZWxlY3RZZWFyKHllYXI6IG51bWJlcikge1xyXG4gICAgdGhpcy5jdXJyZW50TW9udGggPSBuZXcgRGF0ZSh5ZWFyLCB0aGlzLmN1cnJlbnRNb250aC5nZXRNb250aCgpLCAxKTtcclxuICAgIHRoaXMudmlld01vZGUgPSAnbW9udGgnO1xyXG4gIH1cclxuXHJcbiAgLyoqIENoZWNrIGlmIGEgZGF5IGlzIGN1cnJlbnRseSBzZWxlY3RlZCAqL1xyXG4gIGlzU2VsZWN0ZWQoZGF5OiBudW1iZXIgfCBudWxsKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWREYXRlIHx8IGRheSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgdGhpcy5zZWxlY3RlZERhdGUuZ2V0RGF0ZSgpID09PSBkYXkgJiZcclxuICAgICAgdGhpcy5zZWxlY3RlZERhdGUuZ2V0TW9udGgoKSA9PT0gdGhpcy5jdXJyZW50TW9udGguZ2V0TW9udGgoKSAmJlxyXG4gICAgICB0aGlzLnNlbGVjdGVkRGF0ZS5nZXRGdWxsWWVhcigpID09PSB0aGlzLmN1cnJlbnRNb250aC5nZXRGdWxsWWVhcigpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAvLyBGb290ZXIgQWN0aW9uc1xyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gIC8qKiBTZXQgdG9kYXnigJlzIGRhdGUgKi9cclxuICBzZXRUb2RheSgpIHtcclxuICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcclxuICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gdG9kYXk7XHJcbiAgICB0aGlzLmN1cnJlbnRNb250aCA9IG5ldyBEYXRlKHRvZGF5LmdldEZ1bGxZZWFyKCksIHRvZGF5LmdldE1vbnRoKCksIDEpO1xyXG4gICAgdGhpcy5jYWxlbmRhclZpc2libGUgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8qKiBDbGVhciB0aGUgc2VsZWN0ZWQgZGF0ZSAqL1xyXG4gIGNsZWFyRGF0ZSgpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gbnVsbDtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImRhdGVwaWNrZXItd3JhcHBlclwiICNjYWxlbmRhcldyYXBwZXI+XHJcbiAgXHJcbiAgPCEtLSBMYWJlbCBhYm92ZSB0aGUgaW5wdXQgLS0+XHJcbiAgPGRpdiAqbmdJZj1cImlucHV0VGV4dExhYmVsXCIgY2xhc3M9XCJkYXRlcGlja2VyLWxhYmVsXCI+e3sgaW5wdXRUZXh0TGFiZWwgfX08L2Rpdj5cclxuXHJcbiAgPCEtLSBJbnB1dCBmaWVsZCAocmVhZG9ubHkpIC0tPlxyXG4gIDxpbnB1dFxyXG4gICAgdHlwZT1cInRleHRcIlxyXG4gICAgY2xhc3M9XCJkYXRlcGlja2VyLWlucHV0XCJcclxuICAgIFt2YWx1ZV09XCJzZWxlY3RlZERhdGUgPyAoc2VsZWN0ZWREYXRlIHwgZGF0ZTonTU1NIGQsIHknKSA6ICcnXCJcclxuICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IGEgZGF0ZVwiXHJcbiAgICByZWFkb25seVxyXG4gICAgKGNsaWNrKT1cInRvZ2dsZUNhbGVuZGFyKClcIlxyXG4gICAgW2Rpc2FibGVkXT1cImlzRGlzYWJsZWRcIlxyXG4gICAgW2NsYXNzLmRpc2FibGVkXT1cImlzRGlzYWJsZWRcIlxyXG4gIC8+XHJcblxyXG4gIDwhLS0gQ2FsZW5kYXIgcG9wdXAgLS0+XHJcbiAgPGRpdiBjbGFzcz1cImNhbGVuZGFyXCIgKm5nSWY9XCJjYWxlbmRhclZpc2libGVcIj5cclxuXHJcbiAgICA8IS0tIEhlYWRlciAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJjYWxlbmRhci1oZWFkZXJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImhlYWRlci1yb3dcIj5cclxuXHJcbiAgICAgICAgPCEtLSBZZWFyICYgTW9udGggTmF2aWdhdGlvbiBCdXR0b25zIC0tPlxyXG4gICAgICAgIDxidXR0b24gKm5nSWY9XCJ2aWV3TW9kZSA9PT0gJ2RheScgfHwgdmlld01vZGUgPT09ICdtb250aCdcIiBcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJjaGFuZ2VZZWFyKC0xKVwiIGNsYXNzPVwibmF2LWJ0blwiPsKrPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvbiAqbmdJZj1cInZpZXdNb2RlID09PSAnZGF5J1wiIFxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImNoYW5nZU1vbnRoKC0xKVwiIGNsYXNzPVwibmF2LWJ0blwiPuKAuTwvYnV0dG9uPlxyXG5cclxuICAgICAgICA8IS0tIENhbGVuZGFyIFRpdGxlIChNb250aCAvIFllYXIgZGlzcGxheSkgLS0+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjYWxlbmRhci10aXRsZVwiPlxyXG5cclxuICAgICAgICAgIDwhLS0gRGF5IHZpZXc6IHNob3cgTW9udGggKyBZZWFyIC0tPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInZpZXdNb2RlID09PSAnZGF5J1wiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1vbnRoLWxhYmVsXCIgKGNsaWNrKT1cInN3aXRjaFRvTW9udGhWaWV3KClcIj5cclxuICAgICAgICAgICAgICB7eyBjdXJyZW50TW9udGggfCBkYXRlOidNTU1NJyB9fVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwieWVhci1sYWJlbFwiIChjbGljayk9XCJzd2l0Y2hUb1llYXJWaWV3KClcIj5cclxuICAgICAgICAgICAgICB7eyBjdXJyZW50TW9udGggfCBkYXRlOid5eXl5JyB9fVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICA8IS0tIE1vbnRoIHZpZXc6IHNob3cgWWVhciAtLT5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ2aWV3TW9kZSA9PT0gJ21vbnRoJ1wiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInllYXItbGFiZWxcIiAoY2xpY2spPVwic3dpdGNoVG9ZZWFyVmlldygpXCI+XHJcbiAgICAgICAgICAgICAge3sgY3VycmVudE1vbnRoIHwgZGF0ZToneXl5eScgfX1cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgPCEtLSBZZWFyIHZpZXc6IHNob3cgWWVhciBvbmx5IC0tPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInZpZXdNb2RlID09PSAneWVhcidcIj5cclxuICAgICAgICAgICAge3sgY3VycmVudE1vbnRoIHwgZGF0ZToneXl5eScgfX1cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICA8L3NwYW4+XHJcblxyXG4gICAgICAgIDwhLS0gRm9yd2FyZCBuYXZpZ2F0aW9uIGJ1dHRvbnMgLS0+XHJcbiAgICAgICAgPGJ1dHRvbiAqbmdJZj1cInZpZXdNb2RlID09PSAnZGF5J1wiIChjbGljayk9XCJjaGFuZ2VNb250aCgxKVwiIGNsYXNzPVwibmF2LWJ0blwiPuKAujwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gKm5nSWY9XCJ2aWV3TW9kZSA9PT0gJ2RheScgfHwgdmlld01vZGUgPT09ICdtb250aCdcIiBcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJjaGFuZ2VZZWFyKDEpXCIgY2xhc3M9XCJuYXYtYnRuXCI+wrs8L2J1dHRvbj5cclxuXHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICAgICAgIERBWSBWSUVXXHJcbiAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0+XHJcbiAgICA8ZGl2ICpuZ0lmPVwidmlld01vZGUgPT09ICdkYXknXCI+XHJcblxyXG4gICAgICA8IS0tIFdlZWtkYXkgTGFiZWxzIC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY2FsZW5kYXItd2Vla2RheXNcIj5cclxuICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBkYXkgb2YgWydTJywnTScsJ1QnLCdXJywnVCcsJ0YnLCdTJ11cIj57eyBkYXkgfX08L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8IS0tIERheXMgR3JpZCAtLT5cclxuICAgICAgPGRpdiBjbGFzcz1cImNhbGVuZGFyLWdyaWQgZGF5cy1ncmlkXCI+XHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgKm5nRm9yPVwibGV0IGRheSBvZiBnZXREYXlzSW5Nb250aCgpXCJcclxuICAgICAgICAgIFtjbGFzcy5lbXB0eV09XCJkYXkgPT09IG51bGxcIlxyXG4gICAgICAgICAgW2NsYXNzLnNlbGVjdGVkXT1cImlzU2VsZWN0ZWQoZGF5KVwiXHJcbiAgICAgICAgICAoY2xpY2spPVwic2VsZWN0RGF0ZShkYXkpXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICB7eyBkYXkgfX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgICAgICAgTU9OVEggVklFV1xyXG4gICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tPlxyXG4gICAgPGRpdiAqbmdJZj1cInZpZXdNb2RlID09PSAnbW9udGgnXCIgY2xhc3M9XCJjYWxlbmRhci1ncmlkIG1vbnRocy1ncmlkXCI+XHJcbiAgICAgIDxkaXYgKm5nRm9yPVwibGV0IG0gb2YgbW9udGhzOyBsZXQgaSA9IGluZGV4XCIgXHJcbiAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdE1vbnRoKGkpXCIgXHJcbiAgICAgICAgICAgY2xhc3M9XCJtb250aC1jZWxsXCI+XHJcbiAgICAgICAge3sgbSB9fVxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgICAgICBZRUFSIFZJRVdcclxuICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLT5cclxuICAgIDxkaXYgKm5nSWY9XCJ2aWV3TW9kZSA9PT0gJ3llYXInXCIgXHJcbiAgICAgICAgIGNsYXNzPVwiY2FsZW5kYXItZ3JpZCB5ZWFycy1ncmlkIHNjcm9sbGFibGVcIiBcclxuICAgICAgICAgI3llYXJMaXN0PlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgKm5nRm9yPVwibGV0IHkgb2YgZ2V0WWVhcnNSYW5nZSgpXCJcclxuICAgICAgICAoY2xpY2spPVwic2VsZWN0WWVhcih5KVwiXHJcbiAgICAgICAgY2xhc3M9XCJ5ZWFyLWNlbGxcIlxyXG4gICAgICAgIFtjbGFzcy5jdXJyZW50LXllYXJdPVwieSA9PT0gY3VycmVudE1vbnRoLmdldEZ1bGxZZWFyKClcIlxyXG4gICAgICA+XHJcbiAgICAgICAge3sgeSB9fVxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICAgICAgICBGb290ZXIgQnV0dG9uc1xyXG4gICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImNhbGVuZGFyLWZvb3RlclwiPlxyXG4gICAgICA8YnV0dG9uIGNsYXNzPVwiZm9vdGVyLWJ0biBjbGVhci1idG5cIiAoY2xpY2spPVwiY2xlYXJEYXRlKClcIj5DbGVhcjwvYnV0dG9uPlxyXG4gICAgICA8YnV0dG9uIGNsYXNzPVwiZm9vdGVyLWJ0biB0b2RheS1idG5cIiAoY2xpY2spPVwic2V0VG9kYXkoKVwiPlRvZGF5PC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=
@@ -0,0 +1,25 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { Component, Input, Output, EventEmitter } from '@angular/core';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@angular/common";
5
+ export class DialogComponent {
6
+ visible = false;
7
+ title = 'Dialog Title';
8
+ close = new EventEmitter();
9
+ onClose() {
10
+ this.close.emit();
11
+ }
12
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
13
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: DialogComponent, isStandalone: true, selector: "dso-dialog", inputs: { visible: "visible", title: "title" }, outputs: { close: "close" }, ngImport: i0, template: "<div class=\"dialog-overlay\" *ngIf=\"visible\" (click)=\"onClose()\">\r\n <div class=\"dialog\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"dialog-header\">{{ title }}</div>\r\n <div class=\"dialog-body\">\r\n <ng-content></ng-content> <!-- Projected content -->\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".dialog-overlay{position:fixed;top:0;left:0;width:100vw;height:100vh;background-color:#0006;display:flex;align-items:center;justify-content:center;z-index:1000}.dialog{background:#fff;padding:24px;border-radius:8px;width:400px;max-width:90%;box-shadow:0 2px 8px #00000040;position:relative;display:flex;flex-direction:column;gap:12px}.dialog-header{font-size:20px;font-weight:700}.dialog-close{background:none;border:none;font-size:1.5rem;line-height:1;cursor:pointer}.dialog-body{display:flex;flex-direction:column;gap:16px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
14
+ }
15
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DialogComponent, decorators: [{
16
+ type: Component,
17
+ args: [{ selector: 'dso-dialog', standalone: true, imports: [CommonModule], template: "<div class=\"dialog-overlay\" *ngIf=\"visible\" (click)=\"onClose()\">\r\n <div class=\"dialog\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"dialog-header\">{{ title }}</div>\r\n <div class=\"dialog-body\">\r\n <ng-content></ng-content> <!-- Projected content -->\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".dialog-overlay{position:fixed;top:0;left:0;width:100vw;height:100vh;background-color:#0006;display:flex;align-items:center;justify-content:center;z-index:1000}.dialog{background:#fff;padding:24px;border-radius:8px;width:400px;max-width:90%;box-shadow:0 2px 8px #00000040;position:relative;display:flex;flex-direction:column;gap:12px}.dialog-header{font-size:20px;font-weight:700}.dialog-close{background:none;border:none;font-size:1.5rem;line-height:1;cursor:pointer}.dialog-body{display:flex;flex-direction:column;gap:16px}\n"] }]
18
+ }], propDecorators: { visible: [{
19
+ type: Input
20
+ }], title: [{
21
+ type: Input
22
+ }], close: [{
23
+ type: Output
24
+ }] } });
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3VpL3NyYy9saWIvZGlhbG9nL2RpYWxvZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS9zcmMvbGliL2RpYWxvZy9kaWFsb2cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7OztBQVN2RSxNQUFNLE9BQU8sZUFBZTtJQUNqQixPQUFPLEdBQVksS0FBSyxDQUFDO0lBQ3pCLEtBQUssR0FBVyxjQUFjLENBQUM7SUFFOUIsS0FBSyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7SUFFM0MsT0FBTztRQUNMLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDcEIsQ0FBQzt3R0FSVSxlQUFlOzRGQUFmLGVBQWUsbUpDVjVCLHdVQVFBLHdrQkRBYSxZQUFZOzs0RkFFWixlQUFlO2tCQVAzQixTQUFTOytCQUNFLFlBQVksY0FDVixJQUFJLFdBR1AsQ0FBRSxZQUFZLENBQUU7OEJBR2hCLE9BQU87c0JBQWYsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBRUksS0FBSztzQkFBZCxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnZHNvLWRpYWxvZycsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICB0ZW1wbGF0ZVVybDogJy4vZGlhbG9nLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9kaWFsb2cuY29tcG9uZW50LnNjc3MnXSxcclxuICBpbXBvcnRzOiBbIENvbW1vbk1vZHVsZSBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEaWFsb2dDb21wb25lbnQge1xyXG4gIEBJbnB1dCgpIHZpc2libGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSB0aXRsZTogc3RyaW5nID0gJ0RpYWxvZyBUaXRsZSc7XHJcblxyXG4gIEBPdXRwdXQoKSBjbG9zZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgb25DbG9zZSgpIHtcclxuICAgIHRoaXMuY2xvc2UuZW1pdCgpO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiZGlhbG9nLW92ZXJsYXlcIiAqbmdJZj1cInZpc2libGVcIiAoY2xpY2spPVwib25DbG9zZSgpXCI+XHJcbiAgPGRpdiBjbGFzcz1cImRpYWxvZ1wiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJkaWFsb2ctaGVhZGVyXCI+e3sgdGl0bGUgfX08L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJkaWFsb2ctYm9keVwiPlxyXG4gICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+IDwhLS0gUHJvamVjdGVkIGNvbnRlbnQgLS0+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==
@@ -0,0 +1,71 @@
1
+ import { Directive, Input, HostListener } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class DsoTruncateDirective {
4
+ el;
5
+ /**
6
+ * Enable or disable truncation.
7
+ * Can be used as `<div dsoTruncate>` (enabled by default) or `[dsoTruncate]="false"`.
8
+ */
9
+ enableTruncate = true;
10
+ /** Optional: override tooltip text when text is truncated */
11
+ truncateTooltipText;
12
+ constructor(el) {
13
+ this.el = el;
14
+ }
15
+ /** Initialize truncation after the view is loaded */
16
+ ngAfterViewInit() {
17
+ if (this.enableTruncate) {
18
+ this.applyTruncationStyles();
19
+ this.updateTooltip();
20
+ }
21
+ }
22
+ /** Re-check overflow and update tooltip on window resize */
23
+ onResize() {
24
+ if (this.enableTruncate) {
25
+ this.updateTooltip();
26
+ }
27
+ }
28
+ // -------------------------
29
+ // PRIVATE METHODS
30
+ // -------------------------
31
+ /** Apply CSS styles necessary for truncation */
32
+ applyTruncationStyles() {
33
+ const element = this.el.nativeElement;
34
+ element.style.whiteSpace = 'nowrap';
35
+ element.style.overflow = 'hidden';
36
+ element.style.textOverflow = 'ellipsis';
37
+ element.style.display = 'inline-block';
38
+ element.style.maxWidth = '100%';
39
+ }
40
+ /** Update tooltip based on overflow state */
41
+ updateTooltip() {
42
+ const el = this.el.nativeElement;
43
+ const isOverflowing = el.scrollWidth > el.clientWidth;
44
+ if (isOverflowing) {
45
+ // Add or update tooltip with either the provided text or element content
46
+ el.setAttribute('dsoDirectiveTooltip', this.truncateTooltipText || el.textContent || '');
47
+ }
48
+ else {
49
+ // Remove tooltip if content fits
50
+ el.removeAttribute('dsoDirectiveTooltip');
51
+ }
52
+ }
53
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DsoTruncateDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
54
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.14", type: DsoTruncateDirective, isStandalone: true, selector: "[dsoTruncate]", inputs: { enableTruncate: ["dsoTruncate", "enableTruncate"], truncateTooltipText: "truncateTooltipText" }, host: { listeners: { "window:resize": "onResize()" } }, ngImport: i0 });
55
+ }
56
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DsoTruncateDirective, decorators: [{
57
+ type: Directive,
58
+ args: [{
59
+ selector: '[dsoTruncate]',
60
+ standalone: true
61
+ }]
62
+ }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { enableTruncate: [{
63
+ type: Input,
64
+ args: ['dsoTruncate']
65
+ }], truncateTooltipText: [{
66
+ type: Input
67
+ }], onResize: [{
68
+ type: HostListener,
69
+ args: ['window:resize']
70
+ }] } });
71
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJ1bmNhdGUuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWkvc3JjL2xpYi9kaXJlY3RpdmVzL3RydW5jYXRlLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLEtBQUssRUFBaUIsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQU0xRixNQUFNLE9BQU8sb0JBQW9CO0lBV1g7SUFUcEI7OztPQUdHO0lBQ21CLGNBQWMsR0FBaUIsSUFBSSxDQUFDO0lBRTFELDZEQUE2RDtJQUNwRCxtQkFBbUIsQ0FBVTtJQUV0QyxZQUFvQixFQUEyQjtRQUEzQixPQUFFLEdBQUYsRUFBRSxDQUF5QjtJQUFHLENBQUM7SUFFbkQscURBQXFEO0lBQ3JELGVBQWU7UUFDYixJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDdkIsQ0FBQztJQUNILENBQUM7SUFFRCw0REFBNEQ7SUFFNUQsUUFBUTtRQUNOLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN2QixDQUFDO0lBQ0gsQ0FBQztJQUVELDRCQUE0QjtJQUM1QixrQkFBa0I7SUFDbEIsNEJBQTRCO0lBRTVCLGdEQUFnRDtJQUN4QyxxQkFBcUI7UUFDM0IsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUM7UUFDdEMsT0FBTyxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsUUFBUSxDQUFDO1FBQ3BDLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUNsQyxPQUFPLENBQUMsS0FBSyxDQUFDLFlBQVksR0FBRyxVQUFVLENBQUM7UUFDeEMsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsY0FBYyxDQUFDO1FBQ3ZDLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQztJQUNsQyxDQUFDO0lBRUQsNkNBQTZDO0lBQ3JDLGFBQWE7UUFDbkIsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUM7UUFFakMsTUFBTSxhQUFhLEdBQUcsRUFBRSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDO1FBRXRELElBQUksYUFBYSxFQUFFLENBQUM7WUFDbEIseUVBQXlFO1lBQ3pFLEVBQUUsQ0FBQyxZQUFZLENBQUMscUJBQXFCLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixJQUFJLEVBQUUsQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFDLENBQUM7UUFDM0YsQ0FBQzthQUFNLENBQUM7WUFDTixpQ0FBaUM7WUFDakMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQzVDLENBQUM7SUFDSCxDQUFDO3dHQXhEVSxvQkFBb0I7NEZBQXBCLG9CQUFvQjs7NEZBQXBCLG9CQUFvQjtrQkFKaEMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsZUFBZTtvQkFDekIsVUFBVSxFQUFFLElBQUk7aUJBQ2pCOytFQU91QixjQUFjO3NCQUFuQyxLQUFLO3VCQUFDLGFBQWE7Z0JBR1gsbUJBQW1CO3NCQUEzQixLQUFLO2dCQWNOLFFBQVE7c0JBRFAsWUFBWTt1QkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBJbnB1dCwgQWZ0ZXJWaWV3SW5pdCwgSG9zdExpc3RlbmVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ1tkc29UcnVuY2F0ZV0nLFxyXG4gIHN0YW5kYWxvbmU6IHRydWVcclxufSlcclxuZXhwb3J0IGNsYXNzIERzb1RydW5jYXRlRGlyZWN0aXZlIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XHJcblxyXG4gIC8qKiBcclxuICAgKiBFbmFibGUgb3IgZGlzYWJsZSB0cnVuY2F0aW9uLiAgXHJcbiAgICogQ2FuIGJlIHVzZWQgYXMgYDxkaXYgZHNvVHJ1bmNhdGU+YCAoZW5hYmxlZCBieSBkZWZhdWx0KSBvciBgW2Rzb1RydW5jYXRlXT1cImZhbHNlXCJgLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgnZHNvVHJ1bmNhdGUnKSBlbmFibGVUcnVuY2F0ZTogYm9vbGVhbiB8ICcnID0gdHJ1ZTtcclxuXHJcbiAgLyoqIE9wdGlvbmFsOiBvdmVycmlkZSB0b29sdGlwIHRleHQgd2hlbiB0ZXh0IGlzIHRydW5jYXRlZCAqL1xyXG4gIEBJbnB1dCgpIHRydW5jYXRlVG9vbHRpcFRleHQ/OiBzdHJpbmc7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWw6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+KSB7fVxyXG5cclxuICAvKiogSW5pdGlhbGl6ZSB0cnVuY2F0aW9uIGFmdGVyIHRoZSB2aWV3IGlzIGxvYWRlZCAqL1xyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIGlmICh0aGlzLmVuYWJsZVRydW5jYXRlKSB7XHJcbiAgICAgIHRoaXMuYXBwbHlUcnVuY2F0aW9uU3R5bGVzKCk7XHJcbiAgICAgIHRoaXMudXBkYXRlVG9vbHRpcCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIFJlLWNoZWNrIG92ZXJmbG93IGFuZCB1cGRhdGUgdG9vbHRpcCBvbiB3aW5kb3cgcmVzaXplICovXHJcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScpXHJcbiAgb25SZXNpemUoKSB7XHJcbiAgICBpZiAodGhpcy5lbmFibGVUcnVuY2F0ZSkge1xyXG4gICAgICB0aGlzLnVwZGF0ZVRvb2x0aXAoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAvLyBQUklWQVRFIE1FVEhPRFNcclxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gIC8qKiBBcHBseSBDU1Mgc3R5bGVzIG5lY2Vzc2FyeSBmb3IgdHJ1bmNhdGlvbiAqL1xyXG4gIHByaXZhdGUgYXBwbHlUcnVuY2F0aW9uU3R5bGVzKCkge1xyXG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudDtcclxuICAgIGVsZW1lbnQuc3R5bGUud2hpdGVTcGFjZSA9ICdub3dyYXAnO1xyXG4gICAgZWxlbWVudC5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xyXG4gICAgZWxlbWVudC5zdHlsZS50ZXh0T3ZlcmZsb3cgPSAnZWxsaXBzaXMnO1xyXG4gICAgZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2lubGluZS1ibG9jayc7XHJcbiAgICBlbGVtZW50LnN0eWxlLm1heFdpZHRoID0gJzEwMCUnO1xyXG4gIH1cclxuXHJcbiAgLyoqIFVwZGF0ZSB0b29sdGlwIGJhc2VkIG9uIG92ZXJmbG93IHN0YXRlICovXHJcbiAgcHJpdmF0ZSB1cGRhdGVUb29sdGlwKCkge1xyXG4gICAgY29uc3QgZWwgPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQ7XHJcblxyXG4gICAgY29uc3QgaXNPdmVyZmxvd2luZyA9IGVsLnNjcm9sbFdpZHRoID4gZWwuY2xpZW50V2lkdGg7XHJcblxyXG4gICAgaWYgKGlzT3ZlcmZsb3dpbmcpIHtcclxuICAgICAgLy8gQWRkIG9yIHVwZGF0ZSB0b29sdGlwIHdpdGggZWl0aGVyIHRoZSBwcm92aWRlZCB0ZXh0IG9yIGVsZW1lbnQgY29udGVudFxyXG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoJ2Rzb0RpcmVjdGl2ZVRvb2x0aXAnLCB0aGlzLnRydW5jYXRlVG9vbHRpcFRleHQgfHwgZWwudGV4dENvbnRlbnQgfHwgJycpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gUmVtb3ZlIHRvb2x0aXAgaWYgY29udGVudCBmaXRzXHJcbiAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZSgnZHNvRGlyZWN0aXZlVG9vbHRpcCcpO1xyXG4gICAgfVxyXG4gIH1cclxufSJdfQ==