ng-zenduit 2.0.2 → 2.0.7

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.
@@ -3101,10 +3101,10 @@ class ZenduPhoneInputComponent {
3101
3101
  }
3102
3102
  }
3103
3103
  ZenduPhoneInputComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduPhoneInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3104
- ZenduPhoneInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: ZenduPhoneInputComponent, selector: "zen-phone-input", inputs: { phone: "phone", maxLength: "maxLength", disabled: "disabled" }, outputs: { phoneChange: "phoneChange", validChange: "validChange" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"phone-input-component\">\n <div class=\"material-input\">\n <a class=\"country-select\"\n (click)=\"toggle()\">\n <img class=\"country-flag\"\n [src]=\"selectedCountry.flag\">\n <i class=\"material-icons expand-icon\"\n [ngClass]=\"{'active': isExpanded}\">expand_more</i>\n <div class=\"code\">{{ selectedCountry.countryCallingCode }}</div>\n </a>\n <input class=\"phone-input\"\n type=\"text\"\n [(ngModel)]=\"phoneText\"\n (ngModelChange)=\"phoneChanged(input)\"\n (click)=\"isExpanded = false\"\n [disabled]=\"disabled\"\n country-code=\"selectedCountry.countryCode\"\n [maxlength]=\"maxLength\"\n #input>\n </div>\n\n <div class=\"action-menu country-dropdown-list\"\n *ngIf=\"isExpanded\">\n <div class=\"action-menu-body\">\n <!--Country's List-->\n <a class=\"action-item\"\n *ngFor=\"let country of countryList\"\n [ngClass]=\"{'active': selectedCountry.countryName === country.countryName}\"\n (click)=\"countryChanged(country)\">\n <img class=\"country-flag\"\n [src]=\"country.flag\">\n <div>{{ country.countryName }}</div>\n <div>{{ country.countryCallingCode }}</div>\n </a>\n\n <!--Custom Country-->\n <a class=\"action-item\"\n [ngClass]=\"{'active': selectedCountry.countryName === customCountry.countryName}\"\n (click)=\"countryChanged(customCountry)\">\n <img class=\"country-flag\"\n [src]=\"customCountry.flag\">\n <div>{{ customCountry.countryName }}</div>\n <div>{{ customCountry.countryCallingCode }}</div>\n </a>\n </div>\n </div>\n</div>\n", styles: [".phone-input-component{position:relative;width:100%}.phone-input-component .material-input,.phone-input-component .zen-input{display:flex;align-items:center;gap:8px}.phone-input-component .material-input .country-select,.phone-input-component .zen-input .country-select{display:flex;align-items:center;gap:8px;cursor:pointer;-webkit-user-select:none;user-select:none;text-decoration:none;outline:none}.phone-input-component .material-input .country-select .expand-icon,.phone-input-component .zen-input .country-select .expand-icon{color:#60636c;transition:.3s}.phone-input-component .material-input .country-select .expand-icon.active,.phone-input-component .zen-input .country-select .expand-icon.active{color:#2188d9;transform:rotate(180deg)}.phone-input-component .material-input .country-select .code,.phone-input-component .zen-input .country-select .code{font-style:normal;font-weight:400;font-size:16px;line-height:24px;color:#333}.phone-input-component .material-input .country-select:focus .expand-icon,.phone-input-component .zen-input .country-select:focus .expand-icon{color:#2188d9}.phone-input-component .material-input .phone-input,.phone-input-component .zen-input .phone-input{flex:1;border:none;outline:none;font-style:normal;font-weight:400;font-size:16px;line-height:24px;color:#333;background:transparent}.phone-input-component .country-dropdown-list{width:inherit;margin-top:8px}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
3104
+ ZenduPhoneInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: ZenduPhoneInputComponent, selector: "zen-phone-input", inputs: { phone: "phone", maxLength: "maxLength", disabled: "disabled", width: "width" }, outputs: { phoneChange: "phoneChange", validChange: "validChange" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"phone-input-component\" [style.width]=\"width\">\n <div class=\"material-input\">\n <a class=\"country-select\"\n (click)=\"toggle()\">\n <img class=\"country-flag\"\n [src]=\"selectedCountry.flag\">\n <i class=\"material-icons expand-icon\"\n [ngClass]=\"{'active': isExpanded}\">expand_less</i>\n <div class=\"code\">{{ selectedCountry.countryCallingCode }}</div>\n </a>\n <input class=\"phone-input\"\n type=\"text\"\n [(ngModel)]=\"phoneText\"\n (ngModelChange)=\"phoneChanged(input)\"\n (click)=\"isExpanded = false\"\n [disabled]=\"disabled\"\n country-code=\"selectedCountry.countryCode\"\n [maxlength]=\"maxLength\"\n #input>\n </div>\n\n <div class=\"action-menu country-dropdown-list\"\n *ngIf=\"isExpanded\">\n <div class=\"action-menu-body\">\n <!--Country's List-->\n <a class=\"action-item\"\n *ngFor=\"let country of countryList\"\n [ngClass]=\"{'active': selectedCountry.countryName === country.countryName}\"\n (click)=\"countryChanged(country)\">\n <img class=\"country-flag\"\n [src]=\"country.flag\">\n <div>{{ country.countryName }}</div>\n <div>{{ country.countryCallingCode }}</div>\n </a>\n\n <!--Custom Country-->\n <a class=\"action-item\"\n [ngClass]=\"{'active': selectedCountry.countryName === customCountry.countryName}\"\n (click)=\"countryChanged(customCountry)\">\n <img class=\"country-flag\"\n [src]=\"customCountry.flag\">\n <div>{{ customCountry.countryName }}</div>\n <div>{{ customCountry.countryCallingCode }}</div>\n </a>\n </div>\n </div>\n</div>\n", styles: [":host{display:block;overflow:visible}.phone-input-component{position:relative;width:100%}.phone-input-component .material-input,.phone-input-component .zen-input{display:flex;align-items:center;gap:4px;border:1px solid #D0D5DD;border-radius:10px;padding:8px 14px;background:#FFFFFF;transition:border-color .2s;box-sizing:border-box}.phone-input-component .material-input:focus-within,.phone-input-component .zen-input:focus-within{border-color:#2188d9;z-index:1;position:relative}.phone-input-component .material-input .country-select,.phone-input-component .zen-input .country-select{display:flex;align-items:center;gap:4px;cursor:pointer;-webkit-user-select:none;user-select:none;text-decoration:none;outline:none;flex-shrink:0}.phone-input-component .material-input .country-select .country-flag,.phone-input-component .zen-input .country-select .country-flag{width:24px;height:24px;object-fit:contain}.phone-input-component .material-input .country-select .expand-icon,.phone-input-component .zen-input .country-select .expand-icon{color:#2188d9;font-size:20px;transition:transform .3s}.phone-input-component .material-input .country-select .expand-icon.active,.phone-input-component .zen-input .country-select .expand-icon.active{transform:rotate(180deg)}.phone-input-component .material-input .country-select .code,.phone-input-component .zen-input .country-select .code{font-style:normal;font-weight:500;font-size:15px;line-height:24px;color:#333;min-width:32px}.phone-input-component .material-input .country-select:focus .expand-icon,.phone-input-component .zen-input .country-select:focus .expand-icon{color:#2188d9}.phone-input-component .material-input .phone-input,.phone-input-component .zen-input .phone-input{flex:1;border:none;outline:none;font-style:normal;font-weight:400;font-size:15px;line-height:24px;color:#333;background:transparent;min-width:0}.phone-input-component .country-dropdown-list{width:100%;margin-top:6px;border-radius:12px;box-shadow:0 2px 8px #0000000f,0 1px 3px #0000000a}.phone-input-component .country-dropdown-list .action-menu-body{padding:6px 0}.phone-input-component .country-dropdown-list .action-menu-body .action-item{padding:10px 16px;gap:12px;font-size:16px;font-weight:400;line-height:24px;color:#333}.phone-input-component .country-dropdown-list .action-menu-body .action-item .country-flag{width:28px;height:28px;border-radius:50%;object-fit:cover}.phone-input-component .country-dropdown-list .action-menu-body .action-item.active{background:#F0F4F8}.phone-input-component .country-dropdown-list .action-menu-body .action-item:hover{background:#F4F9FD}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
3105
3105
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduPhoneInputComponent, decorators: [{
3106
3106
  type: Component,
3107
- args: [{ selector: 'zen-phone-input', template: "<div class=\"phone-input-component\">\n <div class=\"material-input\">\n <a class=\"country-select\"\n (click)=\"toggle()\">\n <img class=\"country-flag\"\n [src]=\"selectedCountry.flag\">\n <i class=\"material-icons expand-icon\"\n [ngClass]=\"{'active': isExpanded}\">expand_more</i>\n <div class=\"code\">{{ selectedCountry.countryCallingCode }}</div>\n </a>\n <input class=\"phone-input\"\n type=\"text\"\n [(ngModel)]=\"phoneText\"\n (ngModelChange)=\"phoneChanged(input)\"\n (click)=\"isExpanded = false\"\n [disabled]=\"disabled\"\n country-code=\"selectedCountry.countryCode\"\n [maxlength]=\"maxLength\"\n #input>\n </div>\n\n <div class=\"action-menu country-dropdown-list\"\n *ngIf=\"isExpanded\">\n <div class=\"action-menu-body\">\n <!--Country's List-->\n <a class=\"action-item\"\n *ngFor=\"let country of countryList\"\n [ngClass]=\"{'active': selectedCountry.countryName === country.countryName}\"\n (click)=\"countryChanged(country)\">\n <img class=\"country-flag\"\n [src]=\"country.flag\">\n <div>{{ country.countryName }}</div>\n <div>{{ country.countryCallingCode }}</div>\n </a>\n\n <!--Custom Country-->\n <a class=\"action-item\"\n [ngClass]=\"{'active': selectedCountry.countryName === customCountry.countryName}\"\n (click)=\"countryChanged(customCountry)\">\n <img class=\"country-flag\"\n [src]=\"customCountry.flag\">\n <div>{{ customCountry.countryName }}</div>\n <div>{{ customCountry.countryCallingCode }}</div>\n </a>\n </div>\n </div>\n</div>\n", styles: [".phone-input-component{position:relative;width:100%}.phone-input-component .material-input,.phone-input-component .zen-input{display:flex;align-items:center;gap:8px}.phone-input-component .material-input .country-select,.phone-input-component .zen-input .country-select{display:flex;align-items:center;gap:8px;cursor:pointer;-webkit-user-select:none;user-select:none;text-decoration:none;outline:none}.phone-input-component .material-input .country-select .expand-icon,.phone-input-component .zen-input .country-select .expand-icon{color:#60636c;transition:.3s}.phone-input-component .material-input .country-select .expand-icon.active,.phone-input-component .zen-input .country-select .expand-icon.active{color:#2188d9;transform:rotate(180deg)}.phone-input-component .material-input .country-select .code,.phone-input-component .zen-input .country-select .code{font-style:normal;font-weight:400;font-size:16px;line-height:24px;color:#333}.phone-input-component .material-input .country-select:focus .expand-icon,.phone-input-component .zen-input .country-select:focus .expand-icon{color:#2188d9}.phone-input-component .material-input .phone-input,.phone-input-component .zen-input .phone-input{flex:1;border:none;outline:none;font-style:normal;font-weight:400;font-size:16px;line-height:24px;color:#333;background:transparent}.phone-input-component .country-dropdown-list{width:inherit;margin-top:8px}\n"] }]
3107
+ args: [{ selector: 'zen-phone-input', template: "<div class=\"phone-input-component\" [style.width]=\"width\">\n <div class=\"material-input\">\n <a class=\"country-select\"\n (click)=\"toggle()\">\n <img class=\"country-flag\"\n [src]=\"selectedCountry.flag\">\n <i class=\"material-icons expand-icon\"\n [ngClass]=\"{'active': isExpanded}\">expand_less</i>\n <div class=\"code\">{{ selectedCountry.countryCallingCode }}</div>\n </a>\n <input class=\"phone-input\"\n type=\"text\"\n [(ngModel)]=\"phoneText\"\n (ngModelChange)=\"phoneChanged(input)\"\n (click)=\"isExpanded = false\"\n [disabled]=\"disabled\"\n country-code=\"selectedCountry.countryCode\"\n [maxlength]=\"maxLength\"\n #input>\n </div>\n\n <div class=\"action-menu country-dropdown-list\"\n *ngIf=\"isExpanded\">\n <div class=\"action-menu-body\">\n <!--Country's List-->\n <a class=\"action-item\"\n *ngFor=\"let country of countryList\"\n [ngClass]=\"{'active': selectedCountry.countryName === country.countryName}\"\n (click)=\"countryChanged(country)\">\n <img class=\"country-flag\"\n [src]=\"country.flag\">\n <div>{{ country.countryName }}</div>\n <div>{{ country.countryCallingCode }}</div>\n </a>\n\n <!--Custom Country-->\n <a class=\"action-item\"\n [ngClass]=\"{'active': selectedCountry.countryName === customCountry.countryName}\"\n (click)=\"countryChanged(customCountry)\">\n <img class=\"country-flag\"\n [src]=\"customCountry.flag\">\n <div>{{ customCountry.countryName }}</div>\n <div>{{ customCountry.countryCallingCode }}</div>\n </a>\n </div>\n </div>\n</div>\n", styles: [":host{display:block;overflow:visible}.phone-input-component{position:relative;width:100%}.phone-input-component .material-input,.phone-input-component .zen-input{display:flex;align-items:center;gap:4px;border:1px solid #D0D5DD;border-radius:10px;padding:8px 14px;background:#FFFFFF;transition:border-color .2s;box-sizing:border-box}.phone-input-component .material-input:focus-within,.phone-input-component .zen-input:focus-within{border-color:#2188d9;z-index:1;position:relative}.phone-input-component .material-input .country-select,.phone-input-component .zen-input .country-select{display:flex;align-items:center;gap:4px;cursor:pointer;-webkit-user-select:none;user-select:none;text-decoration:none;outline:none;flex-shrink:0}.phone-input-component .material-input .country-select .country-flag,.phone-input-component .zen-input .country-select .country-flag{width:24px;height:24px;object-fit:contain}.phone-input-component .material-input .country-select .expand-icon,.phone-input-component .zen-input .country-select .expand-icon{color:#2188d9;font-size:20px;transition:transform .3s}.phone-input-component .material-input .country-select .expand-icon.active,.phone-input-component .zen-input .country-select .expand-icon.active{transform:rotate(180deg)}.phone-input-component .material-input .country-select .code,.phone-input-component .zen-input .country-select .code{font-style:normal;font-weight:500;font-size:15px;line-height:24px;color:#333;min-width:32px}.phone-input-component .material-input .country-select:focus .expand-icon,.phone-input-component .zen-input .country-select:focus .expand-icon{color:#2188d9}.phone-input-component .material-input .phone-input,.phone-input-component .zen-input .phone-input{flex:1;border:none;outline:none;font-style:normal;font-weight:400;font-size:15px;line-height:24px;color:#333;background:transparent;min-width:0}.phone-input-component .country-dropdown-list{width:100%;margin-top:6px;border-radius:12px;box-shadow:0 2px 8px #0000000f,0 1px 3px #0000000a}.phone-input-component .country-dropdown-list .action-menu-body{padding:6px 0}.phone-input-component .country-dropdown-list .action-menu-body .action-item{padding:10px 16px;gap:12px;font-size:16px;font-weight:400;line-height:24px;color:#333}.phone-input-component .country-dropdown-list .action-menu-body .action-item .country-flag{width:28px;height:28px;border-radius:50%;object-fit:cover}.phone-input-component .country-dropdown-list .action-menu-body .action-item.active{background:#F0F4F8}.phone-input-component .country-dropdown-list .action-menu-body .action-item:hover{background:#F4F9FD}\n"] }]
3108
3108
  }], ctorParameters: function () { return []; }, propDecorators: { phone: [{
3109
3109
  type: Input
3110
3110
  }], maxLength: [{
@@ -3115,6 +3115,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
3115
3115
  type: Output
3116
3116
  }], disabled: [{
3117
3117
  type: Input
3118
+ }], width: [{
3119
+ type: Input
3118
3120
  }] } });
3119
3121
 
3120
3122
  class ZenduSortHeaderComponent {
@@ -5992,10 +5994,10 @@ class ZenduTimepickerComponent {
5992
5994
  }
5993
5995
  }
5994
5996
  ZenduTimepickerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduTimepickerComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
5995
- ZenduTimepickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: ZenduTimepickerComponent, selector: "zen-timepicker", inputs: { mode: "mode", label: "label", value: "value", showSeconds: "showSeconds", disabled: "disabled", readonly: "readonly", placeholder: "placeholder", width: "width" }, outputs: { valueChange: "valueChange", apply: "apply", clear: "clear" }, host: { listeners: { "window:mousedown": "outsideClick($event)" } }, viewQueries: [{ propertyName: "pickerPopup", first: true, predicate: ["pickerPopup"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"zen-tp\">\n <!-- Input toggle button -->\n <button class=\"zen-tp__toggle zen-tp__toggle--box\"\n [class.zen-tp__toggle--active]=\"isPickerVisible\"\n [class.zen-tp__toggle--disabled]=\"disabled\"\n [class.zen-tp__toggle--readonly]=\"readonly\"\n [style.width]=\"width || null\"\n [disabled]=\"disabled || readonly\"\n (click)=\"togglePicker()\">\n <span class=\"zen-tp__display\" [class.zen-tp__display--placeholder]=\"!value\">\n {{ value ? formattedDisplayValue : defaultPlaceholder }}\n </span>\n <zen-icon class=\"zen-tp__icon\"\n [class.zen-tp__icon--filled]=\"value\"\n src=\"assets/ng-zenduit/icons/time.svg\">\n </zen-icon>\n </button>\n\n <!-- Picker dropdown -->\n <div class=\"zen-tp__dropdown\"\n #pickerPopup\n *ngIf=\"isPickerVisible\"\n [class.zen-tp__dropdown--right]=\"right\"\n [class.zen-tp__dropdown--bottom]=\"bottom\">\n <div class=\"zen-tp__popup\">\n <!-- Header -->\n <div class=\"zen-tp__popup-label\">{{ label || defaultLabel }}</div>\n\n <!-- Scroll Columns -->\n <div class=\"zen-tp__columns\">\n <!-- Hours -->\n <div class=\"zen-tp__scroll-group\">\n <div class=\"zen-tp__scroll-col\"\n #scrollCol\n (scroll)=\"onScroll($event, 'hours')\"\n (mousedown)=\"onMouseDown($event, scrollCol)\"\n (mousemove)=\"onMouseMove($event, scrollCol)\"\n (mouseup)=\"onMouseUp()\"\n (mouseleave)=\"onMouseUp()\">\n <div class=\"zen-tp__scroll-spacer\"></div>\n <div *ngFor=\"let h of hours\"\n class=\"zen-tp__scroll-item\"\n [class.zen-tp__scroll-item--selected]=\"h === selectedHours\"\n (click)=\"selectHour(h)\">\n {{ formatNum(h) }}\n </div>\n <div class=\"zen-tp__scroll-spacer\"></div>\n </div>\n <div class=\"zen-tp__fade zen-tp__fade--top\"></div>\n <div class=\"zen-tp__fade zen-tp__fade--bottom\"></div>\n <div class=\"zen-tp__highlight\"></div>\n </div>\n\n <span class=\"zen-tp__separator\">{{ hourSeparator }}</span>\n\n <!-- Minutes -->\n <div class=\"zen-tp__scroll-group\">\n <div class=\"zen-tp__scroll-col\"\n #scrollCol\n (scroll)=\"onScroll($event, 'minutes')\"\n (mousedown)=\"onMouseDown($event, scrollCol)\"\n (mousemove)=\"onMouseMove($event, scrollCol)\"\n (mouseup)=\"onMouseUp()\"\n (mouseleave)=\"onMouseUp()\">\n <div class=\"zen-tp__scroll-spacer\"></div>\n <div *ngFor=\"let m of minutes\"\n class=\"zen-tp__scroll-item\"\n [class.zen-tp__scroll-item--selected]=\"m === selectedMinutes\"\n (click)=\"selectMinute(m)\">\n {{ formatNum(m) }}\n </div>\n <div class=\"zen-tp__scroll-spacer\"></div>\n </div>\n <div class=\"zen-tp__fade zen-tp__fade--top\"></div>\n <div class=\"zen-tp__fade zen-tp__fade--bottom\"></div>\n <div class=\"zen-tp__highlight\"></div>\n </div>\n\n <span class=\"zen-tp__separator\" *ngIf=\"showSeconds && mode === 'clock'\">:</span>\n <span class=\"zen-tp__separator zen-tp__separator--unit\" *ngIf=\"mode === 'duration'\">min</span>\n\n <!-- Seconds -->\n <div class=\"zen-tp__scroll-group\" *ngIf=\"showSeconds\">\n <div class=\"zen-tp__scroll-col\"\n #scrollCol\n (scroll)=\"onScroll($event, 'seconds')\"\n (mousedown)=\"onMouseDown($event, scrollCol)\"\n (mousemove)=\"onMouseMove($event, scrollCol)\"\n (mouseup)=\"onMouseUp()\"\n (mouseleave)=\"onMouseUp()\">\n <div class=\"zen-tp__scroll-spacer\"></div>\n <div *ngFor=\"let s of seconds\"\n class=\"zen-tp__scroll-item\"\n [class.zen-tp__scroll-item--selected]=\"s === selectedSeconds\"\n (click)=\"selectSecond(s)\">\n {{ formatNum(s) }}\n </div>\n <div class=\"zen-tp__scroll-spacer\"></div>\n </div>\n <div class=\"zen-tp__fade zen-tp__fade--top\"></div>\n <div class=\"zen-tp__fade zen-tp__fade--bottom\"></div>\n <div class=\"zen-tp__highlight\"></div>\n </div>\n\n <span class=\"zen-tp__separator zen-tp__separator--unit\"\n *ngIf=\"mode === 'duration' && showSeconds\">\n sec\n </span>\n\n <!-- AM/PM Toggle (Clock mode only) -->\n <div class=\"zen-tp__period\" *ngIf=\"mode === 'clock'\">\n <button class=\"zen-tp__period-btn\"\n [class.zen-tp__period-btn--active]=\"selectedPeriod === 'AM'\"\n (click)=\"selectPeriod('AM')\">\n AM\n </button>\n <button class=\"zen-tp__period-btn\"\n [class.zen-tp__period-btn--active]=\"selectedPeriod === 'PM'\"\n (click)=\"selectPeriod('PM')\">\n PM\n </button>\n </div>\n </div>\n\n <!-- Divider -->\n <div class=\"zen-tp__divider\"></div>\n\n <!-- Actions -->\n <div class=\"zen-tp__actions\" [class.zen-tp__actions--full]=\"mode === 'duration'\">\n <button class=\"zen-tp__btn zen-tp__btn--clear\" (click)=\"onClear()\">Clear</button>\n <button class=\"zen-tp__btn zen-tp__btn--apply\" (click)=\"onApply()\">Apply</button>\n </div>\n </div>\n </div>\n</div>\n", styles: [":host{display:inline-block;position:relative;width:100%}.zen-tp{width:100%;position:relative}.zen-tp *{box-sizing:border-box}.zen-tp__toggle{display:inline-flex;align-items:center;gap:8px;min-width:150px;transition:.3s;background:var(--color-white-primary, #ffffff);-webkit-appearance:none;appearance:none;outline:none;cursor:pointer;border:none;border-radius:0;border-bottom:1px solid var(--color-white-tint-4, #d6d6d8);padding:0 0 8px;font-size:16px;font-weight:400;line-height:130%;color:var(--color-grey-primary, #4f4f4f)}.zen-tp__toggle--box{border:1px solid #d0d5dd;border-radius:8px;padding:10px 14px;gap:8px}.zen-tp__toggle:hover{border-color:#667085}.zen-tp__toggle:focus,.zen-tp__toggle--active{border-color:#136ab6;box-shadow:0 0 0 3px #136ab61f}.zen-tp__toggle--disabled{cursor:not-allowed;border-color:var(--color-white-tint-3, #e0e0e0)}.zen-tp__toggle--disabled .zen-tp__display{color:var(--color-white-tint-3, #e0e0e0)!important}.zen-tp__toggle--disabled .zen-tp__icon{background-color:var(--color-white-tint-3, #e0e0e0)!important}.zen-tp__toggle--readonly{cursor:default;border-color:var(--color-white-tint-3, #e0e0e0)}.zen-tp__toggle--readonly .zen-tp__display{color:var(--color-white-tint-3, #e0e0e0)!important}.zen-tp__toggle--readonly .zen-tp__icon{background-color:var(--color-white-tint-3, #e0e0e0)!important}.zen-tp__display{flex:1;text-align:left;font-size:16px;font-weight:400;line-height:24px;color:#1d2939}.zen-tp__display--placeholder{color:#667085}.zen-tp__icon{width:20px;height:20px;flex-shrink:0;background-color:#667085;transition:.2s}.zen-tp__icon--filled{background-color:#344054}.zen-tp__dropdown{position:absolute;top:100%;left:0;z-index:1000;margin-top:4px}.zen-tp__dropdown--right{left:auto;right:0}.zen-tp__dropdown--bottom{top:auto;bottom:100%;margin-top:0;margin-bottom:4px}.zen-tp__popup{background:#ffffff;border-radius:8px;box-shadow:0 8px 8px -4px #10182808,0 20px 24px -4px #10182814;padding:16px;display:flex;flex-direction:column;gap:16px;align-items:flex-end;font-family:inherit}.zen-tp__popup-label{width:100%;font-size:14px;font-weight:500;line-height:20px;color:#1d2939}.zen-tp__columns{display:flex;align-items:center;gap:24px}.zen-tp__scroll-group{position:relative;width:38px;height:126px;overflow:hidden}.zen-tp__scroll-col{width:100%;height:100%;overflow-y:auto;scroll-snap-type:y mandatory;-ms-overflow-style:none;scrollbar-width:none;cursor:grab;-webkit-user-select:none;user-select:none}.zen-tp__scroll-col::-webkit-scrollbar{display:none}.zen-tp__scroll-col:active{cursor:grabbing}.zen-tp__scroll-spacer{height:42px;flex-shrink:0}.zen-tp__scroll-item{height:42px;display:flex;align-items:center;justify-content:center;font-size:16px;font-weight:500;line-height:24px;color:#1d2939;scroll-snap-align:center;cursor:pointer;transition:opacity .15s ease;opacity:.4;position:relative;z-index:1}.zen-tp__scroll-item--selected{opacity:1}.zen-tp__highlight{position:absolute;top:50%;left:0;right:0;height:42px;transform:translateY(-50%);background:#f2f4f7;border-radius:8px;pointer-events:none;z-index:0}.zen-tp__fade{position:absolute;left:0;right:0;height:44px;pointer-events:none;z-index:2}.zen-tp__fade--top{top:0;background:linear-gradient(to bottom,#ffffff,rgba(255,255,255,0))}.zen-tp__fade--bottom{bottom:0;background:linear-gradient(to top,#ffffff,rgba(255,255,255,0))}.zen-tp__separator{font-size:14px;font-weight:500;line-height:20px;color:#667085;flex-shrink:0;-webkit-user-select:none;user-select:none}.zen-tp__period{display:flex;flex-direction:column;gap:16px;flex-shrink:0}.zen-tp__period-btn{display:flex;align-items:center;justify-content:center;padding:8px 14px;border-radius:8px;font-size:14px;font-weight:500;line-height:20px;cursor:pointer;transition:all .15s ease;white-space:nowrap;border:1px solid #d0d5dd;background:#ffffff;color:#344054;box-shadow:0 1px 2px #1018280d}.zen-tp__period-btn:hover{background:#fafafa}.zen-tp__period-btn--active{background:#f1f7fe;border-color:#f1f7fe;color:#105494}.zen-tp__period-btn--active:hover{background:#e7f2fd}.zen-tp__divider{width:100%;height:1px;background:#eaecf0}.zen-tp__actions{display:flex;gap:12px}.zen-tp__actions--full{width:100%}.zen-tp__actions--full .zen-tp__btn{flex:1}.zen-tp__btn{display:flex;align-items:center;justify-content:center;padding:8px 14px;border-radius:8px;font-size:14px;font-weight:500;line-height:20px;cursor:pointer;transition:all .15s ease;white-space:nowrap;box-shadow:0 1px 2px #1018280d}.zen-tp__btn--clear{background:#ffffff;border:1px solid #d0d5dd;color:#344054}.zen-tp__btn--clear:hover{background:#fafafa}.zen-tp__btn--apply{background:#136ab6;border:1px solid #136ab6;color:#fff}.zen-tp__btn--apply:hover{background:#115d9f}\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: ZenduIconComponent, selector: "zen-icon", inputs: ["src"] }] });
5997
+ ZenduTimepickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: ZenduTimepickerComponent, selector: "zen-timepicker", inputs: { mode: "mode", label: "label", value: "value", showSeconds: "showSeconds", disabled: "disabled", readonly: "readonly", placeholder: "placeholder", width: "width" }, outputs: { valueChange: "valueChange", apply: "apply", clear: "clear" }, host: { listeners: { "window:mousedown": "outsideClick($event)" } }, viewQueries: [{ propertyName: "pickerPopup", first: true, predicate: ["pickerPopup"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"zen-tp\">\n <!-- Input toggle button -->\n <button class=\"zen-tp__toggle zen-tp__toggle--box\"\n [class.zen-tp__toggle--active]=\"isPickerVisible\"\n [class.zen-tp__toggle--disabled]=\"disabled\"\n [class.zen-tp__toggle--readonly]=\"readonly\"\n [style.width]=\"width || null\"\n [disabled]=\"disabled || readonly\"\n (click)=\"togglePicker()\">\n <span class=\"zen-tp__display\" [class.zen-tp__display--placeholder]=\"!value\">\n {{ value ? formattedDisplayValue : defaultPlaceholder }}\n </span>\n <zen-icon class=\"zen-tp__icon\"\n [class.zen-tp__icon--filled]=\"value\"\n src=\"assets/ng-zenduit/icons/time.svg\">\n </zen-icon>\n </button>\n\n <!-- Picker dropdown -->\n <div class=\"zen-tp__dropdown\"\n #pickerPopup\n *ngIf=\"isPickerVisible\"\n [class.zen-tp__dropdown--right]=\"right\"\n [class.zen-tp__dropdown--bottom]=\"bottom\">\n <div class=\"zen-tp__popup\">\n <!-- Header -->\n <div class=\"zen-tp__popup-label\">{{ label || defaultLabel }}</div>\n\n <!-- Scroll Columns -->\n <div class=\"zen-tp__columns\">\n <!-- Hours -->\n <div class=\"zen-tp__scroll-group\">\n <div class=\"zen-tp__scroll-col\"\n #scrollCol\n (scroll)=\"onScroll($event, 'hours')\"\n (mousedown)=\"onMouseDown($event, scrollCol)\"\n (mousemove)=\"onMouseMove($event, scrollCol)\"\n (mouseup)=\"onMouseUp()\"\n (mouseleave)=\"onMouseUp()\">\n <div class=\"zen-tp__scroll-spacer\"></div>\n <div *ngFor=\"let h of hours\"\n class=\"zen-tp__scroll-item\"\n [class.zen-tp__scroll-item--selected]=\"h === selectedHours\"\n (click)=\"selectHour(h)\">\n {{ formatNum(h) }}\n </div>\n <div class=\"zen-tp__scroll-spacer\"></div>\n </div>\n <div class=\"zen-tp__fade zen-tp__fade--top\"></div>\n <div class=\"zen-tp__fade zen-tp__fade--bottom\"></div>\n <div class=\"zen-tp__highlight\"></div>\n </div>\n\n <span class=\"zen-tp__separator\">{{ hourSeparator }}</span>\n\n <!-- Minutes -->\n <div class=\"zen-tp__scroll-group\">\n <div class=\"zen-tp__scroll-col\"\n #scrollCol\n (scroll)=\"onScroll($event, 'minutes')\"\n (mousedown)=\"onMouseDown($event, scrollCol)\"\n (mousemove)=\"onMouseMove($event, scrollCol)\"\n (mouseup)=\"onMouseUp()\"\n (mouseleave)=\"onMouseUp()\">\n <div class=\"zen-tp__scroll-spacer\"></div>\n <div *ngFor=\"let m of minutes\"\n class=\"zen-tp__scroll-item\"\n [class.zen-tp__scroll-item--selected]=\"m === selectedMinutes\"\n (click)=\"selectMinute(m)\">\n {{ formatNum(m) }}\n </div>\n <div class=\"zen-tp__scroll-spacer\"></div>\n </div>\n <div class=\"zen-tp__fade zen-tp__fade--top\"></div>\n <div class=\"zen-tp__fade zen-tp__fade--bottom\"></div>\n <div class=\"zen-tp__highlight\"></div>\n </div>\n\n <span class=\"zen-tp__separator\" *ngIf=\"showSeconds && mode === 'clock'\">:</span>\n <span class=\"zen-tp__separator zen-tp__separator--unit\" *ngIf=\"mode === 'duration'\">min</span>\n\n <!-- Seconds -->\n <div class=\"zen-tp__scroll-group\" *ngIf=\"showSeconds\">\n <div class=\"zen-tp__scroll-col\"\n #scrollCol\n (scroll)=\"onScroll($event, 'seconds')\"\n (mousedown)=\"onMouseDown($event, scrollCol)\"\n (mousemove)=\"onMouseMove($event, scrollCol)\"\n (mouseup)=\"onMouseUp()\"\n (mouseleave)=\"onMouseUp()\">\n <div class=\"zen-tp__scroll-spacer\"></div>\n <div *ngFor=\"let s of seconds\"\n class=\"zen-tp__scroll-item\"\n [class.zen-tp__scroll-item--selected]=\"s === selectedSeconds\"\n (click)=\"selectSecond(s)\">\n {{ formatNum(s) }}\n </div>\n <div class=\"zen-tp__scroll-spacer\"></div>\n </div>\n <div class=\"zen-tp__fade zen-tp__fade--top\"></div>\n <div class=\"zen-tp__fade zen-tp__fade--bottom\"></div>\n <div class=\"zen-tp__highlight\"></div>\n </div>\n\n <span class=\"zen-tp__separator zen-tp__separator--unit\"\n *ngIf=\"mode === 'duration' && showSeconds\">\n sec\n </span>\n\n <!-- AM/PM Toggle (Clock mode only) -->\n <div class=\"zen-tp__period\" *ngIf=\"mode === 'clock'\">\n <button class=\"zen-tp__period-btn\"\n [class.zen-tp__period-btn--active]=\"selectedPeriod === 'AM'\"\n (click)=\"selectPeriod('AM')\">\n AM\n </button>\n <button class=\"zen-tp__period-btn\"\n [class.zen-tp__period-btn--active]=\"selectedPeriod === 'PM'\"\n (click)=\"selectPeriod('PM')\">\n PM\n </button>\n </div>\n </div>\n\n <!-- Divider -->\n <div class=\"zen-tp__divider\"></div>\n\n <!-- Actions -->\n <div class=\"zen-tp__actions\" [class.zen-tp__actions--full]=\"mode === 'duration'\">\n <button class=\"zen-tp__btn zen-tp__btn--clear\" (click)=\"onClear()\">Clear</button>\n <button class=\"zen-tp__btn zen-tp__btn--apply\" (click)=\"onApply()\">Apply</button>\n </div>\n </div>\n </div>\n</div>\n", styles: [":host{display:inline-block;position:relative;width:100%}.zen-tp{width:100%;position:relative}.zen-tp *{box-sizing:border-box}.zen-tp__toggle{display:inline-flex;align-items:center;gap:8px;min-width:150px;transition:.3s;background:var(--color-white-primary, #ffffff);-webkit-appearance:none;appearance:none;outline:none;cursor:pointer;border:none;border-radius:0;border-bottom:1px solid var(--color-white-tint-4, #d6d6d8);padding:0 0 8px;font-size:16px;font-weight:400;line-height:130%;color:var(--color-grey-primary, #4f4f4f)}.zen-tp__toggle--box{border:1px solid #D0D5DD;border-radius:8px;padding:10px 14px;gap:8px}.zen-tp__toggle:hover{border-color:#667085}.zen-tp__toggle:focus,.zen-tp__toggle--active{border-color:#136ab6;box-shadow:0 0 0 3px #136ab61f}.zen-tp__toggle--disabled{cursor:not-allowed;border-color:var(--color-white-tint-3, #e0e0e0)}.zen-tp__toggle--disabled .zen-tp__display{color:var(--color-white-tint-3, #e0e0e0)!important}.zen-tp__toggle--disabled .zen-tp__icon{background-color:var(--color-white-tint-3, #e0e0e0)!important}.zen-tp__toggle--readonly{cursor:default;border-color:var(--color-white-tint-3, #e0e0e0)}.zen-tp__toggle--readonly .zen-tp__display{color:var(--color-white-tint-3, #e0e0e0)!important}.zen-tp__toggle--readonly .zen-tp__icon{background-color:var(--color-white-tint-3, #e0e0e0)!important}.zen-tp__display{flex:1;text-align:left;font-size:16px;font-weight:400;line-height:24px;color:#1d2939}.zen-tp__display--placeholder{color:#667085}.zen-tp__icon{width:20px;height:20px;flex-shrink:0;background-color:#667085;transition:.2s}.zen-tp__icon--filled{background-color:#344054}.zen-tp__dropdown{position:absolute;top:100%;left:0;z-index:1000;margin-top:4px}.zen-tp__dropdown--right{left:auto;right:0}.zen-tp__dropdown--bottom{top:auto;bottom:100%;margin-top:0;margin-bottom:4px}.zen-tp__popup{background:#FFFFFF;border-radius:8px;box-shadow:0 8px 8px -4px #10182808,0 20px 24px -4px #10182814;padding:16px;display:flex;flex-direction:column;gap:16px;align-items:flex-end;font-family:inherit}.zen-tp__popup-label{width:100%;font-size:14px;font-weight:500;line-height:20px;color:#1d2939}.zen-tp__columns{display:flex;align-items:center;gap:24px}.zen-tp__scroll-group{position:relative;width:38px;height:126px;overflow:hidden}.zen-tp__scroll-col{width:100%;height:100%;overflow-y:auto;scroll-snap-type:y mandatory;-ms-overflow-style:none;scrollbar-width:none;cursor:grab;-webkit-user-select:none;user-select:none}.zen-tp__scroll-col::-webkit-scrollbar{display:none}.zen-tp__scroll-col:active{cursor:grabbing}.zen-tp__scroll-spacer{height:42px;flex-shrink:0}.zen-tp__scroll-item{height:42px;display:flex;align-items:center;justify-content:center;font-size:16px;font-weight:500;line-height:24px;color:#1d2939;scroll-snap-align:center;cursor:pointer;transition:opacity .15s ease;opacity:.4;position:relative;z-index:1}.zen-tp__scroll-item--selected{opacity:1}.zen-tp__highlight{position:absolute;top:50%;left:0;right:0;height:42px;transform:translateY(-50%);background:#F2F4F7;border-radius:8px;pointer-events:none;z-index:0}.zen-tp__fade{position:absolute;left:0;right:0;height:44px;pointer-events:none;z-index:2}.zen-tp__fade--top{top:0;background:linear-gradient(to bottom,#FFFFFF,rgba(255,255,255,0))}.zen-tp__fade--bottom{bottom:0;background:linear-gradient(to top,#FFFFFF,rgba(255,255,255,0))}.zen-tp__separator{font-size:14px;font-weight:500;line-height:20px;color:#667085;flex-shrink:0;-webkit-user-select:none;user-select:none}.zen-tp__period{display:flex;flex-direction:column;gap:16px;flex-shrink:0}.zen-tp__period-btn{display:flex;align-items:center;justify-content:center;padding:8px 14px;border-radius:8px;font-size:14px;font-weight:500;line-height:20px;cursor:pointer;transition:all .15s ease;white-space:nowrap;border:1px solid #D0D5DD;background:#FFFFFF;color:#344054;box-shadow:0 1px 2px #1018280d}.zen-tp__period-btn:hover{background:#fafafa}.zen-tp__period-btn--active{background:#F1F7FE;border-color:#f1f7fe;color:#105494}.zen-tp__period-btn--active:hover{background:#e7f2fd}.zen-tp__divider{width:100%;height:1px;background:#EAECF0}.zen-tp__actions{display:flex;gap:12px}.zen-tp__actions--full{width:100%}.zen-tp__actions--full .zen-tp__btn{flex:1}.zen-tp__btn{display:flex;align-items:center;justify-content:center;padding:8px 14px;border-radius:8px;font-size:14px;font-weight:500;line-height:20px;cursor:pointer;transition:all .15s ease;white-space:nowrap;box-shadow:0 1px 2px #1018280d}.zen-tp__btn--clear{background:#FFFFFF;border:1px solid #D0D5DD;color:#344054}.zen-tp__btn--clear:hover{background:#fafafa}.zen-tp__btn--apply{background:#136AB6;border:1px solid #136AB6;color:#fff}.zen-tp__btn--apply:hover{background:#115d9f}\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: ZenduIconComponent, selector: "zen-icon", inputs: ["src"] }] });
5996
5998
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduTimepickerComponent, decorators: [{
5997
5999
  type: Component,
5998
- args: [{ selector: 'zen-timepicker', template: "<div class=\"zen-tp\">\n <!-- Input toggle button -->\n <button class=\"zen-tp__toggle zen-tp__toggle--box\"\n [class.zen-tp__toggle--active]=\"isPickerVisible\"\n [class.zen-tp__toggle--disabled]=\"disabled\"\n [class.zen-tp__toggle--readonly]=\"readonly\"\n [style.width]=\"width || null\"\n [disabled]=\"disabled || readonly\"\n (click)=\"togglePicker()\">\n <span class=\"zen-tp__display\" [class.zen-tp__display--placeholder]=\"!value\">\n {{ value ? formattedDisplayValue : defaultPlaceholder }}\n </span>\n <zen-icon class=\"zen-tp__icon\"\n [class.zen-tp__icon--filled]=\"value\"\n src=\"assets/ng-zenduit/icons/time.svg\">\n </zen-icon>\n </button>\n\n <!-- Picker dropdown -->\n <div class=\"zen-tp__dropdown\"\n #pickerPopup\n *ngIf=\"isPickerVisible\"\n [class.zen-tp__dropdown--right]=\"right\"\n [class.zen-tp__dropdown--bottom]=\"bottom\">\n <div class=\"zen-tp__popup\">\n <!-- Header -->\n <div class=\"zen-tp__popup-label\">{{ label || defaultLabel }}</div>\n\n <!-- Scroll Columns -->\n <div class=\"zen-tp__columns\">\n <!-- Hours -->\n <div class=\"zen-tp__scroll-group\">\n <div class=\"zen-tp__scroll-col\"\n #scrollCol\n (scroll)=\"onScroll($event, 'hours')\"\n (mousedown)=\"onMouseDown($event, scrollCol)\"\n (mousemove)=\"onMouseMove($event, scrollCol)\"\n (mouseup)=\"onMouseUp()\"\n (mouseleave)=\"onMouseUp()\">\n <div class=\"zen-tp__scroll-spacer\"></div>\n <div *ngFor=\"let h of hours\"\n class=\"zen-tp__scroll-item\"\n [class.zen-tp__scroll-item--selected]=\"h === selectedHours\"\n (click)=\"selectHour(h)\">\n {{ formatNum(h) }}\n </div>\n <div class=\"zen-tp__scroll-spacer\"></div>\n </div>\n <div class=\"zen-tp__fade zen-tp__fade--top\"></div>\n <div class=\"zen-tp__fade zen-tp__fade--bottom\"></div>\n <div class=\"zen-tp__highlight\"></div>\n </div>\n\n <span class=\"zen-tp__separator\">{{ hourSeparator }}</span>\n\n <!-- Minutes -->\n <div class=\"zen-tp__scroll-group\">\n <div class=\"zen-tp__scroll-col\"\n #scrollCol\n (scroll)=\"onScroll($event, 'minutes')\"\n (mousedown)=\"onMouseDown($event, scrollCol)\"\n (mousemove)=\"onMouseMove($event, scrollCol)\"\n (mouseup)=\"onMouseUp()\"\n (mouseleave)=\"onMouseUp()\">\n <div class=\"zen-tp__scroll-spacer\"></div>\n <div *ngFor=\"let m of minutes\"\n class=\"zen-tp__scroll-item\"\n [class.zen-tp__scroll-item--selected]=\"m === selectedMinutes\"\n (click)=\"selectMinute(m)\">\n {{ formatNum(m) }}\n </div>\n <div class=\"zen-tp__scroll-spacer\"></div>\n </div>\n <div class=\"zen-tp__fade zen-tp__fade--top\"></div>\n <div class=\"zen-tp__fade zen-tp__fade--bottom\"></div>\n <div class=\"zen-tp__highlight\"></div>\n </div>\n\n <span class=\"zen-tp__separator\" *ngIf=\"showSeconds && mode === 'clock'\">:</span>\n <span class=\"zen-tp__separator zen-tp__separator--unit\" *ngIf=\"mode === 'duration'\">min</span>\n\n <!-- Seconds -->\n <div class=\"zen-tp__scroll-group\" *ngIf=\"showSeconds\">\n <div class=\"zen-tp__scroll-col\"\n #scrollCol\n (scroll)=\"onScroll($event, 'seconds')\"\n (mousedown)=\"onMouseDown($event, scrollCol)\"\n (mousemove)=\"onMouseMove($event, scrollCol)\"\n (mouseup)=\"onMouseUp()\"\n (mouseleave)=\"onMouseUp()\">\n <div class=\"zen-tp__scroll-spacer\"></div>\n <div *ngFor=\"let s of seconds\"\n class=\"zen-tp__scroll-item\"\n [class.zen-tp__scroll-item--selected]=\"s === selectedSeconds\"\n (click)=\"selectSecond(s)\">\n {{ formatNum(s) }}\n </div>\n <div class=\"zen-tp__scroll-spacer\"></div>\n </div>\n <div class=\"zen-tp__fade zen-tp__fade--top\"></div>\n <div class=\"zen-tp__fade zen-tp__fade--bottom\"></div>\n <div class=\"zen-tp__highlight\"></div>\n </div>\n\n <span class=\"zen-tp__separator zen-tp__separator--unit\"\n *ngIf=\"mode === 'duration' && showSeconds\">\n sec\n </span>\n\n <!-- AM/PM Toggle (Clock mode only) -->\n <div class=\"zen-tp__period\" *ngIf=\"mode === 'clock'\">\n <button class=\"zen-tp__period-btn\"\n [class.zen-tp__period-btn--active]=\"selectedPeriod === 'AM'\"\n (click)=\"selectPeriod('AM')\">\n AM\n </button>\n <button class=\"zen-tp__period-btn\"\n [class.zen-tp__period-btn--active]=\"selectedPeriod === 'PM'\"\n (click)=\"selectPeriod('PM')\">\n PM\n </button>\n </div>\n </div>\n\n <!-- Divider -->\n <div class=\"zen-tp__divider\"></div>\n\n <!-- Actions -->\n <div class=\"zen-tp__actions\" [class.zen-tp__actions--full]=\"mode === 'duration'\">\n <button class=\"zen-tp__btn zen-tp__btn--clear\" (click)=\"onClear()\">Clear</button>\n <button class=\"zen-tp__btn zen-tp__btn--apply\" (click)=\"onApply()\">Apply</button>\n </div>\n </div>\n </div>\n</div>\n", styles: [":host{display:inline-block;position:relative;width:100%}.zen-tp{width:100%;position:relative}.zen-tp *{box-sizing:border-box}.zen-tp__toggle{display:inline-flex;align-items:center;gap:8px;min-width:150px;transition:.3s;background:var(--color-white-primary, #ffffff);-webkit-appearance:none;appearance:none;outline:none;cursor:pointer;border:none;border-radius:0;border-bottom:1px solid var(--color-white-tint-4, #d6d6d8);padding:0 0 8px;font-size:16px;font-weight:400;line-height:130%;color:var(--color-grey-primary, #4f4f4f)}.zen-tp__toggle--box{border:1px solid #d0d5dd;border-radius:8px;padding:10px 14px;gap:8px}.zen-tp__toggle:hover{border-color:#667085}.zen-tp__toggle:focus,.zen-tp__toggle--active{border-color:#136ab6;box-shadow:0 0 0 3px #136ab61f}.zen-tp__toggle--disabled{cursor:not-allowed;border-color:var(--color-white-tint-3, #e0e0e0)}.zen-tp__toggle--disabled .zen-tp__display{color:var(--color-white-tint-3, #e0e0e0)!important}.zen-tp__toggle--disabled .zen-tp__icon{background-color:var(--color-white-tint-3, #e0e0e0)!important}.zen-tp__toggle--readonly{cursor:default;border-color:var(--color-white-tint-3, #e0e0e0)}.zen-tp__toggle--readonly .zen-tp__display{color:var(--color-white-tint-3, #e0e0e0)!important}.zen-tp__toggle--readonly .zen-tp__icon{background-color:var(--color-white-tint-3, #e0e0e0)!important}.zen-tp__display{flex:1;text-align:left;font-size:16px;font-weight:400;line-height:24px;color:#1d2939}.zen-tp__display--placeholder{color:#667085}.zen-tp__icon{width:20px;height:20px;flex-shrink:0;background-color:#667085;transition:.2s}.zen-tp__icon--filled{background-color:#344054}.zen-tp__dropdown{position:absolute;top:100%;left:0;z-index:1000;margin-top:4px}.zen-tp__dropdown--right{left:auto;right:0}.zen-tp__dropdown--bottom{top:auto;bottom:100%;margin-top:0;margin-bottom:4px}.zen-tp__popup{background:#ffffff;border-radius:8px;box-shadow:0 8px 8px -4px #10182808,0 20px 24px -4px #10182814;padding:16px;display:flex;flex-direction:column;gap:16px;align-items:flex-end;font-family:inherit}.zen-tp__popup-label{width:100%;font-size:14px;font-weight:500;line-height:20px;color:#1d2939}.zen-tp__columns{display:flex;align-items:center;gap:24px}.zen-tp__scroll-group{position:relative;width:38px;height:126px;overflow:hidden}.zen-tp__scroll-col{width:100%;height:100%;overflow-y:auto;scroll-snap-type:y mandatory;-ms-overflow-style:none;scrollbar-width:none;cursor:grab;-webkit-user-select:none;user-select:none}.zen-tp__scroll-col::-webkit-scrollbar{display:none}.zen-tp__scroll-col:active{cursor:grabbing}.zen-tp__scroll-spacer{height:42px;flex-shrink:0}.zen-tp__scroll-item{height:42px;display:flex;align-items:center;justify-content:center;font-size:16px;font-weight:500;line-height:24px;color:#1d2939;scroll-snap-align:center;cursor:pointer;transition:opacity .15s ease;opacity:.4;position:relative;z-index:1}.zen-tp__scroll-item--selected{opacity:1}.zen-tp__highlight{position:absolute;top:50%;left:0;right:0;height:42px;transform:translateY(-50%);background:#f2f4f7;border-radius:8px;pointer-events:none;z-index:0}.zen-tp__fade{position:absolute;left:0;right:0;height:44px;pointer-events:none;z-index:2}.zen-tp__fade--top{top:0;background:linear-gradient(to bottom,#ffffff,rgba(255,255,255,0))}.zen-tp__fade--bottom{bottom:0;background:linear-gradient(to top,#ffffff,rgba(255,255,255,0))}.zen-tp__separator{font-size:14px;font-weight:500;line-height:20px;color:#667085;flex-shrink:0;-webkit-user-select:none;user-select:none}.zen-tp__period{display:flex;flex-direction:column;gap:16px;flex-shrink:0}.zen-tp__period-btn{display:flex;align-items:center;justify-content:center;padding:8px 14px;border-radius:8px;font-size:14px;font-weight:500;line-height:20px;cursor:pointer;transition:all .15s ease;white-space:nowrap;border:1px solid #d0d5dd;background:#ffffff;color:#344054;box-shadow:0 1px 2px #1018280d}.zen-tp__period-btn:hover{background:#fafafa}.zen-tp__period-btn--active{background:#f1f7fe;border-color:#f1f7fe;color:#105494}.zen-tp__period-btn--active:hover{background:#e7f2fd}.zen-tp__divider{width:100%;height:1px;background:#eaecf0}.zen-tp__actions{display:flex;gap:12px}.zen-tp__actions--full{width:100%}.zen-tp__actions--full .zen-tp__btn{flex:1}.zen-tp__btn{display:flex;align-items:center;justify-content:center;padding:8px 14px;border-radius:8px;font-size:14px;font-weight:500;line-height:20px;cursor:pointer;transition:all .15s ease;white-space:nowrap;box-shadow:0 1px 2px #1018280d}.zen-tp__btn--clear{background:#ffffff;border:1px solid #d0d5dd;color:#344054}.zen-tp__btn--clear:hover{background:#fafafa}.zen-tp__btn--apply{background:#136ab6;border:1px solid #136ab6;color:#fff}.zen-tp__btn--apply:hover{background:#115d9f}\n"] }]
6000
+ args: [{ selector: 'zen-timepicker', template: "<div class=\"zen-tp\">\n <!-- Input toggle button -->\n <button class=\"zen-tp__toggle zen-tp__toggle--box\"\n [class.zen-tp__toggle--active]=\"isPickerVisible\"\n [class.zen-tp__toggle--disabled]=\"disabled\"\n [class.zen-tp__toggle--readonly]=\"readonly\"\n [style.width]=\"width || null\"\n [disabled]=\"disabled || readonly\"\n (click)=\"togglePicker()\">\n <span class=\"zen-tp__display\" [class.zen-tp__display--placeholder]=\"!value\">\n {{ value ? formattedDisplayValue : defaultPlaceholder }}\n </span>\n <zen-icon class=\"zen-tp__icon\"\n [class.zen-tp__icon--filled]=\"value\"\n src=\"assets/ng-zenduit/icons/time.svg\">\n </zen-icon>\n </button>\n\n <!-- Picker dropdown -->\n <div class=\"zen-tp__dropdown\"\n #pickerPopup\n *ngIf=\"isPickerVisible\"\n [class.zen-tp__dropdown--right]=\"right\"\n [class.zen-tp__dropdown--bottom]=\"bottom\">\n <div class=\"zen-tp__popup\">\n <!-- Header -->\n <div class=\"zen-tp__popup-label\">{{ label || defaultLabel }}</div>\n\n <!-- Scroll Columns -->\n <div class=\"zen-tp__columns\">\n <!-- Hours -->\n <div class=\"zen-tp__scroll-group\">\n <div class=\"zen-tp__scroll-col\"\n #scrollCol\n (scroll)=\"onScroll($event, 'hours')\"\n (mousedown)=\"onMouseDown($event, scrollCol)\"\n (mousemove)=\"onMouseMove($event, scrollCol)\"\n (mouseup)=\"onMouseUp()\"\n (mouseleave)=\"onMouseUp()\">\n <div class=\"zen-tp__scroll-spacer\"></div>\n <div *ngFor=\"let h of hours\"\n class=\"zen-tp__scroll-item\"\n [class.zen-tp__scroll-item--selected]=\"h === selectedHours\"\n (click)=\"selectHour(h)\">\n {{ formatNum(h) }}\n </div>\n <div class=\"zen-tp__scroll-spacer\"></div>\n </div>\n <div class=\"zen-tp__fade zen-tp__fade--top\"></div>\n <div class=\"zen-tp__fade zen-tp__fade--bottom\"></div>\n <div class=\"zen-tp__highlight\"></div>\n </div>\n\n <span class=\"zen-tp__separator\">{{ hourSeparator }}</span>\n\n <!-- Minutes -->\n <div class=\"zen-tp__scroll-group\">\n <div class=\"zen-tp__scroll-col\"\n #scrollCol\n (scroll)=\"onScroll($event, 'minutes')\"\n (mousedown)=\"onMouseDown($event, scrollCol)\"\n (mousemove)=\"onMouseMove($event, scrollCol)\"\n (mouseup)=\"onMouseUp()\"\n (mouseleave)=\"onMouseUp()\">\n <div class=\"zen-tp__scroll-spacer\"></div>\n <div *ngFor=\"let m of minutes\"\n class=\"zen-tp__scroll-item\"\n [class.zen-tp__scroll-item--selected]=\"m === selectedMinutes\"\n (click)=\"selectMinute(m)\">\n {{ formatNum(m) }}\n </div>\n <div class=\"zen-tp__scroll-spacer\"></div>\n </div>\n <div class=\"zen-tp__fade zen-tp__fade--top\"></div>\n <div class=\"zen-tp__fade zen-tp__fade--bottom\"></div>\n <div class=\"zen-tp__highlight\"></div>\n </div>\n\n <span class=\"zen-tp__separator\" *ngIf=\"showSeconds && mode === 'clock'\">:</span>\n <span class=\"zen-tp__separator zen-tp__separator--unit\" *ngIf=\"mode === 'duration'\">min</span>\n\n <!-- Seconds -->\n <div class=\"zen-tp__scroll-group\" *ngIf=\"showSeconds\">\n <div class=\"zen-tp__scroll-col\"\n #scrollCol\n (scroll)=\"onScroll($event, 'seconds')\"\n (mousedown)=\"onMouseDown($event, scrollCol)\"\n (mousemove)=\"onMouseMove($event, scrollCol)\"\n (mouseup)=\"onMouseUp()\"\n (mouseleave)=\"onMouseUp()\">\n <div class=\"zen-tp__scroll-spacer\"></div>\n <div *ngFor=\"let s of seconds\"\n class=\"zen-tp__scroll-item\"\n [class.zen-tp__scroll-item--selected]=\"s === selectedSeconds\"\n (click)=\"selectSecond(s)\">\n {{ formatNum(s) }}\n </div>\n <div class=\"zen-tp__scroll-spacer\"></div>\n </div>\n <div class=\"zen-tp__fade zen-tp__fade--top\"></div>\n <div class=\"zen-tp__fade zen-tp__fade--bottom\"></div>\n <div class=\"zen-tp__highlight\"></div>\n </div>\n\n <span class=\"zen-tp__separator zen-tp__separator--unit\"\n *ngIf=\"mode === 'duration' && showSeconds\">\n sec\n </span>\n\n <!-- AM/PM Toggle (Clock mode only) -->\n <div class=\"zen-tp__period\" *ngIf=\"mode === 'clock'\">\n <button class=\"zen-tp__period-btn\"\n [class.zen-tp__period-btn--active]=\"selectedPeriod === 'AM'\"\n (click)=\"selectPeriod('AM')\">\n AM\n </button>\n <button class=\"zen-tp__period-btn\"\n [class.zen-tp__period-btn--active]=\"selectedPeriod === 'PM'\"\n (click)=\"selectPeriod('PM')\">\n PM\n </button>\n </div>\n </div>\n\n <!-- Divider -->\n <div class=\"zen-tp__divider\"></div>\n\n <!-- Actions -->\n <div class=\"zen-tp__actions\" [class.zen-tp__actions--full]=\"mode === 'duration'\">\n <button class=\"zen-tp__btn zen-tp__btn--clear\" (click)=\"onClear()\">Clear</button>\n <button class=\"zen-tp__btn zen-tp__btn--apply\" (click)=\"onApply()\">Apply</button>\n </div>\n </div>\n </div>\n</div>\n", styles: [":host{display:inline-block;position:relative;width:100%}.zen-tp{width:100%;position:relative}.zen-tp *{box-sizing:border-box}.zen-tp__toggle{display:inline-flex;align-items:center;gap:8px;min-width:150px;transition:.3s;background:var(--color-white-primary, #ffffff);-webkit-appearance:none;appearance:none;outline:none;cursor:pointer;border:none;border-radius:0;border-bottom:1px solid var(--color-white-tint-4, #d6d6d8);padding:0 0 8px;font-size:16px;font-weight:400;line-height:130%;color:var(--color-grey-primary, #4f4f4f)}.zen-tp__toggle--box{border:1px solid #D0D5DD;border-radius:8px;padding:10px 14px;gap:8px}.zen-tp__toggle:hover{border-color:#667085}.zen-tp__toggle:focus,.zen-tp__toggle--active{border-color:#136ab6;box-shadow:0 0 0 3px #136ab61f}.zen-tp__toggle--disabled{cursor:not-allowed;border-color:var(--color-white-tint-3, #e0e0e0)}.zen-tp__toggle--disabled .zen-tp__display{color:var(--color-white-tint-3, #e0e0e0)!important}.zen-tp__toggle--disabled .zen-tp__icon{background-color:var(--color-white-tint-3, #e0e0e0)!important}.zen-tp__toggle--readonly{cursor:default;border-color:var(--color-white-tint-3, #e0e0e0)}.zen-tp__toggle--readonly .zen-tp__display{color:var(--color-white-tint-3, #e0e0e0)!important}.zen-tp__toggle--readonly .zen-tp__icon{background-color:var(--color-white-tint-3, #e0e0e0)!important}.zen-tp__display{flex:1;text-align:left;font-size:16px;font-weight:400;line-height:24px;color:#1d2939}.zen-tp__display--placeholder{color:#667085}.zen-tp__icon{width:20px;height:20px;flex-shrink:0;background-color:#667085;transition:.2s}.zen-tp__icon--filled{background-color:#344054}.zen-tp__dropdown{position:absolute;top:100%;left:0;z-index:1000;margin-top:4px}.zen-tp__dropdown--right{left:auto;right:0}.zen-tp__dropdown--bottom{top:auto;bottom:100%;margin-top:0;margin-bottom:4px}.zen-tp__popup{background:#FFFFFF;border-radius:8px;box-shadow:0 8px 8px -4px #10182808,0 20px 24px -4px #10182814;padding:16px;display:flex;flex-direction:column;gap:16px;align-items:flex-end;font-family:inherit}.zen-tp__popup-label{width:100%;font-size:14px;font-weight:500;line-height:20px;color:#1d2939}.zen-tp__columns{display:flex;align-items:center;gap:24px}.zen-tp__scroll-group{position:relative;width:38px;height:126px;overflow:hidden}.zen-tp__scroll-col{width:100%;height:100%;overflow-y:auto;scroll-snap-type:y mandatory;-ms-overflow-style:none;scrollbar-width:none;cursor:grab;-webkit-user-select:none;user-select:none}.zen-tp__scroll-col::-webkit-scrollbar{display:none}.zen-tp__scroll-col:active{cursor:grabbing}.zen-tp__scroll-spacer{height:42px;flex-shrink:0}.zen-tp__scroll-item{height:42px;display:flex;align-items:center;justify-content:center;font-size:16px;font-weight:500;line-height:24px;color:#1d2939;scroll-snap-align:center;cursor:pointer;transition:opacity .15s ease;opacity:.4;position:relative;z-index:1}.zen-tp__scroll-item--selected{opacity:1}.zen-tp__highlight{position:absolute;top:50%;left:0;right:0;height:42px;transform:translateY(-50%);background:#F2F4F7;border-radius:8px;pointer-events:none;z-index:0}.zen-tp__fade{position:absolute;left:0;right:0;height:44px;pointer-events:none;z-index:2}.zen-tp__fade--top{top:0;background:linear-gradient(to bottom,#FFFFFF,rgba(255,255,255,0))}.zen-tp__fade--bottom{bottom:0;background:linear-gradient(to top,#FFFFFF,rgba(255,255,255,0))}.zen-tp__separator{font-size:14px;font-weight:500;line-height:20px;color:#667085;flex-shrink:0;-webkit-user-select:none;user-select:none}.zen-tp__period{display:flex;flex-direction:column;gap:16px;flex-shrink:0}.zen-tp__period-btn{display:flex;align-items:center;justify-content:center;padding:8px 14px;border-radius:8px;font-size:14px;font-weight:500;line-height:20px;cursor:pointer;transition:all .15s ease;white-space:nowrap;border:1px solid #D0D5DD;background:#FFFFFF;color:#344054;box-shadow:0 1px 2px #1018280d}.zen-tp__period-btn:hover{background:#fafafa}.zen-tp__period-btn--active{background:#F1F7FE;border-color:#f1f7fe;color:#105494}.zen-tp__period-btn--active:hover{background:#e7f2fd}.zen-tp__divider{width:100%;height:1px;background:#EAECF0}.zen-tp__actions{display:flex;gap:12px}.zen-tp__actions--full{width:100%}.zen-tp__actions--full .zen-tp__btn{flex:1}.zen-tp__btn{display:flex;align-items:center;justify-content:center;padding:8px 14px;border-radius:8px;font-size:14px;font-weight:500;line-height:20px;cursor:pointer;transition:all .15s ease;white-space:nowrap;box-shadow:0 1px 2px #1018280d}.zen-tp__btn--clear{background:#FFFFFF;border:1px solid #D0D5DD;color:#344054}.zen-tp__btn--clear:hover{background:#fafafa}.zen-tp__btn--apply{background:#136AB6;border:1px solid #136AB6;color:#fff}.zen-tp__btn--apply:hover{background:#115d9f}\n"] }]
5999
6001
  }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { mode: [{
6000
6002
  type: Input
6001
6003
  }], label: [{
@@ -6026,6 +6028,823 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
6026
6028
  args: ['window:mousedown', ['$event']]
6027
6029
  }] } });
6028
6030
 
6031
+ const EMOJI_CATEGORIES = [
6032
+ {
6033
+ key: 'smileys', label: 'Smileys', icon: '😀',
6034
+ emojis: ['😀', '😄', '😁', '😆', '😅', '🤣', '😂', '🙂', '😉', '😊', '🥰', '😍', '😘', '😋', '😛', '😜', '🤔', '😏', '🙄', '😬', '😴', '🤯']
6035
+ },
6036
+ {
6037
+ key: 'gestures', label: 'Gestures', icon: '👋',
6038
+ emojis: ['👋', '✋', '👌', '✌', '🤞', '🤙', '👍', '👎', '👏', '🙌', '🤝', '🙏']
6039
+ },
6040
+ {
6041
+ key: 'hearts', label: 'Hearts', icon: '❤️',
6042
+ emojis: ['❤️', '🧡', '💛', '💚', '💙', '💜', '🖤', '💔', '💕', '💖']
6043
+ },
6044
+ {
6045
+ key: 'objects', label: 'Objects', icon: '⭐',
6046
+ emojis: ['⭐', '🔥', '✨', '🎉', '🏆', '💯', '✅', '❌', '⚡', '💡', '🔔', '🔗']
6047
+ },
6048
+ ];
6049
+ class ZenduCommentTextareaComponent {
6050
+ constructor() {
6051
+ this.value = '';
6052
+ this.valueChange = new EventEmitter();
6053
+ this.label = '';
6054
+ this.placeholder = 'Enter a comment...';
6055
+ this.rows = 4;
6056
+ this.fileTypes = '*/*';
6057
+ this.loading = false;
6058
+ this.addComment = new EventEmitter();
6059
+ this.filesChanged = new EventEmitter();
6060
+ this.save = new EventEmitter();
6061
+ this.cancel = new EventEmitter();
6062
+ this.editing = false;
6063
+ this.emojiPickerOpen = false;
6064
+ this.emojiCategories = EMOJI_CATEGORIES;
6065
+ this.activeEmojiCategory = EMOJI_CATEGORIES[0].key;
6066
+ this.attachments = [];
6067
+ }
6068
+ ngOnInit() {
6069
+ var _a;
6070
+ if (((_a = this.value) === null || _a === void 0 ? void 0 : _a.length) > 0) {
6071
+ this.editing = true;
6072
+ }
6073
+ }
6074
+ onDocumentClick(event) {
6075
+ if (!this.emojiPickerOpen)
6076
+ return;
6077
+ const target = event.target;
6078
+ if (!target.closest('.zen-emoji-picker') && !target.closest('.zen-comment-textarea__icon-btn[title="Emoji"]')) {
6079
+ this.emojiPickerOpen = false;
6080
+ }
6081
+ }
6082
+ onInput(value) {
6083
+ this.value = value;
6084
+ this.valueChange.emit(value);
6085
+ this.editing = value.length > 0 || this.attachments.length > 0;
6086
+ }
6087
+ onKeydown(event) {
6088
+ if (event.key === 'Enter' && !event.shiftKey) {
6089
+ event.preventDefault();
6090
+ this.onAddComment();
6091
+ }
6092
+ }
6093
+ onAddComment() {
6094
+ if (this.loading)
6095
+ return;
6096
+ if (this.value.trim() || this.attachments.length) {
6097
+ this.addComment.emit({ text: this.value, files: this.attachments.map(a => a.file) });
6098
+ }
6099
+ }
6100
+ onSave() {
6101
+ if (this.loading)
6102
+ return;
6103
+ if (this.value.trim() || this.attachments.length) {
6104
+ this.save.emit({ text: this.value, files: this.attachments.map(a => a.file) });
6105
+ }
6106
+ }
6107
+ reset() {
6108
+ this.value = '';
6109
+ this.valueChange.emit(this.value);
6110
+ this.attachments = [];
6111
+ this.filesChanged.emit([]);
6112
+ this.editing = false;
6113
+ }
6114
+ onCancel() {
6115
+ this.value = '';
6116
+ this.valueChange.emit(this.value);
6117
+ this.attachments = [];
6118
+ this.filesChanged.emit([]);
6119
+ this.editing = false;
6120
+ this.cancel.emit();
6121
+ }
6122
+ toggleEmojiPicker() {
6123
+ this.emojiPickerOpen = !this.emojiPickerOpen;
6124
+ }
6125
+ selectEmoji(emoji) {
6126
+ this.value += emoji;
6127
+ this.valueChange.emit(this.value);
6128
+ this.editing = true;
6129
+ this.emojiPickerOpen = false;
6130
+ }
6131
+ setEmojiCategory(key) {
6132
+ this.activeEmojiCategory = key;
6133
+ }
6134
+ get activeEmojis() {
6135
+ const cat = this.emojiCategories.find(c => c.key === this.activeEmojiCategory);
6136
+ return cat ? cat.emojis : [];
6137
+ }
6138
+ onFileInput(event) {
6139
+ var _a;
6140
+ const input = event.target;
6141
+ if (!((_a = input.files) === null || _a === void 0 ? void 0 : _a.length))
6142
+ return;
6143
+ for (let i = 0; i < input.files.length; i++) {
6144
+ const file = input.files[i];
6145
+ this.attachments.push({
6146
+ file,
6147
+ name: file.name,
6148
+ size: this.formatFileSize(file.size),
6149
+ progress: 100,
6150
+ complete: true,
6151
+ });
6152
+ }
6153
+ this.editing = true;
6154
+ this.filesChanged.emit(this.attachments.map(a => a.file));
6155
+ input.value = '';
6156
+ }
6157
+ removeAttachment(index) {
6158
+ this.attachments.splice(index, 1);
6159
+ this.filesChanged.emit(this.attachments.map(a => a.file));
6160
+ if (!this.attachments.length && !this.value) {
6161
+ this.editing = false;
6162
+ }
6163
+ }
6164
+ getFileIcon(name) {
6165
+ var _a;
6166
+ const ext = ((_a = name.split('.').pop()) === null || _a === void 0 ? void 0 : _a.toLowerCase()) || '';
6167
+ if (['pdf', 'doc', 'docx', 'txt', 'xls', 'xlsx', 'csv', 'ppt', 'pptx'].includes(ext))
6168
+ return 'document';
6169
+ if (['mp4', 'mov', 'avi', 'mkv', 'webm', 'flv'].includes(ext))
6170
+ return 'video';
6171
+ return 'misc';
6172
+ }
6173
+ formatFileSize(bytes) {
6174
+ if (bytes < 1024)
6175
+ return bytes + ' B';
6176
+ if (bytes < 1024 * 1024)
6177
+ return (bytes / 1024).toFixed(0) + ' KB';
6178
+ return (bytes / (1024 * 1024)).toFixed(1) + ' MB';
6179
+ }
6180
+ }
6181
+ ZenduCommentTextareaComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduCommentTextareaComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6182
+ 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"] }] });
6183
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduCommentTextareaComponent, decorators: [{
6184
+ type: Component,
6185
+ 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"] }]
6186
+ }], propDecorators: { value: [{
6187
+ type: Input
6188
+ }], valueChange: [{
6189
+ type: Output
6190
+ }], label: [{
6191
+ type: Input
6192
+ }], placeholder: [{
6193
+ type: Input
6194
+ }], rows: [{
6195
+ type: Input
6196
+ }], fileTypes: [{
6197
+ type: Input
6198
+ }], loading: [{
6199
+ type: Input
6200
+ }], addComment: [{
6201
+ type: Output
6202
+ }], filesChanged: [{
6203
+ type: Output
6204
+ }], save: [{
6205
+ type: Output
6206
+ }], cancel: [{
6207
+ type: Output
6208
+ }], onDocumentClick: [{
6209
+ type: HostListener,
6210
+ args: ['document:click', ['$event']]
6211
+ }] } });
6212
+
6213
+ class ZenduCommentItemComponent {
6214
+ constructor() {
6215
+ this.showConnector = true;
6216
+ this.editable = true;
6217
+ this.deletable = true;
6218
+ this.loading = false;
6219
+ this.edit = new EventEmitter();
6220
+ this.delete = new EventEmitter();
6221
+ this.saveEdit = new EventEmitter();
6222
+ this.cancelEdit = new EventEmitter();
6223
+ this.editing = false;
6224
+ this.editValue = '';
6225
+ this.wasLoading = false;
6226
+ }
6227
+ ngOnChanges(changes) {
6228
+ if (changes['loading'] && this.wasLoading && !this.loading && this.editing) {
6229
+ this.editing = false;
6230
+ this.editValue = '';
6231
+ }
6232
+ this.wasLoading = this.loading;
6233
+ }
6234
+ get isEditable() {
6235
+ var _a;
6236
+ return this.editable && (((_a = this.comment) === null || _a === void 0 ? void 0 : _a.editable) !== false);
6237
+ }
6238
+ get isDeletable() {
6239
+ var _a;
6240
+ return this.deletable && (((_a = this.comment) === null || _a === void 0 ? void 0 : _a.deletable) !== false);
6241
+ }
6242
+ get initials() {
6243
+ var _a;
6244
+ if (!((_a = this.comment) === null || _a === void 0 ? void 0 : _a.authorName))
6245
+ return '';
6246
+ return this.comment.authorName
6247
+ .split(' ')
6248
+ .map(n => n[0])
6249
+ .join('')
6250
+ .substring(0, 2)
6251
+ .toUpperCase();
6252
+ }
6253
+ onEdit() {
6254
+ if (this.loading)
6255
+ return;
6256
+ this.editing = true;
6257
+ this.editValue = this.comment.text;
6258
+ this.edit.emit(this.comment);
6259
+ }
6260
+ onDelete() {
6261
+ if (this.loading)
6262
+ return;
6263
+ this.delete.emit(this.comment);
6264
+ }
6265
+ onSaveEdit(event) {
6266
+ this.saveEdit.emit({ comment: this.comment, text: event.text });
6267
+ }
6268
+ onCancelEdit() {
6269
+ this.editing = false;
6270
+ this.editValue = '';
6271
+ this.cancelEdit.emit(this.comment);
6272
+ }
6273
+ getFileIcon(name) {
6274
+ var _a;
6275
+ const ext = ((_a = name.split('.').pop()) === null || _a === void 0 ? void 0 : _a.toLowerCase()) || '';
6276
+ if (['pdf', 'doc', 'docx', 'txt', 'xls', 'xlsx', 'csv', 'ppt', 'pptx'].includes(ext))
6277
+ return 'document';
6278
+ if (['mp4', 'mov', 'avi', 'mkv', 'webm', 'flv'].includes(ext))
6279
+ return 'video';
6280
+ return 'misc';
6281
+ }
6282
+ }
6283
+ ZenduCommentItemComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduCommentItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6284
+ 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: ZenduCommentTextareaComponent, selector: "zen-comment-textarea", inputs: ["value", "label", "placeholder", "rows", "fileTypes", "loading"], outputs: ["valueChange", "addComment", "filesChanged", "save", "cancel"] }] });
6285
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduCommentItemComponent, decorators: [{
6286
+ type: Component,
6287
+ 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"] }]
6288
+ }], propDecorators: { comment: [{
6289
+ type: Input
6290
+ }], showConnector: [{
6291
+ type: Input
6292
+ }], editable: [{
6293
+ type: Input
6294
+ }], deletable: [{
6295
+ type: Input
6296
+ }], loading: [{
6297
+ type: Input
6298
+ }], edit: [{
6299
+ type: Output
6300
+ }], delete: [{
6301
+ type: Output
6302
+ }], saveEdit: [{
6303
+ type: Output
6304
+ }], cancelEdit: [{
6305
+ type: Output
6306
+ }] } });
6307
+
6308
+ class ZenduCommentListComponent {
6309
+ constructor() {
6310
+ this.comments = [];
6311
+ this.collapsible = true;
6312
+ this.expanded = false;
6313
+ this.editable = true;
6314
+ this.deletable = true;
6315
+ this.loadingCommentId = null;
6316
+ this.expandedChange = new EventEmitter();
6317
+ this.editComment = new EventEmitter();
6318
+ this.deleteComment = new EventEmitter();
6319
+ this.saveEditComment = new EventEmitter();
6320
+ this.cancelEditComment = new EventEmitter();
6321
+ }
6322
+ toggle() {
6323
+ this.expanded = !this.expanded;
6324
+ this.expandedChange.emit(this.expanded);
6325
+ }
6326
+ }
6327
+ ZenduCommentListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduCommentListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6328
+ 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: ZenduCommentItemComponent, selector: "zen-comment-item", inputs: ["comment", "showConnector", "editable", "deletable", "loading"], outputs: ["edit", "delete", "saveEdit", "cancelEdit"] }] });
6329
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduCommentListComponent, decorators: [{
6330
+ type: Component,
6331
+ 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"] }]
6332
+ }], propDecorators: { comments: [{
6333
+ type: Input
6334
+ }], collapsible: [{
6335
+ type: Input
6336
+ }], expanded: [{
6337
+ type: Input
6338
+ }], editable: [{
6339
+ type: Input
6340
+ }], deletable: [{
6341
+ type: Input
6342
+ }], loadingCommentId: [{
6343
+ type: Input
6344
+ }], expandedChange: [{
6345
+ type: Output
6346
+ }], editComment: [{
6347
+ type: Output
6348
+ }], deleteComment: [{
6349
+ type: Output
6350
+ }], saveEditComment: [{
6351
+ type: Output
6352
+ }], cancelEditComment: [{
6353
+ type: Output
6354
+ }] } });
6355
+
6356
+ const MOBILE_BREAKPOINT = 768;
6357
+ class ZenduDatePickerDropdownComponent {
6358
+ constructor(_element, overlay, viewContainerRef, _translate) {
6359
+ this._element = _element;
6360
+ this.overlay = overlay;
6361
+ this.viewContainerRef = viewContainerRef;
6362
+ this._translate = _translate;
6363
+ this.type = 'single';
6364
+ this.date = null;
6365
+ this.dateChange = new EventEmitter();
6366
+ this.startDate = null;
6367
+ this.startDateChange = new EventEmitter();
6368
+ this.endDate = null;
6369
+ this.endDateChange = new EventEmitter();
6370
+ this.rangeChange = new EventEmitter();
6371
+ this.presets = null;
6372
+ this.minDate = null;
6373
+ this.maxDate = null;
6374
+ this.disabled = false;
6375
+ this.highlightDays = [];
6376
+ this.placeholder = '';
6377
+ this.mobileBreakpoint = MOBILE_BREAKPOINT;
6378
+ this.mobile = false;
6379
+ this.isOpen = false;
6380
+ // Left calendar state
6381
+ this.leftCurrentSlot = new Date();
6382
+ this.leftDayRows = [];
6383
+ this.leftDaysTitle = '';
6384
+ // Right calendar state (for range desktop)
6385
+ this.rightCurrentSlot = new Date();
6386
+ this.rightDayRows = [];
6387
+ this.rightDaysTitle = '';
6388
+ this.weekDays = ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sat', 'Su'];
6389
+ // Internal selection state
6390
+ this._selectedDate = null;
6391
+ this._selectedStart = null;
6392
+ this._selectedEnd = null;
6393
+ this._activePreset = null;
6394
+ this.overlayRef = null;
6395
+ this.defaultPresets = [
6396
+ {
6397
+ label: 'Today',
6398
+ getRange: () => ({
6399
+ start: moment().startOf('day').toDate(),
6400
+ end: moment().endOf('day').toDate()
6401
+ })
6402
+ },
6403
+ {
6404
+ label: 'Yesterday',
6405
+ getRange: () => ({
6406
+ start: moment().subtract(1, 'day').startOf('day').toDate(),
6407
+ end: moment().subtract(1, 'day').endOf('day').toDate()
6408
+ })
6409
+ },
6410
+ {
6411
+ label: 'This week',
6412
+ getRange: () => ({
6413
+ start: moment().startOf('isoWeek').toDate(),
6414
+ end: moment().endOf('isoWeek').toDate()
6415
+ })
6416
+ },
6417
+ {
6418
+ label: 'Last week',
6419
+ getRange: () => ({
6420
+ start: moment().subtract(1, 'week').startOf('isoWeek').toDate(),
6421
+ end: moment().subtract(1, 'week').endOf('isoWeek').toDate()
6422
+ })
6423
+ },
6424
+ {
6425
+ label: 'This month',
6426
+ getRange: () => ({
6427
+ start: moment().startOf('month').toDate(),
6428
+ end: moment().endOf('month').toDate()
6429
+ })
6430
+ },
6431
+ {
6432
+ label: 'Last month',
6433
+ getRange: () => ({
6434
+ start: moment().subtract(1, 'month').startOf('month').toDate(),
6435
+ end: moment().subtract(1, 'month').endOf('month').toDate()
6436
+ })
6437
+ },
6438
+ {
6439
+ label: 'This year',
6440
+ getRange: () => ({
6441
+ start: moment().startOf('year').toDate(),
6442
+ end: moment().endOf('year').toDate()
6443
+ })
6444
+ },
6445
+ {
6446
+ label: 'Last year',
6447
+ getRange: () => ({
6448
+ start: moment().subtract(1, 'year').startOf('year').toDate(),
6449
+ end: moment().subtract(1, 'year').endOf('year').toDate()
6450
+ })
6451
+ },
6452
+ {
6453
+ label: 'All time',
6454
+ getRange: () => ({
6455
+ start: new Date(2000, 0, 1),
6456
+ end: moment().endOf('day').toDate()
6457
+ })
6458
+ }
6459
+ ];
6460
+ }
6461
+ ngOnInit() {
6462
+ this.checkMobile();
6463
+ }
6464
+ onResize() {
6465
+ this.checkMobile();
6466
+ }
6467
+ checkMobile() {
6468
+ this.mobile = window.innerWidth < this.mobileBreakpoint;
6469
+ }
6470
+ ngOnChanges(changes) {
6471
+ if (changes['date'] && this.date) {
6472
+ this._selectedDate = new Date(this.date);
6473
+ }
6474
+ if (changes['startDate'] && this.startDate) {
6475
+ this._selectedStart = new Date(this.startDate);
6476
+ }
6477
+ if (changes['endDate'] && this.endDate) {
6478
+ this._selectedEnd = new Date(this.endDate);
6479
+ }
6480
+ }
6481
+ ngOnDestroy() {
6482
+ this.closeOverlay();
6483
+ }
6484
+ outsideHandling(event) {
6485
+ if (!document.body.contains(event.target))
6486
+ return;
6487
+ if (this._element.nativeElement.contains(event.target))
6488
+ return;
6489
+ // Check if click is inside overlay
6490
+ if (this.overlayRef) {
6491
+ const overlayElement = this.overlayRef.overlayElement;
6492
+ if (overlayElement && overlayElement.contains(event.target))
6493
+ return;
6494
+ }
6495
+ this.close();
6496
+ }
6497
+ get activePresets() {
6498
+ return this.presets || this.defaultPresets;
6499
+ }
6500
+ get showPresetsSidebar() {
6501
+ return this.type === 'range' && !this.mobile;
6502
+ }
6503
+ get showDualCalendars() {
6504
+ return this.type === 'range' && !this.mobile;
6505
+ }
6506
+ get triggerLabel() {
6507
+ if (this.type === 'single') {
6508
+ if (this.date) {
6509
+ return this.formatDate(this.date);
6510
+ }
6511
+ return this.placeholder || this._translate.instant('Select date');
6512
+ }
6513
+ if (this.startDate && this.endDate) {
6514
+ return `${this.formatDate(this.startDate)} - ${this.formatDate(this.endDate)}`;
6515
+ }
6516
+ return this.placeholder || this._translate.instant('Select dates');
6517
+ }
6518
+ get hasValue() {
6519
+ if (this.type === 'single')
6520
+ return !!this.date;
6521
+ return !!(this.startDate && this.endDate);
6522
+ }
6523
+ get formattedSelectedDate() {
6524
+ return this._selectedDate ? this.formatDate(this._selectedDate) : '';
6525
+ }
6526
+ get formattedStartDate() {
6527
+ return this._selectedStart ? this.formatDate(this._selectedStart) : '';
6528
+ }
6529
+ get formattedEndDate() {
6530
+ return this._selectedEnd ? this.formatDate(this._selectedEnd) : '';
6531
+ }
6532
+ formatDate(date) {
6533
+ const enMonth = moment(date).format('MMM');
6534
+ const translatedMonth = this._translate.instant(enMonth);
6535
+ return moment(date).format('MMM D, YYYY').replace(enMonth, translatedMonth);
6536
+ }
6537
+ toggle() {
6538
+ if (this.disabled)
6539
+ return;
6540
+ if (this.isOpen) {
6541
+ this.close();
6542
+ }
6543
+ else {
6544
+ this.open();
6545
+ }
6546
+ }
6547
+ open() {
6548
+ this.isOpen = true;
6549
+ this._selectedDate = this.date ? new Date(this.date) : null;
6550
+ this._selectedStart = this.startDate ? new Date(this.startDate) : null;
6551
+ this._selectedEnd = this.endDate ? new Date(this.endDate) : null;
6552
+ this._activePreset = null;
6553
+ if (this.type === 'single') {
6554
+ this.leftCurrentSlot = this._selectedDate ? new Date(this._selectedDate) : new Date();
6555
+ }
6556
+ else {
6557
+ this.leftCurrentSlot = this._selectedStart ? new Date(this._selectedStart) : new Date();
6558
+ this.rightCurrentSlot = moment(this.leftCurrentSlot).add(1, 'month').toDate();
6559
+ }
6560
+ this.updateCalendars();
6561
+ this.createOverlay();
6562
+ }
6563
+ close() {
6564
+ this.isOpen = false;
6565
+ this.closeOverlay();
6566
+ }
6567
+ createOverlay() {
6568
+ const position = {
6569
+ originX: 'end',
6570
+ originY: 'bottom',
6571
+ overlayX: 'end',
6572
+ overlayY: 'top'
6573
+ };
6574
+ const positionStrategy = this.overlay.position()
6575
+ .flexibleConnectedTo(this.triggerBtn)
6576
+ .withPositions([
6577
+ position,
6578
+ { originX: 'end', originY: 'top', overlayX: 'end', overlayY: 'bottom' },
6579
+ { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top' },
6580
+ { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom' }
6581
+ ])
6582
+ .withFlexibleDimensions(false)
6583
+ .withDefaultOffsetY(8)
6584
+ .withPush(false);
6585
+ this.overlayRef = this.overlay.create({
6586
+ positionStrategy,
6587
+ hasBackdrop: true,
6588
+ backdropClass: 'cdk-overlay-transparent-backdrop',
6589
+ panelClass: 'zen-date-picker-dropdown-overlay',
6590
+ });
6591
+ this.overlayRef.attach(new TemplatePortal(this.dropdownTemplate, this.viewContainerRef));
6592
+ this.overlayRef.backdropClick().subscribe(() => {
6593
+ this.close();
6594
+ });
6595
+ }
6596
+ closeOverlay() {
6597
+ if (this.overlayRef) {
6598
+ this.overlayRef.detach();
6599
+ this.overlayRef.dispose();
6600
+ this.overlayRef = null;
6601
+ }
6602
+ }
6603
+ // Calendar navigation
6604
+ leftPrevMonth() {
6605
+ this.leftCurrentSlot = moment(this.leftCurrentSlot).subtract(1, 'month').toDate();
6606
+ if (this.showDualCalendars) {
6607
+ this.rightCurrentSlot = moment(this.leftCurrentSlot).add(1, 'month').toDate();
6608
+ }
6609
+ this.updateCalendars();
6610
+ }
6611
+ leftNextMonth() {
6612
+ this.leftCurrentSlot = moment(this.leftCurrentSlot).add(1, 'month').toDate();
6613
+ if (this.showDualCalendars) {
6614
+ this.rightCurrentSlot = moment(this.leftCurrentSlot).add(1, 'month').toDate();
6615
+ }
6616
+ this.updateCalendars();
6617
+ }
6618
+ rightPrevMonth() {
6619
+ this.rightCurrentSlot = moment(this.rightCurrentSlot).subtract(1, 'month').toDate();
6620
+ this.leftCurrentSlot = moment(this.rightCurrentSlot).subtract(1, 'month').toDate();
6621
+ this.updateCalendars();
6622
+ }
6623
+ rightNextMonth() {
6624
+ this.rightCurrentSlot = moment(this.rightCurrentSlot).add(1, 'month').toDate();
6625
+ this.leftCurrentSlot = moment(this.rightCurrentSlot).subtract(1, 'month').toDate();
6626
+ this.updateCalendars();
6627
+ }
6628
+ // For mobile/single mode when there's only one calendar
6629
+ prevMonth() {
6630
+ this.leftPrevMonth();
6631
+ }
6632
+ nextMonth() {
6633
+ this.leftNextMonth();
6634
+ }
6635
+ selectDay(day) {
6636
+ if (day.isDisabled || day.isOutside)
6637
+ return;
6638
+ if (this.type === 'single') {
6639
+ this._selectedDate = new Date(day.date);
6640
+ }
6641
+ else {
6642
+ // Range selection logic
6643
+ if (!this._selectedStart || (this._selectedStart && this._selectedEnd)) {
6644
+ // Start new selection
6645
+ this._selectedStart = new Date(day.date);
6646
+ this._selectedEnd = null;
6647
+ this._activePreset = null;
6648
+ }
6649
+ else {
6650
+ // Complete the range
6651
+ const newDate = new Date(day.date);
6652
+ if (moment(newDate).isBefore(this._selectedStart)) {
6653
+ this._selectedEnd = new Date(this._selectedStart);
6654
+ this._selectedStart = newDate;
6655
+ }
6656
+ else {
6657
+ this._selectedEnd = newDate;
6658
+ }
6659
+ }
6660
+ }
6661
+ this.updateCalendars();
6662
+ }
6663
+ selectPreset(preset) {
6664
+ const range = preset.getRange();
6665
+ this._selectedStart = range.start;
6666
+ this._selectedEnd = range.end;
6667
+ this._activePreset = preset.label;
6668
+ this.leftCurrentSlot = new Date(range.start);
6669
+ if (this.showDualCalendars) {
6670
+ this.rightCurrentSlot = moment(this.leftCurrentSlot).add(1, 'month').toDate();
6671
+ }
6672
+ this.updateCalendars();
6673
+ }
6674
+ goToToday() {
6675
+ const today = new Date();
6676
+ this._selectedDate = moment(today).startOf('day').toDate();
6677
+ this.leftCurrentSlot = new Date(today);
6678
+ this.updateCalendars();
6679
+ }
6680
+ apply() {
6681
+ if (this.type === 'single') {
6682
+ if (this._selectedDate) {
6683
+ this.date = new Date(this._selectedDate);
6684
+ this.dateChange.emit(this.date);
6685
+ }
6686
+ }
6687
+ else {
6688
+ if (this._selectedStart) {
6689
+ this.startDate = new Date(this._selectedStart);
6690
+ this.startDateChange.emit(this.startDate);
6691
+ }
6692
+ if (this._selectedEnd) {
6693
+ this.endDate = new Date(this._selectedEnd);
6694
+ this.endDateChange.emit(this.endDate);
6695
+ }
6696
+ if (this._selectedStart && this._selectedEnd) {
6697
+ this.rangeChange.emit({ start: this.startDate, end: this.endDate });
6698
+ }
6699
+ }
6700
+ this.close();
6701
+ }
6702
+ cancel() {
6703
+ this.close();
6704
+ }
6705
+ get canApply() {
6706
+ if (this.type === 'single')
6707
+ return !!this._selectedDate;
6708
+ return !!(this._selectedStart && this._selectedEnd);
6709
+ }
6710
+ updateCalendars() {
6711
+ this.updateDays(this.leftCurrentSlot, 'left');
6712
+ if (this.showDualCalendars) {
6713
+ this.updateDays(this.rightCurrentSlot, 'right');
6714
+ }
6715
+ }
6716
+ updateDays(slot, side) {
6717
+ const enMonth = moment(slot).format('MMM');
6718
+ const translatedMonth = this._translate.instant(enMonth);
6719
+ const title = moment(slot).format('MMMM YYYY');
6720
+ const dayRows = [];
6721
+ let current = moment(slot).startOf('month').startOf('isoWeek');
6722
+ const end = moment(slot).endOf('month').endOf('isoWeek');
6723
+ const currentMonth = moment(slot).month();
6724
+ while (current.isSameOrBefore(end)) {
6725
+ const row = { days: [] };
6726
+ dayRows.push(row);
6727
+ for (let idx = 0; idx < 7; idx++) {
6728
+ const isOutside = currentMonth !== current.month();
6729
+ let isDisabled = false;
6730
+ if (this.minDate && current.toDate() < this.minDate) {
6731
+ isDisabled = true;
6732
+ }
6733
+ else if (this.maxDate && current.toDate() > this.maxDate) {
6734
+ isDisabled = true;
6735
+ }
6736
+ let isHighlighted = false;
6737
+ if (this.highlightDays && this.highlightDays.length) {
6738
+ isHighlighted = this.highlightDays.indexOf(current.valueOf()) >= 0;
6739
+ }
6740
+ const isSelected = isOutside ? false : this.isDaySelected(current);
6741
+ row.days.push({
6742
+ date: current.toDate(),
6743
+ lbl: isOutside ? '' : current.date().toString(),
6744
+ isOutside,
6745
+ selected: isSelected,
6746
+ isDisabled: isOutside ? true : isDisabled,
6747
+ isHighlighted: isOutside ? false : isHighlighted
6748
+ });
6749
+ current = current.clone().add(1, 'day');
6750
+ }
6751
+ }
6752
+ if (side === 'left') {
6753
+ this.leftDayRows = dayRows;
6754
+ this.leftDaysTitle = title;
6755
+ }
6756
+ else {
6757
+ this.rightDayRows = dayRows;
6758
+ this.rightDaysTitle = title;
6759
+ }
6760
+ }
6761
+ isDaySelected(date) {
6762
+ if (this.type === 'single') {
6763
+ return this._selectedDate ? date.isSame(moment(this._selectedDate), 'day') : false;
6764
+ }
6765
+ if (this._selectedStart && date.isSame(moment(this._selectedStart), 'day'))
6766
+ return true;
6767
+ if (this._selectedEnd && date.isSame(moment(this._selectedEnd), 'day'))
6768
+ return true;
6769
+ return false;
6770
+ }
6771
+ isToday(day) {
6772
+ if (day.isOutside)
6773
+ return false;
6774
+ return moment(day.date).isSame(moment(), 'day');
6775
+ }
6776
+ isInRange(day) {
6777
+ if (day.isOutside)
6778
+ return false;
6779
+ if (this.type !== 'range' || !this._selectedStart || !this._selectedEnd)
6780
+ return false;
6781
+ const d = moment(day.date);
6782
+ return d.isAfter(moment(this._selectedStart), 'day') && d.isBefore(moment(this._selectedEnd), 'day');
6783
+ }
6784
+ isRangeStart(day) {
6785
+ if (day.isOutside)
6786
+ return false;
6787
+ if (this.type !== 'range' || !this._selectedStart)
6788
+ return false;
6789
+ return moment(day.date).isSame(moment(this._selectedStart), 'day');
6790
+ }
6791
+ isRangeEnd(day) {
6792
+ if (day.isOutside)
6793
+ return false;
6794
+ if (this.type !== 'range' || !this._selectedEnd)
6795
+ return false;
6796
+ return moment(day.date).isSame(moment(this._selectedEnd), 'day');
6797
+ }
6798
+ }
6799
+ ZenduDatePickerDropdownComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduDatePickerDropdownComponent, deps: [{ token: i0.ElementRef }, { token: i1$1.Overlay }, { token: i0.ViewContainerRef }, { token: i2$1.TranslateService }], target: i0.ɵɵFactoryTarget.Component });
6800
+ ZenduDatePickerDropdownComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: ZenduDatePickerDropdownComponent, selector: "zen-date-picker-dropdown", inputs: { type: "type", date: "date", startDate: "startDate", endDate: "endDate", presets: "presets", minDate: "minDate", maxDate: "maxDate", disabled: "disabled", highlightDays: "highlightDays", placeholder: "placeholder", mobileBreakpoint: "mobileBreakpoint" }, outputs: { dateChange: "dateChange", startDateChange: "startDateChange", endDateChange: "endDateChange", rangeChange: "rangeChange" }, host: { listeners: { "window:resize": "onResize()", "window:mousedown": "outsideHandling($event)" } }, viewQueries: [{ propertyName: "triggerBtn", first: true, predicate: ["triggerBtn"], descendants: true }, { propertyName: "dropdownTemplate", first: true, predicate: ["dropdownTemplate"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<!-- Trigger Button -->\n<button class=\"dropdown-trigger\"\n #triggerBtn\n [disabled]=\"disabled\"\n [class.active]=\"isOpen\"\n [class.has-value]=\"hasValue\"\n (click)=\"toggle()\">\n <zen-icon class=\"trigger-icon\"\n src=\"assets/ng-zenduit/icons/calendar.svg\">\n </zen-icon>\n <span class=\"trigger-label\">{{ triggerLabel }}</span>\n</button>\n\n<!-- Dropdown Panel -->\n<ng-template #dropdownTemplate>\n <div class=\"dropdown-menu\" [class.mobile]=\"mobile\">\n <!-- RANGE DESKTOP: presets sidebar + dual calendar -->\n <ng-container *ngIf=\"type === 'range' && !mobile\">\n <!-- Presets sidebar -->\n <div class=\"presets-sidebar\">\n <div class=\"preset-item\"\n *ngFor=\"let preset of activePresets\"\n [class.active]=\"_activePreset === preset.label\"\n (click)=\"selectPreset(preset)\">\n {{ preset.label | translate }}\n </div>\n </div>\n\n <div class=\"sidebar-divider\"></div>\n\n <!-- Calendars + bottom panel -->\n <div class=\"calendars-container\">\n <div class=\"dual-calendars\">\n <!-- Left calendar -->\n <div class=\"calendar-panel\">\n <div class=\"calendar-content\">\n <div class=\"month-header\">\n <button class=\"nav-btn\" (click)=\"leftPrevMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-left.svg\"></zen-icon>\n </button>\n <span class=\"month-title\">{{ leftDaysTitle }}</span>\n <button class=\"nav-btn\" (click)=\"leftNextMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-right.svg\"></zen-icon>\n </button>\n </div>\n <ng-container *ngTemplateOutlet=\"calendarGrid; context: { $implicit: leftDayRows }\"></ng-container>\n </div>\n </div>\n\n <div class=\"calendar-divider\"></div>\n\n <!-- Right calendar -->\n <div class=\"calendar-panel\">\n <div class=\"calendar-content\">\n <div class=\"month-header\">\n <button class=\"nav-btn\" (click)=\"rightPrevMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-left.svg\"></zen-icon>\n </button>\n <span class=\"month-title\">{{ rightDaysTitle }}</span>\n <button class=\"nav-btn\" (click)=\"rightNextMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-right.svg\"></zen-icon>\n </button>\n </div>\n <ng-container *ngTemplateOutlet=\"calendarGrid; context: { $implicit: rightDayRows }\"></ng-container>\n </div>\n </div>\n </div>\n\n <div class=\"bottom-divider\"></div>\n\n <!-- Bottom panel: inputs + actions -->\n <div class=\"bottom-panel\">\n <div class=\"input-fields\">\n <div class=\"date-input\">\n <span class=\"date-input-text\" [class.placeholder]=\"!_selectedStart\">\n {{ _selectedStart ? formattedStartDate : ('Start date' | translate) }}\n </span>\n </div>\n <span class=\"date-separator\">&ndash;</span>\n <div class=\"date-input\">\n <span class=\"date-input-text\" [class.placeholder]=\"!_selectedEnd\">\n {{ _selectedEnd ? formattedEndDate : ('End date' | translate) }}\n </span>\n </div>\n </div>\n <div class=\"actions\">\n <button class=\"btn-cancel\" (click)=\"cancel()\">{{ 'Cancel' | translate }}</button>\n <button class=\"btn-apply\" [disabled]=\"!canApply\" (click)=\"apply()\">{{ 'Apply' | translate }}</button>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- RANGE MOBILE: single calendar with dual inputs on top -->\n <ng-container *ngIf=\"type === 'range' && mobile\">\n <div class=\"single-calendar-container\">\n <div class=\"calendar-content\">\n <div class=\"month-header\">\n <button class=\"nav-btn\" (click)=\"prevMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-left.svg\"></zen-icon>\n </button>\n <span class=\"month-title\">{{ leftDaysTitle }}</span>\n <button class=\"nav-btn\" (click)=\"nextMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-right.svg\"></zen-icon>\n </button>\n </div>\n\n <!-- Range inputs -->\n <div class=\"mobile-range-inputs\">\n <div class=\"date-input compact\">\n <span class=\"date-input-text\" [class.placeholder]=\"!_selectedStart\">\n {{ _selectedStart ? formattedStartDate : ('Select date' | translate) }}\n </span>\n </div>\n <span class=\"date-separator\">&ndash;</span>\n <div class=\"date-input compact\">\n <span class=\"date-input-text\" [class.placeholder]=\"!_selectedEnd\">\n {{ _selectedEnd ? formattedEndDate : ('Select date' | translate) }}\n </span>\n </div>\n </div>\n\n <ng-container *ngTemplateOutlet=\"calendarGrid; context: { $implicit: leftDayRows }\"></ng-container>\n </div>\n\n <div class=\"bottom-divider\"></div>\n\n <div class=\"bottom-panel compact\">\n <div class=\"actions full-width\">\n <button class=\"btn-cancel\" (click)=\"cancel()\">{{ 'Cancel' | translate }}</button>\n <button class=\"btn-apply\" [disabled]=\"!canApply\" (click)=\"apply()\">{{ 'Apply' | translate }}</button>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- SINGLE DATE: single calendar + input + today button -->\n <ng-container *ngIf=\"type === 'single'\">\n <div class=\"single-calendar-container\">\n <div class=\"calendar-content\">\n <div class=\"month-header\">\n <button class=\"nav-btn\" (click)=\"prevMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-left.svg\"></zen-icon>\n </button>\n <span class=\"month-title\">{{ leftDaysTitle }}</span>\n <button class=\"nav-btn\" (click)=\"nextMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-right.svg\"></zen-icon>\n </button>\n </div>\n\n <!-- Date input + Today button -->\n <div class=\"single-actions-row\">\n <div class=\"date-input flex-1\">\n <span class=\"date-input-text\" [class.placeholder]=\"!_selectedDate\">\n {{ _selectedDate ? formattedSelectedDate : ('Select date' | translate) }}\n </span>\n </div>\n <button class=\"btn-today\" (click)=\"goToToday()\">{{ 'Today' | translate }}</button>\n </div>\n\n <ng-container *ngTemplateOutlet=\"calendarGrid; context: { $implicit: leftDayRows }\"></ng-container>\n </div>\n\n <div class=\"bottom-divider\"></div>\n\n <div class=\"bottom-panel compact\">\n <div class=\"actions full-width\">\n <button class=\"btn-cancel\" (click)=\"cancel()\">{{ 'Cancel' | translate }}</button>\n <button class=\"btn-apply\" [disabled]=\"!canApply\" (click)=\"apply()\">{{ 'Apply' | translate }}</button>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n</ng-template>\n\n<!-- Shared calendar grid template -->\n<ng-template #calendarGrid let-dayRows>\n <div class=\"dates-grid\">\n <!-- Week day headers -->\n <div class=\"week-header\">\n <div class=\"cell header-cell\" *ngFor=\"let wd of weekDays\">{{ wd | translate }}</div>\n </div>\n <!-- Day rows -->\n <div class=\"day-row\" *ngFor=\"let row of dayRows\">\n <div class=\"cell day-cell\"\n *ngFor=\"let day of row.days\"\n [class.outside]=\"day.isOutside\"\n [class.selected]=\"day.selected\"\n [class.today]=\"isToday(day)\"\n [class.disabled]=\"day.isDisabled\"\n [class.in-range]=\"isInRange(day)\"\n [class.range-start]=\"isRangeStart(day)\"\n [class.range-end]=\"isRangeEnd(day)\"\n (click)=\"selectDay(day)\">\n <span class=\"day-number\">{{ day.lbl }}</span>\n <span class=\"highlight-dot\" *ngIf=\"day.isHighlighted\"></span>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: [".dropdown-trigger{display:inline-flex;align-items:center;justify-content:center;gap:8px;padding:10px 16px;background:#FFFFFF;border:1px solid #D0D5DD;border-radius:8px;box-shadow:0 1px 2px #1018280d;cursor:pointer;font-family:Inter,sans-serif;font-size:14px;font-weight:500;line-height:20px;color:#667085;white-space:nowrap;transition:.2s;-webkit-appearance:none;appearance:none;outline:none}.dropdown-trigger:hover{border-color:#98a2b3}.dropdown-trigger.active{box-shadow:0 1px 2px #1018280d,0 0 0 4px #f2f4f7}.dropdown-trigger.has-value{color:#344054}.dropdown-trigger:disabled{cursor:not-allowed;opacity:.5}.dropdown-trigger .trigger-icon{width:20px;height:20px;background-color:#667085}.dropdown-trigger.has-value .trigger-icon{background-color:#344054}.dropdown-menu{display:inline-flex;background:#FFFFFF;border:1px solid #EAECF0;border-radius:8px;box-shadow:0 20px 24px -4px #10182814,0 8px 8px -4px #10182808;font-family:Inter,sans-serif;overflow:hidden;width:max-content}::ng-deep .cdk-overlay-container{position:fixed;z-index:1200;pointer-events:none;top:0;left:0;height:100%;width:100%}::ng-deep .cdk-overlay-backdrop{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:auto;z-index:1200}::ng-deep .cdk-overlay-connected-position-bounding-box{position:absolute;z-index:1201;display:flex;flex-direction:column;min-width:1px;min-height:1px}::ng-deep .zen-date-picker-dropdown-overlay{position:absolute;width:max-content!important;pointer-events:auto}.presets-sidebar{display:flex;flex-direction:column;gap:4px;padding:12px 16px;min-width:160px}.presets-sidebar .preset-item{padding:10px 16px;border-radius:6px;font-size:14px;font-weight:400;line-height:20px;color:#344054;cursor:pointer;white-space:nowrap;transition:.15s}.presets-sidebar .preset-item:hover{background:#F9FAFB}.presets-sidebar .preset-item.active{background:#F9FAFB;font-weight:500}.sidebar-divider{width:1px;background:#EAECF0;align-self:stretch}.calendars-container{display:flex;flex-direction:column}.dual-calendars{display:flex}.calendar-divider{width:1px;background:#EAECF0;align-self:stretch}.calendar-panel{width:328px;overflow:hidden}.calendar-content{display:flex;flex-direction:column;padding:20px 24px;gap:12px}.single-calendar-container{display:flex;flex-direction:column;width:328px}.month-header{display:flex;align-items:center;justify-content:space-between;width:280px}.nav-btn{display:flex;align-items:center;justify-content:center;padding:10px;border-radius:8px;border:none;background:transparent;cursor:pointer;-webkit-appearance:none;appearance:none;outline:none;transition:.15s}.nav-btn:hover{background:#F9FAFB}.nav-btn zen-icon{width:20px;height:20px;background-color:#344054}.month-title{font-size:16px;font-weight:500;line-height:24px;color:#344054;text-align:center}.single-actions-row{display:flex;gap:12px;align-items:flex-start;width:280px}.flex-1{flex:1}.btn-today{display: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-size:14px;font-weight:500;line-height:20px;color:#344054;cursor:pointer;white-space:nowrap;-webkit-appearance:none;appearance:none;outline:none;transition:.15s}.btn-today:hover{background:#F9FAFB}.mobile-range-inputs{display:flex;align-items:center;gap:8px;height:40px;width:280px}.date-input{display:flex;align-items:center;padding:8px 14px;background:#FFFFFF;border:1px solid #D0D5DD;border-radius:8px;box-shadow:0 1px 2px #1018280d;min-width:0}.date-input.compact{flex:1}.date-input .date-input-text{font-size:16px;font-weight:400;line-height:24px;color:#101828;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.date-input .date-input-text.placeholder{color:#667085}.date-separator{font-size:16px;font-weight:400;line-height:24px;color:#667085}.dates-grid{display:flex;flex-direction:column;gap:4px}.week-header{display:flex;width:280px}.day-row{display:flex;border-radius:20px;overflow:hidden}.cell{position:relative;width:40px;height:40px;display:flex;align-items:center;justify-content:center;border-radius:20px}.cell .day-number{font-size:14px;font-weight:400;line-height:20px;text-align:center;color:#344054;width:24px}.cell.header-cell .day-number{font-weight:500}.header-cell{font-size:14px;font-weight:500;line-height:20px;color:#344054}.day-cell{cursor:pointer;transition:.1s}.day-cell:hover:not(.disabled):not(.selected){background:#F1F7FE}.day-cell:hover:not(.disabled):not(.selected) .day-number{color:#105494;font-weight:500}.day-cell.outside{cursor:default;pointer-events:none}.day-cell.today{background:#F2F4F7}.day-cell.today .day-number{font-weight:500}.day-cell.selected{background:#136AB6}.day-cell.selected .day-number{color:#fff;font-weight:500}.day-cell.in-range{background:#F1F7FE;border-radius:0}.day-cell.in-range .day-number{color:#105494}.day-cell.range-start{border-radius:20px 0 0 20px}.day-cell.range-end{border-radius:0 20px 20px 0}.day-cell.range-start.range-end{border-radius:20px}.day-cell.disabled{cursor:not-allowed}.day-cell.disabled .day-number{color:#d0d5dd}.day-cell .highlight-dot{position:absolute;bottom:4px;left:50%;transform:translate(-50%);width:5px;height:5px;border-radius:50%;background:#105494}.day-cell.selected .highlight-dot{background:#FFFFFF}.day-cell.outside .highlight-dot{background:#98A2B3}.bottom-divider{height:1px;background:#EAECF0;width:100%}.bottom-panel{display:flex;align-items:flex-start;justify-content:space-between;padding:16px 24px}.bottom-panel.compact{justify-content:flex-end}.input-fields{display:flex;gap:12px;align-items:center}.input-fields .date-input{width:128px}.actions{display:flex;gap:12px}.actions.full-width,.actions.full-width .btn-cancel,.actions.full-width .btn-apply{flex:1}.btn-cancel{display:flex;align-items:center;justify-content:center;padding:10px 16px;min-width:109px;background:#FFFFFF;border:1px solid #D0D5DD;border-radius:8px;box-shadow:0 1px 2px #1018280d;font-family:Inter,sans-serif;font-size:14px;font-weight:500;line-height:20px;color:#344054;cursor:pointer;-webkit-appearance:none;appearance:none;outline:none;transition:.15s;white-space:nowrap}.btn-cancel:hover{background:#F9FAFB}.btn-apply{display:flex;align-items:center;justify-content:center;padding:10px 16px;min-width:109px;background:#136AB6;border:1px solid #136AB6;border-radius:8px;box-shadow:0 1px 2px #1018280d;font-family:Inter,sans-serif;font-size:14px;font-weight:500;line-height:20px;color:#fff;cursor:pointer;-webkit-appearance:none;appearance:none;outline:none;transition:.15s;white-space:nowrap}.btn-apply:hover{background:#105494}.btn-apply:disabled{opacity:.5;cursor:not-allowed}\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.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: ZenduIconComponent, selector: "zen-icon", inputs: ["src"] }, { kind: "pipe", type: i2$1.TranslatePipe, name: "translate" }] });
6801
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ZenduDatePickerDropdownComponent, decorators: [{
6802
+ type: Component,
6803
+ args: [{ selector: 'zen-date-picker-dropdown', template: "<!-- Trigger Button -->\n<button class=\"dropdown-trigger\"\n #triggerBtn\n [disabled]=\"disabled\"\n [class.active]=\"isOpen\"\n [class.has-value]=\"hasValue\"\n (click)=\"toggle()\">\n <zen-icon class=\"trigger-icon\"\n src=\"assets/ng-zenduit/icons/calendar.svg\">\n </zen-icon>\n <span class=\"trigger-label\">{{ triggerLabel }}</span>\n</button>\n\n<!-- Dropdown Panel -->\n<ng-template #dropdownTemplate>\n <div class=\"dropdown-menu\" [class.mobile]=\"mobile\">\n <!-- RANGE DESKTOP: presets sidebar + dual calendar -->\n <ng-container *ngIf=\"type === 'range' && !mobile\">\n <!-- Presets sidebar -->\n <div class=\"presets-sidebar\">\n <div class=\"preset-item\"\n *ngFor=\"let preset of activePresets\"\n [class.active]=\"_activePreset === preset.label\"\n (click)=\"selectPreset(preset)\">\n {{ preset.label | translate }}\n </div>\n </div>\n\n <div class=\"sidebar-divider\"></div>\n\n <!-- Calendars + bottom panel -->\n <div class=\"calendars-container\">\n <div class=\"dual-calendars\">\n <!-- Left calendar -->\n <div class=\"calendar-panel\">\n <div class=\"calendar-content\">\n <div class=\"month-header\">\n <button class=\"nav-btn\" (click)=\"leftPrevMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-left.svg\"></zen-icon>\n </button>\n <span class=\"month-title\">{{ leftDaysTitle }}</span>\n <button class=\"nav-btn\" (click)=\"leftNextMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-right.svg\"></zen-icon>\n </button>\n </div>\n <ng-container *ngTemplateOutlet=\"calendarGrid; context: { $implicit: leftDayRows }\"></ng-container>\n </div>\n </div>\n\n <div class=\"calendar-divider\"></div>\n\n <!-- Right calendar -->\n <div class=\"calendar-panel\">\n <div class=\"calendar-content\">\n <div class=\"month-header\">\n <button class=\"nav-btn\" (click)=\"rightPrevMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-left.svg\"></zen-icon>\n </button>\n <span class=\"month-title\">{{ rightDaysTitle }}</span>\n <button class=\"nav-btn\" (click)=\"rightNextMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-right.svg\"></zen-icon>\n </button>\n </div>\n <ng-container *ngTemplateOutlet=\"calendarGrid; context: { $implicit: rightDayRows }\"></ng-container>\n </div>\n </div>\n </div>\n\n <div class=\"bottom-divider\"></div>\n\n <!-- Bottom panel: inputs + actions -->\n <div class=\"bottom-panel\">\n <div class=\"input-fields\">\n <div class=\"date-input\">\n <span class=\"date-input-text\" [class.placeholder]=\"!_selectedStart\">\n {{ _selectedStart ? formattedStartDate : ('Start date' | translate) }}\n </span>\n </div>\n <span class=\"date-separator\">&ndash;</span>\n <div class=\"date-input\">\n <span class=\"date-input-text\" [class.placeholder]=\"!_selectedEnd\">\n {{ _selectedEnd ? formattedEndDate : ('End date' | translate) }}\n </span>\n </div>\n </div>\n <div class=\"actions\">\n <button class=\"btn-cancel\" (click)=\"cancel()\">{{ 'Cancel' | translate }}</button>\n <button class=\"btn-apply\" [disabled]=\"!canApply\" (click)=\"apply()\">{{ 'Apply' | translate }}</button>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- RANGE MOBILE: single calendar with dual inputs on top -->\n <ng-container *ngIf=\"type === 'range' && mobile\">\n <div class=\"single-calendar-container\">\n <div class=\"calendar-content\">\n <div class=\"month-header\">\n <button class=\"nav-btn\" (click)=\"prevMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-left.svg\"></zen-icon>\n </button>\n <span class=\"month-title\">{{ leftDaysTitle }}</span>\n <button class=\"nav-btn\" (click)=\"nextMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-right.svg\"></zen-icon>\n </button>\n </div>\n\n <!-- Range inputs -->\n <div class=\"mobile-range-inputs\">\n <div class=\"date-input compact\">\n <span class=\"date-input-text\" [class.placeholder]=\"!_selectedStart\">\n {{ _selectedStart ? formattedStartDate : ('Select date' | translate) }}\n </span>\n </div>\n <span class=\"date-separator\">&ndash;</span>\n <div class=\"date-input compact\">\n <span class=\"date-input-text\" [class.placeholder]=\"!_selectedEnd\">\n {{ _selectedEnd ? formattedEndDate : ('Select date' | translate) }}\n </span>\n </div>\n </div>\n\n <ng-container *ngTemplateOutlet=\"calendarGrid; context: { $implicit: leftDayRows }\"></ng-container>\n </div>\n\n <div class=\"bottom-divider\"></div>\n\n <div class=\"bottom-panel compact\">\n <div class=\"actions full-width\">\n <button class=\"btn-cancel\" (click)=\"cancel()\">{{ 'Cancel' | translate }}</button>\n <button class=\"btn-apply\" [disabled]=\"!canApply\" (click)=\"apply()\">{{ 'Apply' | translate }}</button>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- SINGLE DATE: single calendar + input + today button -->\n <ng-container *ngIf=\"type === 'single'\">\n <div class=\"single-calendar-container\">\n <div class=\"calendar-content\">\n <div class=\"month-header\">\n <button class=\"nav-btn\" (click)=\"prevMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-left.svg\"></zen-icon>\n </button>\n <span class=\"month-title\">{{ leftDaysTitle }}</span>\n <button class=\"nav-btn\" (click)=\"nextMonth()\">\n <zen-icon src=\"assets/ng-zenduit/icons/arrow-right.svg\"></zen-icon>\n </button>\n </div>\n\n <!-- Date input + Today button -->\n <div class=\"single-actions-row\">\n <div class=\"date-input flex-1\">\n <span class=\"date-input-text\" [class.placeholder]=\"!_selectedDate\">\n {{ _selectedDate ? formattedSelectedDate : ('Select date' | translate) }}\n </span>\n </div>\n <button class=\"btn-today\" (click)=\"goToToday()\">{{ 'Today' | translate }}</button>\n </div>\n\n <ng-container *ngTemplateOutlet=\"calendarGrid; context: { $implicit: leftDayRows }\"></ng-container>\n </div>\n\n <div class=\"bottom-divider\"></div>\n\n <div class=\"bottom-panel compact\">\n <div class=\"actions full-width\">\n <button class=\"btn-cancel\" (click)=\"cancel()\">{{ 'Cancel' | translate }}</button>\n <button class=\"btn-apply\" [disabled]=\"!canApply\" (click)=\"apply()\">{{ 'Apply' | translate }}</button>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n</ng-template>\n\n<!-- Shared calendar grid template -->\n<ng-template #calendarGrid let-dayRows>\n <div class=\"dates-grid\">\n <!-- Week day headers -->\n <div class=\"week-header\">\n <div class=\"cell header-cell\" *ngFor=\"let wd of weekDays\">{{ wd | translate }}</div>\n </div>\n <!-- Day rows -->\n <div class=\"day-row\" *ngFor=\"let row of dayRows\">\n <div class=\"cell day-cell\"\n *ngFor=\"let day of row.days\"\n [class.outside]=\"day.isOutside\"\n [class.selected]=\"day.selected\"\n [class.today]=\"isToday(day)\"\n [class.disabled]=\"day.isDisabled\"\n [class.in-range]=\"isInRange(day)\"\n [class.range-start]=\"isRangeStart(day)\"\n [class.range-end]=\"isRangeEnd(day)\"\n (click)=\"selectDay(day)\">\n <span class=\"day-number\">{{ day.lbl }}</span>\n <span class=\"highlight-dot\" *ngIf=\"day.isHighlighted\"></span>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: [".dropdown-trigger{display:inline-flex;align-items:center;justify-content:center;gap:8px;padding:10px 16px;background:#FFFFFF;border:1px solid #D0D5DD;border-radius:8px;box-shadow:0 1px 2px #1018280d;cursor:pointer;font-family:Inter,sans-serif;font-size:14px;font-weight:500;line-height:20px;color:#667085;white-space:nowrap;transition:.2s;-webkit-appearance:none;appearance:none;outline:none}.dropdown-trigger:hover{border-color:#98a2b3}.dropdown-trigger.active{box-shadow:0 1px 2px #1018280d,0 0 0 4px #f2f4f7}.dropdown-trigger.has-value{color:#344054}.dropdown-trigger:disabled{cursor:not-allowed;opacity:.5}.dropdown-trigger .trigger-icon{width:20px;height:20px;background-color:#667085}.dropdown-trigger.has-value .trigger-icon{background-color:#344054}.dropdown-menu{display:inline-flex;background:#FFFFFF;border:1px solid #EAECF0;border-radius:8px;box-shadow:0 20px 24px -4px #10182814,0 8px 8px -4px #10182808;font-family:Inter,sans-serif;overflow:hidden;width:max-content}::ng-deep .cdk-overlay-container{position:fixed;z-index:1200;pointer-events:none;top:0;left:0;height:100%;width:100%}::ng-deep .cdk-overlay-backdrop{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:auto;z-index:1200}::ng-deep .cdk-overlay-connected-position-bounding-box{position:absolute;z-index:1201;display:flex;flex-direction:column;min-width:1px;min-height:1px}::ng-deep .zen-date-picker-dropdown-overlay{position:absolute;width:max-content!important;pointer-events:auto}.presets-sidebar{display:flex;flex-direction:column;gap:4px;padding:12px 16px;min-width:160px}.presets-sidebar .preset-item{padding:10px 16px;border-radius:6px;font-size:14px;font-weight:400;line-height:20px;color:#344054;cursor:pointer;white-space:nowrap;transition:.15s}.presets-sidebar .preset-item:hover{background:#F9FAFB}.presets-sidebar .preset-item.active{background:#F9FAFB;font-weight:500}.sidebar-divider{width:1px;background:#EAECF0;align-self:stretch}.calendars-container{display:flex;flex-direction:column}.dual-calendars{display:flex}.calendar-divider{width:1px;background:#EAECF0;align-self:stretch}.calendar-panel{width:328px;overflow:hidden}.calendar-content{display:flex;flex-direction:column;padding:20px 24px;gap:12px}.single-calendar-container{display:flex;flex-direction:column;width:328px}.month-header{display:flex;align-items:center;justify-content:space-between;width:280px}.nav-btn{display:flex;align-items:center;justify-content:center;padding:10px;border-radius:8px;border:none;background:transparent;cursor:pointer;-webkit-appearance:none;appearance:none;outline:none;transition:.15s}.nav-btn:hover{background:#F9FAFB}.nav-btn zen-icon{width:20px;height:20px;background-color:#344054}.month-title{font-size:16px;font-weight:500;line-height:24px;color:#344054;text-align:center}.single-actions-row{display:flex;gap:12px;align-items:flex-start;width:280px}.flex-1{flex:1}.btn-today{display: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-size:14px;font-weight:500;line-height:20px;color:#344054;cursor:pointer;white-space:nowrap;-webkit-appearance:none;appearance:none;outline:none;transition:.15s}.btn-today:hover{background:#F9FAFB}.mobile-range-inputs{display:flex;align-items:center;gap:8px;height:40px;width:280px}.date-input{display:flex;align-items:center;padding:8px 14px;background:#FFFFFF;border:1px solid #D0D5DD;border-radius:8px;box-shadow:0 1px 2px #1018280d;min-width:0}.date-input.compact{flex:1}.date-input .date-input-text{font-size:16px;font-weight:400;line-height:24px;color:#101828;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.date-input .date-input-text.placeholder{color:#667085}.date-separator{font-size:16px;font-weight:400;line-height:24px;color:#667085}.dates-grid{display:flex;flex-direction:column;gap:4px}.week-header{display:flex;width:280px}.day-row{display:flex;border-radius:20px;overflow:hidden}.cell{position:relative;width:40px;height:40px;display:flex;align-items:center;justify-content:center;border-radius:20px}.cell .day-number{font-size:14px;font-weight:400;line-height:20px;text-align:center;color:#344054;width:24px}.cell.header-cell .day-number{font-weight:500}.header-cell{font-size:14px;font-weight:500;line-height:20px;color:#344054}.day-cell{cursor:pointer;transition:.1s}.day-cell:hover:not(.disabled):not(.selected){background:#F1F7FE}.day-cell:hover:not(.disabled):not(.selected) .day-number{color:#105494;font-weight:500}.day-cell.outside{cursor:default;pointer-events:none}.day-cell.today{background:#F2F4F7}.day-cell.today .day-number{font-weight:500}.day-cell.selected{background:#136AB6}.day-cell.selected .day-number{color:#fff;font-weight:500}.day-cell.in-range{background:#F1F7FE;border-radius:0}.day-cell.in-range .day-number{color:#105494}.day-cell.range-start{border-radius:20px 0 0 20px}.day-cell.range-end{border-radius:0 20px 20px 0}.day-cell.range-start.range-end{border-radius:20px}.day-cell.disabled{cursor:not-allowed}.day-cell.disabled .day-number{color:#d0d5dd}.day-cell .highlight-dot{position:absolute;bottom:4px;left:50%;transform:translate(-50%);width:5px;height:5px;border-radius:50%;background:#105494}.day-cell.selected .highlight-dot{background:#FFFFFF}.day-cell.outside .highlight-dot{background:#98A2B3}.bottom-divider{height:1px;background:#EAECF0;width:100%}.bottom-panel{display:flex;align-items:flex-start;justify-content:space-between;padding:16px 24px}.bottom-panel.compact{justify-content:flex-end}.input-fields{display:flex;gap:12px;align-items:center}.input-fields .date-input{width:128px}.actions{display:flex;gap:12px}.actions.full-width,.actions.full-width .btn-cancel,.actions.full-width .btn-apply{flex:1}.btn-cancel{display:flex;align-items:center;justify-content:center;padding:10px 16px;min-width:109px;background:#FFFFFF;border:1px solid #D0D5DD;border-radius:8px;box-shadow:0 1px 2px #1018280d;font-family:Inter,sans-serif;font-size:14px;font-weight:500;line-height:20px;color:#344054;cursor:pointer;-webkit-appearance:none;appearance:none;outline:none;transition:.15s;white-space:nowrap}.btn-cancel:hover{background:#F9FAFB}.btn-apply{display:flex;align-items:center;justify-content:center;padding:10px 16px;min-width:109px;background:#136AB6;border:1px solid #136AB6;border-radius:8px;box-shadow:0 1px 2px #1018280d;font-family:Inter,sans-serif;font-size:14px;font-weight:500;line-height:20px;color:#fff;cursor:pointer;-webkit-appearance:none;appearance:none;outline:none;transition:.15s;white-space:nowrap}.btn-apply:hover{background:#105494}.btn-apply:disabled{opacity:.5;cursor:not-allowed}\n"] }]
6804
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1$1.Overlay }, { type: i0.ViewContainerRef }, { type: i2$1.TranslateService }]; }, propDecorators: { type: [{
6805
+ type: Input
6806
+ }], date: [{
6807
+ type: Input
6808
+ }], dateChange: [{
6809
+ type: Output
6810
+ }], startDate: [{
6811
+ type: Input
6812
+ }], startDateChange: [{
6813
+ type: Output
6814
+ }], endDate: [{
6815
+ type: Input
6816
+ }], endDateChange: [{
6817
+ type: Output
6818
+ }], rangeChange: [{
6819
+ type: Output
6820
+ }], presets: [{
6821
+ type: Input
6822
+ }], minDate: [{
6823
+ type: Input
6824
+ }], maxDate: [{
6825
+ type: Input
6826
+ }], disabled: [{
6827
+ type: Input
6828
+ }], highlightDays: [{
6829
+ type: Input
6830
+ }], placeholder: [{
6831
+ type: Input
6832
+ }], mobileBreakpoint: [{
6833
+ type: Input
6834
+ }], triggerBtn: [{
6835
+ type: ViewChild,
6836
+ args: ['triggerBtn']
6837
+ }], dropdownTemplate: [{
6838
+ type: ViewChild,
6839
+ args: ['dropdownTemplate']
6840
+ }], onResize: [{
6841
+ type: HostListener,
6842
+ args: ['window:resize']
6843
+ }], outsideHandling: [{
6844
+ type: HostListener,
6845
+ args: ['window:mousedown', ['$event']]
6846
+ }] } });
6847
+
6029
6848
  // AoT requires an exported function for factories
6030
6849
  function HttpLoaderFactory(httpClient) {
6031
6850
  return new TranslateHttpLoader(httpClient);
@@ -6066,7 +6885,11 @@ NgZenduitModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version
6066
6885
  ZenSnapshotPlayerComponent,
6067
6886
  ZenWebRTCPlayerComponent,
6068
6887
  ZenduSelectButtonDirective,
6069
- ZenduTimepickerComponent], imports: [CommonModule,
6888
+ ZenduTimepickerComponent,
6889
+ ZenduCommentTextareaComponent,
6890
+ ZenduCommentItemComponent,
6891
+ ZenduCommentListComponent,
6892
+ ZenduDatePickerDropdownComponent], imports: [CommonModule,
6070
6893
  FormsModule,
6071
6894
  DragDropModule,
6072
6895
  AngularSignaturePadModule,
@@ -6100,7 +6923,11 @@ NgZenduitModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version
6100
6923
  ZenduLocationSearch,
6101
6924
  ZenLiveViewPlayerComponent,
6102
6925
  ZenduSelectButtonDirective,
6103
- ZenduTimepickerComponent] });
6926
+ ZenduTimepickerComponent,
6927
+ ZenduCommentTextareaComponent,
6928
+ ZenduCommentItemComponent,
6929
+ ZenduCommentListComponent,
6930
+ ZenduDatePickerDropdownComponent] });
6104
6931
  NgZenduitModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: NgZenduitModule, providers: [
6105
6932
  OpenCVService,
6106
6933
  ], imports: [CommonModule,
@@ -6154,7 +6981,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
6154
6981
  ZenSnapshotPlayerComponent,
6155
6982
  ZenWebRTCPlayerComponent,
6156
6983
  ZenduSelectButtonDirective,
6157
- ZenduTimepickerComponent
6984
+ ZenduTimepickerComponent,
6985
+ ZenduCommentTextareaComponent,
6986
+ ZenduCommentItemComponent,
6987
+ ZenduCommentListComponent,
6988
+ ZenduDatePickerDropdownComponent
6158
6989
  ],
