ng-zenduit 2.0.3 → 2.0.8

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 (29) hide show
  1. package/esm2020/lib/comment-item/zendu-comment-item.component.mjs +95 -0
  2. package/esm2020/lib/comment-list/zendu-comment-list.component.mjs +52 -0
  3. package/esm2020/lib/comment-textarea/zendu-comment-textarea.component.mjs +182 -0
  4. package/esm2020/lib/date-picker-dropdown/date-picker-dropdown.types.mjs +2 -0
  5. package/esm2020/lib/date-picker-dropdown/zendu-date-picker-dropdown.component.mjs +470 -0
  6. package/esm2020/lib/file-uploader/file-uploader.types.mjs +2 -0
  7. package/esm2020/lib/file-uploader/zendu-file-uploader.component.mjs +144 -0
  8. package/esm2020/lib/ng-zenduit.module.mjs +30 -5
  9. package/esm2020/lib/timepicker/zendu-timepicker.component.mjs +2 -2
  10. package/esm2020/public-api.mjs +8 -1
  11. package/fesm2015/ng-zenduit.mjs +954 -7
  12. package/fesm2015/ng-zenduit.mjs.map +1 -1
  13. package/fesm2020/ng-zenduit.mjs +947 -7
  14. package/fesm2020/ng-zenduit.mjs.map +1 -1
  15. package/icons/arrow-right.svg +3 -0
  16. package/icons/check-circle.svg +3 -0
  17. package/icons/film.svg +3 -0
  18. package/icons/upload-cloud.svg +3 -0
  19. package/lib/comment-item/zendu-comment-item.component.d.ts +49 -0
  20. package/lib/comment-list/zendu-comment-list.component.d.ts +22 -0
  21. package/lib/comment-textarea/zendu-comment-textarea.component.d.ts +57 -0
  22. package/lib/date-picker-dropdown/date-picker-dropdown.types.d.ts +12 -0
  23. package/lib/date-picker-dropdown/zendu-date-picker-dropdown.component.d.ts +87 -0
  24. package/lib/file-uploader/file-uploader.types.d.ts +7 -0
  25. package/lib/file-uploader/zendu-file-uploader.component.d.ts +27 -0
  26. package/lib/ng-zenduit.module.d.ts +13 -8
  27. package/package.json +1 -1
  28. package/public-api.d.ts +7 -0
  29. package/styles/colors.scss +450 -0