6159
6990
  providers: [
6160
6991
  OpenCVService,
@@ -6204,7 +7035,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
6204
7035
  ZenduLocationSearch,
6205
7036
  ZenLiveViewPlayerComponent,
6206
7037
  ZenduSelectButtonDirective,
6207
- ZenduTimepickerComponent
7038
+ ZenduTimepickerComponent,
7039
+ ZenduCommentTextareaComponent,
7040
+ ZenduCommentItemComponent,
7041
+ ZenduCommentListComponent,
7042
+ ZenduDatePickerDropdownComponent
6208
7043
  ]
6209
7044
  }]
6210
7045
  }] });
@@ -6217,5 +7052,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
6217
7052
  * Generated bundle index. Do not edit.
6218
7053
  */
6219
7054
 
6220
- export { DATEPICKER_POSITION, HttpLoaderFactory, NgZenduitModule, ZenLiveViewPlayerComponent, ZenNotifyService, ZenduBreadcrumbs, ZenduCardBlockComponent, ZenduCheckboxComponent, ZenduColorPickerComponent, ZenduColumnConfigurationComponent, ZenduDatepickerComponent, ZenduDocScanner, ZenduFileUpload, ZenduFilterComponent, ZenduGroupsComponent, ZenduIconComponent, ZenduLocationSearch, ZenduMapComponent, ZenduMapPreviewComponent, ZenduPaginationBarComponent, ZenduPhoneInputComponent, ZenduProgress, ZenduRadioButtonComponent, ZenduSearchBoxComponent, ZenduSelectButtonDirective, ZenduSelectComponent, ZenduSelectOptionDirective, ZenduSelectValueDirective, ZenduSortHeaderComponent, ZenduSpinner, ZenduTimepickerComponent, ZenduToggleComponent, ZenduToggleSlideComponent };
7055
+ export { DATEPICKER_POSITION, HttpLoaderFactory, NgZenduitModule, ZenLiveViewPlayerComponent, ZenNotifyService, ZenduBreadcrumbs, ZenduCardBlockComponent, ZenduCheckboxComponent, ZenduColorPickerComponent, ZenduColumnConfigurationComponent, ZenduCommentItemComponent, ZenduCommentListComponent, ZenduCommentTextareaComponent, ZenduDatePickerDropdownComponent, ZenduDatepickerComponent, ZenduDocScanner, ZenduFileUpload, ZenduFilterComponent, ZenduGroupsComponent, ZenduIconComponent, ZenduLocationSearch, ZenduMapComponent, ZenduMapPreviewComponent, ZenduPaginationBarComponent, ZenduPhoneInputComponent, ZenduProgress, ZenduRadioButtonComponent, ZenduSearchBoxComponent, ZenduSelectButtonDirective, ZenduSelectComponent, ZenduSelectOptionDirective, ZenduSelectValueDirective, ZenduSortHeaderComponent, ZenduSpinner, ZenduTimepickerComponent, ZenduToggleComponent, ZenduToggleSlideComponent };
6221
7056
  //# sourceMappingURL=ng-zenduit.mjs.map