@@ -0,0 +1,95 @@
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/common";
4
+ import * as i2 from "../comment-textarea/zendu-comment-textarea.component";
5
+ export class ZenduCommentItemComponent {
6
+ constructor() {
7
+ this.showConnector = true;
8
+ this.editable = true;
9
+ this.deletable = true;
10
+ this.loading = false;
11
+ this.edit = new EventEmitter();
12
+ this.delete = new EventEmitter();
13
+ this.saveEdit = new EventEmitter();
14
+ this.cancelEdit = new EventEmitter();
15
+ this.editing = false;
16
+ this.editValue = '';
17
+ this.wasLoading = false;
18
+ }
19
+ ngOnChanges(changes) {
20
+ if (changes['loading'] && this.wasLoading && !this.loading && this.editing) {
21
+ this.editing = false;
22
+ this.editValue = '';
23
+ }
24
+ this.wasLoading = this.loading;
25
+ }
26
+ get isEditable() {
27
+ return this.editable && (this.comment?.editable !== false);
28
+ }
29
+ get isDeletable() {
30
+ return this.deletable && (this.comment?.deletable !== false);
31
+ }
32
+ get initials() {
33
+ if (!this.comment?.authorName)
34
+ return '';
35
+ return this.comment.authorName
36
+ .split(' ')
37
+ .map(n => n[0])
38
+ .join('')
39
+ .substring(0, 2)
40
+ .toUpperCase();
41
+ }
42
+ onEdit() {
43
+ if (this.loading)
44
+ return;
45
+ this.editing = true;
46
+ this.editValue = this.comment.text;
47
+ this.edit.emit(this.comment);
48
+ }
49
+ onDelete() {
50
+ if (this.loading)
51
+ return;
52
+ this.delete.emit(this.comment);
53
+ }
54
+ onSaveEdit(event) {
55
+ this.saveEdit.emit({ comment: this.comment, text: event.text });
56
+ }
57
+ onCancelEdit() {
58
+ this.editing = false;
59
+ this.editValue = '';
60
+ this.cancelEdit.emit(this.comment);
61
+ }
62
+ getFileIcon(name) {
63
+ const ext = name.split('.').pop()?.toLowerCase() || '';
64
+ if (['pdf', 'doc', 'docx', 'txt', 'xls', 'xlsx', 'csv', 'ppt', 'pptx'].includes(ext))
65
+ return 'document';
66
+ if (['mp4', 'mov', 'avi', 'mkv', 'webm', 'flv'].includes(ext))
67
+ return 'video';
68
+ return 'misc';
69
+ }
70
+ }
71
+ ZenduCommentItemComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduCommentItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
72
+ ZenduCommentItemComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: ZenduCommentItemComponent, selector: "zen-comment-item", inputs: { comment: "comment", showConnector: "showConnector", editable: "editable", deletable: "deletable", loading: "loading" }, outputs: { edit: "edit", delete: "delete", saveEdit: "saveEdit", cancelEdit: "cancelEdit" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"zen-comment-item\" [class.zen-comment-item--loading]=\"loading\">\n\n <div class=\"zen-comment-item__left\">\n <!-- Avatar -->\n <div class=\"zen-comment-item__avatar\">\n <img *ngIf=\"comment.authorAvatar\"\n [src]=\"comment.authorAvatar\"\n [alt]=\"comment.authorName\"\n class=\"zen-comment-item__avatar-img\" />\n <span *ngIf=\"!comment.authorAvatar\" class=\"zen-comment-item__avatar-initials\">\n {{ initials }}\n </span>\n <span *ngIf=\"comment.online\" class=\"zen-comment-item__online-dot\"></span>\n </div>\n <!-- Connector line -->\n <div *ngIf=\"showConnector\" class=\"zen-comment-item__connector\"></div>\n </div>\n\n <div class=\"zen-comment-item__body\">\n <!-- Header: name + time -->\n <div class=\"zen-comment-item__header\">\n <span class=\"zen-comment-item__author\">{{ comment.authorName }}</span>\n <span class=\"zen-comment-item__time\">{{ comment.timestamp }}</span>\n </div>\n\n <!-- Default view -->\n <ng-container *ngIf=\"!editing\">\n <p class=\"zen-comment-item__text\">{{ comment.text }}</p>\n\n <!-- Attachments -->\n <div class=\"zen-comment-item__attachment\"\n *ngFor=\"let att of comment.attachments\">\n <div class=\"zen-comment-item__attachment-icon\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M14 2H6C5.46957 2 4.96086 2.21071 4.58579 2.58579C4.21071 2.96086 4 3.46957 4 4V20C4 20.5304 4.21071 21.0391 4.58579 21.4142C4.96086 21.7893 5.46957 22 6 22H18C18.5304 22 19.0391 21.7893 19.4142 21.4142C19.7893 21.0391 20 20.5304 20 20V8L14 2Z\" stroke=\"#136AB6\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <polyline points=\"14,2 14,8 20,8\" stroke=\"#136AB6\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n <div class=\"zen-comment-item__attachment-info\">\n <div class=\"zen-comment-item__attachment-name\">{{ att.name }}</div>\n <div class=\"zen-comment-item__attachment-size\">{{ att.size }}</div>\n </div>\n </div>\n </ng-container>\n\n <!-- Edit view -->\n <ng-container *ngIf=\"editing\">\n <zen-comment-textarea\n [(value)]=\"editValue\"\n [loading]=\"loading\"\n (save)=\"onSaveEdit($event)\"\n (cancel)=\"onCancelEdit()\">\n </zen-comment-textarea>\n </ng-container>\n </div>\n\n <!-- Actions (always visible, individually controllable) -->\n <div class=\"zen-comment-item__actions\" *ngIf=\"(isEditable || isDeletable) && !editing\">\n <button *ngIf=\"isDeletable\"\n type=\"button\"\n class=\"zen-comment-item__action-btn\"\n title=\"Delete\"\n [disabled]=\"loading\"\n (click)=\"onDelete()\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <polyline points=\"3,6 5,6 21,6\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M19 6V20C19 20.5304 18.7893 21.0391 18.4142 21.4142C18.0391 21.7893 17.5304 22 17 22H7C6.46957 22 5.96086 21.7893 5.58579 21.4142C5.21071 21.0391 5 20.5304 5 20V6M8 6V4C8 3.46957 8.21071 2.96086 8.58579 2.58579C8.96086 2.21071 9.46957 2 10 2H14C14.5304 2 15.0391 2.21071 15.4142 2.58579C15.7893 2.96086 16 3.46957 16 4V6\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n <button *ngIf=\"isEditable\"\n type=\"button\"\n class=\"zen-comment-item__action-btn\"\n title=\"Edit\"\n [disabled]=\"loading\"\n (click)=\"onEdit()\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M17 3C17.2626 2.73735 17.5744 2.52901 17.9176 2.38687C18.2608 2.24473 18.6286 2.17157 19 2.17157C19.3714 2.17157 19.7392 2.24473 20.0824 2.38687C20.4256 2.52901 20.7374 2.73735 21 3C21.2626 3.26264 21.471 3.57444 21.6131 3.9176C21.7553 4.26077 21.8284 4.62856 21.8284 5C21.8284 5.37143 21.7553 5.73923 21.6131 6.08239C21.471 6.42555 21.2626 6.73735 21 7L7.5 20.5L2 22L3.5 16.5L17 3Z\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n </div>\n</div>\n", styles: [".zen-comment-item{display:flex;align-items:flex-start;width:100%}.zen-comment-item--loading{opacity:.7;pointer-events:none}.zen-comment-item__left{display:flex;flex-direction:column;align-items:center;gap:4px;padding-bottom:4px;flex-shrink:0}.zen-comment-item__avatar{position:relative;width:32px;height:32px;border-radius:200px;background:#C7B9DA;overflow:visible;flex-shrink:0}.zen-comment-item__avatar-img{width:32px;height:32px;border-radius:200px;object-fit:cover}.zen-comment-item__avatar-initials{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:200px;font-family:Inter,sans-serif;font-weight:500;font-size:12px;color:#fff}.zen-comment-item__online-dot{position:absolute;bottom:0;right:0;width:8px;height:8px;background:#12B76A;border:1.5px solid #fff;border-radius:4px}.zen-comment-item__connector{flex:1;width:2px;min-height:8px;background:#EAECF0;border-radius:2px}.zen-comment-item__body{flex:1;min-width:0;display:flex;flex-direction:column;gap:12px;padding-bottom:32px;margin-left:12px}.zen-comment-item__header{display:flex;align-items:center;gap:8px;white-space:nowrap}.zen-comment-item__author{font-family:Inter,sans-serif;font-weight:500;font-size:14px;line-height:20px;color:#344054}.zen-comment-item__time{font-family:Inter,sans-serif;font-weight:400;font-size:12px;line-height:18px;color:#667085}.zen-comment-item__text{font-family:Inter,sans-serif;font-weight:400;font-size:14px;line-height:20px;color:#667085;margin:0;word-break:break-word}.zen-comment-item__attachment{display:flex;align-items:flex-start;gap:12px}.zen-comment-item__attachment-icon{flex-shrink:0;width:32px;height:32px;background:#E3EEFB;border:4px solid #F1F7FE;border-radius:28px;display:flex;align-items:center;justify-content:center}.zen-comment-item__attachment-info{min-width:0}.zen-comment-item__attachment-name{font-family:Inter,sans-serif;font-weight:500;font-size:14px;line-height:20px;color:#344054;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.zen-comment-item__attachment-size{font-family:Inter,sans-serif;font-weight:400;font-size:14px;line-height:20px;color:#667085}.zen-comment-item__actions{display:flex;align-items:center;flex-shrink:0}.zen-comment-item__action-btn{display:flex;align-items:center;justify-content:center;width:40px;height:40px;border:none;background:transparent;border-radius:8px;cursor:pointer;padding:10px}.zen-comment-item__action-btn:hover{background:#F2F4F7}\n"], dependencies: [{ 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: i2.ZenduCommentTextareaComponent, selector: "zen-comment-textarea", inputs: ["value", "label", "placeholder", "rows", "fileTypes", "loading"], outputs: ["valueChange", "addComment", "filesChanged", "save", "cancel"] }] });
73
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduCommentItemComponent, decorators: [{
74
+ type: Component,
75
+ args: [{ selector: 'zen-comment-item', template: "<div class=\"zen-comment-item\" [class.zen-comment-item--loading]=\"loading\">\n\n <div class=\"zen-comment-item__left\">\n <!-- Avatar -->\n <div class=\"zen-comment-item__avatar\">\n <img *ngIf=\"comment.authorAvatar\"\n [src]=\"comment.authorAvatar\"\n [alt]=\"comment.authorName\"\n class=\"zen-comment-item__avatar-img\" />\n <span *ngIf=\"!comment.authorAvatar\" class=\"zen-comment-item__avatar-initials\">\n {{ initials }}\n </span>\n <span *ngIf=\"comment.online\" class=\"zen-comment-item__online-dot\"></span>\n </div>\n <!-- Connector line -->\n <div *ngIf=\"showConnector\" class=\"zen-comment-item__connector\"></div>\n </div>\n\n <div class=\"zen-comment-item__body\">\n <!-- Header: name + time -->\n <div class=\"zen-comment-item__header\">\n <span class=\"zen-comment-item__author\">{{ comment.authorName }}</span>\n <span class=\"zen-comment-item__time\">{{ comment.timestamp }}</span>\n </div>\n\n <!-- Default view -->\n <ng-container *ngIf=\"!editing\">\n <p class=\"zen-comment-item__text\">{{ comment.text }}</p>\n\n <!-- Attachments -->\n <div class=\"zen-comment-item__attachment\"\n *ngFor=\"let att of comment.attachments\">\n <div class=\"zen-comment-item__attachment-icon\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M14 2H6C5.46957 2 4.96086 2.21071 4.58579 2.58579C4.21071 2.96086 4 3.46957 4 4V20C4 20.5304 4.21071 21.0391 4.58579 21.4142C4.96086 21.7893 5.46957 22 6 22H18C18.5304 22 19.0391 21.7893 19.4142 21.4142C19.7893 21.0391 20 20.5304 20 20V8L14 2Z\" stroke=\"#136AB6\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <polyline points=\"14,2 14,8 20,8\" stroke=\"#136AB6\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n <div class=\"zen-comment-item__attachment-info\">\n <div class=\"zen-comment-item__attachment-name\">{{ att.name }}</div>\n <div class=\"zen-comment-item__attachment-size\">{{ att.size }}</div>\n </div>\n </div>\n </ng-container>\n\n <!-- Edit view -->\n <ng-container *ngIf=\"editing\">\n <zen-comment-textarea\n [(value)]=\"editValue\"\n [loading]=\"loading\"\n (save)=\"onSaveEdit($event)\"\n (cancel)=\"onCancelEdit()\">\n </zen-comment-textarea>\n </ng-container>\n </div>\n\n <!-- Actions (always visible, individually controllable) -->\n <div class=\"zen-comment-item__actions\" *ngIf=\"(isEditable || isDeletable) && !editing\">\n <button *ngIf=\"isDeletable\"\n type=\"button\"\n class=\"zen-comment-item__action-btn\"\n title=\"Delete\"\n [disabled]=\"loading\"\n (click)=\"onDelete()\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <polyline points=\"3,6 5,6 21,6\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M19 6V20C19 20.5304 18.7893 21.0391 18.4142 21.4142C18.0391 21.7893 17.5304 22 17 22H7C6.46957 22 5.96086 21.7893 5.58579 21.4142C5.21071 21.0391 5 20.5304 5 20V6M8 6V4C8 3.46957 8.21071 2.96086 8.58579 2.58579C8.96086 2.21071 9.46957 2 10 2H14C14.5304 2 15.0391 2.21071 15.4142 2.58579C15.7893 2.96086 16 3.46957 16 4V6\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n <button *ngIf=\"isEditable\"\n type=\"button\"\n class=\"zen-comment-item__action-btn\"\n title=\"Edit\"\n [disabled]=\"loading\"\n (click)=\"onEdit()\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M17 3C17.2626 2.73735 17.5744 2.52901 17.9176 2.38687C18.2608 2.24473 18.6286 2.17157 19 2.17157C19.3714 2.17157 19.7392 2.24473 20.0824 2.38687C20.4256 2.52901 20.7374 2.73735 21 3C21.2626 3.26264 21.471 3.57444 21.6131 3.9176C21.7553 4.26077 21.8284 4.62856 21.8284 5C21.8284 5.37143 21.7553 5.73923 21.6131 6.08239C21.471 6.42555 21.2626 6.73735 21 7L7.5 20.5L2 22L3.5 16.5L17 3Z\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n </div>\n</div>\n", styles: [".zen-comment-item{display:flex;align-items:flex-start;width:100%}.zen-comment-item--loading{opacity:.7;pointer-events:none}.zen-comment-item__left{display:flex;flex-direction:column;align-items:center;gap:4px;padding-bottom:4px;flex-shrink:0}.zen-comment-item__avatar{position:relative;width:32px;height:32px;border-radius:200px;background:#C7B9DA;overflow:visible;flex-shrink:0}.zen-comment-item__avatar-img{width:32px;height:32px;border-radius:200px;object-fit:cover}.zen-comment-item__avatar-initials{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:200px;font-family:Inter,sans-serif;font-weight:500;font-size:12px;color:#fff}.zen-comment-item__online-dot{position:absolute;bottom:0;right:0;width:8px;height:8px;background:#12B76A;border:1.5px solid #fff;border-radius:4px}.zen-comment-item__connector{flex:1;width:2px;min-height:8px;background:#EAECF0;border-radius:2px}.zen-comment-item__body{flex:1;min-width:0;display:flex;flex-direction:column;gap:12px;padding-bottom:32px;margin-left:12px}.zen-comment-item__header{display:flex;align-items:center;gap:8px;white-space:nowrap}.zen-comment-item__author{font-family:Inter,sans-serif;font-weight:500;font-size:14px;line-height:20px;color:#344054}.zen-comment-item__time{font-family:Inter,sans-serif;font-weight:400;font-size:12px;line-height:18px;color:#667085}.zen-comment-item__text{font-family:Inter,sans-serif;font-weight:400;font-size:14px;line-height:20px;color:#667085;margin:0;word-break:break-word}.zen-comment-item__attachment{display:flex;align-items:flex-start;gap:12px}.zen-comment-item__attachment-icon{flex-shrink:0;width:32px;height:32px;background:#E3EEFB;border:4px solid #F1F7FE;border-radius:28px;display:flex;align-items:center;justify-content:center}.zen-comment-item__attachment-info{min-width:0}.zen-comment-item__attachment-name{font-family:Inter,sans-serif;font-weight:500;font-size:14px;line-height:20px;color:#344054;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.zen-comment-item__attachment-size{font-family:Inter,sans-serif;font-weight:400;font-size:14px;line-height:20px;color:#667085}.zen-comment-item__actions{display:flex;align-items:center;flex-shrink:0}.zen-comment-item__action-btn{display:flex;align-items:center;justify-content:center;width:40px;height:40px;border:none;background:transparent;border-radius:8px;cursor:pointer;padding:10px}.zen-comment-item__action-btn:hover{background:#F2F4F7}\n"] }]
76
+ }], propDecorators: { comment: [{
77
+ type: Input
78
+ }], showConnector: [{
79
+ type: Input
80
+ }], editable: [{
81
+ type: Input
82
+ }], deletable: [{
83
+ type: Input
84
+ }], loading: [{
85
+ type: Input
86
+ }], edit: [{
87
+ type: Output
88
+ }], delete: [{
89
+ type: Output
90
+ }], saveEdit: [{
91
+ type: Output
92
+ }], cancelEdit: [{
93
+ type: Output
94
+ }] } });
95
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemVuZHUtY29tbWVudC1pdGVtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXplbmR1aXQvc3JjL2xpYi9jb21tZW50LWl0ZW0vemVuZHUtY29tbWVudC1pdGVtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXplbmR1aXQvc3JjL2xpYi9jb21tZW50LWl0ZW0vemVuZHUtY29tbWVudC1pdGVtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBYSxNQUFNLEVBQWlCLE1BQU0sZUFBZSxDQUFDOzs7O0FBeUJqRyxNQUFNLE9BQU8seUJBQXlCO0lBTHRDO1FBU1csa0JBQWEsR0FBRyxJQUFJLENBQUM7UUFFckIsYUFBUSxHQUFHLElBQUksQ0FBQztRQUVoQixjQUFTLEdBQUcsSUFBSSxDQUFDO1FBRWpCLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFFZixTQUFJLEdBQUcsSUFBSSxZQUFZLEVBQWUsQ0FBQztRQUV2QyxXQUFNLEdBQUcsSUFBSSxZQUFZLEVBQWUsQ0FBQztRQUV6QyxhQUFRLEdBQUcsSUFBSSxZQUFZLEVBQTBDLENBQUM7UUFFdEUsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFlLENBQUM7UUFFdkQsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUNoQixjQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ1AsZUFBVSxHQUFHLEtBQUssQ0FBQztLQXdENUI7SUF0REMsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDMUUsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7WUFDckIsSUFBSSxDQUFDLFNB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QUVHLE9BQU87c0JBQWYsS0FBSztnQkFFSSxJQUFJO3NCQUFiLE1BQU07Z0JBRUcsTUFBTTtzQkFBZixNQUFNO2dCQUVHLFFBQVE7c0JBQWpCLE1BQU07Z0JBRUcsVUFBVTtzQkFBbkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuZXhwb3J0IGludGVyZmFjZSBDb21tZW50RGF0YSB7XG4gIGlkOiBzdHJpbmcgfCBudW1iZXI7XG4gIGF1dGhvck5hbWU6IHN0cmluZztcbiAgYXV0aG9yQXZhdGFyPzogc3RyaW5nO1xuICB0aW1lc3RhbXA6IHN0cmluZztcbiAgdGV4dDogc3RyaW5nO1xuICBvbmxpbmU/OiBib29sZWFuO1xuICBlZGl0YWJsZT86IGJvb2xlYW47XG4gIGRlbGV0YWJsZT86IGJvb2xlYW47XG4gIGF0dGFjaG1lbnRzPzogQ29tbWVudEF0dGFjaG1lbnREYXRhW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tbWVudEF0dGFjaG1lbnREYXRhIHtcbiAgbmFtZTogc3RyaW5nO1xuICBzaXplOiBzdHJpbmc7XG4gIHVybD86IHN0cmluZztcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnemVuLWNvbW1lbnQtaXRlbScsXG4gIHRlbXBsYXRlVXJsOiAnLi96ZW5kdS1jb21tZW50LWl0ZW0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi96ZW5kdS1jb21tZW50LWl0ZW0uY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgWmVuZHVDb21tZW50SXRlbUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG5cbiAgQElucHV0KCkgY29tbWVudDogQ29tbWVudERhdGE7XG5cbiAgQElucHV0KCkgc2hvd0Nvbm5lY3RvciA9IHRydWU7XG5cbiAgQElucHV0KCkgZWRpdGFibGUgPSB0cnVlO1xuXG4gIEBJbnB1dCgpIGRlbGV0YWJsZSA9IHRydWU7XG5cbiAgQElucHV0KCkgbG9hZGluZyA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoKSBlZGl0ID0gbmV3IEV2ZW50RW1pdHRlcjxDb21tZW50RGF0YT4oKTtcblxuICBAT3V0cHV0KCkgZGVsZXRlID0gbmV3IEV2ZW50RW1pdHRlcjxDb21tZW50RGF0YT4oKTtcblxuICBAT3V0cHV0KCkgc2F2ZUVkaXQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgY29tbWVudDogQ29tbWVudERhdGE7IHRleHQ6IHN0cmluZyB9PigpO1xuXG4gIEBPdXRwdXQoKSBjYW5jZWxFZGl0ID0gbmV3IEV2ZW50RW1pdHRlcjxDb21tZW50RGF0YT4oKTtcblxuICBlZGl0aW5nID0gZmFsc2U7XG4gIGVkaXRWYWx1ZSA9ICcnO1xuICBwcml2YXRlIHdhc0xvYWRpbmcgPSBmYWxzZTtcblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgaWYgKGNoYW5nZXNbJ2xvYWRpbmcnXSAmJiB0aGlzLndhc0xvYWRpbmcgJiYgIXRoaXMubG9hZGluZyAmJiB0aGlzLmVkaXRpbmcpIHtcbiAgICAgIHRoaXMuZWRpdGluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5lZGl0VmFsdWUgPSAnJztcbiAgICB9XG4gICAgdGhpcy53YXNMb2FkaW5nID0gdGhpcy5sb2FkaW5nO1xuICB9XG5cbiAgZ2V0IGlzRWRpdGFibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZWRpdGFibGUgJiYgKHRoaXMuY29tbWVudD8uZWRpdGFibGUgIT09IGZhbHNlKTtcbiAgfVxuXG4gIGdldCBpc0RlbGV0YWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kZWxldGFibGUgJiYgKHRoaXMuY29tbWVudD8uZGVsZXRhYmxlICE9PSBmYWxzZSk7XG4gIH1cblxuICBnZXQgaW5pdGlhbHMoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuY29tbWVudD8uYXV0aG9yTmFtZSkgcmV0dXJuICcnO1xuICAgIHJldHVybiB0aGlzLmNvbW1lbnQuYXV0aG9yTmFtZVxuICAgICAgLnNwbGl0KCcgJylcbiAgICAgIC5tYXAobiA9PiBuWzBdKVxuICAgICAgLmpvaW4oJycpXG4gICAgICAuc3Vic3RyaW5nKDAsIDIpXG4gICAgICAudG9VcHBlckNhc2UoKTtcbiAgfVxuXG4gIG9uRWRpdCgpIHtcbiAgICBpZiAodGhpcy5sb2FkaW5nKSByZXR1cm47XG4gICAgdGhpcy5lZGl0aW5nID0gdHJ1ZTtcbiAgICB0aGlzLmVkaXRWYWx1ZSA9IHRoaXMuY29tbWVudC50ZXh0O1xuICAgIHRoaXMuZWRpdC5lbWl0KHRoaXMuY29tbWVudCk7XG4gIH1cblxuICBvbkRlbGV0ZSgpIHtcbiAgICBpZiAodGhpcy5sb2FkaW5nKSByZXR1cm47XG4gICAgdGhpcy5kZWxldGUuZW1pdCh0aGlzLmNvbW1lbnQpO1xuICB9XG5cbiAgb25TYXZlRWRpdChldmVudDogeyB0ZXh0OiBzdHJpbmc7IGZpbGVzOiBGaWxlW10gfSkge1xuICAgIHRoaXMuc2F2ZUVkaXQuZW1pdCh7IGNvbW1lbnQ6IHRoaXMuY29tbWVudCwgdGV4dDogZXZlbnQudGV4dCB9KTtcbiAgfVxuXG4gIG9uQ2FuY2VsRWRpdCgpIHtcbiAgICB0aGlzLmVkaXRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmVkaXRWYWx1ZSA9ICcnO1xuICAgIHRoaXMuY2FuY2VsRWRpdC5lbWl0KHRoaXMuY29tbWVudCk7XG4gIH1cblxuICBnZXRGaWxlSWNvbihuYW1lOiBzdHJpbmcpOiAnZG9jdW1lbnQnIHwgJ3ZpZGVvJyB8ICdtaXNjJyB7XG4gICAgY29uc3QgZXh0ID0gbmFtZS5zcGxpdCgnLicpLnBvcCgpPy50b0xvd2VyQ2FzZSgpIHx8ICcnO1xuICAgIGlmIChbJ3BkZicsICdkb2MnLCAnZG9jeCcsICd0eHQnLCAneGxzJywgJ3hsc3gnLCAnY3N2JywgJ3BwdCcsICdwcHR4J10uaW5jbHVkZXMoZXh0KSkgcmV0dXJuICdkb2N1bWVudCc7XG4gICAgaWYgKFsnbXA0JywgJ21vdicsICdhdmknLCAnbWt2JywgJ3dlYm0nLCAnZmx2J10uaW5jbHVkZXMoZXh0KSkgcmV0dXJuICd2aWRlbyc7XG4gICAgcmV0dXJuICdtaXNjJztcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInplbi1jb21tZW50LWl0ZW1cIiBbY2xhc3MuemVuLWNvbW1lbnQtaXRlbS0tbG9hZGluZ109XCJsb2FkaW5nXCI+XG5cbiAgPGRpdiBjbGFzcz1cInplbi1jb21tZW50LWl0ZW1fX2xlZnRcIj5cbiAgICA8IS0tIEF2YXRhciAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiemVuLWNvbW1lbnQtaXRlbV9fYXZhdGFyXCI+XG4gICAgICA8aW1nICpuZ0lmPVwiY29tbWVudC5hdXRob3JBdmF0YXJcIlxuICAgICAgICAgICBbc3JjXT1cImNvbW1lbnQuYXV0aG9yQXZhdGFyXCJcbiAgICAgICAgICAgW2FsdF09XCJjb21tZW50LmF1dGhvck5hbWVcIlxuICAgICAgICAgICBjbGFzcz1cInplbi1jb21tZW50LWl0ZW1fX2F2YXRhci1pbWdcIiAvPlxuICAgICAgPHNwYW4gKm5nSWY9XCIhY29tbWVudC5hdXRob3JBdmF0YXJcIiBjbGFzcz1cInplbi1jb21tZW50LWl0ZW1fX2F2YXRhci1pbml0aWFsc1wiPlxuICAgICAgICB7eyBpbml0aWFscyB9fVxuICAgICAgPC9zcGFuPlxuICAgICAgPHNwYW4gKm5nSWY9XCJjb21tZW50Lm9ubGluZVwiIGNsYXNzPVwiemVuLWNvbW1lbnQtaXRlbV9fb25saW5lLWRvdFwiPjwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgICA8IS0tIENvbm5lY3RvciBsaW5lIC0tPlxuICAgIDxkaXYgKm5nSWY9XCJzaG93Q29ubmVjdG9yXCIgY2xhc3M9XCJ6ZW4tY29tbWVudC1pdGVtX19jb25uZWN0b3JcIj48L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cInplbi1jb21tZW50LWl0ZW1fX2JvZHlcIj5cbiAgICA8IS0tIEhlYWRlcjogbmFtZSArIHRpbWUgLS0+XG4gICAgPGRpdiBjbGFzcz1cInplbi1jb21tZW50LWl0ZW1fX2hlYWRlclwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJ6ZW4tY29tbWVudC1pdGVtX19hdXRob3JcIj57eyBjb21tZW50LmF1dGhvck5hbWUgfX08L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cInplbi1jb21tZW50LWl0ZW1fX3RpbWVcIj57eyBjb21tZW50LnRpbWVzdGFtcCB9fTwvc3Bhbj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gRGVmYXVsdCB2aWV3IC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZWRpdGluZ1wiPlxuICAgICAgPHAgY2xhc3M9XCJ6ZW4tY29tbWVudC1pdGVtX190ZXh0XCI+e3sgY29tbWVudC50ZXh0IH19PC9wPlxuXG4gICAgICA8IS0tIEF0dGFjaG1lbnRzIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInplbi1jb21tZW50LWl0ZW1fX2F0dGFjaG1lbnRcIlxuICAgICAgICAgICAqbmdGb3I9XCJsZXQgYXR0IG9mIGNvbW1lbnQuYXR0YWNobWVudHNcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInplbi1jb21tZW50LWl0ZW1fX2F0dGFjaG1lbnQtaWNvblwiPlxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgPHBhdGggZD1cIk0xNCAySDZDNS40Njk1NyAyIDQuOTYwODYgMi4yMTA3MSA0LjU4NTc5IDIuNTg1NzlDNC4yMTA3MSAyLjk2MDg2IDQgMy40Njk1NyA0IDRWMjBDNCAyMC41MzA0IDQuMjEwNzEgMjEuMDM5MSA0LjU4NTc5IDIxLjQxNDJDNC45NjA4NiAyMS43ODkzIDUuNDY5NTcgMjIgNiAyMkgxOEMxOC41MzA0IDIyIDE5LjAzOTEgMjEuNzg5MyAxOS40MTQyIDIxLjQxNDJDMTkuNzg5MyAyMS4wMzkxIDIwIDIwLjUzMDQgMjAgMjBWOEwxNCAyWlwiIHN0cm9rZT1cIiMxMzZBQjZcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgPHBvbHlsaW5lIHBvaW50cz1cIjE0LDIgMTQsOCAyMCw4XCIgc3Ryb2tlPVwiIzEzNkFCNlwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiemVuLWNvbW1lbnQtaXRlbV9fYXR0YWNobWVudC1pbmZvXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInplbi1jb21tZW50LWl0ZW1fX2F0dGFjaG1lbnQtbmFtZVwiPnt7IGF0dC5uYW1lIH19PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInplbi1jb21tZW50LWl0ZW1fX2F0dGFjaG1lbnQtc2l6ZVwiPnt7IGF0dC5zaXplIH19PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8IS0tIEVkaXQgdmlldyAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZWRpdGluZ1wiPlxuICAgICAgPHplbi1jb21tZW50LXRleHRhcmVhXG4gICAgICAgIFsodmFsdWUpXT1cImVkaXRWYWx1ZVwiXG4gICAgICAgIFtsb2FkaW5nXT1cImxvYWRpbmdcIlxuICAgICAgICAoc2F2ZSk9XCJvblNhdmVFZGl0KCRldmVudClcIlxuICAgICAgICAoY2FuY2VsKT1cIm9uQ2FuY2VsRWRpdCgpXCI+XG4gICAgICA8L3plbi1jb21tZW50LXRleHRhcmVhPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cblxuICA8IS0tIEFjdGlvbnMgKGFsd2F5cyB2aXNpYmxlLCBpbmRpdmlkdWFsbHkgY29udHJvbGxhYmxlKSAtLT5cbiAgPGRpdiBjbGFzcz1cInplbi1jb21tZW50LWl0ZW1fX2FjdGlvbnNcIiAqbmdJZj1cIihpc0VkaXRhYmxlIHx8IGlzRGVsZXRhYmxlKSAmJiAhZWRpdGluZ1wiPlxuICAgIDxidXR0b24gKm5nSWY9XCJpc0RlbGV0YWJsZVwiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiemVuLWNvbW1lbnQtaXRlbV9fYWN0aW9uLWJ0blwiXG4gICAgICAgICAgICB0aXRsZT1cIkRlbGV0ZVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwibG9hZGluZ1wiXG4gICAgICAgICAgICAoY2xpY2spPVwib25EZWxldGUoKVwiPlxuICAgICAgPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgIDxwb2x5bGluZSBwb2ludHM9XCIzLDYgNSw2IDIxLDZcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgPHBhdGggZD1cIk0xOSA2VjIwQzE5IDIwLjUzMDQgMTguNzg5MyAyMS4wMzkxIDE4LjQxNDIgMjEuNDE0MkMxOC4wMzkxIDIxLjc4OTMgMTcuNTMwNCAyMiAxNyAyMkg3QzYuNDY5NTcgMjIgNS45NjA4NiAyMS43ODkzIDUuNTg1NzkgMjEuNDE0MkM1LjIxMDcxIDIxLjAzOTEgNSAyMC41MzA0IDUgMjBWNk04IDZWNEM4IDMuNDY5NTcgOC4yMTA3MSAyLjk2MDg2IDguNTg1NzkgMi41ODU3OUM4Ljk2MDg2IDIuMjEwNzEgOS40Njk1NyAyIDEwIDJIMTRDMTQuNTMwNCAyIDE1LjAzOTEgMi4yMTA3MSAxNS40MTQyIDIuNTg1NzlDMTUuNzg5MyAyLjk2MDg2IDE2IDMuNDY5NTcgMTYgNFY2XCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICA8L3N2Zz5cbiAgICA8L2J1dHRvbj5cbiAgICA8YnV0dG9uICpuZ0lmPVwiaXNFZGl0YWJsZVwiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiemVuLWNvbW1lbnQtaXRlbV9fYWN0aW9uLWJ0blwiXG4gICAgICAgICAgICB0aXRsZT1cIkVkaXRcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImxvYWRpbmdcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uRWRpdCgpXCI+XG4gICAgICA8c3ZnIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgPHBhdGggZD1cIk0xNyAzQzE3LjI2MjYgMi43MzczNSAxNy41NzQ0IDIuNTI5MDEgMTcuOTE3NiAyLjM4Njg3QzE4LjI2MDggMi4yNDQ3MyAxOC42Mjg2IDIuMTcxNTcgMTkgMi4xNzE1N0MxOS4zNzE0IDIuMTcxNTcgMTkuNzM5MiAyLjI0NDczIDIwLjA4MjQgMi4zODY4N0MyMC40MjU2IDIuNTI5MDEgMjAuNzM3NCAyLjczNzM1IDIxIDNDMjEuMjYyNiAzLjI2MjY0IDIxLjQ3MSAzLjU3NDQ0IDIxLjYxMzEgMy45MTc2QzIxLjc1NTMgNC4yNjA3NyAyMS44Mjg0IDQuNjI4NTYgMjEuODI4NCA1QzIxLjgyODQgNS4zNzE0MyAyMS43NTUzIDUuNzM5MjMgMjEuNjEzMSA2LjA4MjM5QzIxLjQ3MSA2LjQyNTU1IDIxLjI2MjYgNi43MzczNSAyMSA3TDcuNSAyMC41TDIgMjJMMy41IDE2LjVMMTcgM1pcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgIDwvc3ZnPlxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
@@ -0,0 +1,52 @@
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/common";
4
+ import * as i2 from "../comment-item/zendu-comment-item.component";
5
+ export class ZenduCommentListComponent {
6
+ constructor() {
7
+ this.comments = [];
8
+ this.collapsible = true;
9
+ this.expanded = false;
10
+ this.editable = true;
11
+ this.deletable = true;
12
+ this.loadingCommentId = null;
13
+ this.expandedChange = new EventEmitter();
14
+ this.editComment = new EventEmitter();
15
+ this.deleteComment = new EventEmitter();
16
+ this.saveEditComment = new EventEmitter();
17
+ this.cancelEditComment = new EventEmitter();
18
+ }
19
+ toggle() {
20
+ this.expanded = !this.expanded;
21
+ this.expandedChange.emit(this.expanded);
22
+ }
23
+ }
24
+ ZenduCommentListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduCommentListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
25
+ ZenduCommentListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: ZenduCommentListComponent, selector: "zen-comment-list", inputs: { comments: "comments", collapsible: "collapsible", expanded: "expanded", editable: "editable", deletable: "deletable", loadingCommentId: "loadingCommentId" }, outputs: { expandedChange: "expandedChange", editComment: "editComment", deleteComment: "deleteComment", saveEditComment: "saveEditComment", cancelEditComment: "cancelEditComment" }, ngImport: i0, template: "<div class=\"zen-comment-list\">\n <!-- Toggle button (only when collapsible) -->\n <button *ngIf=\"collapsible\" type=\"button\" class=\"zen-comment-list__toggle\" (click)=\"toggle()\">\n <span class=\"zen-comment-list__toggle-text\">\n {{ expanded ? 'Hide' : 'Show' }} Comments ({{ comments.length }})\n </span>\n <svg class=\"zen-comment-list__toggle-icon\"\n [class.zen-comment-list__toggle-icon--up]=\"expanded\"\n width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M5 7.5L10 12.5L15 7.5\" stroke=\"#667085\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n\n <!-- Comments list -->\n <div class=\"zen-comment-list__items\" *ngIf=\"!collapsible || expanded\">\n <zen-comment-item\n *ngFor=\"let c of comments; let last = last\"\n [comment]=\"c\"\n [showConnector]=\"!last\"\n [editable]=\"editable\"\n [deletable]=\"deletable\"\n [loading]=\"loadingCommentId === c.id\"\n (edit)=\"editComment.emit($event)\"\n (delete)=\"deleteComment.emit($event)\"\n (saveEdit)=\"saveEditComment.emit($event)\"\n (cancelEdit)=\"cancelEditComment.emit($event)\">\n </zen-comment-item>\n </div>\n</div>\n", styles: [".zen-comment-list{display:flex;flex-direction:column;gap:16px;width:100%}.zen-comment-list__toggle{display:flex;align-items:center;gap:8px;border:none;background:transparent;cursor:pointer;padding:0}.zen-comment-list__toggle-text{font-family:Inter,sans-serif;font-weight:500;font-size:16px;line-height:24px;color:#667085}.zen-comment-list__toggle-icon{flex-shrink:0;transition:transform .2s ease}.zen-comment-list__toggle-icon--up{transform:rotate(180deg)}.zen-comment-list__items{display:flex;flex-direction:column}\n"], dependencies: [{ 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: i2.ZenduCommentItemComponent, selector: "zen-comment-item", inputs: ["comment", "showConnector", "editable", "deletable", "loading"], outputs: ["edit", "delete", "saveEdit", "cancelEdit"] }] });
26
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduCommentListComponent, decorators: [{
27
+ type: Component,
28
+ args: [{ selector: 'zen-comment-list', template: "<div class=\"zen-comment-list\">\n <!-- Toggle button (only when collapsible) -->\n <button *ngIf=\"collapsible\" type=\"button\" class=\"zen-comment-list__toggle\" (click)=\"toggle()\">\n <span class=\"zen-comment-list__toggle-text\">\n {{ expanded ? 'Hide' : 'Show' }} Comments ({{ comments.length }})\n </span>\n <svg class=\"zen-comment-list__toggle-icon\"\n [class.zen-comment-list__toggle-icon--up]=\"expanded\"\n width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M5 7.5L10 12.5L15 7.5\" stroke=\"#667085\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n\n <!-- Comments list -->\n <div class=\"zen-comment-list__items\" *ngIf=\"!collapsible || expanded\">\n <zen-comment-item\n *ngFor=\"let c of comments; let last = last\"\n [comment]=\"c\"\n [showConnector]=\"!last\"\n [editable]=\"editable\"\n [deletable]=\"deletable\"\n [loading]=\"loadingCommentId === c.id\"\n (edit)=\"editComment.emit($event)\"\n (delete)=\"deleteComment.emit($event)\"\n (saveEdit)=\"saveEditComment.emit($event)\"\n (cancelEdit)=\"cancelEditComment.emit($event)\">\n </zen-comment-item>\n </div>\n</div>\n", styles: [".zen-comment-list{display:flex;flex-direction:column;gap:16px;width:100%}.zen-comment-list__toggle{display:flex;align-items:center;gap:8px;border:none;background:transparent;cursor:pointer;padding:0}.zen-comment-list__toggle-text{font-family:Inter,sans-serif;font-weight:500;font-size:16px;line-height:24px;color:#667085}.zen-comment-list__toggle-icon{flex-shrink:0;transition:transform .2s ease}.zen-comment-list__toggle-icon--up{transform:rotate(180deg)}.zen-comment-list__items{display:flex;flex-direction:column}\n"] }]
29
+ }], propDecorators: { comments: [{
30
+ type: Input
31
+ }], collapsible: [{
32
+ type: Input
33
+ }], expanded: [{
34
+ type: Input
35
+ }], editable: [{
36
+ type: Input
37
+ }], deletable: [{
38
+ type: Input
39
+ }], loadingCommentId: [{
40
+ type: Input
41
+ }], expandedChange: [{
42
+ type: Output
43
+ }], editComment: [{
44
+ type: Output
45
+ }], deleteComment: [{
46
+ type: Output
47
+ }], saveEditComment: [{
48
+ type: Output
49
+ }], cancelEditComment: [{
50
+ type: Output
51
+ }] } });
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemVuZHUtY29tbWVudC1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXplbmR1aXQvc3JjL2xpYi9jb21tZW50LWxpc3QvemVuZHUtY29tbWVudC1saXN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXplbmR1aXQvc3JjL2xpYi9jb21tZW50LWxpc3QvemVuZHUtY29tbWVudC1saXN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7QUFRdkUsTUFBTSxPQUFPLHlCQUF5QjtJQUx0QztRQU9XLGFBQVEsR0FBa0IsRUFBRSxDQUFDO1FBRTdCLGdCQUFXLEdBQUcsSUFBSSxDQUFDO1FBRW5CLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFFakIsYUFBUSxHQUFHLElBQUksQ0FBQztRQUVoQixjQUFTLEdBQUcsSUFBSSxDQUFDO1FBRWpCLHFCQUFnQixHQUEyQixJQUFJLENBQUM7UUFFL0MsbUJBQWMsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBRTdDLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQWUsQ0FBQztRQUU5QyxrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFlLENBQUM7UUFFaEQsb0JBQWUsR0FBRyxJQUFJLFlBQVksRUFBMEMsQ0FBQztRQUU3RSxzQkFBaUIsR0FBRyxJQUFJLFlBQVksRUFBZSxDQUFDO0tBTS9EO0lBSkMsTUFBTTtRQUNKLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQy9CLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMxQyxDQUFDOzt1SEEzQlUseUJBQXlCOzJHQUF6Qix5QkFBeUIsdVpDUnRDLHl4Q0E2QkE7NEZEckJhLHlCQUF5QjtrQkFMckMsU0FBUzsrQkFDRSxrQkFBa0I7OEJBTW5CLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRUcsV0FBVztzQkFBbkIsS0FBSztnQkFFRyxRQUFRO3NCQUFoQixLQUFLO2dCQUVHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRUcsU0FBUztzQkFBakIsS0FBSztnQkFFRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBRUksY0FBYztzQkFBdkIsTUFBTTtnQkFFRyxXQUFXO3NCQUFwQixNQUFNO2dCQUVHLGFBQWE7c0JBQXRCLE1BQU07Z0JBRUcsZUFBZTtzQkFBeEIsTUFBTTtnQkFFRyxpQkFBaUI7c0JBQTFCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbWVudERhdGEgfSBmcm9tICcuLi9jb21tZW50LWl0ZW0vemVuZHUtY29tbWVudC1pdGVtLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3plbi1jb21tZW50LWxpc3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vemVuZHUtY29tbWVudC1saXN0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vemVuZHUtY29tbWVudC1saXN0LmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIFplbmR1Q29tbWVudExpc3RDb21wb25lbnQge1xuXG4gIEBJbnB1dCgpIGNvbW1lbnRzOiBDb21tZW50RGF0YVtdID0gW107XG5cbiAgQElucHV0KCkgY29sbGFwc2libGUgPSB0cnVlO1xuXG4gIEBJbnB1dCgpIGV4cGFuZGVkID0gZmFsc2U7XG5cbiAgQElucHV0KCkgZWRpdGFibGUgPSB0cnVlO1xuXG4gIEBJbnB1dCgpIGRlbGV0YWJsZSA9IHRydWU7XG5cbiAgQElucHV0KCkgbG9hZGluZ0NvbW1lbnRJZDogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgQE91dHB1dCgpIGV4cGFuZGVkQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIEBPdXRwdXQoKSBlZGl0Q29tbWVudCA9IG5ldyBFdmVudEVtaXR0ZXI8Q29tbWVudERhdGE+KCk7XG5cbiAgQE91dHB1dCgpIGRlbGV0ZUNvbW1lbnQgPSBuZXcgRXZlbnRFbWl0dGVyPENvbW1lbnREYXRhPigpO1xuXG4gIEBPdXRwdXQoKSBzYXZlRWRpdENvbW1lbnQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgY29tbWVudDogQ29tbWVudERhdGE7IHRleHQ6IHN0cmluZyB9PigpO1xuXG4gIEBPdXRwdXQoKSBjYW5jZWxFZGl0Q29tbWVudCA9IG5ldyBFdmVudEVtaXR0ZXI8Q29tbWVudERhdGE+KCk7XG5cbiAgdG9nZ2xlKCkge1xuICAgIHRoaXMuZXhwYW5kZWQgPSAhdGhpcy5leHBhbmRlZDtcbiAgICB0aGlzLmV4cGFuZGVkQ2hhbmdlLmVtaXQodGhpcy5leHBhbmRlZCk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJ6ZW4tY29tbWVudC1saXN0XCI+XG4gIDwhLS0gVG9nZ2xlIGJ1dHRvbiAob25seSB3aGVuIGNvbGxhcHNpYmxlKSAtLT5cbiAgPGJ1dHRvbiAqbmdJZj1cImNvbGxhcHNpYmxlXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiemVuLWNvbW1lbnQtbGlzdF9fdG9nZ2xlXCIgKGNsaWNrKT1cInRvZ2dsZSgpXCI+XG4gICAgPHNwYW4gY2xhc3M9XCJ6ZW4tY29tbWVudC1saXN0X190b2dnbGUtdGV4dFwiPlxuICAgICAge3sgZXhwYW5kZWQgPyAnSGlkZScgOiAnU2hvdycgfX0gQ29tbWVudHMgKHt7IGNvbW1lbnRzLmxlbmd0aCB9fSlcbiAgICA8L3NwYW4+XG4gICAgPHN2ZyBjbGFzcz1cInplbi1jb21tZW50LWxpc3RfX3RvZ2dsZS1pY29uXCJcbiAgICAgICAgIFtjbGFzcy56ZW4tY29tbWVudC1saXN0X190b2dnbGUtaWNvbi0tdXBdPVwiZXhwYW5kZWRcIlxuICAgICAgICAgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgPHBhdGggZD1cIk01IDcuNUwxMCAxMi41TDE1IDcuNVwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgIDwvc3ZnPlxuICA8L2J1dHRvbj5cblxuICA8IS0tIENvbW1lbnRzIGxpc3QgLS0+XG4gIDxkaXYgY2xhc3M9XCJ6ZW4tY29tbWVudC1saXN0X19pdGVtc1wiICpuZ0lmPVwiIWNvbGxhcHNpYmxlIHx8IGV4cGFuZGVkXCI+XG4gICAgPHplbi1jb21tZW50LWl0ZW1cbiAgICAgICpuZ0Zvcj1cImxldCBjIG9mIGNvbW1lbnRzOyBsZXQgbGFzdCA9IGxhc3RcIlxuICAgICAgW2NvbW1lbnRdPVwiY1wiXG4gICAgICBbc2hvd0Nvbm5lY3Rvcl09XCIhbGFzdFwiXG4gICAgICBbZWRpdGFibGVdPVwiZWRpdGFibGVcIlxuICAgICAgW2RlbGV0YWJsZV09XCJkZWxldGFibGVcIlxuICAgICAgW2xvYWRpbmddPVwibG9hZGluZ0NvbW1lbnRJZCA9PT0gYy5pZFwiXG4gICAgICAoZWRpdCk9XCJlZGl0Q29tbWVudC5lbWl0KCRldmVudClcIlxuICAgICAgKGRlbGV0ZSk9XCJkZWxldGVDb21tZW50LmVtaXQoJGV2ZW50KVwiXG4gICAgICAoc2F2ZUVkaXQpPVwic2F2ZUVkaXRDb21tZW50LmVtaXQoJGV2ZW50KVwiXG4gICAgICAoY2FuY2VsRWRpdCk9XCJjYW5jZWxFZGl0Q29tbWVudC5lbWl0KCRldmVudClcIj5cbiAgICA8L3plbi1jb21tZW50LWl0ZW0+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
@@ -0,0 +1,182 @@
1
+ import { Component, EventEmitter, HostListener, Input, Output, } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/common";
4
+ const EMOJI_CATEGORIES = [
5
+ {
6
+ key: 'smileys', label: 'Smileys', icon: '😀',
7
+ emojis: ['😀', '😄', '😁', '😆', '😅', '🤣', '😂', '🙂', '😉', '😊', '🥰', '😍', '😘', '😋', '😛', '😜', '🤔', '😏', '🙄', '😬', '😴', '🤯']
8
+ },
9
+ {
10
+ key: 'gestures', label: 'Gestures', icon: '👋',
11
+ emojis: ['👋', '✋', '👌', '✌', '🤞', '🤙', '👍', '👎', '👏', '🙌', '🤝', '🙏']
12
+ },
13
+ {
14
+ key: 'hearts', label: 'Hearts', icon: '❤️',
15
+ emojis: ['❤️', '🧡', '💛', '💚', '💙', '💜', '🖤', '💔', '💕', '💖']
16
+ },
17
+ {
18
+ key: 'objects', label: 'Objects', icon: '⭐',
19
+ emojis: ['⭐', '🔥', '✨', '🎉', '🏆', '💯', '✅', '❌', '⚡', '💡', '🔔', '🔗']
20
+ },
21
+ ];
22
+ export class ZenduCommentTextareaComponent {
23
+ constructor() {
24
+ this.value = '';
25
+ this.valueChange = new EventEmitter();
26
+ this.label = '';
27
+ this.placeholder = 'Enter a comment...';
28
+ this.rows = 4;
29
+ this.fileTypes = '*/*';
30
+ this.loading = false;
31
+ this.addComment = new EventEmitter();
32
+ this.filesChanged = new EventEmitter();
33
+ this.save = new EventEmitter();
34
+ this.cancel = new EventEmitter();
35
+ this.editing = false;
36
+ this.emojiPickerOpen = false;
37
+ this.emojiCategories = EMOJI_CATEGORIES;
38
+ this.activeEmojiCategory = EMOJI_CATEGORIES[0].key;
39
+ this.attachments = [];
40
+ }
41
+ ngOnInit() {
42
+ if (this.value?.length > 0) {
43
+ this.editing = true;
44
+ }
45
+ }
46
+ onDocumentClick(event) {
47
+ if (!this.emojiPickerOpen)
48
+ return;
49
+ const target = event.target;
50
+ if (!target.closest('.zen-emoji-picker') && !target.closest('.zen-comment-textarea__icon-btn[title="Emoji"]')) {
51
+ this.emojiPickerOpen = false;
52
+ }
53
+ }
54
+ onInput(value) {
55
+ this.value = value;
56
+ this.valueChange.emit(value);
57
+ this.editing = value.length > 0 || this.attachments.length > 0;
58
+ }
59
+ onKeydown(event) {
60
+ if (event.key === 'Enter' && !event.shiftKey) {
61
+ event.preventDefault();
62
+ this.onAddComment();
63
+ }
64
+ }
65
+ onAddComment() {
66
+ if (this.loading)
67
+ return;
68
+ if (this.value.trim() || this.attachments.length) {
69
+ this.addComment.emit({ text: this.value, files: this.attachments.map(a => a.file) });
70
+ }
71
+ }
72
+ onSave() {
73
+ if (this.loading)
74
+ return;
75
+ if (this.value.trim() || this.attachments.length) {
76
+ this.save.emit({ text: this.value, files: this.attachments.map(a => a.file) });
77
+ }
78
+ }
79
+ reset() {
80
+ this.value = '';
81
+ this.valueChange.emit(this.value);
82
+ this.attachments = [];
83
+ this.filesChanged.emit([]);
84
+ this.editing = false;
85
+ }
86
+ onCancel() {
87
+ this.value = '';
88
+ this.valueChange.emit(this.value);
89
+ this.attachments = [];
90
+ this.filesChanged.emit([]);
91
+ this.editing = false;
92
+ this.cancel.emit();
93
+ }
94
+ toggleEmojiPicker() {
95
+ this.emojiPickerOpen = !this.emojiPickerOpen;
96
+ }
97
+ selectEmoji(emoji) {
98
+ this.value += emoji;
99
+ this.valueChange.emit(this.value);
100
+ this.editing = true;
101
+ this.emojiPickerOpen = false;
102
+ }
103
+ setEmojiCategory(key) {
104
+ this.activeEmojiCategory = key;
105
+ }
106
+ get activeEmojis() {
107
+ const cat = this.emojiCategories.find(c => c.key === this.activeEmojiCategory);
108
+ return cat ? cat.emojis : [];
109
+ }
110
+ onFileInput(event) {
111
+ const input = event.target;
112
+ if (!input.files?.length)
113
+ return;
114
+ for (let i = 0; i < input.files.length; i++) {
115
+ const file = input.files[i];
116
+ this.attachments.push({
117
+ file,
118
+ name: file.name,
119
+ size: this.formatFileSize(file.size),
120
+ progress: 100,
121
+ complete: true,
122
+ });
123
+ }
124
+ this.editing = true;
125
+ this.filesChanged.emit(this.attachments.map(a => a.file));
126
+ input.value = '';
127
+ }
128
+ removeAttachment(index) {
129
+ this.attachments.splice(index, 1);
130
+ this.filesChanged.emit(this.attachments.map(a => a.file));
131
+ if (!this.attachments.length && !this.value) {
132
+ this.editing = false;
133
+ }
134
+ }
135
+ getFileIcon(name) {
136
+ const ext = name.split('.').pop()?.toLowerCase() || '';
137
+ if (['pdf', 'doc', 'docx', 'txt', 'xls', 'xlsx', 'csv', 'ppt', 'pptx'].includes(ext))
138
+ return 'document';
139
+ if (['mp4', 'mov', 'avi', 'mkv', 'webm', 'flv'].includes(ext))
140
+ return 'video';
141
+ return 'misc';
142
+ }
143
+ formatFileSize(bytes) {
144
+ if (bytes < 1024)
145
+ return bytes + ' B';
146
+ if (bytes < 1024 * 1024)
147
+ return (bytes / 1024).toFixed(0) + ' KB';
148
+ return (bytes / (1024 * 1024)).toFixed(1) + ' MB';
149
+ }
150
+ }
151
+ ZenduCommentTextareaComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduCommentTextareaComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
152
+ ZenduCommentTextareaComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: ZenduCommentTextareaComponent, selector: "zen-comment-textarea", inputs: { value: "value", label: "label", placeholder: "placeholder", rows: "rows", fileTypes: "fileTypes", loading: "loading" }, outputs: { valueChange: "valueChange", addComment: "addComment", filesChanged: "filesChanged", save: "save", cancel: "cancel" }, host: { listeners: { "document:click": "onDocumentClick($event)" } }, ngImport: i0, template: "<div class=\"zen-comment-textarea\" [class.zen-comment-textarea--loading]=\"loading\">\n <!-- Label -->\n <label *ngIf=\"label\" class=\"zen-comment-textarea__label\">{{ label }}</label>\n\n <!-- Main box (top: attachments + textarea, bottom: toolbar) -->\n <div class=\"zen-comment-textarea__input-wrapper\">\n <!-- Attachments inside the textarea area -->\n <div class=\"zen-comment-textarea__attachments\" *ngIf=\"attachments.length\">\n <div class=\"zen-attachment\"\n *ngFor=\"let att of attachments; let i = index\">\n <div class=\"zen-attachment__content\">\n <div class=\"zen-attachment__icon\" [ngSwitch]=\"getFileIcon(att.name)\">\n <svg *ngSwitchCase=\"'document'\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M14 2H6C5.46957 2 4.96086 2.21071 4.58579 2.58579C4.21071 2.96086 4 3.46957 4 4V20C4 20.5304 4.21071 21.0391 4.58579 21.4142C4.96086 21.7893 5.46957 22 6 22H18C18.5304 22 19.0391 21.7893 19.4142 21.4142C19.7893 21.0391 20 20.5304 20 20V8L14 2Z\" stroke=\"#136AB6\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <polyline points=\"14,2 14,8 20,8\" stroke=\"#136AB6\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <svg *ngSwitchCase=\"'video'\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"2\" y=\"2\" width=\"20\" height=\"20\" rx=\"2.18\" ry=\"2.18\" stroke=\"#136AB6\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <line x1=\"7\" y1=\"2\" x2=\"7\" y2=\"22\" stroke=\"#136AB6\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <line x1=\"17\" y1=\"2\" x2=\"17\" y2=\"22\" stroke=\"#136AB6\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <line x1=\"2\" y1=\"12\" x2=\"22\" y2=\"12\" stroke=\"#136AB6\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <svg *ngSwitchCase=\"'misc'\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <polyline points=\"16,16 12,12 8,16\" stroke=\"#136AB6\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <line x1=\"12\" y1=\"12\" x2=\"12\" y2=\"21\" stroke=\"#136AB6\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M20.39 18.39A5 5 0 0 0 18 9h-1.26A8 8 0 1 0 3 16.3\" stroke=\"#136AB6\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n <div class=\"zen-attachment__info\">\n <div class=\"zen-attachment__name\">{{ att.name }}</div>\n <div class=\"zen-attachment__size\">{{ att.size }}</div>\n </div>\n </div>\n <button type=\"button\" class=\"zen-attachment__remove\" (click)=\"removeAttachment(i)\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <polyline points=\"3,6 5,6 21,6\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M19 6V20C19 20.5304 18.7893 21.0391 18.4142 21.4142C18.0391 21.7893 17.5304 22 17 22H7C6.46957 22 5.96086 21.7893 5.58579 21.4142C5.21071 21.0391 5 20.5304 5 20V6M8 6V4C8 3.46957 8.21071 2.96086 8.58579 2.58579C8.96086 2.21071 9.46957 2 10 2H14C14.5304 2 15.0391 2.21071 15.4142 2.58579C15.7893 2.96086 16 3.46957 16 4V6\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n </div>\n </div>\n\n <!-- Textarea -->\n <textarea class=\"zen-comment-textarea__input\"\n [rows]=\"rows\"\n [placeholder]=\"placeholder\"\n [value]=\"value\"\n [disabled]=\"loading\"\n (input)=\"onInput($any($event.target).value)\"\n (keydown)=\"onKeydown($event)\"></textarea>\n </div>\n\n <!-- Toolbar (bottom part with rounded bottom corners) -->\n <div class=\"zen-comment-textarea__toolbar\">\n <div class=\"zen-comment-textarea__toolbar-divider\"></div>\n\n <div class=\"zen-comment-textarea__toolbar-content\">\n <!-- Icon buttons -->\n <div class=\"zen-comment-textarea__toolbar-icons\">\n <div class=\"zen-comment-textarea__emoji-wrapper\">\n <button type=\"button\"\n class=\"zen-comment-textarea__icon-btn\"\n [class.zen-comment-textarea__icon-btn--active]=\"emojiPickerOpen\"\n title=\"Emoji\"\n (click)=\"toggleEmojiPicker()\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8 14C8 14 9.5 16 12 16C14.5 16 16 14 16 14\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <line x1=\"9\" y1=\"9\" x2=\"9.01\" y2=\"9\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <line x1=\"15\" y1=\"9\" x2=\"15.01\" y2=\"9\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n\n <!-- Emoji picker -->\n <div class=\"zen-emoji-picker\" *ngIf=\"emojiPickerOpen\">\n <div class=\"zen-emoji-picker__grid\">\n <button type=\"button\"\n class=\"zen-emoji-picker__emoji\"\n *ngFor=\"let emoji of activeEmojis\"\n (click)=\"selectEmoji(emoji)\">\n {{ emoji }}\n </button>\n </div>\n <div class=\"zen-emoji-picker__categories\">\n <button type=\"button\"\n class=\"zen-emoji-picker__category\"\n [class.zen-emoji-picker__category--active]=\"cat.key === activeEmojiCategory\"\n *ngFor=\"let cat of emojiCategories\"\n (click)=\"setEmojiCategory(cat.key)\">\n {{ cat.icon }}\n </button>\n </div>\n </div>\n </div>\n\n <button type=\"button\"\n class=\"zen-comment-textarea__icon-btn\"\n title=\"Attach file\"\n (click)=\"fileInput.click()\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M21.44 11.05L12.25 20.24C11.1242 21.3658 9.59723 21.9983 8.00505 21.9983C6.41286 21.9983 4.88589 21.3658 3.76005 20.24C2.6342 19.1142 2.00171 17.5872 2.00171 15.995C2.00171 14.4029 2.6342 12.8759 3.76005 11.75L12.95 2.56C13.7006 1.80944 14.7186 1.3877 15.78 1.3877C16.8415 1.3877 17.8595 1.80944 18.61 2.56C19.3606 3.31057 19.7823 4.32863 19.7823 5.39C19.7823 6.45138 19.3606 7.46944 18.61 8.22L9.41005 17.41C9.03476 17.7853 8.52573 17.9961 7.99505 17.9961C7.46436 17.9961 6.95533 17.7853 6.58005 17.41C6.20476 17.0347 5.99389 16.5257 5.99389 15.995C5.99389 15.4644 6.20476 14.9553 6.58005 14.58L15.07 6.1\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n <input type=\"file\" #fileInput [accept]=\"fileTypes\" multiple hidden (change)=\"onFileInput($event)\" />\n </div>\n\n <!-- Right side actions -->\n <div class=\"zen-comment-textarea__actions\" *ngIf=\"!editing\">\n <span class=\"zen-comment-textarea__hint\">Press enter</span>\n <svg class=\"zen-comment-textarea__return-icon\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M3.33337 12.5L6.66671 15.8333M3.33337 12.5L6.66671 9.16667M3.33337 12.5H13.3334C14.2175 12.5 15.0653 12.1488 15.6904 11.5237C16.3155 10.8986 16.6667 10.0507 16.6667 9.16667V4.16667\" stroke=\"#667085\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span class=\"zen-comment-textarea__hint\">to</span>\n <button type=\"button\" class=\"zen-comment-textarea__add-btn\" [disabled]=\"loading\" (click)=\"onAddComment()\">\n <span class=\"zen-comment-textarea__spinner\" *ngIf=\"loading\"></span>\n {{ loading ? 'Sending...' : 'Add Comment' }}\n </button>\n </div>\n\n <div class=\"zen-comment-textarea__actions\" *ngIf=\"editing\">\n <button type=\"button\" class=\"zen-comment-textarea__cancel-btn\" [disabled]=\"loading\" (click)=\"onCancel()\">\n Cancel\n </button>\n <button type=\"button\" class=\"zen-comment-textarea__save-btn\" [disabled]=\"loading\" (click)=\"onSave()\">\n <span class=\"zen-comment-textarea__spinner\" *ngIf=\"loading\"></span>\n {{ loading ? 'Saving...' : 'Save' }}\n </button>\n </div>\n </div>\n </div>\n</div>\n", styles: [".zen-comment-textarea{display:flex;flex-direction:column;width:100%}.zen-comment-textarea--loading{opacity:.7;pointer-events:none}.zen-comment-textarea__spinner{display:inline-block;width:14px;height:14px;border:2px solid currentColor;border-right-color:transparent;border-radius:50%;animation:zen-spin .6s linear infinite;vertical-align:middle;margin-right:4px}.zen-comment-textarea__label{font-family:Inter,sans-serif;font-weight:500;font-size:14px;line-height:20px;color:#344054;margin-bottom:6px}.zen-comment-textarea__input-wrapper{background:#FFFFFF;border:1px solid #D0D5DD;border-bottom:none;border-radius:8px 8px 0 0;box-shadow:0 1px 2px #1018280d}.zen-comment-textarea__attachments{display:flex;flex-direction:column;gap:8px;padding:10px 14px 0}.zen-comment-textarea__input{display:block;width:100%;min-height:86px;padding:10px 14px 0;border:none;outline:none;resize:vertical;font-family:Inter,sans-serif;font-weight:400;font-size:16px;line-height:24px;color:#101828;background:transparent;box-sizing:border-box}.zen-comment-textarea__input::placeholder{color:#667085}.zen-comment-textarea__toolbar{background:#FFFFFF;border:1px solid #D0D5DD;border-top:none;border-radius:0 0 8px 8px;padding:0 14px 8px}.zen-comment-textarea__toolbar-divider{height:1px;background:#EAECF0;margin-bottom:8px}.zen-comment-textarea__toolbar-content{display:flex;align-items:center;justify-content:space-between}.zen-comment-textarea__toolbar-icons{display:flex;gap:4px;align-items:center}.zen-comment-textarea__emoji-wrapper{position:relative}.zen-comment-textarea__icon-btn{display:flex;align-items:center;justify-content:center;width:36px;height:36px;border:none;background:transparent;border-radius:8px;cursor:pointer;padding:8px}.zen-comment-textarea__icon-btn:hover,.zen-comment-textarea__icon-btn--active{background:#F2F4F7}.zen-comment-textarea__icon-btn svg{flex-shrink:0}.zen-comment-textarea__actions{display:flex;align-items:center;gap:6px}.zen-comment-textarea__hint{font-family:Inter,sans-serif;font-weight:400;font-size:14px;line-height:20px;color:#667085}.zen-comment-textarea__return-icon{flex-shrink:0}.zen-comment-textarea__add-btn{border:none;background:transparent;font-family:Inter,sans-serif;font-weight:500;font-size:14px;line-height:20px;color:#105494;cursor:pointer;padding:0}.zen-comment-textarea__add-btn:hover{text-decoration:underline}.zen-comment-textarea__cancel-btn{display:inline-flex;align-items:center;justify-content:center;padding:10px 16px;background:#FFFFFF;border:1px solid #D0D5DD;border-radius:8px;box-shadow:0 1px 2px #1018280d;font-family:Inter,sans-serif;font-weight:500;font-size:14px;line-height:20px;color:#344054;cursor:pointer}.zen-comment-textarea__cancel-btn:hover{background:#F9FAFB}.zen-comment-textarea__save-btn{display:inline-flex;align-items:center;justify-content:center;padding:10px 16px;background:#136AB6;border:1px solid #136AB6;border-radius:8px;box-shadow:0 1px 2px #1018280d;font-family:Inter,sans-serif;font-weight:500;font-size:14px;line-height:20px;color:#fff;cursor:pointer}.zen-comment-textarea__save-btn:hover{background:#105494;border-color:#105494}.zen-attachment{display:flex;align-items:center;gap:4px;padding:12px;background:#F9FAFB;border:1px solid #EAECF0;border-radius:8px}.zen-attachment__content{display:flex;flex:1;gap:12px;align-items:center;min-width:0}.zen-attachment__icon{flex-shrink:0;width:32px;height:32px;background:#E3EEFB;border:4px solid #F1F7FE;border-radius:28px;display:flex;align-items:center;justify-content:center}.zen-attachment__info{flex:1;min-width:0}.zen-attachment__name{font-family:Inter,sans-serif;font-weight:500;font-size:14px;line-height:20px;color:#344054;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.zen-attachment__size{font-family:Inter,sans-serif;font-weight:400;font-size:14px;line-height:20px;color:#667085}.zen-attachment__remove{flex-shrink:0;display:flex;align-items:center;justify-content:center;width:36px;height:36px;border:none;background:transparent;border-radius:8px;cursor:pointer;padding:8px;margin:-8px}.zen-attachment__remove:hover{background:#F2F4F7}.zen-emoji-picker{position:absolute;bottom:calc(100% + 4px);left:0;z-index:1000;background:#FFFFFF;border:1px solid #EAECF0;border-radius:12px;box-shadow:0 4px 16px #1018281f;width:320px;overflow:hidden}.zen-emoji-picker__grid{display:grid;grid-template-columns:repeat(8,1fr);gap:2px;padding:12px;max-height:200px;overflow-y:auto}.zen-emoji-picker__emoji{display:flex;align-items:center;justify-content:center;width:34px;height:34px;border:none;background:transparent;border-radius:8px;cursor:pointer;font-size:20px;line-height:1;padding:0}.zen-emoji-picker__emoji:hover{background:#F2F4F7}.zen-emoji-picker__categories{display:flex;gap:4px;padding:8px 12px;border-top:1px solid #EAECF0}.zen-emoji-picker__category{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border:none;background:transparent;border-radius:8px;cursor:pointer;font-size:16px;padding:0}.zen-emoji-picker__category:hover{background:#F2F4F7}.zen-emoji-picker__category--active{background:#E3EEFB}@keyframes zen-spin{to{transform:rotate(360deg)}}\n"], dependencies: [{ 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: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }] });
153
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduCommentTextareaComponent, decorators: [{
154
+ type: Component,
155
+ args: [{ selector: 'zen-comment-textarea', template: "<div class=\"zen-comment-textarea\" [class.zen-comment-textarea--loading]=\"loading\">\n <!-- Label -->\n <label *ngIf=\"label\" class=\"zen-comment-textarea__label\">{{ label }}</label>\n\n <!-- Main box (top: attachments + textarea, bottom: toolbar) -->\n <div class=\"zen-comment-textarea__input-wrapper\">\n <!-- Attachments inside the textarea area -->\n <div class=\"zen-comment-textarea__attachments\" *ngIf=\"attachments.length\">\n <div class=\"zen-attachment\"\n *ngFor=\"let att of attachments; let i = index\">\n <div class=\"zen-attachment__content\">\n <div class=\"zen-attachment__icon\" [ngSwitch]=\"getFileIcon(att.name)\">\n <svg *ngSwitchCase=\"'document'\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M14 2H6C5.46957 2 4.96086 2.21071 4.58579 2.58579C4.21071 2.96086 4 3.46957 4 4V20C4 20.5304 4.21071 21.0391 4.58579 21.4142C4.96086 21.7893 5.46957 22 6 22H18C18.5304 22 19.0391 21.7893 19.4142 21.4142C19.7893 21.0391 20 20.5304 20 20V8L14 2Z\" stroke=\"#136AB6\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <polyline points=\"14,2 14,8 20,8\" stroke=\"#136AB6\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <svg *ngSwitchCase=\"'video'\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"2\" y=\"2\" width=\"20\" height=\"20\" rx=\"2.18\" ry=\"2.18\" stroke=\"#136AB6\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <line x1=\"7\" y1=\"2\" x2=\"7\" y2=\"22\" stroke=\"#136AB6\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <line x1=\"17\" y1=\"2\" x2=\"17\" y2=\"22\" stroke=\"#136AB6\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <line x1=\"2\" y1=\"12\" x2=\"22\" y2=\"12\" stroke=\"#136AB6\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <svg *ngSwitchCase=\"'misc'\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <polyline points=\"16,16 12,12 8,16\" stroke=\"#136AB6\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <line x1=\"12\" y1=\"12\" x2=\"12\" y2=\"21\" stroke=\"#136AB6\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M20.39 18.39A5 5 0 0 0 18 9h-1.26A8 8 0 1 0 3 16.3\" stroke=\"#136AB6\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n <div class=\"zen-attachment__info\">\n <div class=\"zen-attachment__name\">{{ att.name }}</div>\n <div class=\"zen-attachment__size\">{{ att.size }}</div>\n </div>\n </div>\n <button type=\"button\" class=\"zen-attachment__remove\" (click)=\"removeAttachment(i)\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <polyline points=\"3,6 5,6 21,6\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M19 6V20C19 20.5304 18.7893 21.0391 18.4142 21.4142C18.0391 21.7893 17.5304 22 17 22H7C6.46957 22 5.96086 21.7893 5.58579 21.4142C5.21071 21.0391 5 20.5304 5 20V6M8 6V4C8 3.46957 8.21071 2.96086 8.58579 2.58579C8.96086 2.21071 9.46957 2 10 2H14C14.5304 2 15.0391 2.21071 15.4142 2.58579C15.7893 2.96086 16 3.46957 16 4V6\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n </div>\n </div>\n\n <!-- Textarea -->\n <textarea class=\"zen-comment-textarea__input\"\n [rows]=\"rows\"\n [placeholder]=\"placeholder\"\n [value]=\"value\"\n [disabled]=\"loading\"\n (input)=\"onInput($any($event.target).value)\"\n (keydown)=\"onKeydown($event)\"></textarea>\n </div>\n\n <!-- Toolbar (bottom part with rounded bottom corners) -->\n <div class=\"zen-comment-textarea__toolbar\">\n <div class=\"zen-comment-textarea__toolbar-divider\"></div>\n\n <div class=\"zen-comment-textarea__toolbar-content\">\n <!-- Icon buttons -->\n <div class=\"zen-comment-textarea__toolbar-icons\">\n <div class=\"zen-comment-textarea__emoji-wrapper\">\n <button type=\"button\"\n class=\"zen-comment-textarea__icon-btn\"\n [class.zen-comment-textarea__icon-btn--active]=\"emojiPickerOpen\"\n title=\"Emoji\"\n (click)=\"toggleEmojiPicker()\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8 14C8 14 9.5 16 12 16C14.5 16 16 14 16 14\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <line x1=\"9\" y1=\"9\" x2=\"9.01\" y2=\"9\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <line x1=\"15\" y1=\"9\" x2=\"15.01\" y2=\"9\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n\n <!-- Emoji picker -->\n <div class=\"zen-emoji-picker\" *ngIf=\"emojiPickerOpen\">\n <div class=\"zen-emoji-picker__grid\">\n <button type=\"button\"\n class=\"zen-emoji-picker__emoji\"\n *ngFor=\"let emoji of activeEmojis\"\n (click)=\"selectEmoji(emoji)\">\n {{ emoji }}\n </button>\n </div>\n <div class=\"zen-emoji-picker__categories\">\n <button type=\"button\"\n class=\"zen-emoji-picker__category\"\n [class.zen-emoji-picker__category--active]=\"cat.key === activeEmojiCategory\"\n *ngFor=\"let cat of emojiCategories\"\n (click)=\"setEmojiCategory(cat.key)\">\n {{ cat.icon }}\n </button>\n </div>\n </div>\n </div>\n\n <button type=\"button\"\n class=\"zen-comment-textarea__icon-btn\"\n title=\"Attach file\"\n (click)=\"fileInput.click()\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M21.44 11.05L12.25 20.24C11.1242 21.3658 9.59723 21.9983 8.00505 21.9983C6.41286 21.9983 4.88589 21.3658 3.76005 20.24C2.6342 19.1142 2.00171 17.5872 2.00171 15.995C2.00171 14.4029 2.6342 12.8759 3.76005 11.75L12.95 2.56C13.7006 1.80944 14.7186 1.3877 15.78 1.3877C16.8415 1.3877 17.8595 1.80944 18.61 2.56C19.3606 3.31057 19.7823 4.32863 19.7823 5.39C19.7823 6.45138 19.3606 7.46944 18.61 8.22L9.41005 17.41C9.03476 17.7853 8.52573 17.9961 7.99505 17.9961C7.46436 17.9961 6.95533 17.7853 6.58005 17.41C6.20476 17.0347 5.99389 16.5257 5.99389 15.995C5.99389 15.4644 6.20476 14.9553 6.58005 14.58L15.07 6.1\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </button>\n <input type=\"file\" #fileInput [accept]=\"fileTypes\" multiple hidden (change)=\"onFileInput($event)\" />\n </div>\n\n <!-- Right side actions -->\n <div class=\"zen-comment-textarea__actions\" *ngIf=\"!editing\">\n <span class=\"zen-comment-textarea__hint\">Press enter</span>\n <svg class=\"zen-comment-textarea__return-icon\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M3.33337 12.5L6.66671 15.8333M3.33337 12.5L6.66671 9.16667M3.33337 12.5H13.3334C14.2175 12.5 15.0653 12.1488 15.6904 11.5237C16.3155 10.8986 16.6667 10.0507 16.6667 9.16667V4.16667\" stroke=\"#667085\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span class=\"zen-comment-textarea__hint\">to</span>\n <button type=\"button\" class=\"zen-comment-textarea__add-btn\" [disabled]=\"loading\" (click)=\"onAddComment()\">\n <span class=\"zen-comment-textarea__spinner\" *ngIf=\"loading\"></span>\n {{ loading ? 'Sending...' : 'Add Comment' }}\n </button>\n </div>\n\n <div class=\"zen-comment-textarea__actions\" *ngIf=\"editing\">\n <button type=\"button\" class=\"zen-comment-textarea__cancel-btn\" [disabled]=\"loading\" (click)=\"onCancel()\">\n Cancel\n </button>\n <button type=\"button\" class=\"zen-comment-textarea__save-btn\" [disabled]=\"loading\" (click)=\"onSave()\">\n <span class=\"zen-comment-textarea__spinner\" *ngIf=\"loading\"></span>\n {{ loading ? 'Saving...' : 'Save' }}\n </button>\n </div>\n </div>\n </div>\n</div>\n", styles: [".zen-comment-textarea{display:flex;flex-direction:column;width:100%}.zen-comment-textarea--loading{opacity:.7;pointer-events:none}.zen-comment-textarea__spinner{display:inline-block;width:14px;height:14px;border:2px solid currentColor;border-right-color:transparent;border-radius:50%;animation:zen-spin .6s linear infinite;vertical-align:middle;margin-right:4px}.zen-comment-textarea__label{font-family:Inter,sans-serif;font-weight:500;font-size:14px;line-height:20px;color:#344054;margin-bottom:6px}.zen-comment-textarea__input-wrapper{background:#FFFFFF;border:1px solid #D0D5DD;border-bottom:none;border-radius:8px 8px 0 0;box-shadow:0 1px 2px #1018280d}.zen-comment-textarea__attachments{display:flex;flex-direction:column;gap:8px;padding:10px 14px 0}.zen-comment-textarea__input{display:block;width:100%;min-height:86px;padding:10px 14px 0;border:none;outline:none;resize:vertical;font-family:Inter,sans-serif;font-weight:400;font-size:16px;line-height:24px;color:#101828;background:transparent;box-sizing:border-box}.zen-comment-textarea__input::placeholder{color:#667085}.zen-comment-textarea__toolbar{background:#FFFFFF;border:1px solid #D0D5DD;border-top:none;border-radius:0 0 8px 8px;padding:0 14px 8px}.zen-comment-textarea__toolbar-divider{height:1px;background:#EAECF0;margin-bottom:8px}.zen-comment-textarea__toolbar-content{display:flex;align-items:center;justify-content:space-between}.zen-comment-textarea__toolbar-icons{display:flex;gap:4px;align-items:center}.zen-comment-textarea__emoji-wrapper{position:relative}.zen-comment-textarea__icon-btn{display:flex;align-items:center;justify-content:center;width:36px;height:36px;border:none;background:transparent;border-radius:8px;cursor:pointer;padding:8px}.zen-comment-textarea__icon-btn:hover,.zen-comment-textarea__icon-btn--active{background:#F2F4F7}.zen-comment-textarea__icon-btn svg{flex-shrink:0}.zen-comment-textarea__actions{display:flex;align-items:center;gap:6px}.zen-comment-textarea__hint{font-family:Inter,sans-serif;font-weight:400;font-size:14px;line-height:20px;color:#667085}.zen-comment-textarea__return-icon{flex-shrink:0}.zen-comment-textarea__add-btn{border:none;background:transparent;font-family:Inter,sans-serif;font-weight:500;font-size:14px;line-height:20px;color:#105494;cursor:pointer;padding:0}.zen-comment-textarea__add-btn:hover{text-decoration:underline}.zen-comment-textarea__cancel-btn{display:inline-flex;align-items:center;justify-content:center;padding:10px 16px;background:#FFFFFF;border:1px solid #D0D5DD;border-radius:8px;box-shadow:0 1px 2px #1018280d;font-family:Inter,sans-serif;font-weight:500;font-size:14px;line-height:20px;color:#344054;cursor:pointer}.zen-comment-textarea__cancel-btn:hover{background:#F9FAFB}.zen-comment-textarea__save-btn{display:inline-flex;align-items:center;justify-content:center;padding:10px 16px;background:#136AB6;border:1px solid #136AB6;border-radius:8px;box-shadow:0 1px 2px #1018280d;font-family:Inter,sans-serif;font-weight:500;font-size:14px;line-height:20px;color:#fff;cursor:pointer}.zen-comment-textarea__save-btn:hover{background:#105494;border-color:#105494}.zen-attachment{display:flex;align-items:center;gap:4px;padding:12px;background:#F9FAFB;border:1px solid #EAECF0;border-radius:8px}.zen-attachment__content{display:flex;flex:1;gap:12px;align-items:center;min-width:0}.zen-attachment__icon{flex-shrink:0;width:32px;height:32px;background:#E3EEFB;border:4px solid #F1F7FE;border-radius:28px;display:flex;align-items:center;justify-content:center}.zen-attachment__info{flex:1;min-width:0}.zen-attachment__name{font-family:Inter,sans-serif;font-weight:500;font-size:14px;line-height:20px;color:#344054;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.zen-attachment__size{font-family:Inter,sans-serif;font-weight:400;font-size:14px;line-height:20px;color:#667085}.zen-attachment__remove{flex-shrink:0;display:flex;align-items:center;justify-content:center;width:36px;height:36px;border:none;background:transparent;border-radius:8px;cursor:pointer;padding:8px;margin:-8px}.zen-attachment__remove:hover{background:#F2F4F7}.zen-emoji-picker{position:absolute;bottom:calc(100% + 4px);left:0;z-index:1000;background:#FFFFFF;border:1px solid #EAECF0;border-radius:12px;box-shadow:0 4px 16px #1018281f;width:320px;overflow:hidden}.zen-emoji-picker__grid{display:grid;grid-template-columns:repeat(8,1fr);gap:2px;padding:12px;max-height:200px;overflow-y:auto}.zen-emoji-picker__emoji{display:flex;align-items:center;justify-content:center;width:34px;height:34px;border:none;background:transparent;border-radius:8px;cursor:pointer;font-size:20px;line-height:1;padding:0}.zen-emoji-picker__emoji:hover{background:#F2F4F7}.zen-emoji-picker__categories{display:flex;gap:4px;padding:8px 12px;border-top:1px solid #EAECF0}.zen-emoji-picker__category{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border:none;background:transparent;border-radius:8px;cursor:pointer;font-size:16px;padding:0}.zen-emoji-picker__category:hover{background:#F2F4F7}.zen-emoji-picker__category--active{background:#E3EEFB}@keyframes zen-spin{to{transform:rotate(360deg)}}\n"] }]
156
+ }], propDecorators: { value: [{
157
+ type: Input
158
+ }], valueChange: [{
159
+ type: Output
160
+ }], label: [{
161
+ type: Input
162
+ }], placeholder: [{
163
+ type: Input
164
+ }], rows: [{
165
+ type: Input
166
+ }], fileTypes: [{
167
+ type: Input
168
+ }], loading: [{
169
+ type: Input
170
+ }], addComment: [{
171
+ type: Output
172
+ }], filesChanged: [{
173
+ type: Output
174
+ }], save: [{
175
+ type: Output
176
+ }], cancel: [{
177
+ type: Output
178
+ }], onDocumentClick: [{
179
+ type: HostListener,
180
+ args: ['document:click', ['$event']]
181
+ }] } });
182
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemVuZHUtY29tbWVudC10ZXh0YXJlYS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy16ZW5kdWl0L3NyYy9saWIvY29tbWVudC10ZXh0YXJlYS96ZW5kdS1jb21tZW50LXRleHRhcmVhLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXplbmR1aXQvc3JjL2xpYi9jb21tZW50LXRleHRhcmVhL3plbmR1LWNvbW1lbnQtdGV4dGFyZWEuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxZQUFZLEVBQ1osWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7OztBQWlCdkIsTUFBTSxnQkFBZ0IsR0FBb0I7SUFDeEM7UUFDRSxHQUFHLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLElBQUk7UUFDNUMsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxDQUFDO0tBQ3hIO0lBQ0Q7UUFDRSxHQUFHLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLElBQUk7UUFDOUMsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFDLEdBQUcsRUFBQyxJQUFJLEVBQUMsR0FBRyxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVB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QkFFRyxJQUFJO3NCQUFiLE1BQU07Z0JBRUcsTUFBTTtzQkFBZixNQUFNO2dCQWVQLGVBQWU7c0JBRGQsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tbWVudEF0dGFjaG1lbnQge1xuICBmaWxlOiBGaWxlO1xuICBuYW1lOiBzdHJpbmc7XG4gIHNpemU6IHN0cmluZztcbiAgcHJvZ3Jlc3M6IG51bWJlcjtcbiAgY29tcGxldGU6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRW1vamlDYXRlZ29yeSB7XG4gIGtleTogc3RyaW5nO1xuICBsYWJlbDogc3RyaW5nO1xuICBpY29uOiBzdHJpbmc7XG4gIGVtb2ppczogc3RyaW5nW107XG59XG5cbmNvbnN0IEVNT0pJX0NBVEVHT1JJRVM6IEVtb2ppQ2F0ZWdvcnlbXSA9IFtcbiAge1xuICAgIGtleTogJ3NtaWxleXMnLCBsYWJlbDogJ1NtaWxleXMnLCBpY29uOiAn8J+YgCcsXG4gICAgZW1vamlzOiBbJ/CfmIAnLCfwn5iEJywn8J+YgScsJ/CfmIYnLCfwn5iFJywn8J+koycsJ/CfmIInLCfwn5mCJywn8J+YiScsJ/CfmIonLCfwn6WwJywn8J+YjScsJ/CfmJgnLCfwn5iLJywn8J+YmycsJ/CfmJwnLCfwn6SUJywn8J+YjycsJ/CfmYQnLCfwn5isJywn8J+YtCcsJ/CfpK8nXVxuICB9LFxuICB7XG4gICAga2V5OiAnZ2VzdHVyZXMnLCBsYWJlbDogJ0dlc3R1cmVzJywgaWNvbjogJ/CfkYsnLFxuICAgIGVtb2ppczogWyfwn5GLJywn4pyLJywn8J+RjCcsJ+KcjCcsJ/CfpJ4nLCfwn6SZJywn8J+RjScsJ/CfkY4nLCfwn5GPJywn8J+ZjCcsJ/CfpJ0nLCfwn5mPJ11cbiAgfSxcbiAge1xuICAgIGtleTogJ2hlYXJ0cycsIGxhYmVsOiAnSGVhcnRzJywgaWNvbjogJ+KdpO+4jycsXG4gICAgZW1vamlzOiBbJ+KdpO+4jycsJ/Cfp6EnLCfwn5KbJywn8J+SmicsJ/CfkpknLCfwn5KcJywn8J+WpCcsJ/CfkpQnLCfwn5KVJywn8J+SliddXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdvYmplY3RzJywgbGFiZWw6ICdPYmplY3RzJywgaWNvbjogJ+KtkCcsXG4gICAgZW1vamlzOiBbJ+KtkCcsJ/CflKUnLCfinKgnLCfwn46JJywn8J+PhicsJ/Cfkq8nLCfinIUnLCfinYwnLCfimqEnLCfwn5KhJywn8J+UlCcsJ/CflJcnXVxuICB9LFxuXTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnemVuLWNvbW1lbnQtdGV4dGFyZWEnLFxuICB0ZW1wbGF0ZVVybDogJy4vemVuZHUtY29tbWVudC10ZXh0YXJlYS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3plbmR1LWNvbW1lbnQtdGV4dGFyZWEuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgWmVuZHVDb21tZW50VGV4dGFyZWFDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIEBJbnB1dCgpIHZhbHVlID0gJyc7XG4gIEBPdXRwdXQoKSB2YWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIEBJbnB1dCgpIGxhYmVsID0gJyc7XG5cbiAgQElucHV0KCkgcGxhY2Vob2xkZXIgPSAnRW50ZXIgYSBjb21tZW50Li4uJztcblxuICBASW5wdXQoKSByb3dzID0gNDtcblxuICBASW5wdXQoKSBmaWxlVHlwZXMgPSAnKi8qJztcblxuICBASW5wdXQoKSBsb2FkaW5nID0gZmFsc2U7XG5cbiAgQE91dHB1dCgpIGFkZENvbW1lbnQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgdGV4dDogc3RyaW5nOyBmaWxlczogRmlsZVtdIH0+KCk7XG5cbiAgQE91dHB1dCgpIGZpbGVzQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RmlsZVtdPigpO1xuXG4gIEBPdXRwdXQoKSBzYXZlID0gbmV3IEV2ZW50RW1pdHRlcjx7IHRleHQ6IHN0cmluZzsgZmlsZXM6IEZpbGVbXSB9PigpO1xuXG4gIEBPdXRwdXQoKSBjYW5jZWwgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgZWRpdGluZyA9IGZhbHNlO1xuICBlbW9qaVBpY2tlck9wZW4gPSBmYWxzZTtcblxuICBuZ09uSW5pdCgpIHtcbiAgICBpZiAodGhpcy52YWx1ZT8ubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5lZGl0aW5nID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgZW1vamlDYXRlZ29yaWVzID0gRU1PSklfQ0FURUdPUklFUztcbiAgYWN0aXZlRW1vamlDYXRlZ29yeSA9IEVNT0pJX0NBVEVHT1JJRVNbMF0ua2V5O1xuICBhdHRhY2htZW50czogQ29tbWVudEF0dGFjaG1lbnRbXSA9IFtdO1xuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcbiAgb25Eb2N1bWVudENsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLmVtb2ppUGlja2VyT3BlbikgcmV0dXJuO1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBpZiAoIXRhcmdldC5jbG9zZXN0KCcuemVuLWVtb2ppLXBpY2tlcicpICYmICF0YXJnZXQuY2xvc2VzdCgnLnplbi1jb21tZW50LXRleHRhcmVhX19pY29uLWJ0blt0aXRsZT1cIkVtb2ppXCJdJykpIHtcbiAgICAgIHRoaXMuZW1vamlQaWNrZXJPcGVuID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgb25JbnB1dCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gICAgdGhpcy5lZGl0aW5nID0gdmFsdWUubGVuZ3RoID4gMCB8fCB0aGlzLmF0dGFjaG1lbnRzLmxlbmd0aCA+IDA7XG4gIH1cblxuICBvbktleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInICYmICFldmVudC5zaGlmdEtleSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMub25BZGRDb21tZW50KCk7XG4gICAgfVxuICB9XG5cbiAgb25BZGRDb21tZW50KCkge1xuICAgIGlmICh0aGlzLmxvYWRpbmcpIHJldHVybjtcbiAgICBpZiAodGhpcy52YWx1ZS50cmltKCkgfHwgdGhpcy5hdHRhY2htZW50cy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuYWRkQ29tbWVudC5lbWl0KHsgdGV4dDogdGhpcy52YWx1ZSwgZmlsZXM6IHRoaXMuYXR0YWNobWVudHMubWFwKGEgPT4gYS5maWxlKSB9KTtcbiAgICB9XG4gIH1cblxuICBvblNhdmUoKSB7XG4gICAgaWYgKHRoaXMubG9hZGluZykgcmV0dXJuO1xuICAgIGlmICh0aGlzLnZhbHVlLnRyaW0oKSB8fCB0aGlzLmF0dGFjaG1lbnRzLmxlbmd0aCkge1xuICAgICAgdGhpcy5zYXZlLmVtaXQoeyB0ZXh0OiB0aGlzLnZhbHVlLCBmaWxlczogdGhpcy5hdHRhY2htZW50cy5tYXAoYSA9PiBhLmZpbGUpIH0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZXNldCgpIHtcbiAgICB0aGlzLnZhbHVlID0gJyc7XG4gICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHRoaXMudmFsdWUpO1xuICAgIHRoaXMuYXR0YWNobWVudHMgPSBbXTtcbiAgICB0aGlzLmZpbGVzQ2hhbmdlZC5lbWl0KFtdKTtcbiAgICB0aGlzLmVkaXRpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIG9uQ2FuY2VsKCkge1xuICAgIHRoaXMudmFsdWUgPSAnJztcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodGhpcy52YWx1ZSk7XG4gICAgdGhpcy5hdHRhY2htZW50cyA9IFtdO1xuICAgIHRoaXMuZmlsZXNDaGFuZ2VkLmVtaXQoW10pO1xuICAgIHRoaXMuZWRpdGluZyA9IGZhbHNlO1xuICAgIHRoaXMuY2FuY2VsLmVtaXQoKTtcbiAgfVxuXG4gIHRvZ2dsZUVtb2ppUGlja2VyKCkge1xuICAgIHRoaXMuZW1vamlQaWNrZXJPcGVuID0gIXRoaXMuZW1vamlQaWNrZXJPcGVuO1xuICB9XG5cbiAgc2VsZWN0RW1vamkoZW1vamk6IHN0cmluZykge1xuICAgIHRoaXMudmFsdWUgKz0gZW1vamk7XG4gICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHRoaXMudmFsdWUpO1xuICAgIHRoaXMuZWRpdGluZyA9IHRydWU7XG4gICAgdGhpcy5lbW9qaVBpY2tlck9wZW4gPSBmYWxzZTtcbiAgfVxuXG4gIHNldEVtb2ppQ2F0ZWdvcnkoa2V5OiBzdHJpbmcpIHtcbiAgICB0aGlzLmFjdGl2ZUVtb2ppQ2F0ZWdvcnkgPSBrZXk7XG4gIH1cblxuICBnZXQgYWN0aXZlRW1vamlzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBjYXQgPSB0aGlzLmVtb2ppQ2F0ZWdvcmllcy5maW5kKGMgPT4gYy5rZXkgPT09IHRoaXMuYWN0aXZlRW1vamlDYXRlZ29yeSk7XG4gICAgcmV0dXJuIGNhdCA/IGNhdC5lbW9qaXMgOiBbXTtcbiAgfVxuXG4gIG9uRmlsZUlucHV0KGV2ZW50OiBFdmVudCkge1xuICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgaWYgKCFpbnB1dC5maWxlcz8ubGVuZ3RoKSByZXR1cm47XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0LmZpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBmaWxlID0gaW5wdXQuZmlsZXNbaV07XG4gICAgICB0aGlzLmF0dGFjaG1lbnRzLnB1c2goe1xuICAgICAgICBmaWxlLFxuICAgICAgICBuYW1lOiBmaWxlLm5hbWUsXG4gICAgICAgIHNpemU6IHRoaXMuZm9ybWF0RmlsZVNpemUoZmlsZS5zaXplKSxcbiAgICAgICAgcHJvZ3Jlc3M6IDEwMCxcbiAgICAgICAgY29tcGxldGU6IHRydWUsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLmVkaXRpbmcgPSB0cnVlO1xuICAgIHRoaXMuZmlsZXNDaGFuZ2VkLmVtaXQodGhpcy5hdHRhY2htZW50cy5tYXAoYSA9PiBhLmZpbGUpKTtcbiAgICBpbnB1dC52YWx1ZSA9ICcnO1xuICB9XG5cbiAgcmVtb3ZlQXR0YWNobWVudChpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5hdHRhY2htZW50cy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIHRoaXMuZmlsZXNDaGFuZ2VkLmVtaXQodGhpcy5hdHRhY2htZW50cy5tYXAoYSA9PiBhLmZpbGUpKTtcbiAgICBpZiAoIXRoaXMuYXR0YWNobWVudHMubGVuZ3RoICYmICF0aGlzLnZhbHVlKSB7XG4gICAgICB0aGlzLmVkaXRpbmcgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBnZXRGaWxlSWNvbihuYW1lOiBzdHJpbmcpOiAnZG9jdW1lbnQnIHwgJ3ZpZGVvJyB8ICdtaXNjJyB7XG4gICAgY29uc3QgZXh0ID0gbmFtZS5zcGxpdCgnLicpLnBvcCgpPy50b0xvd2VyQ2FzZSgpIHx8ICcnO1xuICAgIGlmIChbJ3BkZicsICdkb2MnLCAnZG9jeCcsICd0eHQnLCAneGxzJywgJ3hsc3gnLCAnY3N2JywgJ3BwdCcsICdwcHR4J10uaW5jbHVkZXMoZXh0KSkgcmV0dXJuICdkb2N1bWVudCc7XG4gICAgaWYgKFsnbXA0JywgJ21vdicsICdhdmknLCAnbWt2JywgJ3dlYm0nLCAnZmx2J10uaW5jbHVkZXMoZXh0KSkgcmV0dXJuICd2aWRlbyc7XG4gICAgcmV0dXJuICdtaXNjJztcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0RmlsZVNpemUoYnl0ZXM6IG51bWJlcik6IHN0cmluZyB7XG4gICAgaWYgKGJ5dGVzIDwgMTAyNCkgcmV0dXJuIGJ5dGVzICsgJyBCJztcbiAgICBpZiAoYnl0ZXMgPCAxMDI0ICogMTAyNCkgcmV0dXJuIChieXRlcyAvIDEwMjQpLnRvRml4ZWQoMCkgKyAnIEtCJztcbiAgICByZXR1cm4gKGJ5dGVzIC8gKDEwMjQgKiAxMDI0KSkudG9GaXhlZCgxKSArICcgTUInO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiemVuLWNvbW1lbnQtdGV4dGFyZWFcIiBbY2xhc3MuemVuLWNvbW1lbnQtdGV4dGFyZWEtLWxvYWRpbmddPVwibG9hZGluZ1wiPlxuICA8IS0tIExhYmVsIC0tPlxuICA8bGFiZWwgKm5nSWY9XCJsYWJlbFwiIGNsYXNzPVwiemVuLWNvbW1lbnQtdGV4dGFyZWFfX2xhYmVsXCI+e3sgbGFiZWwgfX08L2xhYmVsPlxuXG4gIDwhLS0gTWFpbiBib3ggKHRvcDogYXR0YWNobWVudHMgKyB0ZXh0YXJlYSwgYm90dG9tOiB0b29sYmFyKSAtLT5cbiAgPGRpdiBjbGFzcz1cInplbi1jb21tZW50LXRleHRhcmVhX19pbnB1dC13cmFwcGVyXCI+XG4gICAgPCEtLSBBdHRhY2htZW50cyBpbnNpZGUgdGhlIHRleHRhcmVhIGFyZWEgLS0+XG4gICAgPGRpdiBjbGFzcz1cInplbi1jb21tZW50LXRleHRhcmVhX19hdHRhY2htZW50c1wiICpuZ0lmPVwiYXR0YWNobWVudHMubGVuZ3RoXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiemVuLWF0dGFjaG1lbnRcIlxuICAgICAgICAgICAqbmdGb3I9XCJsZXQgYXR0IG9mIGF0dGFjaG1lbnRzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ6ZW4tYXR0YWNobWVudF9fY29udGVudFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ6ZW4tYXR0YWNobWVudF9faWNvblwiIFtuZ1N3aXRjaF09XCJnZXRGaWxlSWNvbihhdHQubmFtZSlcIj5cbiAgICAgICAgICAgIDxzdmcgKm5nU3dpdGNoQ2FzZT1cIidkb2N1bWVudCdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTQgMkg2QzUuNDY5NTcgMiA0Ljk2MDg2IDIuMjEwNzEgNC41ODU3OSAyLjU4NTc5QzQuMjEwNzEgMi45NjA4NiA0IDMuNDY5NTcgNCA0VjIwQzQgMjAuNTMwNCA0LjIxMDcxIDIxLjAzOTEgNC41ODU3OSAyMS40MTQyQzQuOTYwODYgMjEuNzg5MyA1LjQ2OTU3IDIyIDYgMjJIMThDMTguNTMwNCAyMiAxOS4wMzkxIDIxLjc4OTMgMTkuNDE0MiAyMS40MTQyQzE5Ljc4OTMgMjEuMDM5MSAyMCAyMC41MzA0IDIwIDIwVjhMMTQgMlpcIiBzdHJva2U9XCIjMTM2QUI2XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgPHBvbHlsaW5lIHBvaW50cz1cIjE0LDIgMTQsOCAyMCw4XCIgc3Ryb2tlPVwiIzEzNkFCNlwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDxzdmcgKm5nU3dpdGNoQ2FzZT1cIid2aWRlbydcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgIDxyZWN0IHg9XCIyXCIgeT1cIjJcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiByeD1cIjIuMThcIiByeT1cIjIuMThcIiBzdHJva2U9XCIjMTM2QUI2XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgPGxpbmUgeDE9XCI3XCIgeTE9XCIyXCIgeDI9XCI3XCIgeTI9XCIyMlwiIHN0cm9rZT1cIiMxMzZBQjZcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICA8bGluZSB4MT1cIjE3XCIgeTE9XCIyXCIgeDI9XCIxN1wiIHkyPVwiMjJcIiBzdHJva2U9XCIjMTM2QUI2XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgPGxpbmUgeDE9XCIyXCIgeTE9XCIxMlwiIHgyPVwiMjJcIiB5Mj1cIjEyXCIgc3Ryb2tlPVwiIzEzNkFCNlwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDxzdmcgKm5nU3dpdGNoQ2FzZT1cIidtaXNjJ1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICAgICAgPHBvbHlsaW5lIHBvaW50cz1cIjE2LDE2IDEyLDEyIDgsMTZcIiBzdHJva2U9XCIjMTM2QUI2XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgPGxpbmUgeDE9XCIxMlwiIHkxPVwiMTJcIiB4Mj1cIjEyXCIgeTI9XCIyMVwiIHN0cm9rZT1cIiMxMzZBQjZcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTIwLjM5IDE4LjM5QTUgNSAwIDAgMCAxOCA5aC0xLjI2QTggOCAwIDEgMCAzIDE2LjNcIiBzdHJva2U9XCIjMTM2QUI2XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ6ZW4tYXR0YWNobWVudF9faW5mb1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInplbi1hdHRhY2htZW50X19uYW1lXCI+e3sgYXR0Lm5hbWUgfX08L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ6ZW4tYXR0YWNobWVudF9fc2l6ZVwiPnt7IGF0dC5zaXplIH19PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInplbi1hdHRhY2htZW50X19yZW1vdmVcIiAoY2xpY2spPVwicmVtb3ZlQXR0YWNobWVudChpKVwiPlxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgPHBvbHlsaW5lIHBvaW50cz1cIjMsNiA1LDYgMjEsNlwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgPHBhdGggZD1cIk0xOSA2VjIwQzE5IDIwLjUzMDQgMTguNzg5MyAyMS4wMzkxIDE4LjQxNDIgMjEuNDE0MkMxOC4wMzkxIDIxLjc4OTMgMTcuNTMwNCAyMiAxNyAyMkg3QzYuNDY5NTcgMjIgNS45NjA4NiAyMS43ODkzIDUuNTg1NzkgMjEuNDE0MkM1LjIxMDcxIDIxLjAzOTEgNSAyMC41MzA0IDUgMjBWNk04IDZWNEM4IDMuNDY5NTcgOC4yMTA3MSAyLjk2MDg2IDguNTg1NzkgMi41ODU3OUM4Ljk2MDg2IDIuMjEwNzEgOS40Njk1NyAyIDEwIDJIMTRDMTQuNTMwNCAyIDE1LjAzOTEgMi4yMTA3MSAxNS40MTQyIDIuNTg1NzlDMTUuNzg5MyAyLjk2MDg2IDE2IDMuNDY5NTcgMTYgNFY2XCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFRleHRhcmVhIC0tPlxuICAgIDx0ZXh0YXJlYSBjbGFzcz1cInplbi1jb21tZW50LXRleHRhcmVhX19pbnB1dFwiXG4gICAgICAgICAgICAgIFtyb3dzXT1cInJvd3NcIlxuICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICBbdmFsdWVdPVwidmFsdWVcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwibG9hZGluZ1wiXG4gICAgICAgICAgICAgIChpbnB1dCk9XCJvbklucHV0KCRhbnkoJGV2ZW50LnRhcmdldCkudmFsdWUpXCJcbiAgICAgICAgICAgICAgKGtleWRvd24pPVwib25LZXlkb3duKCRldmVudClcIj48L3RleHRhcmVhPlxuICA8L2Rpdj5cblxuICA8IS0tIFRvb2xiYXIgKGJvdHRvbSBwYXJ0IHdpdGggcm91bmRlZCBib3R0b20gY29ybmVycykgLS0+XG4gIDxkaXYgY2xhc3M9XCJ6ZW4tY29tbWVudC10ZXh0YXJlYV9fdG9vbGJhclwiPlxuICAgIDxkaXYgY2xhc3M9XCJ6ZW4tY29tbWVudC10ZXh0YXJlYV9fdG9vbGJhci1kaXZpZGVyXCI+PC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiemVuLWNvbW1lbnQtdGV4dGFyZWFfX3Rvb2xiYXItY29udGVudFwiPlxuICAgICAgPCEtLSBJY29uIGJ1dHRvbnMgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiemVuLWNvbW1lbnQtdGV4dGFyZWFfX3Rvb2xiYXItaWNvbnNcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInplbi1jb21tZW50LXRleHRhcmVhX19lbW9qaS13cmFwcGVyXCI+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiemVuLWNvbW1lbnQtdGV4dGFyZWFfX2ljb24tYnRuXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy56ZW4tY29tbWVudC10ZXh0YXJlYV9faWNvbi1idG4tLWFjdGl2ZV09XCJlbW9qaVBpY2tlck9wZW5cIlxuICAgICAgICAgICAgICAgICAgdGl0bGU9XCJFbW9qaVwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlRW1vamlQaWNrZXIoKVwiPlxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiMTJcIiByPVwiMTBcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk04IDE0QzggMTQgOS41IDE2IDEyIDE2QzE0LjUgMTYgMTYgMTQgMTYgMTRcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgPGxpbmUgeDE9XCI5XCIgeTE9XCI5XCIgeDI9XCI5LjAxXCIgeTI9XCI5XCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgIDxsaW5lIHgxPVwiMTVcIiB5MT1cIjlcIiB4Mj1cIjE1LjAxXCIgeTI9XCI5XCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgIDwhLS0gRW1vamkgcGlja2VyIC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ6ZW4tZW1vamktcGlja2VyXCIgKm5nSWY9XCJlbW9qaVBpY2tlck9wZW5cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ6ZW4tZW1vamktcGlja2VyX19ncmlkXCI+XG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ6ZW4tZW1vamktcGlja2VyX19lbW9qaVwiXG4gICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGVtb2ppIG9mIGFjdGl2ZUVtb2ppc1wiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdEVtb2ppKGVtb2ppKVwiPlxuICAgICAgICAgICAgICAgIHt7IGVtb2ppIH19XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiemVuLWVtb2ppLXBpY2tlcl9fY2F0ZWdvcmllc1wiPlxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiemVuLWVtb2ppLXBpY2tlcl9fY2F0ZWdvcnlcIlxuICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy56ZW4tZW1vamktcGlja2VyX19jYXRlZ29yeS0tYWN0aXZlXT1cImNhdC5rZXkgPT09IGFjdGl2ZUVtb2ppQ2F0ZWdvcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjYXQgb2YgZW1vamlDYXRlZ29yaWVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2V0RW1vamlDYXRlZ29yeShjYXQua2V5KVwiPlxuICAgICAgICAgICAgICAgIHt7IGNhdC5pY29uIH19XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ6ZW4tY29tbWVudC10ZXh0YXJlYV9faWNvbi1idG5cIlxuICAgICAgICAgICAgICAgIHRpdGxlPVwiQXR0YWNoIGZpbGVcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJmaWxlSW5wdXQuY2xpY2soKVwiPlxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgPHBhdGggZD1cIk0yMS40NCAxMS4wNUwxMi4yNSAyMC4yNEMxMS4xMjQyIDIxLjM2NTggOS41OTcyMyAyMS45OTgzIDguMDA1MDUgMjEuOTk4M0M2LjQxMjg2IDIxLjk5ODMgNC44ODU4OSAyMS4zNjU4IDMuNzYwMDUgMjAuMjRDMi42MzQyIDE5LjExNDIgMi4wMDE3MSAxNy41ODcyIDIuMDAxNzEgMTUuOTk1QzIuMDAxNzEgMTQuNDAyOSAyLjYzNDIgMTIuODc1OSAzLjc2MDA1IDExLjc1TDEyLjk1IDIuNTZDMTMuNzAwNiAxLjgwOTQ0IDE0LjcxODYgMS4zODc3IDE1Ljc4IDEuMzg3N0MxNi44NDE1IDEuMzg3NyAxNy44NTk1IDEuODA5NDQgMTguNjEgMi41NkMxOS4zNjA2IDMuMzEwNTcgMTkuNzgyMyA0LjMyODYzIDE5Ljc4MjMgNS4zOUMxOS43ODIzIDYuNDUxMzggMTkuMzYwNiA3LjQ2OTQ0IDE4LjYxIDguMjJMOS40MTAwNSAxNy40MUM5LjAzNDc2IDE3Ljc4NTMgOC41MjU3MyAxNy45OTYxIDcuOTk1MDUgMTcuOTk2MUM3LjQ2NDM2IDE3Ljk5NjEgNi45NTUzMyAxNy43ODUzIDYuNTgwMDUgMTcuNDFDNi4yMDQ3NiAxNy4wMzQ3IDUuOTkzODkgMTYuNTI1NyA1Ljk5Mzg5IDE1Ljk5NUM1Ljk5Mzg5IDE1LjQ2NDQgNi4yMDQ3NiAxNC45NTUzIDYuNTgwMDUgMTQuNThMMTUuMDcgNi4xXCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8aW5wdXQgdHlwZT1cImZpbGVcIiAjZmlsZUlucHV0IFthY2NlcHRdPVwiZmlsZVR5cGVzXCIgbXVsdGlwbGUgaGlkZGVuIChjaGFuZ2UpPVwib25GaWxlSW5wdXQoJGV2ZW50KVwiIC8+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBSaWdodCBzaWRlIGFjdGlvbnMgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiemVuLWNvbW1lbnQtdGV4dGFyZWFfX2FjdGlvbnNcIiAqbmdJZj1cIiFlZGl0aW5nXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiemVuLWNvbW1lbnQtdGV4dGFyZWFfX2hpbnRcIj5QcmVzcyBlbnRlcjwvc3Bhbj5cbiAgICAgICAgPHN2ZyBjbGFzcz1cInplbi1jb21tZW50LXRleHRhcmVhX19yZXR1cm4taWNvblwiIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgICA8cGF0aCBkPVwiTTMuMzMzMzcgMTIuNUw2LjY2NjcxIDE1LjgzMzNNMy4zMzMzNyAxMi41TDYuNjY2NzEgOS4xNjY2N00zLjMzMzM3IDEyLjVIMTMuMzMzNEMxNC4yMTc1IDEyLjUgMTUuMDY1MyAxMi4xNDg4IDE1LjY5MDQgMTEuNTIzN0MxNi4zMTU1IDEwLjg5ODYgMTYuNjY2NyAxMC4wNTA3IDE2LjY2NjcgOS4xNjY2N1Y0LjE2NjY3XCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInplbi1jb21tZW50LXRleHRhcmVhX19oaW50XCI+dG88L3NwYW4+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiemVuLWNvbW1lbnQtdGV4dGFyZWFfX2FkZC1idG5cIiBbZGlzYWJsZWRdPVwibG9hZGluZ1wiIChjbGljayk9XCJvbkFkZENvbW1lbnQoKVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiemVuLWNvbW1lbnQtdGV4dGFyZWFfX3NwaW5uZXJcIiAqbmdJZj1cImxvYWRpbmdcIj48L3NwYW4+XG4gICAgICAgICAge3sgbG9hZGluZyA/ICdTZW5kaW5nLi4uJyA6ICdBZGQgQ29tbWVudCcgfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cInplbi1jb21tZW50LXRleHRhcmVhX19hY3Rpb25zXCIgKm5nSWY9XCJlZGl0aW5nXCI+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiemVuLWNvbW1lbnQtdGV4dGFyZWFfX2NhbmNlbC1idG5cIiBbZGlzYWJsZWRdPVwibG9hZGluZ1wiIChjbGljayk9XCJvbkNhbmNlbCgpXCI+XG4gICAgICAgICAgQ2FuY2VsXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInplbi1jb21tZW50LXRleHRhcmVhX19zYXZlLWJ0blwiIFtkaXNhYmxlZF09XCJsb2FkaW5nXCIgKGNsaWNrKT1cIm9uU2F2ZSgpXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ6ZW4tY29tbWVudC10ZXh0YXJlYV9fc3Bpbm5lclwiICpuZ0lmPVwibG9hZGluZ1wiPjwvc3Bhbj5cbiAgICAgICAgICB7eyBsb2FkaW5nID8gJ1NhdmluZy4uLicgOiAnU2F2ZScgfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1waWNrZXItZHJvcGRvd24udHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy16ZW5kdWl0L3NyYy9saWIvZGF0ZS1waWNrZXItZHJvcGRvd24vZGF0ZS1waWNrZXItZHJvcGRvd24udHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIERhdGVQaWNrZXJEcm9wZG93blR5cGUgPSAnc2luZ2xlJyB8ICdyYW5nZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0ZVBpY2tlclByZXNldCB7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIGdldFJhbmdlOiAoKSA9PiB7IHN0YXJ0OiBEYXRlOyBlbmQ6IERhdGUgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEYXRlUmFuZ2VWYWx1ZSB7XG4gIHN0YXJ0OiBEYXRlIHwgbnVsbDtcbiAgZW5kOiBEYXRlIHwgbnVsbDtcbn1cbiJdfQ==